Index: trunk/sources/HeuristicLab.Evolutionary/3.3/PopulationCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Evolutionary/3.3/PopulationCreator.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Evolutionary/3.3/PopulationCreator.cs	(revision 2882)
@@ -41,6 +41,6 @@
       get { return (ValueLookupParameter<IOperator>)Parameters["SolutionCreator"]; }
     }
-    public ValueLookupParameter<IOperator> SolutionEvaluatorParameter {
-      get { return (ValueLookupParameter<IOperator>)Parameters["SolutionEvaluator"]; }
+    public ValueLookupParameter<IOperator> EvaluatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Evaluator"]; }
     }
     private ScopeParameter CurrentScopeParameter {
@@ -55,5 +55,5 @@
       Parameters.Add(new ValueLookupParameter<IntData>("PopulationSize", "The number of individuals that should be created."));
       Parameters.Add(new ValueLookupParameter<IOperator>("SolutionCreator", "The operator which is used to create new solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("SolutionEvaluator", "The operator which is used to evaluate new solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator which is used to evaluate new solutions."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope which represents the population."));
     }
@@ -62,5 +62,5 @@
       int size = PopulationSizeParameter.ActualValue.Value;
       IOperator creator = SolutionCreatorParameter.ActualValue;
-      IOperator evaluator = SolutionEvaluatorParameter.ActualValue;
+      IOperator evaluator = EvaluatorParameter.ActualValue;
 
       if (CurrentScope.SubScopes.Count > 0) throw new InvalidOperationException("Population is not empty. PopulationCreator cannot be applied on scopes which already contain sub-scopes.");
Index: trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2881)
+++ trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2882)
@@ -91,4 +91,5 @@
     <Compile Include="Assigner.cs" />
     <Compile Include="AlgorithmOperator.cs" />
+    <Compile Include="ResultsCollector.cs" />
     <Compile Include="MultipleCallsOperator.cs" />
     <Compile Include="Operator.cs" />
Index: trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs	(revision 2882)
+++ trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs	(revision 2882)
@@ -0,0 +1,56 @@
+#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 HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// An operator which collects the actual values of parameters and clones them into a collection of variables.
+  /// </summary>
+  [Item("ResultsCollector", "An operator which collects the actual values of parameters and clones them into a collection of variables.")]
+  [Creatable("Test")]
+  [EmptyStorableClass]
+  public class ResultsCollector : ValuesCollector {
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+
+    public ResultsCollector()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where the collected values should be stored."));
+    }
+
+    public override IOperation Apply() {
+      VariableCollection results = ResultsParameter.ActualValue;
+      IVariable var;
+      foreach (IParameter param in CollectedValues) {
+        results.TryGetValue(param.Name, out var);
+        if (var != null)
+          var.Value = (IItem)param.ActualValue.Clone();
+        else
+          results.Add(new Variable(param.Name, (IItem)param.ActualValue.Clone()));
+      }
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 2882)
@@ -55,4 +55,6 @@
       this.newProblemButton = new System.Windows.Forms.Button();
       this.problemViewHost = new HeuristicLab.Core.Views.ViewHost();
+      this.resultsTabPage = new System.Windows.Forms.TabPage();
+      this.resultsView = new HeuristicLab.Core.Views.VariableCollectionView();
       this.startButton = new System.Windows.Forms.Button();
       this.stopButton = new System.Windows.Forms.Button();
@@ -67,4 +69,5 @@
       this.parametersTabPage.SuspendLayout();
       this.problemTabPage.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -73,5 +76,5 @@
       this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(418, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(607, 20);
       // 
       // descriptionTextBox
@@ -79,5 +82,5 @@
       this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.descriptionTextBox.Size = new System.Drawing.Size(418, 87);
+      this.descriptionTextBox.Size = new System.Drawing.Size(607, 87);
       // 
       // tabControl
@@ -88,8 +91,9 @@
       this.tabControl.Controls.Add(this.parametersTabPage);
       this.tabControl.Controls.Add(this.problemTabPage);
+      this.tabControl.Controls.Add(this.resultsTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 119);
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(490, 204);
+      this.tabControl.Size = new System.Drawing.Size(679, 333);
       this.tabControl.TabIndex = 4;
       // 
@@ -126,5 +130,5 @@
       this.problemTabPage.Name = "problemTabPage";
       this.problemTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.problemTabPage.Size = new System.Drawing.Size(482, 178);
+      this.problemTabPage.Size = new System.Drawing.Size(671, 307);
       this.problemTabPage.TabIndex = 1;
       this.problemTabPage.Text = "Problem";
@@ -138,4 +142,5 @@
       this.saveProblemButton.Size = new System.Drawing.Size(24, 24);
       this.saveProblemButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.saveProblemButton, "Save Problem");
       this.saveProblemButton.UseVisualStyleBackColor = true;
       this.saveProblemButton.Click += new System.EventHandler(this.saveProblemButton_Click);
@@ -148,4 +153,5 @@
       this.openProblemButton.Size = new System.Drawing.Size(24, 24);
       this.openProblemButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.openProblemButton, "Open Problem");
       this.openProblemButton.UseVisualStyleBackColor = true;
       this.openProblemButton.Click += new System.EventHandler(this.openProblemButton_Click);
@@ -158,4 +164,5 @@
       this.newProblemButton.Size = new System.Drawing.Size(24, 24);
       this.newProblemButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.newProblemButton, "New Problem");
       this.newProblemButton.UseVisualStyleBackColor = true;
       this.newProblemButton.Click += new System.EventHandler(this.newProblemButton_Click);
@@ -169,16 +176,40 @@
       this.problemViewHost.Location = new System.Drawing.Point(6, 36);
       this.problemViewHost.Name = "problemViewHost";
-      this.problemViewHost.Size = new System.Drawing.Size(470, 136);
+      this.problemViewHost.Size = new System.Drawing.Size(659, 265);
       this.problemViewHost.TabIndex = 3;
       this.problemViewHost.ViewType = null;
       // 
+      // resultsTabPage
+      // 
+      this.resultsTabPage.Controls.Add(this.resultsView);
+      this.resultsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.resultsTabPage.Name = "resultsTabPage";
+      this.resultsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.resultsTabPage.Size = new System.Drawing.Size(482, 178);
+      this.resultsTabPage.TabIndex = 2;
+      this.resultsTabPage.Text = "Results";
+      this.resultsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // resultsView
+      // 
+      this.resultsView.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.resultsView.Caption = "VariableCollection";
+      this.resultsView.Content = null;
+      this.resultsView.Location = new System.Drawing.Point(6, 6);
+      this.resultsView.Name = "resultsView";
+      this.resultsView.Size = new System.Drawing.Size(470, 166);
+      this.resultsView.TabIndex = 0;
+      // 
       // startButton
       // 
       this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.startButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Play;
-      this.startButton.Location = new System.Drawing.Point(0, 329);
+      this.startButton.Location = new System.Drawing.Point(0, 458);
       this.startButton.Name = "startButton";
       this.startButton.Size = new System.Drawing.Size(24, 24);
       this.startButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.startButton, "Start Algorithm");
       this.startButton.UseVisualStyleBackColor = true;
       this.startButton.Click += new System.EventHandler(this.startButton_Click);
@@ -188,8 +219,9 @@
       this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.stopButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Stop;
-      this.stopButton.Location = new System.Drawing.Point(30, 329);
+      this.stopButton.Location = new System.Drawing.Point(30, 458);
       this.stopButton.Name = "stopButton";
       this.stopButton.Size = new System.Drawing.Size(24, 24);
       this.stopButton.TabIndex = 6;
+      this.toolTip.SetToolTip(this.stopButton, "Stop Algorithm");
       this.stopButton.UseVisualStyleBackColor = true;
       this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
@@ -199,8 +231,9 @@
       this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.resetButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Restart;
-      this.resetButton.Location = new System.Drawing.Point(60, 329);
+      this.resetButton.Location = new System.Drawing.Point(60, 458);
       this.resetButton.Name = "resetButton";
       this.resetButton.Size = new System.Drawing.Size(24, 24);
       this.resetButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.resetButton, "Reset Algorithm");
       this.resetButton.UseVisualStyleBackColor = true;
       this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
@@ -210,5 +243,5 @@
       this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.executionTimeLabel.AutoSize = true;
-      this.executionTimeLabel.Location = new System.Drawing.Point(264, 336);
+      this.executionTimeLabel.Location = new System.Drawing.Point(453, 465);
       this.executionTimeLabel.Name = "executionTimeLabel";
       this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
@@ -219,5 +252,5 @@
       // 
       this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeTextBox.Location = new System.Drawing.Point(353, 333);
+      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
       this.executionTimeTextBox.Name = "executionTimeTextBox";
       this.executionTimeTextBox.ReadOnly = true;
@@ -251,5 +284,5 @@
       this.Controls.Add(this.resetButton);
       this.Name = "AlgorithmView";
-      this.Size = new System.Drawing.Size(490, 353);
+      this.Size = new System.Drawing.Size(679, 482);
       this.Controls.SetChildIndex(this.resetButton, 0);
       this.Controls.SetChildIndex(this.executionTimeLabel, 0);
@@ -266,4 +299,5 @@
       this.parametersTabPage.ResumeLayout(false);
       this.problemTabPage.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -289,4 +323,6 @@
     protected System.Windows.Forms.OpenFileDialog openFileDialog;
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
+    protected System.Windows.Forms.TabPage resultsTabPage;
+    protected HeuristicLab.Core.Views.VariableCollectionView resultsView;
 
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 2882)
@@ -82,4 +82,5 @@
         parameterCollectionView.Content = null;
         problemViewHost.Content = null;
+        resultsView.Content = null;
         tabControl.Enabled = false;
         startButton.Enabled = resetButton.Enabled = false;
@@ -90,4 +91,5 @@
         saveProblemButton.Enabled = Content.Problem != null;
         problemViewHost.Content = Content.Problem;
+        resultsView.Content = Content.Results;
         tabControl.Enabled = true;
         startButton.Enabled = !Content.Finished;
@@ -106,4 +108,6 @@
         newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = true;
         problemViewHost.Enabled = true;
+        resultsView.Content = Content.Results;
+        resultsView.Enabled = true;
         startButton.Enabled = !Content.Finished;
         stopButton.Enabled = false;
@@ -128,4 +132,5 @@
         newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = false;
         problemViewHost.Enabled = false;
+        resultsView.Enabled = false;
         startButton.Enabled = false;
         stopButton.Enabled = true;
@@ -141,4 +146,5 @@
         newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = true;
         problemViewHost.Enabled = true;
+        resultsView.Enabled = true;
         startButton.Enabled = !Content.Finished;
         stopButton.Enabled = false;
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs	(revision 2882)
@@ -52,11 +52,4 @@
       this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(418, 20);
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.descriptionTextBox.Size = new System.Drawing.Size(418, 87);
       // 
       // ProblemView
@@ -65,5 +58,4 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Name = "ProblemView";
-      this.Size = new System.Drawing.Size(490, 353);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs	(revision 2882)
@@ -46,13 +46,14 @@
     private void InitializeComponent() {
       this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.saveOperatorGraphButton = new System.Windows.Forms.Button();
+      this.openOperatorGraphButton = new System.Windows.Forms.Button();
+      this.newOperatorGraphButton = new System.Windows.Forms.Button();
+      this.operatorGraphViewHost = new HeuristicLab.Core.Views.ViewHost();
       this.globalScopeTabPage = new System.Windows.Forms.TabPage();
       this.globalScopeView = new HeuristicLab.Core.Views.ScopeView();
-      this.operatorGraphViewHost = new HeuristicLab.Core.Views.ViewHost();
-      this.newOperatorGraphButton = new System.Windows.Forms.Button();
-      this.openOperatorGraphButton = new System.Windows.Forms.Button();
-      this.saveOperatorGraphButton = new System.Windows.Forms.Button();
       this.tabControl.SuspendLayout();
       this.parametersTabPage.SuspendLayout();
       this.problemTabPage.SuspendLayout();
+      this.resultsTabPage.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.operatorGraphTabPage.SuspendLayout();
@@ -60,12 +61,53 @@
       this.SuspendLayout();
       // 
+      // setEngineButton
+      // 
+      this.toolTip.SetToolTip(this.setEngineButton, "Set Engine");
+      // 
+      // createUserDefinedAlgorithmButton
+      // 
+      this.toolTip.SetToolTip(this.createUserDefinedAlgorithmButton, "Create User Defined Algorithm from this Algorithm");
+      // 
       // tabControl
       // 
       this.tabControl.Controls.Add(this.operatorGraphTabPage);
       this.tabControl.Controls.Add(this.globalScopeTabPage);
+      this.tabControl.Controls.SetChildIndex(this.resultsTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.globalScopeTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.operatorGraphTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.problemTabPage, 0);
       this.tabControl.Controls.SetChildIndex(this.parametersTabPage, 0);
+      // 
+      // newProblemButton
+      // 
+      this.toolTip.SetToolTip(this.newProblemButton, "New Problem");
+      // 
+      // saveProblemButton
+      // 
+      this.toolTip.SetToolTip(this.saveProblemButton, "Save Problem");
+      // 
+      // openProblemButton
+      // 
+      this.toolTip.SetToolTip(this.openProblemButton, "Open Problem");
+      // 
+      // startButton
+      // 
+      this.toolTip.SetToolTip(this.startButton, "Start Algorithm");
+      // 
+      // stopButton
+      // 
+      this.toolTip.SetToolTip(this.stopButton, "Stop Algorithm");
+      // 
+      // resetButton
+      // 
+      this.toolTip.SetToolTip(this.resetButton, "Reset Algorithm");
+      // 
+      // resultsTabPage
+      // 
+      this.resultsTabPage.Size = new System.Drawing.Size(648, 252);
+      // 
+      // resultsView
+      // 
+      this.resultsView.Size = new System.Drawing.Size(636, 240);
       // 
       // nameTextBox
@@ -82,9 +124,54 @@
       this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
       this.operatorGraphTabPage.Name = "operatorGraphTabPage";
-      this.operatorGraphTabPage.Size = new System.Drawing.Size(482, 148);
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(648, 252);
       this.operatorGraphTabPage.TabIndex = 2;
       this.operatorGraphTabPage.Text = "Operator Graph";
       this.operatorGraphTabPage.UseVisualStyleBackColor = true;
       // 
+      // saveOperatorGraphButton
+      // 
+      this.saveOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
+      this.saveOperatorGraphButton.Location = new System.Drawing.Point(63, 3);
+      this.saveOperatorGraphButton.Name = "saveOperatorGraphButton";
+      this.saveOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
+      this.saveOperatorGraphButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.saveOperatorGraphButton, "Save Operator Graph");
+      this.saveOperatorGraphButton.UseVisualStyleBackColor = true;
+      this.saveOperatorGraphButton.Click += new System.EventHandler(this.saveOperatorGraphButton_Click);
+      // 
+      // openOperatorGraphButton
+      // 
+      this.openOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Open;
+      this.openOperatorGraphButton.Location = new System.Drawing.Point(33, 3);
+      this.openOperatorGraphButton.Name = "openOperatorGraphButton";
+      this.openOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
+      this.openOperatorGraphButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.openOperatorGraphButton, "Open Operator Graph");
+      this.openOperatorGraphButton.UseVisualStyleBackColor = true;
+      this.openOperatorGraphButton.Click += new System.EventHandler(this.openOperatorGraphButton_Click);
+      // 
+      // newOperatorGraphButton
+      // 
+      this.newOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
+      this.newOperatorGraphButton.Location = new System.Drawing.Point(3, 3);
+      this.newOperatorGraphButton.Name = "newOperatorGraphButton";
+      this.newOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
+      this.newOperatorGraphButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.newOperatorGraphButton, "New Operator Graph");
+      this.newOperatorGraphButton.UseVisualStyleBackColor = true;
+      this.newOperatorGraphButton.Click += new System.EventHandler(this.newOperatorGraphButton_Click);
+      // 
+      // operatorGraphViewHost
+      // 
+      this.operatorGraphViewHost.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.operatorGraphViewHost.Content = null;
+      this.operatorGraphViewHost.Location = new System.Drawing.Point(3, 33);
+      this.operatorGraphViewHost.Name = "operatorGraphViewHost";
+      this.operatorGraphViewHost.Size = new System.Drawing.Size(642, 216);
+      this.operatorGraphViewHost.TabIndex = 0;
+      this.operatorGraphViewHost.ViewType = null;
+      // 
       // globalScopeTabPage
       // 
@@ -92,5 +179,5 @@
       this.globalScopeTabPage.Location = new System.Drawing.Point(4, 22);
       this.globalScopeTabPage.Name = "globalScopeTabPage";
-      this.globalScopeTabPage.Size = new System.Drawing.Size(482, 148);
+      this.globalScopeTabPage.Size = new System.Drawing.Size(648, 252);
       this.globalScopeTabPage.TabIndex = 3;
       this.globalScopeTabPage.Text = "Global Scope";
@@ -106,48 +193,6 @@
       this.globalScopeView.Location = new System.Drawing.Point(3, 3);
       this.globalScopeView.Name = "globalScopeView";
-      this.globalScopeView.Size = new System.Drawing.Size(476, 142);
+      this.globalScopeView.Size = new System.Drawing.Size(642, 246);
       this.globalScopeView.TabIndex = 0;
-      // 
-      // operatorGraphViewHost
-      // 
-      this.operatorGraphViewHost.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.operatorGraphViewHost.Content = null;
-      this.operatorGraphViewHost.Location = new System.Drawing.Point(3, 33);
-      this.operatorGraphViewHost.Name = "operatorGraphViewHost";
-      this.operatorGraphViewHost.Size = new System.Drawing.Size(476, 112);
-      this.operatorGraphViewHost.TabIndex = 0;
-      this.operatorGraphViewHost.ViewType = null;
-      // 
-      // newOperatorGraphButton
-      // 
-      this.newOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
-      this.newOperatorGraphButton.Location = new System.Drawing.Point(3, 3);
-      this.newOperatorGraphButton.Name = "newOperatorGraphButton";
-      this.newOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
-      this.newOperatorGraphButton.TabIndex = 1;
-      this.newOperatorGraphButton.UseVisualStyleBackColor = true;
-      this.newOperatorGraphButton.Click += new System.EventHandler(this.newOperatorGraphButton_Click);
-      // 
-      // openOperatorGraphButton
-      // 
-      this.openOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Open;
-      this.openOperatorGraphButton.Location = new System.Drawing.Point(33, 3);
-      this.openOperatorGraphButton.Name = "openOperatorGraphButton";
-      this.openOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
-      this.openOperatorGraphButton.TabIndex = 1;
-      this.openOperatorGraphButton.UseVisualStyleBackColor = true;
-      this.openOperatorGraphButton.Click += new System.EventHandler(this.openOperatorGraphButton_Click);
-      // 
-      // saveOperatorGraphButton
-      // 
-      this.saveOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
-      this.saveOperatorGraphButton.Location = new System.Drawing.Point(63, 3);
-      this.saveOperatorGraphButton.Name = "saveOperatorGraphButton";
-      this.saveOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
-      this.saveOperatorGraphButton.TabIndex = 1;
-      this.saveOperatorGraphButton.UseVisualStyleBackColor = true;
-      this.saveOperatorGraphButton.Click += new System.EventHandler(this.saveOperatorGraphButton_Click);
       // 
       // UserDefinedAlgorithmView
@@ -159,4 +204,5 @@
       this.parametersTabPage.ResumeLayout(false);
       this.problemTabPage.ResumeLayout(false);
+      this.resultsTabPage.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.operatorGraphTabPage.ResumeLayout(false);
Index: trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 2882)
@@ -22,4 +22,5 @@
 using System;
 using System.Drawing;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -55,4 +56,6 @@
       }
     }
+
+    public abstract IObservableKeyedCollection<string, IVariable> Results { get; }
 
     public abstract TimeSpan ExecutionTime { get; }
Index: trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 2882)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -68,4 +69,13 @@
     }
 
+    private ReadOnlyObservableKeyedCollection<string, IVariable> readOnlyResults;
+    public override IObservableKeyedCollection<string, IVariable> Results {
+      get {
+        if (readOnlyResults == null)
+          readOnlyResults = ((VariableCollection)globalScope.Variables["Results"].Value).AsReadOnly();
+        return readOnlyResults;
+      }
+    }
+
     public override TimeSpan ExecutionTime {
       get {
@@ -85,4 +95,5 @@
       : base() {
       globalScope = new Scope();
+      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
     }
@@ -90,4 +101,5 @@
       : base(name) {
       globalScope = new Scope();
+      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
     }
@@ -95,4 +107,5 @@
       : base(name, parameters) {
       globalScope = new Scope();
+      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
     }
@@ -100,4 +113,5 @@
       : base(name, description) {
       globalScope = new Scope();
+      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
     }
@@ -105,4 +119,5 @@
       : base(name, description, parameters) {
       globalScope = new Scope();
+      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
       OperatorGraph = new OperatorGraph();
     }
@@ -133,4 +148,7 @@
     protected override void OnPrepared() {
       globalScope.Clear();
+      globalScope.Variables.Add(new Variable("Results", new VariableCollection()));
+      readOnlyResults = null;
+
       if (engine != null) {
         ExecutionContext context = null;
Index: trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 2882)
@@ -52,4 +52,8 @@
     <None Include="HeuristicLabOptimizationPlugin.cs.frame" />
     <Compile Include="Algorithm.cs" />
+    <Compile Include="Interfaces\IMultiObjectiveSelector.cs" />
+    <Compile Include="Interfaces\ISingleObjectiveSelector.cs" />
+    <Compile Include="Interfaces\IReducer.cs" />
+    <Compile Include="Interfaces\ISelector.cs" />
     <Compile Include="Interfaces\IMultiObjectiveProblem.cs" />
     <Compile Include="Interfaces\IMultiObjectiveEvaluator.cs" />
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IAlgorithm.cs	(revision 2882)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -31,4 +32,5 @@
     Type ProblemType { get; }
     IProblem Problem { get; set; }
+    IObservableKeyedCollection<string, IVariable> Results { get; }
     TimeSpan ExecutionTime { get; }
     bool Running { get; }
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveSelector.cs	(revision 2882)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveSelector.cs	(revision 2882)
@@ -0,0 +1,32 @@
+#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 HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents a selection operator for selecting solutions of multi-objective optimization problems.
+  /// </summary>
+  public interface IMultiObjectiveSelector : ISelector {
+    ILookupParameter<ItemArray<DoubleArrayData>> QualitiesParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IReducer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IReducer.cs	(revision 2882)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IReducer.cs	(revision 2882)
@@ -0,0 +1,29 @@
+#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 HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents a reduction opertor.
+  /// </summary>
+  public interface IReducer : IOperator { }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISelector.cs	(revision 2882)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISelector.cs	(revision 2882)
@@ -0,0 +1,33 @@
+#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 HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents a selection operator.
+  /// </summary>
+  public interface ISelector : IOperator {
+    BoolData CopySelected { get; set; }
+    IValueLookupParameter<IntData> NumberOfSelectedSubScopesParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSelector.cs	(revision 2882)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSelector.cs	(revision 2882)
@@ -0,0 +1,33 @@
+#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 HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents a selection operator for selecting solutions of single-objective optimization problems.
+  /// </summary>
+  public interface ISingleObjectiveSelector : ISelector {
+    IValueLookupParameter<BoolData> MaximizationParameter { get; }
+    ILookupParameter<ItemArray<DoubleData>> QualityParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.Designer.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Routing.TSP.Views/3.3/TSPView.Designer.cs	(revision 2882)
@@ -52,5 +52,5 @@
       // parameterCollectionView
       // 
-      this.parameterCollectionView.Size = new System.Drawing.Size(490, 205);
+      this.parameterCollectionView.Size = new System.Drawing.Size(529, 274);
       // 
       // nameTextBox
@@ -58,4 +58,9 @@
       this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(457, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Size = new System.Drawing.Size(457, 87);
       // 
       // openFileDialog
@@ -70,7 +75,7 @@
       this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.importButton.Location = new System.Drawing.Point(0, 330);
+      this.importButton.Location = new System.Drawing.Point(0, 399);
       this.importButton.Name = "importButton";
-      this.importButton.Size = new System.Drawing.Size(490, 23);
+      this.importButton.Size = new System.Drawing.Size(529, 23);
       this.importButton.TabIndex = 5;
       this.importButton.Text = "&Import from TSPLIB";
@@ -84,4 +89,5 @@
       this.Controls.Add(this.importButton);
       this.Name = "TSPView";
+      this.Size = new System.Drawing.Size(529, 422);
       this.Controls.SetChildIndex(this.importButton, 0);
       this.Controls.SetChildIndex(this.parameterCollectionView, 0);
Index: trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs
===================================================================
--- trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs	(revision 2882)
@@ -101,13 +101,18 @@
       EvaluatorParameter.Value = evaluator;
 
-      operators = new OperatorSet();
-      var crossovers = ApplicationManager.Manager.GetInstances<IPermutationCrossover>().ToList();
-      crossovers.ForEach(x => {
-        x.ParentsParameter.ActualName = creator.PermutationParameter.ActualName;
-        x.ChildParameter.ActualName = creator.PermutationParameter.ActualName;
+      var ops = ApplicationManager.Manager.GetInstances<IPermutationOperator>().ToList();
+      ops.ForEach(x => {
+        IPermutationCrossover y = x as IPermutationCrossover;
+        if (y != null) {
+          y.ParentsParameter.ActualName = creator.PermutationParameter.ActualName;
+          y.ChildParameter.ActualName = creator.PermutationParameter.ActualName;
+        }
       });
-      var manipulators = ApplicationManager.Manager.GetInstances<IPermutationManipulator>().ToList();
-      manipulators.ForEach(x => x.PermutationParameter.ActualName = creator.PermutationParameter.ActualName);
-      operators = new OperatorSet(crossovers.Cast<IOperator>().Concat(manipulators.Cast<IOperator>()));
+      ops.ForEach(x => {
+        IPermutationManipulator y = x as IPermutationManipulator;
+        if (y != null)
+          y.PermutationParameter.ActualName = creator.PermutationParameter.ActualName;
+      });
+      operators = new OperatorSet(ops.Cast<IOperator>());
     }
 
Index: trunk/sources/HeuristicLab.SGA/3.3/SGA.cs
===================================================================
--- trunk/sources/HeuristicLab.SGA/3.3/SGA.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.SGA/3.3/SGA.cs	(revision 2882)
@@ -29,4 +29,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.SGA {
@@ -42,9 +43,18 @@
     private SGAOperator sgaOperator;
 
-    private ConstrainedValueParameter<ICrossover> CrossoverOperatorParameter {
-      get { return (ConstrainedValueParameter<ICrossover>)Parameters["CrossoverOperator"]; }
+    private ValueParameter<IntData> PopulationSizeParameter {
+      get { return (ValueParameter<IntData>)Parameters["PopulationSize"]; }
     }
-    private ConstrainedValueParameter<IManipulator> MutationOperatorParameter {
-      get { return (ConstrainedValueParameter<IManipulator>)Parameters["MutationOperator"]; }
+    private ConstrainedValueParameter<ISelector> SelectorParameter {
+      get { return (ConstrainedValueParameter<ISelector>)Parameters["Selector"]; }
+    }
+    private ConstrainedValueParameter<ICrossover> CrossoverParameter {
+      get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; }
+    }
+    private ConstrainedValueParameter<IManipulator> MutatorParameter {
+      get { return (ConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; }
+    }
+    private ValueParameter<IntData> ElitesParameter {
+      get { return (ValueParameter<IntData>)Parameters["Elites"]; }
     }
 
@@ -62,9 +72,13 @@
       Parameters.Add(new ValueParameter<BoolData>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolData(true)));
       Parameters.Add(new ValueParameter<IntData>("PopulationSize", "The size of the population of solutions.", new IntData(100)));
-      Parameters.Add(new ConstrainedValueParameter<ICrossover>("CrossoverOperator", "The operator used to cross solutions."));
+      Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction."));
+      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>("MutationOperator", "The operator used to mutate solutions."));
+      Parameters.Add(new ConstrainedValueParameter<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)));
+
+      PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
+      ElitesParameter.ValueChanged += new EventHandler(ElitesParameter_ValueChanged);
 
       RandomCreator randomCreator = new RandomCreator();
@@ -83,12 +97,21 @@
       populationCreator.Successor = sgaOperator;
 
-      sgaOperator.CrossoverOperatorParameter.ActualName = "CrossoverOperator";
+      sgaOperator.SelectorParameter.ActualName = "Selector";
+      sgaOperator.CrossoverParameter.ActualName = "Crossover";
       sgaOperator.ElitesParameter.ActualName = "Elites";
       sgaOperator.MaximumGenerationsParameter.ActualName = "MaximumGenerations";
-      sgaOperator.MutationOperatorParameter.ActualName = "MutationOperator";
+      sgaOperator.MutatorParameter.ActualName = "Mutator";
       sgaOperator.MutationProbabilityParameter.ActualName = "MutationProbability";
       sgaOperator.RandomParameter.ActualName = "Random";
+      sgaOperator.ResultsParameter.ActualName = "Results";
 
       OperatorGraph.InitialOperator = randomCreator;
+
+      var selectors = ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector));
+      selectors.Select(x => x.CopySelected = new BoolData(true));
+      selectors.Select(x => x.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)));
+      selectors.OfType<IStochasticOperator>().Select(x => x.RandomParameter.ActualName = "Random");
+      foreach (ISelector selector in selectors)
+        SelectorParameter.ValidValues.Add(selector);
     }
 
@@ -98,4 +121,11 @@
       clone.sgaOperator = (SGAOperator)cloner.Clone(sgaOperator);
       return clone;
+    }
+
+    private void ElitesParameter_ValueChanged(object sender, EventArgs e) {
+      SelectorParameter.ValidValues.Select(x => x.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)));
+    }
+    private void PopulationSizeParameter_ValueChanged(object sender, EventArgs e) {
+      SelectorParameter.ValidValues.Select(x => x.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)));
     }
 
@@ -112,25 +142,22 @@
       if (Problem.SolutionCreator is IStochasticOperator) ((IStochasticOperator)Problem.SolutionCreator).RandomParameter.ActualName = "Random";
       if (Problem.Evaluator is IStochasticOperator) ((IStochasticOperator)Problem.Evaluator).RandomParameter.ActualName = "Random";
-      Problem.Operators.Where(x => x is IStochasticOperator).Select(x => (x as IStochasticOperator).RandomParameter.ActualName = "Random");
+      Problem.Operators.OfType<IStochasticOperator>().Select(x => x.RandomParameter.ActualName = "Random");
 
       populationCreator.SolutionCreatorParameter.Value = Problem.SolutionCreator;
-      populationCreator.SolutionEvaluatorParameter.Value = Problem.Evaluator;
+      populationCreator.EvaluatorParameter.Value = Problem.Evaluator;
       sgaOperator.MaximizationParameter.Value = Problem.Maximization;
       sgaOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
-      sgaOperator.SolutionEvaluatorParameter.Value = Problem.Evaluator;
+      sgaOperator.EvaluatorParameter.Value = Problem.Evaluator;
 
-      CrossoverOperatorParameter.ValidValues.Clear();
-      var crossovers = from o in Problem.Operators
-                       where o is ICrossover
-                       select (ICrossover)o;
-      foreach (ICrossover crossover in crossovers)
-        CrossoverOperatorParameter.ValidValues.Add(crossover);
+      SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>().Select(x => x.MaximizationParameter.Value = Problem.Maximization);
+      SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>().Select(x => x.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName);
 
-      MutationOperatorParameter.ValidValues.Clear();
-      var mutators = from o in Problem.Operators
-                     where o is IManipulator
-                     select (IManipulator)o;
-      foreach (IManipulator mutator in mutators)
-        MutationOperatorParameter.ValidValues.Add(mutator);
+      CrossoverParameter.ValidValues.Clear();
+      foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>())
+        CrossoverParameter.ValidValues.Add(crossover);
+
+      MutatorParameter.ValidValues.Clear();
+      foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>())
+        MutatorParameter.ValidValues.Add(mutator);
 
       base.OnProblemChanged();
@@ -143,11 +170,13 @@
     protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
       if (Problem.Evaluator is IStochasticOperator) ((IStochasticOperator)Problem.Evaluator).RandomParameter.ActualName = "Random";
-      populationCreator.SolutionEvaluatorParameter.Value = Problem.Evaluator;
+      SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>().Select(x => x.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName);
+      populationCreator.EvaluatorParameter.Value = Problem.Evaluator;
       sgaOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
-      sgaOperator.SolutionEvaluatorParameter.Value = Problem.Evaluator;
+      sgaOperator.EvaluatorParameter.Value = Problem.Evaluator;
       base.Problem_EvaluatorChanged(sender, e);
     }
     private void Problem_MaximizationChanged(object sender, EventArgs e) {
       sgaOperator.MaximizationParameter.Value = Problem.Maximization;
+      SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>().Select(x => x.MaximizationParameter.Value = Problem.Maximization);
     }
   }
Index: trunk/sources/HeuristicLab.SGA/3.3/SGAOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.SGA/3.3/SGAOperator.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.SGA/3.3/SGAOperator.cs	(revision 2882)
@@ -35,7 +35,4 @@
   [Creatable("Test")]
   public class SGAOperator : AlgorithmOperator {
-    [Storable]
-    private ProportionalSelector proportionalSelector;
-
     #region Parameter properties
     public ValueLookupParameter<IRandom> RandomParameter {
@@ -48,15 +45,18 @@
       get { return (SubScopesLookupParameter<DoubleData>)Parameters["Quality"]; }
     }
-    public ValueLookupParameter<IOperator> CrossoverOperatorParameter {
-      get { return (ValueLookupParameter<IOperator>)Parameters["CrossoverOperator"]; }
+    public ValueLookupParameter<IOperator> SelectorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Selector"]; }
+    }
+    public ValueLookupParameter<IOperator> CrossoverParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Crossover"]; }
     }
     public ValueLookupParameter<DoubleData> MutationProbabilityParameter {
       get { return (ValueLookupParameter<DoubleData>)Parameters["MutationProbability"]; }
     }
-    public ValueLookupParameter<IOperator> MutationOperatorParameter {
-      get { return (ValueLookupParameter<IOperator>)Parameters["MutationOperator"]; }
+    public ValueLookupParameter<IOperator> MutatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Mutator"]; }
     }
-    public ValueLookupParameter<IOperator> SolutionEvaluatorParameter {
-      get { return (ValueLookupParameter<IOperator>)Parameters["SolutionEvaluator"]; }
+    public ValueLookupParameter<IOperator> EvaluatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["Evaluator"]; }
     }
     public ValueLookupParameter<IntData> ElitesParameter {
@@ -65,4 +65,7 @@
     public ValueLookupParameter<IntData> MaximumGenerationsParameter {
       get { return (ValueLookupParameter<IntData>)Parameters["MaximumGenerations"]; }
+    }
+    public ValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (ValueLookupParameter<VariableCollection>)Parameters["Results"]; }
     }
     private ScopeParameter CurrentScopeParameter {
@@ -81,10 +84,12 @@
       Parameters.Add(new ValueLookupParameter<BoolData>("Maximization", "True if the problem is a maximization problem, otherwise false."));
       Parameters.Add(new SubScopesLookupParameter<DoubleData>("Quality", "The value which represents the quality of a solution."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("CrossoverOperator", "The operator used to cross solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Selector", "The operator used to select solutions for reproduction."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Crossover", "The operator used to cross solutions."));
       Parameters.Add(new ValueLookupParameter<DoubleData>("MutationProbability", "The probability that the mutation operator is applied on a solution."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("MutationOperator", "The operator used to mutate solutions."));
-      Parameters.Add(new ValueLookupParameter<IOperator>("SolutionEvaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Mutator", "The operator used to mutate solutions."));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator used to evaluate solutions."));
       Parameters.Add(new ValueLookupParameter<IntData>("Elites", "The numer of elite solutions which are kept in each generation."));
       Parameters.Add(new ValueLookupParameter<IntData>("MaximumGenerations", "The maximum number of generations which should be processed."));
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope which represents a population of solutions on which the SGA should be applied."));
       #endregion
@@ -92,5 +97,5 @@
       #region Create operator graph
       SubScopesSorter subScopesSorter1 = new SubScopesSorter();
-      proportionalSelector = new ProportionalSelector();
+      Placeholder selector = new Placeholder();
       SequentialSubScopesProcessor sequentialSubScopesProcessor1 = new SequentialSubScopesProcessor();
       ChildrenCreator childrenCreator = new ChildrenCreator();
@@ -108,4 +113,5 @@
       IntCounter intCounter = new IntCounter();
       Comparator comparator = new Comparator();
+      ResultsCollector resultsCollector = new ResultsCollector();
       ConditionalBranch conditionalBranch = new ConditionalBranch();
 
@@ -113,13 +119,9 @@
       subScopesSorter1.ValueParameter.ActualName = "Quality";
       OperatorGraph.InitialOperator = subScopesSorter1;
-      subScopesSorter1.Successor = proportionalSelector;
+      subScopesSorter1.Successor = selector;
 
-      proportionalSelector.CopySelected = new BoolData(true);
-      proportionalSelector.MaximizationParameter.ActualName = "Maximization";
-      // NOTE: NumberOfSelectedSubScopes is set dynamically when the operator is executed
-      proportionalSelector.QualityParameter.ActualName = "Quality";
-      proportionalSelector.RandomParameter.ActualName = "Random";
-      proportionalSelector.Windowing = new BoolData(true);
-      proportionalSelector.Successor = sequentialSubScopesProcessor1;
+      selector.Name = "Selector";
+      selector.OperatorParameter.ActualName = "Selector";
+      selector.Successor = sequentialSubScopesProcessor1;
 
       sequentialSubScopesProcessor1.Operators.Add(new EmptyOperator());
@@ -133,6 +135,6 @@
       uniformSequentialSubScopesProcessor.Successor = subScopesSorter2;
 
-      crossover.Name = "CrossoverOperator";
-      crossover.OperatorParameter.ActualName = "CrossoverOperator";
+      crossover.Name = "Crossover";
+      crossover.OperatorParameter.ActualName = "Crossover";
       crossover.Successor = stochasticBranch;
 
@@ -143,10 +145,10 @@
       stochasticBranch.Successor = evaluator;
 
-      mutator.Name = "MutationOperator";
-      mutator.OperatorParameter.ActualName = "MutationOperator";
+      mutator.Name = "Mutator";
+      mutator.OperatorParameter.ActualName = "Mutator";
       mutator.Successor = null;
 
-      evaluator.Name = "SolutionEvaluator";
-      evaluator.OperatorParameter.ActualName = "SolutionEvaluator";
+      evaluator.Name = "Evaluator";
+      evaluator.OperatorParameter.ActualName = "Evaluator";
       evaluator.Successor = subScopesRemover;
 
@@ -178,5 +180,11 @@
       comparator.ResultParameter.ActualName = "Terminate";
       comparator.RightSideParameter.ActualName = "MaximumGenerations";
-      comparator.Successor = conditionalBranch;
+      comparator.Successor = resultsCollector;
+
+      SubScopesLookupParameter<DoubleData> quality = new SubScopesLookupParameter<DoubleData>("Qualities");
+      quality.ActualName = "Quality";
+      resultsCollector.CollectedValues.Add(quality);
+      resultsCollector.ResultsParameter.ActualName = "Results";
+      resultsCollector.Successor = conditionalBranch;
 
       conditionalBranch.ConditionParameter.ActualName = "Terminate";
@@ -186,17 +194,4 @@
       #endregion
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SGAOperator clone = (SGAOperator)base.Clone(cloner);
-      clone.proportionalSelector = (ProportionalSelector)cloner.Clone(proportionalSelector);
-      return clone;
-    }
-
-    public override IOperation Apply() {
-      int populationSize = CurrentScope.SubScopes.Count;
-      // dynamically set the number of parents which are selected for reproduction
-      proportionalSelector.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (populationSize - ElitesParameter.ActualValue.Value));
-      return base.Apply();
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 2881)
+++ trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 2882)
@@ -119,4 +119,8 @@
       <Name>HeuristicLab.Operators-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
       <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
Index: trunk/sources/HeuristicLab.Selection/3.3/HeuristicLabSelectionPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/HeuristicLabSelectionPlugin.cs.frame	(revision 2881)
+++ trunk/sources/HeuristicLab.Selection/3.3/HeuristicLabSelectionPlugin.cs.frame	(revision 2882)
@@ -32,4 +32,5 @@
   [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs	(revision 2882)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -32,5 +33,5 @@
   [Item("Reducer", "A base class for reduction operators.")]
   [EmptyStorableClass]
-  public abstract class Reducer : SingleSuccessorOperator {
+  public abstract class Reducer : SingleSuccessorOperator, IReducer {
     protected ScopeParameter CurrentScopeParameter {
       get { return (ScopeParameter)Parameters["CurrentScope"]; }
Index: trunk/sources/HeuristicLab.Selection/3.3/Selector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2882)
@@ -24,4 +24,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,9 +34,9 @@
   [Item("Selector", "A base class for selection operators.")]
   [EmptyStorableClass]
-  public abstract class Selector : SingleSuccessorOperator {
+  public abstract class Selector : SingleSuccessorOperator, ISelector {
     protected ValueParameter<BoolData> CopySelectedParameter {
       get { return (ValueParameter<BoolData>)Parameters["CopySelected"]; }
     }
-    public ValueLookupParameter<IntData> NumberOfSelectedSubScopesParameter {
+    public IValueLookupParameter<IntData> NumberOfSelectedSubScopesParameter {
       get { return (ValueLookupParameter<IntData>)Parameters["NumberOfSelectedSubScopes"]; }
     }
Index: trunk/sources/HeuristicLab.Selection/3.3/StochasticSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/StochasticSelector.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Selection/3.3/StochasticSelector.cs	(revision 2882)
@@ -21,4 +21,5 @@
 
 using HeuristicLab.Core;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -30,6 +31,6 @@
   [Item("StochasticSelector", "A base class for stochastic selection operators.")]
   [EmptyStorableClass]
-  public abstract class StochasticSelector : Selector {
-    public LookupParameter<IRandom> RandomParameter {
+  public abstract class StochasticSelector : Selector, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
Index: trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs
===================================================================
--- trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs	(revision 2881)
+++ trunk/sources/HeuristicLab.Selection/3.3/StochasticSingleObjectiveSelector.cs	(revision 2882)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -31,15 +32,15 @@
   [Item("StochasticSingleObjectiveSelector", "A base class for stochastic selection operators which consider a single double quality value for selection.")]
   [EmptyStorableClass]
-  public abstract class StochasticSingleObjectiveSelector : StochasticSelector {
-    public LookupParameter<BoolData> MaximizationParameter {
-      get { return (LookupParameter<BoolData>)Parameters["Maximization"]; }
+  public abstract class StochasticSingleObjectiveSelector : StochasticSelector, ISingleObjectiveSelector {
+    public IValueLookupParameter<BoolData> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolData>)Parameters["Maximization"]; }
     }
-    public SubScopesLookupParameter<DoubleData> QualityParameter {
-      get { return (SubScopesLookupParameter<DoubleData>)Parameters["Quality"]; }
+    public ILookupParameter<ItemArray<DoubleData>> QualityParameter {
+      get { return (ILookupParameter<ItemArray<DoubleData>>)Parameters["Quality"]; }
     }
 
     protected StochasticSingleObjectiveSelector()
       : base() {
-      Parameters.Add(new LookupParameter<BoolData>("Maximization", "True if the current problem is a maximization problem, otherwise false."));
+      Parameters.Add(new ValueLookupParameter<BoolData>("Maximization", "True if the current problem is a maximization problem, otherwise false."));
       Parameters.Add(new SubScopesLookupParameter<DoubleData>("Quality", "The quality value contained in each sub-scope which is used for selection."));
     }
