Index: branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 10538)
+++ branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 11009)
@@ -31,4 +31,6 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 using HeuristicLab.Problems.VehicleRouting.Variants;
@@ -99,5 +101,5 @@
       foreach (IOperator op in operators) {
         if (op is IMultiVRPMoveGenerator && !(op is MultiOperator<IMultiVRPMoveGenerator>)) {
-          Operators.Add(op.Clone() as IMultiVRPMoveGenerator, true);
+          Operators.Add(op.Clone() as IMultiVRPMoveGenerator, !(op is IAlbaOperator || op is PotvinVehicleAssignmentMultiMoveGenerator));
         }
       }
Index: branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 10538)
+++ branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/IterativeInsertionCreator.cs	(revision 11009)
@@ -107,5 +107,5 @@
         int stopIdx = 0;
         if (currentTour.Stops.Count > 0)
-          result.FindBestInsertionPlace(currentTour, customers[index]);
+          stopIdx = result.FindBestInsertionPlace(currentTour, customers[index]);
         currentTour.Stops.Insert(stopIdx, customers[index]);
 
Index: branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 10538)
+++ branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Creators/PushForwardInsertionCreator.cs	(revision 11009)
@@ -33,5 +33,5 @@
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
-  [Item("PushForwardInsertionCreator", "Creates a randomly initialized VRP solution.")]
+  [Item("PushForwardInsertionCreator", "The push forward insertion heuristic. It is implemented as described in Sam, and Thangiah, R. (1999). A Hybrid Genetic Algorithms, Simulated Annealing and Tabu Search Heuristic for Vehicle Routing Problems with Time Windows. Practical Handbook of Genetic Algorithms, Volume III, pp 347–381.")]
   [StorableClass]
   public sealed class PushForwardInsertionCreator : PotvinCreator, IStochasticOperator {
@@ -138,13 +138,10 @@
           dueTime = 0;
 
-        double dist;
-        if (problemInstance.Coordinates[customer + depotCount - 1, 0] < x0)
-          dist = -distance;
-        else
-          dist = distance;
+        double x = problemInstance.Coordinates[customer + depotCount - 1, 0];
+        double y = problemInstance.Coordinates[customer + depotCount - 1, 1];
 
         double cost = alpha * distance + // distance 0 <-> City[i]
-                   -beta * dueTime + // latest arrival time
-                   -gamma * (Math.Asin((problemInstance.Coordinates[customer + depotCount - 1, 1] - y0) / dist) / 360 * dist); // polar angle
+                      -beta * dueTime + // latest arrival time
+                      -gamma * ((Math.Atan2(y - y0, x - x0) + Math.PI) / (2.0 * Math.PI) * distance); // polar angle
 
         if (cost < minCost) {
Index: branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuCriterion.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuCriterion.cs	(revision 10538)
+++ branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/CustomerRelocation/PotvinCustomerRelocationMoveTabuCriterion.cs	(revision 11009)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -98,7 +99,5 @@
       PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue;
 
-      foreach (IItem tabuMove in tabuList) {
-        PotvinCustomerRelocationMoveAttribute attribute = tabuMove as PotvinCustomerRelocationMoveAttribute;
-
+      foreach (var attribute in tabuList.OfType<PotvinCustomerRelocationMoveAttribute>()) {
         if (!useAspiration || moveQuality >= attribute.MoveQuality) {
           if (attribute.City == move.City && attribute.Tour == move.Tour) {
Index: branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 10538)
+++ branches/DataPreprocessing/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 11009)
@@ -365,4 +365,8 @@
       Name = instance.Name;
       Description = instance.Description;
+
+      BestKnownQuality = null;
+      BestKnownSolution = null;
+
       if (ProblemInstance != null && instance.ProblemInstance != null &&
         instance.ProblemInstance.GetType() == ProblemInstance.GetType())
@@ -372,6 +376,4 @@
 
       OnReset();
-      BestKnownQuality = null;
-      BestKnownSolution = null;
 
       if (instance.BestKnownQuality != null) {
@@ -389,21 +391,20 @@
 
     public void Load(VRPData data) {
-      Type interpreterType = typeof(IVRPDataInterpreter<>).MakeGenericType(data.GetType());
-      var interpreters = ApplicationManager.Manager.GetInstances(interpreterType);
-      IVRPDataInterpreter interpreter = null;
-      foreach (object i in interpreters) {
-        var parentInterfaces = i.GetType().BaseType.GetInterfaces();
-        var interfaces = i.GetType().GetInterfaces().Except(parentInterfaces);
-        var interpreterInterface = interfaces.First(j => typeof(IVRPDataInterpreter).IsAssignableFrom(j));
-        var interpreterDataType = interpreterInterface.GetGenericArguments()[0];
-        if (interpreterDataType == data.GetType()) {
-          interpreter = i as IVRPDataInterpreter;
-          break;
-        }
-      }
-
-      if (interpreter == null)
-        throw new ArgumentException("No interpreter found for the VRP type");
-      Load(data, interpreter);
+      var interpreterDataType = data.GetType();
+      var interpreterType = typeof(IVRPDataInterpreter<>).MakeGenericType(interpreterDataType);
+
+      var interpreters = ApplicationManager.Manager.GetTypes(interpreterType);
+
+      var concreteInterpreter = interpreters.Single(t => GetInterpreterDataType(t) == interpreterDataType);
+
+      Load(data, (IVRPDataInterpreter)Activator.CreateInstance(concreteInterpreter));
+    }
+
+    private Type GetInterpreterDataType(Type type) {
+      var parentInterfaces = type.BaseType.GetInterfaces();
+      var interfaces = type.GetInterfaces().Except(parentInterfaces);
+
+      var interpreterInterface = interfaces.Single(i => typeof(IVRPDataInterpreter).IsAssignableFrom(i));
+      return interpreterInterface.GetGenericArguments()[0];
     }
 
