Index: trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 4722)
@@ -29,4 +29,9 @@
   [StorableClass]
   public class BoolArray : ValueTypeArray<bool>, IStringConvertibleArray {
+    [StorableConstructor]
+    protected BoolArray(bool deserializing) : base(deserializing) { }
+    protected BoolArray(BoolArray original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public BoolArray() : base() { }
     public BoolArray(int length) : base(length) { }
@@ -34,8 +39,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolArray clone = new BoolArray(array);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new BoolArray(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 4722)
@@ -30,4 +30,9 @@
   [StorableClass]
   public class BoolMatrix : ValueTypeMatrix<bool>, IStringConvertibleMatrix {
+    [StorableConstructor]
+    protected BoolMatrix(bool deserializing) : base(deserializing) { }
+    protected BoolMatrix(BoolMatrix original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public BoolMatrix() : base() { }
     public BoolMatrix(int rows, int columns) : base(rows, columns) { }
@@ -39,12 +44,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolMatrix clone = new BoolMatrix();
-      cloner.RegisterClonedObject(this, clone);
-      clone.matrix = (bool[,])matrix.Clone();
-      clone.columnNames = new List<string>(columnNames);
-      clone.rowNames = new List<string>(rowNames);
-      clone.sortableView = sortableView;
-      clone.readOnly = readOnly;
-      return clone;
+      return new BoolMatrix(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 4722)
@@ -35,12 +35,18 @@
     }
 
+    protected BoolValue(BoolValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public BoolValue() : base() { }
-    public BoolValue(bool value) : base(value) { }
+    [StorableConstructor]
+    public BoolValue(bool value)
+      : base(value) {
+      //mkommend: Be aware that the base call refers to the storable ctor => the value is set explicitly in the ctor body.
+      //          This should not affect the persistence, because first the ctor is called and afterwards the values are set by reflection.
+      this.value = value;
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolValue clone = new BoolValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new BoolValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/Comparison.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 4722)
@@ -34,12 +34,14 @@
     }
 
+    [StorableConstructor]
+    protected Comparison(bool deserializing) : base(deserializing) { }
+    protected Comparison(Comparison original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public Comparison() : base() { }
     public Comparison(ComparisonType value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Comparison clone = new Comparison(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new Comparison(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 4722)
@@ -29,12 +29,14 @@
   [StorableClass]
   public class DateTimeValue : ValueTypeValue<DateTime>, IComparable, IStringConvertibleValue {
+    [StorableConstructor]
+    protected DateTimeValue(bool deserializing) : base(deserializing) { }
+    protected DateTimeValue(DateTimeValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DateTimeValue() : base() { }
     public DateTimeValue(DateTime value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DateTimeValue clone = new DateTimeValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new DateTimeValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 4722)
@@ -29,4 +29,9 @@
   [StorableClass]
   public class DoubleArray : ValueTypeArray<double>, IStringConvertibleArray {
+    [StorableConstructor]
+    protected DoubleArray(bool deserializing) : base(deserializing) { }
+    protected DoubleArray(DoubleArray original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DoubleArray() : base() { }
     public DoubleArray(int length) : base(length) { }
@@ -34,8 +39,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleArray clone = new DoubleArray(array);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new DoubleArray(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 4722)
@@ -30,4 +30,9 @@
   [StorableClass]
   public class DoubleMatrix : ValueTypeMatrix<double>, IStringConvertibleMatrix {
+    [StorableConstructor]
+    protected DoubleMatrix(bool deserializing) : base(deserializing) { }
+    protected DoubleMatrix(DoubleMatrix original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DoubleMatrix() : base() { }
     public DoubleMatrix(int rows, int columns) : base(rows, columns) { }
@@ -39,12 +44,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleMatrix clone = new DoubleMatrix();
-      cloner.RegisterClonedObject(this, clone);
-      clone.matrix = (double[,])matrix.Clone();
-      clone.columnNames = new List<string>(columnNames);
-      clone.rowNames = new List<string>(rowNames);
-      clone.sortableView = sortableView;
-      clone.readOnly = readOnly;
-      return clone;
+      return new DoubleMatrix(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 4722)
@@ -35,12 +35,14 @@
     }
 
+    [StorableConstructor]
+    protected DoubleValue(bool deserializing) : base(deserializing) { }
+    protected DoubleValue(DoubleValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public DoubleValue() : base() { }
     public DoubleValue(double value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleValue clone = new DoubleValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new DoubleValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/IntArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 4722)
@@ -29,4 +29,9 @@
   [StorableClass]
   public class IntArray : ValueTypeArray<int>, IStringConvertibleArray {
+    [StorableConstructor]
+    protected IntArray(bool deserializing) : base(deserializing) { }
+    protected IntArray(IntArray original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public IntArray() : base() { }
     public IntArray(int length) : base(length) { }
@@ -34,8 +39,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntArray clone = new IntArray(array);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new IntArray(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 4722)
@@ -30,4 +30,9 @@
   [StorableClass]
   public class IntMatrix : ValueTypeMatrix<int>, IStringConvertibleMatrix {
+    [StorableConstructor]
+    protected IntMatrix(bool deserializing) : base(deserializing) { }
+    protected IntMatrix(IntMatrix original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public IntMatrix() : base() { }
     public IntMatrix(int rows, int columns) : base(rows, columns) { }
@@ -39,12 +44,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntMatrix clone = new IntMatrix();
-      cloner.RegisterClonedObject(this, clone);
-      clone.matrix = (int[,])matrix.Clone();
-      clone.columnNames = new List<string>(columnNames);
-      clone.rowNames = new List<string>(rowNames);
-      clone.sortableView = sortableView;
-      clone.readOnly = readOnly;
-      return clone;
+      return new IntMatrix(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/IntValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 4722)
@@ -35,12 +35,14 @@
     }
 
+    [StorableConstructor]
+    protected IntValue(bool deserializing) : base(deserializing) { }
+    protected IntValue(IntValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public IntValue() : base() { }
     public IntValue(int value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntValue clone = new IntValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new IntValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs	(revision 4722)
@@ -28,12 +28,14 @@
   [StorableClass]
   public class PercentValue : DoubleValue {
+    [StorableConstructor]
+    protected PercentValue(bool deserializing) : base(deserializing) { }
+    protected PercentValue(PercentValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public PercentValue() : base() { }
     public PercentValue(double value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      PercentValue clone = new PercentValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new PercentValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 4722)
@@ -70,4 +70,11 @@
     }
 
+    [StorableConstructor]
+    protected StringArray(bool deserializing) : base(deserializing) { }
+    protected StringArray(StringArray original, Cloner cloner)
+      : base(original, cloner) {
+      this.array = (string[])original.array.Clone();
+      this.readOnly = original.readOnly;
+    }
     public StringArray() {
       array = new string[0];
@@ -89,9 +96,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      StringArray clone = new StringArray();
-      cloner.RegisterClonedObject(this, clone);
-      clone.array = (string[])array.Clone();
-      clone.readOnly = readOnly;
-      return clone;
+      return new StringArray(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 4722)
@@ -134,4 +134,14 @@
     }
 
+    [StorableConstructor]
+    protected StringMatrix(bool deserializing) : base(deserializing) { }
+    protected StringMatrix(StringMatrix original, Cloner cloner)
+      : base(original, cloner) {
+      this.matrix = (string[,])original.matrix.Clone();
+      this.columnNames = new List<string>(original.columnNames);
+      this.rowNames = new List<string>(original.rowNames);
+      this.sortableView = original.sortableView;
+      this.readOnly = original.readOnly;
+    }
     public StringMatrix() {
       matrix = new string[0, 0];
@@ -182,12 +192,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      StringMatrix clone = new StringMatrix();
-      cloner.RegisterClonedObject(this, clone);
-      clone.matrix = (string[,])matrix.Clone();
-      clone.columnNames = new List<string>(columnNames);
-      clone.rowNames = new List<string>(rowNames);
-      clone.sortableView = sortableView;
-      clone.readOnly = readOnly;
-      return clone;
+      return new StringMatrix(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/StringValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 4722)
@@ -55,4 +55,11 @@
     }
 
+    [StorableConstructor]
+    protected StringValue(bool deserializing) : base(deserializing) { }
+    protected StringValue(StringValue original, Cloner cloner)
+      : base(original, cloner) {
+      this.value = original.value != null ? original.value : string.Empty;
+      this.readOnly = original.readOnly;
+    }
     public StringValue() {
       this.value = string.Empty;
@@ -65,8 +72,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      StringValue clone = new StringValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new StringValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 4722)
@@ -30,12 +30,14 @@
   [StorableClass]
   public class TimeSpanValue : ValueTypeValue<TimeSpan>, IComparable, IStringConvertibleValue {
+    [StorableConstructor]
+    protected TimeSpanValue(bool deserializing) : base(deserializing) { }
+    protected TimeSpanValue(TimeSpanValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
     public TimeSpanValue() : base() { }
     public TimeSpanValue(TimeSpan value) : base(value) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      TimeSpanValue clone = new TimeSpanValue(value);
-      cloner.RegisterClonedObject(this, clone);
-      clone.readOnly = readOnly;
-      return clone;
+      return new TimeSpanValue(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 4722)
@@ -68,4 +68,11 @@
     }
 
+    [StorableConstructor]
+    protected ValueTypeArray(bool deserializing) : base(deserializing) { }
+    protected ValueTypeArray(ValueTypeArray<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.array = (T[])original.array.Clone();
+      this.readOnly = original.readOnly;
+    }
     protected ValueTypeArray() {
       array = new T[0];
@@ -80,11 +87,4 @@
       array = (T[])elements.Clone();
       readOnly = false;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ValueTypeArray<T> clone = (ValueTypeArray<T>)base.Clone(cloner);
-      clone.array = (T[])array.Clone();
-      clone.readOnly = readOnly;
-      return clone;
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 4722)
@@ -132,4 +132,14 @@
     }
 
+    [StorableConstructor]
+    protected ValueTypeMatrix(bool deserializing) : base(deserializing) { }
+    protected ValueTypeMatrix(ValueTypeMatrix<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.matrix = (T[,])original.matrix.Clone();
+      this.columnNames = new List<string>(original.columnNames);
+      this.rowNames = new List<string>(original.rowNames);
+      this.sortableView = original.sortableView;
+      this.readOnly = original.readOnly;
+    }
     protected ValueTypeMatrix() {
       matrix = new T[0, 0];
@@ -169,14 +179,4 @@
       : this(elements,columnNames) {
       RowNames = rowNames;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ValueTypeMatrix<T> clone = (ValueTypeMatrix<T>)base.Clone(cloner);
-      clone.matrix = (T[,])matrix.Clone();
-      clone.columnNames = new List<string>(columnNames);
-      clone.rowNames = new List<string>(rowNames);
-      clone.sortableView = sortableView;
-      clone.readOnly = readOnly;
-      return clone;
     }
 
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 4497)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 4722)
@@ -53,4 +53,11 @@
     }
 
+    [StorableConstructor]
+    protected ValueTypeValue(bool deserializing) : base(deserializing) { }
+    protected ValueTypeValue(ValueTypeValue<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.value = original.value;
+      this.readOnly = original.readOnly;
+    }
     protected ValueTypeValue() {
       this.value = default(T);
@@ -60,11 +67,4 @@
       this.value = value;
       this.readOnly = false;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ValueTypeValue<T> clone = (ValueTypeValue<T>)base.Clone(cloner);
-      clone.value = value;
-      clone.readOnly = readOnly;
-      return clone;
     }
 
