Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 17707)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/HeuristicLab.Problems.VehicleRouting-3.4.csproj	(revision 17708)
@@ -135,5 +135,8 @@
     <Compile Include="Analyzer\ConstraintRelaxation\TimeWindowed\TimeWindowRelaxationVRPAnalyzer.cs" />
     <Compile Include="Analyzer\VRPSolution.cs" />
+    <Compile Include="Encodings\MultiVRPEncoding.cs" />
     <Compile Include="Encodings\Alba\AlbaEncoding.cs" />
+    <Compile Include="Encodings\GVR\GVREncoding.cs" />
+    <Compile Include="Encodings\Potvin\PotvinEncoding.cs" />
     <Compile Include="Encodings\Potvin\Moves\TwoOptStar\IPotvinTwoOptStarMoveOperator.cs" />
     <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarExhaustiveMoveGenerator.cs" />
@@ -147,4 +150,6 @@
     <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarMultiMoveGenerator.cs" />
     <Compile Include="Encodings\Potvin\Moves\TwoOptStar\PotvinTwoOptStarSingleMoveGenerator.cs" />
+    <Compile Include="Encodings\Prins\PrinsEncoding.cs" />
+    <Compile Include="Encodings\Zhu\ZhuEncoding.cs" />
     <Compile Include="Improver\VRPImprovementOperator.cs" />
     <Compile Include="Improver\VRPIntraRouteImprovementOperator.cs" />
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs	(revision 17707)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs	(revision 17708)
@@ -21,20 +21,47 @@
 
 
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPInsertionInfo", "")]
+  [StorableType("f951554e-dbe1-4dfb-a6b2-b477b9f79fcd")]
   public class CVRPInsertionInfo : StopInsertionInfo {
-    private double spareCapacity;
+    [Storable] public double SpareCapacity { get; private set; }
 
-    public double SpareCapacity {
-      get { return spareCapacity; }
+    [StorableConstructor]
+    protected CVRPInsertionInfo(StorableConstructorFlag _) : base(_) { }
+    protected CVRPInsertionInfo(CVRPInsertionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      SpareCapacity = original.SpareCapacity;
+    }
+    public CVRPInsertionInfo(int start, int end, double spareCapacity)
+      : base(start, end) {
+      SpareCapacity = spareCapacity;
     }
 
-    public CVRPInsertionInfo(int start, int end, double spareCapacity)
-      : base(start, end) {
-      this.spareCapacity = spareCapacity;
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPInsertionInfo(this, cloner);
     }
   }
 
+  [Item("CVRPEvaluation", "")]
+  [StorableType("e3d4c547-3028-4c95-8ea8-1fe234d54ed3")]
   public class CVRPEvaluation : VRPEvaluation {
-    public double Overload { get; set; }
+    [Storable] public double Overload { get; set; }
+
+    [StorableConstructor]
+    protected CVRPEvaluation(StorableConstructorFlag _) : base(_) { }
+    protected CVRPEvaluation(CVRPEvaluation original, Cloner cloner)
+      : base(original, cloner) {
+      Overload = original.Overload;
+    }
+    public CVRPEvaluation() { }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPEvaluation(this, cloner);
+    }
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs	(revision 17707)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs	(revision 17708)
@@ -21,29 +21,51 @@
 
 using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
 
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPPDTWInsertionInfo", "")]
+  [StorableType("acb4ecf2-70a5-42ec-a2a5-68b11bd033e2")]
   public class CVRPPDTWInsertionInfo : CVRPTWInsertionInfo {
-    private List<int> visited;
+    [Storable] public List<int> Visited { get; private set; }
+    [Storable] public double ArrivalSpareCapacity { get; private set; }
 
-    public List<int> Visited {
-      get { return visited; }
+    [StorableConstructor]
+    protected CVRPPDTWInsertionInfo(StorableConstructorFlag _) : base(_) { }
+    protected CVRPPDTWInsertionInfo(CVRPPDTWInsertionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      Visited = original.Visited.ToList();
+      ArrivalSpareCapacity = original.ArrivalSpareCapacity;
     }
-
-    private double arrivalSpareCapacity;
-
-    public double ArrivalSpareCapacity {
-      get { return arrivalSpareCapacity; }
-    }
-
     public CVRPPDTWInsertionInfo(int start, int end, double spareCapacity, double tourStartTime,
       double arrivalTime, double leaveTime, double spareTime, double waitingTime, List<int> visited, double arrivalSpareCapacity)
       : base(start, end, spareCapacity, tourStartTime, arrivalTime, leaveTime, spareTime, waitingTime) {
-      this.visited = visited;
-      this.arrivalSpareCapacity = arrivalSpareCapacity;
+      Visited = visited;
+      ArrivalSpareCapacity = arrivalSpareCapacity;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPPDTWInsertionInfo(this, cloner);
     }
   }
 
+  [Item("CVRPPDTWEvaluation", "")]
+  [StorableType("877ae91a-708f-4b32-95f3-d790e0efc018")]
   public class CVRPPDTWEvaluation : CVRPTWEvaluation {
-    public int PickupViolations { get; set; }
+    [Storable] public int PickupViolations { get; set; }
+
+    [StorableConstructor]
+    protected CVRPPDTWEvaluation(StorableConstructorFlag _) : base(_) { }
+    protected CVRPPDTWEvaluation(CVRPPDTWEvaluation original, Cloner cloner)
+      : base(original, cloner) {
+      PickupViolations = original.PickupViolations;
+    }
+    public CVRPPDTWEvaluation() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPPDTWEvaluation(this, cloner);
+    }
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs	(revision 17707)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs	(revision 17708)
@@ -21,49 +21,58 @@
 
 
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
+  [Item("CVRPTWInsertionInfo", "")]
+  [StorableType("487635b5-2682-42a2-9ec2-1a210e6ce88c")]
   public class CVRPTWInsertionInfo : CVRPInsertionInfo {
-    private double tourStartTime;
 
-    public double TourStartTime {
-      get { return tourStartTime; }
+    [Storable] public double TourStartTime { get; private set; }
+    [Storable] public double ArrivalTime { get; private set; }
+    [Storable] public double LeaveTime { get; private set; }
+    [Storable] public double SpareTime { get; private set; }
+    [Storable] public double WaitingTime { get; private set; }
+
+
+    [StorableConstructor]
+    protected CVRPTWInsertionInfo(StorableConstructorFlag _) : base(_) { }
+    protected CVRPTWInsertionInfo(CVRPTWInsertionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      TourStartTime = original.TourStartTime;
+      ArrivalTime = original.ArrivalTime;
+      LeaveTime = original.LeaveTime;
+      SpareTime = original.SpareTime;
+      WaitingTime = original.WaitingTime;
     }
-
-    private double arrivalTime;
-
-    public double ArrivalTime {
-      get { return arrivalTime; }
-    }
-
-    private double leaveTime;
-
-    public double LeaveTime {
-      get { return leaveTime; }
-    }
-
-    private double spareTime;
-
-    public double SpareTime {
-      get { return spareTime; }
-    }
-
-    private double waitingTime;
-
-    public double WaitingTime {
-      get { return waitingTime; }
-    }
-
     public CVRPTWInsertionInfo(int start, int end, double spareCapacity, double tourStartTime, double arrivalTime, double leaveTime, double spareTime, double waitingTime)
       : base(start, end, spareCapacity) {
-      this.tourStartTime = tourStartTime;
-      this.arrivalTime = arrivalTime;
-      this.leaveTime = leaveTime;
-      this.spareTime = spareTime;
-      this.waitingTime = waitingTime;
+      TourStartTime = tourStartTime;
+      ArrivalTime = arrivalTime;
+      LeaveTime = leaveTime;
+      SpareTime = spareTime;
+      WaitingTime = waitingTime;
     }
   }
 
+  [Item("CVRPTWEvaluation", "")]
+  [StorableType("b3b31244-5ac8-4007-9ae6-249e2a7d5321")]
   public class CVRPTWEvaluation : CVRPEvaluation {
-    public double Tardiness { get; set; }
-    public double TravelTime { get; set; }
+    [Storable] public double Tardiness { get; set; }
+    [Storable] public double TravelTime { get; set; }
+
+    [StorableConstructor]
+    protected CVRPTWEvaluation(StorableConstructorFlag _) : base(_) { }
+    protected CVRPTWEvaluation(CVRPTWEvaluation original, Cloner cloner)
+      : base(original, cloner) {
+      Tardiness = original.Tardiness;
+      TravelTime = original.TravelTime;
+    }
+    public CVRPTWEvaluation() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CVRPTWEvaluation(this, cloner);
+    }
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs	(revision 17707)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs	(revision 17708)
@@ -21,38 +21,61 @@
 
 using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
-  public class StopInsertionInfo {
-    private int start;
+  [Item("StopInsertionInfo", "")]
+  [StorableType("e4e2657a-0af9-4f1c-b396-887ad5b6f459")]
+  public class StopInsertionInfo : Item {
+    [Storable] public int Start { get; private set; }
+    [Storable] public int End { get; private set; }
 
-    public int Start {
-      get { return start; }
+
+    [StorableConstructor]
+    protected StopInsertionInfo(StorableConstructorFlag _) : base(_) { }
+    protected StopInsertionInfo(StopInsertionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      Start = original.Start;
+      End = original.End;
+    }
+    public StopInsertionInfo(int start, int end)
+      : base() {
+      Start = start;
+      End = end;
     }
 
-    private int end;
-
-    public int End {
-      get { return end; }
-    }
-
-    public StopInsertionInfo(int start, int end)
-      : base() {
-      this.start = start;
-      this.end = end;
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StopInsertionInfo(this, cloner);
     }
   }
 
-  public class TourInsertionInfo {
-    public double Penalty { get; set; }
-    public double Quality { get; set; }
+  [Item("TourInsertionInfo", "")]
+  [StorableType("25a61cca-120b-43e2-845a-d290352ca1e9")]
+  public class TourInsertionInfo : Item {
+    [Storable] public double Penalty { get; set; }
+    [Storable] public double Quality { get; set; }
+    [Storable] public int Vehicle { get; set; }
+    [Storable] private List<StopInsertionInfo> stopInsertionInfos;
 
-    public int Vehicle { get; set; }
-
-    private List<StopInsertionInfo> stopInsertionInfos;
-
+    [StorableConstructor]
+    protected TourInsertionInfo(StorableConstructorFlag _) : base(_) { }
+    protected TourInsertionInfo(TourInsertionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      Penalty = original.Penalty;
+      Quality = original.Quality;
+      Vehicle = original.Vehicle;
+      stopInsertionInfos = original.stopInsertionInfos.Select(cloner.Clone).ToList();
+    }
     public TourInsertionInfo(int vehicle)
       : base() {
       stopInsertionInfos = new List<StopInsertionInfo>();
       Vehicle = vehicle;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TourInsertionInfo(this, cloner);
     }
 
@@ -70,10 +93,22 @@
   }
 
-  public class InsertionInfo {
-    private List<TourInsertionInfo> tourInsertionInfos;
+  [Item("InsertionInfo", "")]
+  [StorableType("ba569eb3-df25-4f73-bfa0-246b38c1d520")]
+  public class InsertionInfo : Item {
+    [Storable] private List<TourInsertionInfo> tourInsertionInfos;
 
+    [StorableConstructor]
+    protected InsertionInfo(StorableConstructorFlag _) : base(_) { }
+    protected InsertionInfo(InsertionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      tourInsertionInfos = original.tourInsertionInfos.Select(cloner.Clone).ToList();
+    }
     public InsertionInfo()
       : base() {
       tourInsertionInfos = new List<TourInsertionInfo>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InsertionInfo(this, cloner);
     }
 
@@ -87,14 +122,30 @@
   }
 
-  public class VRPEvaluation {
-    public double Quality { get; set; }
-    public double Distance { get; set; }
-    public int VehicleUtilization { get; set; }
-    public InsertionInfo InsertionInfo { get; set; }
+  [Item("VRPEvaluation", "")]
+  [StorableType("0c4dfa78-8e41-4558-b2dd-4a22954c35ba")]
+  public class VRPEvaluation : EvaluationResult {
+    [Storable] public double Quality { get; set; }
+    [Storable] public double Distance { get; set; }
+    [Storable] public int VehicleUtilization { get; set; }
+    [Storable] public InsertionInfo InsertionInfo { get; set; }
+    [Storable] public double Penalty { get; set; }
 
-    public double Penalty { get; set; }
 
-    public VRPEvaluation() {
+    [StorableConstructor]
+    protected VRPEvaluation(StorableConstructorFlag _) : base(_) { }
+    protected VRPEvaluation(VRPEvaluation original, Cloner cloner)
+      : base(original, cloner) {
+      Quality = original.Quality;
+      Distance = original.Distance;
+      VehicleUtilization = original.VehicleUtilization;
+      InsertionInfo = cloner.Clone(original.InsertionInfo);
+      Penalty = original.Penalty;
+    }
+    public VRPEvaluation() : base() {
       InsertionInfo = new InsertionInfo();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new VRPEvaluation(this, cloner);
     }
   }
