Index: /trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.cs	(revision 2817)
@@ -120,5 +120,5 @@
         return;
 
-      if (!ViewCanShowContent(viewType, content) || !typeMenuItemTable.ContainsKey(viewType))
+      if (!ViewCanShowContent(viewType, content))
         throw new ArgumentException(string.Format("View \"{0}\" cannot display content \"{1}\".",
                                                   viewType.GetPrettyName(),
Index: unk/sources/HeuristicLab.Core.Views/3.3/ViewHost.resx
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/ViewHost.resx	(revision 2816)
+++ 	(revision )
@@ -1,145 +1,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>107, 17</value>
-  </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="viewsLabel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALEQAA
-        CxEBf2RfkQAAAoJJREFUOE99kd1LU2Ecx0939Rd022UXQdBFXZVdh10FERRBipXD1CRDS8tmRbhM09LE
-        WavUaCnpsqzhnNPlKvNlrFm+pem0Njdtup3nnPOc7dtznmGQbB34cODh+b78fs8WAMLmr981TtjZVjWm
-        CgpNIMtUoCrlf1mhgqrGpZyM9G2CZrCZgY/jMjuD+6sPQ545vB+eht31DW/7v+BVzyi6bG7UmboID09m
-        4Bj0UgZsTje6e4dhsX6C2eJES7sdTc/eof7xa9QYLVpIcgNzpw2qGuNQqkJRKIdIMkQi4Xc4ghJ9lVZS
-        EF7apggDL6wTaO7yorFtFLWtn3H7kQvlDwZQcteOS9W9iEQJFwZDYSz5QygoupEw6LTP8HkdY0FYh/yw
-        OBdhts3jSfd3NHZMockyjav3HQgEV+FbWsbcwi9Mzy4iK/vC3wb03wZjvEGV6QNuGZ243tCP0uoe6HKL
-        cFpXyIUb8Ab1LX2g2qwM9lyQFRWSTCFKCqstYyVMcFFv5GnJEAwNFiZkYibU0MRrEQl32gKoeB5A+dOf
-        KDb6kHtvDhmGGRzVT+BQ0TjS8tzYlz1KhPIaM08WicKWRBAKi1heiaCqPailwuSIo86qoqJDQWmrhPMP
-        ozhTv86IYn+ehwiZ+TdxPKsYR04UIDOnDJf1taiua4HB7E80aN5o8CPR4BprUOxFWr4be8+OyEnn0mY9
-        ZxhkewFHoXGIMkOKYU1UsbpOsRCQsCu9MvliNINTV94wIdhS42wvcURIDMGwgqWghJlFEZ7Zdew4WJba
-        4FhhG2SWvBZV4V+RMe8nmPRFMTIZhsu7ir6xELbvPpnaYM/hUuw8oOOX/kfKHaR6983nfwDA/wvA3MbO
-        iwAAAABJRU5ErkJggg==
-</value>
-  </data>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: /trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/HeuristicLab.Selection-3.3.csproj	(revision 2817)
@@ -82,4 +82,10 @@
   <ItemGroup>
     <None Include="HeuristicLabSelectionPlugin.cs.frame" />
+    <Compile Include="LeftReducer.cs" />
+    <Compile Include="MergingReducer.cs" />
+    <Compile Include="Reducer.cs" />
+    <Compile Include="LinearRankSelector.cs" />
+    <Compile Include="ProportionalSelector.cs" />
+    <Compile Include="RightReducer.cs" />
     <Compile Include="RightSelector.cs" />
     <Compile Include="StochasticSelector.cs" />
Index: /trunk/sources/HeuristicLab.Selection/3.3/LeftReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/LeftReducer.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/LeftReducer.cs	(revision 2817)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,31 +20,24 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Takes only sub scopes from the left child of the tree.
+  /// An operator which reduces to the sub-scopes of the leftmost sub-scope of the current scope.
   /// </summary>
-  public class LeftReducer : ReducerBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
+  [Item("LeftReducer", "An operator which reduces to the sub-scopes of the leftmost sub-scope of the current scope.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class LeftReducer : Reducer {
+    public LeftReducer() : base() { }
 
-    /// <summary>
-    /// Takes only the sub scopes from the left sub scope of the tree.
-    /// </summary>
-    /// <param name="scope">The current scope.</param>
-    /// <returns>All sub scopes from the left part of the tree.</returns>
-    protected override ICollection<IScope> Reduce(IScope scope) {
-      List<IScope> subScopes = new List<IScope>();
-
-      if (scope.SubScopes.Count > 0)
-        subScopes.AddRange(scope.SubScopes[0].SubScopes);
-      return subScopes;
+    protected override ScopeList Reduce(ScopeList scopes) {
+      ScopeList reduced = new ScopeList();
+      if (scopes.Count > 0) reduced.AddRange(scopes[0].SubScopes);
+      return reduced;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs	(revision 2817)
@@ -36,19 +36,21 @@
     public LeftSelector() : base() { }
 
-    protected override void Select(ScopeList source, ScopeList target) {
+    protected override ScopeList Select(ScopeList scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
+      ScopeList selected = new ScopeList();
 
       int j = 0;
       for (int i = 0; i < count; i++) {
         if (copy) {
-          target.Add((IScope)source[j].Clone());
+          selected.Add((IScope)scopes[j].Clone());
           j++;
-          if (j >= source.Count) j = 0;
+          if (j >= scopes.Count) j = 0;
         } else {
-          target.Add(source[0]);
-          source.RemoveAt(0);
+          selected.Add(scopes[0]);
+          scopes.RemoveAt(0);
         }
       }
+      return selected;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs	(revision 2817)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,65 +20,59 @@
 #endregion
 
-using System;
+using System.Linq;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Selects scopes based on their rank, which has been determined through their quality.
+  /// A linear rank selection operator which considers the rank based on a single double quality value for selection.
   /// </summary>
-  public class LinearRankSelector : StochasticSelectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
+  [Item("LinearRankSelector", "A linear rank selection operator which considers the rank based on a single double quality value for selection.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class LinearRankSelector : StochasticSingleObjectiveSelector {
+    public LinearRankSelector()
+      : base() {
+      CopySelected.Value = true;
     }
 
-    /// <summary>
-    /// Initializes a new instance of <see cref="LinearRankSelector"/> with the <c>CopySelected</c> flag
-    /// set to <c>true</c>.
-    /// </summary>
-    public LinearRankSelector() {
-      GetVariable("CopySelected").GetValue<BoolData>().Data = true;
-    }
+    protected override ScopeList Select(ScopeList scopes) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      IRandom random = RandomParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      ItemArray<DoubleData> qualities = QualityParameter.ActualValue;
+      ScopeList selected = new ScopeList();
 
-    /// <summary>
-    /// Copies or moves sub scopes from the given <paramref name="source"/> to the specified
-    /// <paramref name="target"/> according to their rank which is determined through their quality.
-    /// </summary>
-    /// <exception cref="InvalidOperationException">Thrown when no source sub scopes are available.</exception>
-    /// <param name="random">The random number generator.</param>
-    /// <param name="source">The source scope from where to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to copy/move.</param>
-    /// <param name="target">The target scope where to add the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be moved or copied.</param>
-    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
-      int subScopes = source.SubScopes.Count;
-      int lotSum = (subScopes * (subScopes + 1)) / 2;
-      int selectedLot;
-      int currentLot;
-      int index;
+      // create a list for each scope that contains the scope's index in the original scope list and its lots
+      var temp = qualities.Select((x, index) => new { index, x.Value });
+      if (maximization)
+        temp = temp.OrderBy(x => x.Value);
+      else
+        temp = temp.OrderByDescending(x => x.Value);
+      var list = temp.Select((x, lots) => new { x.index, lots }).ToList();
 
-      for (int i = 0; i < selected; i++) {
-        if (subScopes < 1) throw new InvalidOperationException("No source scopes available to select.");
-
-        selectedLot = random.Next(1, lotSum + 1);
-        currentLot = subScopes;  // first individual is the best one
-        index = 0;
+      int lotSum = list.Count * (list.Count + 1) / 2;
+      for (int i = 0; i < count; i++) {
+        int selectedLot = random.Next(lotSum) + 1;
+        int index = 0;
+        int currentLot = list[index].lots;
         while (currentLot < selectedLot) {
           index++;
-          currentLot += subScopes - index;
+          currentLot += list[index].lots;
         }
-        IScope selectedScope = source.SubScopes[index];
-        if (copySelected)
-          target.AddSubScope((IScope)selectedScope.Clone());
+        if (copy)
+          selected.Add((IScope)scopes[list[index].index].Clone());
         else {
-          source.RemoveSubScope(selectedScope);
-          target.AddSubScope(selectedScope);
-          subScopes--;
-          lotSum = (subScopes * (subScopes + 1)) / 2;
+          selected.Add(scopes[list[index].index]);
+          scopes.RemoveAt(list[index].index);
+          lotSum -= list[index].lots;
+          list.RemoveAt(index);
         }
       }
+      return selected;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/MergingReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/MergingReducer.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/MergingReducer.cs	(revision 2817)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,33 +20,25 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Merges all sub scopes of the children to one list.
+  /// An operator which reduces to the sub-scopes of all sub-scopes of the current scope.
   /// </summary>
-  public class MergingReducer : ReducerBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
+  [Item("MergingReducer", "An operator which reduces to the sub-scopes of all sub-scopes of the current scope.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class MergingReducer : Reducer {
+    public MergingReducer() : base() { }
 
-    /// <summary>
-    /// Merges all sub scopes of the sub scopes of the current <paramref name="scope"/>.
-    /// </summary>
-    /// <param name="scope">The current scope whose sub scopes to merge.</param>
-    /// <returns>A list of all merged subscopes of the given <paramref name="scope"/>.</returns>
-    protected override ICollection<IScope> Reduce(IScope scope) {
-      List<IScope> subScopes = new List<IScope>();
-
-      for (int i = 0; i < scope.SubScopes.Count; i++) {
-        for (int j = 0; j < scope.SubScopes[i].SubScopes.Count; j++)
-          subScopes.Add(scope.SubScopes[i].SubScopes[j]);
-      }
-      return subScopes;
+    protected override ScopeList Reduce(ScopeList scopes) {
+      ScopeList reduced = new ScopeList();
+      for (int i = 0; i < scopes.Count; i++)
+        reduced.AddRange(scopes[i].SubScopes);
+      return reduced;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs	(revision 2817)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,135 +20,83 @@
 #endregion
 
-using System;
+using System.Linq;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Copies or moves a number of sub scopes from a source scope to a target scope, their probability
-  /// to be selected depending on their quality.
+  /// A quality proportional selection operator which considers a single double quality value for selection.
   /// </summary>
-  public class ProportionalSelector : StochasticSelectorBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
+  [Item("ProportionalSelector", "A quality proportional selection operator which considers a single double quality value for selection.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class ProportionalSelector : StochasticSingleObjectiveSelector {
+    private ValueParameter<BoolData> WindowingParameter {
+      get { return (ValueParameter<BoolData>)Parameters["Windowing"]; }
     }
 
-    /// <summary>
-    /// Initializes a new instance of <see cref="ProportionalSelector"/> with three variable infos 
-    /// (<c>Maximization</c>, <c>Quality</c> and <c>Windowing</c>, being a local variable and initialized 
-    /// with <c>true</c>) and the <c>CopySelected</c> flag set to <c>true</c>.
-    /// </summary>
-    public ProportionalSelector() {
-      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("Quality", "Quality value", typeof(DoubleData), VariableKind.In));
-      AddVariableInfo(new VariableInfo("Windowing", "Apply windowing strategy (selection probability is proportional to the quality differences and not to the total quality)", typeof(BoolData), VariableKind.In));
-      GetVariableInfo("Windowing").Local = true;
-      AddVariable(new Variable("Windowing", new BoolData(true)));
-      GetVariable("CopySelected").GetValue<BoolData>().Data = true;
+    public BoolData Windowing {
+      get { return WindowingParameter.Value; }
+      set { WindowingParameter.Value = value; }
     }
 
-    /// <summary>
-    /// Copies or movies a number of sub scopes (<paramref name="selected"/>) in the given 
-    /// <paramref name="source"/> to the given <paramref name="target"/>, selection takes place with respect
-    /// to the quality of the scope.
-    /// </summary>
-    /// <param name="random">The random number generator.</param>
-    /// <param name="source">The source scope from where to copy/move the sub scopes.</param>
-    /// <param name="selected">The number of sub scopes to copy/move.</param>
-    /// <param name="target">The target scope where to add the sub scopes.</param>
-    /// <param name="copySelected">Boolean flag whether the sub scopes shall be moved or copied.</param>
-    protected override void Select(IRandom random, IScope source, int selected, IScope target, bool copySelected) {
-      bool maximization = GetVariableValue<BoolData>("Maximization", source, true).Data;
-      IVariableInfo qualityInfo = GetVariableInfo("Quality");
-      bool windowing = GetVariableValue<BoolData>("Windowing", source, true).Data;
+    public ProportionalSelector()
+      : base() {
+      Parameters.Add(new ValueParameter<BoolData>("Windowing", "Apply windowing strategy (selection probability is proportional to the quality differences and not to the total quality).", new BoolData(true)));
+      CopySelected.Value = true;
+    }
 
-      double[] qualities;
-      double qualitySum;
-      double selectedQuality;
-      double sum;
-      int j;
+    protected override ScopeList Select(ScopeList scopes) {
+      int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
+      bool copy = CopySelectedParameter.Value.Value;
+      IRandom random = RandomParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      List<DoubleData> qualities = new List<DoubleData>(QualityParameter.ActualValue);
+      bool windowing = WindowingParameter.Value.Value;
+      ScopeList selected = new ScopeList();
 
-      GenerateQualitiesArray(source, maximization, qualityInfo, windowing, out qualities, out qualitySum);
-
-      // perform selection
-      for (int i = 0; i < selected; i++) {
-        selectedQuality = random.NextDouble() * qualitySum;
-        sum = 0;
-        j = 0;
-        while ((j < qualities.Length) && (sum <= selectedQuality)) {
-          sum += qualities[j];
-          j++;
-        }
-        IScope selectedScope = source.SubScopes[j - 1];
-        if (copySelected)
-          target.AddSubScope((IScope)selectedScope.Clone());
-        else {
-          source.RemoveSubScope(selectedScope);
-          target.AddSubScope(selectedScope);
-          GenerateQualitiesArray(source, maximization, qualityInfo, windowing, out qualities, out qualitySum);
+      // prepare qualities for proportional selection
+      double minQuality = qualities.Min(x => x.Value);
+      double maxQuality = qualities.Max(x => x.Value);
+      if (minQuality == maxQuality) {  // all quality values are equal
+        qualities.ForEach(x => x.Value = 1);
+      } else {
+        if (windowing) {
+          if (maximization)
+            qualities.ForEach(x => x.Value = x.Value - minQuality);
+          else
+            qualities.ForEach(x => x.Value = maxQuality - x.Value);
+        } else {
+          if (minQuality < 0.0) throw new InvalidOperationException("Proportional selection without windowing does not work with quality values < 0.");
+          if (!maximization) {
+            double limit = Math.Min(maxQuality * 2, double.MaxValue);
+            qualities.ForEach(x => x.Value = limit - x.Value);
+          }
         }
       }
-    }
 
-    /// <summary>
-    /// Calculates the qualities of the sub scopes of the given <paramref name="source"/>.
-    /// </summary>
-    /// <exception cref="InvalidOperationException">Thrown when the sub scopes are not sorted according
-    /// to their solution qualities or if the quality value is beyond zero and the <c>windowing</c>
-    /// flag is set to <c>false</c>.</exception>
-    /// <param name="source">The scource scope where to calculate the qualities.</param>
-    /// <param name="maximization">Boolean flag whether is a maximization problem.</param>
-    /// <param name="qualityInfo">The quality variable info.</param>
-    /// <param name="windowing">Boolean flag whether the windowing strategy shall be applied.</param>
-    /// <param name="qualities">Output parameter; contains all qualities of the sub scopes.</param>
-    /// <param name="qualitySum">Output parameter; the sum of all qualities.</param>
-    private void GenerateQualitiesArray(IScope source, bool maximization, IVariableInfo qualityInfo, bool windowing, out double[] qualities, out double qualitySum) {
-      int subScopes = source.SubScopes.Count;
-      qualities = new double[subScopes];
-      qualitySum = 0;
-
-      if (subScopes < 1) throw new InvalidOperationException("No source scopes to select available.");
-
-      double best = source.SubScopes[0].GetVariableValue<DoubleData>(qualityInfo.FormalName, false).Data;
-      double worst = source.SubScopes[subScopes - 1].GetVariableValue<DoubleData>(qualityInfo.FormalName, false).Data;
-      double limit = Math.Min(worst * 2, double.MaxValue);
-      double min = Math.Min(best, worst);
-      double max = Math.Max(best, worst);
-      double solutionQuality;
-
-      // preprocess fitness values, apply windowing if desired
-      for (int i = 0; i < qualities.Length; i++) {
-        solutionQuality = source.SubScopes[i].GetVariableValue<DoubleData>(qualityInfo.FormalName, false).Data;
-        if (solutionQuality < min || solutionQuality > max) {
-          // something has obviously gone wrong here
-          string errorMessage = "There is a problem with the ordering of the source sub-scopes in " + Name + ".\r\n" +
-            "The quality of solution number " + i.ToString() + " is ";
-          if (solutionQuality < min) errorMessage += "below";
-          else errorMessage += "greater than";
-          errorMessage += " the calculated qualities range:\r\n";
-          errorMessage += solutionQuality.ToString() + " is outside the interval [ " + min.ToString() + " ; " + max.ToString() + " ].";
-          throw new InvalidOperationException(errorMessage);
+      double qualitySum = qualities.Sum(x => x.Value);
+      for (int i = 0; i < count; i++) {
+        double selectedQuality = random.NextDouble() * qualitySum;
+        int index = 0;
+        double currentQuality = qualities[index].Value;
+        while (currentQuality < selectedQuality) {
+          index++;
+          currentQuality += qualities[index].Value;
         }
-        if (best != worst) {  // prevent division by zero
-          if (windowing) {
-            if (!maximization) {
-              qualities[i] = 1 - ((solutionQuality - best) / (worst - best));
-            } else {
-              qualities[i] = (solutionQuality - worst) / (best - worst);
-            }
-          } else {
-            if (solutionQuality < 0.0) throw new InvalidOperationException("ERROR in ProportionalSelector: Non-windowing is not working with quality values < 0. Use windowing.");
-            if (!maximization) qualities[i] = limit - solutionQuality;
-            else qualities[i] = solutionQuality;
-          }
-        } else {  // best == worst -> all fitness values are equal
-          qualities[i] = 1;
+        if (copy)
+          selected.Add((IScope)scopes[index].Clone());
+        else {
+          selected.Add(scopes[index]);
+          scopes.RemoveAt(index);
+          qualitySum -= qualities[index].Value;
+          qualities.RemoveAt(index);
         }
-        qualitySum += qualities[i];
       }
-      if (double.IsInfinity(qualitySum)) qualitySum = double.MaxValue;
+      return selected;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs	(revision 2817)
@@ -36,18 +36,20 @@
     public RandomSelector() : base() { }
 
-    protected override void Select(ScopeList source, ScopeList target) {
+    protected override ScopeList Select(ScopeList scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
       IRandom random = RandomParameter.ActualValue;
+      ScopeList selected = new ScopeList();
 
       for (int i = 0; i < count; i++) {
         if (copy)
-          target.Add((IScope)source[random.Next(source.Count)].Clone());
+          selected.Add((IScope)scopes[random.Next(scopes.Count)].Clone());
         else {
-          int index = random.Next(source.Count);
-          target.Add(source[index]);
-          source.RemoveAt(index);
+          int index = random.Next(scopes.Count);
+          selected.Add(scopes[index]);
+          scopes.RemoveAt(index);
         }
       }
+      return selected;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs	(revision 2817)
+++ /trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs	(revision 2817)
@@ -0,0 +1,61 @@
+#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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Selection {
+  /// <summary>
+  /// A base class for reduction operators.
+  /// </summary>
+  [Item("Reducer", "A base class for reduction operators.")]
+  [EmptyStorableClass]
+  public abstract class Reducer : SingleSuccessorOperator {
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+
+    protected Reducer()
+      : base() {
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope from which sub-scopes should be selected."));
+    }
+
+    public sealed override IExecutionSequence Apply() {
+      ScopeList scopes = new ScopeList(CurrentScope.SubScopes);
+      ScopeList reduced = Reduce(scopes);
+
+      CurrentScope.SubScopes.Clear();
+      CurrentScope.SubScopes.AddRange(reduced);
+
+      return base.Apply();
+    }
+
+    protected abstract ScopeList Reduce(ScopeList scopes);
+  }
+}
Index: unk/sources/HeuristicLab.Selection/3.3/ReducerBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/ReducerBase.cs	(revision 2816)
+++ 	(revision )
@@ -1,59 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Operators;
-
-namespace HeuristicLab.Selection {
-  /// <summary>
-  /// Base class for all reducers.
-  /// </summary>
-  public abstract class ReducerBase : OperatorBase {
-    /// <summary>
-    /// Reduces the given <paramref name="scope"/> so that it contains in the end only the reduced
-    /// elements.
-    /// </summary>
-    /// <remarks>Calls <see cref="Reduce"/>.</remarks>
-    /// <param name="scope">The scope to reduce.</param>
-    /// <returns><c>null</c>.</returns>
-    public override IOperation Apply(IScope scope) {
-      ICollection<IScope> subScopes = Reduce(scope);
-
-      while (scope.SubScopes.Count > 0)
-        scope.RemoveSubScope(scope.SubScopes[0]);
-
-      foreach (IScope s in subScopes)
-        scope.AddSubScope(s);
-
-      return null;
-    }
-
-    /// <summary>
-    /// Reduces the current <paramref name="scope"/>.
-    /// </summary>
-    /// <param name="scope">The scope to reduce.</param>
-    /// <returns>The reduced list of scopes, that should be kept.</returns>
-    protected abstract ICollection<IScope> Reduce(IScope scope);
-  }
-}
Index: /trunk/sources/HeuristicLab.Selection/3.3/RightReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/RightReducer.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/RightReducer.cs	(revision 2817)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -20,31 +20,24 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Text;
 using HeuristicLab.Core;
-using HeuristicLab.Operators;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Selection {
   /// <summary>
-  /// Takes only sub scopes from the right child of the tree.
+  /// An operator which reduces to the sub-scopes of the rightmost sub-scope of the current scope.
   /// </summary>
-  public class RightReducer : ReducerBase {
-    /// <inheritdoc select="summary"/>
-    public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
-    }
+  [Item("RightReducer", "An operator which reduces to the sub-scopes of the rightmost sub-scope of the current scope.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class RightReducer : Reducer {
+    public RightReducer() : base() { }
 
-    /// <summary>
-    /// Takes only the sub scopes from the right part of the tree.
-    /// </summary>
-    /// <param name="scope">The current scope.</param>
-    /// <returns>All sub scopes from the right sub scope of the tree.</returns>
-    protected override ICollection<IScope> Reduce(IScope scope) {
-      List<IScope> subScopes = new List<IScope>();
-
-      if (scope.SubScopes.Count > 0)
-        subScopes.AddRange(scope.SubScopes[scope.SubScopes.Count - 1].SubScopes);
-      return subScopes;
+    protected override ScopeList Reduce(ScopeList scopes) {
+      ScopeList reduced = new ScopeList();
+      if (scopes.Count > 0) reduced.AddRange(scopes[scopes.Count - 1].SubScopes);
+      return reduced;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs	(revision 2817)
@@ -36,19 +36,21 @@
     public RightSelector() : base() { }
 
-    protected override void Select(ScopeList source, ScopeList target) {
+    protected override ScopeList Select(ScopeList scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
+      ScopeList selected = new ScopeList();
 
-      int j = source.Count - 1;
+      int j = scopes.Count - 1;
       for (int i = 0; i < count; i++) {
         if (copy) {
-          target.Add((IScope)source[j].Clone());
+          selected.Add((IScope)scopes[j].Clone());
           j--;
-          if (j < 0) j = source.Count - 1;
+          if (j < 0) j = scopes.Count - 1;
         } else {
-          target.Add(source[source.Count - 1]);
-          source.RemoveAt(source.Count - 1);
+          selected.Add(scopes[scopes.Count - 1]);
+          scopes.RemoveAt(scopes.Count - 1);
         }
       }
+      return selected;
     }
   }
Index: /trunk/sources/HeuristicLab.Selection/3.3/Selector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2817)
@@ -60,24 +60,19 @@
 
     public sealed override IExecutionSequence Apply() {
-      ScopeList source = new ScopeList(CurrentScope.SubScopes);
-      ScopeList target = new ScopeList();
-
-      Select(source, target);
+      ScopeList scopes = new ScopeList(CurrentScope.SubScopes);
+      ScopeList selected = Select(scopes);
 
       CurrentScope.SubScopes.Clear();
-      IScope remaining = new Scope("Remaining");
-      CurrentScope.SubScopes.Add(remaining);
-      IScope selected = new Scope("Selected");
-      CurrentScope.SubScopes.Add(selected);
-
-      for (int i = 0; i < source.Count; i++)
-        remaining.SubScopes.Add(source[i]);
-      for (int i = 0; i < target.Count; i++)
-        selected.SubScopes.Add(target[i]);
+      IScope remainingScope = new Scope("Remaining");
+      remainingScope.SubScopes.AddRange(scopes);
+      CurrentScope.SubScopes.Add(remainingScope);
+      IScope selectedScope = new Scope("Selected");
+      selectedScope.SubScopes.AddRange(selected);
+      CurrentScope.SubScopes.Add(selectedScope);
 
       return base.Apply();
     }
 
-    protected abstract void Select(ScopeList source, ScopeList target);
+    protected abstract ScopeList Select(ScopeList scopes);
   }
 }
Index: /trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 2816)
+++ /trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 2817)
@@ -40,7 +40,8 @@
     public TournamentSelector() : base() {
       Parameters.Add(new ValueLookupParameter<IntData>("GroupSize", "The size of the tournament group.", new IntData(2)));
+      CopySelected.Value = true;
     }
 
-    protected override void Select(ScopeList source, ScopeList target) {
+    protected override ScopeList Select(ScopeList scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
@@ -49,10 +50,11 @@
       List<DoubleData> qualities = new List<DoubleData>(QualityParameter.ActualValue);
       int groupSize = GroupSizeParameter.ActualValue.Value;
+      ScopeList selected = new ScopeList();
 
       for (int i = 0; i < count; i++) {
-        int best = random.Next(source.Count);
+        int best = random.Next(scopes.Count);
         int index;
         for (int j = 1; j < groupSize; j++) {
-          index = random.Next(source.Count);
+          index = random.Next(scopes.Count);
           if (((maximization) && (qualities[index].Value > qualities[best].Value)) ||
               ((!maximization) && (qualities[index].Value < qualities[best].Value))) {
@@ -62,11 +64,12 @@
 
         if (copy)
-          target.Add((IScope)source[best].Clone());
+          selected.Add((IScope)scopes[best].Clone());
         else {
-          target.Add(source[best]);
-          source.RemoveAt(best);
+          selected.Add(scopes[best]);
+          scopes.RemoveAt(best);
           qualities.RemoveAt(best);
         }
       }
+      return selected;
     }
   }
