Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.cs	(revision 11324)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.cs	(revision 11325)
@@ -63,5 +63,5 @@
       } else {
         orienteeringSolutionView.Content = new OrienteeringSolution(
-          Content.BestKnownSolution, Content.Coordinates, Content.StartingPoint, Content.TerminalPoint, Content.Scores, Content.BestKnownQuality, penalty: null);
+          Content.BestKnownSolution, Content.Coordinates, Content.StartingPointParameter.Value, Content.TerminalPointParameter.Value, Content.Scores, Content.BestKnownQuality, penalty: null);
       }
     }
@@ -76,8 +76,8 @@
     }
     private void StartingPointParameter_ValueChanged(object sender, EventArgs e) {
-      orienteeringSolutionView.Content.StartingPoint = Content.StartingPoint;
+      orienteeringSolutionView.Content.StartingPoint.Value = Content.StartingPoint;
     }
     private void TerminalPointParameter_ValueChanged(object sender, EventArgs e) {
-      orienteeringSolutionView.Content.TerminalPoint = Content.TerminalPoint;
+      orienteeringSolutionView.Content.TerminalPoint.Value = Content.TerminalPoint;
     }
     private void ScoresParameter_ValueChanged(object sender, EventArgs e) {
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs	(revision 11324)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs	(revision 11325)
@@ -134,6 +134,8 @@
               Font font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
               var beginSize = graphics.MeasureString("Begin", font);
-              graphics.DrawString("Begin", font, Brushes.Black, points[startingPoint].X - beginSize.Width, points[startingPoint].Y - beginSize.Height);
-              graphics.DrawString("End", font, Brushes.Black, points[terminalPoint].X, points[terminalPoint].Y);
+              if (startingPoint >= 0 && startingPoint < points.Length)
+                graphics.DrawString("Begin", font, Brushes.Black, points[startingPoint].X - beginSize.Width, points[startingPoint].Y - beginSize.Height);
+              if (terminalPoint >= 0 && terminalPoint < points.Length)
+                graphics.DrawString("End", font, Brushes.Black, points[terminalPoint].X, points[terminalPoint].Y);
             }
           } else {
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 11324)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 11325)
@@ -48,22 +48,22 @@
       get { return (OptionalValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
     }
-    public ValueParameter<DistanceMatrix> DistanceMatrixParameter {
-      get { return (ValueParameter<DistanceMatrix>)Parameters["DistanceMatrix"]; }
-    }
-
-    public ValueParameter<IntValue> StartingPointParameter {
-      get { return (ValueParameter<IntValue>)Parameters["StartingPoint"]; }
-    }
-    public ValueParameter<IntValue> TerminalPointParameter {
-      get { return (ValueParameter<IntValue>)Parameters["TerminalPoint"]; }
-    }
-    public ValueParameter<DoubleValue> MaximumDistanceParameter {
-      get { return (ValueParameter<DoubleValue>)Parameters["MaximumDistance"]; }
-    }
-    public ValueParameter<DoubleArray> ScoresParameter {
-      get { return (ValueParameter<DoubleArray>)Parameters["Scores"]; }
-    }
-    public ValueParameter<DoubleValue> PointVisitingCostsParameter {
-      get { return (ValueParameter<DoubleValue>)Parameters["PointVisitingCosts"]; }
+    public IValueParameter<DistanceMatrix> DistanceMatrixParameter {
+      get { return (IValueParameter<DistanceMatrix>)Parameters["DistanceMatrix"]; }
+    }
+
+    public IFixedValueParameter<IntValue> StartingPointParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["StartingPoint"]; }
+    }
+    public IFixedValueParameter<IntValue> TerminalPointParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["TerminalPoint"]; }
+    }
+    public IFixedValueParameter<DoubleValue> MaximumDistanceParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["MaximumDistance"]; }
+    }
+    public IValueParameter<DoubleArray> ScoresParameter {
+      get { return (IValueParameter<DoubleArray>)Parameters["Scores"]; }
+    }
+    public IFixedValueParameter<DoubleValue> PointVisitingCostsParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters["PointVisitingCosts"]; }
     }
 
@@ -82,15 +82,15 @@
       set { DistanceMatrixParameter.Value = value; }
     }
-    public IntValue StartingPoint {
-      get { return StartingPointParameter.Value; }
-      set { StartingPointParameter.Value = value; }
-    }
-    public IntValue TerminalPoint {
-      get { return TerminalPointParameter.Value; }
-      set { TerminalPointParameter.Value = value; }
-    }
-    public DoubleValue MaximumDistance {
-      get { return MaximumDistanceParameter.Value; }
-      set { MaximumDistanceParameter.Value = value; }
+    public int StartingPoint {
+      get { return StartingPointParameter.Value.Value; }
+      set { StartingPointParameter.Value.Value = value; }
+    }
+    public int TerminalPoint {
+      get { return TerminalPointParameter.Value.Value; }
+      set { TerminalPointParameter.Value.Value = value; }
+    }
+    public double MaximumDistance {
+      get { return MaximumDistanceParameter.Value.Value; }
+      set { MaximumDistanceParameter.Value.Value = value; }
     }
     public DoubleArray Scores {
@@ -98,7 +98,7 @@
       set { ScoresParameter.Value = value; }
     }
-    public DoubleValue PointVisitingCosts {
-      get { return PointVisitingCostsParameter.Value; }
-      set { PointVisitingCostsParameter.Value = value; }
+    public double PointVisitingCosts {
+      get { return PointVisitingCostsParameter.Value.Value; }
+      set { PointVisitingCostsParameter.Value.Value = value; }
     }
     public IntegerVector BestKnownSolution {
@@ -126,9 +126,9 @@
       Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the points."));
       Parameters.Add(new ValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the points."));
-      Parameters.Add(new ValueParameter<IntValue>("StartingPoint", "Index of the starting point.", new IntValue(0)));
-      Parameters.Add(new ValueParameter<IntValue>("TerminalPoint", "Index of the ending point.", new IntValue(0)));
-      Parameters.Add(new ValueParameter<DoubleValue>("MaximumDistance", "The maximum distance constraint for a Orienteering solution."));
+      Parameters.Add(new FixedValueParameter<IntValue>("StartingPoint", "Index of the starting point.", new IntValue(0)));
+      Parameters.Add(new FixedValueParameter<IntValue>("TerminalPoint", "Index of the ending point.", new IntValue(0)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("MaximumDistance", "The maximum distance constraint for a Orienteering solution."));
       Parameters.Add(new ValueParameter<DoubleArray>("Scores", "The scores of the points."));
-      Parameters.Add(new ValueParameter<DoubleValue>("PointVisitingCosts", "The costs for visiting a point."));
+      Parameters.Add(new FixedValueParameter<DoubleValue>("PointVisitingCosts", "The costs for visiting a point."));
       Parameters.Add(new OptionalValueParameter<IntegerVector>("BestKnownSolution", "The best known solution of this Orienteering instance."));
 
@@ -173,25 +173,26 @@
       ParameterizeSolutionCreator();
       UpdateDistanceMatrix();
+      CheckStartingIndex();
+      CheckTerminalIndex();
     }
     private void CoordinatesValue_ItemChanged(object sender, EventArgs<int, int> e) {
       UpdateDistanceMatrix();
+      CheckStartingIndex();
+      CheckTerminalIndex();
     }
     private void CoordinatesValue_Reset(object sender, EventArgs e) {
       ParameterizeSolutionCreator();
       UpdateDistanceMatrix();
-    }
-    private void StartingPointParameter_ValueChanged(object sender, EventArgs e) {
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-    }
-
-    private void TerminalPointParameter_ValueChanged(object sender, EventArgs e) {
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-    }
-    private void MaximumDistanceParameter_ValueChanged(object sender, EventArgs e) {
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-    }
+      CheckStartingIndex();
+      CheckTerminalIndex();
+    }
+    private void StartingPointParameterValue_ValueChanged(object sender, EventArgs e) {
+      CheckStartingIndex();
+    }
+
+    private void TerminalPointParameterValue_ValueChanged(object sender, EventArgs e) {
+      CheckTerminalIndex();
+    }
+    private void MaximumDistanceParameterValue_ValueChanged(object sender, EventArgs e) { }
     private void ScoresParameter_ValueChanged(object sender, EventArgs e) {
       ParameterizeEvaluator();
@@ -204,8 +205,5 @@
       ParameterizeSolutionCreator();
     }
-    private void PointVisitingCostsParameter_ValueChanged(object sender, EventArgs e) {
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-    }
+    private void PointVisitingCostsParameterValue_ValueChanged(object sender, EventArgs e) { }
     #endregion
 
@@ -225,11 +223,11 @@
       }
 
-      StartingPointParameter.ValueChanged += StartingPointParameter_ValueChanged;
-      TerminalPointParameter.ValueChanged += TerminalPointParameter_ValueChanged;
-      MaximumDistanceParameter.ValueChanged += MaximumDistanceParameter_ValueChanged;
+      StartingPointParameter.Value.ValueChanged += StartingPointParameterValue_ValueChanged;
+      TerminalPointParameter.Value.ValueChanged += TerminalPointParameterValue_ValueChanged;
+      MaximumDistanceParameter.Value.ValueChanged += MaximumDistanceParameterValue_ValueChanged;
+      PointVisitingCostsParameter.Value.ValueChanged += PointVisitingCostsParameterValue_ValueChanged;
 
       ScoresParameter.ValueChanged += ScoresParameter_ValueChanged;
       ScoresParameter.Value.Reset += ScoresValue_Reset;
-      PointVisitingCostsParameter.ValueChanged += PointVisitingCostsParameter_ValueChanged;
     }
 
@@ -318,4 +316,12 @@
       DistanceMatrix = new DistanceMatrix(distances);
     }
+    private void CheckStartingIndex() {
+      if (StartingPoint < 0) StartingPoint = 0;
+      if (StartingPoint >= DistanceMatrix.Rows) StartingPoint = DistanceMatrix.Rows - 1;
+    }
+    private void CheckTerminalIndex() {
+      if (TerminalPoint < 0) TerminalPoint = 0;
+      if (TerminalPoint >= DistanceMatrix.Rows) TerminalPoint = DistanceMatrix.Rows - 1;
+    }
 
     private void InitializeInitialOrienteeringInstance() {
@@ -330,11 +336,12 @@
       DistanceMatrix = CalculateDistanceMatrix(coordinates);
 
-      StartingPoint.Value = 0;
-      TerminalPoint.Value = 20;
-      MaximumDistance.Value = 30;
+      StartingPoint = 0;
+      TerminalPoint = 20;
+      MaximumDistance = 30;
 
       Scores = new DoubleArray(new double[21] { 0, 20, 20, 30, 15, 15, 10, 20, 20, 20, 15, 10, 10, 25, 40, 40, 30, 30, 50, 30, 0 });
     }
 
+    #region Instance consuming
     public void Load(OPData data) {
       if (data.Coordinates == null && data.Distances == null)
@@ -356,9 +363,9 @@
         DistanceMatrix = new DistanceMatrix(data.GetDistanceMatrix());
 
-      StartingPoint = new IntValue(data.StartingPoint);
-      TerminalPoint = new IntValue(data.TerminalPoint);
-
-      PointVisitingCosts = new DoubleValue(data.PointVisitingCosts);
-      MaximumDistance = new DoubleValue(data.MaximumDistance);
+      StartingPoint = data.StartingPoint;
+      TerminalPoint = data.TerminalPoint;
+
+      PointVisitingCosts = data.PointVisitingCosts;
+      MaximumDistance = data.MaximumDistance;
       Scores = new DoubleArray(data.Scores);
     }
@@ -383,9 +390,9 @@
         DistanceMatrix = new DistanceMatrix(data.GetDistanceMatrix());
 
-      StartingPoint = new IntValue(0); // First city is interpreted as start point
-      TerminalPoint = new IntValue(data.Dimension - 1); // Last city is interpreted als end point
-
-      PointVisitingCosts = new DoubleValue(0);
-      MaximumDistance = new DoubleValue(DistanceMatrix.Average() * 5.0); // distance from start to end first to last city is interpreted as maximum distance
+      StartingPoint = 0; // First city is interpreted as start point
+      TerminalPoint = data.Dimension - 1; // Last city is interpreted als end point
+
+      PointVisitingCosts = 0;
+      MaximumDistance = DistanceMatrix.Average() * 5.0; // distance from start to end first to last city is interpreted as maximum distance
       Scores = new DoubleArray(Enumerable.Repeat(1.0, data.Dimension).ToArray()); // all scores are 1
     }
@@ -409,11 +416,12 @@
         : CalculateDistanceMatrix(data.Coordinates);
 
-      StartingPoint = new IntValue(0); // Depot is interpreted as start point
-      TerminalPoint = new IntValue(0); // Depot is interpreted als end point
-
-      PointVisitingCosts = new DoubleValue(0);
-      MaximumDistance = new DoubleValue(data.Capacity * 2); // capacity is interpreted as max distance
+      StartingPoint = 0; // Depot is interpreted as start point
+      TerminalPoint = 0; // Depot is interpreted als end point
+
+      PointVisitingCosts = 0;
+      MaximumDistance = data.Capacity * 2; // capacity is interpreted as max distance
       Scores = new DoubleArray(data.Demands); // demands are interpreted as scores
     }
+    #endregion
   }
 }
