Index: /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeStringFormatter.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeStringFormatter.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeStringFormatter.cs	(revision 4696)
@@ -24,9 +24,9 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  [StorableClass]
+  
   public class SymbolicExpressionTreeStringFormatter {
-    [Storable]
+    
     public bool Indent { get; set; }
-
+    
     public SymbolicExpressionTreeStringFormatter()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ConnectionInfo.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ConnectionInfo.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Operators.Views.GraphVisualization/3.3/General/ConnectionInfo.cs	(revision 4696)
@@ -29,6 +29,6 @@
   public class ConnectionInfo : DeepCloneable, IConnectionInfo {
     [StorableConstructor]
-    private ConnectionInfo(bool deserializing) : base() { }
-    private ConnectionInfo(ConnectionInfo original, Cloner cloner)
+    protected ConnectionInfo(bool deserializing) : base() { }
+    protected ConnectionInfo(ConnectionInfo original, Cloner cloner)
       : base(original, cloner) {
       from = cloner.Clone(original.from);
Index: /branches/CloningRefactoring/HeuristicLab.Optimization/3.3/UserDefinedProblem.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Optimization/3.3/UserDefinedProblem.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Optimization/3.3/UserDefinedProblem.cs	(revision 4696)
@@ -221,5 +221,5 @@
     [Item("EmptyUserDefinedProblemEvaluator", "A dummy evaluator that will throw an exception when executed.")]
     [StorableClass]
-    private class EmptyUserDefinedProblemEvaluator : ParameterizedNamedItem, ISingleObjectiveEvaluator {
+    private sealed class EmptyUserDefinedProblemEvaluator : ParameterizedNamedItem, ISingleObjectiveEvaluator {
 
       [StorableConstructor]
Index: /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Classification/3.3/Symbolic/Analyzer/ValidationBestSymbolicClassificationSolutionAnalyzer.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Classification/3.3/Symbolic/Analyzer/ValidationBestSymbolicClassificationSolutionAnalyzer.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Classification/3.3/Symbolic/Analyzer/ValidationBestSymbolicClassificationSolutionAnalyzer.cs	(revision 4696)
@@ -182,5 +182,5 @@
 
     [StorableConstructor]
-    private ValidationBestSymbolicClassificationSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected ValidationBestSymbolicClassificationSolutionAnalyzer(bool deserializing) : base(deserializing) { }
     protected ValidationBestSymbolicClassificationSolutionAnalyzer(ValidationBestSymbolicClassificationSolutionAnalyzer original, Cloner cloner)
       : base(original, cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.TestFunctions/3.3/MoveEvaluators/RealVectorAdditiveMoveWrapper.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.TestFunctions/3.3/MoveEvaluators/RealVectorAdditiveMoveWrapper.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.TestFunctions/3.3/MoveEvaluators/RealVectorAdditiveMoveWrapper.cs	(revision 4696)
@@ -21,4 +21,5 @@
 
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.TestFunctions {
@@ -26,9 +27,16 @@
   /// This wrapper disguises as real vector for use in the evaluation functions.
   /// </summary>
-  internal class RealVectorAdditiveMoveWrapper : RealVector {
+  internal sealed class RealVectorAdditiveMoveWrapper : RealVector {
     private int dimension;
     private double moveDistance;
     private RealVector vector;
 
+    private RealVectorAdditiveMoveWrapper(bool deserializing) : base(deserializing) { }
+    private RealVectorAdditiveMoveWrapper(RealVectorAdditiveMoveWrapper original, Cloner cloner)
+      : base(original, cloner) {
+      this.dimension = original.dimension;
+      this.moveDistance = original.moveDistance;
+      this.vector = cloner.Clone(vector);
+    }
     public RealVectorAdditiveMoveWrapper() {
       dimension = -1;
@@ -40,4 +48,8 @@
       moveDistance = move.MoveDistance;
       this.vector = vector;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorAdditiveMoveWrapper(this, cloner);
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/IntraRouteInversion/AlbaIntraRouteInversionMoveMaker.cs	(revision 4696)
@@ -46,8 +46,6 @@
 
     [StorableConstructor]
-    private AlbaIntraRouteInversionMoveMaker(bool deserializing) : base(deserializing) { }
-    private AlbaIntraRouteInversionMoveMaker(AlbaIntraRouteInversionMoveMaker original, Cloner cloner)
-      : base(original, cloner) {
-    }
+    protected AlbaIntraRouteInversionMoveMaker(bool deserializing) : base(deserializing) { }
+    protected AlbaIntraRouteInversionMoveMaker(AlbaIntraRouteInversionMoveMaker original, Cloner cloner) : base(original, cloner) { }
     public AlbaIntraRouteInversionMoveMaker()
       : base() {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Alba/Moves/LambdaInterchange/AlbaLambdaInterchangeMoveMaker.cs	(revision 4696)
@@ -47,5 +47,5 @@
 
     [StorableConstructor]
-    private AlbaLambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
+    protected AlbaLambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
     protected AlbaLambdaInterchangeMoveMaker(AlbaLambdaInterchangeMoveMaker original, Cloner cloner)
       : base(original, cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Creators/MultiVRPSolutionCreator.cs	(revision 4696)
@@ -79,5 +79,5 @@
 
     [StorableConstructor]
-    private MultiVRPSolutionCreator(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionCreator(bool deserializing) : base(deserializing) { }
     protected MultiVRPSolutionCreator(MultiVRPSolutionCreator original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Crossovers/MultiVRPSolutionCrossover.cs	(revision 4696)
@@ -83,5 +83,5 @@
 
     [StorableConstructor]
-    private MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionCrossover(bool deserializing) : base(deserializing) { }
     protected MultiVRPSolutionCrossover(MultiVRPSolutionCrossover original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Manipulators/MultiVRPSolutionManipulator.cs	(revision 4696)
@@ -79,5 +79,5 @@
 
     [StorableConstructor]
-    private MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
+    protected MultiVRPSolutionManipulator(bool deserializing) : base(deserializing) { }
     protected MultiVRPSolutionManipulator(MultiVRPSolutionManipulator original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveGenerator.cs	(revision 4696)
@@ -98,6 +98,6 @@
 
     [StorableConstructor]
-    private MultiVRPMoveGenerator(bool deserializing) : base(deserializing) { }
-    private MultiVRPMoveGenerator(MultiVRPMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    protected MultiVRPMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected MultiVRPMoveGenerator(MultiVRPMoveGenerator original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new MultiVRPMoveGenerator(this, cloner);
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveMaker.cs	(revision 4696)
@@ -80,5 +80,5 @@
 
     [StorableConstructor]
-    private LambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
+    protected LambdaInterchangeMoveMaker(bool deserializing) : base(deserializing) { }
     protected LambdaInterchangeMoveMaker(LambdaInterchangeMoveMaker original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Potvin/PotvinEncoding.cs	(revision 4696)
@@ -34,8 +34,6 @@
     public List<int> Unrouted { get; set; }
 
-    public PotvinEncoding()
-      : base() {
-      Unrouted = new List<int>();
-    }
+    [StorableConstructor]
+    protected PotvinEncoding(bool deserializing) : base(deserializing) { }
     protected PotvinEncoding(PotvinEncoding original, Cloner cloner)
       : base(original, cloner) {
@@ -43,10 +41,11 @@
       Unrouted = new List<int>(original.Unrouted);
     }
+    public PotvinEncoding()
+      : base() {
+      Unrouted = new List<int>();
+    }
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new PotvinEncoding(this, cloner);
-    }
-    [StorableConstructor]
-    private PotvinEncoding(bool serializing)
-      : base() {
     }
 
Index: /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Problems.VehicleRouting/3.3/Encodings/Zhu/ZhuEncoding.cs	(revision 4696)
@@ -125,8 +125,5 @@
 
     [StorableConstructor]
-    private ZhuEncoding(bool serializing)
-      : base(serializing) {
-    }
-
+    protected ZhuEncoding(bool deserializing) : base(deserializing) { }
     protected ZhuEncoding(ZhuEncoding original, Cloner cloner)
       : base(original, cloner) {
Index: /branches/CloningRefactoring/HeuristicLab.Selection/3.3/GenderSpecificSelector.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Selection/3.3/GenderSpecificSelector.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Selection/3.3/GenderSpecificSelector.cs	(revision 4696)
@@ -81,16 +81,8 @@
 
     [StorableConstructor]
-    private GenderSpecificSelector(bool deserializing) : base(deserializing) { }
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      Initialize();
-    }
-
+    protected GenderSpecificSelector(bool deserializing) : base(deserializing) { }
     protected GenderSpecificSelector(GenderSpecificSelector original, Cloner cloner)
       : base(original, cloner) {
       Initialize();
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new GenderSpecificSelector(this, cloner);
     }
 
@@ -131,4 +123,13 @@
       #endregion
 
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GenderSpecificSelector(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
       Initialize();
     }
Index: /branches/CloningRefactoring/HeuristicLab.Selection/3.3/OffspringSelector.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab.Selection/3.3/OffspringSelector.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab.Selection/3.3/OffspringSelector.cs	(revision 4696)
@@ -63,8 +63,6 @@
 
     [StorableConstructor]
-    private OffspringSelector(bool deserializing) : base(deserializing) { }
-    private OffspringSelector(OffspringSelector original, Cloner cloner)
-      : base(original, cloner) {
-    }
+    protected OffspringSelector(bool deserializing) : base(deserializing) { }
+    protected OffspringSelector(OffspringSelector original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new OffspringSelector(this, cloner);
Index: /branches/CloningRefactoring/HeuristicLab/3.3/Tests/StorableConstructorTest.cs
===================================================================
--- /branches/CloningRefactoring/HeuristicLab/3.3/Tests/StorableConstructorTest.cs	(revision 4695)
+++ /branches/CloningRefactoring/HeuristicLab/3.3/Tests/StorableConstructorTest.cs	(revision 4696)
@@ -31,6 +31,6 @@
           if (storableType.IsSealed && !storableConstructor.IsPrivate)
             errorMessage.Append(Environment.NewLine + storableType.ToString() + ": Storable constructor must be private in sealed classes.");
-          else if (!storableType.IsSealed && !storableConstructor.IsFamily)
-            errorMessage.Append(Environment.NewLine + storableType.ToString() + ": Storable constructor must be protected.");
+          else if (!storableType.IsSealed && !(storableConstructor.IsFamily || storableConstructor.IsPublic))
+            errorMessage.Append(Environment.NewLine + storableType.ToString() + ": Storable constructor must be protected (can be public in rare cases).");
         }
       }
