Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 7791)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 7852)
@@ -63,5 +63,5 @@
 
     private void UpdateMoveEvaluation() {
-      IVRPEvaluator evaluator = ProblemInstance.EvaluatorParameter.Value;
+      IVRPEvaluator evaluator = ProblemInstance.SolutionEvaluator;
       ICollection<IParameter> addedParameters = new List<IParameter>();
       
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPProblemInstance.cs	(revision 7791)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/Interfaces/IVRPProblemInstance.cs	(revision 7852)
@@ -31,10 +31,9 @@
 namespace HeuristicLab.Problems.VehicleRouting.Interfaces {
   public interface IVRPProblemInstance: IItem {
-    IValueParameter<IVRPEvaluator> EvaluatorParameter { get; }
+    IVRPEvaluator SolutionEvaluator { get; }
     IVRPEvaluator MoveEvaluator { get; }
-    IValueParameter<IVRPCreator> SolutionCreatorParameter { get; }
-    IValueParameter<DoubleValue> BestKnownQualityParameter { get; }
-    IValueParameter<VRPSolution> BestKnownSolutionParameter { get; }
     IEnumerable<IOperator> Operators { get; }
+
+    event EventHandler EvaluationChanged;
 
     DoubleMatrix Coordinates { get; }
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs	(revision 7791)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs	(revision 7852)
@@ -119,5 +119,5 @@
     #region Event handlers
     void CapacityParameter_ValueChanged(object sender, EventArgs e) {
-      BestKnownSolution = null;
+      EvalBestKnownSolution();
     }
     void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs	(revision 7791)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs	(revision 7852)
@@ -121,8 +121,8 @@
     void CapacityParameter_ValueChanged(object sender, EventArgs e) {
       CapacityParameter.Value.ValueChanged += new EventHandler(Capacity_ValueChanged);
-      BestKnownSolution = null;
+      EvalBestKnownSolution();
     }
     void Capacity_ValueChanged(object sender, EventArgs e) {
-      BestKnownSolution = null;
+      EvalBestKnownSolution();
     }
     void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 7791)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/VRPProblemInstance.cs	(revision 7852)
@@ -38,17 +38,13 @@
   [StorableClass]
   public abstract class VRPProblemInstance : ParameterizedNamedItem, IVRPProblemInstance, IStatefulItem {
-    public IValueParameter<IVRPEvaluator> EvaluatorParameter {
-      get { return (ValueParameter<IVRPEvaluator>)Parameters["Evaluator"]; } 
-    }
-
     IVRPEvaluator moveEvaluator;
 
     public IVRPEvaluator MoveEvaluator {
       get {
-        if (EvaluatorParameter.Value == null)
+        if (evaluator == null)
           return null;
         else {
           if (moveEvaluator == null) {
-            moveEvaluator = EvaluatorParameter.Value.Clone() as IVRPEvaluator;
+            moveEvaluator = evaluator.Clone() as IVRPEvaluator;
 
             foreach (IParameter parameter in moveEvaluator.Parameters) {
@@ -68,8 +64,4 @@
     }
 
-    public IValueParameter<IVRPCreator> SolutionCreatorParameter {
-      get { return (ValueParameter<IVRPCreator>)Parameters["SolutionCreator"]; } 
-    }
-
     protected abstract IEnumerable<IOperator> GetOperators();
     protected abstract IEnumerable<IOperator> GetAnalyzers();
@@ -104,19 +96,4 @@
     }
 
-    protected OptionalValueParameter<DoubleValue> BestKnownQualityParameter {
-      get { return (OptionalValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
-    }
-    protected OptionalValueParameter<VRPSolution> BestKnownSolutionParameter {
-      get { return (OptionalValueParameter<VRPSolution>)Parameters["BestKnownSolution"]; }
-    }
-
-    IValueParameter<DoubleValue> IVRPProblemInstance.BestKnownQualityParameter {
-      get { return BestKnownQualityParameter; }
-    }
-
-    IValueParameter<VRPSolution> IVRPProblemInstance.BestKnownSolutionParameter {
-      get { return BestKnownSolutionParameter; }
-    }
-
     public DoubleMatrix Coordinates {
       get { return CoordinatesParameter.Value; }
@@ -151,13 +128,4 @@
       get { return DistanceFactorParameter.Value; }
       set { DistanceFactorParameter.Value = value; }
-    }
-
-    public DoubleValue BestKnownQuality {
-      get { return BestKnownQualityParameter.Value; }
-      set { BestKnownQualityParameter.Value = value; }
-    }
-    public VRPSolution BestKnownSolution {
-      get { return BestKnownSolutionParameter.Value; }
-      set { BestKnownSolutionParameter.Value = value; }
     }
 
@@ -205,4 +173,10 @@
     private IVRPEvaluator evaluator = null;
 
+    public IVRPEvaluator SolutionEvaluator {
+      get {       
+        return evaluator;
+      }
+    }
+
     public virtual double GetDistance(int start, int end, IVRPEncoding solution) {
       double distance = 0.0;
@@ -259,12 +233,11 @@
     }
 
+
+    public event EventHandler EvaluationChanged;
+
     protected void EvalBestKnownSolution() {
-      if (BestKnownSolution != null) {
-        //call evaluator
-        BestKnownQuality = new DoubleValue(Evaluate(BestKnownSolution.Solution).Quality);
-        BestKnownSolution.Quality = BestKnownQuality;
-      } else {
-        BestKnownQuality = null;
-      }
+      EventHandler tmp = EvaluationChanged;
+      if (tmp != null)
+        tmp(this, null);
     }
 
@@ -286,10 +259,5 @@
       Parameters.Add(new ValueParameter<DoubleValue>("EvalDistanceFactor", "The distance factor considered in the evaluation.", new DoubleValue(1)));
 
-      Parameters.Add(new ValueParameter<IVRPCreator>("SolutionCreator", "The operator which should be used to create new VRP solutions.", Creator));
-      Parameters.Add(new ValueParameter<IVRPEvaluator>("Evaluator", "The operator which should be used to evaluate VRP solutions.", Evaluator));
-
-      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this VRP instance."));
-      Parameters.Add(new OptionalValueParameter<VRPSolution>("BestKnownSolution", "The best known solution of this VRP instance."));
-
+      evaluator = Evaluator;
       AttachEventHandlers();
     }
@@ -297,16 +265,15 @@
     protected VRPProblemInstance(VRPProblemInstance original, Cloner cloner)
       : base(original, cloner) {
-        AttachEventHandlers();
+      evaluator = Evaluator;  
+      AttachEventHandlers();
     }
 
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserializationHook() {
+      evaluator = Evaluator;
       AttachEventHandlers();
     }
 
     private void AttachEventHandlers() {
-      evaluator = EvaluatorParameter.Value;
-      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
-      BestKnownSolutionParameter.ValueChanged += new EventHandler(BestKnownSolutionParameter_ValueChanged);
       DistanceFactorParameter.ValueChanged += new EventHandler(DistanceFactorParameter_ValueChanged);
       DistanceFactorParameter.Value.ValueChanged += new EventHandler(DistanceFactor_ValueChanged);
@@ -329,12 +296,4 @@
 
     #region Event handlers
-    void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
-      moveEvaluator = null;
-      evaluator = EvaluatorParameter.Value;
-    }
-
-    void BestKnownSolutionParameter_ValueChanged(object sender, EventArgs e) {
-      EvalBestKnownSolution();
-    }
     void DistanceFactorParameter_ValueChanged(object sender, EventArgs e) {
       DistanceFactorParameter.Value.ValueChanged += new EventHandler(DistanceFactor_ValueChanged);
Index: branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 7791)
+++ branches/VRP/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 7852)
@@ -92,6 +92,11 @@
     }
 
+    public DoubleValue BestKnownQuality {
+      get { return BestKnownQualityParameter.Value; }
+      set { BestKnownQualityParameter.Value = value; }
+    }
+
     public ISingleObjectiveEvaluator Evaluator {
-      get { return ProblemInstance.EvaluatorParameter.Value; }
+      get { return EvaluatorParameter.Value; }
     }
 
@@ -101,5 +106,5 @@
 
     public ISolutionCreator SolutionCreator {
-      get { return ProblemInstance.SolutionCreatorParameter.Value; }
+      get { return SolutionCreatorParameter.Value; }
     }
 
@@ -121,4 +126,9 @@
       Parameters.Add(new OptionalValueParameter<VRPSolution>("BestKnownSolution", "The best known solution of this VRP instance."));
 
+      Parameters.Add(new ConstrainedValueParameter<IVRPCreator>("SolutionCreator", "The operator which should be used to create new VRP solutions."));
+      Parameters.Add(new ValueParameter<IVRPEvaluator>("Evaluator", "The operator which should be used to evaluate VRP solutions."));
+
+      EvaluatorParameter.Hidden = true;
+
       operators = new List<IOperator>();
 
@@ -175,25 +185,23 @@
 
     private void AttachProblemInstanceEventHandlers() {
-      if (Parameters.ContainsKey("Evaluator"))
-        Parameters.Remove("Evaluator");
-
-      if (Parameters.ContainsKey("SolutionCreator"))
-        Parameters.Remove("SolutionCreator");
-
-      if (Parameters.ContainsKey("BestKnownSolution"))
-        Parameters.Remove("BestKnownSolution");
-
-      if (Parameters.ContainsKey("BestKnownQuality"))
-        Parameters.Remove("BestKnownQuality");
-
+      var solutionCreatorParameter = SolutionCreatorParameter as ConstrainedValueParameter<IVRPCreator>;
+      solutionCreatorParameter.ValidValues.Clear();
 
       if (ProblemInstance != null) {
-        ProblemInstance.SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
-        ProblemInstance.EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
-        Parameters.Add(ProblemInstance.EvaluatorParameter);
-        Parameters.Add(ProblemInstance.SolutionCreatorParameter);
-
-        Parameters.Add(ProblemInstance.BestKnownQualityParameter);
-        Parameters.Add(ProblemInstance.BestKnownSolutionParameter);
+        EvaluatorParameter.Value = ProblemInstance.SolutionEvaluator;
+        foreach (IVRPCreator creator in ProblemInstance.Operators.Where(o => o is IVRPCreator)) {
+          solutionCreatorParameter.ValidValues.Add(creator);
+        }
+        ProblemInstance.EvaluationChanged += new EventHandler(ProblemInstance_EvaluationChanged);
+      }      
+    }
+
+    void ProblemInstance_EvaluationChanged(object sender, EventArgs e) {
+      if (BestKnownSolution != null) {
+        //call evaluator
+        BestKnownQuality = new DoubleValue(ProblemInstance.Evaluate(BestKnownSolution.Solution).Quality);
+        BestKnownSolution.Quality = BestKnownQuality;
+      } else {
+        BestKnownQuality = null;
       }
     }
@@ -260,4 +268,5 @@
       parser.Parse();
 
+      this.Name = parser.ProblemName;
       MDCVRPTWProblemInstance problem = new MDCVRPTWProblemInstance();
 
@@ -291,4 +300,5 @@
       parser.Parse();
 
+      this.Name = parser.ProblemName;
       CVRPPDTWProblemInstance problem = new CVRPPDTWProblemInstance();
 
@@ -444,5 +454,5 @@
       else {
         VRPSolution solution = new VRPSolution(ProblemInstance, encoding, new DoubleValue(0));
-        ProblemInstance.BestKnownSolutionParameter.Value = solution;
+        BestKnownSolutionParameter.Value = solution;
       }
     }
