Index: branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3-3.3.Test/UtilityTests.cs
===================================================================
--- branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3-3.3.Test/UtilityTests.cs	(revision 17666)
+++ branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3-3.3.Test/UtilityTests.cs	(revision 17667)
@@ -13,5 +13,9 @@
         [DataRow(3, 6)]
         [DataRow(4, 24)]
-        public void TestFactorial(int input, int result)
+        [DataRow(10, 3628800)]
+        [DataRow(12, 479001600)]
+        [DataRow(13, 6227020800)]
+        [DataRow(14, 87178291200)]
+        public void TestFactorial(int input, long result)
         {
             Assert.AreEqual(result, Utility.Factorial(input));
@@ -21,8 +25,15 @@
         [DataRow(-1)]
         [DataRow(31)]
-        public void TestFactorial2(int input)
+        public void TestFactorialConstraint(int input)
         {
             Assert.ThrowsException<InvalidOperationException>(() => { Utility.Factorial(input); });
         }
+
+        [DataTestMethod]
+        [DataRow(14, 12, 91)]
+        public void TestNCR(int n, int r, int result)
+        {
+            Assert.AreEqual(result, Utility.NCR(n, r));
+        }
     }
 }
Index: branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/HeuristicLab.Algorithms.NSGA3-3.3.csproj
===================================================================
--- branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/HeuristicLab.Algorithms.NSGA3-3.3.csproj	(revision 17666)
+++ branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/HeuristicLab.Algorithms.NSGA3-3.3.csproj	(revision 17667)
@@ -118,4 +118,10 @@
     <Compile Include="Utility.cs" />
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\trunk\HeuristicLab.Problems.TestFunctions.MultiObjective\3.3\HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj">
+      <Project>{D53E8E48-CFAA-4F57-AC35-63BEF4476159}</Project>
+      <Name>HeuristicLab.Problems.TestFunctions.MultiObjective-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs
===================================================================
--- branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17666)
+++ branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/NSGA3.cs	(revision 17667)
@@ -11,4 +11,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
+using HeuristicLab.Problems.TestFunctions.MultiObjective;
 using HeuristicLab.Random;
 
@@ -41,5 +42,12 @@
         }
 
-        public int NumberOfObjectives => Problem.Maximization.Length;
+        public int NumberOfObjectives
+        {
+            get
+            {
+                if (!(Problem is MultiObjectiveTestFunctionProblem testFunctionProblem)) throw new NotSupportedException("Only test multi objective test function problems are supported");
+                return testFunctionProblem.Objectives;
+            }
+        }
 
         #endregion ProblemProperties
@@ -211,5 +219,6 @@
             base.Initialize(cancellationToken);
 
-            PopulationSize.Value = ReferencePoint.GetNumberOfGeneratedReferencePoints(Problem.Maximization.Length);
+            int pop = ReferencePoint.GetNumberOfGeneratedReferencePoints(NumberOfObjectives);
+            PopulationSize.Value = pop;
             InitResults();
             InitReferencePoints();
@@ -264,5 +273,4 @@
                 // create copies of generated reference points (to preserve the original ones for
                 // the next generation) maybe todo: use cloner?
-                //ToNextGeneration(CreateCopyOfReferencePoints());
 
                 List<Solution> qt = Mutate(Recombine(solutions));
Index: branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/ReferencePoint.cs
===================================================================
--- branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/ReferencePoint.cs	(revision 17666)
+++ branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/ReferencePoint.cs	(revision 17667)
@@ -45,5 +45,5 @@
         /// <param name="nDim"></param>
         /// <returns></returns>
-        internal static int GetNumberOfGeneratedReferencePoints(int nDim)
+        public static int GetNumberOfGeneratedReferencePoints(int nDim)
         {
             int outerDiv;
@@ -80,10 +80,15 @@
             }
 
-            return GetNumberOfGeneratedReferencePoints(nDim, outerDiv, innerDiv);
-        }
-
-        internal static int GetNumberOfGeneratedReferencePoints(int nDim, int outerDiv, int innerDiv = 0)
-        {
-            return Utility.NCR(nDim + outerDiv - 1, outerDiv) + (innerDiv == 0 ? 0 : Utility.NCR(nDim + innerDiv - 1, innerDiv));
+            int nRefPoints = GetNumberOfGeneratedReferencePoints(nDim, outerDiv, innerDiv);
+            return nRefPoints;
+            //return GetNumberOfGeneratedReferencePoints(nDim, outerDiv, innerDiv);
+        }
+
+        public static int GetNumberOfGeneratedReferencePoints(int nDim, int outerDiv, int innerDiv = 0)
+        {
+            int outerPoints = Utility.NCR(nDim + outerDiv - 1, outerDiv);
+            int innerPoints = innerDiv == 0 ? 0 : Utility.NCR(nDim + innerDiv - 1, innerDiv);
+            int nRefPoints = outerPoints + innerPoints;
+            return nRefPoints;
         }
 
@@ -101,5 +106,5 @@
         /// <param name="nDim">The dimensionality of the Reference Points</param>
         /// <returns></returns>
-        internal static List<ReferencePoint> GenerateReferencePoints(IRandom random, int nDim)
+        public static List<ReferencePoint> GenerateReferencePoints(IRandom random, int nDim)
         {
             List<ReferencePoint> referencePoints;
@@ -151,5 +156,5 @@
         /// not have inner reference points
         /// </returns>
-        internal static List<ReferencePoint> GenerateReferencePoints(IRandom random, int nDim, int outerDiv, int innerDiv = 0)
+        public static List<ReferencePoint> GenerateReferencePoints(IRandom random, int nDim, int outerDiv, int innerDiv = 0)
         {
             if (nDim <= 0) throw new ArgumentException("nDim must be greater than 0");
Index: branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/Utility.cs
===================================================================
--- branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/Utility.cs	(revision 17666)
+++ branches/2825-NSGA3/HeuristicLab.Algorithms.NSGA3/3.3/Utility.cs	(revision 17667)
@@ -6,7 +6,7 @@
 namespace HeuristicLab.Algorithms.NSGA3
 {
-    internal static class Utility
+    public static class Utility
     {
-        internal static List<T> Concat<T>(List<T> list1, List<T> list2)
+        public static List<T> Concat<T>(List<T> list1, List<T> list2)
         {
             List<T> resultList = new List<T>(list1.Count + list2.Count);
@@ -25,20 +25,20 @@
         /// <param name="r"></param>
         /// <returns></returns>
-        /// <exception cref="ArgumentException">
+        /// <exception cref="InvalidOperationException">
         /// Thrown, when <paramref name="r" /> &gt; <paramref name="n" /> or when <paramref name="r"
         /// /> &lt; 1.
         /// </exception>
-        internal static int NCR(int n, int r)
+        public static int NCR(int n, int r)
         {
-            if (n < r) throw new ArgumentException($"Constraint was not met: n >= r (n = {n}, r = {r})");
-            if (r < 1) throw new ArgumentException($"Constraint was not met: r >= 1 (r = {r})");
-            if (n == r) return n;
-            return Factorial(n) / (Factorial(r) * Factorial(n - r));
+            if (n < r) throw new InvalidOperationException($"Constraint was not met: n >= r (n = {n}, r = {r})");
+            if (r < 1) throw new InvalidOperationException($"Constraint was not met: r >= 1 (r = {r})");
+            if (n == r) return 1;
+            return (int)(Factorial(n) / (Factorial(r) * Factorial(n - r)));
         }
 
-        internal static int Factorial(int n)
+        public static long Factorial(int n)
         {
-            if (n <= 0) throw new ArgumentException($"Constraint for n was not met: 0 < n <= 30 (n = {n})");
-            int product = 1;
+            if (n < 0 || n > 30) throw new InvalidOperationException($"Constraint for n was not met: 0 <= n <= 30 (n = {n})");
+            long product = 1;
             for (int i = 2; i <= n; i++)
                 product *= i;
@@ -47,10 +47,10 @@
         }
 
-        internal static DoubleMatrix ConvertToDoubleMatrix(List<ReferencePoint> referencePoints)
+        public static DoubleMatrix ConvertToDoubleMatrix(List<ReferencePoint> referencePoints)
         {
             return new DoubleMatrix(ToArray(referencePoints));
         }
 
-        internal static double[][] ToFitnessMatrix(this List<Solution> solutions)
+        public static double[][] ToFitnessMatrix(this List<Solution> solutions)
         {
             double[][] data = new double[solutions.Count][];
@@ -68,5 +68,5 @@
         }
 
-        internal static DoubleMatrix ToMatrix(this IEnumerable<IReadOnlyList<double>> data)
+        public static DoubleMatrix ToMatrix(this IEnumerable<IReadOnlyList<double>> data)
         {
             var d2 = data.ToArray();
@@ -92,10 +92,10 @@
         }
 
-        internal static TOut Min<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
+        public static TOut Min<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
         {
             return MinArgMin(func, inputs).Item2;
         }
 
-        internal static TIn ArgMin<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
+        public static TIn ArgMin<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
         {
             return MinArgMin(func, inputs).Item1;
@@ -114,5 +114,5 @@
         /// </param>
         /// <returns></returns>
-        internal static Tuple<TIn, TOut> MinArgMin<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
+        public static Tuple<TIn, TOut> MinArgMin<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
         {
             if (func == null) throw new ArgumentNullException(nameof(func));
@@ -139,10 +139,10 @@
         }
 
-        internal static TOut Max<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
+        public static TOut Max<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
         {
             return MaxArgMax(func, inputs).Item2;
         }
 
-        internal static TIn ArgMax<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
+        public static TIn ArgMax<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
         {
             return MaxArgMax(func, inputs).Item1;
@@ -161,5 +161,5 @@
         /// </param>
         /// <returns></returns>
-        internal static Tuple<TIn, TOut> MaxArgMax<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
+        public static Tuple<TIn, TOut> MaxArgMax<TIn, TOut>(Func<TIn, TOut> func, IEnumerable<TIn> inputs) where TOut : IComparable
         {
             if (func == null) throw new ArgumentNullException(nameof(func));
