Index: trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs	(revision 3138)
+++ trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs	(revision 3139)
@@ -191,6 +191,8 @@
       UpdateMutators();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
       base.OnProblemChanged();
     }
+
     protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
       ParameterizeStochasticOperator(Problem.SolutionCreator);
@@ -209,4 +211,5 @@
       ParameterizeStochasticOperator(Problem.Visualizer);
       ParameterizeSGAMainLoop();
+      if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
       base.Problem_VisualizerChanged(sender, e);
     }
@@ -234,4 +237,7 @@
       ParameterizeSGAMainLoop();
       ParameterizeSelectors();
+    }
+    private void Visualizer_VisualizationParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeSGAMainLoop();
     }
     #endregion
@@ -246,6 +252,10 @@
       ElitesParameter.ValueChanged += new EventHandler(ElitesParameter_ValueChanged);
       Elites.ValueChanged += new EventHandler(Elites_ValueChanged);
-      if (Problem != null)
+      if (Problem != null) {
+        UpdateCrossovers();
+        UpdateMutators();
         Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+        if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
+      }
     }
 
@@ -260,5 +270,6 @@
       SGAMainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
       SGAMainLoop.VisualizerParameter.ActualName = Problem.VisualizerParameter.Name;
-      SGAMainLoop.VisualizationParameter.ActualName = Problem.Visualizer.VisualizationParameter.ActualName;
+      if (Problem.Visualizer != null)
+        SGAMainLoop.VisualizationParameter.ActualName = Problem.Visualizer.VisualizationParameter.ActualName;
     }
     private void ParameterizeStochasticOperator(IOperator op) {
Index: trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs	(revision 3138)
+++ trunk/sources/HeuristicLab.Operators/3.3/ResultsCollector.cs	(revision 3139)
@@ -45,9 +45,12 @@
       IVariable var;
       foreach (IParameter param in CollectedValues) {
-        results.TryGetValue(param.Name, out var);
-        if (var != null)
-          var.Value = (IItem)param.ActualValue;
-        else
-          results.Add(new Variable(param.Name, param.Description, param.ActualValue));
+        IItem value = param.ActualValue;
+        if (value != null) {
+          results.TryGetValue(param.Name, out var);
+          if (var != null)
+            var.Value = value;
+          else
+            results.Add(new Variable(param.Name, param.Description, value));
+        }
       }
       return base.Apply();
Index: trunk/sources/HeuristicLab.Problems.TSP.Views/3.3/PathTSPTourView.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TSP.Views/3.3/PathTSPTourView.cs	(revision 3138)
+++ trunk/sources/HeuristicLab.Problems.TSP.Views/3.3/PathTSPTourView.cs	(revision 3139)
@@ -83,28 +83,36 @@
           DoubleMatrix coordinates = Content.Coordinates;
           Permutation permutation = Content.Permutation;
+          Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
 
-          double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
-          for (int i = 0; i < coordinates.Rows; i++) {
-            if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
-            if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
-            if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
-            if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+          if (coordinates != null) {
+            double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
+            for (int i = 0; i < coordinates.Rows; i++) {
+              if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0];
+              if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1];
+              if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0];
+              if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1];
+            }
+
+            int border = 20;
+            double xStep = (pictureBox.Width - 2 * border) / (xMax - xMin);
+            double yStep = (pictureBox.Height - 2 * border) / (yMax - yMin);
+
+            Point[] points = new Point[coordinates.Rows];
+            if (permutation == null) {
+              for (int i = 0; i < coordinates.Rows; i++)
+                points[i] = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)),
+                                      border + ((int)((coordinates[i, 1] - yMin) * yStep)));
+            } else {
+              for (int i = 0; i < coordinates.Rows; i++)
+                points[i] = new Point(border + ((int)((coordinates[permutation[i], 0] - xMin) * xStep)),
+                                      border + ((int)((coordinates[permutation[i], 1] - yMin) * yStep)));
+            }
+
+            Graphics graphics = Graphics.FromImage(bitmap);
+            if (permutation != null) graphics.DrawPolygon(Pens.Black, points);
+            for (int i = 0; i < points.Length; i++)
+              graphics.FillRectangle(Brushes.Red, points[i].X - 2, points[i].Y - 2, 6, 6);
+            graphics.Dispose();
           }
-
-          int border = 20;
-          double xStep = (pictureBox.Width - 2 * border) / (xMax - xMin);
-          double yStep = (pictureBox.Height - 2 * border) / (yMax - yMin);
-
-          Point[] points = new Point[coordinates.Rows];
-          for (int i = 0; i < coordinates.Rows; i++)
-            points[i] = new Point(border + ((int)((coordinates[permutation[i], 0] - xMin) * xStep)),
-                                  border + ((int)((coordinates[permutation[i], 1] - yMin) * yStep)));
-
-          Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
-          Graphics graphics = Graphics.FromImage(bitmap);
-          graphics.DrawPolygon(Pens.Black, points);
-          for (int i = 0; i < points.Length; i++)
-            graphics.FillRectangle(Brushes.Blue, points[i].X - 1, points[i].Y - 1, 4, 4);
-          graphics.Dispose();
           pictureBox.Image = bitmap;
         }
Index: trunk/sources/HeuristicLab.Problems.TSP/3.3/PathTSPTour.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TSP/3.3/PathTSPTour.cs	(revision 3138)
+++ trunk/sources/HeuristicLab.Problems.TSP/3.3/PathTSPTour.cs	(revision 3139)
@@ -39,5 +39,4 @@
       get { return coordinates; }
       set {
-        if (value == null) throw new ArgumentNullException();
         if (coordinates != value) {
           if (coordinates != null) DeregisterCoordinatesEvents();
@@ -53,5 +52,4 @@
       get { return permutation; }
       set {
-        if (value == null) throw new ArgumentNullException();
         if (permutation != value) {
           if (permutation != null) DeregisterPermutationEvents();
@@ -63,8 +61,11 @@
     }
 
-    private PathTSPTour() : base() { }
-    public PathTSPTour(DoubleMatrix coordinates, Permutation permutation)
+    public PathTSPTour() : base() { }
+    public PathTSPTour(DoubleMatrix coordinates)
       : base() {
       Coordinates = coordinates;
+    }
+    public PathTSPTour(DoubleMatrix coordinates, Permutation permutation)
+      : this(coordinates) {
       Permutation = permutation;
     }
Index: trunk/sources/HeuristicLab.Problems.TSP/3.3/TSP.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TSP/3.3/TSP.cs	(revision 3138)
+++ trunk/sources/HeuristicLab.Problems.TSP/3.3/TSP.cs	(revision 3139)
@@ -218,8 +218,12 @@
     }
     private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       ParameterizeEvaluator();
       ParameterizeVisualizer();
       ClearDistanceMatrix();
       OnEvaluatorChanged();
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeVisualizer();
     }
     private void VisualizerParameter_ValueChanged(object sender, EventArgs e) {
@@ -251,6 +255,8 @@
       SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
       EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       VisualizerParameter.ValueChanged += new EventHandler(VisualizerParameter_ValueChanged);
     }
+
     private void InitializeOperators() {
       operators = new List<IPermutationOperator>();
@@ -287,9 +293,11 @@
     }
     private void ParameterizeVisualizer() {
-      Visualizer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-      if (Visualizer is ICoordinatesTSPSolutionsVisualizer)
-        ((ICoordinatesTSPSolutionsVisualizer)Visualizer).CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-      if (Visualizer is IPathCoordinatesTSPSolutionsVisualizer)
-        ((IPathCoordinatesTSPSolutionsVisualizer)Visualizer).PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      if (Visualizer != null) {
+        Visualizer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        if (Visualizer is ICoordinatesTSPSolutionsVisualizer)
+          ((ICoordinatesTSPSolutionsVisualizer)Visualizer).CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        if (Visualizer is IPathCoordinatesTSPSolutionsVisualizer)
+          ((IPathCoordinatesTSPSolutionsVisualizer)Visualizer).PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+      }
     }
     private void ParameterizeOperators() {
