Index: /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs
===================================================================
--- /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 12465)
+++ /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 12466)
@@ -286,5 +286,5 @@
       var parameter = (IValueParameter)generateButton.Tag;
       bool integerOnly = intParameters.ContainsKey(parameter);
-      double min = 0, max = 1, step = 1;
+      decimal min = 0, max = 1, step = 1;
       #region Try to calculate some meaningful values
       if (integerOnly) {
@@ -298,7 +298,7 @@
         int len = doubleParameters[parameter].Length;
         if (len > 0) {
-          min = doubleParameters[parameter].Min();
-          max = doubleParameters[parameter].Max();
-          step = len >= 2 ? Math.Abs((doubleParameters[parameter][len - 1] - doubleParameters[parameter][len - 2])) : 1;
+          min = (decimal)doubleParameters[parameter].Min();
+          max = (decimal)doubleParameters[parameter].Max();
+          step = len >= 2 ? Math.Abs(((decimal)doubleParameters[parameter][len - 1] - (decimal)doubleParameters[parameter][len - 2])) : 1m;
         }
       }
@@ -314,5 +314,5 @@
           } else {
             doubleParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset);
-            doubleParameters[parameter] = new DoubleArray(values.ToArray());
+            doubleParameters[parameter] = new DoubleArray(values.Select(x => (double)x).ToArray());
             doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
             stringConvertibleArrayView.Content = doubleParameters[parameter];
Index: /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/NewItemDialog.Designer.cs
===================================================================
--- /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/NewItemDialog.Designer.cs	(revision 12465)
+++ /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/NewItemDialog.Designer.cs	(revision 12466)
@@ -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: /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/NewItemDialog.cs
===================================================================
--- /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/NewItemDialog.cs	(revision 12465)
+++ /branches/EnumValue in CreateExperiment/HeuristicLab.Optimizer/3.3/NewItemDialog.cs	(revision 12466)
@@ -21,4 +21,6 @@
 
 using System;
+using System.Collections;
+using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
@@ -29,5 +31,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 +53,392 @@
 
     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;
+
+      var categories =
+        from type in ApplicationManager.Manager.GetTypes(typeof(IItem))
+        let category = CreatableAttribute.GetCategory(type)
+        let name = ItemAttribute.GetName(type)
+        let priority = CreatableAttribute.GetPriority(type)
+        let version = ItemAttribute.GetVersion(type)
+        where CreatableAttribute.IsCreatable(type)
+        orderby category, 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(HeuristicLab.Common.Resources.VSImageLibrary.Class);      // default icon
+      imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Namespace);  // plugins
+
+      var rootNode = new TreeNode();
+
+      foreach (var category in categories) {
+        var fullName = category.Key;
+        var tokens = fullName.Split('#');
+        var name = tokens.Last();
+        var parents = tokens.Take(tokens.Length - 1);
+
+        var categoryNode = new TreeNode(name, imageIndex: 1, selectedImageIndex: 1) {
+          Name = fullName,
+          Tag = fullName
+        };
+
+        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> parentCategories) {
+      TreeNode parentNode = null;
+      string fullName = null;
+      foreach (string parentCategory in parentCategories) {
+        fullName = fullName == null ? parentCategory : fullName + "#" + parentCategory;
+        parentNode = node.Nodes.Find(fullName, searchAllChildren: false).SingleOrDefault();
+        if (parentNode == null) {
+          parentNode = new TreeNode(parentCategory, imageIndex: 1, selectedImageIndex: 1) {
+            Name = fullName,
+            Tag = fullName
+          };
+          node.Nodes.Add(parentNode);
+        }
+        node = parentNode;
+      }
+      return parentNode;
+    }
+    private void CreateItemNodes(TreeNode node, IEnumerable<IGrouping<string, Type>> categories) {
+      foreach (var category in categories) {
+        var categoryNode = node.Nodes.Find(category.Key, searchAllChildren: true).Single();
+        foreach (var creatable in category) {
+          var itemNode = CreateItemNode(creatable);
+          itemNode.Name = itemNode.Name + ":" + category.Key;
+          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;
+      typesTreeView.CollapseAll();
+      UpdateDescription();
+    }
+
+    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) {
+        string category = typesTreeView.SelectedNode.Tag as string;
+        if (category != null) {
+          itemDescriptionTextBox.Text = category;
+        }
+        Type type = typesTreeView.SelectedNode.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, searchAllChildren: 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 = 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();
+    }
+
+    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 TreeNode LastVisibleNode {
+      get {
+        var node = FirstVisibleNode;
+        while (node != null && node.NextVisibleNode != null) node = node.NextVisibleNode;
+        return node;
+      }
+    }
+
+    private class ItemTreeNodeComparer : IComparer {
+      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 lhs.Name.CompareTo(rhs.Name);
+        } else if (lhs.Tag is string) {
+          return -1;
+        } else
+          return 1;
+      }
+    }
   }
 }
