Index: branches/CloningRefactoring/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.EvolutionStrategy/3.3/EvolutionStrategyMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -94,5 +95,11 @@
 
     [StorableConstructor]
-    private EvolutionStrategyMainLoop(bool deserializing) : base() { }
+    private EvolutionStrategyMainLoop(bool deserializing) : base(deserializing) { }
+    private EvolutionStrategyMainLoop(EvolutionStrategyMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvolutionStrategyMainLoop(this, cloner);
+    }
     public EvolutionStrategyMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.EvolutionStrategy/3.3/WithoutRepeatingBatchedRandomSelector.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.EvolutionStrategy/3.3/WithoutRepeatingBatchedRandomSelector.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.EvolutionStrategy/3.3/WithoutRepeatingBatchedRandomSelector.cs	(revision 4669)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -40,4 +41,13 @@
     public IValueLookupParameter<IntValue> ParentsPerChildParameter {
       get { return (IValueLookupParameter<IntValue>)Parameters["ParentsPerChild"]; }
+    }
+
+    [StorableConstructor]
+    protected WithoutRepeatingBatchedRandomSelector(bool deserializing) : base(deserializing) { }
+    protected WithoutRepeatingBatchedRandomSelector(WithoutRepeatingBatchedRandomSelector original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new WithoutRepeatingBatchedRandomSelector(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithm.cs	(revision 4669)
@@ -192,10 +192,16 @@
     [StorableConstructor]
     private GeneticAlgorithm(bool deserializing) : base(deserializing) { }
-
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
+    private GeneticAlgorithm(GeneticAlgorithm original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      Initialize();
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
-      GeneticAlgorithm clone = (GeneticAlgorithm)base.Clone(cloner);
-      clone.qualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(qualityAnalyzer);
-      clone.Initialize();
-      return clone;
+      return new GeneticAlgorithm(this, cloner);
     }
 
@@ -265,5 +271,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithmMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithmMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/GeneticAlgorithmMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -82,5 +83,11 @@
 
     [StorableConstructor]
-    private GeneticAlgorithmMainLoop(bool deserializing) : base() { }
+    private GeneticAlgorithmMainLoop(bool deserializing) : base(deserializing) { }
+    private GeneticAlgorithmMainLoop(GeneticAlgorithmMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GeneticAlgorithmMainLoop(this, cloner);
+    }
     public GeneticAlgorithmMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 4669)
@@ -197,4 +197,18 @@
     [StorableConstructor]
     private IslandGeneticAlgorithm(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private IslandGeneticAlgorithm(IslandGeneticAlgorithm original, Cloner cloner)
+      : base(original, cloner) {
+      islandQualityAnalyzer = cloner.Clone(original.islandQualityAnalyzer);
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IslandGeneticAlgorithm(this, cloner);
+    }
+
     public IslandGeneticAlgorithm()
       : base() {
@@ -282,12 +296,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      IslandGeneticAlgorithm clone = (IslandGeneticAlgorithm)base.Clone(cloner);
-      clone.islandQualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(islandQualityAnalyzer);
-      clone.qualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(qualityAnalyzer);
-      clone.Initialize();
-      return clone;
-    }
-
     public override void Prepare() {
       if (Problem != null) base.Prepare();
@@ -362,5 +368,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -103,5 +104,11 @@
 
     [StorableConstructor]
-    private IslandGeneticAlgorithmMainLoop(bool deserializing) : base() { }
+    private IslandGeneticAlgorithmMainLoop(bool deserializing) : base(deserializing) { }
+    private IslandGeneticAlgorithmMainLoop(IslandGeneticAlgorithmMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IslandGeneticAlgorithmMainLoop(this, cloner);
+    }
     public IslandGeneticAlgorithmMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearch.cs	(revision 4669)
@@ -125,4 +125,16 @@
     [StorableConstructor]
     private LocalSearch(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private LocalSearch(LocalSearch original, Cloner cloner)
+      : base(original, cloner) {
+      moveQualityAnalyzer = cloner.Clone(original.moveQualityAnalyzer);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LocalSearch(this, cloner);
+    }
     public LocalSearch()
       : base() {
@@ -166,11 +178,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      LocalSearch clone = (LocalSearch)base.Clone(cloner);
-      clone.moveQualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(moveQualityAnalyzer);
-      clone.Initialize();
-      return clone;
-    }
-
     public override void Prepare() {
       if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null)
@@ -256,5 +261,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       if (Problem != null) {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -79,8 +80,14 @@
 
     [StorableConstructor]
-    private LocalSearchMainLoop(bool deserializing) : base() { }
+    private LocalSearchMainLoop(bool deserializing) : base(deserializing) { }
     public LocalSearchMainLoop()
       : base() {
       Initialize();
+    }
+    private LocalSearchMainLoop(LocalSearchMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LocalSearchMainLoop(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 4669)
@@ -253,4 +253,19 @@
     [StorableConstructor]
     private IslandOffspringSelectionGeneticAlgorithm(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private IslandOffspringSelectionGeneticAlgorithm(IslandOffspringSelectionGeneticAlgorithm original, Cloner cloner)
+      : base(original, cloner) {
+      islandQualityAnalyzer = cloner.Clone(original.islandQualityAnalyzer);
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      islandSelectionPressureAnalyzer = cloner.Clone(original.islandSelectionPressureAnalyzer);
+      selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IslandOffspringSelectionGeneticAlgorithm(this, cloner);
+    }
     public IslandOffspringSelectionGeneticAlgorithm()
       : base() {
@@ -357,15 +372,4 @@
       Initialize();
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      IslandOffspringSelectionGeneticAlgorithm clone = (IslandOffspringSelectionGeneticAlgorithm)base.Clone(cloner);
-      clone.islandQualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(islandQualityAnalyzer);
-      clone.qualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(qualityAnalyzer);
-      clone.islandSelectionPressureAnalyzer = (ValueAnalyzer)cloner.Clone(islandSelectionPressureAnalyzer);
-      clone.selectionPressureAnalyzer = (ValueAnalyzer)cloner.Clone(selectionPressureAnalyzer);
-      clone.Initialize();
-      return clone;
-    }
-
     public override void Prepare() {
       if (Problem != null) base.Prepare();
@@ -454,5 +458,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithmMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -126,5 +127,11 @@
 
     [StorableConstructor]
-    private IslandOffspringSelectionGeneticAlgorithmMainLoop(bool deserializing) : base() { }
+    private IslandOffspringSelectionGeneticAlgorithmMainLoop(bool deserializing) : base(deserializing) { }
+    private IslandOffspringSelectionGeneticAlgorithmMainLoop(IslandOffspringSelectionGeneticAlgorithmMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IslandOffspringSelectionGeneticAlgorithmMainLoop(this, cloner);
+    }
     public IslandOffspringSelectionGeneticAlgorithmMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithm.cs	(revision 4669)
@@ -200,4 +200,17 @@
     [StorableConstructor]
     private OffspringSelectionGeneticAlgorithm(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private OffspringSelectionGeneticAlgorithm(OffspringSelectionGeneticAlgorithm original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OffspringSelectionGeneticAlgorithm(this, cloner);
+    }
     public OffspringSelectionGeneticAlgorithm()
       : base() {
@@ -272,11 +285,5 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      OffspringSelectionGeneticAlgorithm clone = (OffspringSelectionGeneticAlgorithm)base.Clone(cloner);
-      clone.qualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(qualityAnalyzer);
-      clone.selectionPressureAnalyzer = (ValueAnalyzer)cloner.Clone(selectionPressureAnalyzer);
-      clone.Initialize();
-      return clone;
-    }
+
 
     public override void Prepare() {
@@ -345,5 +352,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged);
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -92,5 +93,11 @@
 
     [StorableConstructor]
-    private OffspringSelectionGeneticAlgorithmMainLoop(bool deserializing) : base() { }
+    private OffspringSelectionGeneticAlgorithmMainLoop(bool deserializing) : base(deserializing) { }
+    private OffspringSelectionGeneticAlgorithmMainLoop(OffspringSelectionGeneticAlgorithmMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OffspringSelectionGeneticAlgorithmMainLoop(this, cloner);
+    }
     public OffspringSelectionGeneticAlgorithmMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -87,5 +88,11 @@
 
     [StorableConstructor]
-    private OffspringSelectionGeneticAlgorithmMainOperator(bool deserializing) : base() { }
+    private OffspringSelectionGeneticAlgorithmMainOperator(bool deserializing) : base(deserializing) { }
+    private OffspringSelectionGeneticAlgorithmMainOperator(OffspringSelectionGeneticAlgorithmMainOperator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OffspringSelectionGeneticAlgorithmMainOperator(this, cloner);
+    }
     public OffspringSelectionGeneticAlgorithmMainOperator()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASA.cs	(revision 4669)
@@ -229,4 +229,19 @@
     [StorableConstructor]
     private SASEGASA(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private SASEGASA(SASEGASA original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      villageQualityAnalyzer = cloner.Clone(original.villageQualityAnalyzer);
+      selectionPressureAnalyzer = cloner.Clone(original.selectionPressureAnalyzer);
+      villageSelectionPressureAnalyzer = cloner.Clone(original.villageSelectionPressureAnalyzer);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SASEGASA(this, cloner);
+    }
     public SASEGASA()
       : base() {
@@ -316,14 +331,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SASEGASA clone = (SASEGASA)base.Clone(cloner);
-      clone.qualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(qualityAnalyzer);
-      clone.villageQualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(villageQualityAnalyzer);
-      clone.selectionPressureAnalyzer = (ValueAnalyzer)cloner.Clone(selectionPressureAnalyzer);
-      clone.villageSelectionPressureAnalyzer = (ValueAnalyzer)cloner.Clone(villageSelectionPressureAnalyzer);
-      clone.Initialize();
-      return clone;
-    }
-
     public override void Prepare() {
       if (Problem != null) base.Prepare();
@@ -408,5 +413,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       NumberOfVillagesParameter.ValueChanged += new EventHandler(NumberOfVillagesParameter_ValueChanged);
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASAMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASAMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/SASEGASAMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -108,5 +109,11 @@
 
     [StorableConstructor]
-    private SASEGASAMainLoop(bool deserializing) : base() { }
+    private SASEGASAMainLoop(bool deserializing) : base(deserializing) { }
+    private SASEGASAMainLoop(SASEGASAMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SASEGASAMainLoop(this, cloner);
+    }
     public SASEGASAMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealing.cs	(revision 4669)
@@ -143,4 +143,16 @@
     [StorableConstructor]
     private SimulatedAnnealing(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private SimulatedAnnealing(SimulatedAnnealing original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimulatedAnnealing(this, cloner);
+    }
     public SimulatedAnnealing()
       : base() {
@@ -194,11 +206,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SimulatedAnnealing clone = (SimulatedAnnealing)base.Clone(cloner);
-      clone.qualityAnalyzer = (QualityAnalyzer)cloner.Clone(qualityAnalyzer);
-      clone.Initialize();
-      return clone;
-    }
-
     public override void Prepare() {
       if (Problem != null && MoveGenerator != null && MoveMaker != null && MoveEvaluator != null)
@@ -282,5 +287,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       if (Problem != null) {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingMainLoop.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -83,5 +84,11 @@
 
     [StorableConstructor]
-    private SimulatedAnnealingMainLoop(bool deserializing) : base() { }
+    private SimulatedAnnealingMainLoop(bool deserializing) : base(deserializing) { }
+    private SimulatedAnnealingMainLoop(SimulatedAnnealingMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SimulatedAnnealingMainLoop(this, cloner);
+    }
     public SimulatedAnnealingMainLoop()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuListCreator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuListCreator.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuListCreator.cs	(revision 4669)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Operators;
@@ -39,4 +40,13 @@
     }
 
+    [StorableConstructor]
+    protected TabuListCreator(bool deserializing) : base(deserializing) { }
+    protected TabuListCreator(TabuListCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TabuListCreator(this, cloner);
+    }
+
     public TabuListCreator()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuNeighborhoodAnalyzer.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuNeighborhoodAnalyzer.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuNeighborhoodAnalyzer.cs	(revision 4669)
@@ -21,4 +21,5 @@
 
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -26,6 +27,9 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Algorithms.TabuSearch {
+  [StorableClass]
+  [Item("TabuNeighborhoodAnalyzer", "Analyzes the tabu neighborhood")]
   public class TabuNeighborhoodAnalyzer : SingleSuccessorOperator, IAnalyzer {
     public ScopeTreeLookupParameter<BoolValue> IsTabuParameter {
@@ -39,4 +43,12 @@
     }
 
+    [StorableConstructor]
+    protected TabuNeighborhoodAnalyzer(bool deserializing) : base(deserializing) { }
+    protected TabuNeighborhoodAnalyzer(TabuNeighborhoodAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TabuNeighborhoodAnalyzer(this, cloner);
+    }
     public TabuNeighborhoodAnalyzer()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearch.cs	(revision 4669)
@@ -190,11 +190,16 @@
     [StorableConstructor]
     private TabuSearch(bool deserializing) : base(deserializing) { }
-
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+    private TabuSearch(TabuSearch original, Cloner cloner)
+      : base(original, cloner) {
+      moveQualityAnalyzer = cloner.Clone(original.moveQualityAnalyzer);
+      tabuNeighborhoodAnalyzer = cloner.Clone(original.tabuNeighborhoodAnalyzer);
+      Initialize();
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
-      TabuSearch clone = (TabuSearch)base.Clone(cloner);
-      clone.moveQualityAnalyzer = (BestAverageWorstQualityAnalyzer)cloner.Clone(moveQualityAnalyzer);
-      clone.tabuNeighborhoodAnalyzer = (TabuNeighborhoodAnalyzer)cloner.Clone(tabuNeighborhoodAnalyzer);
-      clone.Initialize();
-      return clone;
+      return new TabuSearch(this, cloner);
     }
 
@@ -313,5 +318,4 @@
 
     #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
       if (Problem != null) {
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSearchMainLoop.cs	(revision 4669)
@@ -21,4 +21,5 @@
 
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -85,8 +86,14 @@
 
     [StorableConstructor]
-    private TabuSearchMainLoop(bool deserializing) : base() { }
+    private TabuSearchMainLoop(bool deserializing) : base(deserializing) { }
     public TabuSearchMainLoop()
       : base() {
       Initialize();
+    }
+    private TabuSearchMainLoop(TabuSearchMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TabuSearchMainLoop(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSelector.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSelector.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Algorithms.TabuSearch/3.3/TabuSelector.cs	(revision 4669)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -78,4 +79,13 @@
       get { return CopySelectedParameter.Value; }
       set { CopySelectedParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected TabuSelector(bool deserializing) : base(deserializing) { }
+    protected TabuSelector(TabuSelector original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TabuSelector(this, cloner);
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Data/3.3/BoolValue.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Data/3.3/BoolValue.cs	(revision 4668)
+++ branches/CloningRefactoring/HeuristicLab.Data/3.3/BoolValue.cs	(revision 4669)
@@ -35,10 +35,9 @@
     }
 
-    [StorableConstructor]
-    protected BoolValue(bool deserializing) : base(deserializing) { }
     protected BoolValue(BoolValue original, Cloner cloner)
       : base(original, cloner) {
     }
     public BoolValue() : base() { }
+    [StorableConstructor]
     public BoolValue(bool value) : base(value) { }
 
