Index: /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs	(revision 4668)
@@ -62,4 +62,9 @@
     [StorableConstructor]
     protected ReadOnlyObservableArray(bool deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
     #endregion
 
@@ -111,5 +116,4 @@
 
     #region Events
-    [StorableHook(HookType.AfterDeserialization)]
     protected void RegisterEvents() {
       array.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(array_ItemsReplaced);
Index: /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs	(revision 4668)
@@ -51,4 +51,9 @@
     [StorableConstructor]
     protected ReadOnlyObservableCollection(bool deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
     #endregion
 
@@ -89,5 +94,4 @@
 
     #region Events
-    [StorableHook(HookType.AfterDeserialization)]
     protected void RegisterEvents() {
       collection.ItemsAdded += new CollectionItemsChangedEventHandler<T>(collection_ItemsAdded);
Index: /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs	(revision 4668)
@@ -65,4 +65,9 @@
     [StorableConstructor]
     protected ReadOnlyObservableDictionary(bool deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
     #endregion
 
@@ -116,5 +121,4 @@
 
     #region Events
-    [StorableHook(HookType.AfterDeserialization)]
     protected void RegisterEvents() {
       dict.ItemsAdded += new CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>>(dict_ItemsAdded);
Index: /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs	(revision 4668)
@@ -57,4 +57,9 @@
     [StorableConstructor]
     protected ReadOnlyObservableKeyedCollection(bool deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
     #endregion
 
@@ -105,5 +110,4 @@
 
     #region Events
-    [StorableHook(HookType.AfterDeserialization)]
     protected void RegisterEvents() {
       collection.ItemsAdded += new CollectionItemsChangedEventHandler<TItem>(collection_ItemsAdded);
Index: /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs	(revision 4668)
@@ -59,4 +59,9 @@
     [StorableConstructor]
     protected ReadOnlyObservableList(bool deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
     #endregion
 
@@ -108,5 +113,4 @@
 
     #region Events
-    [StorableHook(HookType.AfterDeserialization)]
     protected void RegisterEvents() {
       list.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_ItemsAdded);
Index: /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs	(revision 4668)
@@ -51,4 +51,9 @@
     [StorableConstructor]
     protected ReadOnlyObservableSet(bool deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
     #endregion
 
@@ -130,5 +135,4 @@
 
     #region Events
-    [StorableHook(HookType.AfterDeserialization)]
     protected void RegisterEvents() {
       set.ItemsAdded += new CollectionItemsChangedEventHandler<T>(set_ItemsAdded);
Index: /branches/CloningRefactoring/HeuristicLab.Common/3.3/DeepCloneable.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Common/3.3/DeepCloneable.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Common/3.3/DeepCloneable.cs	(revision 4668)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 
 namespace HeuristicLab.Common {
@@ -27,4 +26,7 @@
   /// </summary>
   public abstract class DeepCloneable : IDeepCloneable {
+    protected DeepCloneable(DeepCloneable original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+    }
     protected DeepCloneable() { }
 
@@ -48,9 +50,5 @@
     /// cloned objects.</param>
     /// <returns>A clone of this instance.</returns>
-    public virtual IDeepCloneable Clone(Cloner cloner) {
-      DeepCloneable clone = (DeepCloneable)Activator.CreateInstance(this.GetType(),true);
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
+    public abstract IDeepCloneable Clone(Cloner cloner);
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs	(revision 4668)
@@ -46,4 +46,17 @@
 
     /// <summary>
+    /// Instantiates an empty CheckedItemCollection for deserialization.
+    /// </summary>
+    /// <param name="deserializing"></param>
+    [StorableConstructor]
+    protected CheckedItemCollection(bool deserializing) : base(deserializing) { }
+    protected CheckedItemCollection(CheckedItemCollection<T> original, Cloner cloner)
+      : base(original, cloner) {
+      list = new List<T>(original.Select(x => cloner.Clone<T>(x)));
+      checkedState = new Dictionary<T, bool>();
+      foreach (var pair in original.checkedState)
+        checkedState.Add(cloner.Clone<T>(pair.Key), pair.Value);
+    }
+    /// <summary>
     /// Instantiates a new CheckedItemCollection.
     /// </summary>
@@ -71,10 +84,4 @@
           checkedState.Add(item, true);
     }
-    /// <summary>
-    /// Instantiates an empty CheckedItemCollection for deserialization.
-    /// </summary>
-    /// <param name="deserializing"></param>
-    [StorableConstructor]
-    protected CheckedItemCollection(bool deserializing) : base(deserializing) { }
 
     /// <summary>
@@ -179,11 +186,5 @@
     /// <returns>A clone of the CheckedItemCollection</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      CheckedItemCollection<T> clone = (CheckedItemCollection<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
-      clone.checkedState = new Dictionary<T, bool>();
-      foreach (var pair in checkedState)
-        clone.checkedState.Add((T)cloner.Clone(pair.Key), pair.Value);
-      return clone;
+      return new CheckedItemCollection<T>(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 4668)
@@ -48,4 +48,18 @@
       }
     }
+
+    /// <summary>
+    /// Instantiates a new CheckedItemList for deserialization.
+    /// </summary>
+    /// <param name="deserializing"></param>
+    [StorableConstructor]
+    protected CheckedItemList(bool deserializing) : base(deserializing) { }
+    protected CheckedItemList(CheckedItemList<T> original, Cloner cloner)
+      : base(original, cloner) {
+      list = new List<T>(original.Select(x => (T)cloner.Clone(x)));
+      checkedState = new Dictionary<T, bool>();
+      foreach (var pair in original.checkedState)
+        checkedState.Add(cloner.Clone<T>(pair.Key), pair.Value);
+    }
     /// <summary>
     /// Instantiates an empty CheckedItemList.
@@ -75,10 +89,4 @@
       }
     }
-    /// <summary>
-    /// Instantiates a new CheckedItemList for deserialization.
-    /// </summary>
-    /// <param name="deserializing"></param>
-    [StorableConstructor]
-    protected CheckedItemList(bool deserializing) : base(deserializing) { }
 
     /// <summary>
@@ -228,11 +236,5 @@
     /// <returns>A deep clone of the CheckedItemList</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      CheckedItemList<T> clone = (CheckedItemList<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
-      clone.checkedState = new Dictionary<T, bool>();
-      foreach (var pair in checkedState)
-        clone.checkedState.Add((T)cloner.Clone(pair.Key), pair.Value);
-      return clone;
+      return new CheckedItemList<T>(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ConstraintCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ConstraintCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ConstraintCollection.cs	(revision 4668)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,9 +28,10 @@
   [Item("ConstraintCollection", "Represents a collection of constraints.")]
   public class ConstraintCollection : ItemCollection<IConstraint> {
+    [StorableConstructor]
+    protected ConstraintCollection(bool deserializing) : base(deserializing) { }
+    protected ConstraintCollection(ConstraintCollection original, Cloner cloner) : base(original, cloner) { }
     public ConstraintCollection() : base() { }
     public ConstraintCollection(int capacity) : base(capacity) { }
     public ConstraintCollection(IEnumerable<IConstraint> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ConstraintCollection(bool deserializing) : base(deserializing) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemArray.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemArray.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemArray.cs	(revision 4668)
@@ -46,10 +46,14 @@
     }
 
+    [StorableConstructor]
+    protected ItemArray(bool deserializing) : base(deserializing) { }
+    protected ItemArray(ItemArray<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      array = original.Select(x => cloner.Clone<T>(x)).ToArray();
+    }
     public ItemArray() : base() { }
     public ItemArray(int length) : base(length) { }
     public ItemArray(T[] array) : base(array) { }
     public ItemArray(IEnumerable<T> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ItemArray(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -57,8 +61,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ItemArray<T> clone = (ItemArray<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.array = this.Select(x => (T)cloner.Clone(x)).ToArray();
-      return clone;
+      return new ItemArray<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemCollection.cs	(revision 4668)
@@ -46,9 +46,13 @@
     }
 
+    [StorableConstructor]
+    protected ItemCollection(bool deserializing) : base(deserializing) { }
+    protected ItemCollection(ItemCollection<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      list = new List<T>(original.Select(x => cloner.Clone<T>(x)));
+    }
     public ItemCollection() : base() { }
     public ItemCollection(int capacity) : base(capacity) { }
     public ItemCollection(IEnumerable<T> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ItemCollection(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -56,8 +60,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ItemCollection<T> clone = (ItemCollection<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
-      return clone;
+      return new ItemCollection<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemDictionary.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemDictionary.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemDictionary.cs	(revision 4668)
@@ -48,9 +48,14 @@
     }
 
+    [StorableConstructor]
+    protected ItemDictionary(bool deserializing) : base(deserializing) { }
+    protected ItemDictionary(ItemDictionary<TKey, TValue> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      foreach (TKey key in dict.Keys)
+        dict.Add(cloner.Clone<TKey>(key), cloner.Clone<TValue>(dict[key]));
+    }
     public ItemDictionary() : base() { }
     public ItemDictionary(int capacity) : base(capacity) { }
     public ItemDictionary(IDictionary<TKey, TValue> dictionary) : base(dictionary) { }
-    [StorableConstructor]
-    protected ItemDictionary(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -58,9 +63,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ItemDictionary<TKey, TValue> clone = (ItemDictionary<TKey, TValue>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      foreach (TKey key in dict.Keys)
-        clone.dict.Add((TKey)cloner.Clone(key), (TValue)cloner.Clone(dict[key]));
-      return clone;
+      return new ItemDictionary<TKey, TValue>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemList.cs	(revision 4668)
@@ -46,9 +46,13 @@
     }
 
+    [StorableConstructor]
+    protected ItemList(bool deserializing) : base(deserializing) { }
+    protected ItemList(ItemList<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      list = new List<T>(original.Select(x => cloner.Clone<T>(x)));
+    }
     public ItemList() : base() { }
     public ItemList(int capacity) : base(capacity) { }
     public ItemList(IEnumerable<T> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ItemList(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -56,8 +60,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ItemList<T> clone = (ItemList<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
-      return clone;
+      return new ItemList<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemSet.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemSet.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ItemSet.cs	(revision 4668)
@@ -46,8 +46,12 @@
     }
 
+    [StorableConstructor]
+    protected ItemSet(bool deserializing) : base(deserializing) { }
+    protected ItemSet(ItemSet<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      set = new HashSet<T>(original.Select(x => cloner.Clone<T>(x)));
+    }
     public ItemSet() : base() { }
     public ItemSet(IEnumerable<T> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ItemSet(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -55,8 +59,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ItemSet<T> clone = (ItemSet<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.set = new HashSet<T>(this.Select(x => (T)cloner.Clone(x)));
-      return clone;
+      return new ItemSet<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/KeyedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/KeyedItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/KeyedItemCollection.cs	(revision 4668)
@@ -44,22 +44,21 @@
     }
 
+    [StorableConstructor]
+    protected KeyedItemCollection(bool deserializing) : base(deserializing) { }
+    protected KeyedItemCollection(KeyedItemCollection<TKey, TItem> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      foreach (TItem item in original.dict.Values) {
+        TItem clonedItem = cloner.Clone<TItem>(item);
+        dict.Add(GetKeyForItem(clonedItem), clonedItem);
+      }
+    }
     protected KeyedItemCollection() : base() { }
     protected KeyedItemCollection(int capacity) : base(capacity) { }
     protected KeyedItemCollection(IEnumerable<TItem> collection) : base(collection) { }
-    [StorableConstructor]
-    protected KeyedItemCollection(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
       return Clone(new Cloner());
     }
-    public virtual IDeepCloneable Clone(Cloner cloner) {
-      KeyedItemCollection<TKey, TItem> clone = (KeyedItemCollection<TKey, TItem>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      foreach (TItem item in dict.Values) {
-        TItem clonedItem = (TItem)cloner.Clone(item);
-        clone.dict.Add(GetKeyForItem(clonedItem), clonedItem);
-      }
-      return clone;
-    }
+    public abstract IDeepCloneable Clone(Cloner cloner);
 
     public new ReadOnlyKeyedItemCollection<TKey, TItem> AsReadOnly() {
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/NamedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/NamedItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/NamedItemCollection.cs	(revision 4668)
@@ -29,22 +29,24 @@
   [StorableClass]
   public class NamedItemCollection<T> : KeyedItemCollection<string, T> where T : class, INamedItem {
+    [StorableConstructor]
+    protected NamedItemCollection(bool deserializing) : base(deserializing) { }
+    protected NamedItemCollection(NamedItemCollection<T> original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterItemEvents(this);
+    }
     public NamedItemCollection() : base() { }
     public NamedItemCollection(int capacity) : base(capacity) { }
     public NamedItemCollection(IEnumerable<T> collection)
       : base(collection) {
-      Initialize();
+      RegisterItemEvents(this);
     }
-    [StorableConstructor]
-    protected NamedItemCollection(bool deserializing) : base(deserializing) { }
 
     [StorableHook(HookType.AfterDeserialization)]
-    protected void Initialize() {
+    private void AfterDeserialization() {
       RegisterItemEvents(this);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      NamedItemCollection<T> clone = (NamedItemCollection<T>)base.Clone(cloner);
-      clone.Initialize();
-      return clone;
+      return new NamedItemCollection<T>(this, cloner);
     }
 
@@ -73,5 +75,5 @@
     }
 
-    private void RegisterItemEvents(IEnumerable<T> items) {
+    protected void RegisterItemEvents(IEnumerable<T> items) {
       foreach (T item in items) {
         if (item != null) {
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperationCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperationCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperationCollection.cs	(revision 4668)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -39,4 +38,11 @@
     }
 
+    [StorableConstructor]
+    private OperationCollection(bool deserializing) { }
+    private OperationCollection(OperationCollection original, Cloner cloner)
+      : base(original, cloner) {
+      operations = new List<IOperation>(original.Select(x => cloner.Clone<IOperation>(x)));
+      parallel = original.parallel;
+    }
     public OperationCollection() {
       operations = new List<IOperation>();
@@ -51,13 +57,7 @@
       parallel = false;
     }
-    [StorableConstructor]
-    private OperationCollection(bool deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      OperationCollection clone = (OperationCollection)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.operations = new List<IOperation>(this.Select(x => (IOperation)cloner.Clone(x)));
-      clone.parallel = parallel;
-      return clone;
+      return new OperationCollection(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorCollection.cs	(revision 4668)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,8 +28,9 @@
   [Item("Operator Collection", "Represents a collection of operators.")]
   public class OperatorCollection : ItemCollection<IOperator> {
+    [StorableConstructor]
+    protected OperatorCollection(bool deserializing) : base(deserializing) { }
+    protected OperatorCollection(OperatorCollection original, Cloner cloner) : base(original, cloner) { }
     public OperatorCollection() : base() { }
     public OperatorCollection(IEnumerable<IOperator> collection) : base(collection) { }
-    [StorableConstructor]
-    protected OperatorCollection(bool deserializing) : base(deserializing) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorList.cs	(revision 4668)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,9 +28,10 @@
   [Item("OperatorList", "Represents a list of operators.")]
   public class OperatorList : ItemList<IOperator> {
+    [StorableConstructor]
+    protected OperatorList(bool deserializing) : base(deserializing) { }
+    protected OperatorList(OperatorList original, Cloner cloner) : base(original, cloner) { }
     public OperatorList() : base() { }
     public OperatorList(int capacity) : base(capacity) { }
     public OperatorList(IEnumerable<IOperator> collection) : base(collection) { }
-    [StorableConstructor]
-    protected OperatorList(bool deserializing) : base(deserializing) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorSet.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorSet.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/OperatorSet.cs	(revision 4668)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,8 +28,9 @@
   [Item("OperatorSet", "Represents a set of operators.")]
   public class OperatorSet : ItemSet<IOperator> {
+    [StorableConstructor]
+    protected OperatorSet(bool deserializing) : base(deserializing) { }
+    protected OperatorSet(OperatorSet original, Cloner cloner) : base(original, cloner) { }
     public OperatorSet() : base() { }
     public OperatorSet(IEnumerable<IOperator> collection) : base(collection) { }
-    [StorableConstructor]
-    protected OperatorSet(bool deserializing) : base(deserializing) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ParameterCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ParameterCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ParameterCollection.cs	(revision 4668)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,9 +28,10 @@
   [Item("ParameterCollection", "Represents a collection of parameters.")]
   public class ParameterCollection : NamedItemCollection<IParameter> {
+    [StorableConstructor]
+    protected ParameterCollection(bool deserializing) : base(deserializing) { }
+    protected ParameterCollection(ParameterCollection original, Cloner cloner) : base(original, cloner) { }
     public ParameterCollection() : base() { }
     public ParameterCollection(int capacity) : base(capacity) { }
     public ParameterCollection(IEnumerable<IParameter> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ParameterCollection(bool deserializing) : base(deserializing) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemCollection.cs	(revision 4668)
@@ -34,4 +34,10 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyCheckedItemCollection(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyCheckedItemCollection(ReadOnlyCheckedItemCollection<T> original, Cloner cloner)
+      : base(original, cloner) {
+      CheckedItemCollection.CheckedItemsChanged += new CollectionItemsChangedEventHandler<T>(collection_CheckedItemsChanged);
+    }
     public ReadOnlyCheckedItemCollection() : base(new CheckedItemCollection<T>()) { }
     public ReadOnlyCheckedItemCollection(ICheckedItemCollection<T> collection)
@@ -40,15 +46,11 @@
     }
 
-    [StorableConstructor]
-    protected ReadOnlyCheckedItemCollection(bool deserializing) : base(deserializing) { }
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       CheckedItemCollection.CheckedItemsChanged += new CollectionItemsChangedEventHandler<T>(collection_CheckedItemsChanged);
     }
 
-    public override IDeepCloneable Clone(Common.Cloner cloner) {
-      ReadOnlyCheckedItemCollection<T> clone = (ReadOnlyCheckedItemCollection<T>)base.Clone(cloner);
-      clone.CheckedItemCollection.CheckedItemsChanged += new CollectionItemsChangedEventHandler<T>(clone.collection_CheckedItemsChanged);
-      return clone;
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ReadOnlyCheckedItemCollection<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemList.cs	(revision 4668)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -33,4 +34,10 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyCheckedItemList(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyCheckedItemList(ReadOnlyCheckedItemList<T> original, Cloner cloner)
+      : base(original, cloner) {
+      CheckedItemList.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_CheckedItemsChanged);
+    }
     public ReadOnlyCheckedItemList() : base(new CheckedItemList<T>()) { }
     public ReadOnlyCheckedItemList(ICheckedItemList<T> list)
@@ -39,15 +46,11 @@
     }
 
-    [StorableConstructor]
-    protected ReadOnlyCheckedItemList(bool deserializing) : base(deserializing) { }
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       CheckedItemList.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_CheckedItemsChanged);
     }
 
-    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
-      ReadOnlyCheckedItemList<T> clone = (ReadOnlyCheckedItemList<T>)base.Clone(cloner);
-      clone.CheckedItemList.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<T>>(clone.list_CheckedItemsChanged);
-      return clone;
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ReadOnlyCheckedItemList<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemArray.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemArray.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemArray.cs	(revision 4668)
@@ -44,8 +44,13 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyItemArray(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyItemArray(ReadOnlyItemArray<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      array = cloner.Clone<IItemArray<T>>((IItemArray<T>)original.array);
+      RegisterEvents();
+    }
     public ReadOnlyItemArray() : base(new ItemArray<T>()) { }
     public ReadOnlyItemArray(IItemArray<T> array) : base(array) { }
-    [StorableConstructor]
-    protected ReadOnlyItemArray(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -53,9 +58,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ReadOnlyItemArray<T> clone = (ReadOnlyItemArray<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.array = (IItemArray<T>)((IItemArray<T>)array).Clone(cloner);
-      clone.RegisterEvents();
-      return clone;
+      return new ReadOnlyItemArray<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemCollection.cs	(revision 4668)
@@ -44,8 +44,13 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyItemCollection(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyItemCollection(ReadOnlyItemCollection<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      collection = cloner.Clone<IItemCollection<T>>((IItemCollection<T>)original.collection);
+      RegisterEvents();
+    }
     public ReadOnlyItemCollection() : base(new ItemCollection<T>()) { }
     public ReadOnlyItemCollection(IItemCollection<T> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ReadOnlyItemCollection(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -53,9 +58,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ReadOnlyItemCollection<T> clone = (ReadOnlyItemCollection<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.collection = (IItemCollection<T>)((IItemCollection<T>)collection).Clone(cloner);
-      clone.RegisterEvents();
-      return clone;
+      return new ReadOnlyItemCollection<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemDictionary.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemDictionary.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemDictionary.cs	(revision 4668)
@@ -47,8 +47,13 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyItemDictionary(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyItemDictionary(ReadOnlyItemDictionary<TKey, TValue> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      dict = cloner.Clone((IItemDictionary<TKey, TValue>)original.dict);
+      RegisterEvents();
+    }
     public ReadOnlyItemDictionary() : base(new ItemDictionary<TKey, TValue>()) { }
     public ReadOnlyItemDictionary(IItemDictionary<TKey, TValue> dictionary) : base(dictionary) { }
-    [StorableConstructor]
-    protected ReadOnlyItemDictionary(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -56,9 +61,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ReadOnlyItemDictionary<TKey, TValue> clone = (ReadOnlyItemDictionary<TKey, TValue>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.dict = (IItemDictionary<TKey, TValue>)((IItemDictionary<TKey, TValue>)dict).Clone(cloner);
-      clone.RegisterEvents();
-      return clone;
+      return new ReadOnlyItemDictionary<TKey, TValue>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemList.cs	(revision 4668)
@@ -44,8 +44,13 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyItemList(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyItemList(ReadOnlyItemList<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      list = cloner.Clone((IItemList<T>)original.list);
+      RegisterEvents();
+    }
     public ReadOnlyItemList() : base(new ItemList<T>()) { }
     public ReadOnlyItemList(IItemList<T> list) : base(list) { }
-    [StorableConstructor]
-    protected ReadOnlyItemList(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -53,9 +58,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ReadOnlyItemList<T> clone = (ReadOnlyItemList<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.list = (IItemList<T>)((IItemList<T>)list).Clone(cloner);
-      clone.RegisterEvents();
-      return clone;
+      return new ReadOnlyItemList<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemSet.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemSet.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyItemSet.cs	(revision 4668)
@@ -44,8 +44,13 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyItemSet(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyItemSet(ReadOnlyItemSet<T> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      set = cloner.Clone((IItemSet<T>)original.set);
+      RegisterEvents();
+    }
     public ReadOnlyItemSet() : base(new ItemSet<T>()) { }
     public ReadOnlyItemSet(IItemSet<T> set) : base(set) { }
-    [StorableConstructor]
-    protected ReadOnlyItemSet(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -53,9 +58,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ReadOnlyItemSet<T> clone = (ReadOnlyItemSet<T>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.set = (IItemSet<T>)((IItemSet<T>)set).Clone(cloner);
-      clone.RegisterEvents();
-      return clone;
+      return new ReadOnlyItemSet<T>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyKeyedItemCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyKeyedItemCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ReadOnlyKeyedItemCollection.cs	(revision 4668)
@@ -44,8 +44,13 @@
     }
 
+    [StorableConstructor]
+    protected ReadOnlyKeyedItemCollection(bool deserializing) : base(deserializing) { }
+    protected ReadOnlyKeyedItemCollection(ReadOnlyKeyedItemCollection<TKey, TItem> original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      collection = cloner.Clone((IKeyedItemCollection<TKey, TItem>)original.collection);
+      RegisterEvents();
+    }
     protected ReadOnlyKeyedItemCollection() : base() { }
     public ReadOnlyKeyedItemCollection(IKeyedItemCollection<TKey, TItem> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ReadOnlyKeyedItemCollection(bool deserializing) : base(deserializing) { }
 
     public object Clone() {
@@ -53,9 +58,5 @@
     }
     public virtual IDeepCloneable Clone(Cloner cloner) {
-      ReadOnlyKeyedItemCollection<TKey, TItem> clone = (ReadOnlyKeyedItemCollection<TKey, TItem>)Activator.CreateInstance(this.GetType());
-      cloner.RegisterClonedObject(this, clone);
-      clone.collection = (IKeyedItemCollection<TKey, TItem>)((IKeyedItemCollection<TKey, TItem>)collection).Clone(cloner);
-      clone.RegisterEvents();
-      return clone;
+      return new ReadOnlyKeyedItemCollection<TKey, TItem>(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ScopeList.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ScopeList.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ScopeList.cs	(revision 4668)
@@ -29,15 +29,16 @@
   [Item("ScopeList", "Represents a list of scopes.")]
   public sealed class ScopeList : ItemList<IScope> {
+    [StorableConstructor]
+    private ScopeList(bool deserializing) : base(deserializing) { }
+    private ScopeList(ScopeList original, Cloner cloner)
+      : base(original, cloner) {
+      list = new List<IScope>(original.Select(x => cloner.Clone(x)));
+    }
     public ScopeList() : base() { }
     public ScopeList(int capacity) : base(capacity) { }
     public ScopeList(IEnumerable<IScope> collection) : base(collection) { }
-    [StorableConstructor]
-    private ScopeList(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ScopeList clone = new ScopeList();
-      cloner.RegisterClonedObject(this, clone);
-      clone.list = new List<IScope>(this.Select(x => (IScope)cloner.Clone(x)));
-      return clone;
+      return new ScopeList(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ValueParameterCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ValueParameterCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/ValueParameterCollection.cs	(revision 4668)
@@ -21,4 +21,5 @@
 
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -27,9 +28,10 @@
   [Item("ValueParameterCollection", "Represents a collection of value parameters.")]
   public class ValueParameterCollection : NamedItemCollection<IValueParameter> {
+    [StorableConstructor]
+    protected ValueParameterCollection(bool deserializing) : base(deserializing) { }
+    protected ValueParameterCollection(ValueParameterCollection original, Cloner cloner) : base(original, cloner) { }
     public ValueParameterCollection() : base() { }
     public ValueParameterCollection(int capacity) : base(capacity) { }
     public ValueParameterCollection(IEnumerable<IValueParameter> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ValueParameterCollection(bool deserializing) : base(deserializing) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/VariableCollection.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/VariableCollection.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Collections/VariableCollection.cs	(revision 4668)
@@ -28,17 +28,18 @@
   [Item("VariableCollection", "Represents a collection of variables.")]
   public sealed class VariableCollection : NamedItemCollection<IVariable> {
+    [StorableConstructor]
+    private VariableCollection(bool deserializing) : base(deserializing) { }
+    private VariableCollection(VariableCollection original, Cloner cloner)
+      : base(original, cloner) {
+      foreach (string key in original.dict.Keys)
+        dict.Add(key, cloner.Clone(original.dict[key]));
+      RegisterItemEvents(this);
+    }
     public VariableCollection() : base() { }
     public VariableCollection(int capacity) : base(capacity) { }
     public VariableCollection(IEnumerable<IVariable> collection) : base(collection) { }
-    [StorableConstructor]
-    private VariableCollection(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      VariableCollection clone = new VariableCollection();
-      cloner.RegisterClonedObject(this, clone);
-      foreach (string key in dict.Keys)
-        clone.dict.Add(key, (IVariable)cloner.Clone(dict[key]));
-      clone.Initialize();
-      return clone;
+      return new VariableCollection(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/ComparisonConstraint.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/ComparisonConstraint.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/ComparisonConstraint.cs	(revision 4668)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -30,5 +31,5 @@
     [StorableConstructor]
     protected ComparisonConstraint(bool deserializing) : base(deserializing) { }
-
+    protected ComparisonConstraint(ComparisonConstraint original, Cloner cloner) : base(original, cloner) { }
     public ComparisonConstraint() : base() { }
     public ComparisonConstraint(IItem constrainedValue, ConstraintOperation comparisonOperation, object comparisonValue)
@@ -41,4 +42,8 @@
     public override IEnumerable<ConstraintOperation> AllowedConstraintOperations {
       get { return new ConstraintOperation[6] { ConstraintOperation.Less, ConstraintOperation.LessOrEqual, ConstraintOperation.Equal, ConstraintOperation.GreaterOrEqual, ConstraintOperation.Greater, ConstraintOperation.NotEqual }; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ComparisonConstraint(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/Constraint.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/Constraint.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/Constraint.cs	(revision 4668)
@@ -31,5 +31,19 @@
     [StorableConstructor]
     protected Constraint(bool deserializing) : base(deserializing) { }
+    protected Constraint(Constraint original, Cloner cloner)
+      : base(original, cloner) {
+      constrainedValue = null;  //mkommend: intentionally set to null;
 
+      IItem constraintDataItem = original.constraintData as IItem;
+      ICloneable constraintDataCloneable = original.constraintData as ICloneable;
+      if (constraintDataItem != null)
+        constraintData = cloner.Clone(constraintDataItem);
+      else if (constraintDataCloneable != null)
+        constraintData = constraintDataCloneable.Clone();
+      else
+        constraintData = original.constraintData;
+
+      constraintOperation = original.constraintOperation;
+    }
     protected Constraint() {
       this.Active = false;
@@ -138,6 +152,5 @@
     protected virtual void OnActiveChanged() {
       EventHandler handler = ActiveChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -145,6 +158,5 @@
     protected virtual void OnConstrainedValueChanged() {
       EventHandler handler = ConstrainedValueChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -152,6 +164,5 @@
     protected virtual void OnConstraintDataChanged() {
       EventHandler handler = ConstraintDataChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -159,6 +170,5 @@
     protected virtual void OnConstraintOperationChanged() {
       EventHandler handler = ConstraintOperationChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      if (handler != null) handler(this, EventArgs.Empty);
     }
     #endregion
@@ -182,22 +192,4 @@
       return s;
     }
-
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      Constraint clone = (Constraint)base.Clone(cloner);
-      clone.constrainedValue = null;  //mkommend: intentionally set to null;
-
-      IItem constraintDataItem = this.constraintData as IItem;
-      ICloneable constraintDataCloneable = this.constraintData as ICloneable;
-      if (constraintDataItem != null)
-        clone.constraintData = cloner.Clone(constraintDataItem);
-      else if (constraintDataCloneable != null)
-        clone.constraintData = constraintDataCloneable.Clone();
-      else
-        clone.constraintData = constraintData;
-
-      clone.constraintOperation = this.constraintOperation;
-
-      return clone;
-    }
     #endregion
   }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/EqualityConstraint.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/EqualityConstraint.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/EqualityConstraint.cs	(revision 4668)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -30,5 +31,5 @@
     [StorableConstructor]
     protected EqualityConstraint(bool deserializing) : base(deserializing) { }
-
+    protected EqualityConstraint(EqualityConstraint original, Cloner cloner) : base(original, cloner) { }
     public EqualityConstraint() : base() { }
     public EqualityConstraint(IItem constrainedValue, ConstraintOperation constraintOperation, object constraintData)
@@ -41,4 +42,8 @@
     public override IEnumerable<ConstraintOperation> AllowedConstraintOperations {
       get { return new ConstraintOperation[2] { ConstraintOperation.Equal, ConstraintOperation.NotEqual }; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EqualityConstraint(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/TypeCompatibilityConstraint.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/TypeCompatibilityConstraint.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Constraints/TypeCompatibilityConstraint.cs	(revision 4668)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -28,8 +29,8 @@
   [Item("TypeCompatibilityConstraint", "A constraint that checks for compatible types.")]
   public class TypeCompatibilityConstraint : Constraint {
-    public TypeCompatibilityConstraint() {
-    }
     [StorableConstructor]
     protected TypeCompatibilityConstraint(bool deserializing) : base(deserializing) { }
+    protected TypeCompatibilityConstraint(TypeCompatibilityConstraint original, Cloner cloner) : base(original, cloner) { }
+    public TypeCompatibilityConstraint() : base() { }
     public TypeCompatibilityConstraint(IItem constrainedValue, ConstraintOperation constraintOperation, Type constraintData)
       : base(constrainedValue, constraintOperation, constraintData) {
@@ -46,4 +47,8 @@
     public override IEnumerable<ConstraintOperation> AllowedConstraintOperations {
       get { return new ConstraintOperation[2] { ConstraintOperation.IsTypeCompatible, ConstraintOperation.IsTypeNotCompatible }; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TypeCompatibilityConstraint(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Engine.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Engine.cs	(revision 4668)
@@ -46,4 +46,22 @@
     private System.Timers.Timer timer;
 
+    [StorableConstructor]
+    protected Engine(bool deserializing)
+      : base(deserializing) {
+      pausePending = stopPending = false;
+      timer = new System.Timers.Timer(100);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+    }
+    protected Engine(Engine original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
+      log = cloner.Clone(original.log);
+      IOperation[] contexts = original.executionStack.ToArray();
+      for (int i = contexts.Length - 1; i >= 0; i--)
+        executionStack.Push(cloner.Clone(contexts[i]));
+      pausePending = original.pausePending;
+      stopPending = original.stopPending;
+    }
     protected Engine()
       : base() {
@@ -54,24 +72,4 @@
       timer.AutoReset = true;
       timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
-    }
-    [StorableConstructor]
-    protected Engine(bool deserializing)
-      : base(deserializing) {
-      pausePending = stopPending = false;
-      timer = new System.Timers.Timer(100);
-      timer.AutoReset = true;
-      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      if (ExecutionState == ExecutionState.Started) throw new InvalidOperationException(string.Format("Clone not allowed in execution state \"{0}\".", ExecutionState));
-      Engine clone = (Engine)base.Clone(cloner);
-      clone.log = (ILog)cloner.Clone(log);
-      IOperation[] contexts = executionStack.ToArray();
-      for (int i = contexts.Length - 1; i >= 0; i--)
-        clone.executionStack.Push((IOperation)cloner.Clone(contexts[i]));
-      clone.pausePending = pausePending;
-      clone.stopPending = stopPending;
-      return clone;
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Executable.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Executable.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Executable.cs	(revision 4668)
@@ -62,16 +62,14 @@
     }
 
+    [StorableConstructor]
+    protected Executable(bool deserializing) : base(deserializing) { }
+    protected Executable(Executable original, Cloner cloner)
+      : base(original, cloner) {
+      executionState = original.executionState;
+      executionTime = original.executionTime;
+    }
     protected Executable() {
       executionState = ExecutionState.Stopped;
       executionTime = TimeSpan.Zero;
-    }
-    [StorableConstructor]
-    protected Executable(bool deserializing) : base(deserializing) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      Executable clone = (Executable)base.Clone(cloner);
-      clone.executionState = executionState;
-      clone.executionTime = executionTime;
-      return clone;
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/ExecutionContext.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/ExecutionContext.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/ExecutionContext.cs	(revision 4668)
@@ -50,4 +50,12 @@
     }
 
+    [StorableConstructor]
+    private ExecutionContext(bool deserializing) { }
+    private ExecutionContext(ExecutionContext original, Cloner cloner)
+      : base(original, cloner) {
+      parent = cloner.Clone(original.parent);
+      parameterizedItem = cloner.Clone(original.parameterizedItem);
+      scope = cloner.Clone(original.scope);
+    }
     private ExecutionContext() {
       parent = null;
@@ -63,10 +71,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ExecutionContext clone = new ExecutionContext();
-      cloner.RegisterClonedObject(this, clone);
-      clone.parent = (IExecutionContext)cloner.Clone(parent);
-      clone.parameterizedItem = (IParameterizedItem)cloner.Clone(parameterizedItem);
-      clone.scope = (IScope)cloner.Clone(scope);
-      return clone;
+      return new ExecutionContext(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Log.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Log.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Log.cs	(revision 4668)
@@ -43,15 +43,17 @@
     }
 
+    [StorableConstructor]
+    protected Log(bool deserializing) : base(deserializing) { }
+    protected Log(Log original, Cloner cloner)
+      : base(original, cloner) {
+      messages = new List<string>(original.messages);
+    }
     public Log()
       : base() {
       messages = new List<string>();
     }
-    [StorableConstructor]
-    protected Log(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Log clone = (Log)base.Clone(cloner);
-      clone.messages = new List<string>(messages);
-      return clone;
+      return new Log(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/NamedItem.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/NamedItem.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/NamedItem.cs	(revision 4668)
@@ -66,4 +66,11 @@
     }
 
+    [StorableConstructor]
+    protected NamedItem(bool deserializing) : base(deserializing) { }
+    protected NamedItem(NamedItem original, Cloner cloner)
+      : base(original, cloner) {
+      name = original.name;
+      description = original.description;
+    }
     /// <summary>
     /// Initializes a new instance of <see cref="Variable"/> with name <c>Anonymous</c> 
@@ -91,18 +98,4 @@
       else this.description = description;
     }
-    [StorableConstructor]
-    protected NamedItem(bool deserializing) : base(deserializing) { }
-
-    /// <summary>
-    /// Clones the current instance (deep clone).
-    /// </summary>
-    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
-    /// <returns>The cloned object as <see cref="Variable"/>.</returns>
-    public override IDeepCloneable Clone(Cloner cloner) {
-      NamedItem clone = (NamedItem)base.Clone(cloner);
-      clone.name = name;
-      clone.description = description;
-      return clone;
-    }
 
     /// <summary>
@@ -121,6 +114,6 @@
     /// <param name="e">The event arguments of the changing.</param>
     protected virtual void OnNameChanging(CancelEventArgs<string> e) {
-      if (NameChanging != null)
-        NameChanging(this, e);
+      var handler = NameChanging;
+      if (handler != null) handler(this, e);
     }
     /// <inheritdoc/>
@@ -131,6 +124,6 @@
     /// <remarks>Calls <see cref="ItemBase.OnChanged"/>.</remarks>
     protected virtual void OnNameChanged() {
-      if (NameChanged != null)
-        NameChanged(this, EventArgs.Empty);
+      var handler = NameChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
       OnToStringChanged();
     }
@@ -142,6 +135,6 @@
     /// <remarks>Calls <see cref="ItemBase.OnChanged"/>.</remarks>
     protected virtual void OnDescriptionChanged() {
-      if (DescriptionChanged != null)
-        DescriptionChanged(this, EventArgs.Empty);
+      var handler = DescriptionChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/OperatorGraph.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 4668)
@@ -76,4 +76,13 @@
     }
 
+    [StorableConstructor]
+    protected OperatorGraph(bool deserializing) : base(deserializing) { }
+    protected OperatorGraph(OperatorGraph original, Cloner cloner)
+      : base(original, cloner) {
+      operators = cloner.Clone(original.operators);
+      initialOperator = cloner.Clone(original.initialOperator);
+      visualizationInfo = cloner.Clone(original.visualizationInfo);
+      Initialize();
+    }
     /// <summary>
     /// Initializes a new instance of <see cref="OperatorGraph"/>.
@@ -85,6 +94,4 @@
       Initialize();
     }
-    [StorableConstructor]
-    protected OperatorGraph(bool deserializing) : base(deserializing) { }
 
     //mkommend: IMPORTANT DO NOT REMOVE THIS PRIVATE EVENT
@@ -93,8 +100,11 @@
     private void OnOperatorGraphDeserializationFinished() {
       EventHandler handler = DeserializationFinished;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
-    }
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
     [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
     private void Initialize() {
       RegisterOperatorsEvents();
@@ -110,10 +120,5 @@
     /// <returns>The cloned object as <see cref="OperatorGraph"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      OperatorGraph clone = (OperatorGraph)base.Clone(cloner);
-      clone.operators = (OperatorSet)cloner.Clone(operators);
-      clone.initialOperator = (IOperator)cloner.Clone(initialOperator);
-      clone.visualizationInfo = cloner.Clone(visualizationInfo);
-      clone.Initialize();
-      return clone;
+      return new OperatorGraph(this, cloner);
     }
 
@@ -124,6 +129,6 @@
     /// </summary>
     protected virtual void OnInitialOperatorChanged() {
-      if (InitialOperatorChanged != null)
-        InitialOperatorChanged(this, EventArgs.Empty);
+      var handler = InitialOperatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 4668)
@@ -45,4 +45,11 @@
     }
 
+    [StorableConstructor]
+    protected ParameterizedNamedItem(bool deserializing) : base(deserializing) { }
+    protected ParameterizedNamedItem(ParameterizedNamedItem original, Cloner cloner)
+      : base(original, cloner) {
+      parameters = cloner.Clone(original.parameters);
+      readOnlyParameters = null;
+    }
     protected ParameterizedNamedItem()
       : base() {
@@ -74,13 +81,4 @@
       readOnlyParameters = null;
     }
-    [StorableConstructor]
-    protected ParameterizedNamedItem(bool deserializing) : base(deserializing) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ParameterizedNamedItem clone = (ParameterizedNamedItem)base.Clone(cloner);
-      clone.parameters = (ParameterCollection)cloner.Clone(parameters);
-      clone.readOnlyParameters = null;
-      return clone;
-    }
 
     public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Scope.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Scope.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Scope.cs	(revision 4668)
@@ -59,4 +59,16 @@
     }
 
+    [StorableConstructor]
+    private Scope(bool deserializing) : base(deserializing) { }
+    private Scope(Scope original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.variables.Count > 0) variables = cloner.Clone(original.variables);
+      if (original.subScopes.Count > 0) {
+        subScopes = cloner.Clone(original.subScopes);
+        foreach (IScope child in SubScopes)
+          child.Parent = this;
+        RegisterSubScopesEvents();
+      }
+    }
     /// <summary>
     /// Initializes a new instance of <see cref="Scope"/> having "Anonymous" as default name.
@@ -67,5 +79,5 @@
       variables = new VariableCollection();
       subScopes = new ScopeList();
-      Initialize();
+      RegisterSubScopesEvents();
     }
     /// <summary>
@@ -78,5 +90,5 @@
       variables = new VariableCollection();
       subScopes = new ScopeList();
-      Initialize();
+      RegisterSubScopesEvents();
     }
     public Scope(string name, string description)
@@ -85,11 +97,9 @@
       variables = new VariableCollection();
       subScopes = new ScopeList();
-      Initialize();
+      RegisterSubScopesEvents();
     }
-    [StorableConstructor]
-    private Scope(bool deserializing) : base(deserializing) { }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       RegisterSubScopesEvents();
     }
@@ -103,16 +113,5 @@
     /// <inheritdoc/>
     public override IDeepCloneable Clone(Cloner cloner) {
-      Scope clone = new Scope();
-      cloner.RegisterClonedObject(this, clone);
-      clone.name = name;
-      clone.description = description;
-      if (variables.Count > 0) clone.variables = (VariableCollection)cloner.Clone(variables);
-      if (subScopes.Count > 0) {
-        clone.subScopes = (ScopeList)cloner.Clone(subScopes);
-        foreach (IScope child in clone.SubScopes)
-          child.Parent = clone;
-        clone.Initialize();
-      }
-      return clone;
+      return new Scope(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Core/3.3/Variable.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Core/3.3/Variable.cs	(revision 4667)
+++ /branches/CloningRefactoring/HeuristicLab.Core/3.3/Variable.cs	(revision 4668)
@@ -55,4 +55,11 @@
     }
 
+    [StorableConstructor]
+    private Variable(bool deserializing) : base(deserializing) { }
+    private Variable(Variable original, Cloner cloner)
+      : base(original, cloner) {
+      value = cloner.Clone(original.value);
+      RegisterValueEvents();
+    }
     /// <summary>
     /// Initializes a new instance of <see cref="Variable"/> with name <c>Anonymous</c> 
@@ -80,16 +87,14 @@
       : base(name) {
       this.value = value;
-      Initialize();
+      RegisterValueEvents();
     }
     public Variable(string name, string description, IItem value)
       : base(name, description) {
       this.value = value;
-      Initialize();
+      RegisterValueEvents();
     }
-    [StorableConstructor]
-    private Variable(bool deserializing) : base(deserializing) { }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       RegisterValueEvents();
     }
@@ -101,9 +106,5 @@
     /// <returns>The cloned object as <see cref="Variable"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      Variable clone = new Variable(Name, Description);
-      cloner.RegisterClonedObject(this, clone);
-      clone.value = (IItem)cloner.Clone(value);
-      clone.Initialize();
-      return clone;
+      return new Variable(this, cloner);
     }
 
@@ -125,6 +126,6 @@
     /// </summary>
     private void OnValueChanged() {
-      if (ValueChanged != null)
-        ValueChanged(this, EventArgs.Empty);
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
       OnItemImageChanged();
       OnToStringChanged();
