Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/DefaultRepresentationCreator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/DefaultRepresentationCreator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/DefaultRepresentationCreator.cs	(revision 4687)
@@ -20,12 +20,8 @@
 #endregion
 
+using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-using HeuristicLab.Problems.VehicleRouting.Encodings;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
 using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
 
@@ -38,4 +34,5 @@
     [StorableConstructor]
     protected DefaultRepresentationCreator(bool deserializing) : base(deserializing) { }
+    protected DefaultRepresentationCreator(DefaultRepresentationCreator original, Cloner cloner) : base(original, cloner) { }
 
     public DefaultRepresentationCreator() : base() { }
@@ -46,5 +43,5 @@
 
       return base.Apply();
-    }    
+    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 4687)
@@ -23,5 +23,7 @@
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -29,5 +31,4 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -79,22 +80,27 @@
     [StorableConstructor]
     private MultiVRPSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionCreator(MultiVRPSolutionCreator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPSolutionCreator(this, cloner);
+    }
+
     public MultiVRPSolutionCreator()
       : base() {
-        Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The new VRP tours."));
+      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The new VRP tours."));
 
-        Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
-        Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
-        Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
-        Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
-        Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
-        Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
-        Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
-        Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
-        Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
-        Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("Cities", "The city count."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Coordinates", "The coordinates of the cities."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
+      Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false."));
+      Parameters.Add(new LookupParameter<IntValue>("Vehicles", "The number of vehicles."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Capacity", "The capacity of each vehicle."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Demand", "The demand of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReadyTime", "The ready time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("DueTime", "The due time of each customer."));
+      Parameters.Add(new LookupParameter<DoubleArray>("ServiceTime", "The service time of each customer."));
 
-        foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPCreator)).OrderBy(op => op.Name)) {
-          if (!typeof(MultiOperator<IVRPCreator>).IsAssignableFrom(type))
-            Operators.Add((IVRPCreator)Activator.CreateInstance(type), true);
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IVRPCreator)).OrderBy(op => op.Name)) {
+        if (!typeof(MultiOperator<IVRPCreator>).IsAssignableFrom(type))
+          Operators.Add((IVRPCreator)Activator.CreateInstance(type), true);
       }
     }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/PushForwardInsertionCreator.cs	(revision 4687)
@@ -22,7 +22,7 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
@@ -60,4 +60,8 @@
     [StorableConstructor]
     private PushForwardCreator(bool deserializing) : base(deserializing) { }
+    protected PushForwardCreator(PushForwardCreator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushForwardCreator(this, cloner);
+    }
 
     public PushForwardCreator()
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/RandomCreator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/RandomCreator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/RandomCreator.cs	(revision 4687)
@@ -20,9 +20,7 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
@@ -41,4 +39,8 @@
     [StorableConstructor]
     private RandomCreator(bool deserializing) : base(deserializing) { }
+    private RandomCreator(RandomCreator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomCreator(this, cloner);
+    }
 
     public RandomCreator()
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 4687)
@@ -23,5 +23,7 @@
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -29,5 +31,4 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -83,7 +84,11 @@
     [StorableConstructor]
     private MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionCrossover(MultiVRPSolutionCrossover original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPSolutionCrossover(this, cloner);
+    }
     public MultiVRPSolutionCrossover()
       : base() {
-       Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
+      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("Parents", "The parent permutations which should be crossed."));
       ParentsParameter.ActualName = "VRPTours";
       Parameters.Add(new LookupParameter<IVRPEncoding>("Child", "The child permutation resulting from the crossover."));
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/RandomParentCloneCrossover.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/RandomParentCloneCrossover.cs	(revision 4687)
@@ -20,8 +20,5 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Optimization;
@@ -39,4 +36,8 @@
     [StorableConstructor]
     private RandomParentCloneCrossover(bool deserializing) : base(deserializing) { }
+    protected RandomParentCloneCrossover(RandomParentCloneCrossover original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomParentCloneCrossover(this, cloner);
+    }
 
     public RandomParentCloneCrossover()
@@ -54,5 +55,5 @@
       Parameters.Remove("ServiceTime");
     }
-    
+
     public override IOperation Apply() {
       if (RandomParameter.ActualValue.Next() < 0.5)
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 4687)
@@ -23,5 +23,7 @@
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -29,5 +31,4 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -79,4 +80,8 @@
     [StorableConstructor]
     private MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionManipulator(MultiVRPSolutionManipulator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPSolutionManipulator(this, cloner);
+    }
     public MultiVRPSolutionManipulator()
       : base() {
@@ -97,6 +102,6 @@
         if (!typeof(MultiOperator<IVRPManipulator>).IsAssignableFrom(type)) {
           IVRPManipulator op = (IVRPManipulator)Activator.CreateInstance(type);
-          bool operatorChecked = true; 
-          if(op is HeuristicLab.Problems.VehicleRouting.Encodings.Potvin.PotvinLocalSearchManipulator || 
+          bool operatorChecked = true;
+          if (op is HeuristicLab.Problems.VehicleRouting.Encodings.Potvin.PotvinLocalSearchManipulator ||
             op is HeuristicLab.Problems.VehicleRouting.Encodings.Prins.PrinsLSManipulator)
             operatorChecked = false;
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveEvaluator.cs	(revision 4687)
@@ -20,6 +20,6 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -36,8 +36,12 @@
     [StorableConstructor]
     private MultiVRPMoveEvaluator(bool deserializing) : base(deserializing) { }
+    private MultiVRPMoveEvaluator(MultiVRPMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveEvaluator(this, cloner);
+    }
 
     public MultiVRPMoveEvaluator()
       : base() {
-        Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The generated moves."));
+      Parameters.Add(new LookupParameter<IVRPMove>("VRPMove", "The generated moves."));
     }
 
@@ -53,8 +57,8 @@
         CapacityParameter.ActualValue,
         CoordinatesParameter.ActualValue,
-        FleetUsageFactor.ActualValue, 
-        TimeFactor.ActualValue, 
-        DistanceFactor.ActualValue, 
-        OverloadPenalty.ActualValue, 
+        FleetUsageFactor.ActualValue,
+        TimeFactor.ActualValue,
+        DistanceFactor.ActualValue,
+        OverloadPenalty.ActualValue,
         TardinessPenalty.ActualValue,
         DistanceMatrixParameter,
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 4687)
@@ -21,7 +21,10 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -29,11 +32,9 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Data;
-using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
   [Item("MultiVRPMoveGenerator", "Randomly selects and applies its move generators.")]
   [StorableClass]
-  public class MultiVRPMoveGenerator : CheckedMultiOperator<IMultiVRPMoveGenerator>, IMultiVRPMoveOperator, 
+  public class MultiVRPMoveGenerator : CheckedMultiOperator<IMultiVRPMoveGenerator>, IMultiVRPMoveOperator,
     IStochasticOperator, IMultiMoveGenerator {
     public override bool CanChangeName {
@@ -98,4 +99,8 @@
     [StorableConstructor]
     private MultiVRPMoveGenerator(bool deserializing) : base(deserializing) { }
+    private MultiVRPMoveGenerator(MultiVRPMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiVRPMoveGenerator(this, cloner);
+    }
     public MultiVRPMoveGenerator()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 4687)
@@ -20,13 +20,12 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
 
-namespace HeuristicLab.Problems.VehicleRouting.Encodings.General{
+namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
   [Item("MultiVRPMoveMaker", "Peforms multiple moves on a given VRP encoding and updates the quality.")]
   [StorableClass]
@@ -82,4 +81,8 @@
     [StorableConstructor]
     private LambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
+    protected LambdaInterchangeMoveMaker(LambdaInterchangeMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LambdaInterchangeMoveMaker(this, cloner);
+    }
 
     public LambdaInterchangeMoveMaker()
@@ -112,5 +115,5 @@
       DoubleValue moveQuality = MoveQualityParameter.ActualValue;
       DoubleValue quality = QualityParameter.ActualValue;
-     
+
       //perform move
       VRPToursParameter.ActualValue = move.MakeMove();
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PermutationEncoding.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PermutationEncoding.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/PermutationEncoding.cs	(revision 4687)
@@ -20,4 +20,6 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -25,7 +27,4 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-using System;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -48,4 +47,8 @@
       : base() {
     }
+    protected PermutationEncoding(PermutationEncoding original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
 
     public int IndexOf(int city) {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/TourEncoding.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/TourEncoding.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/TourEncoding.cs	(revision 4687)
@@ -20,11 +20,10 @@
 #endregion
 
+using System.Collections.Generic;
+using System.Drawing;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Drawing;
-using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.General {
@@ -35,5 +34,5 @@
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
     }
-    
+
     #region IVRPEncoding Members
     public virtual List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix = null, int maxVehicles = int.MaxValue) {
@@ -51,6 +50,5 @@
 
     public int Cities {
-      get 
-      {
+      get {
         int cities = 0;
 
@@ -75,4 +73,7 @@
       : base() {
     }
+    protected TourEncoding(TourEncoding original, Cloner cloner)
+      : base(original, cloner) {
+    }
 
     public static void ConvertFrom(IVRPEncoding encoding, TourEncoding solution, ILookupParameter<DoubleMatrix> distanceMatrix) {
@@ -82,5 +83,5 @@
     public static void ConvertFrom(List<int> route, TourEncoding solution) {
       solution.Tours = new ItemList<Tour>();
-      
+
       Tour tour = new Tour();
       for (int i = 0; i < route.Count; i++) {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuCrossover.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuCrossover.cs	(revision 4687)
@@ -20,10 +20,9 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
@@ -34,7 +33,10 @@
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
-    
+
     [StorableConstructor]
     protected ZhuCrossover(bool deserializing) : base(deserializing) { }
+    protected ZhuCrossover(ZhuCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
 
     public ZhuCrossover()
@@ -52,5 +54,5 @@
         if (!(solution is ZhuEncoding)) {
           parents[i] = ZhuEncoding.ConvertFrom(solution,
-            Cities, 
+            Cities,
             DueTimeParameter.ActualValue,
             ServiceTimeParameter.ActualValue,
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover1.cs	(revision 4687)
@@ -20,17 +20,20 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
   [Item("ZhuHeuristicCrossover1", "The Zhu Heuristic Crossover (Version 1). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
   [StorableClass]
-  public sealed class ZhuHeuristicCrossover1 : ZhuCrossover {    
+  public sealed class ZhuHeuristicCrossover1 : ZhuCrossover {
     [StorableConstructor]
     private ZhuHeuristicCrossover1(bool deserializing) : base(deserializing) { }
-
+    private ZhuHeuristicCrossover1(ZhuHeuristicCrossover1 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuHeuristicCrossover1(this, cloner);
+    }
     public ZhuHeuristicCrossover1()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuHeuristicCrossover2.cs	(revision 4687)
@@ -20,18 +20,21 @@
 #endregion
 
+using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
   [Item("ZhuHeuristicCrossover2", "The Zhu Heuristic Crossover (Version 2). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
   [StorableClass]
-  public sealed class ZhuHeuristicCrossover2 : ZhuCrossover {    
+  public sealed class ZhuHeuristicCrossover2 : ZhuCrossover {
     [StorableConstructor]
     private ZhuHeuristicCrossover2(bool deserializing) : base(deserializing) { }
-
+    private ZhuHeuristicCrossover2(ZhuHeuristicCrossover2 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuHeuristicCrossover2(this, cloner);
+    }
     public ZhuHeuristicCrossover2()
       : base() {
@@ -49,5 +52,5 @@
       if (predecessor < 0)
         predecessor = predecessor + child.Length;
-      
+
       int parent1Index = i;
       int parent2Index = i;
@@ -56,5 +59,5 @@
         if (i == breakPoint) {
           child[i] = p1[parent1Index];
-          
+
           p1.Remove(child[i]);
           if (parent1Index >= p1.Count)
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover1.cs	(revision 4687)
@@ -20,17 +20,20 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
   [Item("ZhuMergeCrossover1", "The Zhu Merge Crossover (Version 1). It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
   [StorableClass]
-  public sealed class ZhuMergeCrossover1 : ZhuCrossover {    
+  public sealed class ZhuMergeCrossover1 : ZhuCrossover {
     [StorableConstructor]
     private ZhuMergeCrossover1(bool deserializing) : base(deserializing) { }
-
+    private ZhuMergeCrossover1(ZhuMergeCrossover1 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuMergeCrossover1(this, cloner);
+    }
     public ZhuMergeCrossover1()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuMergeCrossover2.cs	(revision 4687)
@@ -20,18 +20,21 @@
 #endregion
 
+using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
   [Item("ZhuMergeCrossover2", "The Zhu Merge Crossover (Version 2).  It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
   [StorableClass]
-  public sealed class ZhuMergeCrossover2 : ZhuCrossover {    
+  public sealed class ZhuMergeCrossover2 : ZhuCrossover {
     [StorableConstructor]
     private ZhuMergeCrossover2(bool deserializing) : base(deserializing) { }
-
+    private ZhuMergeCrossover2(ZhuMergeCrossover2 original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuMergeCrossover2(this, cloner);
+    }
     public ZhuMergeCrossover2()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Crossovers/ZhuPermutationCrossover.cs	(revision 4687)
@@ -20,14 +20,14 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
   [Item("ZhuPermutationCrossover", "An operator which crosses two VRP representations using a standard permutation operator. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
   [StorableClass]
-  public sealed class PrinsPermutationCrossover : ZhuCrossover {    
+  public sealed class PrinsPermutationCrossover : ZhuCrossover {
     public IValueLookupParameter<IPermutationCrossover> InnerCrossoverParameter {
       get { return (IValueLookupParameter<IPermutationCrossover>)Parameters["InnerCrossover"]; }
@@ -36,5 +36,10 @@
     [StorableConstructor]
     private PrinsPermutationCrossover(bool deserializing) : base(deserializing) { }
-
+    private PrinsPermutationCrossover(PrinsPermutationCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PrinsPermutationCrossover(this, cloner);
+    }
     public PrinsPermutationCrossover()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuManipulator.cs	(revision 4687)
@@ -20,10 +20,9 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
@@ -34,7 +33,10 @@
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
-
     [StorableConstructor]
     protected ZhuManipulator(bool deserializing) : base(deserializing) { }
+    protected ZhuManipulator(ZhuManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
 
     public ZhuManipulator()
@@ -49,5 +51,5 @@
       if (!(solution is ZhuEncoding)) {
         VRPToursParameter.ActualValue = ZhuEncoding.ConvertFrom(solution,
-            Cities, 
+            Cities,
             DueTimeParameter.ActualValue,
             ServiceTimeParameter.ActualValue,
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/Manipulators/ZhuPermutationManipulator.cs	(revision 4687)
@@ -36,5 +36,10 @@
     [StorableConstructor]
     private ZhuPermutationManipulator(bool deserializing) : base(deserializing) { }
-
+    private ZhuPermutationManipulator(ZhuPermutationManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuPermutationManipulator(this, cloner);
+    }
     public ZhuPermutationManipulator()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs	(revision 4686)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs	(revision 4687)
@@ -20,4 +20,6 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -25,7 +27,5 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
 using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-using System;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Zhu {
@@ -44,5 +44,5 @@
     [Storable]
     DoubleArray dueTimeArray;
-    
+
     [Storable]
     DoubleArray serviceTimeArray;
@@ -50,5 +50,5 @@
     [Storable]
     DoubleArray readyTimeArray;
-    
+
     [Storable]
     DoubleArray demandArray;
@@ -75,10 +75,10 @@
           distanceMatrix,
           useDistanceMatrix)) {
-            newTour.Cities.Remove(city);
-            if (newTour.Cities.Count > 0)
-              result.Add(newTour);
+          newTour.Cities.Remove(city);
+          if (newTour.Cities.Count > 0)
+            result.Add(newTour);
 
-            newTour = new Tour();
-            newTour.Cities.Add(city);
+          newTour = new Tour();
+          newTour.Cities.Add(city);
         }
       }
@@ -124,32 +124,22 @@
     #endregion
 
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      ZhuEncoding clone = new ZhuEncoding(
-        new Permutation(this.PermutationType, this.array), cities, 
-        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
-        coordinates, useDistanceMatrix);
-
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
-    }
-
-    public ZhuEncoding(Permutation permutation, int cities,
-      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
-      DoubleMatrix coordinates, BoolValue useDistanceMatrix)
-      : base(permutation) {
-        this.cities = cities;
-        this.dueTimeArray = dueTimeArray;
-        this.serviceTimeArray = serviceTimeArray;
-        this.readyTimeArray = readyTimeArray;
-        this.demandArray = demandArray;
-        this.capacity = capacity;
-        this.coordinates = coordinates;
-        this.useDistanceMatrix = useDistanceMatrix;
-    }
-
     [StorableConstructor]
     private ZhuEncoding(bool serializing)
       : base(serializing) {
+    }
+
+    protected ZhuEncoding(ZhuEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      this.cities = original.cities;
+      this.dueTimeArray = original.dueTimeArray;
+      this.serviceTimeArray = original.serviceTimeArray;
+      this.readyTimeArray = original.readyTimeArray;
+      this.demandArray = original.demandArray;
+      this.capacity = original.capacity;
+      this.coordinates = original.coordinates;
+      this.useDistanceMatrix = original.useDistanceMatrix;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ZhuEncoding(this, cloner);
     }
 
@@ -171,5 +161,5 @@
     }
 
-    public static ZhuEncoding ConvertFrom(List<int> routeParam, int cities, 
+    public static ZhuEncoding ConvertFrom(List<int> routeParam, int cities,
       DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, DoubleArray demandArray, DoubleValue capacity,
       DoubleMatrix coordinates, BoolValue useDistanceMatrix) {
@@ -183,5 +173,5 @@
 
       return new ZhuEncoding(
-        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), cities, 
+        new Permutation(PermutationTypes.RelativeUndirected, route.ToArray()), cities,
         dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
         coordinates, useDistanceMatrix);
