Index: /stable/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.Scheduling/3.3/Evaluators/SchedulingEvaluator.cs	(revision 15219)
@@ -26,4 +26,5 @@
 using HeuristicLab.Encodings.ScheduleEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -32,5 +33,5 @@
   [Item("SchedulingEvaluator", "First applies the decoder operator to obtain a schedule from an encoding and then applies the evaluator to obtain a quality.")]
   [StorableClass]
-  public class SchedulingEvaluator : InstrumentedOperator, ISchedulingEvaluator {
+  public class SchedulingEvaluator : InstrumentedOperator, ISchedulingEvaluator, IStochasticOperator {
 
     public IValueLookupParameter<IScheduleDecoder> ScheduleDecoderParameter {
@@ -49,4 +50,11 @@
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
+    // ABE: This parameter exists purely, because some IScheduleDecoders are stochastic...
+    // ... which could be solved by letting the algorithm parameterize them ...
+    // ... but they have to use the same RNG as the evaluator (due to parallel execution)...
+    // ... in particular relevant for Island-GA and ALPS (Local- vs GlobalRandom).
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
 
     [StorableConstructor]
@@ -58,4 +66,5 @@
       Parameters.Add(new ValueLookupParameter<IScheduleEvaluator>("ScheduleEvaluator", "The actual schedule evaluation operator."));
       Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality value aka fitness value of the solution."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
       QualityParameter.Hidden = true;
     }
@@ -63,4 +72,14 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       return new SchedulingEvaluator(this, cloner);
+    }
+    
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("Random")) {
+        Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      }
+      #endregion
     }
 
Index: /stable/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs	(revision 15219)
@@ -173,4 +173,5 @@
     #region Events
     protected override void OnSolutionCreatorChanged() {
+      base.OnSolutionCreatorChanged();
       SolutionCreator.ScheduleEncodingParameter.ActualNameChanged += SolutionCreator_SchedulingEncodingParameter_ActualNameChanged;
       InitializeOperators();
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs	(revision 15219)
@@ -110,7 +110,9 @@
 
     private void AttachEventHandlers() {
-      CapacityParameter.ValueChanged += new EventHandler(CapacityParameter_ValueChanged);
-      OverloadPenaltyParameter.ValueChanged += new EventHandler(OverloadPenaltyParameter_ValueChanged);
-      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
+      CapacityParameter.ValueChanged += CapacityParameter_ValueChanged;
+      Capacity.Reset += Capacity_Changed;
+      Capacity.ItemChanged += Capacity_Changed;
+      OverloadPenaltyParameter.ValueChanged += OverloadPenaltyParameter_ValueChanged;
+      OverloadPenalty.ValueChanged += OverloadPenalty_ValueChanged;
     }
 
@@ -123,8 +125,13 @@
     #region Event handlers
     void CapacityParameter_ValueChanged(object sender, EventArgs e) {
+      Capacity.Reset += Capacity_Changed;
+      Capacity.ItemChanged += Capacity_Changed;
+      EvalBestKnownSolution();
+    }
+    private void Capacity_Changed(object sender, EventArgs e) {
       EvalBestKnownSolution();
     }
     void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
-      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
+      OverloadPenalty.ValueChanged += OverloadPenalty_ValueChanged;
       EvalBestKnownSolution();
     }
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPPDTW/MDCVRPPDTWProblemInstance.cs	(revision 15219)
@@ -117,5 +117,9 @@
 
     private void AttachEventHandlers() {
-      PickupDeliveryLocationParameter.ValueChanged += new EventHandler(PickupDeliveryLocationParameter_ValueChanged);
+      PickupDeliveryLocationParameter.ValueChanged += PickupDeliveryLocationParameter_ValueChanged;
+      PickupDeliveryLocation.Reset += PickupDeliveryLocation_Changed;
+      PickupDeliveryLocation.ItemChanged += PickupDeliveryLocation_Changed;
+      PickupViolationPenaltyParameter.ValueChanged += PickupViolationPenaltyParameter_ValueChanged;
+      PickupViolationPenalty.ValueChanged += PickupViolationPenalty_Changed;
     }
 
@@ -128,9 +132,16 @@
     #region Event handlers
     void PickupDeliveryLocationParameter_ValueChanged(object sender, EventArgs e) {
-      PickupDeliveryLocationParameter.Value.ItemChanged += new EventHandler<EventArgs<int>>(Value_ItemChanged);
+      PickupDeliveryLocation.Reset += PickupDeliveryLocation_Changed;
+      PickupDeliveryLocation.ItemChanged += PickupDeliveryLocation_Changed;
       EvalBestKnownSolution();
     }
-
-    void Value_ItemChanged(object sender, EventArgs<int> e) {
+    private void PickupDeliveryLocation_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void PickupViolationPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      PickupViolationPenalty.ValueChanged += PickupViolationPenalty_Changed;
+      EvalBestKnownSolution();
+    }
+    private void PickupViolationPenalty_Changed(object sender, EventArgs e) {
       EvalBestKnownSolution();
     }
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPTW/MDCVRPTWProblemInstance.cs	(revision 15219)
@@ -136,8 +136,17 @@
 
     private void AttachEventHandlers() {
-      TardinessPenaltyParameter.ValueChanged += new EventHandler(TardinessPenaltyParameter_ValueChanged);
-      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
-      TimeFactorParameter.ValueChanged += new EventHandler(TimeFactorParameter_ValueChanged);
-      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
+      ReadyTimeParameter.ValueChanged += ReadyTimeParameter_ValueChanged;
+      ReadyTime.Reset += ReadyTime_Changed;
+      ReadyTime.ItemChanged += ReadyTime_Changed;
+      DueTimeParameter.ValueChanged += DueTimeParameter_ValueChanged;
+      DueTime.Reset += DueTime_Changed;
+      DueTime.ItemChanged += DueTime_Changed;
+      ServiceTimeParameter.ValueChanged += ServiceTimeParameter_ValueChanged;
+      ServiceTime.Reset += ServiceTime_Changed;
+      ServiceTime.ItemChanged += ServiceTime_Changed;
+      TardinessPenaltyParameter.ValueChanged += TardinessPenaltyParameter_ValueChanged;
+      TardinessPenalty.ValueChanged += TardinessPenalty_ValueChanged;
+      TimeFactorParameter.ValueChanged += TimeFactorParameter_ValueChanged;
+      TimeFactor.ValueChanged += TimeFactor_ValueChanged;
     }
 
@@ -149,16 +158,40 @@
 
     #region Event handlers
-    void TardinessPenaltyParameter_ValueChanged(object sender, EventArgs e) {
-      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
-      EvalBestKnownSolution();
-    }
-    void TardinessPenalty_ValueChanged(object sender, EventArgs e) {
-      EvalBestKnownSolution();
-    }
-    void TimeFactorParameter_ValueChanged(object sender, EventArgs e) {
-      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
-      EvalBestKnownSolution();
-    }
-    void TimeFactor_ValueChanged(object sender, EventArgs e) {
+    private void ReadyTimeParameter_ValueChanged(object sender, EventArgs e) {
+      ReadyTime.Reset += ReadyTime_Changed;
+      ReadyTime.ItemChanged += ReadyTime_Changed;
+      EvalBestKnownSolution();
+    }
+    private void ReadyTime_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void DueTimeParameter_ValueChanged(object sender, EventArgs e) {
+      DueTime.Reset += DueTime_Changed;
+      DueTime.ItemChanged += DueTime_Changed;
+      EvalBestKnownSolution();
+    }
+    private void DueTime_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void ServiceTimeParameter_ValueChanged(object sender, EventArgs e) {
+      ServiceTime.Reset += ServiceTime_Changed;
+      ServiceTime.ItemChanged += ServiceTime_Changed;
+      EvalBestKnownSolution();
+    }
+    private void ServiceTime_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void TardinessPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      TardinessPenalty.ValueChanged += TardinessPenalty_ValueChanged;
+      EvalBestKnownSolution();
+    }
+    private void TardinessPenalty_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void TimeFactorParameter_ValueChanged(object sender, EventArgs e) {
+      TimeFactor.ValueChanged += TimeFactor_ValueChanged;
+      EvalBestKnownSolution();
+    }
+    private void TimeFactor_ValueChanged(object sender, EventArgs e) {
       EvalBestKnownSolution();
     }
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MultiDepotVRPProblemInstance.cs	(revision 15219)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -174,8 +175,12 @@
     [StorableConstructor]
     protected MultiDepotVRPProblemInstance(bool deserializing) : base(deserializing) { }
-
+    protected MultiDepotVRPProblemInstance(MultiDepotVRPProblemInstance original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
     public MultiDepotVRPProblemInstance() {
       Parameters.Add(new ValueParameter<IntValue>("Depots", "The number of depots", new IntValue(0)));
       Parameters.Add(new ValueParameter<IntArray>("VehicleDepotAssignment", "The assignment of vehicles to depots", new IntArray()));
+      AttachEventHandlers();
     }
 
@@ -184,7 +189,34 @@
     }
 
-    protected MultiDepotVRPProblemInstance(MultiDepotVRPProblemInstance original, Cloner cloner)
-      : base(original, cloner) {
-    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    private void AttachEventHandlers() {
+      DepotsParameter.ValueChanged += DepotsParameter_ValueChanged;
+      Depots.ValueChanged += Depots_ValueChanged;
+      VehicleDepotAssignmentParameter.ValueChanged += VehicleDepotAssignmentParameter_ValueChanged;
+      VehicleDepotAssignment.Reset += VehicleDepotAssignment_Changed;
+      VehicleDepotAssignment.ItemChanged += VehicleDepotAssignment_Changed;
+    }
+
+    #region Event handlers
+    private void DepotsParameter_ValueChanged(object sender, EventArgs e) {
+      Depots.ValueChanged += Depots_ValueChanged;
+      EvalBestKnownSolution();
+    }
+    private void Depots_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void VehicleDepotAssignmentParameter_ValueChanged(object sender, EventArgs e) {
+      VehicleDepotAssignment.Reset += VehicleDepotAssignment_Changed;
+      VehicleDepotAssignment.ItemChanged += VehicleDepotAssignment_Changed;
+      EvalBestKnownSolution();
+    }
+    private void VehicleDepotAssignment_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPPDTW/CVRPPDTWProblemInstance.cs	(revision 15219)
@@ -117,5 +117,7 @@
 
     private void AttachEventHandlers() {
-      PickupDeliveryLocationParameter.ValueChanged += new EventHandler(PickupDeliveryLocationParameter_ValueChanged);
+      PickupDeliveryLocationParameter.ValueChanged += PickupDeliveryLocationParameter_ValueChanged;
+      PickupDeliveryLocation.Reset += PickupDeliveryLocation_Changed;
+      PickupDeliveryLocation.ItemChanged += PickupDeliveryLocation_Changed;
     }
 
@@ -128,9 +130,9 @@
     #region Event handlers
     void PickupDeliveryLocationParameter_ValueChanged(object sender, EventArgs e) {
-      PickupDeliveryLocationParameter.Value.ItemChanged += new EventHandler<EventArgs<int>>(Value_ItemChanged);
+      PickupDeliveryLocation.Reset += PickupDeliveryLocation_Changed;
+      PickupDeliveryLocation.ItemChanged += PickupDeliveryLocation_Changed;
       EvalBestKnownSolution();
     }
-
-    void Value_ItemChanged(object sender, EventArgs<int> e) {
+    private void PickupDeliveryLocation_Changed(object sender, EventArgs e) {
       EvalBestKnownSolution();
     }
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPTW/CVRPTWProblemInstance.cs	(revision 15219)
@@ -136,8 +136,17 @@
 
     private void AttachEventHandlers() {
-      TardinessPenaltyParameter.ValueChanged += new EventHandler(TardinessPenaltyParameter_ValueChanged);
-      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
-      TimeFactorParameter.ValueChanged += new EventHandler(TimeFactorParameter_ValueChanged);
-      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
+      ReadyTimeParameter.ValueChanged += ReadyTimeParameter_ValueChanged;
+      ReadyTime.Reset += ReadyTime_Changed;
+      ReadyTime.ItemChanged += ReadyTime_Changed;
+      DueTimeParameter.ValueChanged += DueTimeParameter_ValueChanged;
+      DueTime.Reset += DueTime_Changed;
+      DueTime.ItemChanged += DueTime_Changed;
+      ServiceTimeParameter.ValueChanged += ServiceTimeParameter_ValueChanged;
+      ServiceTime.Reset += ServiceTime_Changed;
+      ServiceTime.ItemChanged += ServiceTime_Changed;
+      TardinessPenaltyParameter.ValueChanged += TardinessPenaltyParameter_ValueChanged;
+      TardinessPenalty.ValueChanged += TardinessPenalty_ValueChanged;
+      TimeFactorParameter.ValueChanged += TimeFactorParameter_ValueChanged;
+      TimeFactor.ValueChanged += TimeFactor_ValueChanged;
     }
 
@@ -149,16 +158,40 @@
 
     #region Event handlers
-    void TardinessPenaltyParameter_ValueChanged(object sender, EventArgs e) {
-      TardinessPenaltyParameter.Value.ValueChanged += new EventHandler(TardinessPenalty_ValueChanged);
-      EvalBestKnownSolution();
-    }
-    void TardinessPenalty_ValueChanged(object sender, EventArgs e) {
-      EvalBestKnownSolution();
-    }
-    void TimeFactorParameter_ValueChanged(object sender, EventArgs e) {
-      TimeFactorParameter.Value.ValueChanged += new EventHandler(TimeFactor_ValueChanged);
-      EvalBestKnownSolution();
-    }
-    void TimeFactor_ValueChanged(object sender, EventArgs e) {
+    private void ReadyTimeParameter_ValueChanged(object sender, EventArgs e) {
+      ReadyTime.Reset += ReadyTime_Changed;
+      ReadyTime.ItemChanged += ReadyTime_Changed;
+      EvalBestKnownSolution();
+    }
+    private void ReadyTime_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void DueTimeParameter_ValueChanged(object sender, EventArgs e) {
+      DueTime.Reset += DueTime_Changed;
+      DueTime.ItemChanged += DueTime_Changed;
+      EvalBestKnownSolution();
+    }
+    private void DueTime_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void ServiceTimeParameter_ValueChanged(object sender, EventArgs e) {
+      ServiceTime.Reset += ServiceTime_Changed;
+      ServiceTime.ItemChanged += ServiceTime_Changed;
+      EvalBestKnownSolution();
+    }
+    private void ServiceTime_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void TardinessPenaltyParameter_ValueChanged(object sender, EventArgs e) {
+      TardinessPenaltyParameter.Value.ValueChanged += TardinessPenalty_ValueChanged;
+      EvalBestKnownSolution();
+    }
+    private void TardinessPenalty_ValueChanged(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void TimeFactorParameter_ValueChanged(object sender, EventArgs e) {
+      TimeFactorParameter.Value.ValueChanged += TimeFactor_ValueChanged;
+      EvalBestKnownSolution();
+    }
+    private void TimeFactor_ValueChanged(object sender, EventArgs e) {
       EvalBestKnownSolution();
     }
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 15219)
@@ -280,15 +280,23 @@
 
     private void AttachEventHandlers() {
-      DistanceFactorParameter.ValueChanged += new EventHandler(DistanceFactorParameter_ValueChanged);
-      DistanceFactorParameter.Value.ValueChanged += new EventHandler(DistanceFactor_ValueChanged);
-      FleetUsageFactorParameter.ValueChanged += new EventHandler(FleetUsageFactorParameter_ValueChanged);
-      FleetUsageFactorParameter.Value.ValueChanged += new EventHandler(FleetUsageFactor_ValueChanged);
-      DistanceMatrixParameter.ValueChanged += new EventHandler(DistanceMatrixParameter_ValueChanged);
+      CoordinatesParameter.ValueChanged += CoordinatesParameter_ValueChanged;
+      Coordinates.Reset += Coordinates_Changed;
+      Coordinates.ItemChanged += Coordinates_Changed;
+      DemandParameter.ValueChanged += DemandParameter_ValueChanged;
+      Demand.Reset += Demand_Changed;
+      Demand.ItemChanged += Demand_Changed;
+      VehiclesParameter.ValueChanged += VehiclesParameter_ValueChanged;
+      VehiclesParameter.Value.ValueChanged += Vehicles_Changed;
+      DistanceFactorParameter.ValueChanged += DistanceFactorParameter_ValueChanged;
+      DistanceFactorParameter.Value.ValueChanged += DistanceFactor_ValueChanged;
+      FleetUsageFactorParameter.ValueChanged += FleetUsageFactorParameter_ValueChanged;
+      FleetUsageFactorParameter.Value.ValueChanged += FleetUsageFactor_ValueChanged;
+      DistanceMatrixParameter.ValueChanged += DistanceMatrixParameter_ValueChanged;
       if (DistanceMatrix != null) {
-        DistanceMatrix.ItemChanged += new EventHandler<EventArgs<int, int>>(DistanceMatrix_ItemChanged);
-        DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
-      }
-      UseDistanceMatrixParameter.ValueChanged += new EventHandler(UseDistanceMatrixParameter_ValueChanged);
-      UseDistanceMatrix.ValueChanged += new EventHandler(UseDistanceMatrix_ValueChanged);
+        DistanceMatrix.ItemChanged += DistanceMatrix_ItemChanged;
+        DistanceMatrix.Reset += DistanceMatrix_Reset;
+      }
+      UseDistanceMatrixParameter.ValueChanged += UseDistanceMatrixParameter_ValueChanged;
+      UseDistanceMatrix.ValueChanged += UseDistanceMatrix_ValueChanged;
     }
 
@@ -300,6 +308,33 @@
 
     #region Event handlers
+    private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
+      if (distanceMatrix != null) distanceMatrix = null;
+      if (DistanceMatrix != null && DistanceMatrix.Rows != Coordinates.Rows) DistanceMatrix = null;
+      Coordinates.Reset += Coordinates_Changed;
+      Coordinates.ItemChanged += Coordinates_Changed;
+      EvalBestKnownSolution();
+    }
+    private void Coordinates_Changed(object sender, EventArgs e) {
+      if (distanceMatrix != null) distanceMatrix = null;
+      if (DistanceMatrix != null && DistanceMatrix.Rows != Coordinates.Rows) DistanceMatrix = null;
+      EvalBestKnownSolution();
+    }
+    private void DemandParameter_ValueChanged(object sender, EventArgs e) {
+      Demand.Reset += Demand_Changed;
+      Demand.ItemChanged += Demand_Changed;
+      EvalBestKnownSolution();
+    }
+    private void Demand_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
+    private void VehiclesParameter_ValueChanged(object sender, EventArgs e) {
+      Vehicles.ValueChanged += Vehicles_Changed;
+      EvalBestKnownSolution();
+    }
+    private void Vehicles_Changed(object sender, EventArgs e) {
+      EvalBestKnownSolution();
+    }
     void DistanceFactorParameter_ValueChanged(object sender, EventArgs e) {
-      DistanceFactorParameter.Value.ValueChanged += new EventHandler(DistanceFactor_ValueChanged);
+      DistanceFactorParameter.Value.ValueChanged += DistanceFactor_ValueChanged;
       EvalBestKnownSolution();
     }
@@ -308,5 +343,5 @@
     }
     void FleetUsageFactorParameter_ValueChanged(object sender, EventArgs e) {
-      FleetUsageFactorParameter.Value.ValueChanged += new EventHandler(FleetUsageFactor_ValueChanged);
+      FleetUsageFactorParameter.Value.ValueChanged += FleetUsageFactor_ValueChanged;
       EvalBestKnownSolution();
     }
@@ -316,6 +351,6 @@
     void DistanceMatrixParameter_ValueChanged(object sender, EventArgs e) {
       if (DistanceMatrix != null) {
-        DistanceMatrix.ItemChanged += new EventHandler<EventArgs<int, int>>(DistanceMatrix_ItemChanged);
-        DistanceMatrix.Reset += new EventHandler(DistanceMatrix_Reset);
+        DistanceMatrix.ItemChanged += DistanceMatrix_ItemChanged;
+        DistanceMatrix.Reset += DistanceMatrix_Reset;
       }
       distanceMatrix = DistanceMatrix;
@@ -330,5 +365,5 @@
     }
     void UseDistanceMatrixParameter_ValueChanged(object sender, EventArgs e) {
-      UseDistanceMatrix.ValueChanged += new EventHandler(UseDistanceMatrix_ValueChanged);
+      UseDistanceMatrix.ValueChanged += UseDistanceMatrix_ValueChanged;
       if (!UseDistanceMatrix.Value)
         distanceMatrix = null;
Index: /stable/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 15218)
+++ /stable/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 15219)
@@ -194,8 +194,12 @@
 
     private void EvalBestKnownSolution() {
-      if (BestKnownSolution != null) {
+      if (BestKnownSolution == null) return;
+      try {
         //call evaluator
         BestKnownQuality = new DoubleValue(ProblemInstance.Evaluate(BestKnownSolution.Solution).Quality);
         BestKnownSolution.Quality = BestKnownQuality;
+      } catch {
+        BestKnownQuality = null;
+        BestKnownSolution = null;
       }
     }
@@ -207,5 +211,10 @@
     void ProblemInstance_EvaluationChanged(object sender, EventArgs e) {
       BestKnownQuality = null;
-      EvalBestKnownSolution();
+      if (BestKnownSolution != null) {
+        // the tour is not valid if there are more vehicles in it than allowed
+        if (ProblemInstance.Vehicles.Value < BestKnownSolution.Solution.GetTours().Count) {
+          BestKnownSolution = null;
+        } else EvalBestKnownSolution();
+      }
     }
 
