Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Creators/RandomPermutationCreator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Creators/RandomPermutationCreator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Creators/RandomPermutationCreator.cs	(revision 4667)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -56,4 +57,7 @@
     }
 
+    [StorableConstructor]
+    private RandomPermutationCreator(bool deserializing) : base(deserializing) { }
+    private RandomPermutationCreator(RandomPermutationCreator original, Cloner cloner) : base(original, cloner) { }
     public RandomPermutationCreator()
       : base() {
@@ -64,4 +68,8 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomPermutationCreator(this, cloner);
+    }
+
     public override IOperation Apply() {
       PermutationParameter.ActualValue = new Permutation(PermutationType, LengthParameter.ActualValue.Value, RandomParameter.ActualValue);
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CosaCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CosaCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CosaCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -37,4 +38,13 @@
   [StorableClass]
   public class CosaCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected CosaCrossover(bool deserializing) : base(deserializing) { }
+    protected CosaCrossover(CosaCrossover original, Cloner cloner) : base(original, cloner) { }
+    public CosaCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CosaCrossover(this, cloner);
+    }
+
     /// <summary>
     /// The operator actually performs a 2-opt mutation on the first parent, but it uses the second parent to determine which new edge should be inserted.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CyclicCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CyclicCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CyclicCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -34,4 +35,13 @@
   [StorableClass]
   public class CyclicCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected CyclicCrossover(bool deserializing) : base(deserializing) { }
+    protected CyclicCrossover(CyclicCrossover original, Cloner cloner) : base(original, cloner) { }
+    public CyclicCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CyclicCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs the cyclic crossover on <paramref name="parent1"/> and <paramref name="parent2"/>.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CyclicCrossover2.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CyclicCrossover2.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/CyclicCrossover2.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -35,4 +36,13 @@
   [StorableClass]
   public class CyclicCrossover2 : PermutationCrossover {
+    [StorableConstructor]
+    protected CyclicCrossover2(bool deserializing) : base(deserializing) { }
+    protected CyclicCrossover2(CyclicCrossover2 original, Cloner cloner) : base(original, cloner) { }
+    public CyclicCrossover2() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CyclicCrossover2(this, cloner);
+    }
+
     /// <summary>
     /// Performs a variant of the cyclic crossover on <paramref name="parent1"/> and <paramref name="parent2"/>.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/EdgeRecombinationCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/EdgeRecombinationCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/EdgeRecombinationCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -37,4 +38,13 @@
   [StorableClass]
   public class EdgeRecombinationCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected EdgeRecombinationCrossover(bool deserializing) : base(deserializing) { }
+    protected EdgeRecombinationCrossover(EdgeRecombinationCrossover original, Cloner cloner) : base(original, cloner) { }
+    public EdgeRecombinationCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EdgeRecombinationCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs a cross over permutation of <paramref name="parent1"/> and <paramref name="2"/>
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MaximalPreservativeCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MaximalPreservativeCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MaximalPreservativeCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -37,4 +38,13 @@
   [StorableClass]
   public class MaximalPreservativeCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected MaximalPreservativeCrossover(bool deserializing) : base(deserializing) { }
+    protected MaximalPreservativeCrossover(MaximalPreservativeCrossover original, Cloner cloner) : base(original, cloner) { }
+    public MaximalPreservativeCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MaximalPreservativeCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs the maximal preservative crossover on <paramref name="parent1"/> and <paramref name="parent2"/>
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MultiPermutationCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MultiPermutationCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/MultiPermutationCrossover.cs	(revision 4667)
@@ -29,4 +29,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -50,5 +51,6 @@
 
     [StorableConstructor]
-    private MultiPermutationCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiPermutationCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiPermutationCrossover(MultiPermutationCrossover original, Cloner cloner) : base(original, cloner) { }
     public MultiPermutationCrossover()
       : base() {
@@ -62,4 +64,8 @@
           Operators.Add((IPermutationCrossover)Activator.CreateInstance(type), true);
       }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiPermutationCrossover(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderBasedCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderBasedCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderBasedCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -37,4 +38,13 @@
   [StorableClass]
   public class OrderBasedCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected OrderBasedCrossover(bool deserializing) : base(deserializing) { }
+    protected OrderBasedCrossover(OrderBasedCrossover original, Cloner cloner) : base(original, cloner) { }
+    public OrderBasedCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OrderBasedCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs a cross over permutation of <paramref name="parent1"/> and <paramref name="parent2"/> by
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -37,4 +38,13 @@
   [StorableClass]
   public class OrderCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected OrderCrossover(bool deserializing) : base(deserializing) { }
+    protected OrderCrossover(OrderCrossover original, Cloner cloner) : base(original, cloner) { }
+    public OrderCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OrderCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs the order crossover of two permutations.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderCrossover2.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderCrossover2.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/OrderCrossover2.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -36,4 +37,13 @@
   [StorableClass]
   public class OrderCrossover2 : PermutationCrossover {
+    [StorableConstructor]
+    protected OrderCrossover2(bool deserializing) : base(deserializing) { }
+    protected OrderCrossover2(OrderCrossover2 original, Cloner cloner) : base(original, cloner) { }
+    public OrderCrossover2() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OrderCrossover2(this, cloner);
+    }
+
     /// <summary>
     /// Performs a slight variation of the order crossover of two permutations.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/PartiallyMatchedCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/PartiallyMatchedCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/PartiallyMatchedCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -36,4 +37,13 @@
   [StorableClass]
   public class PartiallyMatchedCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected PartiallyMatchedCrossover(bool deserializing) : base(deserializing) { }
+    protected PartiallyMatchedCrossover(PartiallyMatchedCrossover original, Cloner cloner) : base(original, cloner) { }
+    public PartiallyMatchedCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PartiallyMatchedCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs the partially matched crossover on <paramref name="parent1"/> and <paramref name="parent2"/>.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/PositionBasedCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/PositionBasedCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Crossovers/PositionBasedCrossover.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -34,4 +35,13 @@
   [StorableClass]
   public class PositionBasedCrossover : PermutationCrossover {
+    [StorableConstructor]
+    protected PositionBasedCrossover(bool deserializing) : base(deserializing) { }
+    protected PositionBasedCrossover(PositionBasedCrossover original, Cloner cloner) : base(original, cloner) { }
+    public PositionBasedCrossover() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PositionBasedCrossover(this, cloner);
+    }
+
     /// <summary>
     /// Performs a cross over permutation of <paramref name="parent1"/> and <paramref name="parent2"/>
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/InsertionManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/InsertionManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/InsertionManipulator.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -33,4 +34,13 @@
   [StorableClass]
   public class InsertionManipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected InsertionManipulator(bool deserializing) : base(deserializing) { }
+    protected InsertionManipulator(InsertionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public InsertionManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InsertionManipulator(this, cloner);
+    }
+
     /// <summary>
     /// Moves an randomly chosen element in the specified <paramref name="permutation"/> array 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/InversionManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/InversionManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/InversionManipulator.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -33,4 +34,13 @@
   [StorableClass]
   public class InversionManipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected InversionManipulator(bool deserializing) : base(deserializing) { }
+    protected InversionManipulator(InversionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public InversionManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InversionManipulator(this, cloner);
+    }
+
     /// <summary>
     /// Inverts a randomly chosen part of a permutation.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/MultiPermutationManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/MultiPermutationManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/MultiPermutationManipulator.cs	(revision 4667)
@@ -29,4 +29,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -46,5 +47,6 @@
 
     [StorableConstructor]
-    private MultiPermutationManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiPermutationManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiPermutationManipulator(MultiPermutationManipulator original, Cloner cloner) : base(original, cloner) { }
     public MultiPermutationManipulator()
       : base() {
@@ -55,4 +57,8 @@
           Operators.Add((IPermutationManipulator)Activator.CreateInstance(type), true);
       }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiPermutationManipulator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/ScrambleManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/ScrambleManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/ScrambleManipulator.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -33,4 +34,13 @@
   [StorableClass]
   public class ScrambleManipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected ScrambleManipulator(bool deserializing) : base(deserializing) { }
+    protected ScrambleManipulator(ScrambleManipulator original, Cloner cloner) : base(original, cloner) { }
+    public ScrambleManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ScrambleManipulator(this, cloner);
+    }
+
     /// <summary>
     /// Mixes the elements of the given <paramref name="permutation"/> randomly 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap2Manipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap2Manipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap2Manipulator.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -33,4 +34,13 @@
   [StorableClass]
   public class Swap2Manipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected Swap2Manipulator(bool deserializing) : base(deserializing) { }
+    protected Swap2Manipulator(Swap2Manipulator original, Cloner cloner) : base(original, cloner) { }
+    public Swap2Manipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Swap2Manipulator(this, cloner);
+    }
+
     /// <summary>
     /// Swaps two randomly chosen elements in the given <paramref name="permutation"/> permutation.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap3Manipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap3Manipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap3Manipulator.cs	(revision 4667)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -35,4 +36,13 @@
   [StorableClass]
   public class Swap3Manipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected Swap3Manipulator(bool deserializing) : base(deserializing) { }
+    protected Swap3Manipulator(Swap3Manipulator original, Cloner cloner) : base(original, cloner) { }
+    public Swap3Manipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Swap3Manipulator(this, cloner);
+    }
+
     /// <summary>
     /// Swaps three randomly chosen elements of the given <paramref name="permutation"/> array.
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/TranslocationInversionManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/TranslocationInversionManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/TranslocationInversionManipulator.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -34,4 +35,13 @@
   [StorableClass]
   public class TranslocationInversionManipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected TranslocationInversionManipulator(bool deserializing) : base(deserializing) { }
+    protected TranslocationInversionManipulator(TranslocationInversionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public TranslocationInversionManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationInversionManipulator(this, cloner);
+    }
+
     /// <summary>
     /// Moves a randomly chosen interval of elements to another (randomly chosen) position in the given
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/TranslocationManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/TranslocationManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/TranslocationManipulator.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -34,4 +35,13 @@
   [StorableClass]
   public class TranslocationManipulator : PermutationManipulator {
+    [StorableConstructor]
+    protected TranslocationManipulator(bool deserializing) : base(deserializing) { }
+    protected TranslocationManipulator(TranslocationManipulator original, Cloner cloner) : base(original, cloner) { }
+    public TranslocationManipulator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationManipulator(this, cloner);
+    }
+
     /// <summary>
     /// Moves a randomly chosen interval of elements to another (randomly chosen) position in the given
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/PermutationMoveAttribute.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/PermutationMoveAttribute.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/PermutationMoveAttribute.cs	(revision 4667)
@@ -31,9 +31,11 @@
     public double MoveQuality { get; protected set; }
 
-    public PermutationMoveAttribute()
-      : base() {
-      MoveQuality = 0;
+    [StorableConstructor]
+    protected PermutationMoveAttribute(bool deserializing) : base(deserializing) { }
+    protected PermutationMoveAttribute(PermutationMoveAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.MoveQuality = original.MoveQuality;
     }
-
+    public PermutationMoveAttribute() : this(0) { }
     public PermutationMoveAttribute(double moveQuality)
       : base() {
@@ -42,7 +44,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      PermutationMoveAttribute clone = (PermutationMoveAttribute)base.Clone(cloner);
-      clone.MoveQuality = MoveQuality;
-      return clone;
+      return new PermutationMoveAttribute(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeIndexMove.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeIndexMove.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeIndexMove.cs	(revision 4667)
@@ -37,12 +37,15 @@
     public Permutation Permutation { get; protected set; }
 
-    public ThreeIndexMove()
-      : base() {
-      Index1 = -1;
-      Index2 = -1;
-      Index3 = -1;
-      Permutation = null;
+    [StorableConstructor]
+    protected ThreeIndexMove(bool deserializing) : base(deserializing) { }
+    protected ThreeIndexMove(ThreeIndexMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+      this.Index3 = original.Index3;
+      if (original.Permutation != null)
+        this.Permutation = cloner.Clone(original.Permutation);
     }
-
+    public ThreeIndexMove() : this(-1, -1, -1, null) { }
     public ThreeIndexMove(int index1, int index2, int index3, Permutation permutation)
       : base() {
@@ -54,11 +57,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ThreeIndexMove clone = (ThreeIndexMove)base.Clone(cloner);
-      clone.Index1 = Index1;
-      clone.Index2 = Index2;
-      clone.Index3 = Index3;
-      if (Permutation != null)
-        clone.Permutation = (Permutation)Permutation.Clone(cloner);
-      return clone;
+      return new ThreeIndexMove(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/ExhaustiveInsertionMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/ExhaustiveInsertionMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/ExhaustiveInsertionMoveGenerator.cs	(revision 4667)
@@ -24,4 +24,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -29,4 +30,13 @@
   [StorableClass]
   public class ExhaustiveInsertionMoveGenerator : TranslocationMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveInsertionMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveInsertionMoveGenerator(ExhaustiveInsertionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveInsertionMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveInsertionMoveGenerator(this, cloner);
+    }
+
     public static TranslocationMove[] Apply(Permutation permutation) {
       int length = permutation.Length;
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticSingleInsertionMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticSingleInsertionMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticSingleInsertionMoveGenerator.cs	(revision 4667)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -44,7 +45,14 @@
     }
 
-    public StochasticInsertionMultiMoveGenerator() {
+    [StorableConstructor]
+    protected StochasticInsertionMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticInsertionMultiMoveGenerator(StochasticInsertionMultiMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticInsertionMultiMoveGenerator() : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
       Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticInsertionMultiMoveGenerator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticTranslocationMultiMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticTranslocationMultiMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticTranslocationMultiMoveGenerator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -42,8 +43,14 @@
     }
 
-    public StochasticTranslocationMultiMoveGenerator()
-      : base() {
+    [StorableConstructor]
+    protected StochasticTranslocationMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticTranslocationMultiMoveGenerator(StochasticTranslocationMultiMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticTranslocationMultiMoveGenerator() : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
       Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticTranslocationMultiMoveGenerator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticTranslocationSingleMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticTranslocationSingleMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/StochasticTranslocationSingleMoveGenerator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -34,7 +35,14 @@
     }
 
+    [StorableConstructor]
+    protected StochasticTranslocationSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticTranslocationSingleMoveGenerator(StochasticTranslocationSingleMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public StochasticTranslocationSingleMoveGenerator()
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticTranslocationSingleMoveGenerator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMove.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMove.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMove.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -27,14 +28,13 @@
   [StorableClass]
   public class TranslocationMove : ThreeIndexMove {
-    public TranslocationMove()
-      : base() {
-    }
+    [StorableConstructor]
+    protected TranslocationMove(bool deserializing) : base(deserializing) { }
+    protected TranslocationMove(TranslocationMove original, Cloner cloner) : base(original, cloner) { }
+    public TranslocationMove() : base() { }
+    public TranslocationMove(int index1, int index2, int index3) : base(index1, index2, index3, null) { }
+    public TranslocationMove(int index1, int index2, int index3, Permutation permutation) : base(index1, index2, index3, permutation) { }
 
-    public TranslocationMove(int index1, int index2, int index3)
-      : base(index1, index2, index3, null) {
-    }
-
-    public TranslocationMove(int index1, int index2, int index3, Permutation permutation)
-      : base(index1, index2, index3, permutation) {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMove(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveAbsoluteAttribute.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveAbsoluteAttribute.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveAbsoluteAttribute.cs	(revision 4667)
@@ -36,11 +36,12 @@
 
     [StorableConstructor]
-    private TranslocationMoveAbsoluteAttribute(bool deserializing)
-      : base() {
+    protected TranslocationMoveAbsoluteAttribute(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveAbsoluteAttribute(TranslocationMoveAbsoluteAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Number = (int[])original.Number.Clone();
+      this.OldPosition = original.OldPosition;
+      this.NewPosition = original.NewPosition;
     }
-
-    public TranslocationMoveAbsoluteAttribute()
-      : this(null, -1, -1, -1) { }
-
+    public TranslocationMoveAbsoluteAttribute() : this(null, -1, -1, -1) { }
     public TranslocationMoveAbsoluteAttribute(int[] number, int oldPosition, int newPosition, double moveQuality)
       : base(moveQuality) {
@@ -51,9 +52,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      TranslocationMoveAbsoluteAttribute clone = (TranslocationMoveAbsoluteAttribute)base.Clone(cloner);
-      clone.Number = Number;
-      clone.OldPosition = OldPosition;
-      clone.NewPosition = NewPosition;
-      return clone;
+      return new TranslocationMoveAbsoluteAttribute(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveGenerator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -43,4 +44,7 @@
     }
 
+    [StorableConstructor]
+    protected TranslocationMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveGenerator(TranslocationMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public TranslocationMoveGenerator()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveHardTabuCriterion.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveHardTabuCriterion.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveHardTabuCriterion.cs	(revision 4667)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -64,4 +65,7 @@
     }
 
+    [StorableConstructor]
+    protected TranslocationMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveHardTabuCriterion(TranslocationMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
     public TranslocationMoveHardTabuCriterion()
       : base() {
@@ -73,4 +77,8 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMoveHardTabuCriterion(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveMaker.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveMaker.cs	(revision 4667)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -47,4 +48,7 @@
     }
 
+    [StorableConstructor]
+    protected TranslocationMoveMaker(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveMaker(TranslocationMoveMaker original, Cloner cloner) : base(original, cloner) { }
     public TranslocationMoveMaker()
       : base() {
@@ -53,4 +57,8 @@
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
       Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMoveMaker(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveRelativeAttribute.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveRelativeAttribute.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveRelativeAttribute.cs	(revision 4667)
@@ -42,11 +42,15 @@
 
     [StorableConstructor]
-    private TranslocationMoveRelativeAttribute(bool deserializing)
-      : base() {
+    protected TranslocationMoveRelativeAttribute(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveRelativeAttribute(TranslocationMoveRelativeAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Edge1Source = original.Edge1Source;
+      this.Edge1Target = original.Edge1Target;
+      this.Edge2Source = original.Edge2Source;
+      this.Edge2Target = original.Edge2Target;
+      this.Edge3Source = original.Edge3Source;
+      this.Edge3Target = original.Edge3Target;
     }
-
-    public TranslocationMoveRelativeAttribute()
-      : this(-1, -1, -1, -1, -1, -1, -1) { }
-
+    public TranslocationMoveRelativeAttribute() : this(-1, -1, -1, -1, -1, -1, -1) { }
     public TranslocationMoveRelativeAttribute(int edge1Source, int edge1Target, int edge2Source, int edge2Target, int edge3Source, int edge3Target, double moveQuality)
       : base(moveQuality) {
@@ -60,12 +64,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      TranslocationMoveRelativeAttribute clone = (TranslocationMoveRelativeAttribute)base.Clone(cloner);
-      clone.Edge1Source = Edge1Source;
-      clone.Edge1Target = Edge1Target;
-      clone.Edge2Source = Edge2Source;
-      clone.Edge2Target = Edge2Target;
-      clone.Edge3Source = Edge3Source;
-      clone.Edge3Target = Edge3Target;
-      return clone;
+      return new TranslocationMoveRelativeAttribute(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveSoftTabuCriterion.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveSoftTabuCriterion.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveSoftTabuCriterion.cs	(revision 4667)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -64,4 +65,7 @@
     }
 
+    [StorableConstructor]
+    protected TranslocationMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveSoftTabuCriterion(TranslocationMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
     public TranslocationMoveSoftTabuCriterion()
       : base() {
@@ -73,4 +77,8 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMoveSoftTabuCriterion(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveTabuMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveTabuMaker.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveTabuMaker.cs	(revision 4667)
@@ -24,4 +24,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -36,8 +37,15 @@
     }
 
+    [StorableConstructor]
+    protected TranslocationMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected TranslocationMoveTabuMaker(TranslocationMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
     public TranslocationMoveTabuMaker()
       : base() {
       Parameters.Add(new LookupParameter<TranslocationMove>("TranslocationMove", "The move that was made."));
       Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TranslocationMoveTabuMaker(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoIndexMove.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoIndexMove.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoIndexMove.cs	(revision 4667)
@@ -35,11 +35,14 @@
     public Permutation Permutation { get; protected set; }
 
-    public TwoIndexMove()
-      : base() {
-      Index1 = -1;
-      Index2 = -1;
-      Permutation = null;
+    [StorableConstructor]
+    protected TwoIndexMove(bool deserializing) : base(deserializing) { }
+    protected TwoIndexMove(TwoIndexMove original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Index2 = original.Index2;
+      if (original.Permutation != null)
+        this.Permutation = cloner.Clone(original.Permutation);
     }
-
+    public TwoIndexMove() : this(-1, -1, null) { }
     public TwoIndexMove(int index1, int index2, Permutation permutation)
       : base() {
@@ -50,10 +53,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      TwoIndexMove clone = (TwoIndexMove)base.Clone(cloner);
-      clone.Index1 = Index1;
-      clone.Index2 = Index2;
-      if (Permutation != null)
-        clone.Permutation = (Permutation)Permutation.Clone(cloner);
-      return clone;
+      return new TwoIndexMove(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/ExhaustiveInversionMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/ExhaustiveInversionMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/ExhaustiveInversionMoveGenerator.cs	(revision 4667)
@@ -24,4 +24,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -29,4 +30,13 @@
   [StorableClass]
   public class ExhaustiveInversionMoveGenerator : InversionMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveInversionMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveInversionMoveGenerator(ExhaustiveInversionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveInversionMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveInversionMoveGenerator(this, cloner);
+    }
+
     public static InversionMove[] Apply(Permutation permutation) {
       int length = permutation.Length;
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMove.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMove.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMove.cs	(revision 4667)
@@ -22,4 +22,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -27,14 +28,13 @@
   [StorableClass]
   public class InversionMove : TwoIndexMove {
-    public InversionMove()
-      : base() {
-    }
+    [StorableConstructor]
+    protected InversionMove(bool deserializing) : base(deserializing) { }
+    protected InversionMove(InversionMove original, Cloner cloner) : base(original, cloner) { }
+    public InversionMove() : base() { }
+    public InversionMove(int index1, int index2) : base(index1, index2, null) { }
+    public InversionMove(int index1, int index2, Permutation permutation) : base(index1, index2, permutation) { }
 
-    public InversionMove(int index1, int index2)
-      : base(index1, index2, null) {
-    }
-
-    public InversionMove(int index1, int index2, Permutation permutation)
-      : base(index1, index2, permutation) {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InversionMove(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveAbsoluteAttribute.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveAbsoluteAttribute.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveAbsoluteAttribute.cs	(revision 4667)
@@ -38,11 +38,13 @@
 
     [StorableConstructor]
-    private InversionMoveAbsoluteAttribute(bool deserializing)
-      : base() {
+    protected InversionMoveAbsoluteAttribute(bool deserializing) : base(deserializing) { }
+    protected InversionMoveAbsoluteAttribute(InversionMoveAbsoluteAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Number1 = original.Number1;
+      this.Index2 = original.Index2;
+      this.Number2 = original.Number2;
     }
-
-    public InversionMoveAbsoluteAttribute()
-      : this(-1, -1, -1, -1, -1) { }
-
+    public InversionMoveAbsoluteAttribute() : this(-1, -1, -1, -1, -1) { }
     public InversionMoveAbsoluteAttribute(int index1, int number1, int index2, int number2, double moveQuality)
       : base(moveQuality) {
@@ -54,10 +56,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      InversionMoveAbsoluteAttribute clone = (InversionMoveAbsoluteAttribute)base.Clone(cloner);
-      clone.Index1 = Index1;
-      clone.Number1 = Number1;
-      clone.Index2 = Index2;
-      clone.Number2 = Number2;
-      return clone;
+      return new InversionMoveAbsoluteAttribute(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveGenerator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -43,4 +44,7 @@
     }
 
+    [StorableConstructor]
+    protected InversionMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected InversionMoveGenerator(InversionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public InversionMoveGenerator()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveHardTabuCriterion.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveHardTabuCriterion.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveHardTabuCriterion.cs	(revision 4667)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -65,4 +66,7 @@
     }
 
+    [StorableConstructor]
+    protected InversionMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected InversionMoveHardTabuCriterion(InversionMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
     public InversionMoveHardTabuCriterion()
       : base() {
@@ -74,4 +78,8 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InversionMoveHardTabuCriterion(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveMaker.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveMaker.cs	(revision 4667)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -47,4 +48,7 @@
     }
 
+    [StorableConstructor]
+    protected InversionMoveMaker(bool deserializing) : base(deserializing) { }
+    protected InversionMoveMaker(InversionMoveMaker original, Cloner cloner) : base(original, cloner) { }
     public InversionMoveMaker()
       : base() {
@@ -53,4 +57,8 @@
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
       Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InversionMoveMaker(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveRelativeAttribute.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveRelativeAttribute.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveRelativeAttribute.cs	(revision 4667)
@@ -38,11 +38,13 @@
 
     [StorableConstructor]
-    private InversionMoveRelativeAttribute(bool deserializing)
-      : base() {
+    protected InversionMoveRelativeAttribute(bool deserializing) : base(deserializing) { }
+    protected InversionMoveRelativeAttribute(InversionMoveRelativeAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Edge1Source = original.Edge1Source;
+      this.Edge1Target = original.Edge1Target;
+      this.Edge2Source = original.Edge2Source;
+      this.Edge2Target = original.Edge2Target;
     }
-
-    public InversionMoveRelativeAttribute()
-      : this(-1, -1, -1, -1, -1) { }
-
+    public InversionMoveRelativeAttribute() : this(-1, -1, -1, -1, -1) { }
     public InversionMoveRelativeAttribute(int edge1Source, int edge1Target, int edge2Source, int edge2Target, double moveQuality)
       : base(moveQuality) {
@@ -54,10 +56,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      InversionMoveRelativeAttribute clone = (InversionMoveRelativeAttribute)base.Clone(cloner);
-      clone.Edge1Source = Edge1Source;
-      clone.Edge1Target = Edge1Target;
-      clone.Edge2Source = Edge2Source;
-      clone.Edge2Target = Edge2Target;
-      return clone;
+      return new InversionMoveRelativeAttribute(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveSoftTabuCriterion.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveSoftTabuCriterion.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveSoftTabuCriterion.cs	(revision 4667)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -65,4 +66,7 @@
     }
 
+    [StorableConstructor]
+    protected InversionMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected InversionMoveSoftTabuCriterion(InversionMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
     public InversionMoveSoftTabuCriterion()
       : base() {
@@ -74,4 +78,8 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InversionMoveSoftTabuCriterion(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveTabuMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveTabuMaker.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveTabuMaker.cs	(revision 4667)
@@ -24,4 +24,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -36,8 +37,15 @@
     }
 
+    [StorableConstructor]
+    protected InversionMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected InversionMoveTabuMaker(InversionMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
     public InversionMoveTabuMaker()
       : base() {
       Parameters.Add(new LookupParameter<InversionMove>("InversionMove", "The move that was made."));
       Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InversionMoveTabuMaker(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/StochasticInversionMultiMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/StochasticInversionMultiMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/StochasticInversionMultiMoveGenerator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -42,8 +43,15 @@
     }
 
+    [StorableConstructor]
+    protected StochasticInversionMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticInversionMultiMoveGenerator(StochasticInversionMultiMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public StochasticInversionMultiMoveGenerator()
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
       Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticInversionMultiMoveGenerator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/StochasticInversionSingleMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/StochasticInversionSingleMoveGenerator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/StochasticInversionSingleMoveGenerator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -34,7 +35,14 @@
     }
 
+    [StorableConstructor]
+    protected StochasticInversionSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticInversionSingleMoveGenerator(StochasticInversionSingleMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public StochasticInversionSingleMoveGenerator()
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticInversionSingleMoveGenerator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 4667)
@@ -38,11 +38,14 @@
     }
 
-    public Permutation() : base() {
-      permutationType = PermutationTypes.RelativeUndirected;
+    [StorableConstructor]
+    protected Permutation(bool deserializing) : base(deserializing) { }
+    protected Permutation(Permutation original, Cloner cloner)
+      : base(original, cloner) {
+      this.permutationType = original.permutationType;
     }
+    public Permutation() : this(PermutationTypes.RelativeUndirected) { }
     public Permutation(PermutationTypes type) : base() {
       permutationType = type;
     }
-
     public Permutation(PermutationTypes type, int length)
       : base(length) {
@@ -64,8 +67,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Permutation clone = new Permutation(permutationType, array);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new Permutation(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationCrossover.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationCrossover.cs	(revision 4667)
@@ -47,4 +47,7 @@
     }
 
+    [StorableConstructor]
+    protected PermutationCrossover(bool deserializing) : base(deserializing) { }
+    protected PermutationCrossover(PermutationCrossover original, Cloner cloner) : base(original, cloner) { }
     protected PermutationCrossover()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationManipulator.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationManipulator.cs	(revision 4667)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.PermutationEncoding {
@@ -44,4 +45,7 @@
     }
 
+    [StorableConstructor]
+    protected PermutationManipulator(bool deserializing) : base(deserializing) { }
+    protected PermutationManipulator(PermutationManipulator original, Cloner cloner) : base(original, cloner) { }
     protected PermutationManipulator()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationType.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationType.cs	(revision 4666)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationType.cs	(revision 4667)
@@ -34,11 +34,12 @@
     }
 
+    [StorableConstructor]
+    protected PermutationType(bool deserializing) : base(deserializing) { }
+    protected PermutationType(PermutationType original, Cloner cloner) : base(original, cloner) { }
     public PermutationType() : base() { }
     public PermutationType(PermutationTypes type) : base(type) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      PermutationType clone = new PermutationType(value);
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
+      return new PermutationType(this, cloner);
     }
   }
