Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs	(revision 6796)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuCriterion.cs	(revision 6797)
@@ -28,4 +28,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -115,22 +116,33 @@
         PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
 
-        if (!useAspiration || moveQuality >= attribute.MoveQuality) {
-          if ((attribute.City == move.City && attribute.Tour == move.Tour) || 
+        double distance = 0;
+        if (MoveDistanceParameter.ActualValue != null)
+          distance = MoveDistanceParameter.ActualValue.Value;
+
+        double overload = 0;
+        if (MoveOverloadParameter.ActualValue != null)
+          overload = MoveOverloadParameter.ActualValue.Value;
+
+        double tardiness = 0;
+        if (MoveTardinessParameter.ActualValue != null)
+          tardiness = MoveTardinessParameter.ActualValue.Value;
+
+        IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+        double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+        IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+        if (cvrp != null)
+          quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+        ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+        if (vrptw != null)
+          quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+        if (!useAspiration || moveQuality >= quality) {
+          if ((attribute.City == move.City && attribute.Tour == move.Tour) ||
             (attribute.City == move.Replaced && attribute.Tour == move.OldTour)) {
             isTabu = true;
             break;
           }
-
-          double distance = 0;
-          if (MoveDistanceParameter.ActualValue != null)
-            distance = MoveDistanceParameter.ActualValue.Value;
-
-          double overload = 0;
-          if (MoveOverloadParameter.ActualValue != null)
-            overload = MoveOverloadParameter.ActualValue.Value;
-
-          double tardiness = 0;
-          if (MoveTardinessParameter.ActualValue != null)
-            tardiness = MoveTardinessParameter.ActualValue.Value;
 
           if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs	(revision 6796)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDRearrange/PotvinPDRearrangeMoveTabuCriterion.cs	(revision 6797)
@@ -28,4 +28,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -115,21 +116,32 @@
         PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
 
-        if (!useAspiration || moveQuality >= attribute.MoveQuality) {
+        double distance = 0;
+        if (MoveDistanceParameter.ActualValue != null)
+          distance = MoveDistanceParameter.ActualValue.Value;
+
+        double overload = 0;
+        if (MoveOverloadParameter.ActualValue != null)
+          overload = MoveOverloadParameter.ActualValue.Value;
+
+        double tardiness = 0;
+        if (MoveTardinessParameter.ActualValue != null)
+          tardiness = MoveTardinessParameter.ActualValue.Value;
+
+        IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+        double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+        IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+        if (cvrp != null)
+          quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+        ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+        if (vrptw != null)
+          quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+        if (!useAspiration || moveQuality >= quality) {
           if (attribute.City == move.City && attribute.Tour == move.Tour) {
             isTabu = true;
             break;
           }
-
-          double distance = 0;
-          if (MoveDistanceParameter.ActualValue != null)
-            distance = MoveDistanceParameter.ActualValue.Value;
-
-          double overload = 0;
-          if (MoveOverloadParameter.ActualValue != null)
-            overload = MoveOverloadParameter.ActualValue.Value;
-
-          double tardiness = 0;
-          if (MoveTardinessParameter.ActualValue != null)
-            tardiness = MoveTardinessParameter.ActualValue.Value;
 
           if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs	(revision 6796)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDShift/PotvinPDShiftMoveTabuCriterion.cs	(revision 6797)
@@ -28,4 +28,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
+using HeuristicLab.Problems.VehicleRouting.Variants;
 
 namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
@@ -115,21 +116,32 @@
         PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;
 
-        if (!useAspiration || moveQuality >= attribute.MoveQuality) {
+        double distance = 0;
+        if (MoveDistanceParameter.ActualValue != null)
+          distance = MoveDistanceParameter.ActualValue.Value;
+
+        double overload = 0;
+        if (MoveOverloadParameter.ActualValue != null)
+          overload = MoveOverloadParameter.ActualValue.Value;
+
+        double tardiness = 0;
+        if (MoveTardinessParameter.ActualValue != null)
+          tardiness = MoveTardinessParameter.ActualValue.Value;
+
+        IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
+        double quality = attribute.Distance * instance.DistanceFactor.Value;
+
+        IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
+        if (cvrp != null)
+          quality += attribute.Overload * cvrp.OverloadPenalty.Value;
+
+        ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+        if (vrptw != null)
+          quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
+
+        if (!useAspiration || moveQuality >= quality) {
           if (attribute.City == move.City && attribute.Tour == move.Tour) {
             isTabu = true;
             break;
           }
-
-          double distance = 0;
-          if (MoveDistanceParameter.ActualValue != null)
-            distance = MoveDistanceParameter.ActualValue.Value;
-
-          double overload = 0;
-          if (MoveOverloadParameter.ActualValue != null)
-            overload = MoveOverloadParameter.ActualValue.Value;
-
-          double tardiness = 0;
-          if (MoveTardinessParameter.ActualValue != null)
-            tardiness = MoveTardinessParameter.ActualValue.Value;
 
           if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
