Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs	(revision 4376)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs	(revision 4377)
@@ -47,14 +47,32 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour) {
-      base.EvaluateTour(eval, instance, tour);
-
       IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
+      DoubleArray demand = instance.Demand;
 
       double delivered = 0.0;
       double overweight = 0.0;
+      double distance = 0.0;
 
-      for (int i = 0; i < tour.Stops.Count; i++) {
-        delivered += instance.Demand[tour.Stops[i]];
+      //simulate a tour, start and end at depot
+      for (int i = 0; i <= tour.Stops.Count; i++) {
+        int start = 0;
+        if (i > 0)
+          start = tour.Stops[i - 1];
+        int end = 0;
+        if (i < tour.Stops.Count)
+          end = tour.Stops[i];
+
+        //drive there
+        double currentDistace = instance.GetDistance(start, end);
+        distance += currentDistace;
+
+        delivered += demand[end];
       }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+
+      eval.Distance = distance;
+      eval.VehicleUtilization = 1;
 
       double capacity = cvrpInstance.Capacity.Value;
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 4376)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 4377)
@@ -51,7 +51,11 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour) {
-      base.EvaluateTour(eval, instance, tour);
+      IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
+      DoubleArray demand = instance.Demand;
 
       ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      DoubleArray dueTime = vrptw.DueTime;
+      DoubleArray readyTime = vrptw.ReadyTime;
+      DoubleArray serviceTimes = vrptw.ServiceTime;
 
       double time = 0.0;
@@ -59,4 +63,7 @@
       double serviceTime = 0.0;
       double tardiness = 0.0;
+      double delivered = 0.0;
+      double overweight = 0.0;
+      double distance = 0.0;
 
       //simulate a tour, start and end at depot
@@ -72,26 +79,43 @@
         double currentDistace = vrptw.GetDistance(start, end);
         time += currentDistace;
+        distance += currentDistace;
 
         //check if it was serviced on time
-        if (time > vrptw.DueTime[end])
-          tardiness += time - vrptw.DueTime[end];
+        if (time > dueTime[end])
+          tardiness += time - dueTime[end];
 
         //wait
         double currentWaitingTime = 0.0;
-        if (time < vrptw.ReadyTime[end])
-          currentWaitingTime = vrptw.ReadyTime[end] - time;
+        if (time < readyTime[end])
+          currentWaitingTime = readyTime[end] - time;
         waitingTime += currentWaitingTime;
         time += currentWaitingTime;
 
         //service
-        double currentServiceTime = vrptw.ServiceTime[end];
+        double currentServiceTime = serviceTimes[end];
         serviceTime += currentServiceTime;
         time += currentServiceTime;
+        delivered += demand[end];
       }
+
+      eval.Quality += instance.FleetUsageFactor.Value;
+      eval.Quality += instance.DistanceFactor.Value * distance;
+      eval.Distance = distance;
+      eval.VehicleUtilization = 1;
+
+      double capacity = cvrpInstance.Capacity.Value;
+      if (delivered > capacity) {
+        overweight = delivered - capacity;
+      }
+
+      (eval as CVRPEvaluation).Overload = overweight;
+      double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
+      eval.Penalty += penalty;
+      eval.Quality += penalty;
 
       (eval as CVRPTWEvaluation).Tardiness = tardiness;
       (eval as CVRPTWEvaluation).TravelTime = time;
 
-      double penalty = tardiness * vrptw.TardinessPenalty.Value;
+      penalty = tardiness * vrptw.TardinessPenalty.Value;
       eval.Penalty += penalty;
       eval.Quality += penalty;
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 4376)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 4377)
@@ -56,7 +56,4 @@
       get { return (ValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
     }
-    protected OptionalValueParameter<DoubleMatrix> DistanceMatrixParameter {
-      get { return (OptionalValueParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
-    }
     protected ValueParameter<BoolValue> UseDistanceMatrixParameter {
       get { return (ValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
@@ -80,8 +77,8 @@
       set { CoordinatesParameter.Value = value; }
     }
-    public DoubleMatrix DistanceMatrix {
-      get { return DistanceMatrixParameter.Value; }
-      set { DistanceMatrixParameter.Value = value; }
-    }
+    
+    [Storable]
+    public DoubleMatrix DistanceMatrix { get; set; }
+    
     public BoolValue UseDistanceMatrix {
       get { return UseDistanceMatrixParameter.Value; }
@@ -138,17 +135,11 @@
       double distance = 0.0;
 
-      if (UseDistanceMatrix.Value) {
-        if (DistanceMatrixParameter.Value != null) {
-          distance = DistanceMatrixParameter.Value[start, end];
-        } else {
-          if (DistanceMatrixParameter.ActualValue == null) {
-            DistanceMatrixParameter.ActualValue = CreateDistanceMatrix();
-          }
-
-          distance = DistanceMatrix[start, end];
-        }
-      } else {
+      if (DistanceMatrix == null && UseDistanceMatrix.Value) 
+        DistanceMatrix = CreateDistanceMatrix();
+      
+      if(DistanceMatrix != null)
+        distance = DistanceMatrix[start, end];
+      else 
         distance = CalculateDistance(start, end);
-      } 
 
       return distance;
@@ -180,5 +171,4 @@
       : base() {
       Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.", new DoubleMatrix()));
-      Parameters.Add(new OptionalValueParameter<DoubleMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
       Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false.", new BoolValue(true)));
       Parameters.Add(new ValueParameter<IntValue>("Vehicles", "The number of vehicles.", new IntValue(0)));
