Index: /trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- /trunk/sources/HeuristicLab 3.3.sln	(revision 2923)
+++ /trunk/sources/HeuristicLab 3.3.sln	(revision 2924)
@@ -59,4 +59,5 @@
 		{1849A92E-DCFC-4E05-BB0A-D7B7A3DAFCFB} = {1849A92E-DCFC-4E05-BB0A-D7B7A3DAFCFB}
 		{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1} = {0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}
+		{446C4F3D-1A12-465A-9128-97D0F47140C9} = {446C4F3D-1A12-465A-9128-97D0F47140C9}
 		{678E2145-8152-4E19-9646-07D439D00301} = {678E2145-8152-4E19-9646-07D439D00301}
 		{BB994448-2B21-4564-BB2E-38D8FFF8CF18} = {BB994448-2B21-4564-BB2E-38D8FFF8CF18}
Index: /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs	(revision 2924)
@@ -52,6 +52,6 @@
       get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
     }
-    private ConstrainedValueParameter<IManipulator> MutatorParameter {
-      get { return (ConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
+    private OptionalConstrainedValueParameter<IManipulator> MutatorParameter {
+      get { return (OptionalConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
     }
     private ValueParameter<IntData> ElitesParameter {
@@ -75,5 +75,5 @@
       Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions."));
       Parameters.Add(new ValueParameter<DoubleData>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new DoubleData(0.05)));
-      Parameters.Add(new ConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
+      Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions."));
       Parameters.Add(new ValueParameter<IntData>("Elites", "The numer of elite solutions which are kept in each generation.", new IntData(1)));
       Parameters.Add(new ValueParameter<IntData>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntData(1000)));
Index: /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGAOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGAOperator.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGAOperator.cs	(revision 2924)
@@ -97,5 +97,5 @@
       #region Create operator graph
       VariableCreator variableCreator = new VariableCreator();
-      ResultsCollector resultsCollector1 = new ResultsCollector();
+      ResultsCollector resultsCollector = new ResultsCollector();
       SubScopesSorter subScopesSorter1 = new SubScopesSorter();
       Placeholder selector = new Placeholder();
@@ -116,5 +116,4 @@
       Comparator comparator = new Comparator();
       BestAverageWorstQualityCalculator bestAverageWorstQualityCalculator = new BestAverageWorstQualityCalculator();
-      ResultsCollector resultsCollector2 = new ResultsCollector();
       DataTableValuesCollector dataTableValuesCollector = new DataTableValuesCollector();
       ConditionalBranch conditionalBranch = new ConditionalBranch();
@@ -122,12 +121,18 @@
       OperatorGraph.InitialOperator = variableCreator;
 
+      variableCreator.CollectedValues.Add(new ValueParameter<IntData>("Generations", new IntData(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleData>("Best Quality", new DoubleData(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleData>("Average Quality", new DoubleData(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<DoubleData>("Worst Quality", new DoubleData(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<DataTable>("Qualities", new DataTable("Qualities")));
-      variableCreator.Successor = resultsCollector1;
-
-      LookupParameter<DataTable> qualities = new LookupParameter<DataTable>("Qualities");
-      qualities.ActualName = "Qualities";
-      resultsCollector1.CollectedValues.Add(qualities);
-      resultsCollector1.ResultsParameter.ActualName = "Results";
-      resultsCollector1.Successor = subScopesSorter1;
+      variableCreator.Successor = resultsCollector;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntData>("Generations"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Best Quality"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Average Quality"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Worst Quality"));
+      resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Qualities"));
+      resultsCollector.ResultsParameter.ActualName = "Results";
+      resultsCollector.Successor = subScopesSorter1;
 
       subScopesSorter1.DescendingParameter.ActualName = "Maximization";
@@ -196,34 +201,16 @@
       comparator.Successor = bestAverageWorstQualityCalculator;
 
-      bestAverageWorstQualityCalculator.AverageQualityParameter.ActualName = "AverageQuality";
-      bestAverageWorstQualityCalculator.BestQualityParameter.ActualName = "BestQuality";
+      bestAverageWorstQualityCalculator.AverageQualityParameter.ActualName = "Average Quality";
+      bestAverageWorstQualityCalculator.BestQualityParameter.ActualName = "Best Quality";
       bestAverageWorstQualityCalculator.MaximizationParameter.ActualName = "Maximization";
       bestAverageWorstQualityCalculator.QualityParameter.ActualName = "Quality";
-      bestAverageWorstQualityCalculator.WorstQualityParameter.ActualName = "WorstQuality";
+      bestAverageWorstQualityCalculator.WorstQualityParameter.ActualName = "Worst Quality";
       bestAverageWorstQualityCalculator.Successor = dataTableValuesCollector;
 
-      LookupParameter<DoubleData> bestQuality = new LookupParameter<DoubleData>("BestQuality");
-      bestQuality.ActualName = "BestQuality";
-      dataTableValuesCollector.CollectedValues.Add(bestQuality);
-      LookupParameter<DoubleData> averageQuality = new LookupParameter<DoubleData>("AverageQuality");
-      averageQuality.ActualName = "AverageQuality";
-      dataTableValuesCollector.CollectedValues.Add(averageQuality);
-      LookupParameter<DoubleData> worstQuality = new LookupParameter<DoubleData>("WorstQuality");
-      worstQuality.ActualName = "WorstQuality";
-      dataTableValuesCollector.CollectedValues.Add(worstQuality);
+      dataTableValuesCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Best Quality"));
+      dataTableValuesCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Average Quality"));
+      dataTableValuesCollector.CollectedValues.Add(new LookupParameter<DoubleData>("Worst Quality"));
       dataTableValuesCollector.DataTableParameter.ActualName = "Qualities";
-      dataTableValuesCollector.Successor = resultsCollector2;
-
-      bestQuality = new LookupParameter<DoubleData>("BestQuality");
-      bestQuality.ActualName = "BestQuality";
-      resultsCollector2.CollectedValues.Add(bestQuality);
-      averageQuality = new LookupParameter<DoubleData>("AverageQuality");
-      averageQuality.ActualName = "AverageQuality";
-      resultsCollector2.CollectedValues.Add(averageQuality);
-      worstQuality = new LookupParameter<DoubleData>("WorstQuality");
-      worstQuality.ActualName = "WorstQuality";
-      resultsCollector2.CollectedValues.Add(worstQuality);
-      resultsCollector2.ResultsParameter.ActualName = "Results";
-      resultsCollector2.Successor = conditionalBranch;
+      dataTableValuesCollector.Successor = conditionalBranch;
 
       conditionalBranch.ConditionParameter.ActualName = "Terminate";
Index: /trunk/sources/HeuristicLab.Analysis/3.3/BestAverageWorstQualityCalculator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Analysis/3.3/BestAverageWorstQualityCalculator.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Analysis/3.3/BestAverageWorstQualityCalculator.cs	(revision 2924)
@@ -76,7 +76,14 @@
           max = temp;
         }
-        BestQualityParameter.ActualValue = new DoubleData(max);
-        AverageQualityParameter.ActualValue = new DoubleData(sum / qualities.Length);
-        WorstQualityParameter.ActualValue = new DoubleData(min);
+
+        DoubleData best = BestQualityParameter.ActualValue;
+        if (best == null) BestQualityParameter.ActualValue = new DoubleData(max);
+        else best.Value = max;
+        DoubleData average = AverageQualityParameter.ActualValue;
+        if (average == null) AverageQualityParameter.ActualValue = new DoubleData(sum / qualities.Length);
+        else average.Value = sum / qualities.Length;
+        DoubleData worst = WorstQualityParameter.ActualValue;
+        if (worst == null) WorstQualityParameter.ActualValue = new DoubleData(min);
+        else worst.Value = min;
       }
       return base.Apply();
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/CreateParameterDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/CreateParameterDialog.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/CreateParameterDialog.Designer.cs	(revision 2924)
@@ -162,5 +162,5 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.parameterTypeSelector.Caption = "Available &Parameters";
+      this.parameterTypeSelector.Caption = "Available Parameters";
       this.parameterTypeSelector.Location = new System.Drawing.Point(12, 12);
       this.parameterTypeSelector.Name = "parameterTypeSelector";
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 2924)
@@ -158,5 +158,5 @@
       this.detailsGroupBox.TabIndex = 0;
       this.detailsGroupBox.TabStop = false;
-      this.detailsGroupBox.Text = "&Details";
+      this.detailsGroupBox.Text = "Details";
       // 
       // viewHost
@@ -180,5 +180,5 @@
       this.itemsGroupBox.TabIndex = 0;
       this.itemsGroupBox.TabStop = false;
-      this.itemsGroupBox.Text = "&Items";
+      this.itemsGroupBox.Text = "Items";
       // 
       // ItemArrayView
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 2924)
@@ -185,5 +185,5 @@
       this.detailsGroupBox.TabIndex = 0;
       this.detailsGroupBox.TabStop = false;
-      this.detailsGroupBox.Text = "&Details";
+      this.detailsGroupBox.Text = "Details";
       // 
       // viewHost
@@ -207,5 +207,5 @@
       this.itemsGroupBox.TabIndex = 0;
       this.itemsGroupBox.TabStop = false;
-      this.itemsGroupBox.Text = "&Items";
+      this.itemsGroupBox.Text = "Items";
       // 
       // ItemCollectionView
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 2924)
@@ -122,5 +122,4 @@
       if (!listViewItem.Text.Equals(listViewItem.Tag.ToString())) {
         listViewItem.Text = listViewItem.Tag.ToString();
-        itemsListView.Sort();
       }
     }
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 2924)
@@ -183,5 +183,5 @@
       this.detailsGroupBox.TabIndex = 0;
       this.detailsGroupBox.TabStop = false;
-      this.detailsGroupBox.Text = "&Details";
+      this.detailsGroupBox.Text = "Details";
       // 
       // viewHost
@@ -205,5 +205,5 @@
       this.itemsGroupBox.TabIndex = 0;
       this.itemsGroupBox.TabStop = false;
-      this.itemsGroupBox.Text = "&Items";
+      this.itemsGroupBox.Text = "Items";
       // 
       // ItemListView
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorCollectionView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorCollectionView.cs	(revision 2924)
@@ -16,5 +16,5 @@
       InitializeComponent();
       Caption = "Operator Collection";
-      itemsGroupBox.Text = "&Operators";
+      itemsGroupBox.Text = "Operators";
     }
     /// <summary>
@@ -32,5 +32,5 @@
       if (typeSelectorDialog == null) {
         typeSelectorDialog = new TypeSelectorDialog();
-        typeSelectorDialog.TypeSelector.Caption = "&Available Operators";
+        typeSelectorDialog.TypeSelector.Caption = "Available Operators";
         typeSelectorDialog.TypeSelector.Configure(typeof(IOperator), false, false);
       }
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorGraphView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorGraphView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorGraphView.Designer.cs	(revision 2924)
@@ -118,5 +118,5 @@
       this.graphGroupBox.TabIndex = 0;
       this.graphGroupBox.TabStop = false;
-      this.graphGroupBox.Text = "Operator &Graph";
+      this.graphGroupBox.Text = "Operator Graph";
       // 
       // viewHost
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorListView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorListView.cs	(revision 2924)
@@ -16,5 +16,5 @@
       InitializeComponent();
       Caption = "Operator List";
-      itemsGroupBox.Text = "&Operators";
+      itemsGroupBox.Text = "Operators";
     }
     /// <summary>
@@ -32,5 +32,5 @@
       if (typeSelectorDialog == null) {
         typeSelectorDialog = new TypeSelectorDialog();
-        typeSelectorDialog.TypeSelector.Caption = "&Available Operators";
+        typeSelectorDialog.TypeSelector.Caption = "Available Operators";
         typeSelectorDialog.TypeSelector.Configure(typeof(IOperator), false, false);
       }
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorSetView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorSetView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorSetView.cs	(revision 2924)
@@ -16,5 +16,5 @@
       InitializeComponent();
       Caption = "Operator Set";
-      itemsGroupBox.Text = "&Operators";
+      itemsGroupBox.Text = "Operators";
     }
     /// <summary>
@@ -32,5 +32,5 @@
       if (typeSelectorDialog == null) {
         typeSelectorDialog = new TypeSelectorDialog();
-        typeSelectorDialog.TypeSelector.Caption = "&Available Operators";
+        typeSelectorDialog.TypeSelector.Caption = "Available Operators";
         typeSelectorDialog.TypeSelector.Configure(typeof(IOperator), false, false);
       }
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorsSidebar.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorsSidebar.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/OperatorsSidebar.Designer.cs	(revision 2924)
@@ -50,5 +50,5 @@
       // typeSelector
       // 
-      this.typeSelector.Caption = "&Available Operators";
+      this.typeSelector.Caption = "Available Operators";
       this.typeSelector.Dock = System.Windows.Forms.DockStyle.Fill;
       this.typeSelector.Location = new System.Drawing.Point(0, 0);
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ParameterCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ParameterCollectionView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ParameterCollectionView.cs	(revision 2924)
@@ -37,5 +37,5 @@
       InitializeComponent();
       Caption = "ParameterCollection";
-      itemsGroupBox.Text = "&Parameters";
+      itemsGroupBox.Text = "Parameters";
     }
     /// <summary>
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ScopeListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ScopeListView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ScopeListView.cs	(revision 2924)
@@ -13,5 +13,5 @@
       InitializeComponent();
       Caption = "ScopeList";
-      itemsGroupBox.Text = "&Scopes";
+      itemsGroupBox.Text = "Scopes";
     }
     /// <summary>
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.Designer.cs	(revision 2924)
@@ -104,5 +104,5 @@
       this.scopesGroupBox.TabIndex = 0;
       this.scopesGroupBox.TabStop = false;
-      this.scopesGroupBox.Text = "&Scopes";
+      this.scopesGroupBox.Text = "Scopes";
       // 
       // variableCollectionView
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 2924)
@@ -89,5 +89,5 @@
       this.typesGroupBox.TabIndex = 0;
       this.typesGroupBox.TabStop = false;
-      this.typesGroupBox.Text = "&Available Types";
+      this.typesGroupBox.Text = "Available Types";
       // 
       // splitContainer
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.Designer.cs	(revision 2924)
@@ -75,5 +75,5 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.typeSelector.Caption = "&Available Types";
+      this.typeSelector.Caption = "Available Types";
       this.typeSelector.Location = new System.Drawing.Point(12, 12);
       this.typeSelector.Name = "typeSelector";
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.cs	(revision 2924)
@@ -51,4 +51,5 @@
     public TypeSelectorDialog() {
       InitializeComponent();
+      okButton.Enabled = typeSelector.SelectedType != null;
     }
 
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.cs	(revision 2924)
@@ -37,5 +37,5 @@
       InitializeComponent();
       Caption = "ValueParameterCollection";
-      itemsGroupBox.Text = "&Parameters";
+      itemsGroupBox.Text = "Parameters";
     }
     /// <summary>
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs	(revision 2924)
@@ -13,5 +13,5 @@
       InitializeComponent();
       Caption = "VariableCollection";
-      itemsGroupBox.Text = "&Variables";
+      itemsGroupBox.Text = "Variables";
     }
     /// <summary>
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/VariableView.Designer.cs	(revision 2924)
@@ -100,5 +100,5 @@
       this.valueGroupBox.TabIndex = 7;
       this.valueGroupBox.TabStop = false;
-      this.valueGroupBox.Text = "&Value:";
+      this.valueGroupBox.Text = "Value";
       // 
       // valuePanel
Index: /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 2924)
@@ -96,5 +96,5 @@
     protected EngineAlgorithm()
       : base() {
-      globalScope = new Scope();
+      globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
@@ -103,5 +103,5 @@
     protected EngineAlgorithm(string name)
       : base(name) {
-      globalScope = new Scope();
+      globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
@@ -110,5 +110,5 @@
     protected EngineAlgorithm(string name, ParameterCollection parameters)
       : base(name, parameters) {
-      globalScope = new Scope();
+      globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
@@ -117,5 +117,5 @@
     protected EngineAlgorithm(string name, string description)
       : base(name, description) {
-      globalScope = new Scope();
+      globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
@@ -124,5 +124,5 @@
     protected EngineAlgorithm(string name, string description, ParameterCollection parameters)
       : base(name, description, parameters) {
-      globalScope = new Scope();
+      globalScope = new Scope("Global Scope");
       globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.Designer.cs	(revision 2924)
@@ -85,5 +85,5 @@
       this.valueGroupBox.TabIndex = 6;
       this.valueGroupBox.TabStop = false;
-      this.valueGroupBox.Text = "&Value:";
+      this.valueGroupBox.Text = "Value";
       // 
       // viewHost
@@ -135,7 +135,7 @@
     #endregion
 
-    private System.Windows.Forms.GroupBox valueGroupBox;
-    private HeuristicLab.Core.Views.ViewHost viewHost;
-    private System.Windows.Forms.ComboBox valueComboBox;
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected HeuristicLab.Core.Views.ViewHost viewHost;
+    protected System.Windows.Forms.ComboBox valueComboBox;
   }
 }
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs	(revision 2924)
@@ -21,5 +21,5 @@
 
 using System;
-using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Collections;
 using HeuristicLab.Core;
@@ -33,7 +33,5 @@
   [View("ConstrainedValueParameter View")]
   [Content(typeof(ConstrainedValueParameter<>), true)]
-  public sealed partial class ConstrainedValueParameterView<T> : ParameterView where T : class, IItem {
-    private List<T> valueComboBoxItems;
-
+  public partial class ConstrainedValueParameterView<T> : ParameterView where T : class, IItem {
     /// <summary>
     /// Gets or sets the variable to represent visually.
@@ -52,5 +50,4 @@
       InitializeComponent();
       Caption = "ConstrainedValueParameter";
-      valueComboBoxItems = new List<T>();
     }
     /// <summary>
@@ -104,14 +101,12 @@
 
     private void FillValueComboBox() {
-      valueComboBoxItems.Clear();
-      valueComboBoxItems.Add(null);
+      valueComboBox.SelectedIndexChanged -= new EventHandler(valueComboBox_SelectedIndexChanged);
+      valueComboBox.DataSource = null;
       if (Content != null) {
-        foreach (T item in Content.ValidValues)
-          valueComboBoxItems.Add(item);
+        valueComboBox.DataSource = Content.ValidValues.ToList();
+        valueComboBox.Enabled = valueComboBox.Items.Count > 0;
+        valueComboBox.SelectedItem = Content.Value;
       }
-      valueComboBox.Items.Clear();
-      foreach (T item in valueComboBoxItems)
-        valueComboBox.Items.Add(item == null ? "-" : item.ToString());
-      if (Content != null) valueComboBox.SelectedIndex = valueComboBoxItems.IndexOf(Content.Value);
+      valueComboBox.SelectedIndexChanged += new EventHandler(valueComboBox_SelectedIndexChanged);
     }
 
@@ -121,5 +116,5 @@
         Invoke(new EventHandler(Content_ValueChanged), sender, e);
       else {
-        valueComboBox.SelectedIndex = valueComboBoxItems.IndexOf(Content.Value);
+        valueComboBox.SelectedItem = Content.Value;
         viewHost.Content = Content.Value;
       }
@@ -128,21 +123,12 @@
       if (InvokeRequired)
         Invoke(new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsAdded), sender, e);
-      else {
-        foreach (T item in e.Items) {
-          valueComboBoxItems.Add(item);
-          valueComboBox.Items.Add(item == null ? "-" : item.ToString());
-        }
-      }
+      else
+        FillValueComboBox();
     }
     private void ValidValues_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
       if (InvokeRequired)
         Invoke(new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved), sender, e);
-      else {
-        foreach (T item in e.Items) {
-          int index = valueComboBoxItems.IndexOf(item);
-          valueComboBoxItems.RemoveAt(index);
-          valueComboBox.Items.RemoveAt(index);
-        }
-      }
+      else
+        FillValueComboBox();
     }
     private void ValidValues_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
@@ -155,5 +141,5 @@
 
     private void valueComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      Content.Value = valueComboBoxItems[valueComboBox.SelectedIndex];
+      Content.Value = (T)valueComboBox.SelectedItem;
     }
   }
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/HeuristicLab.Parameters.Views-3.3.csproj	(revision 2924)
@@ -91,4 +91,10 @@
     <Compile Include="ConstrainedValueParameterView.Designer.cs">
       <DependentUpon>ConstrainedValueParameterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OptionalConstrainedValueParameterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OptionalConstrainedValueParameterView.Designer.cs">
+      <DependentUpon>OptionalConstrainedValueParameterView.cs</DependentUpon>
     </Compile>
     <Compile Include="OptionalValueParameterView.cs">
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalConstrainedValueParameterView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalConstrainedValueParameterView.Designer.cs	(revision 2924)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalConstrainedValueParameterView.Designer.cs	(revision 2924)
@@ -0,0 +1,141 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Parameters.Views {
+  partial class OptionalConstrainedValueParameterView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.Core.Views.ViewHost();
+      this.valueComboBox = new System.Windows.Forms.ComboBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.valueGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 55);
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Location = new System.Drawing.Point(80, 52);
+      this.dataTypeTextBox.Size = new System.Drawing.Size(306, 20);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(80, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(306, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Location = new System.Drawing.Point(80, 26);
+      this.descriptionTextBox.Size = new System.Drawing.Size(306, 20);
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.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.valueGroupBox.Controls.Add(this.viewHost);
+      this.valueGroupBox.Controls.Add(this.valueComboBox);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 78);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(386, 237);
+      this.valueGroupBox.TabIndex = 6;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // viewHost
+      // 
+      this.viewHost.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.viewHost.Content = null;
+      this.viewHost.Location = new System.Drawing.Point(6, 46);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.Size = new System.Drawing.Size(374, 185);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // valueComboBox
+      // 
+      this.valueComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.valueComboBox.FormattingEnabled = true;
+      this.valueComboBox.Location = new System.Drawing.Point(6, 19);
+      this.valueComboBox.Name = "valueComboBox";
+      this.valueComboBox.Size = new System.Drawing.Size(374, 21);
+      this.valueComboBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.valueComboBox, "Selected Value");
+      this.valueComboBox.SelectedIndexChanged += new System.EventHandler(this.valueComboBox_SelectedIndexChanged);
+      // 
+      // ConstrainedValueParameterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "ConstrainedValueParameterView";
+      this.Size = new System.Drawing.Size(386, 315);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.valueGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected HeuristicLab.Core.Views.ViewHost viewHost;
+    protected System.Windows.Forms.ComboBox valueComboBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalConstrainedValueParameterView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalConstrainedValueParameterView.cs	(revision 2924)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalConstrainedValueParameterView.cs	(revision 2924)
@@ -0,0 +1,154 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Parameters.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="Parameter"/>.
+  /// </summary>
+  [View("OptionalConstrainedValueParameter View")]
+  [Content(typeof(OptionalConstrainedValueParameter<>), true)]
+  public partial class OptionalConstrainedValueParameterView<T> : ParameterView where T : class, IItem {
+    private List<T> valueComboBoxItems;
+
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new OptionalConstrainedValueParameter<T> Content {
+      get { return (OptionalConstrainedValueParameter<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with caption "Variable".
+    /// </summary>
+    public OptionalConstrainedValueParameterView() {
+      InitializeComponent();
+      Caption = "OptionalConstrainedValueParameter";
+      valueComboBoxItems = new List<T>();
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with the given <paramref name="variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariableView()"/>.</remarks>
+    /// <param name="variable">The variable to represent visually.</param>
+    public OptionalConstrainedValueParameterView(OptionalConstrainedValueParameter<T> content)
+      : this() {
+      Content = content;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IVariable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.ValidValues.ItemsAdded -= new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsAdded);
+      Content.ValidValues.ItemsRemoved -= new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
+      Content.ValidValues.CollectionReset -= new CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset);
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IVariable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValidValues.ItemsAdded += new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsAdded);
+      Content.ValidValues.ItemsRemoved += new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
+      Content.ValidValues.CollectionReset += new CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset);
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        Caption = "OptionalConstrainedValueParameter";
+        viewHost.Content = null;
+        valueGroupBox.Enabled = false;
+        FillValueComboBox();
+      } else {
+        Caption = Content.Name + " (" + Content.GetType().Name + ")";
+        valueGroupBox.Enabled = true;
+        FillValueComboBox();
+        viewHost.Content = Content.Value;
+      }
+    }
+
+    private void FillValueComboBox() {
+      valueComboBox.SelectedIndexChanged -= new EventHandler(valueComboBox_SelectedIndexChanged);
+      valueComboBoxItems.Clear();
+      valueComboBoxItems.Add(null);
+      valueComboBox.Items.Clear();
+      valueComboBox.Items.Add("-");
+      if (Content != null) {
+        foreach (T item in Content.ValidValues) {
+          valueComboBoxItems.Add(item);
+          valueComboBox.Items.Add(item.ToString());
+        }
+        valueComboBox.SelectedIndex = valueComboBoxItems.IndexOf(Content.Value);
+      }
+      valueComboBox.SelectedIndexChanged += new EventHandler(valueComboBox_SelectedIndexChanged);
+    }
+
+    #region Content Events
+    private void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        valueComboBox.SelectedIndex = valueComboBoxItems.IndexOf(Content.Value);
+        viewHost.Content = Content.Value;
+      }
+    }
+    private void ValidValues_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsAdded), sender, e);
+      else
+        FillValueComboBox();
+    }
+    private void ValidValues_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved), sender, e);
+      else
+        FillValueComboBox();
+    }
+    private void ValidValues_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset), sender, e);
+      else
+        FillValueComboBox();
+    }
+    #endregion
+
+    private void valueComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.Value = valueComboBoxItems[valueComboBox.SelectedIndex];
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalValueParameterView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalValueParameterView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/OptionalValueParameterView.Designer.cs	(revision 2924)
@@ -90,5 +90,5 @@
       this.valueGroupBox.TabIndex = 6;
       this.valueGroupBox.TabStop = false;
-      this.valueGroupBox.Text = "&Value:";
+      this.valueGroupBox.Text = "Value";
       // 
       // valuePanel
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.Designer.cs	(revision 2924)
@@ -100,5 +100,5 @@
       this.valueGroupBox.TabIndex = 8;
       this.valueGroupBox.TabStop = false;
-      this.valueGroupBox.Text = "&Value:";
+      this.valueGroupBox.Text = "Value";
       // 
       // valuePanel
Index: /trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueParameterView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueParameterView.Designer.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters.Views/3.3/ValueParameterView.Designer.cs	(revision 2924)
@@ -85,5 +85,5 @@
       this.valueGroupBox.TabIndex = 6;
       this.valueGroupBox.TabStop = false;
-      this.valueGroupBox.Text = "&Value:";
+      this.valueGroupBox.Text = "Value";
       // 
       // valuePanel
Index: /trunk/sources/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 2924)
@@ -21,5 +21,6 @@
 
 using System;
-using HeuristicLab.Common;
+using System.Linq;
+using HeuristicLab.Collections;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -27,123 +28,33 @@
 namespace HeuristicLab.Parameters {
   /// <summary>
-  /// A parameter whose value has to be chosen from a set of valid values which is defined it the parameter itself.
+  /// A parameter whose value has to be chosen from a set of valid values.
   /// </summary>
-  [Item("ConstrainedValueParameter<T>", "A parameter whose value has to be chosen from a set of valid values which is defined it the parameter itself.")]
-  public sealed class ConstrainedValueParameter<T> : Parameter, IValueParameter<T> where T : class, IItem {
-    private ItemSet<T> validValues;
-    [Storable]
-    public ItemSet<T> ValidValues {
-      get { return validValues; }
-      private set {
-        DeregisterValidValuesEvents();
-        validValues = value;
-        RegisterValidValuesEvents();
+  [Item("ConstrainedValueParameter<T>", "A parameter whose value has to be chosen from a set of valid values.")]
+  [EmptyStorableClass]
+  public class ConstrainedValueParameter<T> : OptionalConstrainedValueParameter<T> where T : class, IItem {
+    public override T Value {
+      get { return base.Value; }
+      set {
+        if ((value == null) && (ValidValues.Count > 0)) throw new ArgumentNullException();
+        base.Value = value;
       }
     }
 
-    private T value;
-    [Storable]
-    public T Value {
-      get { return this.value; }
-      set {
-        if (value != this.value) {
-          if ((value != null) && !validValues.Contains(value)) throw new ArgumentException("Invalid value.");
-          this.value = value;
-          OnValueChanged();
-        }
-      }
+    public ConstrainedValueParameter() : base() { }
+    public ConstrainedValueParameter(string name) : base(name) { }
+    public ConstrainedValueParameter(string name, ItemSet<T> validValues) : base(name, validValues) { }
+    public ConstrainedValueParameter(string name, ItemSet<T> validValues, T value) : base(name, validValues, value) { }
+    public ConstrainedValueParameter(string name, string description) : base(name, description) { }
+    public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues) : base(name, description, validValues) { }
+    public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value) : base(name, description, validValues, value) { }
+
+    protected override void validValues_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (Value == null) Value = ValidValues.First();
     }
-    IItem IValueParameter.Value {
-      get { return Value; }
-      set {
-        T val = value as T;
-        if ((value != null) && (val == null))
-          throw new InvalidOperationException(
-            string.Format("Type mismatch. Value is not a \"{0}\".",
-                          typeof(T).GetPrettyName())
-          );
-        Value = val;
-      }
+    protected override void ValidValues_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if ((Value != null) && !ValidValues.Contains(Value)) Value = ValidValues.FirstOrDefault();
     }
-
-    public ConstrainedValueParameter()
-      : base("Anonymous", typeof(T)) {
-      ValidValues = new ItemSet<T>();
-    }
-    public ConstrainedValueParameter(string name)
-      : base(name, typeof(T)) {
-      ValidValues = new ItemSet<T>();
-    }
-    public ConstrainedValueParameter(string name, ItemSet<T> validValues)
-      : base(name, typeof(T)) {
-      ValidValues = validValues;
-    }
-    public ConstrainedValueParameter(string name, ItemSet<T> validValues, T value)
-      : base(name, typeof(T)) {
-      ValidValues = validValues;
-      Value = value;
-    }
-    public ConstrainedValueParameter(string name, string description)
-      : base(name, description, typeof(T)) {
-      ValidValues = new ItemSet<T>();
-    }
-    public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues)
-      : base(name, description, typeof(T)) {
-      ValidValues = validValues;
-    }
-    public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value)
-      : base(name, description, typeof(T)) {
-      ValidValues = validValues;
-      Value = value;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ConstrainedValueParameter<T> clone = (ConstrainedValueParameter<T>)base.Clone(cloner);
-      clone.ValidValues = (ItemSet<T>)cloner.Clone(validValues);
-      clone.Value = (T)cloner.Clone(value);
-      return clone;
-    }
-
-    public override string ToString() {
-      return string.Format("{0}: {1} ({2})", Name, Value != null ? Value.ToString() : "null", DataType.GetPrettyName());
-    }
-
-    protected override IItem GetActualValue() {
-      return Value;
-    }
-    protected override void SetActualValue(IItem value) {
-      ((IValueParameter)this).Value = value;
-    }
-
-    public event EventHandler ValueChanged;
-    private void OnValueChanged() {
-      if (ValueChanged != null)
-        ValueChanged(this, EventArgs.Empty);
-      OnChanged();
-    }
-
-    private void RegisterValidValuesEvents() {
-      if (validValues != null) {
-        validValues.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
-        validValues.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset);
-        validValues.Changed += new ChangedEventHandler(ValidValues_Changed);
-      }
-    }
-    private void DeregisterValidValuesEvents() {
-      if (validValues != null) {
-        validValues.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
-        validValues.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset);
-        validValues.Changed -= new ChangedEventHandler(ValidValues_Changed);
-      }
-    }
-
-    private void ValidValues_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<T> e) {
-      if ((Value != null) && !validValues.Contains(Value)) Value = null;
-    }
-    private void ValidValues_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<T> e) {
-      if ((Value != null) && !validValues.Contains(Value)) Value = null;
-    }
-    private void ValidValues_Changed(object sender, ChangedEventArgs e) {
-      OnChanged(e);
+    protected override void ValidValues_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if ((Value != null) && !ValidValues.Contains(Value)) Value = ValidValues.FirstOrDefault();
     }
   }
Index: /trunk/sources/HeuristicLab.Parameters/3.3/HeuristicLab.Parameters-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Parameters/3.3/HeuristicLab.Parameters-3.3.csproj	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters/3.3/HeuristicLab.Parameters-3.3.csproj	(revision 2924)
@@ -85,4 +85,5 @@
     <None Include="HeuristicLabParametersPlugin.cs.frame" />
     <Compile Include="ConstrainedValueParameter.cs" />
+    <Compile Include="OptionalConstrainedValueParameter.cs" />
     <Compile Include="ValueParameter.cs" />
     <Compile Include="LookupParameter.cs" />
Index: /trunk/sources/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 2924)
+++ /trunk/sources/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 2924)
@@ -0,0 +1,155 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Parameters {
+  /// <summary>
+  /// A parameter whose value has to be chosen from a set of valid values or is null.
+  /// </summary>
+  [Item("OptionalConstrainedValueParameter<T>", "A parameter whose value has to be chosen from a set of valid values or is null.")]
+  public class OptionalConstrainedValueParameter<T> : Parameter, IValueParameter<T> where T : class, IItem {
+    private ItemSet<T> validValues;
+    [Storable]
+    public ItemSet<T> ValidValues {
+      get { return validValues; }
+      private set {
+        DeregisterValidValuesEvents();
+        validValues = value;
+        RegisterValidValuesEvents();
+      }
+    }
+
+    private T value;
+    [Storable]
+    public virtual T Value {
+      get { return this.value; }
+      set {
+        if (value != this.value) {
+          if ((value != null) && !validValues.Contains(value)) throw new ArgumentException("Invalid value.");
+          this.value = value;
+          OnValueChanged();
+        }
+      }
+    }
+    IItem IValueParameter.Value {
+      get { return Value; }
+      set {
+        T val = value as T;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. Value is not a \"{0}\".",
+                          typeof(T).GetPrettyName())
+          );
+        Value = val;
+      }
+    }
+
+    public OptionalConstrainedValueParameter()
+      : base("Anonymous", typeof(T)) {
+      ValidValues = new ItemSet<T>();
+    }
+    public OptionalConstrainedValueParameter(string name)
+      : base(name, typeof(T)) {
+      ValidValues = new ItemSet<T>();
+    }
+    public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues)
+      : base(name, typeof(T)) {
+      ValidValues = validValues;
+    }
+    public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues, T value)
+      : base(name, typeof(T)) {
+      ValidValues = validValues;
+      Value = value;
+    }
+    public OptionalConstrainedValueParameter(string name, string description)
+      : base(name, description, typeof(T)) {
+      ValidValues = new ItemSet<T>();
+    }
+    public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues)
+      : base(name, description, typeof(T)) {
+      ValidValues = validValues;
+    }
+    public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value)
+      : base(name, description, typeof(T)) {
+      ValidValues = validValues;
+      Value = value;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      OptionalConstrainedValueParameter<T> clone = (OptionalConstrainedValueParameter<T>)base.Clone(cloner);
+      clone.ValidValues = (ItemSet<T>)cloner.Clone(validValues);
+      clone.Value = (T)cloner.Clone(value);
+      return clone;
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: {1} ({2})", Name, Value != null ? Value.ToString() : "null", DataType.GetPrettyName());
+    }
+
+    protected override IItem GetActualValue() {
+      return Value;
+    }
+    protected override void SetActualValue(IItem value) {
+      ((IValueParameter)this).Value = value;
+    }
+
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      if (ValueChanged != null)
+        ValueChanged(this, EventArgs.Empty);
+      OnChanged();
+    }
+
+    private void RegisterValidValuesEvents() {
+      if (validValues != null) {
+        validValues.ItemsAdded += new CollectionItemsChangedEventHandler<T>(validValues_ItemsAdded);
+        validValues.ItemsRemoved += new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
+        validValues.CollectionReset += new CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset);
+        validValues.Changed += new ChangedEventHandler(ValidValues_Changed);
+      }
+    }
+
+    private void DeregisterValidValuesEvents() {
+      if (validValues != null) {
+        validValues.ItemsAdded -= new CollectionItemsChangedEventHandler<T>(validValues_ItemsAdded);
+        validValues.ItemsRemoved -= new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
+        validValues.CollectionReset -= new CollectionItemsChangedEventHandler<T>(ValidValues_CollectionReset);
+        validValues.Changed -= new ChangedEventHandler(ValidValues_Changed);
+      }
+    }
+
+    protected virtual void validValues_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) { }
+    protected virtual void ValidValues_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if ((Value != null) && !validValues.Contains(Value)) Value = null;
+    }
+    protected virtual void ValidValues_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if ((Value != null) && !validValues.Contains(Value)) Value = null;
+    }
+    protected virtual void ValidValues_Changed(object sender, ChangedEventArgs e) {
+      OnChanged(e);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 2924)
@@ -33,5 +33,5 @@
     private T value;
     [Storable]
-    public T Value {
+    public virtual T Value {
       get { return this.value; }
       set {
Index: /trunk/sources/HeuristicLab.Parameters/3.3/ValueParameter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Parameters/3.3/ValueParameter.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Parameters/3.3/ValueParameter.cs	(revision 2924)
@@ -30,71 +30,23 @@
   /// </summary>
   [Item("ValueParameter<T>", "A parameter whose value is defined it the parameter itself.")]
-  public sealed class ValueParameter<T> : Parameter, IValueParameter<T> where T : class, IItem {
-    private T value;
-    [Storable]
-    public T Value {
-      get { return this.value; }
+  [EmptyStorableClass]
+  public class ValueParameter<T> : OptionalValueParameter<T> where T : class, IItem {
+    public override T Value {
+      get { return base.Value; }
       set {
         if (value == null) throw new ArgumentNullException();
-        if (value != this.value) {
-          if (this.value != null) this.value.Changed -= new ChangedEventHandler(Value_Changed);
-          this.value = value;
-          this.value.Changed += new ChangedEventHandler(Value_Changed);
-          OnValueChanged();
-        }
-      }
-    }
-    IItem IValueParameter.Value {
-      get { return Value; }
-      set {
-        if (value == null) throw new ArgumentNullException();
-        T val = value as T;
-        if (val == null)
-          throw new InvalidOperationException(
-            string.Format("Type mismatch. Value is not a \"{0}\".",
-                          typeof(T).GetPrettyName())
-          );
-        Value = val;
+        base.Value = value;
       }
     }
 
-    private ValueParameter()
-      : base("Anonymous", typeof(T)) {
-    }
-    public ValueParameter(string name, T value)
-      : base(name, typeof(T)) {
-      Value = value;
-    }
-    public ValueParameter(string name, string description, T value)
-      : base(name, description, typeof(T)) {
-      Value = value;
-    }
+    private ValueParameter() : base() { }
+    public ValueParameter(string name, T value) : base(name, value) { }
+    public ValueParameter(string name, string description, T value) : base(name, description, value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ValueParameter<T> clone = new ValueParameter<T>(name, description, value);
+      ValueParameter<T> clone = new ValueParameter<T>(name, description, Value);
       cloner.RegisterClonedObject(this, clone);
-      clone.Value = (T)cloner.Clone(value);
+      clone.Value = (T)cloner.Clone(Value);
       return clone;
-    }
-
-    public override string ToString() {
-      return string.Format("{0}: {1} ({2})", Name, Value.ToString(), DataType.GetPrettyName());
-    }
-
-    protected override IItem GetActualValue() {
-      return Value;
-    }
-    protected override void SetActualValue(IItem value) {
-      ((IValueParameter)this).Value = value;
-    }
-
-    public event EventHandler ValueChanged;
-    private void OnValueChanged() {
-      if (ValueChanged != null)
-        ValueChanged(this, EventArgs.Empty);
-      OnChanged();
-    }
-    private void Value_Changed(object sender, ChangedEventArgs e) {
-      OnChanged(e);
     }
   }
Index: /trunk/sources/HeuristicLab.Random/3.3/RandomCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/RandomCreator.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.Random/3.3/RandomCreator.cs	(revision 2924)
@@ -28,7 +28,7 @@
 namespace HeuristicLab.Operators {
   /// <summary>
-  /// An operator which creates a new pseudo random number generator.
+  /// An operator which creates a new Mersenne Twister pseudo random number generator.
   /// </summary>
-  [Item("RandomCreator", "An operator which creates a new pseudo random number generator.")]
+  [Item("RandomCreator", "An operator which creates a new Mersenne Twister pseudo random number generator.")]
   [EmptyStorableClass]
   [Creatable("Test")]
Index: /trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 2923)
+++ /trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 2924)
@@ -30,5 +30,4 @@
   /// </summary>
   [EmptyStorableClass]
-  [Creatable("Engines")]
   [Item("Sequential Engine", "Engine for sequential execution of algorithms.")]
   public class SequentialEngine : Engine {
