Index: /branches/CloningRefactoring/HeuristicLab.Random/3.3/FastRandom.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Random/3.3/FastRandom.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.Random/3.3/FastRandom.cs	(revision 4675)
@@ -54,4 +54,25 @@
 
     #region Constructors
+    /// <summary>
+    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
+    /// </summary>
+    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
+    [StorableConstructor]
+    private FastRandom(bool deserializing) : base(deserializing) { }
+
+    /// <summary>
+    /// Initializes a new instance from an existing one (copy constructor).
+    /// </summary>
+    /// <param name="original">The original <see cref="FastRandom"/> instance which is used to initialize the new instance.</param>
+    /// <param name="cloner">A <see cref="Cloner"/> which is used to track all already cloned objects in order to avoid cycles.</param>
+    private FastRandom(FastRandom original, Cloner cloner)
+      : base(original, cloner) {
+      x = original.x;
+      y = original.y;
+      z = original.z;
+      w = original.w;
+      bitBuffer = original.bitBuffer;
+      bitMask = original.bitMask;
+    }
 
     /// <summary>
@@ -71,12 +92,4 @@
       Reinitialise(seed);
     }
-
-    /// <summary>
-    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
-    /// </summary>
-    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
-    [StorableConstructor]
-    private FastRandom(bool deserializing) : base(deserializing) { }
-
     #endregion
 
@@ -351,12 +364,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      FastRandom clone = (FastRandom)base.Clone(cloner);
-      clone.x = x;
-      clone.y = y;
-      clone.z = z;
-      clone.w = w;
-      clone.bitBuffer = bitBuffer;
-      clone.bitMask = bitMask;
-      return clone;
+      return new FastRandom(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Random/3.3/MersenneTwister.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Random/3.3/MersenneTwister.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.Random/3.3/MersenneTwister.cs	(revision 4675)
@@ -55,4 +55,21 @@
 
     /// <summary>
+    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
+    /// </summary>
+    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
+    [StorableConstructor]
+    private MersenneTwister(bool deserializing) : base(deserializing) { }
+    /// <summary>
+    /// Initializes a new instance from an existing one (copy constructor).
+    /// </summary>
+    /// <param name="original">The original <see cref="MersenneTwister"/> instance which is used to initialize the new instance.</param>
+    /// <param name="cloner">A <see cref="Cloner"/> which is used to track all already cloned objects in order to avoid cycles.</param>
+    private MersenneTwister(MersenneTwister original, Cloner cloner)
+      : base(original, cloner) {
+      state = (uint[])original.state.Clone();
+      p = original.p;
+      init = original.init;
+    }
+    /// <summary>
     /// Initializes a new instance of <see cref="MersenneTwister"/>.
     /// </summary>
@@ -78,10 +95,4 @@
       init = true;
     }
-    /// <summary>
-    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
-    /// </summary>
-    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
-    [StorableConstructor]
-    private MersenneTwister(bool deserializing) : base(deserializing) { }
 
     /// <summary>
@@ -91,9 +102,5 @@
     /// <returns>The cloned object as <see cref="MersenneTwister"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      MersenneTwister clone = (MersenneTwister)base.Clone(cloner);
-      clone.state = (uint[])state.Clone();
-      clone.p = p;
-      clone.init = init;
-      return clone;
+      return new MersenneTwister(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Random/3.3/NormalDistributedRandom.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Random/3.3/NormalDistributedRandom.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.Random/3.3/NormalDistributedRandom.cs	(revision 4675)
@@ -450,4 +450,23 @@
 
     /// <summary>
+    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
+    /// </summary>
+    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
+    [StorableConstructor]
+    private NormalDistributedRandom(bool deserializing) : base(deserializing) { }
+
+    /// <summary>
+    /// Initializes a new instance from an existing one (copy constructor).
+    /// </summary>
+    /// <param name="original">The original <see cref="NormalDistributedRandom"/> instance which is used to initialize the new instance.</param>
+    /// <param name="cloner">A <see cref="Cloner"/> which is used to track all already cloned objects in order to avoid cycles.</param>
+    private NormalDistributedRandom(NormalDistributedRandom original, Cloner cloner)
+      : base(original, cloner) {
+      uniform = cloner.Clone(original.uniform);
+      mu = original.mu;
+      sigma = original.sigma;
+    }
+
+    /// <summary>
     /// Initializes a new instance of <see cref="NormalDistributedRandom"/> with µ = 0 and sigma = 1
     /// and a new random number generator.
@@ -471,10 +490,4 @@
       this.uniform = uniformRandom;
     }
-    /// <summary>
-    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
-    /// </summary>
-    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
-    [StorableConstructor]
-    private NormalDistributedRandom(bool deserializing) : base(deserializing) { }
 
     #region IRandom Members
@@ -529,9 +542,5 @@
     /// <returns>The cloned object as <see cref="NormalDistributedRandom"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      NormalDistributedRandom clone = (NormalDistributedRandom)base.Clone(cloner);
-      clone.uniform = (IRandom)cloner.Clone(uniform);
-      clone.mu = mu;
-      clone.sigma = sigma;
-      return clone;
+      return new NormalDistributedRandom(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Random/3.3/NormalRandomizer.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Random/3.3/NormalRandomizer.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.Random/3.3/NormalRandomizer.cs	(revision 4675)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -33,5 +34,5 @@
   [Item("NormalRandomizer", "Initializes the value of variable 'Value' to a random value normally distributed with parameters 'Mu' and 'Sigma'")]
   public class NormalRandomizer : SingleSuccessorOperator {
-    #region parameter properties
+    #region Parameter Properties
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
@@ -47,4 +48,5 @@
     }
     #endregion
+
     #region Properties
     public DoubleValue Mu {
@@ -57,4 +59,8 @@
     }
     #endregion
+
+    [StorableConstructor]
+    protected NormalRandomizer(bool deserializing) : base(deserializing) { }
+    protected NormalRandomizer(NormalRandomizer original, Cloner cloner) : base(original, cloner) { }
     /// <summary>
     /// Initializes a new instance of <see cref="NormalRandomizer"/> with four variable infos
@@ -67,6 +73,8 @@
       Parameters.Add(new LookupParameter<DoubleValue>("Value", "The value that should be set to a random value."));
     }
-    [StorableConstructor]
-    protected NormalRandomizer(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NormalRandomizer(this, cloner);
+    }
 
     /// <summary>
Index: /branches/CloningRefactoring/HeuristicLab.Random/3.3/RandomCreator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Random/3.3/RandomCreator.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.Random/3.3/RandomCreator.cs	(revision 4675)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -33,4 +34,5 @@
   [StorableClass]
   public sealed class RandomCreator : SingleSuccessorOperator {
+    #region Parameter Properties
     public ValueLookupParameter<BoolValue> SetSeedRandomlyParameter {
       get { return (ValueLookupParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
@@ -45,4 +47,7 @@
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
+    #endregion
+
+    #region Properties
     public BoolValue SetSeedRandomly {
       get { return SetSeedRandomlyParameter.Value; }
@@ -57,5 +62,9 @@
       set { RandomTypeParameter.Value = value; }
     }
+    #endregion
 
+    [StorableConstructor]
+    private RandomCreator(bool deserializing) : base(deserializing) { }
+    private RandomCreator(RandomCreator original, Cloner cloner) : base(original, cloner) { }
     public RandomCreator()
       : base() {
@@ -65,15 +74,17 @@
       Parameters.Add(new LookupParameter<IRandom>("Random", "The new pseudo random number generator which is initialized with the given seed."));
     }
-    [StorableConstructor]
-    private RandomCreator(bool deserializing) : base(deserializing) { }
 
     // BackwardsCompatibility3.3
     #region Backwards compatible code (remove with 3.4)
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       if (!Parameters.ContainsKey("RandomType"))
         Parameters.Add(new ValueParameter<IRandom>("RandomType", "The type of pseudo random number generator which is created.", new MersenneTwister()));
     }
     #endregion
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomCreator(this, cloner);
+    }
 
     public override IOperation Apply() {
Index: /branches/CloningRefactoring/HeuristicLab.Random/3.3/UniformRandomizer.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Random/3.3/UniformRandomizer.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.Random/3.3/UniformRandomizer.cs	(revision 4675)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -33,5 +34,5 @@
   [Item("UniformRandomizer", "Initializes the value of variable 'Value' to a random value uniformly distributed between 'Min' and 'Max'")]
   public class UniformRandomizer : SingleSuccessorOperator {
-    #region parameter properties
+    #region Parameter Properties
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
@@ -47,4 +48,5 @@
     }
     #endregion
+
     #region Properties
     public DoubleValue Min {
@@ -58,4 +60,7 @@
     #endregion
 
+    [StorableConstructor]
+    protected UniformRandomizer(bool deserializing) : base(deserializing) { }
+    protected UniformRandomizer(UniformRandomizer original, Cloner cloner) : base(original, cloner) { }
     /// <summary>
     /// Initializes a new instance of <see cref="UniformRandomizer"/> with four variable infos 
@@ -70,6 +75,8 @@
       Parameters.Add(new LookupParameter<DoubleValue>("Value", "The value that should be set to a random value."));
     }
-    [StorableConstructor]
-    protected UniformRandomizer(bool deserializing) : base(deserializing) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformRandomizer(this, cloner);
+    }
 
     /// <summary>
Index: /branches/CloningRefactoring/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 4674)
+++ /branches/CloningRefactoring/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 4675)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,4 +34,13 @@
   public class SequentialEngine : Engine {
     private IOperator currentOperator;
+
+    [StorableConstructor]
+    protected SequentialEngine(bool deserializing) : base(deserializing) { }
+    protected SequentialEngine(SequentialEngine original, Cloner cloner) : base(original, cloner) { }
+    public SequentialEngine() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SequentialEngine(this, cloner);
+    }
 
     /// <summary>
