Index: branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Argument.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Symbols/Argument.cs	(revision 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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 4656)
+++ 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);
     }
 
