Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPEvaluator.cs	(revision 14677)
@@ -41,6 +41,4 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
-      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
       double originalQuality = eval.Quality;
 
@@ -55,9 +53,7 @@
 
       double capacity = cvrpInstance.Capacity[vehicle];
-      for (int i = 0; i < tour.Stops.Count; i++) {
-        delivered += instance.GetDemand(tour.Stops[i]);
-      }
 
-      double spareCapacity = capacity - delivered;
+      var tourInfo = new CVRPTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
 
       //simulate a tour, start and end at depot
@@ -67,12 +63,13 @@
           start = tour.Stops[i - 1];
         int end = 0;
-        if (i < tour.Stops.Count)
+        if (i < tour.Stops.Count) {
           end = tour.Stops[i];
+          delivered += instance.GetDemand(end);
+        }
+        //drive there
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
 
-        //drive there
-        double currentDistace = instance.GetDistance(start, end, solution);
-        distance += currentDistace;
-
-        CVRPInsertionInfo stopInfo = new CVRPInsertionInfo(start, end, spareCapacity);
+        var stopInfo = new CVRPStopInsertionInfo(start, end, currentDistance, capacity - delivered);
         tourInfo.AddStopInsertionInfo(stopInfo);
       }
@@ -88,5 +85,5 @@
       }
 
-      (eval as CVRPEvaluation).Overload += overweight;
+      ((CVRPEvaluation)eval).Overload += overweight;
       double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
       eval.Penalty += penalty;
@@ -98,10 +95,10 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      CVRPInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPInsertionInfo;
+      var insertionInfo = (CVRPStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
       feasible = tourInsertionInfo.Penalty < double.Epsilon;
 
-      IHeterogenousCapacitatedProblemInstance cvrp = instance as IHeterogenousCapacitatedProblemInstance;
+      var cvrp = (IHeterogenousCapacitatedProblemInstance)instance;
       double overloadPenalty = cvrp.OverloadPenalty.Value;
 
@@ -131,5 +128,5 @@
       base.SetResultParameters(tourEvaluation);
 
-      OverloadParameter.ActualValue.Value = (tourEvaluation as CVRPEvaluation).Overload;
+      OverloadParameter.ActualValue.Value = ((CVRPEvaluation)tourEvaluation).Overload;
     }
 
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWEvaluator.cs	(revision 14677)
@@ -43,20 +43,18 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
-      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
       double originalQuality = eval.Quality;
 
-      IHeterogenousCapacitatedProblemInstance cvrpInstance = instance as IHeterogenousCapacitatedProblemInstance;
+      var cvrpInstance = (IHeterogenousCapacitatedProblemInstance)instance;
       DoubleArray demand = instance.Demand;
 
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
       DoubleArray serviceTimes = vrptw.ServiceTime;
 
-      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+      var pdp = (IPickupAndDeliveryProblemInstance)instance;
       IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
 
-      IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance;
+      var mdp = (IMultiDepotProblemInstance)instance;
       IntArray vehicleAssignment = mdp.VehicleDepotAssignment;
       int depots = mdp.Depots.Value;
@@ -81,4 +79,7 @@
       double tourStartTime = readyTime[0];
       time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
 
       //simulate a tour, start and end at depot
@@ -92,7 +93,7 @@
 
         //drive there
-        double currentDistace = vrptw.GetDistance(start, end, solution);
-        time += currentDistace;
-        distance += currentDistace;
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
 
         double arrivalTime = time;
@@ -129,5 +130,4 @@
           //Pickup / deliver
           bool validPickupDelivery =
-            validPickupDelivery =
             ((demand[end - 1] >= 0) ||
              (stops.ContainsKey(pickupDeliveryLocation[end - 1])));
@@ -144,5 +144,5 @@
 
         double spareCapacity = capacity - currentLoad;
-        CVRPPDTWInsertionInfo stopInfo = new CVRPPDTWInsertionInfo(start, end, spareCapacity, tourStartTime,
+        var stopInfo = new CVRPPDTWStopInsertionInfo(start, end, currentDistance, spareCapacity,
           arrivalTime, time, spareTime, waitTime, new List<int>(stops.Keys), arrivalSpareCapacity);
         tourInfo.AddStopInsertionInfo(stopInfo);
@@ -156,5 +156,5 @@
       eval.VehicleUtilization += 1;
 
-      (eval as CVRPEvaluation).Overload += overweight;
+      ((CVRPEvaluation)eval).Overload += overweight;
       double tourPenalty = 0;
       double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
@@ -163,5 +163,5 @@
       tourPenalty += penalty;
 
-      (eval as CVRPTWEvaluation).Tardiness += tardiness;
+      ((CVRPTWEvaluation)eval).Tardiness += tardiness;
       (eval as CVRPTWEvaluation).TravelTime += time;
 
@@ -171,5 +171,5 @@
       tourPenalty += penalty;
 
-      (eval as CVRPPDTWEvaluation).PickupViolations += pickupViolations;
+      ((CVRPPDTWEvaluation)eval).PickupViolations += pickupViolations;
       penalty = pickupViolations * pdp.PickupViolationPenalty.Value;
       eval.Penalty += penalty;
@@ -184,5 +184,6 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      CVRPPDTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPPDTWInsertionInfo;
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPPDTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
@@ -230,7 +231,7 @@
 
       if (index > 0)
-        time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime;
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
       else
-        time = insertionInfo.TourStartTime;
+        time = tourInfo.TourStartTime;
 
       time += startDistance;
@@ -246,7 +247,7 @@
       time += endDistance;
 
-      double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime;
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
       for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
-        CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo;
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
 
         if (demand >= 0) {
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWEvaluator.cs	(revision 14677)
@@ -46,17 +46,15 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
-      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
       double originalQuality = eval.Quality;
 
-      IHeterogenousCapacitatedProblemInstance cvrpInstance = instance as IHeterogenousCapacitatedProblemInstance;
+      var cvrpInstance = (IHeterogenousCapacitatedProblemInstance)instance;
       DoubleArray demand = instance.Demand;
-
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
       DoubleArray serviceTimes = vrptw.ServiceTime;
 
-      IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance;
+      var mdp = (IMultiDepotProblemInstance)instance;
       IntArray vehicleAssignment = mdp.VehicleDepotAssignment;
       int depots = mdp.Depots.Value;
@@ -75,12 +73,10 @@
 
       double capacity = cvrpInstance.Capacity[vehicle];
-      for (int i = 0; i < tour.Stops.Count; i++) {
-        delivered += instance.GetDemand(tour.Stops[i]);
-      }
-
-      double spareCapacity = capacity - delivered;
 
       double tourStartTime = vrptw.ReadyTime[depot];
       time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
 
       //simulate a tour, start and end at depot
@@ -90,11 +86,13 @@
           start = tour.Stops[i - 1];
         int end = 0;
-        if (i < tour.Stops.Count)
+        if (i < tour.Stops.Count) {
           end = tour.Stops[i];
+          delivered += instance.GetDemand(end);
+        }
 
         //drive there
-        double currentDistace = vrptw.GetDistance(start, end, solution);
-        time += currentDistace;
-        distance += currentDistace;
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
 
         double arrivalTime = time;
@@ -129,5 +127,5 @@
         time += currentServiceTime;
 
-        CVRPTWInsertionInfo stopInfo = new CVRPTWInsertionInfo(start, end, spareCapacity, tourStartTime, arrivalTime, time, spareTime, waitTime);
+        var stopInfo = new CVRPTWStopInsertionInfo(start, end, currentDistance, capacity - delivered, arrivalTime, time, spareTime, waitTime);
         tourInfo.AddStopInsertionInfo(stopInfo);
       }
@@ -142,5 +140,5 @@
       }
 
-      (eval as CVRPEvaluation).Overload += overweight;
+      ((CVRPEvaluation)eval).Overload += overweight;
       double tourPenalty = 0;
       double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
@@ -149,6 +147,6 @@
       tourPenalty += penalty;
 
-      (eval as CVRPTWEvaluation).Tardiness += tardiness;
-      (eval as CVRPTWEvaluation).TravelTime += time;
+      ((CVRPTWEvaluation)eval).Tardiness += tardiness;
+      ((CVRPTWEvaluation)eval).TravelTime += time;
 
       penalty = tardiness * vrptw.TardinessPenalty.Value;
@@ -163,13 +161,14 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      CVRPTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo;
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
       feasible = tourInsertionInfo.Penalty < double.Epsilon;
 
-      ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
+      var cvrp = (ICapacitatedProblemInstance)instance;
       double overloadPenalty = cvrp.OverloadPenalty.Value;
 
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
@@ -177,5 +176,5 @@
       double tardinessPenalty = vrptw.TardinessPenalty.Value;
 
-      IMultiDepotProblemInstance mdp = instance as IMultiDepotProblemInstance;
+      var mdp = (IMultiDepotProblemInstance)instance;
       int depots = mdp.Depots.Value;
 
@@ -184,9 +183,9 @@
 
       double demand = instance.GetDemand(customer);
-      if (demand > insertionInfo.SpareCapacity) {
+      if (demand > tourInfo.SpareCapacity) {
         feasible = false;
 
-        if (insertionInfo.SpareCapacity >= 0)
-          costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty;
+        if (tourInfo.SpareCapacity >= 0)
+          costs += (demand - tourInfo.SpareCapacity) * overloadPenalty;
         else
           costs += demand * overloadPenalty;
@@ -197,7 +196,7 @@
 
       if (index > 0)
-        time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime;
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
       else
-        time = insertionInfo.TourStartTime;
+        time = tourInfo.TourStartTime;
 
       time += startDistance;
@@ -213,7 +212,7 @@
       time += endDistance;
 
-      double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime;
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
       for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
-        CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo;
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
 
         if (additionalTime < 0) {
@@ -270,6 +269,6 @@
       base.SetResultParameters(tourEvaluation);
 
-      TardinessParameter.ActualValue.Value = (tourEvaluation as CVRPTWEvaluation).Tardiness;
-      TravelTimeParameter.ActualValue.Value = (tourEvaluation as CVRPTWEvaluation).TravelTime;
+      TardinessParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).Tardiness;
+      TravelTimeParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).TravelTime;
     }
 
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPEvaluator.cs	(revision 14677)
@@ -47,8 +47,8 @@
 
         //drive there
-        double currentDistace = instance.GetDistance(start, end, solution);
-        distance += currentDistace;
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
 
-        StopInsertionInfo stopInfo = new StopInsertionInfo(start, end);
+        var stopInfo = new StopInsertionInfo(start, end, currentDistance);
         tourInfo.AddStopInsertionInfo(stopInfo);
       }
@@ -68,5 +68,5 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      StopInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
+      var insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluation.cs	(revision 14677)
@@ -20,7 +20,10 @@
 #endregion
 
+using System.Globalization;
+using System.Linq;
+using System.Text;
 
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
-  public class CVRPInsertionInfo : StopInsertionInfo {
+  public class CVRPStopInsertionInfo : StopInsertionInfo {
     private double spareCapacity;
 
@@ -29,7 +32,32 @@
     }
 
-    public CVRPInsertionInfo(int start, int end, double spareCapacity)
-      : base(start, end) {
+    public CVRPStopInsertionInfo(int start, int end, double distance, double spareCapacity)
+      : base(start, end, distance) {
       this.spareCapacity = spareCapacity;
+    }
+
+    protected override void GetStopInsertionReport(StringBuilder builder) {
+      base.GetStopInsertionReport(builder);
+      builder.Append("Capacity left:\t");
+      builder.AppendLine(SpareCapacity.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+
+  public class CVRPTourInsertionInfo : TourInsertionInfo {
+    private double capacity;
+
+    public virtual double SpareCapacity {
+      get { return stopInsertionInfos.Count == 0 ? capacity : ((CVRPStopInsertionInfo)stopInsertionInfos.Last()).SpareCapacity; }
+    }
+    
+    public CVRPTourInsertionInfo(int vehicle, double capacity)
+      : base(vehicle) {
+      this.capacity = capacity;
+    }
+
+    protected override void GetTourInsertionReport(StringBuilder builder) {
+      base.GetTourInsertionReport(builder);
+      builder.Append("Capacity left:\t");
+      builder.AppendLine(SpareCapacity.ToString(CultureInfo.CurrentCulture));
     }
   }
@@ -37,4 +65,10 @@
   public class CVRPEvaluation : VRPEvaluation {
     public double Overload { get; set; }
+
+    protected override void GetEvaluationReport(StringBuilder builder) {
+      base.GetEvaluationReport(builder);
+      builder.Append("Overload:\t");
+      builder.AppendLine(Overload.ToString(CultureInfo.CurrentCulture));
+    }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPEvaluator.cs	(revision 14677)
@@ -41,9 +41,10 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour))); ;
+      var cvrpInstance = (IHomogenousCapacitatedProblemInstance)instance;
+      double capacity = cvrpInstance.Capacity.Value;
+      var tourInfo = new CVRPTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity);
       eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
       double originalQuality = eval.Quality;
 
-      IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
       DoubleArray demand = instance.Demand;
 
@@ -51,15 +52,4 @@
       double overweight = 0.0;
       double distance = 0.0;
-
-      double capacity = cvrpInstance.Capacity.Value;
-      for (int i = 0; i <= tour.Stops.Count; i++) {
-        int end = 0;
-        if (i < tour.Stops.Count)
-          end = tour.Stops[i];
-
-        delivered += demand[end];
-      }
-
-      double spareCapacity = capacity - delivered;
 
       //simulate a tour, start and end at depot
@@ -72,9 +62,11 @@
           end = tour.Stops[i];
 
+        delivered += demand[end];
+
         //drive there
-        double currentDistace = instance.GetDistance(start, end, solution);
-        distance += currentDistace;
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
 
-        CVRPInsertionInfo stopInfo = new CVRPInsertionInfo(start, end, spareCapacity);
+        var stopInfo = new CVRPStopInsertionInfo(start, end, currentDistance, capacity - delivered);
         tourInfo.AddStopInsertionInfo(stopInfo);
       }
@@ -90,5 +82,5 @@
       }
 
-      (eval as CVRPEvaluation).Overload += overweight;
+      ((CVRPEvaluation)eval).Overload += overweight;
       double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
       eval.Penalty += penalty;
@@ -100,10 +92,11 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      CVRPInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPInsertionInfo;
+      var tourInfo = (CVRPTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
       feasible = tourInsertionInfo.Penalty < double.Epsilon;
 
-      ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
+      var cvrp = (ICapacitatedProblemInstance)instance;
       double overloadPenalty = cvrp.OverloadPenalty.Value;
 
@@ -115,9 +108,9 @@
 
       double demand = instance.Demand[customer];
-      if (demand > insertionInfo.SpareCapacity) {
+      if (demand > tourInfo.SpareCapacity) {
         feasible = false;
 
-        if (insertionInfo.SpareCapacity >= 0)
-          costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty;
+        if (tourInfo.SpareCapacity >= 0)
+          costs += (demand - tourInfo.SpareCapacity) * overloadPenalty;
         else
           costs += demand * overloadPenalty;
@@ -136,5 +129,5 @@
       base.SetResultParameters(tourEvaluation);
 
-      OverloadParameter.ActualValue.Value = (tourEvaluation as CVRPEvaluation).Overload;
+      OverloadParameter.ActualValue.Value = ((CVRPEvaluation)tourEvaluation).Overload;
     }
 
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluation.cs	(revision 14677)
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
-  public class CVRPPDTWInsertionInfo : CVRPTWInsertionInfo {
+  public class CVRPPDTWStopInsertionInfo : CVRPTWStopInsertionInfo {
     private List<int> visited;
 
@@ -36,7 +36,7 @@
     }
 
-    public CVRPPDTWInsertionInfo(int start, int end, double spareCapacity, double tourStartTime,
+    public CVRPPDTWStopInsertionInfo(int start, int end, double distance, double spareCapacity,
       double arrivalTime, double leaveTime, double spareTime, double waitingTime, List<int> visited, double arrivalSpareCapacity)
-      : base(start, end, spareCapacity, tourStartTime, arrivalTime, leaveTime, spareTime, waitingTime) {
+      : base(start, end, distance, spareCapacity, arrivalTime, leaveTime, spareTime, waitingTime) {
       this.visited = visited;
       this.arrivalSpareCapacity = arrivalSpareCapacity;
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWEvaluator.cs	(revision 14677)
@@ -43,20 +43,18 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
-      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+      var cvrpInstance = (IHomogenousCapacitatedProblemInstance)instance;
+      double capacity = cvrpInstance.Capacity.Value;
       double originalQuality = eval.Quality;
 
-      IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
       DoubleArray demand = instance.Demand;
 
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
       DoubleArray serviceTimes = vrptw.ServiceTime;
 
-      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+      var pdp = (IPickupAndDeliveryProblemInstance)instance;
       IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
 
-      double capacity = cvrpInstance.Capacity.Value;
 
       double time = 0.0;
@@ -73,4 +71,7 @@
       double tourStartTime = readyTime[0];
       time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), capacity, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
 
       //simulate a tour, start and end at depot
@@ -84,7 +85,7 @@
 
         //drive there
-        double currentDistace = vrptw.GetDistance(start, end, solution);
-        time += currentDistace;
-        distance += currentDistace;
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
 
         double arrivalTime = time;
@@ -115,5 +116,4 @@
 
         bool validPickupDelivery =
-          validPickupDelivery =
           ((demand[end] >= 0) ||
            (stops.ContainsKey(pickupDeliveryLocation[end])));
@@ -129,5 +129,5 @@
 
         double spareCapacity = capacity - currentLoad;
-        CVRPPDTWInsertionInfo stopInfo = new CVRPPDTWInsertionInfo(start, end, spareCapacity, tourStartTime,
+        var stopInfo = new CVRPPDTWStopInsertionInfo(start, end, currentDistance, spareCapacity,
           arrivalTime, time, spareTime, waitTime, new List<int>(stops.Keys), arrivalSpareCapacity);
         tourInfo.AddStopInsertionInfo(stopInfo);
@@ -141,5 +141,5 @@
       eval.VehicleUtilization += 1;
 
-      (eval as CVRPEvaluation).Overload += overweight;
+      ((CVRPEvaluation)eval).Overload += overweight;
       double tourPenalty = 0;
       double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
@@ -148,6 +148,6 @@
       tourPenalty += penalty;
 
-      (eval as CVRPTWEvaluation).Tardiness += tardiness;
-      (eval as CVRPTWEvaluation).TravelTime += time;
+      ((CVRPTWEvaluation)eval).Tardiness += tardiness;
+      ((CVRPTWEvaluation)eval).TravelTime += time;
 
       penalty = tardiness * vrptw.TardinessPenalty.Value;
@@ -156,5 +156,5 @@
       tourPenalty += penalty;
 
-      (eval as CVRPPDTWEvaluation).PickupViolations += pickupViolations;
+      ((CVRPPDTWEvaluation)eval).PickupViolations += pickupViolations;
       penalty = pickupViolations * pdp.PickupViolationPenalty.Value;
       eval.Penalty += penalty;
@@ -169,5 +169,6 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      CVRPPDTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPPDTWInsertionInfo;
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPPDTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
@@ -175,8 +176,8 @@
       bool tourFeasible = true;
 
-      ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
+      var cvrp = (ICapacitatedProblemInstance)instance;
       double overloadPenalty = cvrp.OverloadPenalty.Value;
 
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
@@ -184,5 +185,5 @@
       double tardinessPenalty = vrptw.TardinessPenalty.Value;
 
-      IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
+      IPickupAndDeliveryProblemInstance pdp = (IPickupAndDeliveryProblemInstance)instance;
       IntArray pickupDeliveryLocation = pdp.PickupDeliveryLocation;
       double pickupPenalty = pdp.PickupViolationPenalty.Value;
@@ -215,7 +216,7 @@
 
       if (index > 0)
-        time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime;
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
       else
-        time = insertionInfo.TourStartTime;
+        time = tourInfo.TourStartTime;
 
       time += instance.GetDistance(insertionInfo.Start, customer, solution);
@@ -228,7 +229,7 @@
       time += instance.GetDistance(customer, insertionInfo.End, solution);
 
-      double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime;
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
       for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
-        CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo;
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
 
         if (demand >= 0) {
@@ -246,4 +247,5 @@
         } else if (validPickup) {
           if (nextStop.SpareCapacity < 0) {
+            // ABE: The costs decrease when there is overload!?
             costs += Math.Max(demand, nextStop.SpareCapacity) * overloadPenalty;
           }
@@ -263,4 +265,5 @@
           //check due date, decrease tardiness
           if (nextStop.SpareTime < 0) {
+            // ABE: Again, the costs decrease when there is tardiness!?
             costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty;
           }
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluation.cs	(revision 14677)
@@ -20,12 +20,10 @@
 #endregion
 
+using System;
+using System.Globalization;
+using System.Text;
 
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
-  public class CVRPTWInsertionInfo : CVRPInsertionInfo {
-    private double tourStartTime;
-
-    public double TourStartTime {
-      get { return tourStartTime; }
-    }
+  public class CVRPTWStopInsertionInfo : CVRPStopInsertionInfo {
 
     private double arrivalTime;
@@ -53,11 +51,41 @@
     }
 
-    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;
+    public CVRPTWStopInsertionInfo(int start, int end, double distance, double spareCapacity, double arrivalTime, double leaveTime, double spareTime, double waitingTime)
+      : base(start, end, distance, spareCapacity) {
       this.arrivalTime = arrivalTime;
       this.leaveTime = leaveTime;
       this.spareTime = spareTime;
       this.waitingTime = waitingTime;
+    }
+
+    protected override void GetStopInsertionReport(StringBuilder builder) {
+      base.GetStopInsertionReport(builder);
+      builder.Append("SpareTime:\t");
+      builder.AppendLine(SpareTime.ToString(CultureInfo.CurrentCulture));
+      builder.Append("ArrivalTime:\t");
+      builder.AppendLine(ArrivalTime.ToString(CultureInfo.CurrentCulture));
+      builder.Append("WaitingTime:\t");
+      builder.AppendLine(Math.Max(0, WaitingTime).ToString(CultureInfo.CurrentCulture));
+      builder.Append("LeaveTime:\t");
+      builder.AppendLine(LeaveTime.ToString(CultureInfo.CurrentCulture));
+    }
+  }
+
+  public class CVRPTWTourInsertionInfo : CVRPTourInsertionInfo {
+    private double tourStartTime;
+
+    public double TourStartTime {
+      get { return tourStartTime; }
+    }
+
+    public CVRPTWTourInsertionInfo(int vehicle, double capacity, double tourStartTime)
+      : base(vehicle, capacity) {
+      this.tourStartTime = tourStartTime;
+    }
+
+    protected override void GetTourInsertionReport(StringBuilder builder) {
+      base.GetTourInsertionReport(builder);
+      builder.Append("Tour start:\t");
+      builder.AppendLine(TourStartTime.ToString(CultureInfo.CurrentCulture));
     }
   }
@@ -66,4 +94,12 @@
     public double Tardiness { get; set; }
     public double TravelTime { get; set; }
+
+    protected override void GetEvaluationReport(StringBuilder builder) {
+      base.GetEvaluationReport(builder);
+      builder.Append("TravelTime:\t");
+      builder.AppendLine(TravelTime.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Tardiness:\t");
+      builder.AppendLine(Tardiness.ToString(CultureInfo.CurrentCulture));
+    }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWEvaluator.cs	(revision 14677)
@@ -46,12 +46,11 @@
 
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
-      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
+      var cvrpInstance = (IHomogenousCapacitatedProblemInstance)instance;
+
       double originalQuality = eval.Quality;
 
-      IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
       DoubleArray demand = instance.Demand;
 
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
@@ -67,16 +66,10 @@
 
       double capacity = cvrpInstance.Capacity.Value;
-      for (int i = 0; i <= tour.Stops.Count; i++) {
-        int end = 0;
-        if (i < tour.Stops.Count)
-          end = tour.Stops[i];
-
-        delivered += demand[end];
-      }
-
-      double spareCapacity = capacity - delivered;
-
+      
       double tourStartTime = readyTime[0];
       time = tourStartTime;
+
+      var tourInfo = new CVRPTWTourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)), cvrpInstance.Capacity.Value, tourStartTime);
+      eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
 
       //simulate a tour, start and end at depot
@@ -90,7 +83,8 @@
 
         //drive there
-        double currentDistace = vrptw.GetDistance(start, end, solution);
-        time += currentDistace;
-        distance += currentDistace;
+        double currentDistance = vrptw.GetDistance(start, end, solution);
+        time += currentDistance;
+        distance += currentDistance;
+        delivered += demand[end];
 
         double arrivalTime = time;
@@ -117,5 +111,5 @@
         time += currentServiceTime;
 
-        CVRPTWInsertionInfo stopInfo = new CVRPTWInsertionInfo(start, end, spareCapacity, tourStartTime, arrivalTime, time, spareTime, waitTime);
+        var stopInfo = new CVRPTWStopInsertionInfo(start, end, currentDistance, capacity - delivered, arrivalTime, time, spareTime, waitTime);
         tourInfo.AddStopInsertionInfo(stopInfo);
       }
@@ -130,5 +124,5 @@
       }
 
-      (eval as CVRPEvaluation).Overload += overweight;
+      ((CVRPEvaluation)eval).Overload += overweight;
       double tourPenalty = 0;
       double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
@@ -151,13 +145,14 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      CVRPTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo;
+      var tourInfo = (CVRPTWTourInsertionInfo)tourInsertionInfo;
+      var insertionInfo = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
       feasible = tourInsertionInfo.Penalty < double.Epsilon;
 
-      ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
+      var cvrp = (ICapacitatedProblemInstance)instance;
       double overloadPenalty = cvrp.OverloadPenalty.Value;
 
-      ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
+      var vrptw = (ITimeWindowedProblemInstance)instance;
       DoubleArray dueTime = vrptw.DueTime;
       DoubleArray readyTime = vrptw.ReadyTime;
@@ -172,8 +167,8 @@
 
       double demand = instance.Demand[customer];
-      if (demand > insertionInfo.SpareCapacity) {
+      if (demand > tourInfo.SpareCapacity) {
         feasible = false;
-        if (insertionInfo.SpareCapacity >= 0)
-          costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty;
+        if (tourInfo.SpareCapacity >= 0)
+          costs += (demand - tourInfo.SpareCapacity) * overloadPenalty;
         else
           costs += demand * overloadPenalty;
@@ -184,7 +179,7 @@
 
       if (index > 0)
-        time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime;
+        time = ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index - 1)).LeaveTime;
       else
-        time = insertionInfo.TourStartTime;
+        time = tourInfo.TourStartTime;
 
       time += instance.GetDistance(insertionInfo.Start, customer, solution);
@@ -197,7 +192,7 @@
       time += instance.GetDistance(customer, insertionInfo.End, solution);
 
-      double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime;
+      double additionalTime = time - ((CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(index)).ArrivalTime;
       for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
-        CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo;
+        var nextStop = (CVRPTWStopInsertionInfo)tourInsertionInfo.GetStopInsertionInfo(i);
 
         if (additionalTime < 0) {
@@ -254,6 +249,6 @@
       base.SetResultParameters(tourEvaluation);
 
-      TardinessParameter.ActualValue.Value = (tourEvaluation as CVRPTWEvaluation).Tardiness;
-      TravelTimeParameter.ActualValue.Value = (tourEvaluation as CVRPTWEvaluation).TravelTime;
+      TardinessParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).Tardiness;
+      TravelTimeParameter.ActualValue.Value = ((CVRPTWEvaluation)tourEvaluation).TravelTime;
     }
 
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPEvaluator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPEvaluator.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/SingleDepotVRPEvaluator.cs	(revision 14677)
@@ -31,5 +31,5 @@
   public class SingleDepotVRPEvaluator : VRPEvaluator {
     protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
-      TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
+      var tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
       eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
 
@@ -47,8 +47,8 @@
 
         //drive there
-        double currentDistace = instance.GetDistance(start, end, solution);
-        distance += currentDistace;
+        double currentDistance = instance.GetDistance(start, end, solution);
+        distance += currentDistance;
 
-        StopInsertionInfo stopInfo = new StopInsertionInfo(start, end);
+        var stopInfo = new StopInsertionInfo(start, end, currentDistance);
         tourInfo.AddStopInsertionInfo(stopInfo);
       }
@@ -68,5 +68,5 @@
     protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
       out bool feasible) {
-      StopInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
+      var insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
 
       double costs = 0;
Index: branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs	(revision 14676)
+++ branches/OptimizationNetworks/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPEvaluation.cs	(revision 14677)
@@ -21,9 +21,11 @@
 
 using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
 
 namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
   public class StopInsertionInfo {
     private int start;
-
     public int Start {
       get { return start; }
@@ -31,13 +33,31 @@
 
     private int end;
-
     public int End {
       get { return end; }
     }
 
-    public StopInsertionInfo(int start, int end)
+    private double distance;
+    public double Distance {
+      get { return distance; }
+    }
+
+    public StopInsertionInfo(int start, int end, double distance)
       : base() {
       this.start = start;
       this.end = end;
+      this.distance = distance;
+    }
+
+    protected virtual void GetStopInsertionReport(StringBuilder builder) {
+      builder.Append("From\t");
+      builder.Append(Start.ToString(CultureInfo.CurrentCulture));
+      builder.Append("\tto\t");
+      builder.AppendLine(End.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Distance:\t");
+      builder.AppendLine(Distance.ToString(CultureInfo.CurrentCulture));
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetStopInsertionReport(builder);
     }
   }
@@ -46,8 +66,9 @@
     public double Penalty { get; set; }
     public double Quality { get; set; }
+    public double Distance { get { return stopInsertionInfos.Count > 0 ? stopInsertionInfos.Sum(x => x.Distance) : 0; } }
 
     public int Vehicle { get; set; }
 
-    private List<StopInsertionInfo> stopInsertionInfos;
+    protected List<StopInsertionInfo> stopInsertionInfos;
 
     public TourInsertionInfo(int vehicle)
@@ -68,4 +89,24 @@
       return stopInsertionInfos.Count;
     }
+
+    protected virtual void GetTourInsertionReport(StringBuilder builder) {
+      builder.AppendLine("=== Tour ===");
+      builder.Append("Vehicle:\t");
+      builder.AppendLine(Vehicle.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Distance:\t");
+      builder.AppendLine(Distance.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Quality:\t");
+      builder.AppendLine(Quality.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Penalty:\t");
+      builder.AppendLine(Penalty.ToString(CultureInfo.CurrentCulture));
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetTourInsertionReport(builder);
+      builder.AppendLine("==== Stops ====");
+      for (var i = 0; i < stopInsertionInfos.Count; i++) {
+        stopInsertionInfos[i].GetReport(builder);
+      }
+    }
   }
 
@@ -85,4 +126,15 @@
       return tourInsertionInfos[tour];
     }
+
+    protected virtual void GetInsertionReport(StringBuilder builder) {
+      builder.AppendLine("== VRP Route Report ==");
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetInsertionReport(builder);
+      for (var i = 0; i < tourInsertionInfos.Count; i++) {
+        tourInsertionInfos[i].GetReport(builder);
+      }
+    }
   }
 
@@ -98,4 +150,21 @@
       InsertionInfo = new InsertionInfo();
     }
+
+    protected virtual void GetEvaluationReport(StringBuilder builder) {
+      builder.AppendLine("= VRP Solution Report =");
+      builder.Append("Quality:\t");
+      builder.AppendLine(Quality.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Penalty:\t");
+      builder.AppendLine(Penalty.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Distance:\t");
+      builder.AppendLine(Distance.ToString(CultureInfo.CurrentCulture));
+      builder.Append("Vehicles used:\t");
+      builder.AppendLine(VehicleUtilization.ToString(CultureInfo.CurrentCulture));
+    }
+
+    public virtual void GetReport(StringBuilder builder) {
+      GetEvaluationReport(builder);
+      InsertionInfo.GetReport(builder);
+    }
   }
 }
