Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/BasicMultiObjectiveQualityAnalyzer.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/BasicMultiObjectiveQualityAnalyzer.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/BasicMultiObjectiveQualityAnalyzer.cs	(revision 4902)
@@ -30,4 +30,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -45,4 +46,7 @@
     }
 
+    [StorableConstructor]
+    protected BasicMultiObjectiveQualityAnalyzer(bool deserializing) : base(deserializing) { }
+    protected BasicMultiObjectiveQualityAnalyzer(BasicMultiObjectiveQualityAnalyzer original, Cloner cloner) : base(original, cloner) { }
     public BasicMultiObjectiveQualityAnalyzer() {
       Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of solution describes to which front it belongs."));
@@ -87,4 +91,8 @@
       return base.Apply();
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BasicMultiObjectiveQualityAnalyzer(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdedComparisonSorter.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdedComparisonSorter.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdedComparisonSorter.cs	(revision 4902)
@@ -28,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -47,4 +48,7 @@
     }
 
+    [StorableConstructor]
+    protected CrowdedComparisonSorter(bool deserializing) : base(deserializing) { }
+    protected CrowdedComparisonSorter(CrowdedComparisonSorter original, Cloner cloner) : base(original, cloner) { }
     public CrowdedComparisonSorter() {
       Parameters.Add(new ScopeTreeLookupParameter<IntValue>("Rank", "The rank of the solution."));
@@ -88,4 +92,8 @@
       #endregion
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CrowdedComparisonSorter(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdedTournamentSelector.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdedTournamentSelector.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdedTournamentSelector.cs	(revision 4902)
@@ -28,4 +28,5 @@
 using HeuristicLab.Selection;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -63,4 +64,7 @@
     }
 
+    [StorableConstructor]
+    protected CrowdedTournamentSelector(bool deserializing) : base(deserializing) { }
+    protected CrowdedTournamentSelector(CrowdedTournamentSelector original, Cloner cloner) : base(original, cloner) { }
     public CrowdedTournamentSelector()
       : base() {
@@ -108,4 +112,8 @@
       return selected;
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CrowdedTournamentSelector(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdingDistanceAssignment.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdingDistanceAssignment.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/CrowdingDistanceAssignment.cs	(revision 4902)
@@ -28,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -48,4 +49,5 @@
     [StorableConstructor]
     protected CrowdingDistanceAssignment(bool deserializing) : base(deserializing) { }
+    protected CrowdingDistanceAssignment(CrowdingDistanceAssignment original, Cloner cloner) : base(original, cloner) { }
     public CrowdingDistanceAssignment() {
       Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The vector of quality values."));
@@ -114,4 +116,8 @@
       #endregion
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CrowdingDistanceAssignment(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/DefaultCrossover.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/DefaultCrossover.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/DefaultCrossover.cs	(revision 4902)
@@ -25,4 +25,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -34,4 +35,8 @@
     }
 
+
+    [StorableConstructor]
+    protected DefaultCrossover(bool deserializing) : base(deserializing) { }
+    protected DefaultCrossover(DefaultCrossover original, Cloner cloner) : base(original, cloner) { }
     public DefaultCrossover()
       : base() {
@@ -49,4 +54,8 @@
       return base.Apply();
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DefaultCrossover(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/FastNonDominatedSort.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/FastNonDominatedSort.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/FastNonDominatedSort.cs	(revision 4902)
@@ -27,4 +27,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -51,4 +52,7 @@
     }
 
+    [StorableConstructor]
+    protected FastNonDominatedSort(bool deserializing) : base(deserializing) { }
+    protected FastNonDominatedSort(FastNonDominatedSort original, Cloner cloner) : base(original, cloner) { }
     public FastNonDominatedSort() {
       Parameters.Add(new ValueLookupParameter<BoolArray>("Maximization", "Whether each objective is maximization or minimization."));
@@ -151,4 +155,8 @@
       fronts[i].Add(p);
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new FastNonDominatedSort(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2.cs	(revision 4902)
@@ -40,5 +40,5 @@
   [Creatable("Algorithms")]
   [StorableClass]
-  public class NSGA2 : EngineAlgorithm {
+  public class NSGA2 : EngineAlgorithm, IStorableContent {
     #region Problem Properties
     public override Type ProblemType {
@@ -150,5 +150,9 @@
 
     [StorableConstructor]
-    public NSGA2(bool deserializing) : base(deserializing) { }
+    protected NSGA2(bool deserializing) : base(deserializing) { }
+    protected NSGA2(NSGA2 original, Cloner cloner) : base (original, cloner) {
+      basicMOQualityAnalyzer = (BasicMultiObjectiveQualityAnalyzer)cloner.Clone(original.basicMOQualityAnalyzer);
+      AttachEventHandlers();
+    }
     public NSGA2() {
       Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
@@ -214,8 +218,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      NSGA2 clone = (NSGA2)base.Clone(cloner);
-      clone.basicMOQualityAnalyzer = (BasicMultiObjectiveQualityAnalyzer)cloner.Clone(basicMOQualityAnalyzer);
-      clone.AttachEventHandlers();
-      return clone;
+      return new NSGA2(this, cloner);      
     }
 
@@ -375,4 +376,9 @@
     }
     #endregion
+
+    public string Filename {
+      get;
+      set;
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/NSGA2MainLoop.cs	(revision 4902)
@@ -27,4 +27,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.Selection;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -78,5 +79,6 @@
 
     [StorableConstructor]
-    private NSGA2MainLoop(bool deserializing) : base() { }
+    protected NSGA2MainLoop(bool deserializing) : base(deserializing) { }
+    protected NSGA2MainLoop(NSGA2MainLoop original, Cloner cloner) : base(original, cloner) { }
     public NSGA2MainLoop()
       : base() {
@@ -218,4 +220,8 @@
       #endregion
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NSGA2MainLoop(this, cloner);
+    }
   }
 }
Index: /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/RankAndCrowdingSorter.cs
===================================================================
--- /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/RankAndCrowdingSorter.cs	(revision 4901)
+++ /branches/NSGA2/HeuristicLab.Algorithms.NSGA2/3.3/RankAndCrowdingSorter.cs	(revision 4902)
@@ -25,4 +25,6 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Selection;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Algorithms.NSGA2 {
@@ -41,4 +43,7 @@
     }
 
+    [StorableConstructor]
+    protected RankAndCrowdingSorter(bool deserializing) : base(deserializing) { }
+    protected RankAndCrowdingSorter(RankAndCrowdingSorter original, Cloner cloner) : base(original, cloner) { }
     public RankAndCrowdingSorter()
       : base() {
@@ -72,4 +77,8 @@
       mergingReducer.Successor = null;
     }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RankAndCrowdingSorter(this, cloner);
+    }
   }
 }
