Index: stable/HeuristicLab.Algorithms.Benchmarks/3.3/BenchmarkAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Algorithms.Benchmarks/3.3/BenchmarkAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.Benchmarks/3.3/BenchmarkAlgorithm.cs	(revision 12708)
@@ -37,5 +37,5 @@
 namespace HeuristicLab.Algorithms.Benchmarks {
   [Item("Benchmark Algorithm", "An algorithm to execute performance benchmarks (Linpack, Dhrystone, Whetstone, etc.).")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 130)]
   [StorableClass]
   public sealed class BenchmarkAlgorithm : IAlgorithm {
Index: stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAEvolutionStrategy.cs
===================================================================
--- stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAEvolutionStrategy.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAEvolutionStrategy.cs	(revision 12708)
@@ -37,5 +37,5 @@
 namespace HeuristicLab.Algorithms.CMAEvolutionStrategy {
   [Item("CMA Evolution Strategy", "An evolution strategy based on covariance matrix adaptation.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 210)]
   [StorableClass]
   public sealed class CMAEvolutionStrategy : HeuristicOptimizationEngineAlgorithm, IStorableContent {
@@ -489,5 +489,6 @@
           CMAUpdater = CMAUpdaterParameter.ValidValues.First();
         }
-      } finally { cmaesInitializerSync = false; }
+      }
+      finally { cmaesInitializerSync = false; }
     }
     private void UpdateAnalyzers() {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/CrossValidation.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/CrossValidation.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/CrossValidation.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Algorithms.DataAnalysis {
   [Item("Cross Validation", "Cross-validation wrapper for data analysis algorithms.")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysis, Priority = 100)]
   [StorableClass]
   public sealed class CrossValidation : ParameterizedNamedItem, IAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessClassification.cs	(revision 12708)
@@ -23,9 +23,6 @@
 using System;
 using System.Linq;
-using HeuristicLab.Algorithms.GradientDescent;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
@@ -39,5 +36,5 @@
   /// </summary>
   [Item("Gaussian Process Least-Squares Classification", "Gaussian process least-squares classification data analysis algorithm.")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 160)]
   [StorableClass]
   public sealed class GaussianProcessClassification : GaussianProcessBase, IStorableContent {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs	(revision 12708)
@@ -23,9 +23,6 @@
 using System;
 using System.Linq;
-using HeuristicLab.Algorithms.GradientDescent;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
@@ -39,5 +36,5 @@
   /// </summary>
   [Item("Gaussian Process Regression", "Gaussian process regression data analysis algorithm.")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 160)]
   [StorableClass]
   public sealed class GaussianProcessRegression : GaussianProcessBase, IStorableContent {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearDiscriminantAnalysis.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearDiscriminantAnalysis.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearDiscriminantAnalysis.cs	(revision 12708)
@@ -37,5 +37,5 @@
   /// </summary>
   [Item("Linear Discriminant Analysis", "Linear discriminant analysis classification algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 100)]
   [StorableClass]
   public sealed class LinearDiscriminantAnalysis : FixedDataAnalysisAlgorithm<IClassificationProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearRegression.cs	(revision 12708)
@@ -38,5 +38,5 @@
   /// </summary>
   [Item("Linear Regression", "Linear regression data analysis algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 100)]
   [StorableClass]
   public sealed class LinearRegression : FixedDataAnalysisAlgorithm<IRegressionProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/MultinomialLogitClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/MultinomialLogitClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/MultinomialLogitClassification.cs	(revision 12708)
@@ -35,5 +35,5 @@
   /// </summary>
   [Item("Multinomial Logit Classification", "Multinomial logit classification data analysis algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 180)]
   [StorableClass]
   public sealed class MultiNomialLogitClassification : FixedDataAnalysisAlgorithm<IClassificationProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaAlgorithm.cs	(revision 12708)
@@ -43,5 +43,5 @@
 with additional regularizations described in Z. Yang, J. Laaksonen. 2007.
 Regularized Neighborhood Component Analysis. Lecture Notes in Computer Science, 4522. pp. 253-262.")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 170)]
   [StorableClass]
   public sealed class NcaAlgorithm : EngineAlgorithm {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourClassification.cs	(revision 12708)
@@ -35,5 +35,5 @@
   /// </summary>
   [Item("Nearest Neighbour Classification", "Nearest neighbour classification data analysis algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 150)]
   [StorableClass]
   public sealed class NearestNeighbourClassification : FixedDataAnalysisAlgorithm<IClassificationProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourRegression.cs	(revision 12708)
@@ -34,5 +34,5 @@
   /// </summary>
   [Item("Nearest Neighbour Regression", "Nearest neighbour regression data analysis algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 150)]
   [StorableClass]
   public sealed class NearestNeighbourRegression : FixedDataAnalysisAlgorithm<IRegressionProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkClassification.cs	(revision 12708)
@@ -36,5 +36,5 @@
   /// </summary>
   [Item("Neural Network Classification", "Neural network classification data analysis algorithm (wrapper for ALGLIB). Further documentation: http://www.alglib.net/dataanalysis/neuralnetworks.php")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 130)]
   [StorableClass]
   public sealed class NeuralNetworkClassification : FixedDataAnalysisAlgorithm<IClassificationProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleClassification.cs	(revision 12708)
@@ -36,5 +36,5 @@
   /// </summary>
   [Item("Neural Network Ensemble Classification", "Neural network ensemble classification data analysis algorithm (wrapper for ALGLIB). Further documentation: http://www.alglib.net/dataanalysis/mlpensembles.php")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 140)]
   [StorableClass]
   public sealed class NeuralNetworkEnsembleClassification : FixedDataAnalysisAlgorithm<IClassificationProblem> {
@@ -124,5 +124,5 @@
     public NeuralNetworkEnsembleClassification()
       : base() {
-        var validHiddenLayerValues = new ItemSet<IntValue>(new IntValue[] { 
+      var validHiddenLayerValues = new ItemSet<IntValue>(new IntValue[] { 
         (IntValue)new IntValue(0).AsReadOnly(), 
         (IntValue)new IntValue(1).AsReadOnly(), 
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkEnsembleRegression.cs	(revision 12708)
@@ -36,5 +36,5 @@
   /// </summary>
   [Item("Neural Network Ensemble Regression", "Neural network ensemble regression data analysis algorithm (wrapper for ALGLIB). Further documentation: http://www.alglib.net/dataanalysis/mlpensembles.php")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 140)]
   [StorableClass]
   public sealed class NeuralNetworkEnsembleRegression : FixedDataAnalysisAlgorithm<IRegressionProblem> {
@@ -124,5 +124,5 @@
     public NeuralNetworkEnsembleRegression()
       : base() {
-        var validHiddenLayerValues = new ItemSet<IntValue>(new IntValue[] { 
+      var validHiddenLayerValues = new ItemSet<IntValue>(new IntValue[] { 
         (IntValue)new IntValue(0).AsReadOnly(), 
         (IntValue)new IntValue(1).AsReadOnly(), 
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/NeuralNetwork/NeuralNetworkRegression.cs	(revision 12708)
@@ -36,5 +36,5 @@
   /// </summary>
   [Item("Neural Network Regression", "Neural network regression data analysis algorithm (wrapper for ALGLIB). Further documentation: http://www.alglib.net/dataanalysis/neuralnetworks.php")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 130)]
   [StorableClass]
   public sealed class NeuralNetworkRegression : FixedDataAnalysisAlgorithm<IRegressionProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestClassification.cs	(revision 12708)
@@ -20,7 +20,4 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -36,5 +33,5 @@
   /// </summary>
   [Item("Random Forest Classification", "Random forest classification data analysis algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 120)]
   [StorableClass]
   public sealed class RandomForestClassification : FixedDataAnalysisAlgorithm<IClassificationProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/RandomForest/RandomForestRegression.cs	(revision 12708)
@@ -20,7 +20,4 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -36,5 +33,5 @@
   /// </summary>
   [Item("Random Forest Regression", "Random forest regression data analysis algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 120)]
   [StorableClass]
   public sealed class RandomForestRegression : FixedDataAnalysisAlgorithm<IRegressionProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorClassification.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorClassification.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorClassification.cs	(revision 12708)
@@ -37,5 +37,5 @@
   /// </summary>
   [Item("Support Vector Classification", "Support vector machine classification data analysis algorithm (wrapper for libSVM).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisClassification, Priority = 110)]
   [StorableClass]
   public sealed class SupportVectorClassification : FixedDataAnalysisAlgorithm<IClassificationProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorRegression.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorRegression.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorRegression.cs	(revision 12708)
@@ -37,5 +37,5 @@
   /// </summary>
   [Item("Support Vector Regression", "Support vector machine regression data analysis algorithm (wrapper for libSVM).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisRegression, Priority = 110)]
   [StorableClass]
   public sealed class SupportVectorRegression : FixedDataAnalysisAlgorithm<IRegressionProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/TimeSeries/AutoregressiveModeling.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/TimeSeries/AutoregressiveModeling.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/TimeSeries/AutoregressiveModeling.cs	(revision 12708)
@@ -35,5 +35,5 @@
 namespace HeuristicLab.Algorithms.DataAnalysis.TimeSeries {
   [Item("Autoregressive Modeling", "Timeseries modeling algorithm that creates AR-N models.")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysis, Priority = 130)]
   [StorableClass]
   public class AutoregressiveModeling : FixedDataAnalysisAlgorithm<ITimeSeriesPrognosisProblem> {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/kMeans/KMeansClustering.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/kMeans/KMeansClustering.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/kMeans/KMeansClustering.cs	(revision 12708)
@@ -36,5 +36,5 @@
   /// </summary>
   [Item("k-Means", "The k-Means clustering algorithm (wrapper for ALGLIB).")]
-  [Creatable("Data Analysis")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysis, Priority = 10)]
   [StorableClass]
   public sealed class KMeansClustering : FixedDataAnalysisAlgorithm<IClusteringProblem> {
Index: stable/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("Genetic Algorithm", "A genetic algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms,Priority = 100)]
   [StorableClass]
   public sealed class GeneticAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("Island Genetic Algorithm", "An island genetic algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms,Priority = 110)]
   [StorableClass]
   public sealed class IslandGeneticAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.GradientDescent/3.3/Lbfgs.cs
===================================================================
--- stable/HeuristicLab.Algorithms.GradientDescent/3.3/Lbfgs.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.GradientDescent/3.3/Lbfgs.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("LM-BFGS", "The limited-memory BFGS (BroydenFletcherGoldfarbShanno) optimization algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 160)]
   [StorableClass]
   public sealed class LbfgsAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs
===================================================================
--- stable/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Algorithms.LocalSearch {
   [Item("Local Search", "A local search algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 100)]
   [StorableClass]
   public sealed class LocalSearch : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs
===================================================================
--- stable/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("NSGA-II", "The Nondominated Sorting Genetic Algorithm II was introduced in Deb et al. 2002. A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II. IEEE Transactions on Evolutionary Computation, 6(2), pp. 182-197.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.Algorithms, Priority = 100)]
   [StorableClass]
   public class NSGA2 : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("Island Offspring Selection Genetic Algorithm", "An island offspring selection genetic algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 130)]
   [StorableClass]
   public sealed class IslandOffspringSelectionGeneticAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("Offspring Selection Genetic Algorithm", "An offspring selection genetic algorithm (Affenzeller, M. et al. 2009. Genetic Algorithms and Genetic Programming - Modern Concepts and Practical Applications. CRC Press).")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 120)]
   [StorableClass]
   public sealed class OffspringSelectionGeneticAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs
===================================================================
--- stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("SASEGASA", "The self-adaptive segregative genetic algorithm with simulated annealing aspects (Affenzeller, M. et al. 2009. Genetic Algorithms and Genetic Programming - Modern Concepts and Practical Applications. CRC Press).")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 150)]
   [StorableClass]
   public sealed class SASEGASA : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 12708)
@@ -42,5 +42,5 @@
   [Item("Hill Climber", "Binary Hill Climber.")]
   [StorableClass]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 150)]
   public class HillClimber : BasicAlgorithm {
     [Storable]
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 12708)
@@ -41,5 +41,5 @@
   [Item("Parameter-less Population Pyramid", "Binary value optimization algorithm which requires no configuration. B. W. Goldman and W. F. Punch, Parameter-less Population Pyramid, GECCO, pp. 785–792, 2014")]
   [StorableClass]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms,Priority = 400)]
   public class ParameterlessPopulationPyramid : BasicAlgorithm {
     public override Type ProblemType {
Index: stable/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
   [Item("Particle Swarm Optimization", "A particle swarm optimization algorithm based on the description in Pedersen, M.E.H. (2010). PhD thesis. University of Southampton.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 300)]
   [StorableClass]
   public sealed class ParticleSwarmOptimization : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs
===================================================================
--- stable/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("RAPGA", "A relevant alleles preserving genetic algorithm (Affenzeller, M. et al. 2007. Self-adaptive population size adjustment for genetic algorithms. Proceedings of Computer Aided Systems Theory: EuroCAST 2007, Lecture Notes in Computer Science, pp 820–828. Springer).")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 140)]
   [StorableClass]
   public sealed class RAPGA : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs	(revision 12708)
@@ -39,5 +39,5 @@
   /// </summary>
   [Item("Scatter Search", "A scatter search algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 500)]
   [StorableClass]
   public sealed class ScatterSearch : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs
===================================================================
--- stable/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 12708)
@@ -37,5 +37,5 @@
 namespace HeuristicLab.Algorithms.SimulatedAnnealing {
   [Item("Simulated Annealing", "A simulated annealing algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 140)]
   [StorableClass]
   public sealed class SimulatedAnnealing : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs
===================================================================
--- stable/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Algorithms.TabuSearch {
   [Item("Tabu Search", "A tabu search algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 120)]
   [StorableClass]
   public sealed class TabuSearch : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs
===================================================================
--- stable/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs	(revision 12707)
+++ stable/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Algorithms.VariableNeighborhoodSearch {
   [Item("Variable Neighborhood Search", "A variable neighborhood search algorithm based on the description in Mladenovic, N. and Hansen, P. (1997). Variable neighborhood search. Computers & Operations Research Volume 24, Issue 11, pp. 1097-1100.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 110)]
   [StorableClass]
   public sealed class VariableNeighborhoodSearch : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Clients.OKB/3.3/RunCreation/MultiObjectiveOKBProblem.cs
===================================================================
--- stable/HeuristicLab.Clients.OKB/3.3/RunCreation/MultiObjectiveOKBProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Clients.OKB/3.3/RunCreation/MultiObjectiveOKBProblem.cs	(revision 12708)
@@ -27,6 +27,6 @@
 
 namespace HeuristicLab.Clients.OKB.RunCreation {
-  [Item("Multi-Objective OKB Problem", "Represents a multi-objective problem which is stored in the OKB.")]
-  [Creatable("Optimization Knowledge Base (OKB)")]
+  [Item("OKB Problem (multi-objective)", "Represents a multi-objective problem which is stored in the OKB.")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysisOKB, Priority = 120)]
   [StorableClass]
   public sealed class MultiObjectiveOKBProblem : OKBProblem, IMultiObjectiveHeuristicOptimizationProblem, IStorableContent {
Index: stable/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBAlgorithm.cs	(revision 12708)
@@ -35,5 +35,5 @@
 namespace HeuristicLab.Clients.OKB.RunCreation {
   [Item("OKB Algorithm", "An algorithm which is stored in the OKB.")]
-  [Creatable("Optimization Knowledge Base (OKB)")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysisOKB, Priority = 100)]
   [StorableClass]
   public sealed class OKBAlgorithm : Item, IAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Clients.OKB/3.3/RunCreation/SingleObjectiveOKBProblem.cs
===================================================================
--- stable/HeuristicLab.Clients.OKB/3.3/RunCreation/SingleObjectiveOKBProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Clients.OKB/3.3/RunCreation/SingleObjectiveOKBProblem.cs	(revision 12708)
@@ -27,6 +27,6 @@
 
 namespace HeuristicLab.Clients.OKB.RunCreation {
-  [Item("Single-Objective OKB Problem", "Represents a single-objective problem which is stored in the OKB.")]
-  [Creatable("Optimization Knowledge Base (OKB)")]
+  [Item("OKB Problem (single-objective)", "Represents a single-objective problem which is stored in the OKB.")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysisOKB, Priority = 110)]
   [StorableClass]
   public sealed class SingleObjectiveOKBProblem : OKBProblem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent {
Index: stable/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs
===================================================================
--- stable/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 12707)
+++ stable/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 12708)
@@ -42,4 +42,10 @@
       this.searchLabel = new System.Windows.Forms.Label();
       this.searchTextBox = new System.Windows.Forms.TextBox();
+      this.clearSearchButton = new System.Windows.Forms.Button();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.expandToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collapseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.typeParametersGroupBox = new System.Windows.Forms.GroupBox();
       this.setTypeParameterButton = new System.Windows.Forms.Button();
@@ -56,4 +62,5 @@
       this.typeParametersSplitContainer.SuspendLayout();
       this.typeParametersGroupBox.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -75,4 +82,5 @@
       this.typesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.typesTreeView_AfterSelect);
       this.typesTreeView.VisibleChanged += new System.EventHandler(this.typesTreeView_VisibleChanged);
+      this.typesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.typesTreeView_MouseDown);
       // 
       // imageList
@@ -146,10 +154,32 @@
       this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
+      this.searchTextBox.Controls.Add(this.clearSearchButton);
       this.searchTextBox.Location = new System.Drawing.Point(29, 3);
       this.searchTextBox.Name = "searchTextBox";
       this.searchTextBox.Size = new System.Drawing.Size(193, 20);
       this.searchTextBox.TabIndex = 1;
-      this.toolTip.SetToolTip(this.searchTextBox, "Enter string to search for types");
+      this.toolTip.SetToolTip(this.searchTextBox, "Filters the available Types.\r\nThe search term is tokenized by space and a name ha" +
+        "s to contain all tokens to be displayed.\r\n(E.g. \"Sym Reg\" matches \"SymbolicRegr" +
+        "ession\")");
       this.searchTextBox.TextChanged += new System.EventHandler(this.searchTextBox_TextChanged);
+      this.searchTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.searchTextBox_KeyDown);
+      // 
+      // clearSearchButton
+      // 
+      this.clearSearchButton.BackColor = System.Drawing.Color.Transparent;
+      this.clearSearchButton.Cursor = System.Windows.Forms.Cursors.Default;
+      this.clearSearchButton.Dock = System.Windows.Forms.DockStyle.Right;
+      this.clearSearchButton.FlatAppearance.BorderSize = 0;
+      this.clearSearchButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.clearSearchButton.ForeColor = System.Drawing.Color.Transparent;
+      this.clearSearchButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Delete;
+      this.clearSearchButton.Location = new System.Drawing.Point(543, 0);
+      this.clearSearchButton.Margin = new System.Windows.Forms.Padding(0);
+      this.clearSearchButton.Name = "clearSearchButton";
+      this.clearSearchButton.Size = new System.Drawing.Size(15, 16);
+      this.clearSearchButton.TabIndex = 0;
+      this.clearSearchButton.TabStop = false;
+      this.clearSearchButton.UseVisualStyleBackColor = false;
+      this.clearSearchButton.Click += new System.EventHandler(this.clearSearchButton_Click);
       // 
       // typeParametersGroupBox
@@ -213,4 +243,42 @@
       this.descriptionTextBox.Size = new System.Drawing.Size(219, 114);
       this.descriptionTextBox.TabIndex = 0;
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.expandToolStripMenuItem,
+            this.expandAllToolStripMenuItem,
+            this.collapseToolStripMenuItem,
+            this.collapseAllToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(137, 92);
+      // 
+      // expandToolStripMenuItem
+      // 
+      this.expandToolStripMenuItem.Name = "expandToolStripMenuItem";
+      this.expandToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.expandToolStripMenuItem.Text = "Expand";
+      this.expandToolStripMenuItem.Click += new System.EventHandler(this.expandToolStripMenuItem_Click);
+      // 
+      // expandAllToolStripMenuItem
+      // 
+      this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem";
+      this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.expandAllToolStripMenuItem.Text = "Expand All";
+      this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click);
+      // 
+      // collapseToolStripMenuItem
+      // 
+      this.collapseToolStripMenuItem.Name = "collapseToolStripMenuItem";
+      this.collapseToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.collapseToolStripMenuItem.Text = "Collapse";
+      this.collapseToolStripMenuItem.Click += new System.EventHandler(this.collapseToolStripMenuItem_Click);
+      // 
+      // collapseAllToolStripMenuItem
+      // 
+      this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem";
+      this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.collapseAllToolStripMenuItem.Text = "Collapse All";
+      this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click);
       // 
       // TypeSelector
@@ -231,4 +299,5 @@
       this.typeParametersSplitContainer.ResumeLayout(false);
       this.typeParametersGroupBox.ResumeLayout(false);
+      this.contextMenuStrip.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -244,5 +313,11 @@
     protected System.Windows.Forms.Label searchLabel;
     protected System.Windows.Forms.TextBox searchTextBox;
+    protected System.Windows.Forms.Button clearSearchButton;
     protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    protected System.Windows.Forms.ToolStripMenuItem expandToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem collapseToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem;
     protected System.Windows.Forms.SplitContainer typeParametersSplitContainer;
     protected System.Windows.Forms.GroupBox typeParametersGroupBox;
@@ -250,5 +325,4 @@
     protected System.Windows.Forms.Button setTypeParameterButton;
     protected System.Windows.Forms.ColumnHeader columnHeader1;
-
   }
 }
Index: stable/HeuristicLab.Core.Views/3.3/TypeSelector.cs
===================================================================
--- stable/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 12707)
+++ stable/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 12708)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Drawing;
 using System.Linq;
 using System.Reflection;
@@ -177,44 +178,36 @@
       else {
         searchString = searchString.ToLower();
+        TreeNode selectedNode = typesTreeView.SelectedNode;
 
         if (!searchString.Contains(currentSearchString)) {
           typesTreeView.BeginUpdate();
           // expand search -> restore all tree nodes
-          TreeNode selectedNode = typesTreeView.SelectedNode;
           typesTreeView.Nodes.Clear();
           foreach (TreeNode node in treeNodes)
             typesTreeView.Nodes.Add((TreeNode)node.Clone());
-          RestoreSelectedNode(selectedNode);
           typesTreeView.EndUpdate();
         }
-
 
         // remove nodes
         typesTreeView.BeginUpdate();
+        var searchTokens = searchString.Split(' ');
         int i = 0;
         while (i < typesTreeView.Nodes.Count) {
-          int j = 0;
-          while (j < typesTreeView.Nodes[i].Nodes.Count) {
-            if (!typesTreeView.Nodes[i].Nodes[j].Text.ToLower().Contains(searchString)) {
-              if ((typesTreeView.Nodes[i].Nodes[j].Tag as Type).Equals(selectedType))
-                SelectedType = null;
-              typesTreeView.Nodes[i].Nodes[j].Remove();
-            } else
-              j++;
-          }
-          if (typesTreeView.Nodes[i].Nodes.Count == 0)
-            typesTreeView.Nodes[i].Remove();
-          else
-            i++;
+          var node = typesTreeView.Nodes[i];
+          bool remove = FilterNode(node, searchTokens);
+          if (remove)
+            typesTreeView.Nodes.RemoveAt(i);
+          else i++;
         }
         typesTreeView.EndUpdate();
         currentSearchString = searchString;
 
-        // if there is just one type node left, select by default
-        if (typesTreeView.Nodes.Count == 1) {
-          if (typesTreeView.Nodes[0].Nodes.Count == 1) {
-            typesTreeView.SelectedNode = typesTreeView.Nodes[0].Nodes[0];
-          }
-        }
+        // select first item
+        typesTreeView.BeginUpdate();
+        var firstNode = typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
+        while (firstNode != null && !(firstNode.Tag is Type))
+          firstNode = firstNode.NextVisibleNode;
+        if (firstNode != null)
+          typesTreeView.SelectedNode = firstNode;
 
         if (typesTreeView.Nodes.Count == 0) {
@@ -225,6 +218,34 @@
           typesTreeView.Enabled = true;
         }
+        typesTreeView.EndUpdate();
+
+        RestoreSelectedNode(selectedNode);
         UpdateDescription();
       }
+    }
+
+    private bool FilterNode(TreeNode node, string[] searchTokens) {
+      if (node.Tag is IPluginDescription) { // Plugin node
+        int i = 0;
+        while (i < node.Nodes.Count) {
+          bool remove = FilterNode(node.Nodes[i], searchTokens);
+          if (remove)
+            node.Nodes.RemoveAt(i);
+          else i++;
+        }
+        return node.Nodes.Count == 0;
+      } if (node.Tag is Type) { // Type node
+        var text = node.Text;
+        if (searchTokens.Any(searchToken => !text.ToLower().Contains(searchToken))) {
+          var typeTag = (Type)node.Tag;
+          if (typeTag == SelectedType) {
+            SelectedType = null;
+            typesTreeView.SelectedNode = null;
+          }
+          return true;
+        }
+        return false;
+      }
+      throw new InvalidOperationException("Encountered neither a plugin nor a type node during tree traversal.");
     }
 
@@ -355,4 +376,76 @@
       SetTypeParameter();
     }
+    private void searchTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (typesTreeView.Nodes.Count == 0)
+        return;
+
+      if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) {
+        var selectedNode = typesTreeView.SelectedNode;
+
+        if (selectedNode == null) { // nothing selected => select first
+          if (e.KeyCode == Keys.Down) typesTreeView.SelectedNode = typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
+        } else {
+          if (e.KeyCode == Keys.Down && selectedNode.NextVisibleNode != null)
+            typesTreeView.SelectedNode = selectedNode.NextVisibleNode;
+          if (e.KeyCode == Keys.Up && selectedNode.PrevVisibleNode != null)
+            typesTreeView.SelectedNode = selectedNode.PrevVisibleNode;
+        }
+        e.Handled = true;
+      }
+    }
+    private void clearSearchButton_Click(object sender, EventArgs e) {
+      searchTextBox.Text = string.Empty;
+      searchTextBox.Focus();
+    }
+
+    private TreeNode toolStripMenuNode = null;
+    private void typesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Right) {
+        Point coordinates = typesTreeView.PointToClient(Cursor.Position);
+        toolStripMenuNode = typesTreeView.GetNodeAt(coordinates);
+
+        if (toolStripMenuNode != null && coordinates.X >= toolStripMenuNode.Bounds.Left &&
+            coordinates.X <= toolStripMenuNode.Bounds.Right) {
+          typesTreeView.SelectedNode = toolStripMenuNode;
+
+          expandToolStripMenuItem.Enabled =
+            expandToolStripMenuItem.Visible = !toolStripMenuNode.IsExpanded && toolStripMenuNode.Nodes.Count > 0;
+          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = toolStripMenuNode.IsExpanded;
+        } else {
+          expandToolStripMenuItem.Enabled = expandToolStripMenuItem.Visible = false;
+          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = false;
+        }
+        expandAllToolStripMenuItem.Enabled =
+          expandAllToolStripMenuItem.Visible =
+            !typesTreeView.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x));
+        collapseAllToolStripMenuItem.Enabled =
+          collapseAllToolStripMenuItem.Visible = typesTreeView.Nodes.OfType<TreeNode>().Any(x => x.IsExpanded);
+        if (contextMenuStrip.Items.Cast<ToolStripMenuItem>().Any(item => item.Enabled))
+          contextMenuStrip.Show(Cursor.Position);
+      }
+    }
+    private bool TreeNodeIsFullyExpanded(TreeNode node) {
+      return (node.Nodes.Count == 0) || (node.IsExpanded && node.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x)));
+    }
+    private void expandToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      if (toolStripMenuNode != null) toolStripMenuNode.ExpandAll();
+      typesTreeView.EndUpdate();
+    }
+    private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      typesTreeView.ExpandAll();
+      typesTreeView.EndUpdate();
+    }
+    private void collapseToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      if (toolStripMenuNode != null) toolStripMenuNode.Collapse();
+      typesTreeView.EndUpdate();
+    }
+    private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      typesTreeView.CollapseAll();
+      typesTreeView.EndUpdate();
+    }
     #endregion
 
Index: stable/HeuristicLab.Core/3.3/Attributes/CreatableAttribute.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Attributes/CreatableAttribute.cs	(revision 12707)
+++ stable/HeuristicLab.Core/3.3/Attributes/CreatableAttribute.cs	(revision 12708)
@@ -21,8 +21,54 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace HeuristicLab.Core {
   [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
   public sealed class CreatableAttribute : Attribute {
+    #region Predefined Categories
+    public static class Categories {
+      public const string SplitToken = "###";
+      public const string OrderToken = "$$$";
+
+      public const string Algorithms = "1" + OrderToken + "Algorithms";
+      public const string PopulationBasedAlgorithms = Algorithms + SplitToken + "1" + OrderToken + "Population Based";
+      public const string SingleSolutionAlgorithms = Algorithms + SplitToken + "2" + OrderToken + "Single Solution";
+
+      public const string Problems = "2" + OrderToken + "Problems";
+      public const string CombinatorialProblems = Problems + SplitToken + "1" + OrderToken + "Combinatorial";
+      public const string GeneticProgrammingProblems = Problems + SplitToken + "2" + OrderToken + "Genetic Programming";
+      public const string ExternalEvaluationProblems = Problems + SplitToken + "3" + OrderToken + "External Evaluation";
+
+      public const string DataAnalysis = "3" + OrderToken + "Data Analysis";
+      public const string DataAnalysisRegression = DataAnalysis + SplitToken + "1" + OrderToken + "Regression";
+      public const string DataAnalysisClassification = DataAnalysis + SplitToken + "2" + OrderToken + "Classification";
+      public const string DataAnalysisEnsembles = DataAnalysis + SplitToken + "3" + OrderToken + "Ensembles";
+
+      public const string TestingAndAnalysis = "4" + OrderToken + "Testing & Analysis";
+      public const string TestingAndAnalysisOKB = TestingAndAnalysis + SplitToken + "1" + OrderToken + "OKB";
+
+      public const string Scripts = "5" + OrderToken + "Scripts";
+
+      public static string GetFullName(string rawName) {
+        return string.Join(SplitToken, GetTokens(rawName));
+      }
+      public static string GetName(string rawName) {
+        return GetTokens(rawName).Last();
+      }
+      public static IEnumerable<string> GetParentRawNames(string rawName) {
+        var tokens = GetTokensWithOrdering(rawName).ToList();
+        return tokens.Take(tokens.Count - 1);
+      }
+      private static IEnumerable<string> GetTokensWithOrdering(string rawName) {
+        return rawName.Split(new[] { SplitToken }, StringSplitOptions.RemoveEmptyEntries);
+      }
+      private static IEnumerable<string> GetTokens(string rawName) {
+        return GetTokensWithOrdering(rawName)
+          .Select(t => t.Split(new[] { OrderToken }, StringSplitOptions.RemoveEmptyEntries).Last());
+      }
+    }
+    #endregion
+
     private string category;
     public string Category {
@@ -36,6 +82,9 @@
     }
 
+    public int Priority { get; set; }
+
     public CreatableAttribute() {
       Category = "Other Items";
+      Priority = int.MaxValue;
     }
     public CreatableAttribute(string category)
@@ -53,4 +102,9 @@
       else return null;
     }
+    public static int GetPriority(Type type) {
+      var attribs = type.GetCustomAttributes(typeof(CreatableAttribute), false);
+      if (attribs.Length > 0) return ((CreatableAttribute)attribs[0]).Priority;
+      else return int.MaxValue;
+    }
   }
 }
Index: stable/HeuristicLab.Optimization/3.3/Algorithms/UserDefinedAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Algorithms/UserDefinedAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Optimization/3.3/Algorithms/UserDefinedAlgorithm.cs	(revision 12708)
@@ -30,5 +30,5 @@
   /// </summary>
   [Item("User-Defined Algorithm", "An algorithm which can be defined by the user.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.Algorithms, Priority = 100)]
   [StorableClass]
   public sealed class UserDefinedAlgorithm : EngineAlgorithm, IParameterizedItem, IStorableContent {
Index: stable/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs	(revision 12707)
+++ stable/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs	(revision 12708)
@@ -36,5 +36,5 @@
   /// </summary>
   [Item("Batch Run", "A run in which an optimizer is executed a given number of times.")]
-  [Creatable("Testing & Analysis")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 110)]
   [StorableClass]
   public sealed class BatchRun : NamedItem, IOptimizer, IStorableContent {
@@ -237,5 +237,6 @@
         batchRunAction = BatchRunAction.Prepare;
         // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-        try { Optimizer.Prepare(clearRuns); } catch (InvalidOperationException) { }
+        try { Optimizer.Prepare(clearRuns); }
+        catch (InvalidOperationException) { }
       } else {
         ExecutionState = ExecutionState.Stopped;
@@ -249,5 +250,6 @@
       if (Optimizer.ExecutionState == ExecutionState.Stopped) Optimizer.Prepare();
       // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-      try { Optimizer.Start(); } catch (InvalidOperationException) { }
+      try { Optimizer.Start(); }
+      catch (InvalidOperationException) { }
     }
     public void Pause() {
@@ -258,5 +260,6 @@
       if (Optimizer.ExecutionState != ExecutionState.Started) return;
       // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-      try { Optimizer.Pause(); } catch (InvalidOperationException) { }
+      try { Optimizer.Pause(); }
+      catch (InvalidOperationException) { }
     }
     public void Stop() {
@@ -270,5 +273,6 @@
       }
       // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-      try { Optimizer.Stop(); } catch (InvalidOperationException) { }
+      try { Optimizer.Stop(); }
+      catch (InvalidOperationException) { }
     }
 
Index: stable/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs	(revision 12707)
+++ stable/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs	(revision 12708)
@@ -34,5 +34,5 @@
   /// </summary>
   [Item("Experiment", "An experiment which contains multiple algorithms, batch runs or other experiments.")]
-  [Creatable("Testing & Analysis")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 100)]
   [StorableClass]
   public sealed class Experiment : NamedItem, IOptimizer, IStorableContent {
@@ -180,5 +180,6 @@
       foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started)) {
         // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-        try { optimizer.Prepare(clearRuns); } catch (InvalidOperationException) { }
+        try { optimizer.Prepare(clearRuns); }
+        catch (InvalidOperationException) { }
       }
     }
@@ -193,5 +194,6 @@
       if (optimizer != null) {
         // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-        try { optimizer.Start(); } catch (InvalidOperationException) { }
+        try { optimizer.Start(); }
+        catch (InvalidOperationException) { }
       }
     }
@@ -205,5 +207,6 @@
       foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started)) {
         // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-        try { optimizer.Pause(); } catch (InvalidOperationException) { }
+        try { optimizer.Pause(); }
+        catch (InvalidOperationException) { }
       }
     }
@@ -218,5 +221,6 @@
         foreach (var optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) {
           // a race-condition may occur when the optimizer has changed the state by itself in the meantime
-          try { optimizer.Stop(); } catch (InvalidOperationException) { }
+          try { optimizer.Stop(); }
+          catch (InvalidOperationException) { }
         }
       } else {
Index: stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 12708)
@@ -38,5 +38,5 @@
   /// </summary>
   [Item("User-Defined Problem", "A problem which can be defined by the user.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 120)]
   [StorableClass]
   public sealed class UserDefinedProblem : ParameterizedNamedItem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent {
Index: stable/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 12707)
+++ stable/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 12708)
@@ -32,5 +32,5 @@
 namespace HeuristicLab.Optimization {
   [Item("Run Collection", "Represents a collection of runs.")]
-  [Creatable("Testing & Analysis")]
+  [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 120)]
   [StorableClass]
   public class RunCollection : ItemCollection<IRun>, IStringConvertibleMatrix, IStorableContent {
Index: stable/HeuristicLab.Optimizer/3.3/NewItemDialog.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimizer/3.3/NewItemDialog.Designer.cs	(revision 12707)
+++ stable/HeuristicLab.Optimizer/3.3/NewItemDialog.Designer.cs	(revision 12708)
@@ -46,11 +46,40 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewItemDialog));
       this.okButton = new System.Windows.Forms.Button();
       this.cancelButton = new System.Windows.Forms.Button();
-      this.itemsListView = new System.Windows.Forms.ListView();
-      this.nameColumnHeader = new System.Windows.Forms.ColumnHeader();
-      this.descriptioncolumnHeader = new System.Windows.Forms.ColumnHeader();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.versionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.searchLabel = new System.Windows.Forms.Label();
+      this.searchTextBox = new System.Windows.Forms.TextBox();
+      this.clearSearchButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.availableItemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.typesTreeView = new System.Windows.Forms.TreeView();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.descriptionSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemGroupBox = new System.Windows.Forms.GroupBox();
+      this.itemDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.pluginDescriptionGroupBox = new System.Windows.Forms.GroupBox();
+      this.versionTextBox = new System.Windows.Forms.TextBox();
+      this.pluginTextBox = new System.Windows.Forms.TextBox();
+      this.pluginDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.expandToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collapseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.searchTextBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.availableItemsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.descriptionSplitContainer)).BeginInit();
+      this.descriptionSplitContainer.Panel1.SuspendLayout();
+      this.descriptionSplitContainer.Panel2.SuspendLayout();
+      this.descriptionSplitContainer.SuspendLayout();
+      this.itemGroupBox.SuspendLayout();
+      this.pluginDescriptionGroupBox.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -60,8 +89,8 @@
       this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
       this.okButton.Enabled = false;
-      this.okButton.Location = new System.Drawing.Point(456, 409);
+      this.okButton.Location = new System.Drawing.Point(456, 587);
       this.okButton.Name = "okButton";
       this.okButton.Size = new System.Drawing.Size(75, 23);
-      this.okButton.TabIndex = 2;
+      this.okButton.TabIndex = 1;
       this.okButton.Text = "&OK";
       this.okButton.UseVisualStyleBackColor = true;
@@ -72,57 +101,254 @@
       this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-      this.cancelButton.Location = new System.Drawing.Point(537, 409);
+      this.cancelButton.Location = new System.Drawing.Point(537, 587);
       this.cancelButton.Name = "cancelButton";
       this.cancelButton.Size = new System.Drawing.Size(75, 23);
-      this.cancelButton.TabIndex = 3;
+      this.cancelButton.TabIndex = 2;
       this.cancelButton.Text = "&Cancel";
       this.cancelButton.UseVisualStyleBackColor = true;
       // 
-      // itemsListView
-      // 
-      this.itemsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.nameColumnHeader,
-            this.versionColumnHeader,
-            this.descriptioncolumnHeader});
-      this.itemsListView.FullRowSelect = true;
-      this.itemsListView.HideSelection = false;
-      this.itemsListView.Location = new System.Drawing.Point(12, 12);
-      this.itemsListView.MultiSelect = false;
-      this.itemsListView.Name = "itemsListView";
-      this.itemsListView.Size = new System.Drawing.Size(600, 391);
-      this.itemsListView.TabIndex = 1;
-      this.itemsListView.UseCompatibleStateImageBehavior = false;
-      this.itemsListView.View = System.Windows.Forms.View.Details;
-      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemTypesListView_SelectedIndexChanged);
-      this.itemsListView.DoubleClick += new System.EventHandler(this.itemTypesListView_DoubleClick);
-      // 
-      // nameColumnHeader
-      // 
-      this.nameColumnHeader.DisplayIndex = 0;
-      this.nameColumnHeader.Text = "Name";
-      this.nameColumnHeader.Width = 91;
-      // 
-      // descriptioncolumnHeader
-      // 
-      this.descriptioncolumnHeader.DisplayIndex = 2;
-      this.descriptioncolumnHeader.Text = "Description";
-      this.descriptioncolumnHeader.Width = 190;
-      // 
-      // versionColumnHeader
-      // 
-      this.versionColumnHeader.DisplayIndex = 1;
-      this.versionColumnHeader.Text = "Version";
+      // searchLabel
+      // 
+      this.searchLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Zoom;
+      this.searchLabel.Location = new System.Drawing.Point(6, 17);
+      this.searchLabel.Name = "searchLabel";
+      this.searchLabel.Size = new System.Drawing.Size(20, 20);
+      this.searchLabel.TabIndex = 0;
+      this.toolTip.SetToolTip(this.searchLabel, "Enter string to search for items");
+      // 
+      // searchTextBox
+      // 
+      this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.searchTextBox.Controls.Add(this.clearSearchButton);
+      this.searchTextBox.Location = new System.Drawing.Point(32, 17);
+      this.searchTextBox.Name = "searchTextBox";
+      this.searchTextBox.Size = new System.Drawing.Size(562, 20);
+      this.searchTextBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.searchTextBox, "Filters the available Items.\r\nThe search term is tokenized by space and a name ha" +
+        "s to contain all tokens to be displayed.\r\n(E.g. \"Sym Reg\" matches \"Symbolic Regr" +
+        "ession\")");
+      this.searchTextBox.TextChanged += new System.EventHandler(this.searchTextBox_TextChanged);
+      this.searchTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.searchTextBox_KeyDown);
+      // 
+      // clearSearchButton
+      // 
+      this.clearSearchButton.BackColor = System.Drawing.Color.Transparent;
+      this.clearSearchButton.Cursor = System.Windows.Forms.Cursors.Default;
+      this.clearSearchButton.Dock = System.Windows.Forms.DockStyle.Right;
+      this.clearSearchButton.FlatAppearance.BorderSize = 0;
+      this.clearSearchButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.clearSearchButton.ForeColor = System.Drawing.Color.Transparent;
+      this.clearSearchButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Delete;
+      this.clearSearchButton.Location = new System.Drawing.Point(543, 0);
+      this.clearSearchButton.Margin = new System.Windows.Forms.Padding(0);
+      this.clearSearchButton.Name = "clearSearchButton";
+      this.clearSearchButton.Size = new System.Drawing.Size(15, 16);
+      this.clearSearchButton.TabIndex = 0;
+      this.clearSearchButton.TabStop = false;
+      this.clearSearchButton.UseVisualStyleBackColor = false;
+      this.clearSearchButton.Click += new System.EventHandler(this.clearSearchButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.splitContainer.Location = new System.Drawing.Point(12, 12);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.availableItemsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.descriptionSplitContainer);
+      this.splitContainer.Size = new System.Drawing.Size(600, 569);
+      this.splitContainer.SplitterDistance = 373;
+      this.splitContainer.TabIndex = 0;
+      this.splitContainer.TabStop = false;
+      // 
+      // availableItemsGroupBox
+      // 
+      this.availableItemsGroupBox.Controls.Add(this.searchLabel);
+      this.availableItemsGroupBox.Controls.Add(this.searchTextBox);
+      this.availableItemsGroupBox.Controls.Add(this.typesTreeView);
+      this.availableItemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.availableItemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.availableItemsGroupBox.Name = "availableItemsGroupBox";
+      this.availableItemsGroupBox.Padding = new System.Windows.Forms.Padding(3, 15, 3, 3);
+      this.availableItemsGroupBox.Size = new System.Drawing.Size(600, 373);
+      this.availableItemsGroupBox.TabIndex = 5;
+      this.availableItemsGroupBox.TabStop = false;
+      this.availableItemsGroupBox.Text = "Available Items";
+      // 
+      // typesTreeView
+      // 
+      this.typesTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.typesTreeView.HideSelection = false;
+      this.typesTreeView.ImageIndex = 0;
+      this.typesTreeView.ImageList = this.imageList;
+      this.typesTreeView.Location = new System.Drawing.Point(6, 41);
+      this.typesTreeView.Name = "typesTreeView";
+      this.typesTreeView.SelectedImageIndex = 0;
+      this.typesTreeView.ShowNodeToolTips = true;
+      this.typesTreeView.Size = new System.Drawing.Size(588, 326);
+      this.typesTreeView.TabIndex = 2;
+      this.typesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.itemsTreeView_AfterSelect);
+      this.typesTreeView.VisibleChanged += new System.EventHandler(this.itemsTreeView_VisibleChanged);
+      this.typesTreeView.DoubleClick += new System.EventHandler(this.itemTreeView_DoubleClick);
+      this.typesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.typesTreeView_MouseDown);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // descriptionSplitContainer
+      // 
+      this.descriptionSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.descriptionSplitContainer.Location = new System.Drawing.Point(0, 0);
+      this.descriptionSplitContainer.Name = "descriptionSplitContainer";
+      this.descriptionSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // descriptionSplitContainer.Panel1
+      // 
+      this.descriptionSplitContainer.Panel1.Controls.Add(this.itemGroupBox);
+      // 
+      // descriptionSplitContainer.Panel2
+      // 
+      this.descriptionSplitContainer.Panel2.Controls.Add(this.pluginDescriptionGroupBox);
+      this.descriptionSplitContainer.Size = new System.Drawing.Size(600, 192);
+      this.descriptionSplitContainer.SplitterDistance = 81;
+      this.descriptionSplitContainer.TabIndex = 1;
+      this.descriptionSplitContainer.TabStop = false;
+      // 
+      // itemGroupBox
+      // 
+      this.itemGroupBox.Controls.Add(this.itemDescriptionTextBox);
+      this.itemGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemGroupBox.Name = "itemGroupBox";
+      this.itemGroupBox.Size = new System.Drawing.Size(600, 81);
+      this.itemGroupBox.TabIndex = 1;
+      this.itemGroupBox.TabStop = false;
+      this.itemGroupBox.Text = "Item";
+      // 
+      // itemDescriptionTextBox
+      // 
+      this.itemDescriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.itemDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.itemDescriptionTextBox.Location = new System.Drawing.Point(6, 19);
+      this.itemDescriptionTextBox.Multiline = true;
+      this.itemDescriptionTextBox.Name = "itemDescriptionTextBox";
+      this.itemDescriptionTextBox.ReadOnly = true;
+      this.itemDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.itemDescriptionTextBox.Size = new System.Drawing.Size(588, 56);
+      this.itemDescriptionTextBox.TabIndex = 0;
+      this.itemDescriptionTextBox.TabStop = false;
+      // 
+      // pluginDescriptionGroupBox
+      // 
+      this.pluginDescriptionGroupBox.Controls.Add(this.versionTextBox);
+      this.pluginDescriptionGroupBox.Controls.Add(this.pluginTextBox);
+      this.pluginDescriptionGroupBox.Controls.Add(this.pluginDescriptionTextBox);
+      this.pluginDescriptionGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.pluginDescriptionGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.pluginDescriptionGroupBox.Name = "pluginDescriptionGroupBox";
+      this.pluginDescriptionGroupBox.Size = new System.Drawing.Size(600, 107);
+      this.pluginDescriptionGroupBox.TabIndex = 1;
+      this.pluginDescriptionGroupBox.TabStop = false;
+      this.pluginDescriptionGroupBox.Text = "Plugin";
+      // 
+      // versionTextBox
+      // 
+      this.versionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.versionTextBox.Location = new System.Drawing.Point(444, 20);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.ReadOnly = true;
+      this.versionTextBox.Size = new System.Drawing.Size(150, 20);
+      this.versionTextBox.TabIndex = 0;
+      this.versionTextBox.TabStop = false;
+      // 
+      // pluginTextBox
+      // 
+      this.pluginTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginTextBox.Location = new System.Drawing.Point(6, 20);
+      this.pluginTextBox.Name = "pluginTextBox";
+      this.pluginTextBox.ReadOnly = true;
+      this.pluginTextBox.Size = new System.Drawing.Size(432, 20);
+      this.pluginTextBox.TabIndex = 0;
+      this.pluginTextBox.TabStop = false;
+      // 
+      // pluginDescriptionTextBox
+      // 
+      this.pluginDescriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.pluginDescriptionTextBox.Location = new System.Drawing.Point(6, 46);
+      this.pluginDescriptionTextBox.Multiline = true;
+      this.pluginDescriptionTextBox.Name = "pluginDescriptionTextBox";
+      this.pluginDescriptionTextBox.ReadOnly = true;
+      this.pluginDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.pluginDescriptionTextBox.Size = new System.Drawing.Size(588, 55);
+      this.pluginDescriptionTextBox.TabIndex = 0;
+      this.pluginDescriptionTextBox.TabStop = false;
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.expandToolStripMenuItem,
+            this.expandAllToolStripMenuItem,
+            this.collapseToolStripMenuItem,
+            this.collapseAllToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(137, 92);
+      // 
+      // expandToolStripMenuItem
+      // 
+      this.expandToolStripMenuItem.Name = "expandToolStripMenuItem";
+      this.expandToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.expandToolStripMenuItem.Text = "Expand";
+      this.expandToolStripMenuItem.Click += new System.EventHandler(this.expandToolStripMenuItem_Click);
+      // 
+      // expandAllToolStripMenuItem
+      // 
+      this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem";
+      this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.expandAllToolStripMenuItem.Text = "Expand All";
+      this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click);
+      // 
+      // collapseToolStripMenuItem
+      // 
+      this.collapseToolStripMenuItem.Name = "collapseToolStripMenuItem";
+      this.collapseToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.collapseToolStripMenuItem.Text = "Collapse";
+      this.collapseToolStripMenuItem.Click += new System.EventHandler(this.collapseToolStripMenuItem_Click);
+      // 
+      // collapseAllToolStripMenuItem
+      // 
+      this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem";
+      this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.collapseAllToolStripMenuItem.Text = "Collapse All";
+      this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click);
       // 
       // NewItemDialog
       // 
       this.AcceptButton = this.okButton;
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.CancelButton = this.cancelButton;
-      this.ClientSize = new System.Drawing.Size(624, 444);
-      this.Controls.Add(this.itemsListView);
+      this.ClientSize = new System.Drawing.Size(624, 622);
+      this.Controls.Add(this.splitContainer);
       this.Controls.Add(this.cancelButton);
       this.Controls.Add(this.okButton);
@@ -137,4 +363,20 @@
       this.Load += new System.EventHandler(this.NewItemDialog_Load);
       this.Shown += new System.EventHandler(this.NewItemDialog_Shown);
+      this.searchTextBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.availableItemsGroupBox.ResumeLayout(false);
+      this.availableItemsGroupBox.PerformLayout();
+      this.descriptionSplitContainer.Panel1.ResumeLayout(false);
+      this.descriptionSplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.descriptionSplitContainer)).EndInit();
+      this.descriptionSplitContainer.ResumeLayout(false);
+      this.itemGroupBox.ResumeLayout(false);
+      this.itemGroupBox.PerformLayout();
+      this.pluginDescriptionGroupBox.ResumeLayout(false);
+      this.pluginDescriptionGroupBox.PerformLayout();
+      this.contextMenuStrip.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -145,9 +387,24 @@
     private System.Windows.Forms.Button okButton;
     private System.Windows.Forms.Button cancelButton;
-    private System.Windows.Forms.ListView itemsListView;
     private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.ColumnHeader nameColumnHeader;
-    private System.Windows.Forms.ColumnHeader descriptioncolumnHeader;
-    private System.Windows.Forms.ColumnHeader versionColumnHeader;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.TextBox pluginDescriptionTextBox;
+    private System.Windows.Forms.Label searchLabel;
+    private System.Windows.Forms.TextBox searchTextBox;
+    private System.Windows.Forms.TreeView typesTreeView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.GroupBox availableItemsGroupBox;
+    private System.Windows.Forms.GroupBox pluginDescriptionGroupBox;
+    private System.Windows.Forms.TextBox versionTextBox;
+    private System.Windows.Forms.TextBox pluginTextBox;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem expandToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem collapseToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem;
+    private System.Windows.Forms.Button clearSearchButton;
+    private System.Windows.Forms.GroupBox itemGroupBox;
+    private System.Windows.Forms.TextBox itemDescriptionTextBox;
+    private System.Windows.Forms.SplitContainer descriptionSplitContainer;
   }
 }
Index: stable/HeuristicLab.Optimizer/3.3/NewItemDialog.cs
===================================================================
--- stable/HeuristicLab.Optimizer/3.3/NewItemDialog.cs	(revision 12707)
+++ stable/HeuristicLab.Optimizer/3.3/NewItemDialog.cs	(revision 12708)
@@ -21,7 +21,11 @@
 
 using System;
+using System.Collections;
+using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
 using HeuristicLab.PluginInfrastructure;
@@ -29,5 +33,19 @@
 namespace HeuristicLab.Optimizer {
   internal partial class NewItemDialog : Form {
-    private bool initialized;
+    private bool isInitialized;
+
+    private readonly List<TreeNode> treeNodes;
+    private string currentSearchString;
+
+    private Type selectedType;
+    public Type SelectedType {
+      get { return selectedType; }
+      private set {
+        if (value != selectedType) {
+          selectedType = value;
+          OnSelectedTypeChanged();
+        }
+      }
+    }
 
     private IItem item;
@@ -37,65 +55,406 @@
 
     public NewItemDialog() {
-      initialized = false;
+      InitializeComponent();
+      treeNodes = new List<TreeNode>();
+      currentSearchString = string.Empty;
       item = null;
-      InitializeComponent();
+      SelectedTypeChanged += this_SelectedTypeChanged;
     }
 
     private void NewItemDialog_Load(object sender, EventArgs e) {
-      if (!initialized) {
-        var categories = from t in ApplicationManager.Manager.GetTypes(typeof(IItem))
-                         where CreatableAttribute.IsCreatable(t)
-                         orderby CreatableAttribute.GetCategory(t), ItemAttribute.GetName(t), ItemAttribute.GetVersion(t) ascending
-                         group t by CreatableAttribute.GetCategory(t) into c
-                         select c;
-
-        itemsListView.SmallImageList = new ImageList();
-        itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Class);  // default icon
-        foreach (var category in categories) {
-          ListViewGroup group = new ListViewGroup(category.Key);
-          itemsListView.Groups.Add(group);
-          foreach (var creatable in category) {
-            string name = ItemAttribute.GetName(creatable);
-            string version = ItemAttribute.GetVersion(creatable).ToString();
-            string description = ItemAttribute.GetDescription(creatable);
-            ListViewItem item = new ListViewItem(new string[] { name, version, description }, group);
-            item.ImageIndex = 0;
-            Image image = ItemAttribute.GetImage(creatable);
-            if (image != null) {
-              itemsListView.SmallImageList.Images.Add(image);
-              item.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
-            }
-            item.Tag = creatable;
-            itemsListView.Items.Add(item);
+      if (isInitialized) return;
+
+      // Sorted by hasOrdering to create category nodes first with concrete ordering.
+      // Items with categoryname without ordering are inserted afterwards correctly
+      var categories =
+        from type in ApplicationManager.Manager.GetTypes(typeof(IItem))
+        where CreatableAttribute.IsCreatable(type)
+        let category = CreatableAttribute.GetCategory(type)
+        let hasOrdering = category.Contains(CreatableAttribute.Categories.OrderToken)
+        let name = ItemAttribute.GetName(type)
+        let priority = CreatableAttribute.GetPriority(type)
+        let version = ItemAttribute.GetVersion(type)
+        orderby category, hasOrdering descending, priority, name, version ascending
+        group type by category into categoryGroup
+        select categoryGroup;
+
+      var rootNode = CreateCategoryTree(categories);
+      CreateItemNodes(rootNode, categories);
+
+      foreach (TreeNode topNode in rootNode.Nodes)
+        treeNodes.Add(topNode);
+      foreach (var node in treeNodes)
+        typesTreeView.Nodes.Add((TreeNode)node.Clone());
+
+      typesTreeView.TreeViewNodeSorter = new ItemTreeNodeComparer();
+      typesTreeView.Sort();
+
+      isInitialized = true;
+    }
+
+    private TreeNode CreateCategoryTree(IEnumerable<IGrouping<string, Type>> categories) {
+      imageList.Images.Add(VSImageLibrary.Class);      // default icon
+      imageList.Images.Add(VSImageLibrary.Namespace);  // plugins
+
+      var rootNode = new TreeNode();
+
+      // CategoryNode
+      // Tag: raw string, used for sorting, e.g. 1$$$Algorithms###2$$$Single Solution
+      // Name: full name = combined category name with parent categories, used for finding nodes in tree, e.g. Algorithms###Single Solution
+      // Text: category name, used for displaying on node itself, e.g. Single Solution
+
+      foreach (var category in categories) {
+        var rawName = category.Key;
+        string fullName = CreatableAttribute.Categories.GetFullName(rawName);
+        string name = CreatableAttribute.Categories.GetName(rawName);
+
+        // Skip categories with same full name because the raw name can still be different (missing order)
+        if (rootNode.Nodes.Find(fullName, true).Length > 0)
+          continue;
+
+        var categoryNode = new TreeNode(name, 1, 1) {
+          Name = fullName,
+          Tag = rawName
+        };
+
+        var parents = CreatableAttribute.Categories.GetParentRawNames(rawName);
+        var parentNode = FindOrCreateParentNode(rootNode, parents);
+        if (parentNode != null)
+          parentNode.Nodes.Add(categoryNode);
+        else
+          rootNode.Nodes.Add(categoryNode);
+      }
+
+      return rootNode;
+    }
+    private TreeNode FindOrCreateParentNode(TreeNode node, IEnumerable<string> rawParentNames) {
+      TreeNode parentNode = null;
+      string rawName = null;
+      foreach (string rawParentName in rawParentNames) {
+        rawName = rawName == null ? rawParentName : rawName + CreatableAttribute.Categories.SplitToken + rawParentName;
+        var fullName = CreatableAttribute.Categories.GetFullName(rawName);
+        parentNode = node.Nodes.Find(fullName, false).SingleOrDefault();
+        if (parentNode == null) {
+          var name = CreatableAttribute.Categories.GetName(rawName);
+          parentNode = new TreeNode(name, 1, 1) {
+            Name = fullName,
+            Tag = rawName
+          };
+          node.Nodes.Add(parentNode);
+        }
+        node = parentNode;
+      }
+      return parentNode;
+    }
+    private void CreateItemNodes(TreeNode node, IEnumerable<IGrouping<string, Type>> categories) {
+      foreach (var category in categories) {
+        var fullName = CreatableAttribute.Categories.GetFullName(category.Key);
+        var categoryNode = node.Nodes.Find(fullName, true).Single();
+        foreach (var creatable in category) {
+          var itemNode = CreateItemNode(creatable);
+          itemNode.Name = itemNode.Name + ":" + fullName;
+          categoryNode.Nodes.Add(itemNode);
+        }
+      }
+    }
+    private TreeNode CreateItemNode(Type creatable) {
+      string name = ItemAttribute.GetName(creatable);
+
+      var itemNode = new TreeNode(name) {
+        ImageIndex = 0,
+        Tag = creatable,
+        Name = name
+      };
+
+      var image = ItemAttribute.GetImage(creatable);
+      if (image != null) {
+        imageList.Images.Add(image);
+        itemNode.ImageIndex = imageList.Images.Count - 1;
+      }
+      itemNode.SelectedImageIndex = itemNode.ImageIndex;
+
+      return itemNode;
+    }
+
+    private void NewItemDialog_Shown(object sender, EventArgs e) {
+      searchTextBox.Text = string.Empty;
+      searchTextBox.Focus();
+      SelectedType = null;
+      typesTreeView.SelectedNode = null;
+      UpdateDescription();
+
+      foreach (TreeNode node in typesTreeView.Nodes)
+        node.Expand();
+      typesTreeView.Nodes[0].EnsureVisible();
+    }
+
+    public virtual void Filter(string searchString) {
+      if (InvokeRequired) {
+        Invoke(new Action<string>(Filter), searchString);
+      } else {
+        searchString = searchString.ToLower();
+        var selectedNode = typesTreeView.SelectedNode;
+
+        if (!searchString.Contains(currentSearchString)) {
+          typesTreeView.BeginUpdate();
+          // expand search -> restore all tree nodes
+          typesTreeView.Nodes.Clear();
+          foreach (TreeNode node in treeNodes)
+            typesTreeView.Nodes.Add((TreeNode)node.Clone());
+          typesTreeView.EndUpdate();
+        }
+
+        // remove nodes
+        typesTreeView.BeginUpdate();
+        var searchTokens = searchString.Split(' ');
+        int i = 0;
+        while (i < typesTreeView.Nodes.Count) {
+          var categoryNode = typesTreeView.Nodes[i];
+          bool remove = FilterNode(categoryNode, searchTokens);
+          if (remove)
+            typesTreeView.Nodes.RemoveAt(i);
+          else i++;
+        }
+        typesTreeView.EndUpdate();
+        currentSearchString = searchString;
+
+        // select first item
+        typesTreeView.BeginUpdate();
+        var firstNode = FirstVisibleNode;
+        while (firstNode != null && !(firstNode.Tag is Type))
+          firstNode = firstNode.NextVisibleNode;
+        if (firstNode != null)
+          typesTreeView.SelectedNode = firstNode;
+
+        if (typesTreeView.Nodes.Count == 0) {
+          SelectedType = null;
+          typesTreeView.Enabled = false;
+        } else {
+          SetTreeNodeVisibility();
+          typesTreeView.Enabled = true;
+        }
+        typesTreeView.EndUpdate();
+
+        RestoreSelectedNode(selectedNode);
+        UpdateDescription();
+      }
+    }
+
+    private bool FilterNode(TreeNode node, string[] searchTokens) {
+      if (node.Tag is string) { // Category node
+        int i = 0;
+        while (i < node.Nodes.Count) {
+          bool remove = FilterNode(node.Nodes[i], searchTokens);
+          if (remove)
+            node.Nodes.RemoveAt(i);
+          else i++;
+        }
+        return node.Nodes.Count == 0;
+      } if (node.Tag is Type) { // Type node
+        var text = node.Text;
+        if (searchTokens.Any(searchToken => !text.ToLower().Contains(searchToken))) {
+          var typeTag = (Type)node.Tag;
+          if (typeTag == SelectedType) {
+            SelectedType = null;
+            typesTreeView.SelectedNode = null;
           }
-        }
-        for (int i = 0; i < itemsListView.Columns.Count; i++)
-          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
-        initialized = true;
-      }
-    }
-
-    private void NewItemDialog_Shown(object sender, EventArgs e) {
-      item = null;
-    }
-
-    private void itemTypesListView_SelectedIndexChanged(object sender, EventArgs e) {
-      okButton.Enabled = itemsListView.SelectedItems.Count == 1;
-    }
+          return true;
+        }
+        return false;
+      }
+      throw new InvalidOperationException("Encountered neither a category nor a creatable node during tree traversal.");
+    }
+
+    protected virtual void UpdateDescription() {
+      itemDescriptionTextBox.Text = string.Empty;
+      pluginDescriptionTextBox.Text = string.Empty;
+      pluginTextBox.Text = string.Empty;
+      versionTextBox.Text = string.Empty;
+
+      if (typesTreeView.SelectedNode != null) {
+        var node = typesTreeView.SelectedNode;
+        string category = node.Tag as string;
+        if (category != null) {
+          itemDescriptionTextBox.Text = string.Join(" - ", node.Name.Split(new[] { CreatableAttribute.Categories.SplitToken }, StringSplitOptions.RemoveEmptyEntries));
+        }
+        Type type = node.Tag as Type;
+        if (type != null) {
+          string description = ItemAttribute.GetDescription(type);
+          var version = ItemAttribute.GetVersion(type);
+          var plugin = ApplicationManager.Manager.GetDeclaringPlugin(type);
+          if (description != null)
+            itemDescriptionTextBox.Text = description;
+          if (plugin != null) {
+            pluginTextBox.Text = plugin.Name;
+            pluginDescriptionTextBox.Text = plugin.Description;
+          }
+          if (version != null)
+            versionTextBox.Text = version.ToString();
+        }
+      } else if (typesTreeView.Nodes.Count == 0) {
+        itemDescriptionTextBox.Text = "No types found";
+      }
+    }
+
+    #region Events
+    public event EventHandler SelectedTypeChanged;
+    protected virtual void OnSelectedTypeChanged() {
+      if (SelectedTypeChanged != null)
+        SelectedTypeChanged(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Control Events
+    protected virtual void searchTextBox_TextChanged(object sender, EventArgs e) {
+      Filter(searchTextBox.Text);
+    }
+
+    protected virtual void itemsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (typesTreeView.SelectedNode == null) SelectedType = null;
+      else SelectedType = typesTreeView.SelectedNode.Tag as Type;
+      UpdateDescription();
+    }
+
+    protected virtual void itemsTreeView_VisibleChanged(object sender, EventArgs e) {
+      if (Visible) SetTreeNodeVisibility();
+    }
+    #endregion
+
+    #region Helpers
+    private void RestoreSelectedNode(TreeNode selectedNode) {
+      if (selectedNode != null) {
+        var node = typesTreeView.Nodes.Find(selectedNode.Name, true).SingleOrDefault();
+        if (node != null)
+          typesTreeView.SelectedNode = node;
+        if (typesTreeView.SelectedNode == null)
+          SelectedType = null;
+      }
+    }
+    private void SetTreeNodeVisibility() {
+      TreeNode selectedNode = typesTreeView.SelectedNode;
+      if (string.IsNullOrEmpty(currentSearchString) && (typesTreeView.Nodes.Count > 1)) {
+        typesTreeView.CollapseAll();
+        if (selectedNode != null) typesTreeView.SelectedNode = selectedNode;
+      } else {
+        typesTreeView.ExpandAll();
+      }
+      if (selectedNode != null) selectedNode.EnsureVisible();
+    }
+    #endregion
 
     private void okButton_Click(object sender, EventArgs e) {
-      if (itemsListView.SelectedItems.Count == 1) {
-        item = (IItem)Activator.CreateInstance((Type)itemsListView.SelectedItems[0].Tag);
+      if (SelectedType != null) {
+        item = (IItem)Activator.CreateInstance(SelectedType);
         DialogResult = DialogResult.OK;
         Close();
       }
     }
-    private void itemTypesListView_DoubleClick(object sender, EventArgs e) {
-      if (itemsListView.SelectedItems.Count == 1) {
-        item = (IItem)Activator.CreateInstance((Type)itemsListView.SelectedItems[0].Tag);
+    private void itemTreeView_DoubleClick(object sender, EventArgs e) {
+      if (SelectedType != null) {
+        item = (IItem)Activator.CreateInstance(SelectedType);
         DialogResult = DialogResult.OK;
         Close();
       }
     }
+    private void this_SelectedTypeChanged(object sender, EventArgs e) {
+      okButton.Enabled = SelectedType != null;
+    }
+
+    private TreeNode toolStripMenuNode;
+    private void typesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Right) {
+        Point coordinates = typesTreeView.PointToClient(Cursor.Position);
+        toolStripMenuNode = typesTreeView.GetNodeAt(coordinates);
+
+        if (toolStripMenuNode != null && coordinates.X >= toolStripMenuNode.Bounds.Left &&
+            coordinates.X <= toolStripMenuNode.Bounds.Right) {
+          typesTreeView.SelectedNode = toolStripMenuNode;
+
+          expandToolStripMenuItem.Enabled =
+            expandToolStripMenuItem.Visible = !toolStripMenuNode.IsExpanded && toolStripMenuNode.Nodes.Count > 0;
+          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = toolStripMenuNode.IsExpanded;
+        } else {
+          expandToolStripMenuItem.Enabled = expandToolStripMenuItem.Visible = false;
+          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = false;
+        }
+        expandAllToolStripMenuItem.Enabled =
+          expandAllToolStripMenuItem.Visible =
+            !typesTreeView.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x));
+        collapseAllToolStripMenuItem.Enabled =
+          collapseAllToolStripMenuItem.Visible = typesTreeView.Nodes.OfType<TreeNode>().Any(x => x.IsExpanded);
+        if (contextMenuStrip.Items.Cast<ToolStripMenuItem>().Any(item => item.Enabled))
+          contextMenuStrip.Show(Cursor.Position);
+      }
+    }
+    private bool TreeNodeIsFullyExpanded(TreeNode node) {
+      return (node.Nodes.Count == 0) || (node.IsExpanded && node.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x)));
+    }
+
+    private void expandToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      if (toolStripMenuNode != null) toolStripMenuNode.ExpandAll();
+      typesTreeView.EndUpdate();
+    }
+    private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      typesTreeView.ExpandAll();
+      typesTreeView.EndUpdate();
+    }
+    private void collapseToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      if (toolStripMenuNode != null) toolStripMenuNode.Collapse();
+      typesTreeView.EndUpdate();
+    }
+    private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      typesTreeView.CollapseAll();
+      typesTreeView.EndUpdate();
+    }
+
+    private void clearSearchButton_Click(object sender, EventArgs e) {
+      searchTextBox.Text = string.Empty;
+      searchTextBox.Focus();
+    }
+
+    private void searchTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (typesTreeView.Nodes.Count == 0)
+        return;
+
+      if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) {
+        var selectedNode = typesTreeView.SelectedNode;
+
+        if (selectedNode == null) { // nothing selected => select first
+          if (e.KeyCode == Keys.Down) typesTreeView.SelectedNode = FirstVisibleNode;
+        } else {
+          if (e.KeyCode == Keys.Down && selectedNode.NextVisibleNode != null)
+            typesTreeView.SelectedNode = selectedNode.NextVisibleNode;
+          if (e.KeyCode == Keys.Up && selectedNode.PrevVisibleNode != null)
+            typesTreeView.SelectedNode = selectedNode.PrevVisibleNode;
+        }
+        e.Handled = true;
+      }
+    }
+
+    private TreeNode FirstVisibleNode {
+      get {
+        return typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
+      }
+    }
+
+    private class ItemTreeNodeComparer : IComparer {
+      private static readonly IComparer<string> Comparer = new NaturalStringComparer();
+      public int Compare(object x, object y) {
+        var lhs = (TreeNode)x;
+        var rhs = (TreeNode)y;
+
+        if (lhs.Tag is string && rhs.Tag is string) {
+          return Comparer.Compare((string)lhs.Tag, (string)rhs.Tag);
+        }
+        if (lhs.Tag is string) {
+          return -1;
+        }
+        return 1;
+      }
+    }
   }
 }
Index: stable/HeuristicLab.Problems.ArtificialAnt/3.4/ArtificialAntProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.ArtificialAnt/3.4/ArtificialAntProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.ArtificialAnt/3.4/ArtificialAntProblem.cs	(revision 12708)
@@ -35,5 +35,5 @@
 namespace HeuristicLab.Problems.ArtificialAnt {
   [Item("Artificial Ant Problem", "Represents the Artificial Ant problem.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 170)]
   [StorableClass]
   public sealed class ArtificialAntProblem : SingleObjectiveHeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator>, IStorableContent {
Index: stable/HeuristicLab.Problems.Binary/3.3/DeceptiveStepTrapProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/DeceptiveStepTrapProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Binary/3.3/DeceptiveStepTrapProblem.cs	(revision 12708)
@@ -32,5 +32,5 @@
   [Item("Deceptive Step Trap Problem", "Genome encodes completely separable blocks, where each block deceptive with fitness plateaus.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 230)]
   public class DeceptiveStepTrapProblem : DeceptiveTrapProblem {
     [StorableConstructor]
Index: stable/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs	(revision 12708)
@@ -33,5 +33,5 @@
   [Item("Deceptive Trap Problem", "Genome encodes completely separable blocks, where each block is fully deceptive.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 230)]
   public class DeceptiveTrapProblem : BinaryProblem {
     [StorableConstructor]
Index: stable/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs	(revision 12708)
@@ -31,5 +31,5 @@
   [Item("Hierararchical If and only If problem", "Genome evaluated in nested subsets to see if each subset contains either all 0s or all 1s.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 220)]
   public class HIFFProblem : BinaryProblem {
     [StorableConstructor]
@@ -48,5 +48,5 @@
     public HIFFProblem()
       : base() {
-        Encoding.Length = 64;
+      Encoding.Length = 64;
     }
     // In the GECCO paper, Section 4.1
Index: stable/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs	(revision 12708)
@@ -25,10 +25,9 @@
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.Binary {
   [Item("One Max Problem", "Represents a problem whose objective is to maximize the number of true values.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 210)]
   [StorableClass]
   public class OneMaxProblem : BinaryProblem {
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/MultiObjective/SymbolicClassificationMultiObjectiveProblem.cs	(revision 12708)
@@ -28,7 +28,7 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
-  [Item("Symbolic Classification Problem (multi objective)", "Represents a multi objective symbolic classfication problem.")]
+  [Item("Symbolic Classification Problem (multi-objective)", "Represents a multi objective symbolic classfication problem.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 130)]
   public class SymbolicClassificationMultiObjectiveProblem : SymbolicDataAnalysisMultiObjectiveProblem<IClassificationProblemData, ISymbolicClassificationMultiObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, IClassificationProblem {
     private const double PunishmentFactor = 10;
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveProblem.cs	(revision 12708)
@@ -27,7 +27,7 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
-  [Item("Symbolic Classification Problem (single objective)", "Represents a single objective symbolic classfication problem.")]
+  [Item("Symbolic Classification Problem (single-objective)", "Represents a single objective symbolic classfication problem.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 120)]
   public class SymbolicClassificationSingleObjectiveProblem : SymbolicDataAnalysisSingleObjectiveProblem<IClassificationProblemData, ISymbolicClassificationSingleObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, IClassificationProblem {
     private const double PunishmentFactor = 10;
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveProblem.cs	(revision 12708)
@@ -29,7 +29,7 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
-  [Item("Symbolic Regression Problem (multi objective)", "Represents a multi objective symbolic regression problem.")]
+  [Item("Symbolic Regression Problem (multi-objective)", "Represents a multi objective symbolic regression problem.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 110)]
   public class SymbolicRegressionMultiObjectiveProblem : SymbolicDataAnalysisMultiObjectiveProblem<IRegressionProblemData, ISymbolicRegressionMultiObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, IRegressionProblem {
     private const double PunishmentFactor = 10;
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveProblem.cs	(revision 12708)
@@ -28,7 +28,7 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
-  [Item("Symbolic Regression Problem (single objective)", "Represents a single objective symbolic regression problem.")]
+  [Item("Symbolic Regression Problem (single-objective)", "Represents a single objective symbolic regression problem.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 100)]
   public class SymbolicRegressionSingleObjectiveProblem : SymbolicDataAnalysisSingleObjectiveProblem<IRegressionProblemData, ISymbolicRegressionSingleObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, IRegressionProblem {
     private const double PunishmentFactor = 10;
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveProblem.cs	(revision 12708)
@@ -26,10 +26,9 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.Instances;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis {
-  [Item("Symbolic Time-Series Prognosis Problem (single objective)", "Represents a single objective symbolic time-series prognosis problem.")]
+  [Item("Symbolic Time-Series Prognosis Problem (single-objective)", "Represents a single-objective symbolic time-series prognosis problem.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 140)]
   public class SymbolicTimeSeriesPrognosisSingleObjectiveProblem : SymbolicDataAnalysisSingleObjectiveProblem<ITimeSeriesPrognosisProblemData, ISymbolicTimeSeriesPrognosisSingleObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, ITimeSeriesPrognosisProblem {
     private const double PunishmentFactor = 10;
Index: stable/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/Problem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/Problem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis.Trading/3.4/Symbolic/SingleObjective/Problem.cs	(revision 12708)
@@ -26,7 +26,7 @@
 
 namespace HeuristicLab.Problems.DataAnalysis.Trading.Symbolic {
-  [Item("Symbolic Trading Problem (single objective)", "Represents a single objective symbolic trading problem.")]
+  [Item("Symbolic Trading Problem (single-objective)", "Represents a single-objective symbolic trading problem.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 150)]
   public class SingleObjectiveProblem : SymbolicDataAnalysisSingleObjectiveProblem<IProblemData, ISingleObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, IProblem {
     private const int InitialMaximumTreeDepth = 8;
Index: stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationEnsembleSolution.cs	(revision 12708)
@@ -35,5 +35,5 @@
   [StorableClass]
   [Item("Classification Ensemble Solution", "A classification solution that contains an ensemble of multiple classification models")]
-  [Creatable("Data Analysis - Ensembles")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisEnsembles, Priority = 110)]
   public sealed class ClassificationEnsembleSolution : ClassificationSolutionBase, IClassificationEnsembleSolution {
     private readonly Dictionary<int, double> trainingEvaluationCache = new Dictionary<int, double>();
Index: stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Classification/ClassificationProblem.cs	(revision 12708)
@@ -27,5 +27,4 @@
   [StorableClass]
   [Item("Classification Problem", "A general classification problem.")]
-  [Creatable("Problems")]
   public class ClassificationProblem : DataAnalysisProblem<IClassificationProblemData>, IClassificationProblem, IStorableContent {
     public string Filename { get; set; }
Index: stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Clustering/ClusteringProblem.cs	(revision 12708)
@@ -27,5 +27,4 @@
   [StorableClass]
   [Item("Clustering Problem", "A general clustering problem.")]
-  [Creatable("Problems")]
   public class ClusteringProblem : DataAnalysisProblem<IClusteringProblemData>, IClusteringProblem {
     [StorableConstructor]
Index: stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleSolution.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleSolution.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionEnsembleSolution.cs	(revision 12708)
@@ -35,5 +35,5 @@
   [StorableClass]
   [Item("Regression Ensemble Solution", "A regression solution that contains an ensemble of multiple regression models")]
-  [Creatable("Data Analysis - Ensembles")]
+  [Creatable(CreatableAttribute.Categories.DataAnalysisEnsembles, Priority = 100)]
   public sealed class RegressionEnsembleSolution : RegressionSolutionBase, IRegressionEnsembleSolution {
     private readonly Dictionary<int, double> trainingEvaluationCache = new Dictionary<int, double>();
Index: stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/Regression/RegressionProblem.cs	(revision 12708)
@@ -27,5 +27,4 @@
   [StorableClass]
   [Item("Regression Problem", "A general regression problem.")]
-  [Creatable("Problems")]
   public class RegressionProblem : DataAnalysisProblem<IRegressionProblemData>, IRegressionProblem, IStorableContent {
     public string Filename { get; set; }
Index: stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/TimeSeriesPrognosis/TimeSeriesPrognosisProblem.cs	(revision 12708)
@@ -27,5 +27,4 @@
   [StorableClass]
   [Item("Time-series Prognosis Problem", "A general time-series prognosis problem.")]
-  [Creatable("Problems")]
   public class TimeSeriesPrognosisProblem : DataAnalysisProblem<ITimeSeriesPrognosisProblemData>, ITimeSeriesPrognosisProblem {
     [StorableConstructor]
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Matlab/3.3/MatlabParameterOptimizationProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Matlab/3.3/MatlabParameterOptimizationProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Matlab/3.3/MatlabParameterOptimizationProblem.cs	(revision 12708)
@@ -30,5 +30,5 @@
   [Item("MATLAB Parameter Optimization Problem", "Optimization of a parameter vector which is evaluated in MATLAB.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.ExternalEvaluationProblems, Priority = 110)]
   public class MatlabParameterOptimizationProblem : ParameterOptimizationProblem {
     private const string QualityVariableParameterName = "QualityVariableName";
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Scilab/3.3/ScilabParameterOptimizationProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Scilab/3.3/ScilabParameterOptimizationProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Scilab/3.3/ScilabParameterOptimizationProblem.cs	(revision 12708)
@@ -30,5 +30,5 @@
   [Item("Scilab Parameter Optimization Problem", "Optimization of a parameter vector which is evaluated in Scilab.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.ExternalEvaluationProblems, Priority = 120)]
   public class ScilabParameterOptimizationProblem : ParameterOptimizationProblem {
     private const string QualityVariableParameterName = "QualityVariableName";
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Problems.ExternalEvaluation {
   [Item("External Evaluation Problem", "A problem that is evaluated in a different process.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.ExternalEvaluationProblems, Priority = 100)]
   [StorableClass]
   public sealed class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding> {
@@ -130,5 +130,6 @@
       try {
         return client.Evaluate(message, GetQualityMessageExtensions());
-      } finally {
+      }
+      finally {
         lock (clientLock) {
           activeClients.Remove(client);
@@ -151,5 +152,6 @@
           try {
             MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
-          } catch (ArgumentException ex) {
+          }
+          catch (ArgumentException ex) {
             throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", name), ex);
           }
Index: stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/ArtificialAnt/GEArtificialAntProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/ArtificialAnt/GEArtificialAntProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/ArtificialAnt/GEArtificialAntProblem.cs	(revision 12708)
@@ -40,5 +40,5 @@
 namespace HeuristicLab.Problems.GrammaticalEvolution {
   [Item("Grammatical Evolution Artificial Ant Problem", "Represents the Artificial Ant problem, implemented in Grammatical Evolution.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 170)]
   [StorableClass]
   public sealed class GEArtificialAntProblem : SingleObjectiveHeuristicOptimizationProblem<GEArtificialAntEvaluator, IIntegerVectorCreator>, IStorableContent {
Index: stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/Symbolic/GESymbolicRegressionSingleObjectiveProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/Symbolic/GESymbolicRegressionSingleObjectiveProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/Symbolic/GESymbolicRegressionSingleObjectiveProblem.cs	(revision 12708)
@@ -37,5 +37,5 @@
         "Represents grammatical evolution for single objective symbolic regression problems.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
   public class GESymbolicRegressionSingleObjectiveProblem : GESymbolicDataAnalysisSingleObjectiveProblem<IRegressionProblemData, IGESymbolicRegressionSingleObjectiveEvaluator, IIntegerVectorCreator>,
                                                             IRegressionProblem {
Index: stable/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Problems.Knapsack {
   [Item("Knapsack Problem", "Represents a Knapsack problem.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 200)]
   [StorableClass]
   public sealed class KnapsackProblem : SingleObjectiveHeuristicOptimizationProblem<IKnapsackEvaluator, IBinaryVectorCreator>, IStorableContent {
Index: stable/HeuristicLab.Problems.LawnMower/3.3/Problem.cs
===================================================================
--- stable/HeuristicLab.Problems.LawnMower/3.3/Problem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.LawnMower/3.3/Problem.cs	(revision 12708)
@@ -33,5 +33,5 @@
 namespace HeuristicLab.Problems.LawnMower {
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 160)]
   [Item("Lawn Mower Problem", "The lawn mower demo problem for genetic programming.")]
   public class Problem : SingleObjectiveHeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator> {
@@ -90,5 +90,5 @@
       GrammarParameter.Value.MaximumFunctionArguments = MaxArgumentDefinitionsParameter.Value.Value;
 
-      InitializeOperators();      
+      InitializeOperators();
       RegisterEventHandlers();
     }
Index: stable/HeuristicLab.Problems.LinearAssignment/3.3/HungarianAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Problems.LinearAssignment/3.3/HungarianAlgorithm.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.LinearAssignment/3.3/HungarianAlgorithm.cs	(revision 12708)
@@ -35,5 +35,5 @@
   /// </summary>
   [Item("Hungarian Algorithm", "The Hungarian algorithm can be used to solve the linear assignment problem in O(n^3). It is also known as the Kuhn–Munkres algorithm or Munkres assignment algorithm.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 170)]
   [StorableClass]
   public sealed class HungarianAlgorithm : EngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblem.cs	(revision 12708)
@@ -34,5 +34,5 @@
 namespace HeuristicLab.Problems.LinearAssignment {
   [Item("Linear Assignment Problem", "In the linear assignment problem (LAP) an assignment of workers to jobs has to be found such that each worker is assigned to exactly one job, each job is assigned to exactly one worker and the sum of the resulting costs is minimal (or maximal).")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 130)]
   [StorableClass]
   public sealed class LinearAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<ILAPEvaluator, IPermutationCreator>, IStorableContent {
Index: stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 12708)
@@ -31,5 +31,5 @@
 namespace HeuristicLab.Problems.Programmable {
   [Item("Programmable Problem (multi-objective)", "Represents a multi-objective problem that can be programmed with a script.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 120)]
   [StorableClass]
   public sealed class MultiObjectiveProgrammableProblem : MultiObjectiveBasicProblem<IEncoding>, IProgrammableItem {
Index: stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 12708)
@@ -33,5 +33,5 @@
 namespace HeuristicLab.Problems.Programmable {
   [Item("Programmable Problem (single-objective)", "Represents a single-objective problem that can be programmed with a script.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
   public sealed class SingleObjectiveProgrammableProblem : SingleObjectiveBasicProblem<IEncoding>, IProgrammableItem {
Index: stable/HeuristicLab.Problems.QuadraticAssignment.Algorithms/3.3/RobustTabooSearch.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment.Algorithms/3.3/RobustTabooSearch.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.QuadraticAssignment.Algorithms/3.3/RobustTabooSearch.cs	(revision 12708)
@@ -35,5 +35,5 @@
 namespace HeuristicLab.Problems.QuadraticAssignment.Algorithms {
   [Item("Robust Taboo Search", "The algorithm is described in Taillard, E. 1991. Robust Taboo Search for the Quadratic Assignment Problem. Parallel Computing 17, pp. 443-455.")]
-  [Creatable("Algorithms")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 130)]
   [StorableClass]
   public sealed class RobustTabooSearch : HeuristicOptimizationEngineAlgorithm, IStorableContent {
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 12708)
@@ -36,5 +36,5 @@
 namespace HeuristicLab.Problems.QuadraticAssignment {
   [Item("Quadratic Assignment Problem", "The Quadratic Assignment Problem (QAP) can be described as the problem of assigning N facilities to N fixed locations such that there is exactly one facility in each location and that the sum of the distances multiplied by the connection strength between the facilities becomes minimal.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 140)]
   [StorableClass]
   public sealed class QuadraticAssignmentProblem : SingleObjectiveHeuristicOptimizationProblem<IQAPEvaluator, IPermutationCreator>, IStorableContent,
Index: stable/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs	(revision 12708)
@@ -38,5 +38,5 @@
 namespace HeuristicLab.Problems.Scheduling {
   [Item("Job Shop Scheduling Problem", "Represents a standard Job Shop Scheduling Problem")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 120)]
   [StorableClass]
   public sealed class JobShopSchedulingProblem : SchedulingProblem, IProblemInstanceConsumer<JSSPData>, IProblemInstanceExporter<JSSPData>, IStorableContent {
Index: stable/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 12708)
@@ -36,7 +36,7 @@
 
 namespace HeuristicLab.Problems.TestFunctions {
-  [Item("Single Objective Test Function", "Test function with real valued inputs and a single objective.")]
+  [Item("Test Function (single-objective)", "Test function with real valued inputs and a single objective.")]
   [StorableClass]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 90)]
   public sealed class SingleObjectiveTestFunctionProblem : SingleObjectiveHeuristicOptimizationProblem<ISingleObjectiveTestFunctionProblemEvaluator, IRealVectorCreator>, IStorableContent, IProblemInstanceConsumer<SOTFData> {
     public string Filename { get; set; }
Index: stable/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 12708)
@@ -38,5 +38,5 @@
 namespace HeuristicLab.Problems.TravelingSalesman {
   [Item("Traveling Salesman Problem", "Represents a symmetric Traveling Salesman Problem.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 100)]
   [StorableClass]
   public sealed class TravelingSalesmanProblem : SingleObjectiveHeuristicOptimizationProblem<ITSPEvaluator, IPermutationCreator>, IStorableContent,
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 12707)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 12708)
@@ -42,5 +42,5 @@
 namespace HeuristicLab.Problems.VehicleRouting {
   [Item("Vehicle Routing Problem", "Represents a Vehicle Routing Problem.")]
-  [Creatable("Problems")]
+  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 110)]
   [StorableClass]
   public sealed class VehicleRoutingProblem : Problem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent, IProblemInstanceConsumer<IVRPData> {
Index: stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScript.cs
===================================================================
--- stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScript.cs	(revision 12707)
+++ stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScript.cs	(revision 12708)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Scripting {
   [Item("C# Script", "An empty C# script.")]
-  [Creatable("Scripts")]
+  [Creatable(CreatableAttribute.Categories.Scripts, Priority = 100)]
   [StorableClass]
   public class CSharpScript : Script, IStorableContent {
@@ -102,7 +102,9 @@
           OnScriptExecutionStarted();
           compiledScript.Execute(VariableStore);
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
           ex = e;
-        } finally {
+        }
+        finally {
           scriptThread = null;
           OnScriptExecutionFinished(ex);
