Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/Analyzers/BestKnapsackSolutionAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/Analyzers/BestKnapsackSolutionAnalyzer.cs	(revision 4513)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/Analyzers/BestKnapsackSolutionAnalyzer.cs	(revision 4722)
@@ -21,4 +21,5 @@
 
 using System.Linq;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -35,5 +36,5 @@
   [Item("BestKnapsackSolutionAnalyzer", "An operator for analyzing the best solution for a Knapsack problem.")]
   [StorableClass]
-  class BestKnapsackSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public class BestKnapsackSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
     public LookupParameter<BoolValue> MaximizationParameter {
       get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
@@ -67,4 +68,7 @@
     }
 
+    [StorableConstructor]
+    protected BestKnapsackSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected BestKnapsackSolutionAnalyzer(BestKnapsackSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public BestKnapsackSolutionAnalyzer()
       : base() {
@@ -80,4 +84,8 @@
       Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution."));
       Parameters.Add(new LookupParameter<BinaryVector>("BestKnownSolution", "The best known solution."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestKnapsackSolutionAnalyzer(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/Evaluators/KnapsackEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/Evaluators/KnapsackEvaluator.cs	(revision 4513)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/Evaluators/KnapsackEvaluator.cs	(revision 4722)
@@ -21,4 +21,5 @@
 
 using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -68,4 +69,7 @@
     }
 
+    [StorableConstructor]
+    protected KnapsackEvaluator(bool deserializing) : base(deserializing) { }
+    protected KnapsackEvaluator(KnapsackEvaluator original, Cloner cloner) : base(original, cloner) { }
     public KnapsackEvaluator()
       : base() {
@@ -79,4 +83,8 @@
       Parameters.Add(new LookupParameter<IntArray>("Values", "The values of the items."));
       Parameters.Add(new LookupParameter<DoubleValue>("Penalty", "The penalty value for each unit of overweight."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KnapsackEvaluator(this, cloner);
     }
 
Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 4513)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 4722)
@@ -141,4 +141,12 @@
     [StorableConstructor]
     private KnapsackProblem(bool deserializing) : base(deserializing) { }
+    private KnapsackProblem(KnapsackProblem original, Cloner cloner)
+      : base(original, cloner) {
+      this.operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
+      AttachEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KnapsackProblem(this, cloner);
+    }
     public KnapsackProblem()
       : base() {
@@ -167,11 +175,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      KnapsackProblem clone = (KnapsackProblem)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      clone.AttachEventHandlers();
-      return clone;
-    }
-
     #region Events
     public event EventHandler SolutionCreatorChanged;
@@ -257,5 +258,5 @@
     #region Helpers
     [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
+    private void AfterDeserialization() {
       // BackwardsCompatibility3.3
       #region Backwards compatible code (remove with 3.4)
Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackSolution.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackSolution.cs	(revision 4513)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackSolution.cs	(revision 4722)
@@ -109,4 +109,18 @@
     }
 
+    [StorableConstructor]
+    protected KnapsackSolution(bool deserializing) : base(deserializing) { }
+    protected KnapsackSolution(KnapsackSolution original, Cloner cloner)
+      : base(original, cloner) {
+      this.binaryVector = cloner.Clone(original.binaryVector);
+      this.quality = cloner.Clone(original.quality);
+      this.capacity = cloner.Clone(original.capacity);
+      this.weights = cloner.Clone(original.weights);
+      this.values = cloner.Clone(original.values);
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KnapsackSolution(this, cloner);
+    }
     public KnapsackSolution() : base() { }
     public KnapsackSolution(BinaryVector binaryVector, DoubleValue quality, IntValue capacity, IntArray weights, IntArray values)
@@ -119,8 +133,10 @@
       Initialize();
     }
-    [StorableConstructor]
-    private KnapsackSolution(bool deserializing) : base(deserializing) { }
 
     [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
     private void Initialize() {
       if (binaryVector != null) RegisterBinaryVectorEvents();
@@ -131,16 +147,4 @@
     }
 
-    public override IDeepCloneable Clone(Cloner cloner) {
-      KnapsackSolution clone = new KnapsackSolution();
-      cloner.RegisterClonedObject(this, clone);
-      clone.binaryVector = (BinaryVector)cloner.Clone(binaryVector);
-      clone.quality = (DoubleValue)cloner.Clone(quality);
-      clone.capacity = (IntValue)cloner.Clone(capacity);
-      clone.weights = (IntArray)cloner.Clone(weights);
-      clone.values = (IntArray)cloner.Clone(values);
-      clone.Initialize();
-      return clone;
-    }
-
     #region Events
     public event EventHandler BinaryVectorChanged;
Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackMoveEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackMoveEvaluator.cs	(revision 4513)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackMoveEvaluator.cs	(revision 4722)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -57,4 +58,7 @@
     }
 
+    [StorableConstructor]
+    protected KnapsackMoveEvaluator(bool deserializing) : base(deserializing) { }
+    protected KnapsackMoveEvaluator(KnapsackMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
     protected KnapsackMoveEvaluator()
       : base() {
Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackOneBitflipMoveEvaluator.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackOneBitflipMoveEvaluator.cs	(revision 4513)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackOneBitflipMoveEvaluator.cs	(revision 4722)
@@ -20,4 +20,5 @@
 #endregion
 
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -37,7 +38,14 @@
     }
 
+    [StorableConstructor]
+    protected KnapsackOneBitflipMoveEvaluator(bool deserializing) : base(deserializing) { }
+    protected KnapsackOneBitflipMoveEvaluator(KnapsackOneBitflipMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
     public KnapsackOneBitflipMoveEvaluator()
       : base() {
       Parameters.Add(new LookupParameter<OneBitflipMove>("OneBitflipMove", "The move to evaluate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KnapsackOneBitflipMoveEvaluator(this, cloner);
     }
 
