Index: trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 3144)
+++ trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 3145)
@@ -103,4 +103,6 @@
     #endregion
 
+    [StorableConstructor]
+    private LocalSearch(bool deserializing) : base() { }
     public LocalSearch()
       : base() {
@@ -137,7 +139,4 @@
     }
 
-    [StorableConstructor]
-    private LocalSearch(bool deserializing) : base() { }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       LocalSearch clone = (LocalSearch)base.Clone(cloner);
@@ -156,6 +155,6 @@
       ParameterizeSolutionsCreator();
       ParameterizeMainLoop();
-      ParameterizeMoveEvaluator();
-      ParameterizeMoveMaker();
+      ParameterizeMoveEvaluators();
+      ParameterizeMoveMakers();
       UpdateMoveGenerator();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
@@ -171,6 +170,6 @@
       ParameterizeSolutionsCreator();
       ParameterizeMainLoop();
-      ParameterizeMoveEvaluator();
-      ParameterizeMoveMaker();
+      ParameterizeMoveEvaluators();
+      ParameterizeMoveMakers();
       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.Problem_EvaluatorChanged(sender, e);
@@ -179,4 +178,5 @@
       ParameterizeStochasticOperator(Problem.Visualizer);
       ParameterizeMainLoop();
+      if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
       base.Problem_VisualizerChanged(sender, e);
     }
@@ -194,12 +194,12 @@
         UpdateMoveParameters();
       ParameterizeMainLoop();
-      ParameterizeMoveEvaluator();
-      ParameterizeMoveMaker();
+      ParameterizeMoveEvaluators();
+      ParameterizeMoveMakers();
       base.Problem_OperatorsChanged(sender, e);
     }
     private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
       ParameterizeMainLoop();
-      ParameterizeMoveEvaluator();
-      ParameterizeMoveMaker();
+      ParameterizeMoveEvaluators();
+      ParameterizeMoveMakers();
     }
     private void MoveGeneratorParameter_ValueChanged(object sender, EventArgs e) {
@@ -208,11 +208,14 @@
     private void MoveEvaluatorParameter_ValueChanged(object sender, EventArgs e) {
       ParameterizeMainLoop();
-      ParameterizeMoveEvaluator();
-      ParameterizeMoveMaker();
+      ParameterizeMoveEvaluators();
+      ParameterizeMoveMakers();
     }
     private void MoveEvaluator_MoveQualityParameter_ActualNameChanged(object sender, EventArgs e) {
       ParameterizeMainLoop();
-      ParameterizeMoveEvaluator();
-      ParameterizeMoveMaker();
+      ParameterizeMoveEvaluators();
+      ParameterizeMoveMakers();
+    }
+    private void Visualizer_VisualizationParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeMainLoop();
     }
     #endregion
@@ -237,6 +240,8 @@
           MoveGeneratorParameter.ValidValues.Add(generator);
       }
-      if (oldMoveGenerator != null && MoveGeneratorParameter.ValidValues.Any(x => x.GetType() == oldMoveGenerator.GetType()))
-        MoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType());
+      if (oldMoveGenerator != null) {
+        IMoveGenerator newMoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType());
+        if (newMoveGenerator != null) MoveGenerator = newMoveGenerator;
+      }
       if (MoveGenerator == null) {
         ClearMoveParameters();
@@ -279,11 +284,12 @@
     }
     private void ParameterizeMainLoop() {
+      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
       MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
       MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
       if (MoveEvaluator != null)
         MainLoop.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName;
-      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
       MainLoop.VisualizerParameter.ActualName = Problem.VisualizerParameter.Name;
-      MainLoop.VisualizationParameter.ActualName = Problem.Visualizer.VisualizationParameter.ActualName;
+      if (Problem.Visualizer != null)
+        MainLoop.VisualizationParameter.ActualName = Problem.Visualizer.VisualizationParameter.ActualName;
     }
     private void ParameterizeStochasticOperator(IOperator op) {
@@ -291,10 +297,10 @@
         ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
     }
-    private void ParameterizeMoveEvaluator() {
+    private void ParameterizeMoveEvaluators() {
       foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) {
         op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
       }
     }
-    private void ParameterizeMoveMaker() {
+    private void ParameterizeMoveMakers() {
       foreach (IMoveMaker op in Problem.Operators.OfType<IMoveMaker>()) {
         op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
Index: trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchMainLoop.cs	(revision 3144)
+++ trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchMainLoop.cs	(revision 3145)
@@ -35,5 +35,5 @@
   [Item("LocalSearchMainLoop", "An operator which represents the main loop of a best improvement local search (if only a single move is generated in each iteration it is a first improvement local search).")]
   [StorableClass]
-  public class LocalSearchMainLoop : AlgorithmOperator {
+  public sealed class LocalSearchMainLoop : AlgorithmOperator {
     #region Parameter properties
     public ValueLookupParameter<IRandom> RandomParameter {
@@ -82,6 +82,12 @@
     #endregion
 
+    [StorableConstructor]
+    private LocalSearchMainLoop(bool deserializing) : base() { }
     public LocalSearchMainLoop()
       : base() {
+      Initialize();
+    }
+
+    private void Initialize() {
       #region Create parameters
       Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
Index: trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 3144)
+++ trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 3145)
@@ -35,5 +35,5 @@
   [Item("Simulated Annealing", "A simulated annealing algorithm.")]
   [Creatable("Algorithms")]
-  public class SimulatedAnnealing : EngineAlgorithm {
+  public sealed class SimulatedAnnealing : EngineAlgorithm {
     #region Problem Properties
     public override Type ProblemType {
@@ -132,4 +132,6 @@
     #endregion
 
+    [StorableConstructor]
+    private SimulatedAnnealing(bool deserializing) : base() { }
     public SimulatedAnnealing()
       : base() {
@@ -173,7 +175,4 @@
     }
 
-    [StorableConstructor]
-    private SimulatedAnnealing(bool deserializing) : base() { }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       SimulatedAnnealing clone = (SimulatedAnnealing)base.Clone(cloner);
@@ -213,4 +212,10 @@
       base.Problem_EvaluatorChanged(sender, e);
     }
+    protected override void Problem_VisualizerChanged(object sender, EventArgs e) {
+      ParameterizeStochasticOperator(Problem.Visualizer);
+      ParameterizeMainLoop();
+      if (Problem.Visualizer != null) Problem.Visualizer.VisualizationParameter.ActualNameChanged += new EventHandler(Visualizer_VisualizationParameter_ActualNameChanged);
+      base.Problem_VisualizerChanged(sender, e);
+    }
     protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
       foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
@@ -248,4 +253,7 @@
       ParameterizeMoveEvaluators();
       ParameterizeMoveMakers();
+    }
+    private void Visualizer_VisualizationParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeMainLoop();
     }
     #endregion
@@ -325,8 +333,12 @@
     }
     private void ParameterizeMainLoop() {
+      MainLoop.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
       MainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
       MainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
       if (MoveEvaluator != null)
         MainLoop.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName;
+      MainLoop.VisualizerParameter.ActualName = Problem.VisualizerParameter.Name;
+      if (Problem.Visualizer != null)
+        MainLoop.VisualizationParameter.ActualName = Problem.Visualizer.VisualizationParameter.ActualName;
     }
     private void ParameterizeStochasticOperator(IOperator op) {
Index: trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 3144)
+++ trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 3145)
@@ -128,5 +128,5 @@
 
     [StorableConstructor]
-    public TabuSearch(bool deserializing) : base() { }
+    private TabuSearch(bool deserializing) : base() { }
     public TabuSearch()
       : base() {
Index: trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs	(revision 3144)
+++ trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs	(revision 3145)
@@ -86,6 +86,12 @@
     #endregion
 
+    [StorableConstructor]
+    private TabuSearchMainLoop(bool deserializing) : base() { }
     public TabuSearchMainLoop()
       : base() {
+      Initialize();
+    }
+
+    private void Initialize() {
       #region Create parameters
       Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
@@ -97,5 +103,5 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed."));
       Parameters.Add(new ValueLookupParameter<IntValue>("TabuTenure", "The length of the tabu list, and also means the number of iterations a move is kept tabu"));
-      
+
       Parameters.Add(new ValueLookupParameter<IOperator>("MoveGenerator", "The operator that generates the moves."));
       Parameters.Add(new ValueLookupParameter<IOperator>("MoveMaker", "The operator that performs a move and updates the quality."));
@@ -192,5 +198,5 @@
       bestAverageWorstMoveQualityCalculator.QualityParameter.ActualName = MoveQualityParameter.Name;
       bestAverageWorstMoveQualityCalculator.WorstQualityParameter.ActualName = "Worst Move Quality";
-      
+
       valuesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Best Move Quality"));
       valuesCollector.CollectedValues.Add(new LookupParameter<DoubleValue>("Average Move Quality"));
