Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Analyzers/MinAverageMaxSymbolicExpressionTreeSizeAnalyzer.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Analyzers/MinAverageMaxSymbolicExpressionTreeSizeAnalyzer.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Analyzers/MinAverageMaxSymbolicExpressionTreeSizeAnalyzer.cs	(revision 4674)
@@ -65,4 +65,10 @@
 
     #endregion
+    [StorableConstructor]
+    private MinAverageMaxSymbolicExpressionTreeSizeAnalyzer(bool deserializing) : base() { }
+    protected MinAverageMaxSymbolicExpressionTreeSizeAnalyzer(MinAverageMaxSymbolicExpressionTreeSizeAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+      AfterDeserialization();
+    }
     public MinAverageMaxSymbolicExpressionTreeSizeAnalyzer()
       : base() {
@@ -95,12 +101,10 @@
       valueAnalyzer.Successor = null;
 
-      Initialize();
+      AfterDeserialization();
     }
 
-    [StorableConstructor]
-    private MinAverageMaxSymbolicExpressionTreeSizeAnalyzer(bool deserializing) : base() { }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    private void AfterDeserialization() {
       SymbolicExpressionTreeParameter.DepthChanged += new EventHandler(SymbolicExpressionTreeParameter_DepthChanged);
       SymbolicExpressionTreeSizeParameter.DepthChanged += new EventHandler(SymbolicExpressionTreeSizeParameter_DepthChanged);
@@ -108,7 +112,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      MinAverageMaxSymbolicExpressionTreeSizeAnalyzer clone = (MinAverageMaxSymbolicExpressionTreeSizeAnalyzer)base.Clone(cloner);
-      clone.Initialize();
-      return clone;
+      return new MinAverageMaxSymbolicExpressionTreeSizeAnalyzer(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Analyzers/SymbolicExpressionTreeSizeCalculator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Analyzers/SymbolicExpressionTreeSizeCalculator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Analyzers/SymbolicExpressionTreeSizeCalculator.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -55,4 +56,7 @@
     #endregion
 
+    [StorableConstructor]
+    private SymbolicExpressionTreeSizeCalculator(bool deserializing) : base(deserializing) { }
+    private SymbolicExpressionTreeSizeCalculator(SymbolicExpressionTreeSizeCalculator original, Cloner cloner) : base(original, cloner) { }
     public SymbolicExpressionTreeSizeCalculator()
       : base() {
@@ -66,4 +70,8 @@
       return base.Apply();
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeSizeCalculator(this, cloner);
+    }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentCreater.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentCreater.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentCreater.cs	(revision 4674)
@@ -20,11 +20,12 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ArchitectureManipulators {
@@ -36,4 +37,8 @@
   [StorableClass]
   public sealed class ArgumentCreater : SymbolicExpressionTreeArchitectureManipulator {
+    [StorableConstructor]
+    private ArgumentCreater(bool deserializing) : base(deserializing) { }
+    private ArgumentCreater(ArgumentCreater original, Cloner cloner) : base(original, cloner) { }
+    public ArgumentCreater() : base() { }
     public override sealed void ModifyArchitecture(
       IRandom random,
@@ -44,4 +49,8 @@
       out bool success) {
       success = CreateNewArgument(random, symbolicExpressionTree, grammar, maxTreeSize.Value, maxTreeHeight.Value, maxFunctionDefiningBranches.Value, maxFunctionArguments.Value);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ArgumentCreater(this, cloner);
     }
 
@@ -91,5 +100,4 @@
       }
     }
-
 
     private static bool CreateNewArgumentForDefun(IRandom random, SymbolicExpressionTree tree, DefunTreeNode defunBranch, ArgumentTreeNode newArgumentNode) {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentDeleter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentDeleter.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentDeleter.cs	(revision 4674)
@@ -21,4 +21,5 @@
 
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -33,4 +34,9 @@
   [StorableClass]
   public sealed class ArgumentDeleter : SymbolicExpressionTreeArchitectureManipulator {
+    [StorableConstructor]
+    private ArgumentDeleter(bool deserializing) : base(deserializing) { }
+    private ArgumentDeleter(ArgumentDeleter original, Cloner cloner) : base(original, cloner) { }
+    public ArgumentDeleter() : base() { }
+
     public override sealed void ModifyArchitecture(
       IRandom random,
@@ -41,4 +47,8 @@
       out bool success) {
       success = DeleteArgument(random, symbolicExpressionTree, grammar, maxTreeSize.Value, maxTreeHeight.Value, maxFunctionDefiningBranches.Value, maxFunctionArguments.Value);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ArgumentDeleter(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentDuplicater.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentDuplicater.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/ArgumentDuplicater.cs	(revision 4674)
@@ -20,11 +20,12 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-using System;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ArchitectureManipulators {
@@ -36,4 +37,9 @@
   [StorableClass]
   public sealed class ArgumentDuplicater : SymbolicExpressionTreeArchitectureManipulator {
+    [StorableConstructor]
+    private ArgumentDuplicater(bool deserializing) : base(deserializing) { }
+    private ArgumentDuplicater(ArgumentDuplicater original, Cloner cloner) : base(original, cloner) { }
+    public ArgumentDuplicater() : base() { }
+
     public override sealed void ModifyArchitecture(
       IRandom random,
@@ -44,4 +50,8 @@
       out bool success) {
       success = DuplicateArgument(random, symbolicExpressionTree, grammar, maxTreeSize.Value, maxTreeHeight.Value, maxFunctionDefiningBranches.Value, maxFunctionArguments.Value);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ArgumentDuplicater(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/MultiSymbolicExpressionTreeArchitectureManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/MultiSymbolicExpressionTreeArchitectureManipulator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/MultiSymbolicExpressionTreeArchitectureManipulator.cs	(revision 4674)
@@ -23,4 +23,5 @@
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -35,5 +36,5 @@
   [Item("MultiSymbolicExpressionTreeArchitectureManipulator", "Randomly selects and applies one of its architecture manipulators every time it is called.")]
   [StorableClass]
-  public class MultiSymbolicExpressionTreeArchitectureManipulator : StochasticMultiBranch<ISymbolicExpressionTreeArchitectureManipulator>, ISymbolicExpressionTreeArchitectureManipulator, IStochasticOperator {
+  public sealed class MultiSymbolicExpressionTreeArchitectureManipulator : StochasticMultiBranch<ISymbolicExpressionTreeArchitectureManipulator>, ISymbolicExpressionTreeArchitectureManipulator, IStochasticOperator {
     private const string MaxTreeSizeParameterName = "MaxTreeSize";
     private const string MaxTreeHeightParameterName = "MaxTreeHeight";
@@ -46,5 +47,5 @@
       get { return false; }
     }
-    protected override bool CreateChildOperation {
+    private override bool CreateChildOperation {
       get { return true; }
     }
@@ -57,5 +58,4 @@
     }
     #endregion
-
 
     #region ISymbolicExpressionTreeManipulator Members
@@ -80,4 +80,5 @@
     [StorableConstructor]
     private MultiSymbolicExpressionTreeArchitectureManipulator(bool deserializing) : base(deserializing) { }
+    private MultiSymbolicExpressionTreeArchitectureManipulator(MultiSymbolicExpressionTreeArchitectureManipulator original, Cloner cloner) : base(original, cloner) { }
     public MultiSymbolicExpressionTreeArchitectureManipulator()
       : base() {
@@ -95,10 +96,14 @@
     }
 
-    protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeArchitectureManipulator>> e) {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiSymbolicExpressionTreeArchitectureManipulator(this, cloner);
+    }
+
+    private override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeArchitectureManipulator>> e) {
       base.Operators_ItemsReplaced(sender, e);
       ParameterizeManipulators();
     }
 
-    protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeArchitectureManipulator>> e) {
+    private override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeArchitectureManipulator>> e) {
       base.Operators_ItemsAdded(sender, e);
       ParameterizeManipulators();
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineCreater.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineCreater.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineCreater.cs	(revision 4674)
@@ -24,4 +24,5 @@
 using System.Linq;
 using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -39,4 +40,13 @@
   public sealed class SubroutineCreater : SymbolicExpressionTreeArchitectureManipulator {
     private const double ARGUMENT_CUTOFF_PROBABILITY = 0.05;
+
+    [StorableConstructor]
+    private SubroutineCreater(bool deserializing) : base(deserializing) { }
+    private SubroutineCreater(SubroutineCreater original, Cloner cloner) : base(original, cloner) { }
+    public SubroutineCreater() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SubroutineCreater(this, cloner);
+    }
 
     public override sealed void ModifyArchitecture(
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineDeleter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineDeleter.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineDeleter.cs	(revision 4674)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -36,4 +37,13 @@
   [StorableClass]
   public sealed class SubroutineDeleter : SymbolicExpressionTreeArchitectureManipulator {
+    [StorableConstructor]
+    private SubroutineDeleter(bool deserializing) : base(deserializing) { }
+    private SubroutineDeleter(SubroutineDeleter original, Cloner cloner) : base(original, cloner) { }
+    public SubroutineDeleter() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SubroutineDeleter(this, cloner);
+    }
+
     public override sealed void ModifyArchitecture(
       IRandom random,
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineDuplicater.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineDuplicater.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SubroutineDuplicater.cs	(revision 4674)
@@ -24,4 +24,5 @@
 using System.Linq;
 using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -37,4 +38,15 @@
   [StorableClass]
   public sealed class SubroutineDuplicater : SymbolicExpressionTreeArchitectureManipulator {
+    [StorableConstructor]
+    private SubroutineDuplicater(bool deserializing) : base(deserializing) { }
+    private SubroutineDuplicater(SubroutineDuplicater original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public SubroutineDuplicater() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SubroutineDuplicater(this, cloner);
+    }
+
     public override sealed void ModifyArchitecture(
       IRandom random,
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SymbolicExpressionTreeArchitectureManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SymbolicExpressionTreeArchitectureManipulator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureManipulators/SymbolicExpressionTreeArchitectureManipulator.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -51,4 +52,7 @@
       get { return MaxFunctionArgumentsParameter.ActualValue; }
     }
+    [StorableConstructor]
+    protected SymbolicExpressionTreeArchitectureManipulator(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeArchitectureManipulator(SymbolicExpressionTreeArchitectureManipulator original, Cloner cloner) : base(original, cloner) { }
     public SymbolicExpressionTreeArchitectureManipulator()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/ProbabilisticTreeCreator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/ProbabilisticTreeCreator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/ProbabilisticTreeCreator.cs	(revision 4674)
@@ -24,4 +24,5 @@
 using System.Linq;
 using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -33,12 +34,16 @@
   [StorableClass]
   [Item("ProbabilisticTreeCreator", "An operator that creates new symbolic expression trees with uniformly distributed size")]
-  public class ProbabilisticTreeCreator : SymbolicExpressionTreeCreator {
+  public sealed class ProbabilisticTreeCreator : SymbolicExpressionTreeCreator {
     private const int MAX_TRIES = 100;
-
-    public ProbabilisticTreeCreator()
-      : base() {
-    }
-
-    protected override SymbolicExpressionTree Create(
+    [StorableConstructor]
+    private ProbabilisticTreeCreator(bool deserializing) : base(deserializing) { }
+    private ProbabilisticTreeCreator(ProbabilisticTreeCreator original, Cloner cloner) : base(original, cloner) { }
+    public ProbabilisticTreeCreator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ProbabilisticTreeCreator(this, cloner);
+    }
+
+    private override SymbolicExpressionTree Create(
       IRandom random,
       ISymbolicExpressionGrammar grammar,
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/SymbolicExpressionTreeCreator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/SymbolicExpressionTreeCreator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Creators/SymbolicExpressionTreeCreator.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -61,4 +62,7 @@
 
     #endregion
+    [StorableConstructor]
+    protected SymbolicExpressionTreeCreator(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeCreator(SymbolicExpressionTreeCreator original, Cloner cloner) : base(original, cloner) { }
     protected SymbolicExpressionTreeCreator()
       : base() {
@@ -71,5 +75,5 @@
       SymbolicExpressionTree = Create(Random, SymbolicExpressionGrammar,
         MaxTreeSize, MaxTreeHeight, MaxFunctionDefinitions, MaxFunctionArguments);
-      return null;
+      return base.Apply();
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Crossovers/SubtreeCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Crossovers/SubtreeCrossover.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Crossovers/SubtreeCrossover.cs	(revision 4674)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -37,12 +38,18 @@
   [Item("SubtreeCrossover", "An operator which performs subtree swapping crossover.")]
   [StorableClass]
-  public class SubtreeCrossover : SymbolicExpressionTreeCrossover {
+  public sealed class SubtreeCrossover : SymbolicExpressionTreeCrossover {
     public IValueLookupParameter<PercentValue> InternalCrossoverPointProbabilityParameter {
       get { return (IValueLookupParameter<PercentValue>)Parameters["InternalCrossoverPointProbability"]; }
     }
-
+    [StorableConstructor]
+    private SubtreeCrossover(bool deserializing) : base(deserializing) { }
+    private SubtreeCrossover(SubtreeCrossover original, Cloner cloner) : base(original, cloner) { }
     public SubtreeCrossover()
       : base() {
       Parameters.Add(new ValueLookupParameter<PercentValue>("InternalCrossoverPointProbability", "The probability to select an internal crossover point (instead of a leaf node).", new PercentValue(0.9)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SubtreeCrossover(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Crossovers/SymbolicExpressionTreeCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 4674)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -50,4 +51,7 @@
       get { return FailedCrossoverEventsParameter.Value; }
     }
+    [StorableConstructor]
+    protected SymbolicExpressionTreeCrossover(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeCrossover(SymbolicExpressionTreeCrossover original, Cloner cloner) : base(original, cloner) { }
     protected SymbolicExpressionTreeCrossover()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/DefaultSymbolicExpressionGrammar.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/DefaultSymbolicExpressionGrammar.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/DefaultSymbolicExpressionGrammar.cs	(revision 4674)
@@ -88,4 +88,33 @@
     private Symbol startSymbol;
 
+    [StorableConstructor]
+    protected DefaultSymbolicExpressionGrammar(bool deserializing)
+      : base(deserializing) {
+      cachedMinExpressionLength = new Dictionary<string, int>();
+      cachedMaxExpressionLength = new Dictionary<string, int>();
+      cachedMinExpressionDepth = new Dictionary<string, int>();
+    }
+    // cloning ctor
+    protected DefaultSymbolicExpressionGrammar(DefaultSymbolicExpressionGrammar original, Cloner cloner)
+      : base(original, cloner) {
+      this.cachedMinExpressionLength = new Dictionary<string, int>();
+      this.cachedMaxExpressionLength = new Dictionary<string, int>();
+      this.cachedMinExpressionDepth = new Dictionary<string, int>();
+      minSubTreeCount = new Dictionary<string, int>(original.minSubTreeCount);
+      maxSubTreeCount = new Dictionary<string, int>(original.maxSubTreeCount);
+
+      allSymbols = new Dictionary<string, Symbol>();
+      foreach (Symbol symbol in original.allSymbols.Values.Select(s => cloner.Clone(s)))
+        allSymbols.Add(symbol.Name, symbol);
+
+      startSymbol = cloner.Clone<Symbol>(original.startSymbol);
+      allowedChildSymbols = new Dictionary<string, List<List<string>>>();
+      foreach (var entry in original.allowedChildSymbols) {
+        allowedChildSymbols[entry.Key] = new List<List<string>>(entry.Value.Count);
+        foreach (var set in entry.Value) {
+          allowedChildSymbols[entry.Key].Add(new List<string>(set));
+        }
+      }
+    }
     protected DefaultSymbolicExpressionGrammar()
       : base() {
@@ -136,10 +165,6 @@
     }
 
-    [StorableConstructor]
-    protected DefaultSymbolicExpressionGrammar(bool deserializing)
-      : base(deserializing) {
-      cachedMinExpressionLength = new Dictionary<string, int>();
-      cachedMaxExpressionLength = new Dictionary<string, int>();
-      cachedMinExpressionDepth = new Dictionary<string, int>();
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DefaultSymbolicExpressionGrammar(this, cloner);
     }
 
@@ -289,37 +314,15 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      DefaultSymbolicExpressionGrammar clone = (DefaultSymbolicExpressionGrammar)base.Clone(cloner);
-
-      clone.minSubTreeCount = new Dictionary<string, int>(this.minSubTreeCount);
-      clone.maxSubTreeCount = new Dictionary<string, int>(this.maxSubTreeCount);
-
-      clone.allSymbols = new Dictionary<string, Symbol>();
-      foreach (Symbol symbol in this.allSymbols.Values.Select(s => cloner.Clone(s)))
-        clone.allSymbols.Add(symbol.Name, symbol);
-
-      clone.startSymbol = (Symbol)cloner.Clone(this.startSymbol);
-      clone.allowedChildSymbols = new Dictionary<string, List<List<string>>>();
-      foreach (var entry in this.allowedChildSymbols) {
-        clone.allowedChildSymbols[entry.Key] = new List<List<string>>(entry.Value.Count);
+    protected void InitializeShallowClone(DefaultSymbolicExpressionGrammar original) {
+      minSubTreeCount = new Dictionary<string, int>(original.minSubTreeCount);
+      maxSubTreeCount = new Dictionary<string, int>(original.maxSubTreeCount);
+
+      allSymbols = new Dictionary<string, Symbol>(original.allSymbols);
+      startSymbol = original.startSymbol;
+      allowedChildSymbols = new Dictionary<string, List<List<string>>>(original.allowedChildSymbols.Count);
+      foreach (var entry in original.allowedChildSymbols) {
+        allowedChildSymbols[entry.Key] = new List<List<string>>(entry.Value.Count);
         foreach (var set in entry.Value) {
-          clone.allowedChildSymbols[entry.Key].Add(new List<string>(set));
-        }
-      }
-
-      return clone;
-    }
-
-    protected void InitializeShallowClone(DefaultSymbolicExpressionGrammar clone) {
-      clone.minSubTreeCount = new Dictionary<string, int>(this.minSubTreeCount);
-      clone.maxSubTreeCount = new Dictionary<string, int>(this.maxSubTreeCount);
-
-      clone.allSymbols = new Dictionary<string, Symbol>(this.allSymbols);
-      clone.startSymbol = this.startSymbol;
-      clone.allowedChildSymbols = new Dictionary<string, List<List<string>>>(this.allowedChildSymbols.Count);
-      foreach (var entry in this.allowedChildSymbols) {
-        clone.allowedChildSymbols[entry.Key] = new List<List<string>>(entry.Value.Count);
-        foreach (var set in entry.Value) {
-          clone.allowedChildSymbols[entry.Key].Add(new List<string>(set));
+          allowedChildSymbols[entry.Key].Add(new List<string>(set));
         }
       }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/GlobalSymbolicExpressionGrammar.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/GlobalSymbolicExpressionGrammar.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/GlobalSymbolicExpressionGrammar.cs	(revision 4674)
@@ -69,4 +69,15 @@
     private Defun defunSymbol;
 
+    [StorableConstructor]
+    private GlobalSymbolicExpressionGrammar(bool deserializing) : base(deserializing) { }
+    private GlobalSymbolicExpressionGrammar(GlobalSymbolicExpressionGrammar original, Cloner cloner)
+      : base(original, cloner) {
+      defunSymbol = (Defun)cloner.Clone(original.defunSymbol);
+      maxFunctionArguments = original.maxFunctionArguments;
+      minFunctionArguments = original.minFunctionArguments;
+      maxFunctionDefinitions = original.maxFunctionDefinitions;
+      minFunctionDefinitions = original.minFunctionDefinitions;
+    }
+
     public GlobalSymbolicExpressionGrammar(ISymbolicExpressionGrammar mainBranchGrammar)
       : base(mainBranchGrammar) {
@@ -100,11 +111,4 @@
           SetAllowedChild(defunSymbol, Symbols.Where(s => s.Name == symb.Name).First(), 0);
       }
-    }
-
-    //ctor for cloning
-    private GlobalSymbolicExpressionGrammar() : base() { }
-    [StorableConstructor]
-    private GlobalSymbolicExpressionGrammar(bool deserializing)
-      : base(deserializing) {
     }
 
@@ -171,11 +175,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      GlobalSymbolicExpressionGrammar clone = (GlobalSymbolicExpressionGrammar)base.Clone(cloner);
-      clone.defunSymbol = (Defun)cloner.Clone(this.defunSymbol);
-      clone.maxFunctionArguments = this.maxFunctionArguments;
-      clone.minFunctionArguments = this.minFunctionArguments;
-      clone.maxFunctionDefinitions = this.maxFunctionDefinitions;
-      clone.minFunctionDefinitions = this.minFunctionDefinitions;
-      return clone;
+      return new GlobalSymbolicExpressionGrammar(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/ChangeNodeTypeManipulation.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/ChangeNodeTypeManipulation.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/ChangeNodeTypeManipulation.cs	(revision 4674)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -31,8 +32,13 @@
   [StorableClass]
   [Item("ChangeNodeTypeManipulation", "Selects a random tree node and changes the symbol.")]
-  public class ChangeNodeTypeManipulation : SymbolicExpressionTreeManipulator {
+  public sealed class ChangeNodeTypeManipulation : SymbolicExpressionTreeManipulator {
 
-    public ChangeNodeTypeManipulation()
-      : base() {
+    [StorableConstructor]
+    private ChangeNodeTypeManipulation(bool deserializing) : base(deserializing) { }
+    private ChangeNodeTypeManipulation(ChangeNodeTypeManipulation original, Cloner cloner) : base(original, cloner) { }
+    public ChangeNodeTypeManipulation() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ChangeNodeTypeManipulation(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/FullTreeShaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/FullTreeShaker.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/FullTreeShaker.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -27,11 +28,16 @@
   [StorableClass]
   [Item("FullTreeShaker", "Manipulates all nodes that have local parameters.")]
-  public class FullTreeShaker : SymbolicExpressionTreeManipulator {
+  public sealed class FullTreeShaker : SymbolicExpressionTreeManipulator {
 
-    public FullTreeShaker()
-      : base() {
+    [StorableConstructor]
+    private FullTreeShaker(bool deserializing) : base(deserializing) { }
+    private FullTreeShaker(FullTreeShaker original, Cloner cloner) : base(original, cloner) { }
+    public FullTreeShaker() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FullTreeShaker(this, cloner);
     }
 
-    protected override void Manipulate(IRandom random, SymbolicExpressionTree symbolicExpressionTree, ISymbolicExpressionGrammar grammar, IntValue maxTreeSize, IntValue maxTreeHeight, out bool success) {
+    private override void Manipulate(IRandom random, SymbolicExpressionTree symbolicExpressionTree, ISymbolicExpressionGrammar grammar, IntValue maxTreeSize, IntValue maxTreeHeight, out bool success) {
       foreach (var node in symbolicExpressionTree.IterateNodesPrefix()) {
         if (node.HasLocalParameters) {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/MultiSymbolicExpressionTreeManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/MultiSymbolicExpressionTreeManipulator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/MultiSymbolicExpressionTreeManipulator.cs	(revision 4674)
@@ -23,4 +23,5 @@
 using System.Linq;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -35,5 +36,5 @@
   [Item("MultiSymbolicExpressionTreeManipulator", "Randomly selects and applies one of its manipulators every time it is called.")]
   [StorableClass]
-  public class MultiSymbolicExpressionTreeManipulator : StochasticMultiBranch<ISymbolicExpressionTreeManipulator>, ISymbolicExpressionTreeManipulator, IStochasticOperator {
+  public sealed class MultiSymbolicExpressionTreeManipulator : StochasticMultiBranch<ISymbolicExpressionTreeManipulator>, ISymbolicExpressionTreeManipulator, IStochasticOperator {
     private const string MaxTreeSizeParameterName = "MaxTreeSize";
     private const string MaxTreeHeightParameterName = "MaxTreeHeight";
@@ -66,7 +67,7 @@
     #endregion
 
-
     [StorableConstructor]
     private MultiSymbolicExpressionTreeManipulator(bool deserializing) : base(deserializing) { }
+    private MultiSymbolicExpressionTreeManipulator(MultiSymbolicExpressionTreeManipulator original, Cloner cloner) : base(original, cloner) { }
     public MultiSymbolicExpressionTreeManipulator()
       : base() {
@@ -80,4 +81,8 @@
           Operators.Add((ISymbolicExpressionTreeManipulator)Activator.CreateInstance(type), true);
       }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiSymbolicExpressionTreeManipulator(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/OnePointShaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/OnePointShaker.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/OnePointShaker.cs	(revision 4674)
@@ -21,4 +21,5 @@
 
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -28,8 +29,12 @@
   [StorableClass]
   [Item("OnePointShaker", "Selects a random node with local parameters and manipulates the selected node.")]
-  public class OnePointShaker : SymbolicExpressionTreeManipulator {
+  public sealed class OnePointShaker : SymbolicExpressionTreeManipulator {
+    [StorableConstructor]
+    private OnePointShaker(bool deserializing) : base(deserializing) { }
+    private OnePointShaker(OnePointShaker original, Cloner cloner) : base(original, cloner) { }
+    public OnePointShaker() : base() { }
 
-    public OnePointShaker()
-      : base() {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OnePointShaker(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/ReplaceBranchManipulation.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/ReplaceBranchManipulation.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/ReplaceBranchManipulation.cs	(revision 4674)
@@ -23,20 +23,25 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Creators;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Creators;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Manipulators {
   [StorableClass]
   [Item("ReplaceBranchManipulation", "Selects a branch of the tree randomly and replaces it with a newly initialized branch (using PTC2).")]
-  public class ReplaceBranchManipulation : SymbolicExpressionTreeManipulator {
+  public sealed class ReplaceBranchManipulation : SymbolicExpressionTreeManipulator {
+    [StorableConstructor]
+    private ReplaceBranchManipulation(bool deserializing) : base(deserializing) { }
+    private ReplaceBranchManipulation(ReplaceBranchManipulation original, Cloner cloner) : base(original, cloner) { }
+    public ReplaceBranchManipulation() : base() { }
 
-    public ReplaceBranchManipulation()
-      : base() {
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ReplaceBranchManipulation(this, cloner);
     }
 
-    protected override void Manipulate(IRandom random, SymbolicExpressionTree symbolicExpressionTree, ISymbolicExpressionGrammar grammar, IntValue maxTreeSize, IntValue maxTreeHeight, out bool success) {
+    private override void Manipulate(IRandom random, SymbolicExpressionTree symbolicExpressionTree, ISymbolicExpressionGrammar grammar, IntValue maxTreeSize, IntValue maxTreeHeight, out bool success) {
       ReplaceRandomBranch(random, symbolicExpressionTree, grammar, maxTreeSize.Value, maxTreeHeight.Value, out success);
     }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/SymbolicExpressionTreeManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/SymbolicExpressionTreeManipulator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Manipulators/SymbolicExpressionTreeManipulator.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -54,4 +55,7 @@
     #endregion
 
+    [StorableConstructor]
+    protected SymbolicExpressionTreeManipulator(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeManipulator(SymbolicExpressionTreeManipulator original, Cloner cloner) : base(original, cloner) { }
     public SymbolicExpressionTreeManipulator()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs	(revision 4674)
@@ -63,8 +63,11 @@
     }
 
-    public SymbolicExpressionTree()
-      : base() {
+    [StorableConstructor]
+    protected SymbolicExpressionTree(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTree(SymbolicExpressionTree original, Cloner cloner)
+      : base(original, cloner) {
+      root = cloner.Clone(original.Root);
     }
-
+    public SymbolicExpressionTree() : base() { }
     public SymbolicExpressionTree(SymbolicExpressionTreeNode root)
       : base() {
@@ -84,9 +87,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicExpressionTree clone = new SymbolicExpressionTree();
-      cloner.RegisterClonedObject(this, clone);
-      if (root != null)
-        clone.root = (SymbolicExpressionTreeNode)this.root.Clone();
-      return clone;
+      return new SymbolicExpressionTree(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeGrammar.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeGrammar.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeGrammar.cs	(revision 4674)
@@ -30,12 +30,15 @@
     [StorableConstructor]
     private SymbolicExpressionTreeGrammar(bool deserializing) : base(deserializing) { }
-    //default ctor for cloning
-    private SymbolicExpressionTreeGrammar() : base(false) { }
+    // don't call storable ctor of base class to prevent full cloning
+    // instead use storable ctor to initialize an empty grammar and fill with InizializeShallowClone
+    private SymbolicExpressionTreeGrammar(SymbolicExpressionTreeGrammar original, Cloner cloner)
+      : base(false) {
+      cloner.RegisterClonedObject(original, this);
+      InitializeShallowClone(original);
+    }
+    private SymbolicExpressionTreeGrammar() : base() { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      SymbolicExpressionTreeGrammar clone = new SymbolicExpressionTreeGrammar();
-      cloner.RegisterClonedObject(this, clone);
-      InitializeShallowClone(clone);
-      return clone;
+      return new SymbolicExpressionTreeGrammar(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs	(revision 4674)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
@@ -29,5 +30,5 @@
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
   [StorableClass]
-  public class SymbolicExpressionTreeNode : ICloneable {
+  public class SymbolicExpressionTreeNode : DeepCloneable {
     [Storable]
     private IList<SymbolicExpressionTreeNode> subTrees;
@@ -51,25 +52,32 @@
     }
 
-    internal SymbolicExpressionTreeNode() {
+    [StorableConstructor]
+    protected SymbolicExpressionTreeNode(bool deserializing) { }
+    protected SymbolicExpressionTreeNode(SymbolicExpressionTreeNode original, Cloner cloner)
+      : base() {
+      symbol = original.symbol; // symbols are reused
+      subTrees = new List<SymbolicExpressionTreeNode>(original.SubTrees.Count);
+      foreach (var subtree in original.SubTrees) {
+        var clonedSubTree = cloner.Clone(subtree);
+        subTrees.Add(clonedSubTree);
+        clonedSubTree.Parent = this;
+      }
+    }
+
+    internal SymbolicExpressionTreeNode()
+      : base() {
       // don't allocate subtrees list here!
       // because we don't want to allocate it in terminal nodes
     }
 
-    public SymbolicExpressionTreeNode(Symbol symbol) {
+    public SymbolicExpressionTreeNode(Symbol symbol)
+      : base() {
       subTrees = new List<SymbolicExpressionTreeNode>(3);
       this.symbol = symbol;
     }
 
-    // copy constructor
-    protected SymbolicExpressionTreeNode(SymbolicExpressionTreeNode original) {
-      symbol = original.symbol;
-      subTrees = new List<SymbolicExpressionTreeNode>(original.SubTrees.Count);
-      foreach (var subtree in original.SubTrees) {
-        AddSubTree((SymbolicExpressionTreeNode)subtree.Clone());
-      }
-    }
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       foreach (var subtree in SubTrees) {
         subtree.Parent = this;
@@ -174,11 +182,7 @@
     }
 
-    #region ICloneable Members
-
-    public virtual object Clone() {
-      return new SymbolicExpressionTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeNode(this, cloner);
     }
-
-    #endregion
 
     public override string ToString() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeOperator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeOperator.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeOperator.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -74,4 +75,7 @@
     #endregion
 
+    [StorableConstructor]
+    protected SymbolicExpressionTreeOperator(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeOperator(SymbolicExpressionTreeOperator original, Cloner cloner) : base(original, cloner) { }
     protected SymbolicExpressionTreeOperator()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeTerminalNode.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeTerminalNode.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeTerminalNode.cs	(revision 4674)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using HeuristicLab.Common;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -29,13 +30,24 @@
   public abstract class SymbolicExpressionTreeTerminalNode : SymbolicExpressionTreeNode {
     private static List<SymbolicExpressionTreeNode> emptyList = new List<SymbolicExpressionTreeNode>();
+    public override IList<SymbolicExpressionTreeNode> SubTrees {
+      get {
+        return SymbolicExpressionTreeTerminalNode.emptyList;
+      }
+    }
 
+    [StorableConstructor]
+    protected SymbolicExpressionTreeTerminalNode(bool deserializing) : base(deserializing) { }
+    // don't call storable constructor of base to prevent allocation of sub-trees list in base!
+    protected SymbolicExpressionTreeTerminalNode(SymbolicExpressionTreeTerminalNode original, Cloner cloner)
+      : base() {
+      // symbols are reused
+      this.Symbol = original.Symbol;
+    }
     protected SymbolicExpressionTreeTerminalNode() : base() { }
-    // don't call  base constructors to prevent allocation of sub-trees list in base!
-    protected SymbolicExpressionTreeTerminalNode(Symbol symbol) {
+
+    protected SymbolicExpressionTreeTerminalNode(Symbol symbol)
+      : base() {
+      // symbols are reused
       this.Symbol = symbol;
-    }
-    // don't call  base constructors to prevent allocation of sub-trees list in base!
-    protected SymbolicExpressionTreeTerminalNode(SymbolicExpressionTreeTerminalNode original) {
-      this.Symbol = original.Symbol;
     }
 
@@ -49,9 +61,4 @@
       throw new NotSupportedException();
     }
-    public override IList<SymbolicExpressionTreeNode> SubTrees {
-      get {
-        return SymbolicExpressionTreeTerminalNode.emptyList;
-      }
-    }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeTopLevelNode.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeTopLevelNode.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeTopLevelNode.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -26,12 +27,4 @@
   [StorableClass]
   public class SymbolicExpressionTreeTopLevelNode : SymbolicExpressionTreeNode {
-    public SymbolicExpressionTreeTopLevelNode()
-      : base() {
-    }
-
-    public SymbolicExpressionTreeTopLevelNode(Symbol symbol)
-      : base(symbol) {
-    }
-
     [Storable]
     private ISymbolicExpressionGrammar grammar;
@@ -43,14 +36,16 @@
     }
 
-    // copy constructor
-    protected SymbolicExpressionTreeTopLevelNode(SymbolicExpressionTreeTopLevelNode original)
-      : base(original) {
-      if (original.Grammar != null)
-        grammar = (ISymbolicExpressionGrammar)original.Grammar.Clone();
-      //grammar = original.grammar;
+    [StorableConstructor]
+    protected SymbolicExpressionTreeTopLevelNode(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeTopLevelNode(SymbolicExpressionTreeTopLevelNode original, Cloner cloner)
+      : base(original, cloner) {
+      grammar = cloner.Clone(original.Grammar);
     }
+    public SymbolicExpressionTreeTopLevelNode() : base() { }
+    public SymbolicExpressionTreeTopLevelNode(Symbol symbol) : base(symbol) { }
 
-    public override object Clone() {
-      return new SymbolicExpressionTreeTopLevelNode(this);
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeTopLevelNode(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Argument.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Argument.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Argument.cs	(revision 4674)
@@ -43,6 +43,10 @@
 
     [StorableConstructor]
-    private Argument() : base() { }
-
+    private Argument(bool deserializing) : base(deserializing) { }
+    private Argument(Argument original, Cloner cloner)
+      : base(original, cloner) {
+      argumentIndex = original.argumentIndex;
+      name = "ARG" + original.argumentIndex;
+    }
     public Argument(int argumentIndex)
       : base("ARG" + argumentIndex, Argument.ArgumentDescription) {
@@ -56,8 +60,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Argument clone = (Argument)base.Clone(cloner);
-      clone.argumentIndex = argumentIndex;
-      clone.name = "ARG" + argumentIndex;
-      return clone;
+      return new Argument(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ArgumentTreeNode.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ArgumentTreeNode.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ArgumentTreeNode.cs	(revision 4674)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols {
@@ -34,15 +35,11 @@
     }
 
-    private ArgumentTreeNode() : base() { }
-
-    // copy constructor
-    private ArgumentTreeNode(ArgumentTreeNode original)
-      : base(original) {
-    }
-
+    [StorableConstructor]
+    private ArgumentTreeNode(bool deserializing) : base(deserializing) { }
+    protected ArgumentTreeNode(ArgumentTreeNode original, Cloner cloner) : base(original, cloner) { }
     public ArgumentTreeNode(Argument argSymbol) : base(argSymbol) { }
 
-    public override object Clone() {
-      return new ArgumentTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ArgumentTreeNode(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Defun.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Defun.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Defun.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -32,7 +33,12 @@
     public const string DefunDescription = "Symbol that represents a function defining node.";
 
-    public Defun() : base(Defun.DefunName, Defun.DefunDescription) { }
     [StorableConstructor]
     private Defun(bool deserializing) : base(deserializing) { }
+    private Defun(Defun original, Cloner cloner) : base(original, cloner) { }
+    public Defun() : base(Defun.DefunName, Defun.DefunDescription) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Defun(this, cloner);
+    }
 
     public override SymbolicExpressionTreeNode CreateTreeNode() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/DefunTreeNode.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/DefunTreeNode.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/DefunTreeNode.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols {
@@ -37,9 +38,8 @@
     }
 
-    private DefunTreeNode() : base() { }
-
-    // copy constructor
-    private DefunTreeNode(DefunTreeNode original)
-      : base(original) {
+    [StorableConstructor]
+    private DefunTreeNode(bool deserializing) : base(deserializing) { }
+    protected DefunTreeNode(DefunTreeNode original, Cloner cloner)
+      : base(original, cloner) {
       functionName = original.functionName;
       numberOfArguments = original.numberOfArguments;
@@ -48,7 +48,6 @@
     public DefunTreeNode(Defun defunSymbol) : base(defunSymbol) { }
 
-
-    public override object Clone() {
-      return new DefunTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DefunTreeNode(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/InvokeFunction.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/InvokeFunction.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/InvokeFunction.cs	(revision 4674)
@@ -50,4 +50,9 @@
     [StorableConstructor]
     private InvokeFunction(bool deserializing) : base(deserializing) { }
+    private InvokeFunction(InvokeFunction original, Cloner cloner)
+      : base(original, cloner) {
+      functionName = original.functionName;
+      name = "Invoke: " + original.functionName;
+    }
     public InvokeFunction(string functionName)
       : base("Invoke: " + functionName, InvokeFunction.InvokeFunctionDescription) {
@@ -60,8 +65,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      InvokeFunction clone = (InvokeFunction)base.Clone(cloner);
-      clone.functionName = functionName;
-      clone.name = "Invoke: " + functionName;
-      return clone;
+      return new InvokeFunction(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/InvokeFunctionTreeNode.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/InvokeFunctionTreeNode.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/InvokeFunctionTreeNode.cs	(revision 4674)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols {
@@ -34,15 +35,11 @@
     }
 
-    private InvokeFunctionTreeNode() : base() { }
-
-    // copy constructor
-    private InvokeFunctionTreeNode(InvokeFunctionTreeNode original)
-      : base(original) {
-    }
-
+    [StorableConstructor]
+    private InvokeFunctionTreeNode(bool deserializing) : base(deserializing) { }
+    protected InvokeFunctionTreeNode(InvokeFunctionTreeNode original, Cloner cloner) : base(original, cloner) { }
     public InvokeFunctionTreeNode(InvokeFunction invokeSymbol) : base(invokeSymbol) { }
 
-    public override object Clone() {
-      return new InvokeFunctionTreeNode(this);
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InvokeFunctionTreeNode(this, cloner);
     }
   }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ProgramRootSymbol.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ProgramRootSymbol.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ProgramRootSymbol.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -29,8 +30,12 @@
     public const string ProgramRootSymbolDescription = "Special symbol that represents the program root node of a symbolic expression tree.";
 
-    public ProgramRootSymbol() : base(ProgramRootSymbol.ProgramRootSymbolName, ProgramRootSymbol.ProgramRootSymbolDescription) { }
     [StorableConstructor]
     private ProgramRootSymbol(bool deserializing) : base(deserializing) { }
+    private ProgramRootSymbol(ProgramRootSymbol original, Cloner cloner) : base(original, cloner) { }
+    public ProgramRootSymbol() : base(ProgramRootSymbol.ProgramRootSymbolName, ProgramRootSymbol.ProgramRootSymbolDescription) { }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ProgramRootSymbol(this, cloner);
+    }
     public override SymbolicExpressionTreeNode CreateTreeNode() {
       return new SymbolicExpressionTreeTopLevelNode(this);
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ReadOnlySymbol.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ReadOnlySymbol.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/ReadOnlySymbol.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -27,12 +28,4 @@
   [Item("ReadOnlySymbol", "Represents a symbol in a symbolic function tree that cannot be modified.")]
   public abstract class ReadOnlySymbol : Symbol {
-    //#region Properties
-    //[Storable]
-    //private double initialFrequency;
-    //public double InitialFrequency {
-    //  get { return initialFrequency; }
-    //  set { throw new NotSupportedException(); }
-    //}
-    //#endregion
 
     public override bool CanChangeName {
@@ -43,8 +36,8 @@
     }
 
-    protected ReadOnlySymbol() : base() { }
-    protected ReadOnlySymbol(string name, string description) : base(name, description) { }
     [StorableConstructor]
     protected ReadOnlySymbol(bool deserializing) : base(deserializing) { }
+    protected ReadOnlySymbol(ReadOnlySymbol original, Cloner cloner) : base(original, cloner) { }
+    protected ReadOnlySymbol(string name, string description) : base(name, description) { }
   }
 }
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/StartSymbol.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/StartSymbol.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/StartSymbol.cs	(revision 4674)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -29,7 +30,12 @@
     public const string StartSymbolDescription = "Special symbol that represents the starting node of the result producing branch of a symbolic expression tree.";
 
-    public StartSymbol() : base(StartSymbol.StartSymbolName, StartSymbol.StartSymbolDescription) { }
     [StorableConstructor]
     private StartSymbol(bool deserializing) : base(deserializing) { }
+    private StartSymbol(StartSymbol original, Cloner cloner) : base(original, cloner) { }
+    public StartSymbol() : base(StartSymbol.StartSymbolName, StartSymbol.StartSymbolDescription) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StartSymbol(this, cloner);
+    }
 
     public override SymbolicExpressionTreeNode CreateTreeNode() {
Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Symbol.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Symbol.cs	(revision 4673)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Symbol.cs	(revision 4674)
@@ -47,4 +47,10 @@
     #endregion
 
+    [StorableConstructor]
+    protected Symbol(bool deserializing) : base(deserializing) { }
+    protected Symbol(Symbol original, Cloner cloner)
+      : base(original, cloner) {
+      initialFrequency = original.initialFrequency;
+    }
     protected Symbol()
       : base() {
@@ -57,6 +63,4 @@
     }
 
-    [StorableConstructor]
-    protected Symbol(bool deserializing) : base(deserializing) { }
 
     public virtual SymbolicExpressionTreeNode CreateTreeNode() {
@@ -65,7 +69,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Symbol clone = (Symbol)base.Clone(cloner);
-      clone.initialFrequency = initialFrequency;
-      return clone;
+      return new Symbol(this, cloner);
     }
 
