Index: /trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- /trunk/sources/HeuristicLab 3.3.sln	(revision 2829)
+++ /trunk/sources/HeuristicLab 3.3.sln	(revision 2830)
@@ -6,4 +6,5 @@
 		ConfigMerger.exe = ConfigMerger.exe
 		..\documentation\License\gpl-3.0.txt = ..\documentation\License\gpl-3.0.txt
+		HeuristicLab 3.3.vsmdi = HeuristicLab 3.3.vsmdi
 		LocalTestRun.testrunconfig = LocalTestRun.testrunconfig
 		PreBuildEvent.cmd = PreBuildEvent.cmd
@@ -149,5 +150,10 @@
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Routing.TSP.Views-3.3", "HeuristicLab.Routing.TSP.Views\3.3\HeuristicLab.Routing.TSP.Views-3.3.csproj", "{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SGA-3.3.Tests", "HeuristicLab.SGA\3.3\Tests\HeuristicLab.SGA-3.3.Tests.csproj", "{F42F3576-7233-4B28-90F7-36AE15F30F92}"
+EndProject
 Global
+	GlobalSection(TestCaseManagementSettings) = postSolution
+		CategoryFile = HeuristicLab 3.3.vsmdi
+	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -661,4 +667,12 @@
 		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Release|x64.ActiveCfg = Release|Any CPU
 		{DF2E61C4-A76D-4315-9D0B-53A077B1AC2C}.Release|x86.ActiveCfg = Release|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Release|x64.ActiveCfg = Release|Any CPU
+		{F42F3576-7233-4B28-90F7-36AE15F30F92}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /trunk/sources/HeuristicLab 3.3.vsmdi
===================================================================
--- /trunk/sources/HeuristicLab 3.3.vsmdi	(revision 2830)
+++ /trunk/sources/HeuristicLab 3.3.vsmdi	(revision 2830)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="UTF-8"?>
+<TestLists xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2006">
+  <TestList name="Lists of Tests" id="8c43106b-9dc1-4907-a29f-aa66a61bf5b6">
+    <RunConfiguration id="f9392825-866f-4434-be36-358db28f0c59" name="Local Test Run" storage="localtestrun.testrunconfig" type="Microsoft.VisualStudio.TestTools.Common.TestRunConfiguration, Microsoft.VisualStudio.QualityTools.Common,   PublicKeyToken=b03f5f7f11d50a3a" />
+  </TestList>
+</TestLists>
Index: /trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 2830)
@@ -68,9 +68,7 @@
     public ObservableArray(T[] array) {
       this.array = (T[])array.Clone();
-      OnCollectionReset(GetIndexedItems(), new IndexedItem<T>[0]);
     }
     public ObservableArray(IEnumerable<T> collection) {
       array = collection.ToArray();
-      OnCollectionReset(GetIndexedItems(), new IndexedItem<T>[0]);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 2830)
@@ -59,5 +59,4 @@
     public ObservableCollection(IEnumerable<T> collection) {
       list = new List<T>(collection);
-      OnItemsAdded(collection);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs
===================================================================
--- /trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 2830)
@@ -79,5 +79,4 @@
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary) {
       dict = new Dictionary<TKey, TValue>(dictionary);
-      OnItemsAdded(dictionary);
     }
     public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer) {
@@ -86,5 +85,4 @@
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(dictionary, comparer);
-      OnItemsAdded(dictionary);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs	(revision 2830)
@@ -66,5 +66,4 @@
       foreach (TItem item in collection)
         dict.Add(GetKeyForItem(item), item);
-      OnItemsAdded(collection);
     }
     protected ObservableKeyedCollection(int capacity, IEqualityComparer<TKey> comparer) {
@@ -76,5 +75,4 @@
       foreach (TItem item in collection)
         dict.Add(GetKeyForItem(item), item);
-      OnItemsAdded(collection);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 2830)
@@ -73,6 +73,4 @@
     public ObservableList(IEnumerable<T> collection) {
       list = new List<T>(collection);
-      OnItemsAdded(GetIndexedItems());
-      OnItemsAdded(collection);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs
===================================================================
--- /trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs	(revision 2830)
@@ -51,5 +51,4 @@
     public ObservableSet(IEnumerable<T> collection) {
       set = new HashSet<T>(collection);
-      OnItemsAdded(this);
     }
     public ObservableSet(IEqualityComparer<T> comparer) {
@@ -58,5 +57,4 @@
     public ObservableSet(IEnumerable<T> collection, IEqualityComparer<T> comparer) {
       set = new HashSet<T>(collection, comparer);
-      OnItemsAdded(this);
     }
     #endregion
Index: /trunk/sources/HeuristicLab.Core/3.3/DeepCloneable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/DeepCloneable.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/DeepCloneable.cs	(revision 2830)
@@ -21,7 +21,4 @@
 
 using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
Index: /trunk/sources/HeuristicLab.Core/3.3/Item.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Item.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/Item.cs	(revision 2830)
@@ -20,13 +20,7 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Text;
-using System.Xml;
 using System.Drawing;
-using System.Resources;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common.Resources;
 
 namespace HeuristicLab.Core {
@@ -61,5 +55,5 @@
     protected virtual void OnChanged(ChangedEventArgs e) {
       if ((e.RegisterChangedObject(this)) && (Changed != null))
-          Changed(this, e);
+        Changed(this, e);
     }
   }
Index: /trunk/sources/HeuristicLab.Core/3.3/ItemArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ItemArray.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/ItemArray.cs	(revision 2830)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using System.Collections;
 using System.Collections.Generic;
@@ -55,6 +56,12 @@
     public ItemArray() : base() { }
     public ItemArray(int length) : base(length) { }
-    public ItemArray(T[] array) : base(array) { }
-    public ItemArray(IEnumerable<T> collection) : base(collection) { }
+    public ItemArray(T[] array) : base(array) {
+      foreach (T item in this)
+        item.Changed += new ChangedEventHandler(Item_Changed);
+    }
+    public ItemArray(IEnumerable<T> collection) : base(collection) {
+      foreach (T item in this)
+        item.Changed += new ChangedEventHandler(Item_Changed);
+    }
 
     public object Clone() {
@@ -62,9 +69,6 @@
     }
 
-    public IDeepCloneable Clone(Cloner cloner) {
-      T[] items = new T[Length];
-      for (int i = 0; i < items.Length; i++)
-        items[i] = (T)cloner.Clone(this[i]);
-      ItemArray<T> clone = (ItemArray<T>)Activator.CreateInstance(this.GetType(), new object[] { items });
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      ItemArray<T> clone = (ItemArray<T>)Activator.CreateInstance(this.GetType(), this.Select(x => (T)cloner.Clone(x)));
       cloner.RegisterClonedObject(this, clone);
       return clone;
Index: /trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs	(revision 2830)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using System.Collections;
 using System.Collections.Generic;
@@ -56,5 +57,8 @@
     public ItemCollection() : base() { }
     public ItemCollection(int capacity) : base(capacity) { }
-    public ItemCollection(IEnumerable<T> collection) : base(collection) { }
+    public ItemCollection(IEnumerable<T> collection) : base(collection) {
+      foreach (T item in this)
+        item.Changed += new ChangedEventHandler(Item_Changed);
+    }
 
     public object Clone() {
@@ -62,9 +66,6 @@
     }
 
-    public IDeepCloneable Clone(Cloner cloner) {
-      List<T> items = new List<T>();
-      foreach (T item in this)
-        items.Add((T)cloner.Clone(item));
-      ItemCollection<T> clone = (ItemCollection<T>)Activator.CreateInstance(this.GetType(), items);
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      ItemCollection<T> clone = (ItemCollection<T>)Activator.CreateInstance(this.GetType(), this.Select(x => (T)cloner.Clone(x)));
       cloner.RegisterClonedObject(this, clone);
       return clone;
Index: /trunk/sources/HeuristicLab.Core/3.3/ItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ItemList.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/ItemList.cs	(revision 2830)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using System.Collections;
 using System.Collections.Generic;
@@ -56,5 +57,8 @@
     public ItemList() : base() { }
     public ItemList(int capacity) : base(capacity) { }
-    public ItemList(IEnumerable<T> collection) : base(collection) { }
+    public ItemList(IEnumerable<T> collection) : base(collection) {
+      foreach (T item in this)
+        item.Changed += new ChangedEventHandler(Item_Changed);
+    }
 
     public object Clone() {
@@ -62,9 +66,6 @@
     }
 
-    public IDeepCloneable Clone(Cloner cloner) {
-      List<T> items = new List<T>();
-      foreach (T item in this)
-        items.Add((T)cloner.Clone(item));
-      ItemList<T> clone = (ItemList<T>)Activator.CreateInstance(this.GetType(), items);
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      ItemList<T> clone = (ItemList<T>)Activator.CreateInstance(this.GetType(), this.Select(x => (T)cloner.Clone(x)));
       cloner.RegisterClonedObject(this, clone);
       return clone;
Index: /trunk/sources/HeuristicLab.Core/3.3/ItemSet.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ItemSet.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/ItemSet.cs	(revision 2830)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using System.Collections;
 using System.Collections.Generic;
@@ -55,5 +56,8 @@
 
     public ItemSet() : base() { }
-    public ItemSet(IEnumerable<T> collection) : base(collection) { }
+    public ItemSet(IEnumerable<T> collection) : base(collection) {
+      foreach (T item in this)
+        item.Changed += new ChangedEventHandler(Item_Changed);
+    }
 
     public object Clone() {
@@ -61,9 +65,6 @@
     }
 
-    public IDeepCloneable Clone(Cloner cloner) {
-      List<T> items = new List<T>();
-      foreach (T item in this)
-        items.Add((T)cloner.Clone(item));
-      ItemSet<T> clone = (ItemSet<T>)Activator.CreateInstance(this.GetType(), items);
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      ItemSet<T> clone = (ItemSet<T>)Activator.CreateInstance(this.GetType(), this.Select(x => (T)cloner.Clone(x)));
       cloner.RegisterClonedObject(this, clone);
       return clone;
Index: /trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs	(revision 2830)
@@ -74,6 +74,6 @@
     /// </summary>
     protected NamedItem() {
-      name = ItemName;
-      description = ItemDescription;
+      name = string.Empty;
+      description = string.Empty;
     }
     /// <summary>
@@ -83,11 +83,12 @@
     /// <param name="name">The name of the current instance.</param>
     /// <param name="value">The value of the current instance.</param>
-    protected NamedItem(string name)
-      : this() {
+    protected NamedItem(string name) {
       if (name == null) throw new ArgumentNullException();
       this.name = name;
+      description = string.Empty;
     }
-    protected NamedItem(string name, string description)
-      : this(name) {
+    protected NamedItem(string name, string description) {
+      if (name == null) throw new ArgumentNullException();
+      this.name = name;
       this.description = description;
     }
Index: /trunk/sources/HeuristicLab.Core/3.3/NamedItemCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/NamedItemCollection.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/NamedItemCollection.cs	(revision 2830)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Linq;
 using System.Collections.Generic;
 using System.Drawing;
@@ -43,25 +44,18 @@
     private object RestoreEvents {
       get { return null; }
-      set {
-        foreach (T item in this) {
-          item.NameChanging += new EventHandler<CancelEventArgs<string>>(Item_NameChanging);
-          item.NameChanged += new EventHandler(Item_NameChanged);
-          item.Changed += new ChangedEventHandler(Item_Changed);
-        }
-      }
+      set { RegisterItemEvents(this); }
     }
 
     public NamedItemCollection() : base() { }
     public NamedItemCollection(int capacity) : base(capacity) { }
-    public NamedItemCollection(IEnumerable<T> collection) : base(collection) { }
+    public NamedItemCollection(IEnumerable<T> collection) : base(collection) {
+      RegisterItemEvents(this);
+    }
 
     public object Clone() {
       return Clone(new Cloner());
     }
-    public IDeepCloneable Clone(Cloner cloner) {
-      List<T> items = new List<T>();
-      foreach (T item in this)
-        items.Add((T)cloner.Clone(item));
-      NamedItemCollection<T> clone = (NamedItemCollection<T>)Activator.CreateInstance(this.GetType(), items);
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      NamedItemCollection<T> clone = (NamedItemCollection<T>)Activator.CreateInstance(this.GetType(), this.Select(x => (T)cloner.Clone(x)));
       cloner.RegisterClonedObject(this, clone);
       return clone;
@@ -86,17 +80,9 @@
 
     protected override void OnItemsAdded(IEnumerable<T> items) {
-      foreach (T item in items) {
-        item.NameChanging += new EventHandler<CancelEventArgs<string>>(Item_NameChanging);
-        item.NameChanged += new EventHandler(Item_NameChanged);
-        item.Changed += new ChangedEventHandler(Item_Changed);
-      }
+      RegisterItemEvents(items);
       base.OnItemsAdded(items);
     }
     protected override void OnItemsRemoved(IEnumerable<T> items) {
-      foreach (T item in items) {
-        item.NameChanging -= new EventHandler<CancelEventArgs<string>>(Item_NameChanging);
-        item.NameChanged -= new EventHandler(Item_NameChanged);
-        item.Changed -= new ChangedEventHandler(Item_Changed);
-      }
+      DeregisterItemEvents(items);
       base.OnItemsRemoved(items);
     }
@@ -108,9 +94,14 @@
     #endregion
     protected override void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      foreach (T oldItem in oldItems) {
-        oldItem.NameChanging -= new EventHandler<CancelEventArgs<string>>(Item_NameChanging);
-        oldItem.NameChanged -= new EventHandler(Item_NameChanged);
-        oldItem.Changed -= new ChangedEventHandler(Item_Changed);
-      }
+      DeregisterItemEvents(oldItems);
+      RegisterItemEvents(items);
+      base.OnCollectionReset(items, oldItems);
+    }
+    protected override void OnPropertyChanged(string propertyName) {
+      base.OnPropertyChanged(propertyName);
+      OnChanged();
+    }
+
+    private void RegisterItemEvents(IEnumerable<T> items) {
       foreach (T item in items) {
         item.NameChanging += new EventHandler<CancelEventArgs<string>>(Item_NameChanging);
@@ -118,9 +109,11 @@
         item.Changed += new ChangedEventHandler(Item_Changed);
       }
-      base.OnCollectionReset(items, oldItems);
     }
-    protected override void OnPropertyChanged(string propertyName) {
-      base.OnPropertyChanged(propertyName);
-      OnChanged();
+    private void DeregisterItemEvents(IEnumerable<T> items) {
+      foreach (T item in items) {
+        item.NameChanging -= new EventHandler<CancelEventArgs<string>>(Item_NameChanging);
+        item.NameChanged -= new EventHandler(Item_NameChanged);
+        item.Changed -= new ChangedEventHandler(Item_Changed);
+      }
     }
 
Index: /trunk/sources/HeuristicLab.Core/3.3/Scope.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 2830)
@@ -20,10 +20,6 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
+using HeuristicLab.Collections;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Collections;
 
 namespace HeuristicLab.Core {
@@ -99,7 +95,6 @@
       clone.Name = Name;
       clone.Description = Description;
-      clone.parent = (IScope)cloner.Clone(parent);
-      clone.Variables = (VariableCollection)cloner.Clone(variables);
-      clone.SubScopes = (ScopeList)cloner.Clone(subScopes);
+      if (variables.Count > 0) clone.Variables = (VariableCollection)cloner.Clone(variables);
+      if (subScopes.Count > 0) clone.SubScopes = (ScopeList)cloner.Clone(subScopes);
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs	(revision 2830)
@@ -20,13 +20,7 @@
 #endregion
 
-using System;
-using System.Collections;
 using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Text;
-using System.Drawing;
+using System.Linq;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common.Resources;
-using HeuristicLab.Collections;
 
 namespace HeuristicLab.Core {
@@ -34,8 +28,14 @@
   [Item("ScopeList", "Represents a list of scopes.")]
   [Creatable("Test")]
-  public class ScopeList : ItemList<IScope> {
+  public sealed class ScopeList : ItemList<IScope> {
     public ScopeList() : base() { }
     public ScopeList(int capacity) : base(capacity) { }
     public ScopeList(IEnumerable<IScope> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      ScopeList clone = new ScopeList(this.Select(x => (IScope)cloner.Clone(x)));
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Core/3.3/Variable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 2830)
@@ -53,5 +53,5 @@
     public Variable()
       : base("Anonymous") {
-      Value = null;
+      this.value = null;
     }
     /// <summary>
@@ -61,7 +61,21 @@
     /// <param name="name">The name of the current instance.</param>
     /// <param name="value">The value of the current instance.</param>
+    public Variable(string name)
+      : base(name) {
+      this.value = null;
+    }
+    public Variable(string name, string description)
+      : base(name, description) {
+      this.value = null;
+    }
     public Variable(string name, IItem value)
       : base(name) {
-      Value = value;
+      this.value = value;
+      this.value.Changed += new ChangedEventHandler(Value_Changed);
+    }
+    public Variable(string name, string description, IItem value)
+      : base(name, description) {
+      this.value = value;
+      this.value.Changed += new ChangedEventHandler(Value_Changed);
     }
 
@@ -72,9 +86,6 @@
     /// <returns>The cloned object as <see cref="Variable"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      Variable clone = new Variable();
+      Variable clone = new Variable(Name, Description, (IItem)cloner.Clone(value));
       cloner.RegisterClonedObject(this, clone);
-      clone.Name = Name;
-      clone.Description = Description;
-      clone.Value = (IItem)cloner.Clone(value);
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs	(revision 2830)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,8 +28,14 @@
   [Item("VariableCollection", "Represents a collection of variables.")]
   [Creatable("Test")]
-  public class VariableCollection : NamedItemCollection<IVariable> {
+  public sealed class VariableCollection : NamedItemCollection<IVariable> {
     public VariableCollection() : base() { }
     public VariableCollection(int capacity) : base(capacity) { }
     public VariableCollection(IEnumerable<IVariable> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      VariableCollection clone = new VariableCollection(this.Select(x => (IVariable)cloner.Clone(x)));
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Evolutionary/3.3/HeuristicLab.Evolutionary-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/3.3/HeuristicLab.Evolutionary-3.3.csproj	(revision 2829)
+++ /trunk/sources/HeuristicLab.Evolutionary/3.3/HeuristicLab.Evolutionary-3.3.csproj	(revision 2830)
@@ -82,4 +82,5 @@
   <ItemGroup>
     <None Include="HeuristicLabEvolutionaryPlugin.cs.frame" />
+    <Compile Include="PopulationCreator.cs" />
     <Compile Include="HeuristicLabEvolutionaryPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: /trunk/sources/HeuristicLab.Evolutionary/3.3/PopulationCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Evolutionary/3.3/PopulationCreator.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.Evolutionary/3.3/PopulationCreator.cs	(revision 2830)
@@ -0,0 +1,80 @@
+﻿#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.Evolutionary {
+  /// <summary>
+  /// An operator which creates a new population of solutions.
+  /// </summary>
+  [Item("PopulationCreator", "An operator which creates a new population of solutions.")]
+  [EmptyStorableClass]
+  [Creatable("Test")]
+  public sealed class PopulationCreator : SingleSuccessorOperator {
+    public ValueLookupParameter<IntData> PopulationSizeParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["PopulationSize"]; }
+    }
+    public ValueLookupParameter<IOperator> SolutionCreatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["SolutionCreator"]; }
+    }
+    public ValueLookupParameter<IOperator> SolutionEvaluatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["SolutionEvaluator"]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+
+    public PopulationCreator()
+      : base() {
+      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 ScopeParameter("CurrentScope", "The current scope which represents the population."));
+    }
+
+    public override IExecutionSequence Apply() {
+      int size = PopulationSizeParameter.ActualValue.Value;
+      IOperator creator = SolutionCreatorParameter.ActualValue;
+      IOperator evaluator = SolutionEvaluatorParameter.ActualValue;
+
+      if (CurrentScope.SubScopes.Count > 0) throw new InvalidOperationException("Population is not empty. PopulationCreator cannot be applied on scopes which already contain sub-scopes.");
+
+      for (int i = 0; i < size; i++)
+        CurrentScope.SubScopes.Add(new Scope(i.ToString()));
+
+      ExecutionContextCollection next = new ExecutionContextCollection();
+      for (int i = 0; i < CurrentScope.SubScopes.Count; i++) {
+        if (creator != null) next.Add(ExecutionContext.CreateContext(creator, CurrentScope.SubScopes[i]));
+        if (evaluator != null) next.Add(ExecutionContext.CreateContext(evaluator, CurrentScope.SubScopes[i]));
+      }
+      next.Add(base.Apply());
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Views/3.3/AlgorithmOperatorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Views/3.3/AlgorithmOperatorView.Designer.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.Operators.Views/3.3/AlgorithmOperatorView.Designer.cs	(revision 2830)
@@ -0,0 +1,158 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Operators.Views {
+  partial class AlgorithmOperatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.operatorGraphViewHost = new HeuristicLab.Core.Views.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.operatorGraphTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(414, 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(414, 86);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Controls.Add(this.operatorGraphTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 118);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(486, 364);
+      this.tabControl.TabIndex = 4;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(478, 338);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection";
+      this.parameterCollectionView.Content = null;
+      this.parameterCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.Size = new System.Drawing.Size(466, 326);
+      this.parameterCollectionView.TabIndex = 0;
+      // 
+      // operatorGraphTabPage
+      // 
+      this.operatorGraphTabPage.Controls.Add(this.operatorGraphViewHost);
+      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
+      this.operatorGraphTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(478, 338);
+      this.operatorGraphTabPage.TabIndex = 1;
+      this.operatorGraphTabPage.Text = "Operator Graph";
+      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
+      // 
+      // 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(6, 6);
+      this.operatorGraphViewHost.Name = "operatorGraphViewHost";
+      this.operatorGraphViewHost.Size = new System.Drawing.Size(466, 326);
+      this.operatorGraphViewHost.TabIndex = 0;
+      this.operatorGraphViewHost.ViewType = null;
+      // 
+      // AlgorithmOperatorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "AlgorithmOperatorView";
+      this.Size = new System.Drawing.Size(486, 482);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.operatorGraphTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TabControl tabControl;
+    protected System.Windows.Forms.TabPage parametersTabPage;
+    protected System.Windows.Forms.TabPage operatorGraphTabPage;
+    protected HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
+    protected HeuristicLab.Core.Views.ViewHost operatorGraphViewHost;
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators.Views/3.3/AlgorithmOperatorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Views/3.3/AlgorithmOperatorView.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.Operators.Views/3.3/AlgorithmOperatorView.cs	(revision 2830)
@@ -0,0 +1,65 @@
+#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.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Operators.Views { 
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [Content(typeof(CombinedOperator), true)]
+  public partial class AlgorithmOperatorView : NamedItemView {
+    public new AlgorithmOperator Content {
+      get { return (AlgorithmOperator)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public AlgorithmOperatorView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
+    /// </summary>
+    /// <param name="item">The item that should be displayed.</param>
+    public AlgorithmOperatorView(AlgorithmOperator content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        parameterCollectionView.Content = null;
+        operatorGraphViewHost.Content = null;
+        tabControl.Enabled = false;
+      } else {
+        parameterCollectionView.Content = ((IOperator)Content).Parameters;
+        operatorGraphViewHost.Content = Content.OperatorGraph;
+        tabControl.Enabled = true;
+      }
+    }
+  }
+}
Index: unk/sources/HeuristicLab.Operators.Views/3.3/CombinedOperatorView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Views/3.3/CombinedOperatorView.Designer.cs	(revision 2829)
+++ 	(revision )
@@ -1,158 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.Operators.Views {
-  partial class CombinedOperatorView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.parametersTabPage = new System.Windows.Forms.TabPage();
-      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
-      this.operatorGraphTabPage = new System.Windows.Forms.TabPage();
-      this.operatorGraphViewHost = new HeuristicLab.Core.Views.ViewHost();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.tabControl.SuspendLayout();
-      this.parametersTabPage.SuspendLayout();
-      this.operatorGraphTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(414, 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(414, 86);
-      // 
-      // tabControl
-      // 
-      this.tabControl.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.tabControl.Controls.Add(this.parametersTabPage);
-      this.tabControl.Controls.Add(this.operatorGraphTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 118);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(486, 364);
-      this.tabControl.TabIndex = 4;
-      // 
-      // parametersTabPage
-      // 
-      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
-      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
-      this.parametersTabPage.Name = "parametersTabPage";
-      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.parametersTabPage.Size = new System.Drawing.Size(478, 338);
-      this.parametersTabPage.TabIndex = 0;
-      this.parametersTabPage.Text = "Parameters";
-      this.parametersTabPage.UseVisualStyleBackColor = true;
-      // 
-      // parameterCollectionView
-      // 
-      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection";
-      this.parameterCollectionView.Content = null;
-      this.parameterCollectionView.Location = new System.Drawing.Point(6, 6);
-      this.parameterCollectionView.Name = "parameterCollectionView";
-      this.parameterCollectionView.Size = new System.Drawing.Size(466, 326);
-      this.parameterCollectionView.TabIndex = 0;
-      // 
-      // operatorGraphTabPage
-      // 
-      this.operatorGraphTabPage.Controls.Add(this.operatorGraphViewHost);
-      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
-      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
-      this.operatorGraphTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.operatorGraphTabPage.Size = new System.Drawing.Size(478, 338);
-      this.operatorGraphTabPage.TabIndex = 1;
-      this.operatorGraphTabPage.Text = "Operator Graph";
-      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
-      // 
-      // 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(6, 6);
-      this.operatorGraphViewHost.Name = "operatorGraphViewHost";
-      this.operatorGraphViewHost.Size = new System.Drawing.Size(466, 326);
-      this.operatorGraphViewHost.TabIndex = 0;
-      this.operatorGraphViewHost.ViewType = null;
-      // 
-      // CombinedOperatorView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Name = "CombinedOperatorView";
-      this.Size = new System.Drawing.Size(486, 482);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.tabControl.ResumeLayout(false);
-      this.parametersTabPage.ResumeLayout(false);
-      this.operatorGraphTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    protected System.Windows.Forms.TabControl tabControl;
-    protected System.Windows.Forms.TabPage parametersTabPage;
-    protected System.Windows.Forms.TabPage operatorGraphTabPage;
-    protected HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
-    protected HeuristicLab.Core.Views.ViewHost operatorGraphViewHost;
-  }
-}
Index: unk/sources/HeuristicLab.Operators.Views/3.3/CombinedOperatorView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Views/3.3/CombinedOperatorView.cs	(revision 2829)
+++ 	(revision )
@@ -1,65 +1,0 @@
-#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.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Operators.Views { 
-  /// <summary>
-  /// The base class for visual representations of items.
-  /// </summary>
-  [Content(typeof(CombinedOperator), true)]
-  public partial class CombinedOperatorView : NamedItemView {
-    public new CombinedOperator Content {
-      get { return (CombinedOperator)base.Content; }
-      set { base.Content = value; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="ItemBaseView"/>.
-    /// </summary>
-    public CombinedOperatorView() {
-      InitializeComponent();
-    }
-    /// <summary>
-    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
-    /// </summary>
-    /// <param name="item">The item that should be displayed.</param>
-    public CombinedOperatorView(CombinedOperator content)
-      : this() {
-      Content = content;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        parameterCollectionView.Content = null;
-        operatorGraphViewHost.Content = null;
-        tabControl.Enabled = false;
-      } else {
-        parameterCollectionView.Content = ((IOperator)Content).Parameters;
-        operatorGraphViewHost.Content = Content.OperatorGraph;
-        tabControl.Enabled = true;
-      }
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Operators.Views/3.3/HeuristicLab.Operators.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Views/3.3/HeuristicLab.Operators.Views-3.3.csproj	(revision 2829)
+++ /trunk/sources/HeuristicLab.Operators.Views/3.3/HeuristicLab.Operators.Views-3.3.csproj	(revision 2830)
@@ -68,9 +68,9 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="CombinedOperatorView.cs">
+    <Compile Include="AlgorithmOperatorView.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="CombinedOperatorView.Designer.cs">
-      <DependentUpon>CombinedOperatorView.cs</DependentUpon>
+    <Compile Include="AlgorithmOperatorView.Designer.cs">
+      <DependentUpon>AlgorithmOperatorView.cs</DependentUpon>
     </Compile>
     <None Include="HeuristicLabOperatorsViewsPlugin.cs.frame" />
Index: /trunk/sources/HeuristicLab.Operators/3.3/AlgorithmOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/AlgorithmOperator.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.Operators/3.3/AlgorithmOperator.cs	(revision 2830)
@@ -0,0 +1,59 @@
+#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.Drawing;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// An operator which represents an algorithm represented as an operator graph.
+  /// </summary>
+  [Item("AlgorithmOperator", "An operator which represents an algorithm represented as an operator graph.")]
+  public abstract class AlgorithmOperator : SingleSuccessorOperator {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Module; }
+    }
+    [Storable]
+    private OperatorGraph operatorGraph;
+    public OperatorGraph OperatorGraph {
+      get { return operatorGraph; }
+    }
+
+    protected AlgorithmOperator()
+      : base() {
+      operatorGraph = new OperatorGraph();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      AlgorithmOperator clone = (AlgorithmOperator)base.Clone(cloner);
+      clone.operatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
+      return clone;
+    }
+
+    public override IExecutionSequence Apply() {
+      ExecutionContextCollection next = new ExecutionContextCollection(base.Apply());
+      if (operatorGraph.InitialOperator != null)
+        next.Insert(0, ExecutionContext.CreateChildContext(operatorGraph.InitialOperator));
+      return next;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 2830)
@@ -27,17 +27,9 @@
 namespace HeuristicLab.Operators {
   /// <summary>
-  /// Operator which contains an operator graph.
+  /// An operator which contains an operator graph.
   /// </summary>
   [Item("CombinedOperator", "An operator which contains an operator graph.")]
   [Creatable("Test")]
-  public sealed class CombinedOperator : SingleSuccessorOperator, IOperator {
-    public override Image ItemImage {
-      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Module; }
-    }
-    [Storable]
-    private OperatorGraph operatorGraph;
-    public OperatorGraph OperatorGraph {
-      get { return operatorGraph; }
-    }
+  public sealed class CombinedOperator : AlgorithmOperator, IOperator {
     public new ParameterCollection Parameters {
       get {
@@ -52,21 +44,5 @@
     }
 
-    public CombinedOperator()
-      : base() {
-      operatorGraph = new OperatorGraph();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      CombinedOperator clone = (CombinedOperator)base.Clone(cloner);
-      clone.operatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
-      return clone;
-    }
-
-    public override IExecutionSequence Apply() {
-      ExecutionContextCollection next = new ExecutionContextCollection(base.Apply());
-      if (operatorGraph.InitialOperator != null)
-        next.Insert(0, ExecutionContext.CreateChildContext(operatorGraph.InitialOperator));
-      return next;
-    }
+    public CombinedOperator() : base() { }
   }
 }
Index: /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2829)
+++ /trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2830)
@@ -90,4 +90,5 @@
     <Compile Include="Comparator.cs" />
     <Compile Include="Assigner.cs" />
+    <Compile Include="AlgorithmOperator.cs" />
     <Compile Include="MultipleCallsOperator.cs" />
     <Compile Include="Operator.cs" />
Index: /trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs	(revision 2830)
@@ -39,5 +39,5 @@
         inner.Parallel = true;
         for (int i = 0; (i < ExecutionContext.Scope.SubScopes.Count) && (i < Operators.Count); i++)
-          inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
+          if (Operators[i] != null) inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
         next.Insert(0, inner);
       }
Index: /trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs	(revision 2830)
@@ -38,5 +38,5 @@
         ExecutionContextCollection inner = new ExecutionContextCollection();
         for (int i = 0; (i < ExecutionContext.Scope.SubScopes.Count) && (i < Operators.Count); i++)
-          inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
+          if (Operators[i] != null) inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
         next.Insert(0, inner);
       }
Index: /trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs	(revision 2830)
@@ -27,15 +27,23 @@
 namespace HeuristicLab.Operators {
   /// <summary>
-  /// An operator which removes one specified or (if not specified) all sub-scopes from the current scope.
+  /// An operator which removes all sub-scopes or one specified sub-scope from the current scope.
   /// </summary>
-  [Item("SubScopesRemover", "An operator which removes one specified or (if not specified) all sub-scopes from the current scope.")]
+  [Item("SubScopesRemover", "An operator which removes all sub-scopes or one specified sub-scope from the current scope.")]
   [EmptyStorableClass]
   [Creatable("Test")]
-  public class SubScopesRemover : SingleSuccessorOperator {
+  public sealed class SubScopesRemover : SingleSuccessorOperator {
+    private ValueParameter<BoolData> RemoveAllSubScopesParameter {
+      get { return (ValueParameter<BoolData>)Parameters["RemoveAllSubScopes"]; }
+    }
     public ValueLookupParameter<IntData> SubScopeIndexParameter {
       get { return (ValueLookupParameter<IntData>)Parameters["SubScopeIndex"]; }
     }
-    protected ScopeParameter CurrentScopeParameter {
+    private ScopeParameter CurrentScopeParameter {
       get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public bool RemoveAllSubScopes {
+      get { return RemoveAllSubScopesParameter.Value.Value; }
+      set { RemoveAllSubScopesParameter.Value.Value = value; }
     }
     public IScope CurrentScope {
@@ -45,14 +53,15 @@
     public SubScopesRemover()
       : base() {
-      Parameters.Add(new ValueLookupParameter<IntData>("SubScopeIndex", "The index of the sub-scope which should be removed. If this parameter has no value, all sub-scopes of the current scope are removed."));
+      Parameters.Add(new ValueParameter<BoolData>("RemoveAllSubScopes", "True if all sub-scopes of the current scope should be removed, otherwise false.", new BoolData(true)));
+      Parameters.Add(new ValueLookupParameter<IntData>("SubScopeIndex", "The index of the sub-scope which should be removed. This parameter is ignored, if RemoveAllSubScopes is true."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope from which one or all sub-scopes should be removed."));
     }
 
     public override IExecutionSequence Apply() {
-      IntData index = SubScopeIndexParameter.ActualValue;
-      if (index != null)
-        CurrentScope.SubScopes.RemoveAt(index.Value);
-      else
+      if (RemoveAllSubScopes)
         CurrentScope.SubScopes.Clear();
+      else {
+        CurrentScope.SubScopes.RemoveAt(SubScopeIndexParameter.ActualValue.Value);
+      }
       return base.Apply();
     }
Index: /trunk/sources/HeuristicLab.Permutation/3.3/CyclicCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/CyclicCrossover.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/CyclicCrossover.cs	(revision 2830)
@@ -54,5 +54,5 @@
       if (parent1.Length != parent2.Length) throw new ArgumentException("CyclicCrossover: The parent permutations are of unequal length");
       int length = parent1.Length;
-      Permutation result = new Permutation(length);
+      int[] result = new int[length];
       bool[] indexCopied = new bool[length];
       int[] invParent1 = new int[length];
@@ -89,5 +89,5 @@
       } while (j < length);
 
-      return result;
+      return new Permutation(result);
     }
 
Index: /trunk/sources/HeuristicLab.Permutation/3.3/InversionManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/InversionManipulator.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/InversionManipulator.cs	(revision 2830)
@@ -31,5 +31,4 @@
   [Creatable("Test")]
   public class InversionManipulator : PermutationManipulator {
-
     /// <summary>
     /// Inverts a randomly chosen part of a permutation.
@@ -38,18 +37,18 @@
     /// <param name="permutation">The permutation to manipulate.</param>
     /// <returns>The new manipulated permutation.</returns>
-    public static Permutation Apply(IRandom random, Permutation permutation) {
-      Permutation result = (Permutation)permutation.Clone();
+    public static void Apply(IRandom random, Permutation permutation) {
       int breakPoint1, breakPoint2;
 
-      breakPoint1 = random.Next(result.Length - 1);
+      breakPoint1 = random.Next(permutation.Length - 1);
       do {
-        breakPoint2 = random.Next(result.Length - 1);
+        breakPoint2 = random.Next(permutation.Length - 1);
       } while (breakPoint2 == breakPoint1);
       if (breakPoint2 < breakPoint1) { int h = breakPoint1; breakPoint1 = breakPoint2; breakPoint2 = h; }
 
-      for (int i = 0; i <= (breakPoint2 - breakPoint1); i++) {  // invert permutation between breakpoints
-        result[breakPoint1 + i] = permutation[breakPoint2 - i];
+      for (int i = 0; i <= (breakPoint2 - breakPoint1) / 2; i++) {  // invert permutation between breakpoints
+        int temp = permutation[breakPoint1 + i];
+        permutation[breakPoint1 + i] = permutation[breakPoint2 - i];
+        permutation[breakPoint2 - i] = temp;
       }
-      return result;
     }
 
@@ -60,6 +59,6 @@
     /// <param name="permutation">The permutation to manipulate.</param>
     /// <returns>The new manipulated permuation.</returns>
-    protected override Permutation Manipulate(IRandom random, Permutation permutation) {
-      return Apply(random, permutation);
+    protected override void Manipulate(IRandom random, Permutation permutation) {
+      Apply(random, permutation);
     }
   }
Index: /trunk/sources/HeuristicLab.Permutation/3.3/MaximalPreservativeCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/MaximalPreservativeCrossover.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/MaximalPreservativeCrossover.cs	(revision 2830)
@@ -59,5 +59,5 @@
       if (parent1.Length < 4) throw new ArgumentException("MaximalPreservativeCrossover: The parent permutation must be at least of size 4");
       int length = parent1.Length;
-      Permutation result = new Permutation(length);
+      int[] result = new int[length];
       bool[] numberCopied = new bool[length];
       int breakPoint1, breakPoint2, subsegmentLength, index;
@@ -119,5 +119,5 @@
       } while (index != breakPoint1);
 
-      return result;
+      return new Permutation(result);
     }
 
Index: /trunk/sources/HeuristicLab.Permutation/3.3/OrderCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/OrderCrossover.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/OrderCrossover.cs	(revision 2830)
@@ -45,5 +45,5 @@
     /// <returns>The new permutation resulting from the crossover.</returns>
     public static Permutation Apply(IRandom random, Permutation parent1, Permutation parent2) {
-      Permutation result = new Permutation(parent1.Length);
+      int[] result = new int[parent1.Length];
       bool[] copied = new bool[result.Length];
 
@@ -66,5 +66,5 @@
         }
       }
-      return result;
+      return new Permutation(result);
     }
 
Index: /trunk/sources/HeuristicLab.Permutation/3.3/PartiallyMatchedCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/PartiallyMatchedCrossover.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/PartiallyMatchedCrossover.cs	(revision 2830)
@@ -57,5 +57,5 @@
       if (parent1.Length < 4) throw new ArgumentException("PartiallyMatchedCrossover: The parent permutation must be at least of size 4");
       int length = parent1.Length;
-      Permutation result = new Permutation(length); ;
+      int[] result = new int[length];
       int[] invResult = new int[length];
 
@@ -85,5 +85,5 @@
       }
 
-      return result;
+      return new Permutation(result);
     }
 
Index: /trunk/sources/HeuristicLab.Permutation/3.3/Permutation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/Permutation.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/Permutation.cs	(revision 2830)
@@ -44,5 +44,4 @@
     public Permutation(int[] elements)
       : base(elements) {
-      if (!Validate()) throw new ArgumentException("Elements do not represent a valid permutation.");
     }
     private Permutation(Permutation elements) : base(elements) { }
Index: /trunk/sources/HeuristicLab.Permutation/3.3/PermutationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Permutation/3.3/PermutationManipulator.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Permutation/3.3/PermutationManipulator.cs	(revision 2830)
@@ -46,9 +46,9 @@
 
     public sealed override IExecutionSequence Apply() {
-      PermutationParameter.ActualValue = Manipulate(RandomParameter.ActualValue, PermutationParameter.ActualValue);
+      Manipulate(RandomParameter.ActualValue, PermutationParameter.ActualValue);
       return base.Apply();
     }
 
-    protected abstract Permutation Manipulate(IRandom random, Permutation permutation);
+    protected abstract void Manipulate(IRandom random, Permutation permutation);
   }
 }
Index: /trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLab.Routing.TSP-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLab.Routing.TSP-3.3.csproj	(revision 2829)
+++ /trunk/sources/HeuristicLab.Routing.TSP/3.3/HeuristicLab.Routing.TSP-3.3.csproj	(revision 2830)
@@ -80,6 +80,4 @@
     </Reference>
     <Reference Include="System.Data" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
   </ItemGroup>
Index: /trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs
===================================================================
--- /trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Routing.TSP/3.3/TSP.cs	(revision 2830)
@@ -34,9 +34,9 @@
       get { return (ValueParameter<DoubleMatrixData>)Parameters["Coordinates"]; }
     }
-    private OperatorParameter SolutionGeneratorParameter {
-      get { return (OperatorParameter)Parameters["SolutionGenerator"]; }
+    private OperatorParameter SolutionCreatorParameter {
+      get { return (OperatorParameter)Parameters["SolutionCreator"]; }
     }
-    private OperatorParameter EvaluatorParameter {
-      get { return (OperatorParameter)Parameters["Evaluator"]; }
+    private OperatorParameter SolutionEvaluatorParameter {
+      get { return (OperatorParameter)Parameters["SolutionEvaluator"]; }
     }
 
@@ -45,11 +45,11 @@
       set { CoordinatesParameter.Value = value; }
     }
-    public IOperator SolutionGenerator {
-      get { return SolutionGeneratorParameter.Value; }
-      set { SolutionGeneratorParameter.Value = value; }
+    public IOperator SolutionCreator {
+      get { return SolutionCreatorParameter.Value; }
+      set { SolutionCreatorParameter.Value = value; }
     }
-    public IOperator Evaluator {
-      get { return EvaluatorParameter.Value; }
-      set { EvaluatorParameter.Value = value; }
+    public IOperator SolutionEvaluator {
+      get { return SolutionEvaluatorParameter.Value; }
+      set { SolutionEvaluatorParameter.Value = value; }
     }
 
@@ -59,6 +59,6 @@
       Parameters.Add(new ValueParameter<DoubleMatrixData>("Coordinates", "The x- and y-Coordinates of the cities.", new DoubleMatrixData(0, 0)));
       Parameters.Add(new ValueParameter<DoubleData>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
-      Parameters.Add(new OperatorParameter("SolutionGenerator", "The operator which should be used to generate new solutions."));
-      Parameters.Add(new OperatorParameter("Evaluator", "The operator which should be used to evaluate solutions."));
+      Parameters.Add(new OperatorParameter("SolutionCreator", "The operator which should be used to create new solutions."));
+      Parameters.Add(new OperatorParameter("SolutionEvaluator", "The operator which should be used to evaluate solutions."));
     }
 
@@ -70,7 +70,7 @@
       RandomPermutationCreator creator = new RandomPermutationCreator();
       creator.LengthParameter.Value = new IntData(cities);
-      SolutionGenerator = creator;
+      SolutionCreator = creator;
       TSPRoundedEuclideanPathEvaluator evaluator = new TSPRoundedEuclideanPathEvaluator();
-      Evaluator = evaluator;
+      SolutionEvaluator = evaluator;
     }
   }
Index: /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLab.SGA-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLab.SGA-3.3.csproj	(revision 2829)
+++ /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLab.SGA-3.3.csproj	(revision 2830)
@@ -79,27 +79,16 @@
     </Reference>
     <Reference Include="System.Data" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="HeuristicLabSGAPlugin.cs.frame" />
+    <Compile Include="SGAOperator.cs" />
     <Compile Include="HeuristicLabSGAPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="SGA.cs" />
-    <Compile Include="SGAView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SGAView.Designer.cs">
-      <DependentUpon>SGAView.cs</DependentUpon>
-    </Compile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\HeuristicLab.Common\3.2\HeuristicLab.Common-3.2.csproj">
-      <Project>{1FC004FC-59AF-4249-B1B6-FF25873A20E4}</Project>
-      <Name>HeuristicLab.Common-3.2</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
-      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
-      <Name>HeuristicLab.Core.Views-3.3</Name>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
@@ -115,19 +104,11 @@
       <Name>HeuristicLab.Evolutionary-3.3</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Logging\3.3\HeuristicLab.Logging-3.3.csproj">
-      <Project>{72908B54-D136-4BF2-8474-25AA6CB66C92}</Project>
-      <Name>HeuristicLab.Logging-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.2\HeuristicLab.MainForm.WindowsForms-3.2.csproj">
-      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
-      <Name>HeuristicLab.MainForm.WindowsForms-3.2</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.2\HeuristicLab.MainForm-3.2.csproj">
-      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
-      <Name>HeuristicLab.MainForm-3.2</Name>
-    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
       <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
       <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
@@ -139,15 +120,7 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
-      <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
-      <Name>HeuristicLab.Random-3.3</Name>
-    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Selection\3.3\HeuristicLab.Selection-3.3.csproj">
       <Project>{2C36CD4F-E5F5-43A4-801A-201EA895FE17}</Project>
       <Name>HeuristicLab.Selection-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.SequentialEngine\3.3\HeuristicLab.SequentialEngine-3.3.csproj">
-      <Project>{DC3D7072-7999-4719-B65D-3997744D5DC1}</Project>
-      <Name>HeuristicLab.SequentialEngine-3.3</Name>
     </ProjectReference>
   </ItemGroup>
@@ -155,9 +128,5 @@
     <None Include="HeuristicLab.snk" />
     <None Include="Properties\AssemblyInfo.frame" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="SGAView.resx">
-      <DependentUpon>SGAView.cs</DependentUpon>
-    </EmbeddedResource>
+    <None Include="SGAEngine.hl" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
@@ -175,5 +144,6 @@
 set Outdir=$(Outdir)
 
-call PreBuildEvent.cmd</PreBuildEvent>
+call PreBuildEvent.cmd
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabSGAPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabSGAPlugin.cs"</PreBuildEvent>
   </PropertyGroup>
 </Project>
Index: unk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs	(revision 2829)
+++ 	(revision )
@@ -1,48 +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.PluginInfrastructure;
-
-namespace HeuristicLab.SGA {
-  /// <summary>
-  /// Plugin class for HeuristicLab.SGA plugin.
-  /// </summary>
-  [ClassInfo(Name = "HeuristicLab.SGA-3.3")]
-  [PluginFile(Filename = "HeuristicLab.SGA-3.3.dll", Filetype = PluginFileType.Assembly)]
-  [Dependency(Dependency = "HeuristicLab.Common-3.2")]
-  [Dependency(Dependency = "HeuristicLab.Core-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Core.Views-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Data-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Evolutionary-3.3")]
-  [Dependency(Dependency = "HeuristicLab.MainForm-3.2")]
-  [Dependency(Dependency = "HeuristicLab.MainForm.WindowsForms-3.2")]
-  [Dependency(Dependency = "HeuristicLab.Operators-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Random-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Selection-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Logging-3.3")]
-  [Dependency(Dependency = "HeuristicLab.SequentialEngine-3.3")]
-  [Dependency(Dependency = "HeuristicLab.Persistence-3.3")]
-  public class HeuristicLabSGAPlugin : PluginBase {
-  }
-}
Index: /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs.frame	(revision 2830)
+++ /trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs.frame	(revision 2830)
@@ -0,0 +1,40 @@
+#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.PluginInfrastructure;
+
+namespace HeuristicLab.SGA {
+  /// <summary>
+  /// Plugin class for HeuristicLab.SGA plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.SGA", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.SGA-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Evolutionary", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  public class HeuristicLabSGAPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.SGA/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/Properties/AssemblyInfo.frame	(revision 2829)
+++ /trunk/sources/HeuristicLab.SGA/3.3/Properties/AssemblyInfo.frame	(revision 2830)
@@ -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.
@@ -21,7 +21,5 @@
 
 using System.Reflection;
-using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
-using HeuristicLab.PluginInfrastructure;
 
 // General Information about an assembly is controlled through the following 
@@ -33,5 +31,5 @@
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("HeuristicLab")]
-[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -54,5 +52,4 @@
 // You can specify all the values or you can default the Revision and Build Numbers 
 // by using the '*' as shown below:
-[assembly: AssemblyVersion("3.3.0.$WCREV$")]
+[assembly: AssemblyVersion("3.3.0.0")]
 [assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
-[assembly: AssemblyBuildDate("$WCNOW$")]
Index: /trunk/sources/HeuristicLab.SGA/3.3/SGAOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/SGAOperator.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.SGA/3.3/SGAOperator.cs	(revision 2830)
@@ -0,0 +1,202 @@
+#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;
+using HeuristicLab.Evolutionary;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.SGA {
+  /// <summary>
+  /// An operator which represents a Standard Genetic Algorithm.
+  /// </summary>
+  [Item("SGAOperator", "An operator which represents a Standard Genetic Algorithm.")]
+  [Creatable("Test")]
+  public class SGAOperator : AlgorithmOperator {
+    [Storable]
+    private ProportionalSelector proportionalSelector;
+
+    #region Parameter properties
+    public ValueLookupParameter<IRandom> RandomParameter {
+      get { return (ValueLookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ValueLookupParameter<BoolData> MaximizationParameter {
+      get { return (ValueLookupParameter<BoolData>)Parameters["Maximization"]; }
+    }
+    public SubScopesLookupParameter<DoubleData> QualityParameter {
+      get { return (SubScopesLookupParameter<DoubleData>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<IOperator> CrossoverOperatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["CrossoverOperator"]; }
+    }
+    public ValueLookupParameter<DoubleData> MutationProbabilityParameter {
+      get { return (ValueLookupParameter<DoubleData>)Parameters["MutationProbability"]; }
+    }
+    public ValueLookupParameter<IOperator> MutationOperatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["MutationOperator"]; }
+    }
+    public ValueLookupParameter<IOperator> SolutionEvaluatorParameter {
+      get { return (ValueLookupParameter<IOperator>)Parameters["SolutionEvaluator"]; }
+    }
+    public ValueLookupParameter<IntData> ElitesParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["Elites"]; }
+    }
+    public ValueLookupParameter<IntData> MaximumGenerationsParameter {
+      get { return (ValueLookupParameter<IntData>)Parameters["MaximumGenerations"]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+    #endregion
+
+    public SGAOperator()
+      : base() {
+      #region Create parameters
+      Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
+      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<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<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 ScopeParameter("CurrentScope", "The current scope which represents a population of solutions on which the SGA should be applied."));
+      #endregion
+
+      #region Create operator graph
+      SubScopesSorter subScopesSorter1 = new SubScopesSorter();
+      proportionalSelector = new ProportionalSelector();
+      SequentialSubScopesProcessor sequentialSubScopesProcessor1 = new SequentialSubScopesProcessor();
+      ChildrenCreator childrenCreator = new ChildrenCreator();
+      UniformSequentialSubScopesProcessor uniformSequentialSubScopesProcessor = new UniformSequentialSubScopesProcessor();
+      Placeholder crossover = new Placeholder();
+      StochasticBranch stochasticBranch = new StochasticBranch();
+      Placeholder mutator = new Placeholder();
+      Placeholder evaluator = new Placeholder();
+      SubScopesRemover subScopesRemover = new SubScopesRemover();
+      SubScopesSorter subScopesSorter2 = new SubScopesSorter();
+      SequentialSubScopesProcessor sequentialSubScopesProcessor2 = new SequentialSubScopesProcessor();
+      LeftSelector leftSelector = new LeftSelector();
+      RightReducer rightReducer = new RightReducer();
+      MergingReducer mergingReducer = new MergingReducer();
+      IntCounter intCounter = new IntCounter();
+      Comparator comparator = new Comparator();
+      ConditionalBranch conditionalBranch = new ConditionalBranch();
+
+      subScopesSorter1.DescendingParameter.ActualName = "Maximization";
+      subScopesSorter1.ValueParameter.ActualName = "Quality";
+      OperatorGraph.InitialOperator = subScopesSorter1;
+      subScopesSorter1.Successor = proportionalSelector;
+
+      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;
+
+      sequentialSubScopesProcessor1.Operators.Add(new EmptyOperator());
+      sequentialSubScopesProcessor1.Operators.Add(childrenCreator);
+      sequentialSubScopesProcessor1.Successor = sequentialSubScopesProcessor2;
+
+      childrenCreator.ParentsPerChild = new IntData(2);
+      childrenCreator.Successor = uniformSequentialSubScopesProcessor;
+
+      uniformSequentialSubScopesProcessor.Operator = crossover;
+      uniformSequentialSubScopesProcessor.Successor = subScopesSorter2;
+
+      crossover.Name = "CrossoverOperator";
+      crossover.OperatorParameter.ActualName = "CrossoverOperator";
+      crossover.Successor = stochasticBranch;
+
+      stochasticBranch.FirstBranch = mutator;
+      stochasticBranch.ProbabilityParameter.ActualName = "MutationProbability";
+      stochasticBranch.RandomParameter.ActualName = "Random";
+      stochasticBranch.SecondBranch = null;
+      stochasticBranch.Successor = evaluator;
+
+      mutator.Name = "MutationOperator";
+      mutator.OperatorParameter.ActualName = "MutationOperator";
+      mutator.Successor = null;
+
+      evaluator.Name = "SolutionEvaluator";
+      evaluator.OperatorParameter.ActualName = "SolutionEvaluator";
+      evaluator.Successor = subScopesRemover;
+
+      subScopesRemover.RemoveAllSubScopes = true;
+      subScopesRemover.Successor = null;
+
+      subScopesSorter2.DescendingParameter.ActualName = "Maximization";
+      subScopesSorter2.ValueParameter.ActualName = "Quality";
+      subScopesSorter2.Successor = null;
+
+      sequentialSubScopesProcessor2.Operators.Add(leftSelector);
+      sequentialSubScopesProcessor2.Operators.Add(new EmptyOperator());
+      sequentialSubScopesProcessor2.Successor = mergingReducer;
+
+      leftSelector.CopySelected = new BoolData(false);
+      leftSelector.NumberOfSelectedSubScopesParameter.ActualName = "Elites";
+      leftSelector.Successor = rightReducer;
+
+      rightReducer.Successor = null;
+
+      mergingReducer.Successor = intCounter;
+
+      intCounter.Increment = new IntData(1);
+      intCounter.ValueParameter.ActualName = "Generations";
+      intCounter.Successor = comparator;
+
+      comparator.Comparison = new ComparisonData(Comparison.GreaterOrEqual);
+      comparator.LeftSideParameter.ActualName = "Generations";
+      comparator.ResultParameter.ActualName = "Terminate";
+      comparator.RightSideParameter.ActualName = "MaximumGenerations";
+      comparator.Successor = conditionalBranch;
+
+      conditionalBranch.ConditionParameter.ActualName = "Terminate";
+      conditionalBranch.FalseBranch = subScopesSorter1;
+      conditionalBranch.TrueBranch = null;
+      conditionalBranch.Successor = null;
+      #endregion
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      SGAOperator clone = (SGAOperator)base.Clone(cloner);
+      clone.proportionalSelector = (ProportionalSelector)cloner.Clone(proportionalSelector);
+      return clone;
+    }
+
+    public override IExecutionSequence 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.SGA/3.3/Tests/AuthoringTests.txt
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/Tests/AuthoringTests.txt	(revision 2830)
+++ /trunk/sources/HeuristicLab.SGA/3.3/Tests/AuthoringTests.txt	(revision 2830)
@@ -0,0 +1,136 @@
+﻿==========================================================================
+    Visual Studio Team System: Overview of Authoring and Running Tests    
+==========================================================================
+
+This overview describes the features for authoring and running tests in 
+Visual Studio Team System and Visual Studio Team Edition for Software Testers.
+
+Opening Tests
+-------------
+To open a test, open a test project or a test metadata file (a file with
+extension .vsmdi) that contains the definition of the test. You can find
+test projects and metadata files in Solution Explorer.
+
+Viewing Tests
+-------------
+To see which tests are available to you, open the Test View window. Or,
+if you have installed Team Edition for Software Testers, you can also open
+the Test List Editor window to view tests.
+
+To open the Test View window, click the Test menu, point to Windows, and
+then click Test View. To open the Test List Editor window (if you have
+installed Team Edition for Software Testers), click Test, point to Windows,
+and then click Test List Editor.
+
+Running Tests
+-------------
+You can run tests from the Test View window and the Test List Editor window.
+See Viewing Tests to learn how to open these windows. To run one or more
+tests displayed in the Test View window, first select the tests in that
+window; to select multiple tests, hold either the Shift or CTRL key while
+clicking tests. Then click the Run Tests button in the Test View window
+toolbar.
+
+If you have installed Visual Studio Team Edition for Software Testers, you can
+also use the Test List Editor window to run tests. To run tests in Test List Editor,
+select the check box next to each test that you want to run. Then click the
+Run Tests button in the Test List Editor window toolbar.
+
+Viewing Test Results
+--------------------
+When you run a test or a series of tests, the results of the test run will be
+shown in the Test Results window. Each individual test in the run is shown on
+a separate line so that you can see its status. The window contains an
+embedded status bar in the top half of the window that provides you with
+summary details of the complete test run.
+
+To see more detailed results for a particular test result, double-click it in
+the Test Results window. This opens a window that provides more information
+about the particular test result, such as any specific error messages returned
+by the test.
+
+Changing the way that tests are run
+-----------------------------------
+Each time you run one or more tests, a collection of settings is used to
+determine how those tests are run. These settings are contained in a “test
+run configuration” file.
+
+Here is a partial list of the changes you can make with a test run 
+configuration file:
+
+ - Change the naming scheme for each test run.
+ - Change the test controller that the tests are run on so that you can run
+   tests remotely.
+ - Gather code coverage data for the code being tested so that you can see
+   which lines of code are covered by your tests.
+ - Enable and disable test deployment. 
+ - Specify additional files to deploy before tests are run.
+ - Select a different host, ASP.NET, for running ASP.NET unit tests.
+ - Select a different host, the smart device test host, for running smart device unit tests.
+ - Set various properties for the test agents that run your tests.
+ - Run custom scripts at the start and end of each test run so that you can
+   set up the test environment exactly as required each time tests are run.
+ - Set time limits for tests and test runs.
+ - Set the browser mix and the number of times to repeat Web tests in the
+   test run.
+
+By default, a test run configuration file is created whenever you create a
+new test project. You make changes to this file by double-clicking it in 
+Solution Explorer and then changing its settings. (Test run configuration
+files have the extension .testrunconfig.)
+
+A solution can contain multiple test run configuration files. Only one of
+those files, known as the “Active” test run configuration file, is used to
+determine the settings that are currently used for test runs. You select
+the active test run configuration by clicking Select Active Test Run 
+Configuration on the Test menu.
+
+-------------------------------------------------------------------------------
+
+Test Types
+----------
+Using Visual Studio Team Edition for Software Testers, you can create a number
+of different test types:
+
+Unit test: Use a unit test to create a programmatic test in C++, Visual C# or
+Visual Basic that exercises source code. A unit test calls the methods of a
+class, passing suitable parameters, and verifies that the returned value is
+what you expect.
+There are three specialized variants of unit tests:
+ - Data-driven unit tests are created when you configure a unit test to be
+   called repeatedly for each row of a data source. The data from each row
+   is used by the unit test as input data.
+ - ASP.NET unit tests are unit tests that exercise code in an ASP.NET Web
+   application.
+ - Smart device unit tests are unit tests that are deployed to a smart device
+   or emulator and then executed by the smart device test host.  
+
+Web Test: Web tests consist of an ordered series of HTTP requests that you
+record in a browser session using Microsoft Internet Explorer. You can have
+the test report specific details about the pages or sites it requests, such
+as whether a particular page contains a specified string.
+
+Load Test: You use a load test to encapsulate non-manual tests, such as
+unit, Web, and generic tests, and then run them simultaneously by using
+virtual users. Running these tests under load generates test results,
+including performance and other counters, in tables and in graphs.
+
+Generic test: A generic test is an existing program wrapped to function as a
+test in Visual Studio. The following are examples of tests or programs that
+you can turn into generic tests:
+ - An existing test that uses process exit codes to communicate whether the
+   test passed or failed. 0 indicates passing and any other value indicates
+   a failure.
+ - A general program to obtain specific functionality during a test scenario.
+ - A test or program that uses a special XML file (called a “summary results
+   file”), to communicate detailed results.
+
+Manual test: The manual test type is used when the test tasks are to be
+completed by a test engineer as opposed to an automated script.
+
+Ordered test: Use an ordered test to execute a set of tests in an order you
+specify.
+
+-------------------------------------------------------------------------------
+
+
Index: /trunk/sources/HeuristicLab.SGA/3.3/Tests/HeuristicLab.SGA-3.3.Tests.csproj
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/Tests/HeuristicLab.SGA-3.3.Tests.csproj	(revision 2830)
+++ /trunk/sources/HeuristicLab.SGA/3.3/Tests/HeuristicLab.SGA-3.3.Tests.csproj	(revision 2830)
@@ -0,0 +1,130 @@
+﻿<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F42F3576-7233-4B28-90F7-36AE15F30F92}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.SGA.UnitTest</RootNamespace>
+    <AssemblyName>HeuristicLab.SGA-3.3.UnitTest</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="UnitTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="AuthoringTests.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Common.Resources\3.2\HeuristicLab.Common.Resources-3.2.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Common\3.2\HeuristicLab.Common-3.2.csproj">
+      <Project>{1FC004FC-59AF-4249-B1B6-FF25873A20E4}</Project>
+      <Name>HeuristicLab.Common-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Evolutionary\3.3\HeuristicLab.Evolutionary-3.3.csproj">
+      <Project>{25087811-F74C-4128-BC86-8324271DA13E}</Project>
+      <Name>HeuristicLab.Evolutionary-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Permutation\3.3\HeuristicLab.Permutation-3.3.csproj">
+      <Project>{00282156-589D-424F-9CE4-A8038636C926}</Project>
+      <Name>HeuristicLab.Permutation-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Routing.TSP\3.3\HeuristicLab.Routing.TSP-3.3.csproj">
+      <Project>{600287A3-8714-453E-B875-A05F3EB72315}</Project>
+      <Name>HeuristicLab.Routing.TSP-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Selection\3.3\HeuristicLab.Selection-3.3.csproj">
+      <Project>{2C36CD4F-E5F5-43A4-801A-201EA895FE17}</Project>
+      <Name>HeuristicLab.Selection-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.SequentialEngine\3.3\HeuristicLab.SequentialEngine-3.3.csproj">
+      <Project>{DC3D7072-7999-4719-B65D-3997744D5DC1}</Project>
+      <Name>HeuristicLab.SequentialEngine-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.SGA-3.3.csproj">
+      <Project>{4C3305C4-E440-4EAD-B218-68D77AE51543}</Project>
+      <Name>HeuristicLab.SGA-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Tracing\3.2\HeuristicLab.Tracing-3.2.csproj">
+      <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
+      <Name>HeuristicLab.Tracing-3.2</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="SGAEngine.hl">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.SGA/3.3/Tests/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/Tests/Properties/AssemblyInfo.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.SGA/3.3/Tests/Properties/AssemblyInfo.cs	(revision 2830)
@@ -0,0 +1,35 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.SGA.UnitTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.SGA.UnitTest")]
+[assembly: AssemblyCopyright("Copyright ©  2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM componenets.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8196af6d-aa45-4c13-aade-3e2ba598c191")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /trunk/sources/HeuristicLab.SGA/3.3/Tests/UnitTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.SGA/3.3/Tests/UnitTest.cs	(revision 2830)
+++ /trunk/sources/HeuristicLab.SGA/3.3/Tests/UnitTest.cs	(revision 2830)
@@ -0,0 +1,74 @@
+﻿using System;
+using System.Diagnostics;
+using System.Threading;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.Xml;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.SGA.UnitTest {
+  /// <summary>
+  /// Summary description for UnitTest1
+  /// </summary>
+  [TestClass]
+  public class UnitTest {
+    public UnitTest() {
+      //
+      // TODO: Add constructor logic here
+      //
+    }
+
+    private TestContext testContextInstance;
+
+    /// <summary>
+    ///Gets or sets the test context which provides
+    ///information about and functionality for the current test run.
+    ///</summary>
+    public TestContext TestContext {
+      get {
+        return testContextInstance;
+      }
+      set {
+        testContextInstance = value;
+      }
+    }
+
+    #region Additional test attributes
+    //
+    // You can use the following additional attributes as you write your tests:
+    //
+    // Use ClassInitialize to run code before running the first test in the class
+    // [ClassInitialize()]
+    // public static void MyClassInitialize(TestContext testContext) { }
+    //
+    // Use ClassCleanup to run code after all tests in a class have run
+    // [ClassCleanup()]
+    // public static void MyClassCleanup() { }
+    //
+    // Use TestInitialize to run code before running each test 
+    // [TestInitialize()]
+    // public void MyTestInitialize() { }
+    //
+    // Use TestCleanup to run code after each test has run
+    // [TestCleanup()]
+    // public void MyTestCleanup() { }
+    //
+    #endregion
+
+    private EventWaitHandle trigger = new AutoResetEvent(false);
+
+    [TestMethod]
+    [DeploymentItem(@"SGAEngine.hl")]
+    public void SGAPerformanceTest() {
+      IEngine engine = (IEngine)XmlParser.Deserialize("SGAEngine.hl");
+      engine.Stopped += new EventHandler(engine_Stopped);
+      engine.Prepare();
+      engine.Start();
+      trigger.WaitOne();
+      TestContext.WriteLine("Runtime: {0}", engine.ExecutionTime.ToString());
+    }
+
+    private void engine_Stopped(object sender, EventArgs e) {
+      trigger.Set();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Selection/3.3/LeftReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/LeftReducer.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/LeftReducer.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,6 +34,6 @@
     public LeftReducer() : base() { }
 
-    protected override ScopeList Reduce(ScopeList scopes) {
-      ScopeList reduced = new ScopeList();
+    protected override List<IScope> Reduce(List<IScope> scopes) {
+      List<IScope> reduced = new List<IScope>();
       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 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/LeftSelector.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,17 +34,17 @@
     public LeftSelector() : base() { }
 
-    protected override ScopeList Select(ScopeList scopes) {
+    protected override IScope[] Select(List<IScope> scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
-      ScopeList selected = new ScopeList();
+      IScope[] selected = new IScope[count];
 
       int j = 0;
       for (int i = 0; i < count; i++) {
         if (copy) {
-          selected.Add((IScope)scopes[j].Clone());
+          selected[i] = (IScope)scopes[j].Clone();
           j++;
           if (j >= scopes.Count) j = 0;
         } else {
-          selected.Add(scopes[0]);
+          selected[i] = scopes[0];
           scopes.RemoveAt(0);
         }
Index: /trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/LinearRankSelector.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Core;
@@ -38,5 +39,5 @@
     }
 
-    protected override ScopeList Select(ScopeList scopes) {
+    protected override IScope[] Select(List<IScope> scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
@@ -44,5 +45,5 @@
       bool maximization = MaximizationParameter.ActualValue.Value;
       ItemArray<DoubleData> qualities = QualityParameter.ActualValue;
-      ScopeList selected = new ScopeList();
+      IScope[] selected = new IScope[count];
 
       // create a list for each scope that contains the scope's index in the original scope list and its lots
@@ -64,7 +65,7 @@
         }
         if (copy)
-          selected.Add((IScope)scopes[list[index].index].Clone());
+          selected[i] = (IScope)scopes[list[index].index].Clone();
         else {
-          selected.Add(scopes[list[index].index]);
+          selected[i] = scopes[list[index].index];
           scopes.RemoveAt(list[index].index);
           lotSum -= list[index].lots;
Index: /trunk/sources/HeuristicLab.Selection/3.3/MergingReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/MergingReducer.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/MergingReducer.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,6 +34,6 @@
     public MergingReducer() : base() { }
 
-    protected override ScopeList Reduce(ScopeList scopes) {
-      ScopeList reduced = new ScopeList();
+    protected override List<IScope> Reduce(List<IScope> scopes) {
+      List<IScope> reduced = new List<IScope>();
       for (int i = 0; i < scopes.Count; i++)
         reduced.AddRange(scopes[i].SubScopes);
Index: /trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/ProportionalSelector.cs	(revision 2830)
@@ -51,5 +51,5 @@
     }
 
-    protected override ScopeList Select(ScopeList scopes) {
+    protected override IScope[] Select(List<IScope> scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
@@ -57,5 +57,5 @@
       bool maximization = MaximizationParameter.ActualValue.Value;
       bool windowing = WindowingParameter.Value.Value;
-      ScopeList selected = new ScopeList();
+      IScope[] selected = new IScope[count];
 
       // prepare qualities for proportional selection
@@ -91,7 +91,7 @@
         }
         if (copy)
-          selected.Add((IScope)scopes[index].Clone());
+          selected[i] = (IScope)scopes[index].Clone();
         else {
-          selected.Add(scopes[index]);
+          selected[i] = scopes[index];
           scopes.RemoveAt(index);
           qualitySum -= list[index];
Index: /trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/RandomSelector.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,16 +34,16 @@
     public RandomSelector() : base() { }
 
-    protected override ScopeList Select(ScopeList scopes) {
+    protected override IScope[] Select(List<IScope> scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
       IRandom random = RandomParameter.ActualValue;
-      ScopeList selected = new ScopeList();
+      IScope[] selected = new IScope[count];
 
       for (int i = 0; i < count; i++) {
         if (copy)
-          selected.Add((IScope)scopes[random.Next(scopes.Count)].Clone());
+          selected[i] = (IScope)scopes[random.Next(scopes.Count)].Clone();
         else {
           int index = random.Next(scopes.Count);
-          selected.Add(scopes[index]);
+          selected[i] = scopes[index];
           scopes.RemoveAt(index);
         }
Index: /trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/Reducer.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Operators;
@@ -46,6 +47,6 @@
 
     public sealed override IExecutionSequence Apply() {
-      ScopeList scopes = new ScopeList(CurrentScope.SubScopes);
-      ScopeList reduced = Reduce(scopes);
+      List<IScope> scopes = new List<IScope>(CurrentScope.SubScopes);
+      List<IScope> reduced = Reduce(scopes);
 
       CurrentScope.SubScopes.Clear();
@@ -55,5 +56,5 @@
     }
 
-    protected abstract ScopeList Reduce(ScopeList scopes);
+    protected abstract List<IScope> Reduce(List<IScope> scopes);
   }
 }
Index: /trunk/sources/HeuristicLab.Selection/3.3/RightReducer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/RightReducer.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/RightReducer.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,6 +34,6 @@
     public RightReducer() : base() { }
 
-    protected override ScopeList Reduce(ScopeList scopes) {
-      ScopeList reduced = new ScopeList();
+    protected override List<IScope> Reduce(List<IScope> scopes) {
+      List<IScope> reduced = new List<IScope>();
       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 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/RightSelector.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,17 +34,17 @@
     public RightSelector() : base() { }
 
-    protected override ScopeList Select(ScopeList scopes) {
+    protected override IScope[] Select(List<IScope> scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
-      ScopeList selected = new ScopeList();
+      IScope[] selected = new IScope[count];
 
       int j = scopes.Count - 1;
       for (int i = 0; i < count; i++) {
         if (copy) {
-          selected.Add((IScope)scopes[j].Clone());
+          selected[i] = (IScope)scopes[j].Clone();
           j--;
           if (j < 0) j = scopes.Count - 1;
         } else {
-          selected.Add(scopes[scopes.Count - 1]);
+          selected[i] = scopes[scopes.Count - 1];
           scopes.RemoveAt(scopes.Count - 1);
         }
Index: /trunk/sources/HeuristicLab.Selection/3.3/Selector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/Selector.cs	(revision 2830)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Collections.Generic;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -59,6 +60,6 @@
 
     public sealed override IExecutionSequence Apply() {
-      ScopeList scopes = new ScopeList(CurrentScope.SubScopes);
-      ScopeList selected = Select(scopes);
+      List<IScope> scopes = new List<IScope>(CurrentScope.SubScopes);
+      IScope[] selected = Select(scopes);
 
       CurrentScope.SubScopes.Clear();
@@ -73,5 +74,5 @@
     }
 
-    protected abstract ScopeList Select(ScopeList scopes);
+    protected abstract IScope[] Select(List<IScope> scopes);
   }
 }
Index: /trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 2829)
+++ /trunk/sources/HeuristicLab.Selection/3.3/TournamentSelector.cs	(revision 2830)
@@ -44,5 +44,5 @@
     }
 
-    protected override ScopeList Select(ScopeList scopes) {
+    protected override IScope[] Select(List<IScope> scopes) {
       int count = NumberOfSelectedSubScopesParameter.ActualValue.Value;
       bool copy = CopySelectedParameter.Value.Value;
@@ -51,5 +51,5 @@
       List<double> qualities = QualityParameter.ActualValue.Select(x => x.Value).ToList();
       int groupSize = GroupSizeParameter.ActualValue.Value;
-      ScopeList selected = new ScopeList();
+      IScope[] selected = new IScope[count];
 
       for (int i = 0; i < count; i++) {
@@ -65,7 +65,7 @@
 
         if (copy)
-          selected.Add((IScope)scopes[best].Clone());
+          selected[i] = (IScope)scopes[best].Clone();
         else {
-          selected.Add(scopes[best]);
+          selected[i] = scopes[best];
           scopes.RemoveAt(best);
           qualities.RemoveAt(best);
