Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 5201)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 5202)
@@ -58,4 +58,7 @@
       get { return (LookupParameter<VRPSolution>)Parameters["BestSolution"]; }
     }
+    public LookupParameter<VRPSolution> BestValidSolutionParameter {
+      get { return (LookupParameter<VRPSolution>)Parameters["BestValidSolution"]; }
+    }
     public ValueLookupParameter<ResultCollection> ResultsParameter {
       get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
@@ -84,5 +87,6 @@
         Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("VehiclesUtilized", "The utilized vehicles of the VRP solutions which should be analyzed."));
 
-        Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best TSP solution."));
+        Parameters.Add(new LookupParameter<VRPSolution>("BestSolution", "The best VRP solution."));
+        Parameters.Add(new LookupParameter<VRPSolution>("BestValidSolution", "The best valid VRP solution."));
         Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
     }
@@ -140,4 +144,21 @@
       }
 
+      VRPSolution validSolution = BestValidSolutionParameter.ActualValue;
+      if (validSolution == null) {
+        if (ProblemInstanceParameter.ActualValue.Feasible(best)) {
+          validSolution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[i].Value));
+          BestValidSolutionParameter.ActualValue = validSolution;
+          results.Add(new Result("Best valid VRP Solution", validSolution));
+        }
+      } else {
+        if (qualities[i].Value <= validSolution.Quality.Value) {
+          if (ProblemInstanceParameter.ActualValue.Feasible(best)) {
+            validSolution.ProblemInstance = problemInstance;
+            validSolution.Solution = best.Clone() as IVRPEncoding;
+            validSolution.Quality.Value = qualities[i].Value;
+          }
+        }
+      }
+
       if (bestKnownQuality == null ||
           qualities[i].Value < bestKnownQuality.Value) {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveEvaluator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveEvaluator.cs	(revision 5201)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveEvaluator.cs	(revision 5202)
@@ -40,10 +40,10 @@
     }
 
-    public ILookupParameter<IMemory> MemoryParameter {
-      get { return (ILookupParameter<IMemory>)Parameters["Memory"]; }
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; }
     }
 
-    public IValueParameter<StringValue> AdditionFrequencyParameter {
-      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequency"]; }
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
     }
 
@@ -59,6 +59,6 @@
        Parameters.Add(new LookupParameter<PotvinCustomerRelocationMove>("PotvinCustomerRelocationMove", "The move that should be evaluated."));
 
-       Parameters.Add(new LookupParameter<IMemory>("Memory", "The TS memory."));
-       Parameters.Add(new ValueParameter<StringValue>("AdditionFrequency", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+       Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+       Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
        Parameters.Add(new ValueParameter<DoubleValue>("Lambda", "The lambda parameter.", new DoubleValue(0.015)));
     }
@@ -82,9 +82,10 @@
       //Apply memory, only if move is worse
       if (MoveQualityParameter.ActualValue.Value >= QualityParameter.ActualValue.Value) {
-        IMemory memory = MemoryParameter.ActualValue;
-        string key = AdditionFrequencyParameter.Value.Value;
-        ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency =
-          memory.Get(key) as ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>;
-        if (additionFrequency != null) {
+        VariableCollection memory = MemoriesParameter.ActualValue;
+        string key = AdditionFrequencyMemoryKeyParameter.Value.Value;
+
+        if (memory.ContainsKey(key)) {
+          ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency =
+               memory[key].Value as ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>;
           PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City);
           if (additionFrequency.ContainsKey(attr)) {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs	(revision 5201)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveMaker.cs	(revision 5202)
@@ -53,10 +53,10 @@
     }
 
-    public ILookupParameter<IMemory> MemoryParameter {
-      get { return (ILookupParameter<IMemory>)Parameters["Memory"]; } 
+    public ILookupParameter<VariableCollection> MemoriesParameter {
+      get { return (ILookupParameter<VariableCollection>)Parameters["Memories"]; } 
     }
 
-    public IValueParameter<StringValue> AdditionFrequencyParameter {
-      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequency"]; }
+    public IValueParameter<StringValue> AdditionFrequencyMemoryKeyParameter {
+      get { return (IValueParameter<StringValue>)Parameters["AdditionFrequencyMemoryKey"]; }
     }
 
@@ -71,6 +71,6 @@
       Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(1000.0)));
 
-      Parameters.Add(new LookupParameter<IMemory>("Memory", "The TS memory."));
-      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequency", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
+      Parameters.Add(new LookupParameter<VariableCollection>("Memories", "The TS memory collection."));
+      Parameters.Add(new ValueParameter<StringValue>("AdditionFrequencyMemoryKey", "The key that is used for the addition frequency in the TS memory.", new StringValue("AdditionFrequency")));
     }
 
@@ -122,12 +122,14 @@
 
       //update memory
-      IMemory memory = MemoryParameter.ActualValue;
-      string key = AdditionFrequencyParameter.Value.Value;
+      VariableCollection memory = MemoriesParameter.ActualValue;
+      string key = AdditionFrequencyMemoryKeyParameter.Value.Value;
+
+      if (!memory.ContainsKey(key)) {
+        memory.Add(new Variable(key,
+            new ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>()));
+      }
       ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency =
-        memory.Get(key) as ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>;
-      if (additionFrequency == null) {
-        additionFrequency = new ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>();
-        memory.Put(key, additionFrequency);
-      }
+        memory[key].Value as ItemDictionary<PotvinCustomerRelocationMoveAttribute, IntValue>;
+
       PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City);
       if (!additionFrequency.ContainsKey(attr))
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs	(revision 5201)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/PotvinEncoding.cs	(revision 5202)
@@ -79,8 +79,4 @@
     }
 
-    public double EvaluateTour(Tour tour) {
-      return ProblemInstance.Evaluate(tour);
-    }
-
     public double GetTourLength(Tour tour) {
       double length = 0;
@@ -109,5 +105,6 @@
         tour.Stops.Insert(i, city);
 
-        double quality = EvaluateTour(tour);
+        VRPEvaluation eval = ProblemInstance.EvaluatorParameter.Value.Evaluate(ProblemInstance, tour);
+        double quality = eval.Quality + eval.Penalty * (PenaltyFactor - 1.0);
 
         if (place < 0 || quality < minQuality) {
