Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursAnalyzer.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursAnalyzer.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursAnalyzer.cs	(revision 4690)
@@ -150,5 +150,5 @@
     public BestAverageWorstVRPToursAnalyzer()
       : base() {
-      #region Create parameters     
+      #region Create parameters
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("BestOverload", "The best overload value."));
@@ -157,5 +157,5 @@
       Parameters.Add(new ValueLookupParameter<DoubleValue>("CurrentWorstOverload", "The current worst overload value of all solutions."));
       Parameters.Add(new ValueLookupParameter<DataTable>("Overloads", "The data table to store the current best, current average, current worst, best and best known overload value."));
- 
+
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Tardiness", "The tardiness of the VRP solutions which should be analyzed."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("BestTardiness", "The best tardiness value."));
@@ -311,6 +311,16 @@
     [StorableConstructor]
     private BestAverageWorstVRPToursAnalyzer(bool deserializing) : base() { }
+    private BestAverageWorstVRPToursAnalyzer(BestAverageWorstVRPToursAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstVRPToursAnalyzer(this, cloner);
+    }
 
     [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
     private void Initialize() {
       OverloadParameter.DepthChanged += new EventHandler(OverloadParameter_DepthChanged);
@@ -321,9 +331,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      BestAverageWorstVRPToursAnalyzer clone = (BestAverageWorstVRPToursAnalyzer)base.Clone(cloner);
-      clone.Initialize();
-      return clone;
-    }
 
     void OverloadParameter_DepthChanged(object sender, EventArgs e) {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursCalculator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursCalculator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestAverageWorstVRPToursCalculator.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -95,4 +96,9 @@
     }
 
+    [StorableConstructor]
+    private BestAverageWorstVRPToursCalculator(bool deserializing) : base(deserializing) { }
+    private BestAverageWorstVRPToursCalculator(BestAverageWorstVRPToursCalculator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public BestAverageWorstVRPToursCalculator()
       : base() {
@@ -123,4 +129,8 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestAverageWorstVRPToursCalculator(this, cloner);
+    }
+
     private void UpdateOverloads() {
       ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPSolutionAnalyzer.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPSolutionAnalyzer.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPSolutionAnalyzer.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -83,5 +84,7 @@
     [StorableConstructor]
     private BestVRPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
-
+    private BestVRPSolutionAnalyzer(BestVRPSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public BestVRPSolutionAnalyzer()
       : base() {
@@ -102,4 +105,8 @@
       Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best VRP solution."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestVRPSolutionAnalyzer(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPToursMemorizer.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPToursMemorizer.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Analyzers/BestVRPToursMemorizer.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -63,4 +64,9 @@
     }
 
+    [StorableConstructor]
+    protected BestVRPToursMemorizer(bool deserializing) : base(deserializing) { }
+    protected BestVRPToursMemorizer(BestVRPToursMemorizer original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public BestVRPToursMemorizer()
       : base() {
@@ -77,4 +83,8 @@
       Parameters.Add(new ValueLookupParameter<DoubleValue>("BestVehiclesUtilized", "The best vehicles utilized found so far."));
  
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestVRPToursMemorizer(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/AlbaEncoding.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/AlbaEncoding.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/AlbaEncoding.cs	(revision 4690)
@@ -34,5 +34,5 @@
     [Storable]
     private int cities;
-    
+
     #region IVRPEncoding Members
     public override List<Tour> GetTours(ILookupParameter<DoubleMatrix> distanceMatrix = null, int maxVehicles = int.MaxValue) {
@@ -64,15 +64,16 @@
 
     public int MaxVehicles {
-      get { return Length - Cities + 1;  }
+      get { return Length - Cities + 1; }
     }
 
     #endregion
 
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      AlbaEncoding clone = new AlbaEncoding(
-        new Permutation(this.PermutationType, this.array), cities);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+
+    [StorableConstructor]
+    protected AlbaEncoding(bool deserializing) : base(deserializing) { }
+    protected AlbaEncoding(AlbaEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      cities = original.cities;
+      readOnly = original.readOnly;
     }
 
@@ -82,7 +83,6 @@
     }
 
-    [StorableConstructor]
-    private AlbaEncoding(bool serializing)
-      : base(serializing) {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaEncoding(this, cloner);
     }
 
@@ -103,6 +103,6 @@
       foreach (Tour tour in tours) {
         foreach (int city in tour.Cities) {
-            array[arrayIndex] = city - 1;
-            arrayIndex++;
+          array[arrayIndex] = city - 1;
+          arrayIndex++;
         }
 
@@ -119,5 +119,5 @@
         arrayIndex++;
       }
-            
+
       AlbaEncoding solution = new AlbaEncoding(new Permutation(PermutationTypes.RelativeUndirected, new IntArray(array)), cities);
 
@@ -128,5 +128,5 @@
       List<int> route = new List<int>(routeParam);
       route.RemoveAt(routeParam.Count - 1);
-      
+
       int cities = 0;
       for (int i = 0; i < route.Count; i++) {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaCrossover.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaCrossover.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -34,12 +35,12 @@
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
     }
-    
+
     [StorableConstructor]
     protected AlbaCrossover(bool deserializing) : base(deserializing) { }
-
+    protected AlbaCrossover(AlbaCrossover original, Cloner cloner) : base(original, cloner) { }
     public AlbaCrossover()
       : base() {
       Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
-   
+
       AlbaEncoding.RemoveUnusedParameters(Parameters);
     }
@@ -61,5 +62,5 @@
       ParentsParameter.ActualValue = parents;
 
-      ChildParameter.ActualValue = 
+      ChildParameter.ActualValue =
         Crossover(RandomParameter.ActualValue, parents[0] as AlbaEncoding, parents[1] as AlbaEncoding);
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Crossovers/AlbaPermutationCrossover.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -36,5 +37,7 @@
     [StorableConstructor]
     private AlbaPermutationCrossover(bool deserializing) : base(deserializing) { }
-
+    private AlbaPermutationCrossover(AlbaPermutationCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaPermutationCrossover()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInsertionManipulator.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -32,7 +33,13 @@
     [StorableConstructor]
     private AlbaCustomerInsertionManipulator(bool deserializing) : base(deserializing) { }
-
+    private AlbaCustomerInsertionManipulator(AlbaCustomerInsertionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaCustomerInsertionManipulator()
       : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaCustomerInsertionManipulator(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerInversionManipulator.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Data;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -33,9 +34,14 @@
     [StorableConstructor]
     private AlbaCustomerInversionManipulator(bool deserializing) : base(deserializing) { }
-
+    private AlbaCustomerInversionManipulator(AlbaCustomerInversionManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaCustomerInversionManipulator()
       : base() {
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaCustomerInversionManipulator(this, cloner);
+    }
     protected override void Manipulate(IRandom random, AlbaEncoding individual) {
       int breakPoint1, breakPoint2;
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaCustomerSwapManipulator.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -32,7 +33,10 @@
     [StorableConstructor]
     private AlbaCustomerSwapManipulator(bool deserializing) : base(deserializing) { }
-
+    private AlbaCustomerSwapManipulator(AlbaCustomerSwapManipulator original, Cloner cloner) : base(original, cloner) { }
     public AlbaCustomerSwapManipulator()
       : base() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaCustomerSwapManipulator(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaIntraRouteInversionManipulator.cs	(revision 4690)
@@ -27,15 +27,20 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
   [Item("AlbaIntraRouteInversionManipulator", "An operator which applies the SLS operation to a VRP representation. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
   [StorableClass]
-  public sealed class AlbaIntraRouteInversionManipulator : AlbaManipulator {   
+  public sealed class AlbaIntraRouteInversionManipulator : AlbaManipulator {
     [StorableConstructor]
     private AlbaIntraRouteInversionManipulator(bool deserializing) : base(deserializing) { }
-
+    private AlbaIntraRouteInversionManipulator(AlbaIntraRouteInversionManipulator original, Cloner cloner) : base(original, cloner) { }
     public AlbaIntraRouteInversionManipulator()
       : base() {
-     }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionManipulator(this, cloner);
+    }
 
     public static void Apply(AlbaEncoding individual, int index1, int index2) {
@@ -72,5 +77,5 @@
 
         int currentTourEnd = currentTourStart;
-        while (currentTourEnd < individual.Length && 
+        while (currentTourEnd < individual.Length &&
           individual[currentTourEnd] < individual.Cities) {
           currentTourEnd++;
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaLambdaInterchangeManipulator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -35,14 +36,18 @@
       get { return (IValueParameter<IntValue>)Parameters["Lambda"]; }
     }
-    
+
     [StorableConstructor]
     private AlbaLambdaInterchangeManipulator(bool deserializing) : base(deserializing) { }
-
+    private AlbaLambdaInterchangeManipulator(AlbaLambdaInterchangeManipulator original, Cloner cloner) : base(original, cloner) { }
     public AlbaLambdaInterchangeManipulator()
       : base() {
-        Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
-     }
+      Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+    }
 
-    public static void Apply(AlbaEncoding individual, int tour1Index, int position1, int length1, 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeManipulator(this, cloner);
+    }
+
+    public static void Apply(AlbaEncoding individual, int tour1Index, int position1, int length1,
       int tour2Index, int position2, int length2) {
       List<Tour> tours = individual.GetTours();
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaManipulator.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -37,10 +38,10 @@
     [StorableConstructor]
     protected AlbaManipulator(bool deserializing) : base(deserializing) { }
-
+    protected AlbaManipulator(AlbaManipulator original, Cloner cloner) : base(original, cloner) { }
     public AlbaManipulator()
       : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
 
-        AlbaEncoding.RemoveUnusedParameters(Parameters);
+      AlbaEncoding.RemoveUnusedParameters(Parameters);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Manipulators/AlbaPermutationManipulator.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -36,8 +37,12 @@
     [StorableConstructor]
     private AlbaPermutationManipualtor(bool deserializing) : base(deserializing) { }
-
+    private AlbaPermutationManipualtor(AlbaPermutationManipualtor original, Cloner cloner) : base(original, cloner) { }
     public AlbaPermutationManipualtor()
       : base() {
-        Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+      Parameters.Add(new ValueLookupParameter<IPermutationManipulator>("InnerManipulator", "The permutation manipulator.", new TranslocationManipulator()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaPermutationManipualtor(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveMaker.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveMaker.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveMaker.cs	(revision 4690)
@@ -24,4 +24,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -60,8 +61,8 @@
       get { return (ILookupParameter<DoubleValue>)Parameters["Tardiness"]; }
     }
-    
+
     [StorableConstructor]
     protected AlbaMoveMaker(bool deserializing) : base(deserializing) { }
-
+    protected AlbaMoveMaker(AlbaMoveMaker original, Cloner cloner) : base(original, cloner) { }
     public AlbaMoveMaker()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveOperator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveOperator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaMoveOperator.cs	(revision 4690)
@@ -25,14 +25,15 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
   [Item("AlbaMoveOperator", "A move operator for an Alba VRP representation.")]
   [StorableClass]
-  public abstract class AlbaMoveOperator : VRPMoveOperator {    
+  public abstract class AlbaMoveOperator : VRPMoveOperator {
     [StorableConstructor]
     protected AlbaMoveOperator(bool deserializing) : base(deserializing) { }
-
-    public AlbaMoveOperator() : base() 
-    {
+    protected AlbaMoveOperator(AlbaMoveOperator original, Cloner cloner) : base(original, cloner) { }
+    public AlbaMoveOperator()
+      : base() {
       AlbaEncoding.RemoveUnusedParameters(Parameters);
     }
@@ -41,5 +42,5 @@
       IVRPEncoding solution = VRPToursParameter.ActualValue;
       if (!(solution is AlbaEncoding)) {
-        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value, 
+        VRPToursParameter.ActualValue = AlbaEncoding.ConvertFrom(solution, VehiclesParameter.ActualValue.Value,
           DistanceMatrixParameter);
       }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/AlbaPermutationMoveOperator.cs	(revision 4690)
@@ -25,9 +25,10 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
   [Item("AlbaPermutationMoveOperator", "A move operator for an Alba VRP representation using an inner permutation move operator.")]
   [StorableClass]
-  public abstract class AlbaPermutationMoveOperator : AlbaMoveOperator {    
+  public abstract class AlbaPermutationMoveOperator : AlbaMoveOperator {
     [Storable]
     protected abstract IPermutationMoveOperator PermutationMoveOperatorParameter { get; set; }
@@ -35,13 +36,12 @@
     [StorableConstructor]
     protected AlbaPermutationMoveOperator(bool deserializing) : base(deserializing) { }
-
+    protected AlbaPermutationMoveOperator(AlbaPermutationMoveOperator original, Cloner cloner) : base(original, cloner) { }
     public AlbaPermutationMoveOperator()
-      : base() 
-    {
+      : base() {
     }
 
     public override IOperation Apply() {
       IOperation next = base.Apply();
-      
+
       IVRPEncoding solution = VRPToursParameter.ActualValue;
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaExhaustiveIntraRouteInversionMoveGenerator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -34,7 +35,11 @@
     [StorableConstructor]
     private AlbaExhaustiveIntraRouteInversionGenerator(bool deserializing) : base(deserializing) { }
-
+    private AlbaExhaustiveIntraRouteInversionGenerator(AlbaExhaustiveIntraRouteInversionGenerator original, Cloner cloner) : base(original, cloner) { }
     public AlbaExhaustiveIntraRouteInversionGenerator()
       : base() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaExhaustiveIntraRouteInversionGenerator(this, cloner);
     }
 
@@ -44,7 +49,7 @@
       int currentTourStart = 0;
       int currentTourEnd = 0;
-      while(currentTourEnd != individual.Length) {
+      while (currentTourEnd != individual.Length) {
         currentTourEnd = currentTourStart;
-        while (individual[currentTourEnd] < individual.Cities && 
+        while (individual[currentTourEnd] < individual.Cities &&
           currentTourEnd < individual.Length) {
           currentTourEnd++;
@@ -53,9 +58,9 @@
         int tourLength = currentTourEnd - currentTourStart;
         if (tourLength >= 4) {
-          for (int i = 0; i <= tourLength - 4; i++ ) {
+          for (int i = 0; i <= tourLength - 4; i++) {
             for (int j = i + 2; j <= tourLength - 2; j++) {
               AlbaIntraRouteInversionMove move = new AlbaIntraRouteInversionMove(
-                currentTourStart + i, 
-                currentTourStart + j, 
+                currentTourStart + i,
+                currentTourStart + j,
                 individual);
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionEvaluator.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -37,8 +38,12 @@
     [StorableConstructor]
     private AlbaIntraRouteInversionMoveEvaluator(bool deserializing) : base(deserializing) { }
-
+    private AlbaIntraRouteInversionMoveEvaluator(AlbaIntraRouteInversionMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
     public AlbaIntraRouteInversionMoveEvaluator()
       : base() {
-        Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionMoveEvaluator(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMove.cs	(revision 4690)
@@ -32,5 +32,11 @@
   public class AlbaIntraRouteInversionMove : TwoIndexMove, IVRPMove {
     public IVRPEncoding Individual { get { return Permutation as AlbaEncoding; } }
-    
+
+    [StorableConstructor]
+    protected AlbaIntraRouteInversionMove(bool deserializing) : base(deserializing) { }
+    protected AlbaIntraRouteInversionMove(AlbaIntraRouteInversionMove original, Cloner cloner)
+      : base(original, cloner) {
+      Permutation = cloner.Clone(original.Permutation);
+    }
     public AlbaIntraRouteInversionMove()
       : base() {
@@ -43,16 +49,9 @@
     public AlbaIntraRouteInversionMove(int index1, int index2, AlbaEncoding permutation)
       : base(index1, index2, permutation) {
-        this.Permutation = permutation.Clone() as AlbaEncoding;
+      this.Permutation = permutation.Clone() as AlbaEncoding;
     }
 
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      AlbaIntraRouteInversionMove clone = new AlbaIntraRouteInversionMove(
-        Index1, Index2);
-
-      if (Permutation != null)
-        clone.Permutation = (AlbaEncoding)cloner.Clone(Permutation);
-
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionMove(this, cloner);
     }
 
@@ -61,13 +60,13 @@
     public TourEvaluation GetMoveQuality(
       IntValue vehicles,
-      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray, 
+      DoubleArray dueTimeArray, DoubleArray serviceTimeArray, DoubleArray readyTimeArray,
       DoubleArray demandArray, DoubleValue capacity, DoubleMatrix coordinates,
       DoubleValue fleetUsageFactor, DoubleValue timeFactor, DoubleValue distanceFactor,
       DoubleValue overloadPenalty, DoubleValue tardinessPenalty,
       ILookupParameter<DoubleMatrix> distanceMatrix, Data.BoolValue useDistanceMatrix) {
-        return AlbaIntraRouteInversionMoveEvaluator.GetMoveQuality(Permutation as AlbaEncoding, this, vehicles,
-          dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
-          coordinates, fleetUsageFactor, timeFactor, distanceFactor,
-          overloadPenalty, tardinessPenalty, distanceMatrix, useDistanceMatrix);
+      return AlbaIntraRouteInversionMoveEvaluator.GetMoveQuality(Permutation as AlbaEncoding, this, vehicles,
+        dueTimeArray, serviceTimeArray, readyTimeArray, demandArray, capacity,
+        coordinates, fleetUsageFactor, timeFactor, distanceFactor,
+        overloadPenalty, tardinessPenalty, distanceMatrix, useDistanceMatrix);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveGenerator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -42,9 +43,9 @@
     [StorableConstructor]
     protected AlbaIntraRouteInversionMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    protected AlbaIntraRouteInversionMoveGenerator(AlbaIntraRouteInversionMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public AlbaIntraRouteInversionMoveGenerator()
       : base() {
-        Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The moves that should be generated in subscopes."));
-        Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+      Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -46,5 +47,7 @@
     [StorableConstructor]
     private AlbaIntraRouteInversionMoveMaker(bool deserializing) : base(deserializing) { }
-
+    private AlbaIntraRouteInversionMoveMaker(AlbaIntraRouteInversionMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaIntraRouteInversionMoveMaker()
       : base() {
@@ -52,4 +55,8 @@
       Parameters.Add(new LookupParameter<AlbaIntraRouteInversionMove>("AlbaIntraRouteInversionMove", "The move to make."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaIntraRouteInversionMoveMaker(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionMutliMoveGenerator.cs	(revision 4690)
@@ -28,4 +28,5 @@
 using System.Collections.Generic;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -40,12 +41,16 @@
       get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
     }
-    
+
     [StorableConstructor]
     private AlbaStochasticIntraRouteInversionMultiMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    private AlbaStochasticIntraRouteInversionMultiMoveGenerator(AlbaStochasticIntraRouteInversionMultiMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public AlbaStochasticIntraRouteInversionMultiMoveGenerator()
       : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
-        Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+      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 AlbaStochasticIntraRouteInversionMultiMoveGenerator(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaStochasticIntraRouteInversionSingleMoveGenerator.cs	(revision 4690)
@@ -28,4 +28,5 @@
 using System.Collections.Generic;
 using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -41,15 +42,19 @@
 
     #endregion
-    
+
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
-    
+
     [StorableConstructor]
     private AlbaStochasticIntraRouteInversionSingleMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    private AlbaStochasticIntraRouteInversionSingleMoveGenerator(AlbaStochasticIntraRouteInversionSingleMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public AlbaStochasticIntraRouteInversionSingleMoveGenerator()
       : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticIntraRouteInversionSingleMoveGenerator(this, cloner);
     }
 
@@ -75,5 +80,5 @@
 
         int currentTourEnd = currentTourStart;
-        while (currentTourEnd < individual.Length && 
+        while (currentTourEnd < individual.Length &&
           individual[currentTourEnd] < individual.Cities) {
           currentTourEnd++;
@@ -93,5 +98,5 @@
 
       AlbaIntraRouteInversionMove move = Apply(individual, Cities, RandomParameter.ActualValue);
-      if(move != null)
+      if (move != null)
         moves.Add(move);
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaExhaustiveLambdaInterchangeMoveGenerator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -34,7 +35,8 @@
     [StorableConstructor]
     private AlbaExhaustiveLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
-
-    public AlbaExhaustiveLambdaInterchangeMoveGenerator()
-      : base() {
+    private AlbaExhaustiveLambdaInterchangeMoveGenerator(AlbaExhaustiveLambdaInterchangeMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public AlbaExhaustiveLambdaInterchangeMoveGenerator() : base() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaExhaustiveLambdaInterchangeMoveGenerator(this, cloner);
     }
 
@@ -50,9 +52,9 @@
 
           for (int length1 = 0; length1 <= Math.Min(lambda, tour1.Cities.Count); length1++) {
-            for(int length2 = 0; length2 <= Math.Min(lambda, tour2.Cities.Count); length2++) {
-              if(length1 != 0 || length2 != 0) {
-                for(int index1 = 0; index1 < tour1.Cities.Count - length1 + 1; index1++) {
-                  for(int index2 = 0; index2 < tour2.Cities.Count - length2 + 1; index2++) {
-                    moves.Add(new AlbaLambdaInterchangeMove(tour1Index, index1, length1, 
+            for (int length2 = 0; length2 <= Math.Min(lambda, tour2.Cities.Count); length2++) {
+              if (length1 != 0 || length2 != 0) {
+                for (int index1 = 0; index1 < tour1.Cities.Count - length1 + 1; index1++) {
+                  for (int index2 = 0; index2 < tour2.Cities.Count - length2 + 1; index2++) {
+                    moves.Add(new AlbaLambdaInterchangeMove(tour1Index, index1, length1,
                       tour2Index, index2, length2, individual));
                   }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMove.cs	(revision 4690)
@@ -52,5 +52,19 @@
     [Storable]
     public int Length2 { get; protected set; }
-    
+
+    [StorableConstructor]
+    protected AlbaLambdaInterchangeMove(bool deserializing) : base(deserializing) { }
+    protected AlbaLambdaInterchangeMove(AlbaLambdaInterchangeMove original, Cloner cloner)      : base(original, cloner) {
+      Tour1 = original.Tour1;
+      Position1 = original.Position1;
+      Length1 = original.Length1;
+
+      Tour2 = original.Tour2;
+      Position2 = original.Position2;
+      Length2 = original.Length2;
+
+      Individual = cloner.Clone(original.Individual);
+    }
+
     public AlbaLambdaInterchangeMove(): base() {
       Tour1 = -1;
@@ -76,22 +90,4 @@
 
         this.Individual = permutation.Clone() as AlbaEncoding;
-    }
-
-    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
-      AlbaLambdaInterchangeMove clone = new AlbaLambdaInterchangeMove();
-
-      clone.Tour1 = Tour1;
-      clone.Position1 = Position1;
-      clone.Length1 = Length1;
-
-      clone.Tour2 = Tour2;
-      clone.Position2 = Position2;
-      clone.Length2 = Length2;
-
-      if (Individual != null)
-        clone.Individual = (AlbaEncoding)cloner.Clone(Individual);
-
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveEvaluator.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -37,5 +38,7 @@
     [StorableConstructor]
     private AlbaLambdaInterchangeMoveEvaluator(bool deserializing) : base(deserializing) { }
-
+    private AlbaLambdaInterchangeMoveEvaluator(AlbaLambdaInterchangeMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaLambdaInterchangeMoveEvaluator()
       : base() {
@@ -43,4 +46,7 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeMoveEvaluator(this, cloner);
+    }
     public static TourEvaluation GetMoveQuality(AlbaEncoding individual, AlbaLambdaInterchangeMove move, 
       IntValue vehicles, 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveGenerator.cs	(revision 4690)
@@ -28,4 +28,5 @@
 using System.Collections.Generic;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -51,10 +52,12 @@
     [StorableConstructor]
     protected AlbaLambdaInterchangeMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    protected AlbaLambdaInterchangeMoveGenerator(AlbaLambdaInterchangeMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaLambdaInterchangeMoveGenerator()
       : base() {
-        Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The moves that should be generated in subscopes."));
-        Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
-        Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
+      Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+      Parameters.Add(new ValueParameter<IntValue>("Lambda", "The lambda value.", new IntValue(1)));
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -47,5 +48,7 @@
     [StorableConstructor]
     private AlbaLambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
-
+    protected AlbaLambdaInterchangeMoveMaker(AlbaLambdaInterchangeMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaLambdaInterchangeMoveMaker()
       : base() {
@@ -53,4 +56,8 @@
       Parameters.Add(new LookupParameter<AlbaLambdaInterchangeMove>("AlbaLambdaInterchangeMove", "The move to make."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaLambdaInterchangeMoveMaker(this, cloner);
     }
 
@@ -64,9 +71,9 @@
     public override IOperation Apply() {
       IOperation next = base.Apply();
-      
+
       AlbaLambdaInterchangeMove move = LambdaInterchangeMoveParameter.ActualValue;
       DoubleValue moveQuality = MoveQualityParameter.ActualValue;
       DoubleValue quality = QualityParameter.ActualValue;
-     
+
       //perform move
       VRPToursParameter.ActualValue = move.MakeMove();
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeMutliMoveGenerator.cs	(revision 4690)
@@ -28,4 +28,5 @@
 using System.Collections.Generic;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -40,14 +41,16 @@
       get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
     }
-    
+
     [StorableConstructor]
     private AlbaStochasticLambdaInterchangeMultiMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    private AlbaStochasticLambdaInterchangeMultiMoveGenerator(AlbaStochasticLambdaInterchangeMultiMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public AlbaStochasticLambdaInterchangeMultiMoveGenerator()
       : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
-        Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+      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 AlbaStochasticLambdaInterchangeMultiMoveGenerator(this, cloner);
+    }
     protected override AlbaLambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {
       int sampleSize = SampleSizeParameter.ActualValue.Value;
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaStochasticLambdaInterchangeSingleMoveGenerator.cs	(revision 4690)
@@ -28,4 +28,5 @@
 using System.Collections.Generic;
 using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -41,15 +42,21 @@
 
     #endregion
-    
+
     public ILookupParameter<IRandom> RandomParameter {
       get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
-    
+
     [StorableConstructor]
     private AlbaStochasticLambdaInterchangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    private AlbaStochasticLambdaInterchangeSingleMoveGenerator(AlbaStochasticLambdaInterchangeSingleMoveGenerator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaStochasticLambdaInterchangeSingleMoveGenerator()
       : base() {
-        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaStochasticLambdaInterchangeSingleMoveGenerator(this, cloner);
     }
 
@@ -81,5 +88,5 @@
 
       AlbaLambdaInterchangeMove move = Apply(individual, Cities, lambda, RandomParameter.ActualValue);
-      if(move != null)
+      if (move != null)
         moves.Add(move);
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveEvaluator.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -37,8 +38,12 @@
     [StorableConstructor]
     private AlbaTranslocationMoveEvaluator(bool deserializing) : base(deserializing) { }
-
+    private AlbaTranslocationMoveEvaluator(AlbaTranslocationMoveEvaluator original, Cloner cloner)      : base(original, cloner) {    }
     public AlbaTranslocationMoveEvaluator()
       : base() {
       Parameters.Add(new LookupParameter<TranslocationMove>("TranslocationMove", "The move to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveEvaluator(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveGenerator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -70,5 +71,5 @@
     [StorableConstructor]
     private AlbaTranslocationMoveGenerator(bool deserializing) : base(deserializing) { }
-
+    private AlbaTranslocationMoveGenerator(AlbaTranslocationMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public AlbaTranslocationMoveGenerator()
       : base() {
@@ -78,4 +79,8 @@
 
       ((IMultiMoveGenerator)TranslocationMoveGeneratorParameter.Value).SampleSizeParameter.ActualName = SampleSizeParameter.Name;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveGenerator(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveHardTabuCriterion.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -58,9 +59,14 @@
     [StorableConstructor]
     private AlbaTranslocationMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
-
+    private AlbaTranslocationMoveHardTabuCriterion(AlbaTranslocationMoveHardTabuCriterion original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaTranslocationMoveHardTabuCriterion()
       : base() {
       tabuChecker = new TranslocationMoveHardTabuCriterion();
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveHardTabuCriterion(this, cloner);
+    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveMaker.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -50,10 +51,14 @@
     [StorableConstructor]
     private AlbaTranslocationMoveMaker(bool deserializing) : base(deserializing) { }
-
+    private AlbaTranslocationMoveMaker(AlbaTranslocationMoveMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaTranslocationMoveMaker()
       : base() {
       moveMaker = new TranslocationMoveMaker();
     }
-
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveMaker(this, cloner);
+    }
     public override IOperation Apply() {
       IOperation next = base.Apply();
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveSoftTabuCriterion.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -58,9 +59,14 @@
     [StorableConstructor]
     private AlbaTranslocationMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
-
+    private AlbaTranslocationMoveSoftTabuCriterion(AlbaTranslocationMoveSoftTabuCriterion original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaTranslocationMoveSoftTabuCriterion()
       : base() {
       tabuChecker = new TranslocationMoveSoftTabuCriterion();
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveSoftTabuCriterion(this, cloner);
+    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/ThreeOpt/AlbaTranslocationMoveTabuMaker.cs	(revision 4690)
@@ -25,4 +25,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {
@@ -58,9 +59,14 @@
     [StorableConstructor]
     private AlbaTranslocationMoveTabuMaker(bool deserializing) : base(deserializing) { }
-
+    private AlbaTranslocationMoveTabuMaker(AlbaTranslocationMoveTabuMaker original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public AlbaTranslocationMoveTabuMaker()
       : base() {
       moveTabuMaker = new TranslocationMoveTabuMaker();
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlbaTranslocationMoveTabuMaker(this, cloner);
+    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Evaluators/VRPEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Evaluators/VRPEvaluator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Evaluators/VRPEvaluator.cs	(revision 4690)
@@ -26,4 +26,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -82,4 +83,9 @@
     }
 
+    [StorableConstructor]
+    private VRPEvaluator(bool deserializing) : base(deserializing) { }
+    private VRPEvaluator(VRPEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public VRPEvaluator()
       : base() {
@@ -98,4 +104,8 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPEvaluator(this, cloner);
+    }
+
     private double CalculateFleetUsage() {
       IVRPEncoding vrpSolution = VRPToursParameter.ActualValue;
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/MoveEvaluators/VRPMoveEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/MoveEvaluators/VRPMoveEvaluator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/MoveEvaluators/VRPMoveEvaluator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.VehicleRouting.Encodings;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -39,5 +40,5 @@
       get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
     }
-   
+
     public ILookupParameter<DoubleValue> FleetUsageFactor {
       get { return (ILookupParameter<DoubleValue>)Parameters["EvalFleetUsageFactor"]; }
@@ -80,5 +81,5 @@
     [StorableConstructor]
     protected VRPMoveEvaluator(bool deserializing) : base(deserializing) { }
-
+    protected VRPMoveEvaluator(VRPMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
     protected VRPMoveEvaluator()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VRPOperator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VRPOperator.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VRPOperator.cs	(revision 4690)
@@ -27,4 +27,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using System;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.VehicleRouting {
@@ -110,5 +111,5 @@
     [StorableConstructor]
     protected VRPOperator(bool deserializing) : base(deserializing) { }
-
+    protected VRPOperator(VRPOperator original, Cloner cloner) : base(original, cloner) { }
     public VRPOperator()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VRPSolution.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VRPSolution.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VRPSolution.cs	(revision 4690)
@@ -195,10 +195,11 @@
     public VRPSolution() : base() { }
 
-    public VRPSolution(DoubleMatrix coordinates): base() {
+    public VRPSolution(DoubleMatrix coordinates)
+      : base() {
       this.coordinates = coordinates;
     }
 
-    public VRPSolution(DoubleMatrix coordinates, IVRPEncoding solution, DoubleValue quality, 
-      DoubleValue distance, DoubleValue overload, DoubleValue tardiness, DoubleValue travelTime, 
+    public VRPSolution(DoubleMatrix coordinates, IVRPEncoding solution, DoubleValue quality,
+      DoubleValue distance, DoubleValue overload, DoubleValue tardiness, DoubleValue travelTime,
       DoubleValue vehicleUtilization, DoubleMatrix distanceMatrix, BoolValue useDistanceMatrix,
       DoubleArray readyTime, DoubleArray dueTime, DoubleArray serviceTime)
@@ -222,5 +223,26 @@
     private VRPSolution(bool deserializing) : base(deserializing) { }
 
+    protected VRPSolution(VRPSolution original, Cloner cloner)
+      : base(original, cloner) {
+      coordinates = cloner.Clone(original.coordinates);
+      solution = cloner.Clone(original.solution);
+      quality = cloner.Clone(original.quality);
+      distance = cloner.Clone(original.distance);
+      overload = cloner.Clone(original.overload);
+      tardiness = cloner.Clone(original.tardiness);
+      travelTime = cloner.Clone(original.travelTime);
+      vehicleUtilization = cloner.Clone(original.vehicleUtilization);
+      distanceMatrix = cloner.Clone(original.distanceMatrix);
+      useDistanceMatrix = cloner.Clone(original.useDistanceMatrix);
+      readyTime = cloner.Clone(original.readyTime);
+      dueTime = cloner.Clone(original.dueTime);
+      serviceTime = cloner.Clone(original.serviceTime);
+      Initialize();
+    }
+
     [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
     private void Initialize() {
       if (coordinates != null) RegisterCoordinatesEvents();
@@ -235,21 +257,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      VRPSolution clone = new VRPSolution();
-      cloner.RegisterClonedObject(this, clone);
-      clone.coordinates = (DoubleMatrix)cloner.Clone(coordinates);
-      clone.solution = (IVRPEncoding)cloner.Clone(solution);
-      clone.quality = (DoubleValue)cloner.Clone(quality);
-      clone.distance = (DoubleValue)cloner.Clone(distance);
-      clone.overload = (DoubleValue)cloner.Clone(overload);
-      clone.tardiness = (DoubleValue)cloner.Clone(tardiness);
-      clone.travelTime = (DoubleValue)cloner.Clone(travelTime);
-      clone.vehicleUtilization = (DoubleValue)cloner.Clone(vehicleUtilization);
-      clone.distanceMatrix = (DoubleMatrix)cloner.Clone(distanceMatrix);
-      clone.useDistanceMatrix = (BoolValue)cloner.Clone(useDistanceMatrix);
-      clone.readyTime = (DoubleArray)cloner.Clone(readyTime);
-      clone.dueTime = (DoubleArray)cloner.Clone(dueTime);
-      clone.serviceTime = (DoubleArray)cloner.Clone(serviceTime);
-      clone.Initialize();
-      return clone;
+      return new VRPSolution(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs	(revision 4689)
+++ branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/VehicleRoutingProblem.cs	(revision 4690)
@@ -197,5 +197,10 @@
     [StorableConstructor]
     private VehicleRoutingProblem(bool deserializing) : base(deserializing) { }
-
+    private VehicleRoutingProblem(VehicleRoutingProblem original, Cloner cloner)
+      : base(original, cloner) {
+      operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      DistanceMatrixParameter.Value = DistanceMatrixParameter.Value;
+      AttachEventHandlers();
+    }
     public VehicleRoutingProblem()
       : base() {
@@ -237,9 +242,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      VehicleRoutingProblem clone = (VehicleRoutingProblem)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.DistanceMatrixParameter.Value = DistanceMatrixParameter.Value;
-      clone.AttachEventHandlers();
-      return clone;
+      return new VehicleRoutingProblem(this, cloner);
     }
 
@@ -454,5 +455,5 @@
 
       SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
-      
+
       EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
@@ -563,15 +564,15 @@
     private void ParameterizeOperators() {
       foreach (IVRPOperator op in Operators.OfType<IVRPOperator>()) {
-        if(op.CoordinatesParameter != null) op.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-        if(op.DistanceMatrixParameter != null) op.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
-        if(op.UseDistanceMatrixParameter != null) op.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
-        if(op.VehiclesParameter != null) op.VehiclesParameter.ActualName = VehiclesParameter.Name;
-        if(op.CapacityParameter != null) op.CapacityParameter.ActualName = CapacityParameter.Name;
-        if(op.DemandParameter != null) op.DemandParameter.ActualName = DemandParameter.Name;
-        if(op.ReadyTimeParameter != null) op.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
-        if(op.DueTimeParameter != null) op.DueTimeParameter.ActualName = DueTimeParameter.Name;
-        if(op.ServiceTimeParameter != null) op.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
-      }
-      
+        if (op.CoordinatesParameter != null) op.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (op.DistanceMatrixParameter != null) op.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
+        if (op.UseDistanceMatrixParameter != null) op.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
+        if (op.VehiclesParameter != null) op.VehiclesParameter.ActualName = VehiclesParameter.Name;
+        if (op.CapacityParameter != null) op.CapacityParameter.ActualName = CapacityParameter.Name;
+        if (op.DemandParameter != null) op.DemandParameter.ActualName = DemandParameter.Name;
+        if (op.ReadyTimeParameter != null) op.ReadyTimeParameter.ActualName = ReadyTimeParameter.Name;
+        if (op.DueTimeParameter != null) op.DueTimeParameter.ActualName = DueTimeParameter.Name;
+        if (op.ServiceTimeParameter != null) op.ServiceTimeParameter.ActualName = ServiceTimeParameter.Name;
+      }
+
       foreach (IVRPMoveOperator op in Operators.OfType<IVRPMoveOperator>()) {
         op.VRPToursParameter.ActualName = SolutionCreator.VRPToursParameter.ActualName;
@@ -641,5 +642,5 @@
       if (parser.Vehicles != -1)
         Vehicles.Value = parser.Vehicles;
-      else 
+      else
         Vehicles.Value = problemSize - 1;
       Capacity.Value = parser.Capacity;
