Index: /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs
===================================================================
--- /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17614)
+++ /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17615)
@@ -22,5 +22,5 @@
     [Item("NSGA-III", "The Reference Point Based Non-dominated Sorting Genetic Algorithm III was introduced in Deb et al. 2013. An Evolutionary Many-Objective Optimization Algorithm Using Reference Point Based Non-dominated Sorting Approach. IEEE Transactions on Evolutionary Computation, 18(4), pp. 577-601.")]
     [Creatable(Category = CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 136)]
-    [StorableType("30DF878D-D655-4E76-B3AD-2292C9DD6C5F")]
+    [StorableType("07C745F7-A8A3-4F99-8B2C-F97E639F9AC3")]
     public class NSGA3 : BasicAlgorithm
     {
@@ -49,4 +49,7 @@
         [Storable]
         private Solution[] solutions;
+
+        [Storable]
+        private List<ReferencePoint> referencePoints;
 
         #endregion Storable fields
@@ -182,6 +185,6 @@
 
             InitFields();
+            InitReferencePoints();
             InitResults();
-            InitReferencePoints();
             Analyze();
         }
@@ -200,18 +203,4 @@
             random = new MersenneTwister();
             InitSolutions();
-        }
-
-        private void InitResults()
-        {
-            Results.Add(new Result(GeneratedReferencePointsResultName, "The initially generated reference points", new DoubleMatrix()));
-            Results.Add(new Result(CurrentFrontResultName, "The Pareto Front", new DoubleMatrix()));
-        }
-
-        private void InitReferencePoints()
-        {
-            // Generate reference points and add them to results
-            int nDiv = 5; // todo: figure out the correct number of divisions
-            List<ReferencePoint> referencePoints = ReferencePoint.GenerateReferencePoints(Problem.Encoding.Length, nDiv);
-            ResultsGeneratedReferencePoints = Utility.ConvertToDoubleMatrix(referencePoints);
         }
 
@@ -233,4 +222,29 @@
                 solutions[i].Fitness = Evaluate(solutions[i].Chromosome);
             }
+        }
+
+        private void InitReferencePoints()
+        {
+            // Generate reference points and add them to results
+            int nDiv = 5; // todo: figure out the correct number of divisions
+            referencePoints = ReferencePoint.GenerateReferencePoints(Problem.Encoding.Length, nDiv);
+            ResultsGeneratedReferencePoints = Utility.ConvertToDoubleMatrix(referencePoints);
+        }
+
+        private void InitResults()
+        {
+            Results.Add(new Result(GeneratedReferencePointsResultName, "The initially generated reference points", Utility.ConvertToDoubleMatrix(referencePoints)));
+            Results.Add(new Result(CurrentFrontResultName, "The Pareto Front", new DoubleMatrix()));
+        }
+
+        private void Analyze()
+        {
+            ResultsSolutions = solutions.Select(s => s.Chromosome.ToArray()).ToMatrix();
+            Problem.Analyze(
+                solutions.Select(s => (Individual)new SingleEncodingIndividual(Problem.Encoding, new Scope { Variables = { new Variable(Problem.Encoding.Name, s.Chromosome) } })).ToArray(),
+                solutions.Select(s => s.Fitness).ToArray(),
+                Results,
+                random
+                );
         }
 
@@ -246,15 +260,4 @@
         }
 
-        private void Analyze()
-        {
-            ResultsSolutions = solutions.Select(s => s.Chromosome.ToArray()).ToMatrix();
-            Problem.Analyze(
-                solutions.Select(s => (Individual)new SingleEncodingIndividual(Problem.Encoding, new Scope { Variables = { new Variable(Problem.Encoding.Name, s.Chromosome) } })).ToArray(),
-                solutions.Select(s => s.Fitness).ToArray(),
-                Results,
-                random
-                );
-        }
-
         #endregion Private Methods
     }
Index: /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/ReferencePoint.cs
===================================================================
--- /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/ReferencePoint.cs	(revision 17614)
+++ /branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/ReferencePoint.cs	(revision 17615)
@@ -1,3 +1,5 @@
 ﻿using System.Collections.Generic;
+using HEAL.Attic;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.NSGA3
@@ -9,23 +11,41 @@
      */
 
-    internal class ReferencePoint
+    [StorableType("96DCBD85-7C8B-4546-B6F5-FB4AE0DF7158")]
+    internal class ReferencePoint : IDeepCloneable
     {
+        #region Storable Properties
+
+        public double[] Values { get; }
+
+        #endregion Storable Properties
+
+        #region Properties
+
+        public int NumberOfDimensions => Values.Length;
+
+        #endregion Properties
+
         public ReferencePoint(int numberOfDimensions)
         {
-            NumberOfDimensions = numberOfDimensions;
-            Values = new double[NumberOfDimensions];
+            Values = new double[numberOfDimensions];
         }
 
         public ReferencePoint(ReferencePoint other)
         {
-            NumberOfDimensions = other.NumberOfDimensions;
-            Values = new double[NumberOfDimensions];
-            for (int i = 0; i < NumberOfDimensions; i++)
+            Values = new double[other.NumberOfDimensions];
+            for (int i = 0; i < other.NumberOfDimensions; i++)
                 Values[i] = other.Values[i];
         }
 
-        public int NumberOfDimensions { get; }
+        public IDeepCloneable Clone(Cloner cloner)
+        {
+            // no cloner is required to copy a Reference Point
+            return new ReferencePoint(this);
+        }
 
-        public double[] Values { get; }
+        public object Clone()
+        {
+            return new Cloner().Clone(this);
+        }
 
         // todo: use this (for optimization)
@@ -43,4 +63,5 @@
         }
 
+        // maybe todo: move this to another class?
         /// <summary>
         /// Generate reference points that are evenly distributed over a hyperplane with dimensions
