Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/BoolConverter.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/BoolConverter.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/BoolConverter.cs	(revision 4682)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -31,7 +32,14 @@
   public class BoolConverter : Item, IItemToSolutionMessageConverter {
     private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<bool>), typeof(ValueTypeArray<bool>), typeof(ValueTypeMatrix<bool>) };
+    [StorableConstructor]
+    protected BoolConverter(bool deserializing) : base(deserializing) { }
+    protected BoolConverter(BoolConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BoolConverter(this, cloner);
+    }
+    public BoolConverter() : base() { }
 
     #region IItemToSolutionMessageConverter Members
-    
+
     public Type[] ItemTypes {
       get { return itemTypes; }
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/DateTimeValueConverter.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/DateTimeValueConverter.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/DateTimeValueConverter.cs	(revision 4682)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -30,4 +31,11 @@
   public class DateTimeValueConverter : Item, IItemToSolutionMessageConverter {
     private static readonly Type[] itemTypes = new Type[] { typeof(DateTimeValue) };
+    [StorableConstructor]
+    protected DateTimeValueConverter(bool deserializing) : base(deserializing) { }
+    protected DateTimeValueConverter(DateTimeValueConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DateTimeValueConverter(this, cloner);
+    }
+    public DateTimeValueConverter() : base() { }
 
     #region IItemToSolutionMessageConverter Members
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/DoubleConverter.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/DoubleConverter.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/DoubleConverter.cs	(revision 4682)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -32,6 +33,14 @@
     private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<double>), typeof(ValueTypeArray<double>), typeof(ValueTypeMatrix<double>) };
 
+    [StorableConstructor]
+    protected DoubleConverter(bool deserializing) : base(deserializing) { }
+    protected DoubleConverter(DoubleConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DoubleConverter(this, cloner);
+    }
+    public DoubleConverter() : base() { }
+
     #region IItemToSolutionMessageConverter Members
-    
+
     public Type[] ItemTypes {
       get { return itemTypes; }
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/IntegerConverter.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/IntegerConverter.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/IntegerConverter.cs	(revision 4682)
@@ -22,4 +22,5 @@
 using System;
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -32,6 +33,14 @@
     private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<int>), typeof(ValueTypeArray<int>), typeof(ValueTypeMatrix<int>) };
 
+    [StorableConstructor]
+    protected IntegerConverter(bool deserializing) : base(deserializing) { }
+    protected IntegerConverter(IntegerConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerConverter(this, cloner);
+    }
+    public IntegerConverter() : base() { }
+
     #region IItemToSolutionMessageConverter Members
-    
+
     public Type[] ItemTypes {
       get { return itemTypes; }
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/StringConverter.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/StringConverter.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/StringConverter.cs	(revision 4682)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -30,4 +31,12 @@
   public class StringConverter : Item, IItemToSolutionMessageConverter {
     private static readonly Type[] itemTypes = new Type[] { typeof(StringValue), typeof(StringArray), typeof(StringMatrix), typeof(IStringConvertibleValue), typeof(IStringConvertibleArray), typeof(IStringConvertibleMatrix) };
+
+    [StorableConstructor]
+    protected StringConverter(bool deserializing) : base(deserializing) { }
+    protected StringConverter(StringConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringConverter(this, cloner);
+    }
+    public StringConverter() : base() { }
 
     #region IItemToSolutionMessageConverter Members
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/TimeSpanValueConverter.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/TimeSpanValueConverter.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Converters/TimeSpanValueConverter.cs	(revision 4682)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -30,4 +31,12 @@
   public class TimeSpanValueConverter : Item, IItemToSolutionMessageConverter {
     private static readonly Type[] itemTypes = new Type[] { typeof(TimeSpanValue) };
+
+    [StorableConstructor]
+    protected TimeSpanValueConverter(bool deserializing) : base(deserializing) { }
+    protected TimeSpanValueConverter(TimeSpanValueConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TimeSpanValueConverter(this, cloner);
+    }
+    public TimeSpanValueConverter() : base() { }
 
     #region IItemToSolutionMessageConverter Members
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationChannel.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationChannel.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationChannel.cs	(revision 4682)
@@ -21,4 +21,5 @@
 
 using Google.ProtocolBuffers;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,4 +34,5 @@
     [StorableConstructor]
     protected EvaluationChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationChannel(EvaluationChannel original, Cloner cloner) : base(original, cloner) { }
     protected EvaluationChannel()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationProcessChannel.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationProcessChannel.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationProcessChannel.cs	(revision 4682)
@@ -58,4 +58,15 @@
     private EvaluationStreamChannel streamingChannel;
 
+    [StorableConstructor]
+    protected EvaluationProcessChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationProcessChannel(EvaluationProcessChannel original, Cloner cloner)
+      : base(original, cloner) {
+      executable = original.executable;
+      arguments = original.arguments;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationProcessChannel(this, cloner);
+    }
+
     public EvaluationProcessChannel() : this(String.Empty, String.Empty) { }
     public EvaluationProcessChannel(string executable, string arguments)
@@ -63,11 +74,4 @@
       this.executable = executable;
       this.arguments = arguments;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      EvaluationProcessChannel clone = (EvaluationProcessChannel)base.Clone(cloner);
-      clone.executable = executable;
-      clone.arguments = arguments;
-      return clone;
     }
 
@@ -96,5 +100,6 @@
       try {
         streamingChannel.Send(message);
-      } catch {
+      }
+      catch {
         Close();
         throw;
@@ -105,5 +110,6 @@
       try {
         return streamingChannel.Receive(builder);
-      } catch {
+      }
+      catch {
         Close();
         throw;
@@ -121,5 +127,6 @@
               process.WaitForExit(1000);
               process.Close();
-            } catch { }
+            }
+            catch { }
           }
           // for some reasons the event process_Exited does not fire
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationServiceClient.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationServiceClient.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationServiceClient.cs	(revision 4682)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -44,4 +45,11 @@
     }
 
+
+    [StorableConstructor]
+    protected EvaluationServiceClient(bool deserializing) : base(deserializing) { }
+    protected EvaluationServiceClient(EvaluationServiceClient original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationServiceClient(this, cloner);
+    }
     public EvaluationServiceClient()
       : base() {
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationStreamChannel.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationStreamChannel.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationStreamChannel.cs	(revision 4682)
@@ -23,4 +23,5 @@
 using System.IO;
 using Google.ProtocolBuffers;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,4 +34,11 @@
     private Stream input;
     private Stream output;
+
+    [StorableConstructor]
+    protected EvaluationStreamChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationStreamChannel(EvaluationStreamChannel original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationStreamChannel(this, cloner);
+    }
 
     public EvaluationStreamChannel() : base() { }
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationTCPChannel.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationTCPChannel.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/EvaluationTCPChannel.cs	(revision 4682)
@@ -58,4 +58,15 @@
     private Socket socket;
 
+    [StorableConstructor]
+    protected EvaluationTCPChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationTCPChannel(EvaluationTCPChannel original, Cloner cloner)
+      : base(original, cloner) {
+      ipAddress = original.ipAddress;
+      port = original.port;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationTCPChannel(this, cloner);
+    }
+
     public EvaluationTCPChannel() : this(String.Empty, 0) { }
     public EvaluationTCPChannel(string ip, int port)
@@ -63,11 +74,4 @@
       this.ipAddress = ip;
       this.port = port;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      EvaluationTCPChannel clone = (EvaluationTCPChannel)base.Clone(cloner);
-      clone.ipAddress = ipAddress;
-      clone.port = port;
-      return clone;
     }
 
@@ -87,8 +91,10 @@
         byte[] buffer = EncodeDelimited(message);
         socket.Send(buffer);
-      } catch (SocketException) {
-        Close();
-        throw;
-      } catch (ObjectDisposedException) {
+      }
+      catch (SocketException) {
+        Close();
+        throw;
+      }
+      catch (ObjectDisposedException) {
         socket = null;
         Close();
@@ -122,8 +128,10 @@
         byte[] buffer = GetMessageBuffer();
         return builder.WeakMergeFrom(ByteString.CopyFrom(buffer)).WeakBuild();
-      } catch (SocketException) {
-        Close();
-        throw;
-      } catch (ObjectDisposedException) {
+      }
+      catch (SocketException) {
+        Close();
+        throw;
+      }
+      catch (ObjectDisposedException) {
         socket = null;
         Close();
@@ -164,5 +172,6 @@
             socket.Disconnect(false);
           socket.Close();
-        } catch { }
+        }
+        catch { }
         socket = null;
       }
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 4682)
@@ -124,4 +124,16 @@
     [StorableConstructor]
     private ExternalEvaluationProblem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      AttachEventHandlers();
+    }
+
+    private ExternalEvaluationProblem(ExternalEvaluationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      AttachEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationProblem(this, cloner);
+    }
     public ExternalEvaluationProblem()
       : base() {
@@ -141,10 +153,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ExternalEvaluationProblem clone = (ExternalEvaluationProblem)base.Clone(cloner);
-      clone.AttachEventHandlers();
-      return clone;
-    }
-
     #region Events
     public event EventHandler SolutionCreatorChanged;
@@ -194,10 +200,5 @@
     #endregion
 
-    #region Helpers
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
-      AttachEventHandlers();
-    }
-
+    #region Helper
     private void AttachEventHandlers() {
       SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluator.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluator.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluator.cs	(revision 4682)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -46,4 +47,10 @@
     }
 
+    [StorableConstructor]
+    protected ExternalEvaluator(bool deserializing) : base(deserializing) { }
+    protected ExternalEvaluator(ExternalEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluator(this, cloner);
+    }
     public ExternalEvaluator()
       : base() {
@@ -64,5 +71,6 @@
           try {
             MessageBuilder.AddToMessage(value, name, protobufBuilder);
-          } catch (ArgumentException ex) {
+          }
+          catch (ArgumentException ex) {
             throw new InvalidOperationException("ERROR in " + Name + ": Parameter " + name + " cannot be added to the message.", ex);
           }
Index: branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilder.cs
===================================================================
--- branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilder.cs	(revision 4656)
+++ branches/CloningRefactoring/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilder.cs	(revision 4682)
@@ -50,4 +50,17 @@
     [StorableConstructor]
     protected SolutionMessageBuilder(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      AttachEventHandlers();
+    }
+
+    protected SolutionMessageBuilder(SolutionMessageBuilder original, Cloner cloner)
+      : base(original, cloner) {
+      convertersList = cloner.Clone(original.convertersList);
+      AttachEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SolutionMessageBuilder(this, cloner);
+    }
     public SolutionMessageBuilder()
       : base() {
@@ -63,11 +76,4 @@
 
       AttachEventHandlers();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      SolutionMessageBuilder clone = (SolutionMessageBuilder)base.Clone(cloner);
-      clone.convertersList = (CheckedItemList<IItemToSolutionMessageConverter>)cloner.Clone(convertersList);
-      clone.AttachEventHandlers();
-      return clone;
     }
 
@@ -87,9 +93,8 @@
     }
 
-    [StorableHook(HookType.AfterDeserialization)]
     private void AttachEventHandlers() {
       // BackwardsCompatibility3.3
       #region Backwards compatible code, remove with 3.4
-      #pragma warning disable 0612
+#pragma warning disable 0612
       if (converters != null) {
         if (convertersList == null) convertersList = new CheckedItemList<IItemToSolutionMessageConverter>();
@@ -99,5 +104,5 @@
         converters = null;
       }
-      #pragma warning restore 0612
+#pragma warning restore 0612
       #endregion
       convertersList.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IItemToSolutionMessageConverter>>(convertersList_Changed);
