Index: branches/CloningRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveGenerator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveGenerator.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveGenerator.cs	(revision 4673)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -26,5 +27,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Encodings.RealVectorEncoding {
@@ -63,8 +63,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new AdditiveMoveGenerator(this, cloner);
-    }
-
     public override IOperation Apply() {
       RealVector vector = RealVectorParameter.ActualValue;
Index: branches/CloningRefactoring/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs	(revision 4673)
@@ -160,4 +160,24 @@
 
     #region Construction & Initialization
+    [StorableConstructor]
+    protected ProgrammableOperator(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    protected ProgrammableOperator(ProgrammableOperator original, Cloner cloner)
+      : base(original, cloner) {
+      code = original.Code;
+      executeMethod = original.executeMethod;
+      Assemblies = original.Assemblies.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
+      namespaces = original.namespaces;
+      CompilationUnitCode = original.CompilationUnitCode;
+      CompileErrors = original.CompileErrors;
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ProgrammableOperator(this, cloner);
+    }
 
     public ProgrammableOperator() {
@@ -171,5 +191,5 @@
     }
 
-    [StorableHook(HookType.AfterDeserialization)]
+
     private void RegisterEvents() {
       Parameters.ItemsAdded += Parameters_Changed;
@@ -185,6 +205,5 @@
     protected void OnSignatureChanged() {
       EventHandler handler = SignatureChanged;
-      if (handler != null)
-        handler(this, EventArgs.Empty);
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -426,26 +445,9 @@
     public event EventHandler CodeChanged;
     protected virtual void OnCodeChanged() {
-      if (CodeChanged != null)
-        CodeChanged(this, new EventArgs());
+      EventHandler handler = CodeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
     #endregion
-
-    #region Cloning
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ProgrammableOperator clone = (ProgrammableOperator)base.Clone(cloner);
-      clone.code = Code;
-      clone.executeMethod = executeMethod;
-      clone.Assemblies = Assemblies.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
-      clone.namespaces = namespaces;
-      clone.CompilationUnitCode = CompilationUnitCode;
-      clone.CompileErrors = CompileErrors;
-      clone.RegisterEvents();
-      return clone;
-    }
-
-    #endregion
-
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/BidirectionalLookup.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/BidirectionalLookup.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/BidirectionalLookup.cs	(revision 4673)
@@ -31,4 +31,7 @@
     [Storable]
     private Dictionary<TSecond, TFirst> secondToFirst;
+
+    [StorableConstructor]
+    protected BidirectionalLookup(bool deserializing) : base() { }
 
     public BidirectionalLookup() {
Index: branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ConnectionInfo.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ConnectionInfo.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ConnectionInfo.cs	(revision 4673)
@@ -28,8 +28,18 @@
   [StorableClass]
   public class ConnectionInfo : DeepCloneable, IConnectionInfo {
-    private ConnectionInfo() {
+    [StorableConstructor]
+    private ConnectionInfo(bool deserializing) : base() { }
+    private ConnectionInfo(ConnectionInfo original, Cloner cloner)
+      : base(original, cloner) {
+      from = cloner.Clone(original.from);
+      connectorFrom = original.ConnectorFrom;
+      to = cloner.Clone(original.To);
+      connectorTo = original.ConnectorTo;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConnectionInfo(this, cloner);
     }
     public ConnectionInfo(IShapeInfo from, string connectorFrom, IShapeInfo to, string connectorTo)
-      : this() {
+      : base() {
       if (from == to)
         throw new ArgumentException("Could not create connections between the same shape info.");
@@ -70,15 +80,5 @@
     protected virtual void OnChanged() {
       EventHandler handler = this.Changed;
-      if (handler != null)
-        this.Changed(this, EventArgs.Empty);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ConnectionInfo clone = (ConnectionInfo)base.Clone(cloner);
-      clone.from = (IShapeInfo)cloner.Clone(this.from);
-      clone.connectorFrom = this.ConnectorFrom;
-      clone.to = (IShapeInfo)cloner.Clone(this.To);
-      clone.connectorTo = this.ConnectorTo;
-      return clone;
+      if (handler != null) this.Changed(this, EventArgs.Empty);
     }
   }
Index: branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/GraphVisualizationInfo.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/GraphVisualizationInfo.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/GraphVisualizationInfo.cs	(revision 4673)
@@ -30,5 +30,17 @@
   [StorableClass]
   public class GraphVisualizationInfo : DeepCloneable, IGraphVisualizationInfo {
-    public GraphVisualizationInfo() {
+    [StorableConstructor]
+    protected GraphVisualizationInfo(bool deserializing) : base() { }
+    protected GraphVisualizationInfo(GraphVisualizationInfo original, Cloner cloner)
+      : base(original, cloner) {
+      shapeInfos = new ObservableSet<IShapeInfo>(original.shapeInfos.Select(x => cloner.Clone(x)));
+      connectionInfos = new ObservableSet<IConnectionInfo>(original.connectionInfos.Select(x => cloner.Clone(x)));
+      initialShape = cloner.Clone(original.initialShape);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GraphVisualizationInfo(this, cloner);
+    }
+    public GraphVisualizationInfo()
+      : base() {
       this.shapeInfos = new ObservableSet<IShapeInfo>();
       this.connectionInfos = new ObservableSet<IConnectionInfo>();
@@ -96,13 +108,4 @@
     }
     #endregion
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      GraphVisualizationInfo clone = (GraphVisualizationInfo)base.Clone(cloner);
-      clone.shapeInfos = new ObservableSet<IShapeInfo>(this.shapeInfos.Select(x => (IShapeInfo)cloner.Clone(x)));
-      clone.connectionInfos = new ObservableSet<IConnectionInfo>(this.connectionInfos.Select(x => (IConnectionInfo)cloner.Clone(x)));
-      if (this.initialShape != null)
-        clone.initialShape = (IShapeInfo)this.initialShape.Clone(cloner);
-      return clone;
-    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ShapeInfo.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ShapeInfo.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ShapeInfo.cs	(revision 4673)
@@ -30,5 +30,10 @@
   [StorableClass]
   public abstract class ShapeInfo : DeepCloneable, IShapeInfo {
-    private ShapeInfo() {
+    [StorableConstructor]
+    protected ShapeInfo(bool deserializing) : base() { }
+    protected ShapeInfo(ShapeInfo original, Cloner cloner)
+      : base(original, cloner) {
+      shapeType = original.shapeType;
+      location = original.location;
     }
 
@@ -62,6 +67,5 @@
     protected virtual void OnChanged() {
       EventHandler handler = this.Changed;
-      if (handler != null)
-        this.Changed(this, EventArgs.Empty);
+      if (handler != null) this.Changed(this, EventArgs.Empty);
     }
 
@@ -80,11 +84,4 @@
       this.Location = shape.Location;
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ShapeInfo clone = (ShapeInfo)base.Clone(cloner);
-      clone.shapeType = this.shapeType;
-      clone.location = this.location;
-      return clone;
-    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorGraphVisualizationInfo.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorGraphVisualizationInfo.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorGraphVisualizationInfo.cs	(revision 4673)
@@ -46,7 +46,49 @@
     [StorableConstructor]
     private OperatorGraphVisualizationInfo(bool deserializing)
-      : base() {
+      : base(deserializing) {
       this.operatorParameterCollectionMapping = new BidirectionalLookup<IOperator, IKeyedItemCollection<string, IParameter>>();
       this.parameterOperatorMapping = new Dictionary<IParameter, IOperator>();
+    }
+    private OperatorGraphVisualizationInfo(OperatorGraphVisualizationInfo original, Cloner cloner)
+      : base(original, cloner) {
+      operatorShapeInfoMapping = new BidirectionalLookup<IOperator, IOperatorShapeInfo>();
+      operatorParameterCollectionMapping = new BidirectionalLookup<IOperator, IKeyedItemCollection<string, IParameter>>();
+      parameterOperatorMapping = new Dictionary<IParameter, IOperator>();
+
+      operatorGraph = cloner.Clone(original.operatorGraph);
+      RegisterOperatorGraphEvents();
+      oldInitialShape = cloner.Clone(original.oldInitialShape);
+      oldInitialShapeColor = original.oldInitialShapeColor;
+
+      foreach (KeyValuePair<IOperator, IOperatorShapeInfo> pair in original.operatorShapeInfoMapping.FirstEnumerable) {
+        IOperator op = cloner.Clone(pair.Key);
+        IOperatorShapeInfo shapeInfo = cloner.Clone(pair.Value);
+        RegisterOperatorEvents(op);
+        operatorParameterCollectionMapping.Add(op, pair.Key.Parameters);
+        operatorShapeInfoMapping.Add(op, shapeInfo);
+      }
+
+      foreach (IOperator oper in operatorShapeInfoMapping.FirstValues) {
+        foreach (IParameter param in oper.Parameters) {
+          parameterOperatorMapping.Add(param, oper);
+          IValueParameter opParam = param as IValueParameter;
+          if (opParam != null && typeof(IOperator).IsAssignableFrom(param.DataType))
+            RegisterOperatorParameterEvents(opParam);
+          else
+            RegisterParameterEvents(param);
+        }
+      }
+      if (original.operatorGraph.InitialOperator != null) {
+        IOperatorShapeInfo newInitialShapeInfo = original.operatorShapeInfoMapping.GetByFirst(original.operatorGraph.InitialOperator);
+        if (newInitialShapeInfo != null) {
+          oldInitialShapeColor = newInitialShapeInfo.Color;
+          newInitialShapeInfo.Color = Color.LightGreen;
+        }
+        oldInitialShape = InitialShape;
+        OnInitialShapeChanged();
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OperatorGraphVisualizationInfo(this, cloner);
     }
 
@@ -64,5 +106,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void DeserializationHook() {
+    private void AfterDeserialization() {
       this.operatorGraph.DeserializationFinished += new EventHandler(operatorGraph_DeserializationFinished);
 
@@ -101,43 +143,4 @@
       }
       this.operatorGraph.DeserializationFinished -= new EventHandler(operatorGraph_DeserializationFinished);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      OperatorGraphVisualizationInfo clone = (OperatorGraphVisualizationInfo)base.Clone(cloner);
-      clone.operatorGraph = (OperatorGraph)cloner.Clone(this.operatorGraph);
-      clone.RegisterOperatorGraphEvents();
-      clone.oldInitialShape = (IOperatorShapeInfo)cloner.Clone(this.oldInitialShape);
-      clone.oldInitialShapeColor = this.oldInitialShapeColor;
-
-      IOperator op;
-      IOperatorShapeInfo shapeInfo;
-      foreach (KeyValuePair<IOperator, IOperatorShapeInfo> pair in this.operatorShapeInfoMapping.FirstEnumerable) {
-        op = (IOperator)cloner.Clone(pair.Key);
-        shapeInfo = (IOperatorShapeInfo)cloner.Clone(pair.Value);
-        clone.RegisterOperatorEvents(op);
-        clone.operatorParameterCollectionMapping.Add(op, pair.Key.Parameters);
-        clone.operatorShapeInfoMapping.Add(op, shapeInfo);
-      }
-
-      foreach (IOperator oper in clone.operatorShapeInfoMapping.FirstValues) {
-        foreach (IParameter param in oper.Parameters) {
-          clone.parameterOperatorMapping.Add(param, oper);
-          IValueParameter opParam = param as IValueParameter;
-          if (opParam != null && typeof(IOperator).IsAssignableFrom(param.DataType))
-            clone.RegisterOperatorParameterEvents(opParam);
-          else
-            clone.RegisterParameterEvents(param);
-        }
-      }
-      if (this.operatorGraph.InitialOperator != null) {
-        IOperatorShapeInfo newInitialShapeInfo = this.operatorShapeInfoMapping.GetByFirst(this.operatorGraph.InitialOperator);
-        if (newInitialShapeInfo != null) {
-          oldInitialShapeColor = newInitialShapeInfo.Color;
-          newInitialShapeInfo.Color = Color.LightGreen;
-        }
-        oldInitialShape = this.InitialShape;
-        this.OnInitialShapeChanged();
-      }
-      return clone;
     }
 
Index: branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorShapeInfo.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorShapeInfo.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphVisualization/OperatorShapeInfo.cs	(revision 4673)
@@ -32,4 +32,22 @@
     [Storable]
     private List<string> labels;
+
+    [StorableConstructor]
+    protected OperatorShapeInfo(bool deserializing) : base(deserializing) { }
+    protected OperatorShapeInfo(OperatorShapeInfo original, Cloner cloner)
+      : base(original, cloner) {
+      collapsed = original.collapsed;
+      color = original.color;
+      lineColor = original.lineColor;
+      lineWidth = original.lineWidth;
+      title = original.title;
+      icon = (Bitmap)original.icon.Clone();
+
+      connectorNames = new List<string>(original.connectorNames);
+      labels = new List<string>(original.labels);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OperatorShapeInfo(this, cloner);
+    }
 
     public OperatorShapeInfo()
@@ -216,19 +234,4 @@
       //TODO update Connector and labels;
     }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      OperatorShapeInfo clone = (OperatorShapeInfo)base.Clone(cloner);
-      clone.collapsed = this.collapsed;
-      clone.color = this.color;
-      clone.lineColor = this.lineColor;
-      clone.lineWidth = this.lineWidth;
-      clone.title = this.title;
-      clone.icon = (Bitmap)this.icon.Clone();
-
-      clone.connectorNames = new List<string>(this.connectorNames);
-      clone.labels = new List<string>(this.labels);
-
-      return clone;
-    }
   }
 }
Index: branches/CloningRefactoring/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs	(revision 4672)
+++ branches/CloningRefactoring/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs	(revision 4673)
@@ -55,8 +55,8 @@
     [StorableConstructor]
     private UserDefinedAlgorithm(bool deserializing) : base(deserializing) { }
-    internal UserDefinedAlgorithm(UserDefinedAlgorithm original, Cloner cloner)
+    private UserDefinedAlgorithm(UserDefinedAlgorithm original, Cloner cloner)
       : base(original, cloner) {
     }
-    private UserDefinedAlgorithm(EngineAlgorithm original, Cloner cloner)
+    internal UserDefinedAlgorithm(EngineAlgorithm original, Cloner cloner)
       : base(original, cloner) {
     }
