Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs	(revision 4671)
@@ -53,8 +53,8 @@
     protected CheckedItemCollection(CheckedItemCollection<T> original, Cloner cloner)
       : base(original, cloner) {
-      list = new List<T>(original.Select(x => cloner.Clone<T>(x)));
+      list = new List<T>(original.Select(x => cloner.Clone(x)));
       checkedState = new Dictionary<T, bool>();
       foreach (var pair in original.checkedState)
-        checkedState.Add(cloner.Clone<T>(pair.Key), pair.Value);
+        checkedState.Add(cloner.Clone(pair.Key), pair.Value);
     }
     /// <summary>
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 4671)
@@ -60,5 +60,5 @@
       checkedState = new Dictionary<T, bool>();
       foreach (var pair in original.checkedState)
-        checkedState.Add(cloner.Clone<T>(pair.Key), pair.Value);
+        checkedState.Add(cloner.Clone(pair.Key), pair.Value);
     }
     /// <summary>
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemArray.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemArray.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemArray.cs	(revision 4671)
@@ -50,5 +50,5 @@
     protected ItemArray(ItemArray<T> original, Cloner cloner) {
       cloner.RegisterClonedObject(original, this);
-      array = original.Select(x => cloner.Clone<T>(x)).ToArray();
+      array = original.Select(x => cloner.Clone(x)).ToArray();
     }
     public ItemArray() : base() { }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemCollection.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemCollection.cs	(revision 4671)
@@ -50,5 +50,5 @@
     protected ItemCollection(ItemCollection<T> original, Cloner cloner) {
       cloner.RegisterClonedObject(original, this);
-      list = new List<T>(original.Select(x => cloner.Clone<T>(x)));
+      list = new List<T>(original.Select(x => cloner.Clone(x)));
     }
     public ItemCollection() : base() { }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemDictionary.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemDictionary.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemDictionary.cs	(revision 4671)
@@ -53,5 +53,5 @@
       cloner.RegisterClonedObject(original, this);
       foreach (TKey key in dict.Keys)
-        dict.Add(cloner.Clone<TKey>(key), cloner.Clone<TValue>(dict[key]));
+        dict.Add(cloner.Clone(key), cloner.Clone(dict[key]));
     }
     public ItemDictionary() : base() { }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemList.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemList.cs	(revision 4671)
@@ -50,5 +50,5 @@
     protected ItemList(ItemList<T> original, Cloner cloner) {
       cloner.RegisterClonedObject(original, this);
-      list = new List<T>(original.Select(x => cloner.Clone<T>(x)));
+      list = new List<T>(original.Select(x => cloner.Clone(x)));
     }
     public ItemList() : base() { }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemSet.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemSet.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemSet.cs	(revision 4671)
@@ -50,5 +50,5 @@
     protected ItemSet(ItemSet<T> original, Cloner cloner) {
       cloner.RegisterClonedObject(original, this);
-      set = new HashSet<T>(original.Select(x => cloner.Clone<T>(x)));
+      set = new HashSet<T>(original.Select(x => cloner.Clone(x)));
     }
     public ItemSet() : base() { }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/KeyedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/KeyedItemCollection.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/KeyedItemCollection.cs	(revision 4671)
@@ -49,5 +49,5 @@
       cloner.RegisterClonedObject(original, this);
       foreach (TItem item in original.dict.Values) {
-        TItem clonedItem = cloner.Clone<TItem>(item);
+        TItem clonedItem = cloner.Clone(item);
         dict.Add(GetKeyForItem(clonedItem), clonedItem);
       }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperationCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperationCollection.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperationCollection.cs	(revision 4671)
@@ -42,5 +42,5 @@
     private OperationCollection(OperationCollection original, Cloner cloner)
       : base(original, cloner) {
-      operations = new List<IOperation>(original.Select(x => cloner.Clone<IOperation>(x)));
+      operations = new List<IOperation>(original.Select(x => cloner.Clone(x)));
       parallel = original.parallel;
     }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemArray.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemArray.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemArray.cs	(revision 4671)
@@ -48,5 +48,5 @@
     protected ReadOnlyItemArray(ReadOnlyItemArray<T> original, Cloner cloner) {
       cloner.RegisterClonedObject(original, this);
-      array = cloner.Clone<IItemArray<T>>((IItemArray<T>)original.array);
+      array = cloner.Clone((IItemArray<T>)original.array);
       RegisterEvents();
     }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemCollection.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemCollection.cs	(revision 4671)
@@ -48,5 +48,5 @@
     protected ReadOnlyItemCollection(ReadOnlyItemCollection<T> original, Cloner cloner) {
       cloner.RegisterClonedObject(original, this);
-      collection = cloner.Clone<IItemCollection<T>>((IItemCollection<T>)original.collection);
+      collection = cloner.Clone((IItemCollection<T>)original.collection);
       RegisterEvents();
     }
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 4671)
@@ -23,4 +23,5 @@
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -41,4 +42,7 @@
     }
 
+    [StorableConstructor]
+    protected ConstrainedValueParameter(bool deserializing) : base(deserializing) { }
+    protected ConstrainedValueParameter(ConstrainedValueParameter<T> original, Cloner cloner) : base(original, cloner) { }
     public ConstrainedValueParameter() : base() { }
     public ConstrainedValueParameter(string name) : base(name) { }
@@ -54,6 +58,8 @@
     public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value) : base(name, description, validValues, value) { }
     public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value, bool getsCollected) : base(name, description, validValues, value, getsCollected) { }
-    [StorableConstructor]
-    protected ConstrainedValueParameter(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedValueParameter<T>(this, cloner);
+    }
 
     protected override void ValidValues_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/LookupParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 4671)
@@ -62,4 +62,10 @@
     }
 
+    [StorableConstructor]
+    protected LookupParameter(bool deserializing) : base(deserializing) { }
+    protected LookupParameter(LookupParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      actualName = original.actualName;
+    }
     public LookupParameter()
       : base("Anonymous", typeof(T)) {
@@ -78,11 +84,7 @@
       this.actualName = actualName == null ? string.Empty : actualName;
     }
-    [StorableConstructor]
-    protected LookupParameter(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      LookupParameter<T> clone = (LookupParameter<T>)base.Clone(cloner);
-      clone.actualName = actualName;
-      return clone;
+      return new LookupParameter<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OperatorParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OperatorParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OperatorParameter.cs	(revision 4671)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -30,4 +31,7 @@
   [StorableClass]
   public class OperatorParameter : OptionalValueParameter<IOperator> {
+    [StorableConstructor]
+    protected OperatorParameter(bool deserializing) : base(deserializing) { }
+    protected OperatorParameter(OperatorParameter original, Cloner cloner) : base(original, cloner) { }
     public OperatorParameter() : base("Anonymous") { }
     public OperatorParameter(string name) : base(name) { }
@@ -39,6 +43,8 @@
     public OperatorParameter(string name, string description, IOperator value) : base(name, description, value) { }
     public OperatorParameter(string name, string description, IOperator value, bool getsCollected) : base(name, description, value, getsCollected) { }
-    [StorableConstructor]
-    protected OperatorParameter(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OperatorParameter(this, cloner);
+    }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 4671)
@@ -87,4 +87,13 @@
 
     #region Constructors
+    [StorableConstructor]
+    protected OptionalConstrainedValueParameter(bool deserializing) : base(deserializing) { }
+    protected OptionalConstrainedValueParameter(OptionalConstrainedValueParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      validValues = cloner.Clone(original.validValues);
+      value = cloner.Clone(original.value);
+      getsCollected = original.getsCollected;
+      Initialize();
+    }
     public OptionalConstrainedValueParameter()
       : base("Anonymous", typeof(T)) {
@@ -169,9 +178,11 @@
       Initialize();
     }
-    [StorableConstructor]
-    protected OptionalConstrainedValueParameter(bool deserializing) : base(deserializing) { }
     #endregion
 
     [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
     private void Initialize() {
       RegisterValidValuesEvents();
@@ -180,10 +191,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      OptionalConstrainedValueParameter<T> clone = (OptionalConstrainedValueParameter<T>)base.Clone(cloner);
-      clone.validValues = (ItemSet<T>)cloner.Clone(validValues);
-      clone.value = (T)cloner.Clone(value);
-      clone.getsCollected = getsCollected;
-      clone.Initialize();
-      return clone;
+      return new OptionalConstrainedValueParameter<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 4671)
@@ -79,4 +79,12 @@
 
     #region Constructors
+    [StorableConstructor]
+    protected OptionalValueParameter(bool deserializing) : base(deserializing) { }
+    protected OptionalValueParameter(OptionalValueParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      value = cloner.Clone(original.value);
+      getsCollected = original.getsCollected;
+      RegisterValueEvents();
+    }
     public OptionalValueParameter()
       : base("Anonymous", typeof(T)) {
@@ -95,5 +103,5 @@
       this.value = value;
       this.getsCollected = true;
-      Initialize();
+      RegisterValueEvents();
     }
     public OptionalValueParameter(string name, T value, bool getsCollected)
@@ -101,5 +109,5 @@
       this.value = value;
       this.getsCollected = getsCollected;
-      Initialize();
+      RegisterValueEvents();
     }
     public OptionalValueParameter(string name, string description)
@@ -115,5 +123,5 @@
       this.value = value;
       this.getsCollected = true;
-      Initialize();
+      RegisterValueEvents();
     }
     public OptionalValueParameter(string name, string description, T value, bool getsCollected)
@@ -121,21 +129,15 @@
       this.value = value;
       this.getsCollected = getsCollected;
-      Initialize();
+      RegisterValueEvents();
     }
-    [StorableConstructor]
-    protected OptionalValueParameter(bool deserializing) : base(deserializing) { }
     #endregion
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       RegisterValueEvents();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      OptionalValueParameter<T> clone = (OptionalValueParameter<T>)base.Clone(cloner);
-      clone.value = (T)cloner.Clone(value);
-      clone.getsCollected = getsCollected;
-      clone.Initialize();
-      return clone;
+      return new OptionalValueParameter<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/Parameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 4671)
@@ -77,4 +77,11 @@
     }
 
+    [StorableConstructor]
+    protected Parameter(bool deserializing) : base(deserializing) { }
+    protected Parameter(Parameter original, Cloner cloner)
+      : base(original, cloner) {
+      dataType = original.dataType;
+      executionContext = cloner.Clone(original.executionContext);
+    }
     protected Parameter()
       : base("Anonymous") {
@@ -91,13 +98,4 @@
       this.dataType = dataType;
     }
-    [StorableConstructor]
-    protected Parameter(bool deserializing) : base(deserializing) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      Parameter clone = (Parameter)base.Clone(cloner);
-      clone.dataType = dataType;
-      clone.executionContext = (IExecutionContext)cloner.Clone(executionContext);
-      return clone;
-    }
 
     public override string ToString() {
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ScopeParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ScopeParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ScopeParameter.cs	(revision 4671)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -35,4 +36,7 @@
     }
 
+    [StorableConstructor]
+    protected ScopeParameter(bool deserializing) : base(deserializing) { }
+    protected ScopeParameter(ScopeParameter original, Cloner cloner) : base(original, cloner) { }
     public ScopeParameter()
       : base("Anonymous", typeof(IScope)) {
@@ -44,6 +48,8 @@
       : base(name, description, typeof(IScope)) {
     }
-    [StorableConstructor]
-    protected ScopeParameter(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ScopeParameter(this, cloner);
+    }
 
     public override string ToString() {
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ScopeTreeLookupParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ScopeTreeLookupParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ScopeTreeLookupParameter.cs	(revision 4671)
@@ -47,4 +47,10 @@
     }
 
+    [StorableConstructor]
+    protected ScopeTreeLookupParameter(bool deserializing) : base(deserializing) { }
+    protected ScopeTreeLookupParameter(ScopeTreeLookupParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      depth = original.depth;
+    }
     public ScopeTreeLookupParameter()
       : base() {
@@ -75,11 +81,7 @@
       this.depth = depth;
     }
-    [StorableConstructor]
-    protected ScopeTreeLookupParameter(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ScopeTreeLookupParameter<T> clone = (ScopeTreeLookupParameter<T>)base.Clone(cloner);
-      clone.depth = depth;
-      return clone;
+      return new ScopeTreeLookupParameter<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 4671)
@@ -79,4 +79,12 @@
 
     #region Constructors
+    [StorableConstructor]
+    protected ValueLookupParameter(bool deserializing) : base(deserializing) { }
+    protected ValueLookupParameter(ValueLookupParameter<T> original, Cloner cloner)
+      : base(original, cloner) {
+      value = cloner.Clone(original.value);
+      getsCollected = original.getsCollected;
+      RegisterValueEvents();
+    }
     public ValueLookupParameter()
       : base() {
@@ -95,5 +103,5 @@
       this.value = value;
       this.getsCollected = true;
-      Initialize();
+      RegisterValueEvents();
     }
     public ValueLookupParameter(string name, T value, bool getsCollected)
@@ -101,5 +109,5 @@
       this.value = value;
       this.getsCollected = getsCollected;
-      Initialize();
+      RegisterValueEvents();
     }
     public ValueLookupParameter(string name, string description)
@@ -115,5 +123,5 @@
       this.value = value;
       this.getsCollected = true;
-      Initialize();
+      RegisterValueEvents();
     }
     public ValueLookupParameter(string name, string description, T value, bool getsCollected)
@@ -121,5 +129,5 @@
       this.value = value;
       this.getsCollected = getsCollected;
-      Initialize();
+      RegisterValueEvents();
     }
     public ValueLookupParameter(string name, string description, string actualName)
@@ -131,19 +139,13 @@
       this.getsCollected = getsCollected;
     }
-    [StorableConstructor]
-    protected ValueLookupParameter(bool deserializing) : base(deserializing) { }
     #endregion
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       RegisterValueEvents();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ValueLookupParameter<T> clone = (ValueLookupParameter<T>)base.Clone(cloner);
-      clone.value = (T)cloner.Clone(value);
-      clone.getsCollected = getsCollected;
-      clone.Initialize();
-      return clone;
+      return new ValueLookupParameter<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ValueParameter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ValueParameter.cs	(revision 4670)
+++ /branches/CloningRefactoring/HeuristicLab.Parameters/3.3/ValueParameter.cs	(revision 4671)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -39,4 +40,7 @@
     }
 
+    [StorableConstructor]
+    protected ValueParameter(bool deserializing) : base(deserializing) { }
+    protected ValueParameter(ValueParameter<T> original, Cloner cloner) : base(original, cloner) { }
     public ValueParameter() : base() { }
     public ValueParameter(string name) : base(name) { }
@@ -48,6 +52,8 @@
     public ValueParameter(string name, string description, T value) : base(name, description, value) { }
     public ValueParameter(string name, string description, T value, bool getsCollected) : base(name, description, value, getsCollected) { }
-    [StorableConstructor]
-    protected ValueParameter(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ValueParameter<T>(this, cloner);
+    }
   }
 }
