Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/HeuristicLab.Problems.Orienteering.Views-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/HeuristicLab.Problems.Orienteering.Views-3.3.csproj	(revision 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/HeuristicLab.Problems.Orienteering.Views-3.3.csproj	(revision 11245)
@@ -102,4 +102,8 @@
       <Name>HeuristicLab.Optimization-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
       <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.Designer.cs	(revision 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.Designer.cs	(revision 11245)
@@ -44,5 +44,5 @@
       this.parametersTabPage = new System.Windows.Forms.TabPage();
       this.visualizationTabPage = new System.Windows.Forms.TabPage();
-      //this.pathTourView = new HeuristicLab.Problems.Orienteering.Views.PathTourView();
+      this.orienteeringSolutionView = new HeuristicLab.Problems.Orienteering.Views.OrienteeringSolutionView();
       ((System.ComponentModel.ISupportInitialize)(this.problemInstanceSplitContainer)).BeginInit();
       this.problemInstanceSplitContainer.Panel1.SuspendLayout();
@@ -101,5 +101,5 @@
       // visualizationTabPage
       // 
-      //this.visualizationTabPage.Controls.Add(this.pathTourView);
+      this.visualizationTabPage.Controls.Add(this.orienteeringSolutionView);
       this.visualizationTabPage.Location = new System.Drawing.Point(4, 22);
       this.visualizationTabPage.Name = "visualizationTabPage";
@@ -110,16 +110,16 @@
       this.visualizationTabPage.UseVisualStyleBackColor = true;
       // 
-      // pathTourView
+      // orienteeringSolutionView
       // 
-      //this.pathTourView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-      //            | System.Windows.Forms.AnchorStyles.Left)
-      //            | System.Windows.Forms.AnchorStyles.Right)));
-      //this.pathTourView.Caption = "PathTour View";
-      //this.pathTourView.Content = null;
-      //this.pathTourView.Location = new System.Drawing.Point(6, 6);
-      //this.pathTourView.Name = "pathTourView";
-      //this.pathTourView.ReadOnly = false;
-      //this.pathTourView.Size = new System.Drawing.Size(491, 268);
-      //this.pathTourView.TabIndex = 0;
+      this.orienteeringSolutionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.orienteeringSolutionView.Caption = "OrienteeringSolution View";
+      this.orienteeringSolutionView.Content = null;
+      this.orienteeringSolutionView.Location = new System.Drawing.Point(6, 6);
+      this.orienteeringSolutionView.Name = "orienteeringSolutionView";
+      this.orienteeringSolutionView.ReadOnly = false;
+      this.orienteeringSolutionView.Size = new System.Drawing.Size(491, 268);
+      this.orienteeringSolutionView.TabIndex = 0;
       // 
       // TravelingSalesmanProblemView
@@ -147,5 +147,5 @@
     private System.Windows.Forms.TabPage parametersTabPage;
     private System.Windows.Forms.TabPage visualizationTabPage;
-    //private PathTourView pathTourView;
+    private OrienteeringSolutionView orienteeringSolutionView;
   }
 }
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 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemView.cs	(revision 11245)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using HeuristicLab.MainForm;
 using HeuristicLab.Optimization.Views;
@@ -36,4 +37,46 @@
       InitializeComponent();
     }
+
+    protected override void DeregisterContentEvents() {
+      Content.CoordinatesParameter.ValueChanged -= new EventHandler(CoordinatesParameter_ValueChanged);
+      Content.ScoresParameter.ValueChanged -= new EventHandler(ScoresParameter_ValueChanged);
+      Content.BestKnownQualityParameter.ValueChanged -= new EventHandler(BestKnownQualityParameter_ValueChanged);
+      Content.BestKnownSolutionParameter.ValueChanged -= new EventHandler(BestKnownSolutionParameter_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
+      Content.ScoresParameter.ValueChanged += new EventHandler(ScoresParameter_ValueChanged);
+      Content.BestKnownQualityParameter.ValueChanged += new EventHandler(BestKnownQualityParameter_ValueChanged);
+      Content.BestKnownSolutionParameter.ValueChanged += new EventHandler(BestKnownSolutionParameter_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        orienteeringSolutionView.Content = null;
+      } else {
+        orienteeringSolutionView.Content = new OrienteeringSolution(Content.BestKnownSolution, Content.Coordinates, Content.Scores, Content.BestKnownQuality);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      orienteeringSolutionView.Enabled = Content != null;
+    }
+
+    private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
+      orienteeringSolutionView.Content.Coordinates = Content.Coordinates;
+    }
+    private void ScoresParameter_ValueChanged(object sender, EventArgs e) {
+      orienteeringSolutionView.Content.Scores = Content.Scores;
+    }
+    private void BestKnownQualityParameter_ValueChanged(object sender, EventArgs e) {
+      orienteeringSolutionView.Content.Quality = Content.BestKnownQuality;
+    }
+    private void BestKnownSolutionParameter_ValueChanged(object sender, EventArgs e) {
+      orienteeringSolutionView.Content.IntegerVector = Content.BestKnownSolution;
+    }
   }
 }
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 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs	(revision 11245)
@@ -84,5 +84,6 @@
           var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
 
-          if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) {
+          if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)
+            && (scores != null) && (coordinates.Rows == scores.Length)) {
             double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
             for (int i = 0; i < coordinates.Rows; i++) {
@@ -116,5 +117,5 @@
               for (int i = 0; i < points.Length; i++) {
                 double score = scores[i];
-                int size = (int)Math.Round(((score - scoreMin) / scoreRange) * 9 + 1);
+                int size = (int)Math.Round(((score - scoreMin) / scoreRange) * 8 + 2);
                 graphics.FillRectangle(Brushes.Red, points[i].X - size / 2, points[i].Y - size / 2, size, size);
               }
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/Improvers/OrienteeringLocalImprovementOperator.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/Improvers/OrienteeringLocalImprovementOperator.cs	(revision 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/Improvers/OrienteeringLocalImprovementOperator.cs	(revision 11245)
@@ -130,5 +130,5 @@
 
       Parameters.Add(new ValueParameter<IntValue>("MaximumBlockLength", "The maximum length of the 2-opt shortening.", new IntValue(30)));
-      Parameters.Add(new ValueParameter<BoolValue>("UseMaximumBlockLength", "Use a limitation of the length for the 2-opt shortening.", new BoolValue(true)));
+      Parameters.Add(new ValueParameter<BoolValue>("UseMaximumBlockLength", "Use a limitation of the length for the 2-opt shortening.", new BoolValue(false)));
     }
 
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 11245)
@@ -21,4 +21,5 @@
 
 using System;
+using System.IO;
 using System.Linq;
 using HeuristicLab.Common;
@@ -43,6 +44,6 @@
 
     #region Parameter Properties
-    public OptionalValueParameter<DoubleMatrix> CoordinatesParameter {
-      get { return (OptionalValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
+    public ValueParameter<DoubleMatrix> CoordinatesParameter {
+      get { return (ValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
     }
     public ValueParameter<DistanceMatrix> DistanceMatrixParameter {
@@ -122,10 +123,10 @@
     public OrienteeringProblem()
       : base(new OrienteeringEvaluator(), new GreedyOrienteeringTourCreator()) {
-      Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the points."));
+      Parameters.Add(new ValueParameter<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>("TerminusPoint", "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 ValueParameter<DoubleArray>("Scores", "The scores of the points.", new DoubleArray()));
+      Parameters.Add(new ValueParameter<DoubleArray>("Scores", "The scores of the points."));
       Parameters.Add(new ValueParameter<DoubleValue>("FixedPenalty", "The penalty for each visited vertex."));
       Parameters.Add(new OptionalValueParameter<IntegerVector>("BestKnownSolution", "The best known solution of this Orienteering instance."));
@@ -323,23 +324,32 @@
 
     public void Load(CVRPData data) {
-      if (data.Coordinates == null && data.Distances == null)
-        throw new System.IO.InvalidDataException("The given instance specifies neither coordinates nor distances!");
-      if (data.Coordinates != null && data.Coordinates.GetLength(1) != 2)
-        throw new System.IO.InvalidDataException("The coordinates of the given instance are not in the right format, there need to be one row for each customer and two columns for the x and y coordinates.");
+
+      if (data.Coordinates == null)
+        throw new InvalidDataException("The given instance specifies no coordinates!");
+      if (data.Coordinates.GetLength(1) != 2)
+        throw new InvalidDataException("The coordinates of the given instance are not in the right format, there need to be one row for each customer and two columns for the x and y coordinates.");
+
+      // Clear old solutions
+      BestKnownQuality = null;
+      BestKnownSolution = null;
 
       Name = data.Name;
       Description = data.Description;
 
-      Coordinates = data.Coordinates != null ? new DoubleMatrix(data.Coordinates) : null;
-      if (Coordinates == null)
+      Coordinates = new DoubleMatrix(data.Coordinates);
+      if (data.Distances != null)
         DistanceMatrix = new DistanceMatrix(data.Distances);
+      else
+        CalculateDistanceMatrix();
+
       StartingPoint = new IntValue(0);// Depot is interpreted as start and endpoint (default)
       TerminusPoint = new IntValue(0);
 
-      MaximumDistance = new DoubleValue(data.Capacity); // capacity is interpreted as max distance
+      MaximumDistance = new DoubleValue(data.Capacity * 2); // capacity is interpreted as max distance
       Scores = new DoubleArray(data.Demands); // demands are interpreted as scores
 
-      BestKnownQuality = null;
-      BestKnownSolution = null;
+
+
+      OnReset();
     }
   }
Index: /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/Shakers/OrienteeringShakingOperator.cs
===================================================================
--- /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/Shakers/OrienteeringShakingOperator.cs	(revision 11244)
+++ /branches/HeuristicLab.Problems.Orienteering/HeuristicLab.Problems.Orienteering/3.3/Shakers/OrienteeringShakingOperator.cs	(revision 11245)
@@ -126,37 +126,39 @@
       var random = RandomParameter.ActualValue;
 
-      // Limit the neighborhood to the tour length
-      int maxNeighborhood = CurrentNeighborhoodIndexParameter.ActualValue.Value + 1;
-      int limit = initialTour.Length - 3;
-      int neighborhood = random.Next((limit > maxNeighborhood) ? maxNeighborhood : limit) + 1;
-
-      // Find all points that are not yet included in the tour and are
-      // within the maximum distance allowed (ellipse)
-      // and sort them with regard to their utility 
-      var visitablePoints = (
-        from point in Enumerable.Range(0, numPoints)
-        // Calculate the distance when going from the starting point to this point and then to the end point
-        let distance = distances[startingPoint, point] + distances[point, terminusPoint] + fixedPenalty
-        // If this distance is feasible and the point is neither starting nor ending point, check the point
-        where distance < maxDistance && point != startingPoint && point != terminusPoint
-        // The point was not yet visited, so add it to the candidate list
-        where !initialTour.Contains(point)
-        // Calculate the utility of the point at this position
-        let utility = scores[point]
-        orderby utility
-        select point
-      ).ToList();
-
-      // Initialize the new tour
-      var actualTour = new List<int> { startingPoint };
-
-      // Perform the insertions according to the utility sorting
-      InsertPoints(actualTour, initialTour, neighborhood, visitablePoints, random);
-
-      // Bring the tour back to be feasible 
-      CleanupTour(actualTour, distances, maxDistance, fixedPenalty);
-
-      // Set new Tour
-      IntegerVectorParameter.ActualValue = new IntegerVector(actualTour.ToArray());
+      if (initialTour.Length > 2) {
+        // Limit the neighborhood to the tour length
+        int maxNeighborhood = CurrentNeighborhoodIndexParameter.ActualValue.Value + 1;
+        int limit = initialTour.Length - 3; // neighborhood limit within [0, length-1)
+        int neighborhood = random.Next((limit > maxNeighborhood) ? maxNeighborhood : limit) + 1;
+
+        // Find all points that are not yet included in the tour and are
+        // within the maximum distance allowed (ellipse)
+        // and sort them with regard to their utility 
+        var visitablePoints = (
+          from point in Enumerable.Range(0, numPoints)
+          // Calculate the distance when going from the starting point to this point and then to the end point
+          let distance = distances[startingPoint, point] + distances[point, terminusPoint] + fixedPenalty
+          // If this distance is feasible and the point is neither starting nor ending point, check the point
+          where distance < maxDistance && point != startingPoint && point != terminusPoint
+          // The point was not yet visited, so add it to the candidate list
+          where !initialTour.Contains(point)
+          // Calculate the utility of the point at this position
+          let utility = scores[point]
+          orderby utility
+          select point
+          ).ToList();
+
+        // Initialize the new tour
+        var actualTour = new List<int> { startingPoint };
+
+        // Perform the insertions according to the utility sorting
+        InsertPoints(actualTour, initialTour, neighborhood, visitablePoints, random);
+
+        // Bring the tour back to be feasible 
+        CleanupTour(actualTour, distances, maxDistance, fixedPenalty);
+
+        // Set new Tour
+        IntegerVectorParameter.ActualValue = new IntegerVector(actualTour.ToArray());
+      }
 
       return base.Apply();
@@ -198,5 +200,5 @@
             }
 
-            int randomIndex = random.Next(visitablePoints.Count - 1);
+            int randomIndex = random.Next(visitablePoints.Count);
             actualTour.Add(visitablePoints[randomIndex]);
             visitablePoints.Clear();
