Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/CrowdingAnalyzer.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/CrowdingAnalyzer.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/CrowdingAnalyzer.cs	(revision 16171)
@@ -33,8 +33,4 @@
   public class CrowdingAnalyzer : MOTFAnalyzer {
 
-    public ILookupParameter<DoubleMatrix> BoundsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
-    }
-
     public IResultParameter<DoubleValue> CrowdingResultParameter {
       get { return (IResultParameter<DoubleValue>)Parameters["Crowding"]; }
@@ -51,18 +47,12 @@
 
     public CrowdingAnalyzer() {
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Bounds",
-        "The bounds of the solution given as either one line for all variables or a line for each variable. The first column specifies lower bound, the second upper bound."));
-      Parameters.Add(new ResultParameter<DoubleValue>("Crowding", "The average corwding value of all points (excluding infinities)"));
+      Parameters.Add(new ResultParameter<DoubleValue>("Crowding", "The average corwding distance of all points (excluding infinities)"));
       CrowdingResultParameter.DefaultValue = new DoubleValue(double.NaN);
-
     }
 
     public override IOperation Apply() {
       var qualities = QualitiesParameter.ActualValue;
-      var bounds = BoundsParameter.ActualValue;
-
-      var crowdingDistance = Crowding.Calculate(qualities.Select(x => x.ToArray()), bounds.CloneAsMatrix());
+      var crowdingDistance = CrowdingCalculator.CalculateCrowding(qualities);
       CrowdingResultParameter.ActualValue.Value = crowdingDistance;
-
       return base.Apply();
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/GenerationalDistanceAnalyzer.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/GenerationalDistanceAnalyzer.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/GenerationalDistanceAnalyzer.cs	(revision 16171)
@@ -64,12 +64,7 @@
     public override IOperation Apply() {
       var qualities = QualitiesParameter.ActualValue;
-      int objectives = qualities[0].Length;
-
-      var optimalfront = TestFunctionParameter.ActualValue.OptimalParetoFront(objectives);
+      var optimalfront = TestFunctionParameter.ActualValue.OptimalParetoFront(qualities[0].Length);
       if (optimalfront == null) return base.Apply();
-
-      var distance = GenerationalDistance.Calculate(qualities.Select(x => x.CloneAsArray()), optimalfront, Dampening);
-      GenerationalDistanceResultParameter.ActualValue.Value = distance;
-
+      GenerationalDistanceResultParameter.ActualValue.Value = GenerationalDistanceCalculator.CalculateGenerationalDistance(qualities, optimalfront, Dampening);
       return base.Apply();
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/HypervolumeAnalyzer.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/HypervolumeAnalyzer.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/HypervolumeAnalyzer.cs	(revision 16171)
@@ -76,15 +76,13 @@
       var qualities = QualitiesParameter.ActualValue;
       var testFunction = TestFunctionParameter.ActualValue;
-      int objectives = qualities[0].Length;
+      var objectives = qualities[0].Length;
       var referencePoint = ReferencePointParameter.ActualValue;
 
-      double best = BestKnownHypervolumeResultParameter.ActualValue.Value;
+      var best = BestKnownHypervolumeResultParameter.ActualValue.Value;
       if (referencePoint.SequenceEqual(testFunction.ReferencePoint(objectives))) {
         best = Math.Max(best, testFunction.OptimalHypervolume(objectives));
       }
 
-      IEnumerable<double[]> front = NonDominatedSelect.SelectNonDominatedVectors(qualities.Select(q => q.ToArray()), testFunction.Maximization(objectives), true);
-
-      double hv = Hypervolume.Calculate(front, referencePoint.ToArray(), testFunction.Maximization(objectives));
+      var hv = HypervolumeCalculator.CalculateHypervolume(qualities.Select(x=>x.CloneAsArray()).ToArray(), referencePoint.ToArray(), testFunction.Maximization(objectives));
 
       if (hv > best) {
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/InvertedGenerationalDistanceAnalyzer.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/InvertedGenerationalDistanceAnalyzer.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/InvertedGenerationalDistanceAnalyzer.cs	(revision 16171)
@@ -47,12 +47,4 @@
     }
 
-    public InvertedGenerationalDistanceAnalyzer() {
-      Parameters.Add(new FixedValueParameter<DoubleValue>("Dampening", "", new DoubleValue(1)));
-      Parameters.Add(new ResultParameter<DoubleValue>("Inverted Generational Distance", "The genrational distance between the current front and the optimal front"));
-      InvertedGenerationalDistanceResultParameter.DefaultValue = new DoubleValue(double.NaN);
-
-    }
-
-
     [StorableConstructor]
     protected InvertedGenerationalDistanceAnalyzer(bool deserializing) : base(deserializing) { }
@@ -62,19 +54,17 @@
     }
 
+    public InvertedGenerationalDistanceAnalyzer() {
+      Parameters.Add(new FixedValueParameter<DoubleValue>("Dampening", "", new DoubleValue(1)));
+      Parameters.Add(new ResultParameter<DoubleValue>("Inverted Generational Distance", "The genrational distance between the current front and the optimal front"));
+      InvertedGenerationalDistanceResultParameter.DefaultValue = new DoubleValue(double.NaN);
+    }
+
     public override IOperation Apply() {
       var qualities = QualitiesParameter.ActualValue;
-      var testFunction = TestFunctionParameter.ActualValue;
-      int objectives = qualities[0].Length;
-
-      var optimalfront = testFunction.OptimalParetoFront(objectives);
+      var optimalfront = TestFunctionParameter.ActualValue.OptimalParetoFront(qualities[0].Length);
       if (optimalfront == null) return base.Apply();
-
-      var invertedGenerationalDistance = InvertedGenerationalDistance.Calculate(qualities.Select(q => q.ToArray()), optimalfront, DampeningParameter.Value.Value);
-      InvertedGenerationalDistanceResultParameter.ActualValue.Value = invertedGenerationalDistance;
-
+      InvertedGenerationalDistanceResultParameter.ActualValue.Value = GenerationalDistanceCalculator.CalculateInverseGenerationalDistance(qualities, optimalfront, Dampening);
       return base.Apply();
     }
-
-
   }
 }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 16171)
@@ -59,8 +59,8 @@
       var individuals = IndividualsParameter.ActualValue;
       var testFunction = TestFunctionParameter.ActualValue;
-      int objectives = qualities[0].Length;
-      int problemSize = individuals[0].Length;
+      var objectives = qualities[0].Length;
+      var problemSize = individuals[0].Length;
 
-      double[][] optimalFront = new double[0][];
+      var optimalFront = new double[0][];
       var front = testFunction.OptimalParetoFront(objectives);
       if (front != null) optimalFront = front.ToArray();
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/SpacingAnalyzer.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/SpacingAnalyzer.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/SpacingAnalyzer.cs	(revision 16171)
@@ -51,7 +51,5 @@
     public override IOperation Apply() {
       var qualities = QualitiesParameter.ActualValue;
-      var spacing = Spacing.Calculate(qualities.Select(q => q.ToArray()));
-      SpacingResultParameter.ActualValue.Value = spacing;
-
+      SpacingResultParameter.ActualValue.Value = SpacingCalculator.CalculateSpacing(qualities);
       return base.Apply();
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 16171)
@@ -17,5 +17,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -90,7 +90,4 @@
     <Reference Include="HeuristicLab.Core-3.3">
       <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Data-3.3">
-      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
@@ -134,9 +131,4 @@
     <Compile Include="Interfaces\IConstrainedTestFunction.cs" />
     <Compile Include="Interfaces\IMultiObjectiveTestFunctionAnalyzer.cs" />
-    <Compile Include="Calculators\Crowding.cs" />
-    <Compile Include="Calculators\Spacing.cs" />
-    <Compile Include="Calculators\HyperVolume.cs" />
-    <Compile Include="Calculators\InvertedGenerationalDistance.cs" />
-    <Compile Include="Calculators\GenerationalDistance.cs" />
     <Compile Include="ParetoFrontScatterPlot.cs" />
     <Compile Include="Utilities.cs" />
@@ -206,4 +198,8 @@
       <Name>HeuristicLab.Analysis-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
       <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/MultiObjectiveTestFunctionProblem.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/MultiObjectiveTestFunctionProblem.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/MultiObjectiveTestFunctionProblem.cs	(revision 16171)
@@ -38,5 +38,5 @@
 
     #region Parameter Properties
-    public IValueParameter<BoolArray> MaximizationParameter {
+    public new IValueParameter<BoolArray> MaximizationParameter {
       get { return (IValueParameter<BoolArray>)Parameters["Maximization"]; }
     }
@@ -53,10 +53,4 @@
       get { return (IValueParameter<IMultiObjectiveTestFunction>)Parameters["TestFunction"]; }
     }
-    public IValueParameter<DoubleArray> ReferencePointParameter {
-      get { return (IValueParameter<DoubleArray>)Parameters["ReferencePoint"]; }
-    }
-    public OptionalValueParameter<DoubleMatrix> BestKnownFrontParameter {
-      get { return (OptionalValueParameter<DoubleMatrix>)Parameters["BestKnownFront"]; }
-    }
 
     #endregion
@@ -64,8 +58,5 @@
     #region Properties
     public override bool[] Maximization {
-      get {
-        if (!Parameters.ContainsKey("Maximization")) return new bool[2];
-        return MaximizationParameter.Value.ToArray();
-      }
+      get{ return Parameters.ContainsKey(MaximizationParameterName) ? MaximizationParameter.Value.CloneAsArray() : new Fonseca().Maximization(2); }
     }
 
@@ -85,12 +76,4 @@
       get { return TestFunctionParameter.Value; }
       set { TestFunctionParameter.Value = value; }
-    }
-    public DoubleArray ReferencePoint {
-      get { return ReferencePointParameter.Value; }
-      set { ReferencePointParameter.Value = value; }
-    }
-    public DoubleMatrix BestKnownFront {
-      get { return BestKnownFrontParameter.Value; }
-      set { BestKnownFrontParameter.Value = value; }
     }
     #endregion
@@ -116,7 +99,5 @@
       Parameters.Add(new FixedValueParameter<IntValue>("Objectives", "The dimensionality of the solution vector (number of objectives).", new IntValue(2)));
       Parameters.Add(new ValueParameter<DoubleMatrix>("Bounds", "The bounds of the solution given as either one line for all variables or a line for each variable. The first column specifies lower bound, the second upper bound.", new DoubleMatrix(new double[,] { { -4, 4 } })));
-      Parameters.Add(new ValueParameter<DoubleArray>("ReferencePoint", "The reference point used for hypervolume calculation."));
       Parameters.Add(new ValueParameter<IMultiObjectiveTestFunction>("TestFunction", "The function that is to be optimized.", new Fonseca()));
-      Parameters.Add(new OptionalValueParameter<DoubleMatrix>("BestKnownFront", "The currently best known Pareto front"));
 
       Encoding.LengthParameter = ProblemSizeParameter;
@@ -138,7 +119,6 @@
     public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
       base.Analyze(individuals, qualities, results, random);
-      if (results.ContainsKey("Pareto Front")) {
+      if (results.ContainsKey("Pareto Front")) 
         ((DoubleMatrix)results["Pareto Front"].Value).SortableView = true;
-      }
     }
 
@@ -170,14 +150,16 @@
     #region Events
     private void UpdateParameterValues() {
-      MaximizationParameter.Value = (BoolArray)new BoolArray(TestFunction.Maximization(Objectives)).AsReadOnly();
-
+      Parameters.Remove(MaximizationParameterName);
+      Parameters.Add(new FixedValueParameter<BoolArray>(MaximizationParameterName, "Set to false if the problem should be minimized.", (BoolArray)new BoolArray(TestFunction.Maximization(Objectives)).AsReadOnly()));
+
+      Parameters.Remove(BestKnownFrontParameterName);
       var front = TestFunction.OptimalParetoFront(Objectives);
-      if (front != null) {
-        BestKnownFrontParameter.Value = (DoubleMatrix)Utilities.ToMatrix(front).AsReadOnly();
-      } else BestKnownFrontParameter.Value = null;
-
+      var bkf = front != null ? (DoubleMatrix)Utilities.ToMatrix(front).AsReadOnly() : null;
+      Parameters.Add(new FixedValueParameter<DoubleMatrix>(BestKnownFrontParameterName, "A double matrix representing the best known qualites for this problem (aka points on the Pareto front). Points are to be given in a row-wise fashion.", bkf));
+
+      Parameters.Remove(ReferencePointParameterName);
+      Parameters.Add(new FixedValueParameter<DoubleArray>(ReferencePointParameterName, "The refrence point for hypervolume calculations on this problem", new DoubleArray(TestFunction.ReferencePoint(Objectives))));
 
       BoundsParameter.Value = new DoubleMatrix(TestFunction.Bounds(Objectives));
-      ReferencePointParameter.Value = new DoubleArray(TestFunction.ReferencePoint(Objectives));
     }
 
@@ -196,5 +178,6 @@
       ProblemSize = Math.Max(TestFunction.MinimumSolutionLength, Math.Min(ProblemSize, TestFunction.MaximumSolutionLength));
       Objectives = Math.Max(TestFunction.MinimumObjectives, Math.Min(Objectives, TestFunction.MaximumObjectives));
-      ReferencePointParameter.ActualValue = new DoubleArray(TestFunction.ReferencePoint(Objectives));
+      Parameters.Remove(ReferencePointParameterName);
+      Parameters.Add(new FixedValueParameter<DoubleArray>(ReferencePointParameterName, "The refrence point for hypervolume calculations on this problem", new DoubleArray(TestFunction.ReferencePoint(Objectives))));
       ParameterizeAnalyzers();
       UpdateParameterValues();
@@ -237,9 +220,4 @@
         analyzer.BestKnownFrontParameter.ActualName = BestKnownFrontParameter.Name;
 
-        var crowdingAnalyzer = analyzer as CrowdingAnalyzer;
-        if (crowdingAnalyzer != null) {
-          crowdingAnalyzer.BoundsParameter.ActualName = BoundsParameter.Name;
-        }
-
         var scatterPlotAnalyzer = analyzer as ScatterPlotAnalyzer;
         if (scatterPlotAnalyzer != null) {
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/NonDominatedSelect.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/NonDominatedSelect.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/NonDominatedSelect.cs	(revision 16171)
@@ -25,66 +25,5 @@
 
   public static class NonDominatedSelect {
-    public enum DominationResult { Dominates, IsDominated, IsNonDominated };
-
-    public static IEnumerable<double[]> SelectNonDominatedVectors(IEnumerable<double[]> qualities, bool[] maximization, bool dominateOnEqualQualities) {
-
-      List<double[]> front = new List<double[]>();
-      foreach (double[] row in qualities) {
-        bool insert = true;
-        for (int i = 0; i < front.Count; i++) {
-          DominationResult res = Dominates(front[i], row, maximization, dominateOnEqualQualities);
-          if (res == DominationResult.Dominates) { insert = false; break; }           //Vector domiates Row
-          else if (res == DominationResult.IsDominated) {   //Row dominates Vector
-            front.RemoveAt(i);
-          }
-        }
-        if (insert) {
-          front.Add(row);
-        }
-      }
-
-      return front;
-    }
-
-    public static IEnumerable<double[]> GetDominatingVectors(IEnumerable<double[]> qualities, double[] reference, bool[] maximization, bool dominateOnEqualQualities) {
-      List<double[]> front = new List<double[]>();
-      foreach (double[] vec in qualities) {
-        if (Dominates(vec, reference, maximization, dominateOnEqualQualities) == DominationResult.Dominates) {
-          front.Add(vec);
-        }
-      }
-      return front;
-    }
-
-    public static DominationResult Dominates(double[] left, double[] right, bool[] maximizations, bool dominateOnEqualQualities) {
-      //mkommend Caution: do not use LINQ.SequenceEqual for comparing the two quality arrays (left and right) due to performance reasons
-      if (dominateOnEqualQualities) {
-        var equal = true;
-        for (int i = 0; i < left.Length; i++) {
-          if (left[i] != right[i]) {
-            equal = false;
-            break;
-          }
-        }
-        if (equal) return DominationResult.Dominates;
-      }
-
-      bool leftIsBetter = false, rightIsBetter = false;
-      for (int i = 0; i < left.Length; i++) {
-        if (IsDominated(left[i], right[i], maximizations[i])) rightIsBetter = true;
-        else if (IsDominated(right[i], left[i], maximizations[i])) leftIsBetter = true;
-        if (leftIsBetter && rightIsBetter) break;
-      }
-
-      if (leftIsBetter && !rightIsBetter) return DominationResult.Dominates;
-      if (!leftIsBetter && rightIsBetter) return DominationResult.IsDominated;
-      return DominationResult.IsNonDominated;
-    }
-
-    private static bool IsDominated(double left, double right, bool maximization) {
-      return maximization && left < right
-        || !maximization && left > right;
-    }
-
+    
   }
 }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ.cs	(revision 16171)
@@ -42,6 +42,6 @@
 
     protected override double[] GetReferencePoint(int objectives) {
-      double[] rp = new double[objectives];
-      for (int i = 0; i < objectives; i++) {
+      var rp = new double[objectives];
+      for (var i = 0; i < objectives; i++) {
         rp[i] = 11;
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ1.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ1.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ1.cs	(revision 16171)
@@ -48,9 +48,9 @@
         throw new ArgumentException("The dimensionality of the problem(ProblemSize) must be larger than or equal to the number of objectives");
       }
-      double[] res = new double[objectives];
-      int k = r.Length - objectives + 1;
+      var res = new double[objectives];
+      var k = r.Length - objectives + 1;
       double g = 0;
 
-      for (int i = r.Length - k; i < r.Length; i++) {
+      for (var i = r.Length - k; i < r.Length; i++) {
         g += (r[i] - 0.5) * (r[i] - 0.5) - Math.Cos(20.0 * Math.PI * (r[i] - 0.5));
       };
@@ -58,7 +58,7 @@
       g *= 100;
 
-      for (int i = 0; i < objectives; i++) {
+      for (var i = 0; i < objectives; i++) {
         res[i] = 0.5 * (1.0 + g);
-        for (int j = 0; j < objectives - i - 1; ++j)
+        for (var j = 0; j < objectives - i - 1; ++j)
           res[i] *= (r[j]);
         if (i > 0)
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ2.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ2.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ2.cs	(revision 16171)
@@ -48,17 +48,17 @@
       }
 
-      double[] res = new double[objectives];
+      var res = new double[objectives];
 
       //calculate g(Xm)
       double g = 0;
-      for (int i = objectives; i < r.Length; i++) {
-        double d = r[i] - 0.5;
+      for (var i = objectives; i < r.Length; i++) {
+        var d = r[i] - 0.5;
         g += d * d;
       }
 
       //calculating f0...fM-1
-      for (int i = 0; i < objectives; i++) {
-        double f = i == 0 ? 1 : (Math.Sin(r[objectives - i - 1] * Math.PI / 2)) * (1 + g);
-        for (int j = 0; j < objectives - i - 1; j++) {
+      for (var i = 0; i < objectives; i++) {
+        var f = i == 0 ? 1 : (Math.Sin(r[objectives - i - 1] * Math.PI / 2)) * (1 + g);
+        for (var j = 0; j < objectives - i - 1; j++) {
           f *= Math.Cos(r[j] * Math.PI / 2);
         }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ3.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ3.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ3.cs	(revision 16171)
@@ -47,19 +47,19 @@
         throw new ArgumentException("The dimensionality of the problem(ProblemSize) must be larger than or equal to the number of objectives");
       }
-      double[] res = new double[objectives];
+      var res = new double[objectives];
 
       //calculate g(Xm)
       double sum = 0;
-      int length = r.Length - objectives + 1;
-      for (int i = r.Length - length; i < r.Length; i++) {
-        double d = r[i] - 0.5;
+      var length = r.Length - objectives + 1;
+      for (var i = r.Length - length; i < r.Length; i++) {
+        var d = r[i] - 0.5;
         sum += d * d - Math.Cos(20 * Math.PI * d);
       }
-      double g = 100 * (length + sum);
+      var g = 100 * (length + sum);
 
       //calculating f0...fM-1
-      for (int i = 0; i < objectives; i++) {
-        double f = i == 0 ? 1 : (Math.Sin(r[objectives - i - 1] * Math.PI / 2)) * (1 + g);
-        for (int j = 0; j < objectives - i - 1; j++) {
+      for (var i = 0; i < objectives; i++) {
+        var f = i == 0 ? 1 : (Math.Sin(r[objectives - i - 1] * Math.PI / 2)) * (1 + g);
+        for (var j = 0; j < objectives - i - 1; j++) {
           f *= Math.Cos(r[j] * Math.PI / 2);
         }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ4.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ4.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ4.cs	(revision 16171)
@@ -47,17 +47,17 @@
         throw new ArgumentException("The dimensionality of the problem(ProblemSize) must be larger than or equal to the number of objectives");
       }
-      double[] res = new double[objectives];
+      var res = new double[objectives];
 
       //calculate g(Xm)
       double g = 0;
-      for (int i = objectives; i < r.Length; i++) {
-        double d = r[i] - 0.5;
+      for (var i = objectives; i < r.Length; i++) {
+        var d = r[i] - 0.5;
         g += d * d;
       }
 
       //calculating f0...fM-1
-      for (int i = 0; i < objectives; i++) {
-        double f = i == 0 ? 1 : (Math.Sin(Math.Pow(r[objectives - i - 1], 100) * Math.PI / 2)) * (1 + g);
-        for (int j = 0; j < objectives - i - 1; j++) {
+      for (var i = 0; i < objectives; i++) {
+        var f = i == 0 ? 1 : (Math.Sin(Math.Pow(r[objectives - i - 1], 100) * Math.PI / 2)) * (1 + g);
+        for (var j = 0; j < objectives - i - 1; j++) {
           f *= Math.Cos(Math.Pow(r[j], 100) * Math.PI / 2);
         }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ5.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ5.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ5.cs	(revision 16171)
@@ -42,10 +42,10 @@
         throw new ArgumentException("The dimensionality of the problem(ProblemSize) must be larger than or equal to the number of objectives");
       }
-      double[] res = new double[objectives];
+      var res = new double[objectives];
 
       //calculate g(Xm)
       double g = 0;
-      for (int i = objectives; i < r.Length; i++) {
-        double d = r[i] - 0.5;
+      for (var i = objectives; i < r.Length; i++) {
+        var d = r[i] - 0.5;
         g += d * d;
       }
@@ -56,7 +56,7 @@
 
       //calculating f0...fM-1
-      for (int i = 0; i < objectives; i++) {
-        double f = i == 0 ? 1 : (Math.Sin(phi(r[objectives - i - 1]) * Math.PI / 2)) * (1 + g);
-        for (int j = 0; j < objectives - i - 1; j++) {
+      for (var i = 0; i < objectives; i++) {
+        var f = i == 0 ? 1 : (Math.Sin(phi(r[objectives - i - 1]) * Math.PI / 2)) * (1 + g);
+        for (var j = 0; j < objectives - i - 1; j++) {
           f *= Math.Cos(phi(r[j]) * Math.PI / 2);
         }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ6.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ6.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ6.cs	(revision 16171)
@@ -42,9 +42,9 @@
         throw new ArgumentException("The dimensionality of the problem(ProblemSize) must be larger than or equal to the number of objectives");
       }
-      double[] res = new double[objectives];
+      var res = new double[objectives];
 
       //calculate g(Xm)
       double g = 0;
-      for (int i = objectives; i < r.Length; i++) {
+      for (var i = objectives; i < r.Length; i++) {
         g += Math.Pow(r[i], 0.1);
       }
@@ -55,7 +55,7 @@
 
       //calculating f0...fM-1
-      for (int i = 0; i < objectives; i++) {
-        double f = i == 0 ? 1 : (Math.Sin(phi(r[objectives - i - 1]) * Math.PI / 2)) * (1 + g);
-        for (int j = 0; j < objectives - i - 1; j++) {
+      for (var i = 0; i < objectives; i++) {
+        var f = i == 0 ? 1 : (Math.Sin(phi(r[objectives - i - 1]) * Math.PI / 2)) * (1 + g);
+        for (var j = 0; j < objectives - i - 1; j++) {
           f *= Math.Cos(phi(r[j]) * Math.PI / 2);
         }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ7.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ7.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ7.cs	(revision 16171)
@@ -47,9 +47,9 @@
         throw new ArgumentException("The dimensionality of the problem(ProblemSize) must be larger than or equal to the number of objectives");
       }
-      double[] res = new double[objectives];
+      var res = new double[objectives];
 
       //calculate g(Xm)
       double g = 0, length = length = r.Length - objectives + 1;
-      for (int i = objectives; i < r.Length; i++) {
+      for (var i = objectives; i < r.Length; i++) {
         g += r[i];
       }
@@ -58,10 +58,10 @@
 
       //calculating f0...fM-2
-      for (int i = 0; i < objectives - 1; i++) {
+      for (var i = 0; i < objectives - 1; i++) {
         res[i] = r[i];
       }
       //calculate fM-1
       double h = objectives;
-      for (int i = 0; i < objectives - 1; i++) {
+      for (var i = 0; i < objectives - 1; i++) {
         h -= res[i] / (1 + g) * (1 + Math.Sin(3 * Math.PI * res[i]));
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ8.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ8.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/DTLZ/DTLZ8.cs	(revision 16171)
@@ -30,6 +30,6 @@
   public class DTLZ8 : DTLZ, IConstrainedTestFunction {
     public static double[] IllegalValue(int size, bool[] maximization) {
-      double[] res = new double[size];
-      for (int i = 0; i < size; i++) {
+      var res = new double[size];
+      for (var i = 0; i < size; i++) {
         res[i] = maximization[i] ? Double.MinValue : Double.MaxValue;
       }
@@ -49,9 +49,9 @@
       double n = r.Length;
       double M = objectives;
-      double ratio = n / M;
-      double[] res = new double[objectives];
-      for (int j = 0; j < objectives; j++) {
+      var ratio = n / M;
+      var res = new double[objectives];
+      for (var j = 0; j < objectives; j++) {
         double sum = 0;
-        for (int i = (int)(j * ratio); i < (j + 1) + ratio; i++) {
+        for (var i = (int)(j * ratio); i < (j + 1) + ratio; i++) {
           sum += r[i];
         }
@@ -59,11 +59,11 @@
         res[j] = sum;
       }
-      for (int j = 0; j < M - 1; j++) {
+      for (var j = 0; j < M - 1; j++) {
         if (res[objectives - 1] + 4 * res[j] - 1 < 0) return IllegalValue(objectives, GetMaximization(objectives));
       }
-      double min = Double.PositiveInfinity;
-      for (int i = 0; i < res.Length - 1; i++) {
-        for (int j = 0; j < i; j++) {
-          double d = res[i] + res[j];
+      var min = Double.PositiveInfinity;
+      for (var i = 0; i < res.Length - 1; i++) {
+        for (var j = 0; j < i; j++) {
+          var d = res[i] + res[j];
           if (min < d) min = d;
         }
@@ -78,10 +78,10 @@
       double n = r.Length;
       double M = objectives;
-      double ratio = n / M;
-      double[] res = new double[objectives];
-      double[] constraints = new double[objectives];
-      for (int j = 0; j < objectives; j++) {
+      var ratio = n / M;
+      var res = new double[objectives];
+      var constraints = new double[objectives];
+      for (var j = 0; j < objectives; j++) {
         double sum = 0;
-        for (int i = (int)(j * ratio); i < (j + 1) + ratio; i++) {
+        for (var i = (int)(j * ratio); i < (j + 1) + ratio; i++) {
           sum += r[i];
         }
@@ -89,16 +89,16 @@
         res[j] = sum;
       }
-      for (int j = 0; j < M - 1; j++) {
-        double d1 = res[objectives - 1] + 4 * res[j] - 1;
+      for (var j = 0; j < M - 1; j++) {
+        var d1 = res[objectives - 1] + 4 * res[j] - 1;
         constraints[j] = d1 < 0 ? -d1 : 0;
       }
-      double min = Double.PositiveInfinity;
-      for (int i = 0; i < res.Length - 1; i++) {
-        for (int j = 0; j < i; j++) {
-          double d2 = res[i] + res[j];
+      var min = Double.PositiveInfinity;
+      for (var i = 0; i < res.Length - 1; i++) {
+        for (var j = 0; j < i; j++) {
+          var d2 = res[i] + res[j];
           if (min < d2) min = d2;
         }
       }
-      double d = 2 * res[objectives - 1] + min - 1;
+      var d = 2 * res[objectives - 1] + min - 1;
       constraints[constraints.Length - 1] = d < 0 ? -d : 0;
       return constraints;
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR.cs	(revision 16171)
@@ -20,6 +20,8 @@
 #endregion
 using System;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -36,6 +38,6 @@
 
     protected override double[] GetReferencePoint(int objectives) {
-      double[] rp = new double[objectives];
-      for (int i = 0; i < objectives; i++) {
+      var rp = new double[objectives];
+      for (var i = 0; i < objectives; i++) {
         rp[i] = 11;
       }
@@ -58,4 +60,7 @@
     protected abstract double G(RealVector y);
 
+    protected override double GetBestKnownHypervolume(int objectives) {
+      return HypervolumeCalculator.CalculateHypervolume(GetOptimalParetoFront(objectives).ToArray(), GetReferencePoint(objectives), GetMaximization(objectives));
+    }
 
     protected double H(double x, RealVector r) {
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR1.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR1.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR1.cs	(revision 16171)
@@ -31,15 +31,11 @@
   public class IHR1 : IHR {
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objectives) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(objectives);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(objectives);
         r[0] = 1 / 500.0 * i;
         res.Add(this.Evaluate(r, objectives));
       }
       return res;
-    }
-
-    protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -64,6 +60,6 @@
 
     protected override double G(RealVector y) {
-      double sum = 0.0;
-      for (int i = 1; i < y.Length; i++) {
+      var sum = 0.0;
+      for (var i = 1; i < y.Length; i++) {
         sum += HG(y[i]);
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR2.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR2.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR2.cs	(revision 16171)
@@ -31,7 +31,7 @@
   public class IHR2 : IHR {
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objectives) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(objectives);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(objectives);
         r[0] = 1 / 500.0 * i;
 
@@ -39,8 +39,4 @@
       }
       return res;
-    }
-
-    protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -66,6 +62,6 @@
 
     protected override double G(RealVector y) {
-      double sum = 0.0;
-      for (int i = 1; i < y.Length; i++) {
+      var sum = 0.0;
+      for (var i = 1; i < y.Length; i++) {
         sum += HG(y[i]);
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR3.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR3.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR3.cs	(revision 16171)
@@ -21,4 +21,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -31,7 +32,7 @@
   public class IHR3 : IHR {
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objectives) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(objectives);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(objectives);
         r[0] = 1 / 500.0 * i;
 
@@ -39,8 +40,4 @@
       }
       return res;
-    }
-
-    protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -66,6 +63,6 @@
 
     protected override double G(RealVector y) {
-      double sum = 0.0;
-      for (int i = 1; i < y.Length; i++) {
+      var sum = 0.0;
+      for (var i = 1; i < y.Length; i++) {
         sum += HG(y[i]);
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR4.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR4.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR4.cs	(revision 16171)
@@ -21,4 +21,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -31,15 +32,11 @@
   public class IHR4 : IHR {
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objectives) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(objectives);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(objectives);
         r[0] = 1 / 500.0 * i;
         res.Add(this.Evaluate(r, objectives));
       }
       return res;
-    }
-
-    protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -69,6 +66,6 @@
 
     protected override double G(RealVector y) {
-      double sum = 0.0;
-      for (int i = 1; i < y.Length; i++) {
+      var sum = 0.0;
+      for (var i = 1; i < y.Length; i++) {
         sum += y[i] * y[i] - 10 * Math.Cos(4 * Math.PI * y[i]);
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR6.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR6.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/IHR/IHR6.cs	(revision 16171)
@@ -21,4 +21,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -31,15 +32,11 @@
   public class IHR6 : IHR {
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objectives) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(objectives);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(objectives);
         r[0] = 1 / 500.0 * i;
         res.Add(this.Evaluate(r, objectives));
       }
       return res;
-    }
-
-    protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -65,6 +62,6 @@
 
     protected override double G(RealVector y) {
-      double sum = 0.0;
-      for (int i = 1; i < y.Length; i++) {
+      var sum = 0.0;
+      for (var i = 1; i < y.Length; i++) {
         sum += HG(y[i]);
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/CIGTAB.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/CIGTAB.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/CIGTAB.cs	(revision 16171)
@@ -21,7 +21,9 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -43,7 +45,7 @@
 
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objecitves) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(2);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(2);
         r[0] = 2 / 500.0 * i;
         r[1] = 2 / 500.0 * i;
@@ -54,5 +56,5 @@
 
     protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
+      return HypervolumeCalculator.CalculateHypervolume(GetOptimalParetoFront(objectives).ToArray(), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -68,8 +70,8 @@
     public override double[] Evaluate(RealVector r, int objectives) {
       if (objectives != 2) throw new ArgumentException("The CIGTAB problem must always have 2 objectives");
-      double x = r[0];
+      var x = r[0];
       double a = 1000;
-      double sum = x * x;
-      for (int i = 1; i < r.Length - 1; i++) {
+      var sum = x * x;
+      for (var i = 1; i < r.Length - 1; i++) {
         sum += a * r[i] * r[i];
       }
@@ -77,9 +79,9 @@
 
       //objective1
-      double f0 = 1 / (a * a * r.Length) * sum;
+      var f0 = 1 / (a * a * r.Length) * sum;
 
       x = x - 2;
       sum = x * x;
-      for (int i = 1; i < r.Length - 1; i++) {
+      for (var i = 1; i < r.Length - 1; i++) {
         sum += a * (r[i] - 2) * (r[i] - 2);
       }
@@ -87,5 +89,5 @@
       sum += a * a * (r[r.Length - 1] - 2) * (r[r.Length - 1] - 2);
       //objective0
-      double f1 = 1 / (a * a * r.Length) * sum;
+      var f1 = 1 / (a * a * r.Length) * sum;
 
       return new double[] { f0, f1 };
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/ELLI1.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/ELLI1.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/ELLI1.cs	(revision 16171)
@@ -21,7 +21,9 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -43,7 +45,7 @@
 
     protected override IEnumerable<double[]> GetOptimalParetoFront(int objecitves) {
-      List<double[]> res = new List<double[]>();
-      for (int i = 0; i <= 500; i++) {
-        RealVector r = new RealVector(2);
+      var res = new List<double[]>();
+      for (var i = 0; i <= 500; i++) {
+        var r = new RealVector(2);
         r[0] = 2 / 500.0 * i;
         r[1] = 2 / 500.0 * i;
@@ -54,5 +56,5 @@
 
     protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
+      return HypervolumeCalculator.CalculateHypervolume(GetOptimalParetoFront(objectives).ToArray(), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -69,18 +71,18 @@
       if (objectives != 2) throw new ArgumentException("The ELLI problem must always have 2 objectives");
       double a = 1000;
-      double sum = 0.0;
-      for (int i = 0; i < r.Length; i++) {
+      var sum = 0.0;
+      for (var i = 0; i < r.Length; i++) {
         sum += Math.Pow(a, 2 * i / (r.Length - 1)) * r[i] * r[i];
       }
 
       //objective1
-      double f0 = 1 / (a * a * r.Length) * sum;
+      var f0 = 1 / (a * a * r.Length) * sum;
 
       sum = 0.0;
-      for (int i = 0; i < r.Length; i++) {
+      for (var i = 0; i < r.Length; i++) {
         sum += Math.Pow(a, 2 * i / (r.Length - 1)) * (r[i] - 2) * (r[i] - 2);
       }
       //objective0
-      double f1 = 1 / (a * a * r.Length) * sum;
+      var f1 = 1 / (a * a * r.Length) * sum;
 
       return new double[] { f0, f1 };
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/Fonseca.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/Fonseca.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/Fonseca.cs	(revision 16171)
@@ -22,7 +22,9 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -44,5 +46,5 @@
 
     protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
+      return HypervolumeCalculator.CalculateHypervolume(GetOptimalParetoFront(objectives).ToArray(), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -65,6 +67,6 @@
 
       //objective1
-      for (int i = 0; i < r.Length; i++) {
-        double d = r[i] - aux;
+      for (var i = 0; i < r.Length; i++) {
+        var d = r[i] - aux;
         f0 += d * d;
       }
@@ -72,7 +74,7 @@
 
       //objective2
-      double f1 = 0.0;
-      for (int i = 0; i < r.Length; i++) {
-        double d = r[i] + aux;
+      var f1 = 0.0;
+      for (var i = 0; i < r.Length; i++) {
+        var d = r[i] + aux;
         f1 += d * d;
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/Kursawe.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/Kursawe.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/Kursawe.cs	(revision 16171)
@@ -21,7 +21,9 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -43,5 +45,5 @@
 
     protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
+      return HypervolumeCalculator.CalculateHypervolume(GetOptimalParetoFront(objectives).ToArray(), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -65,11 +67,11 @@
       if (objectives != 2) throw new ArgumentException("The Kursawe problem must always have 2 objectives");
       //objective 1
-      double f0 = 0.0;
-      for (int i = 0; i < r.Length - 1; i++) {
+      var f0 = 0.0;
+      for (var i = 0; i < r.Length - 1; i++) {
         f0 += -10 * Math.Exp(-0.2 * Math.Sqrt(r[i] * r[i] + r[i + 1] * r[i + 1]));
       }
       //objective2
-      double f1 = 0.0;
-      for (int i = 0; i < r.Length; i++) {
+      var f1 = 0.0;
+      for (var i = 0; i < r.Length; i++) {
         f1 += Math.Pow(Math.Abs(r[i]), 0.8) + 5 * Math.Sin(Math.Pow(r[i], 3));
       }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/SchafferN1.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/SchafferN1.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/SchafferN1.cs	(revision 16171)
@@ -21,7 +21,9 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -48,5 +50,5 @@
 
     protected override double GetBestKnownHypervolume(int objectives) {
-      return Hypervolume.Calculate(GetOptimalParetoFront(objectives), GetReferencePoint(objectives), GetMaximization(objectives));
+      return HypervolumeCalculator.CalculateHypervolume(GetOptimalParetoFront(objectives).ToArray(), GetReferencePoint(objectives), GetMaximization(objectives));
     }
 
@@ -63,11 +65,11 @@
       if (objectives != 2) throw new ArgumentException("The Schaffer N1 problem must always have 2 objectives");
       if (r.Length != 1) return null;
-      double x = r[0];
+      var x = r[0];
 
       //objective1
-      double f0 = x * x;
+      var f0 = x * x;
 
       //objective0
-      double f1 = x - 2;
+      var f1 = x - 2;
       f1 *= f1;
 
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/SchafferN2.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/SchafferN2.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/Misc/SchafferN2.cs	(revision 16171)
@@ -59,5 +59,5 @@
     public override double[] Evaluate(RealVector r, int objectives) {
       if (objectives != 2) throw new ArgumentException("The Schaffer N1 problem must always have 2 objectives");
-      double x = r[0];
+      var x = r[0];
 
       //objective1
@@ -69,5 +69,5 @@
 
       //objective0
-      double f1 = x - 5;
+      var f1 = x - 5;
       f1 *= f1;
 
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ParetoFrontStore.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ParetoFrontStore.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ParetoFrontStore.cs	(revision 16171)
@@ -29,7 +29,7 @@
   internal class ParetoFrontStore {
     internal static IEnumerable<double[]> GetParetoFront(String filename) {
-      List<double[]> data = new List<double[]>();
+      var data = new List<double[]>();
       var assembly = Assembly.GetExecutingAssembly();
-      String ressourcename = typeof(ParetoFrontStore).Namespace + ".TestFunctions." + filename + ".pf";
+      var ressourcename = typeof(ParetoFrontStore).Namespace + ".TestFunctions." + filename + ".pf";
 
       //check if file is listed
@@ -42,6 +42,6 @@
       while ((s = ressourceReader.ReadLine()) != null) {
         var tokens = s.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
-        double[] point = new double[tokens.Length];
-        for (int i = 0; i < point.Length; i++) {
+        var point = new double[tokens.Length];
+        for (var i = 0; i < point.Length; i++) {
           point[i] = Double.Parse(tokens[i], CultureInfo.InvariantCulture);
         }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT1.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT1.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT1.cs	(revision 16171)
@@ -44,8 +44,8 @@
     public override double[] Evaluate(RealVector r) {
       double g = 0;
-      for (int i = 1; i < r.Length; i++) g += r[i];
+      for (var i = 1; i < r.Length; i++) g += r[i];
       g = 1.0 + 9.0 * g / (r.Length - 1);
-      double f0 = r[0];
-      double f1 = g * (1.0 - Math.Sqrt(r[0] / g));
+      var f0 = r[0];
+      var f1 = g * (1.0 - Math.Sqrt(r[0] / g));
       return new double[] { f0, f1 };
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT2.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT2.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT2.cs	(revision 16171)
@@ -42,9 +42,9 @@
     public override double[] Evaluate(RealVector r) {
       double g = 0;
-      for (int i = 1; i < r.Length; i++) g += r[i];
+      for (var i = 1; i < r.Length; i++) g += r[i];
       g = 1.0 + 9.0 * g / (r.Length - 1);
-      double d = r[0] / g;
-      double f0 = r[0];
-      double f1 = g * (1.0 - d * d);
+      var d = r[0] / g;
+      var f0 = r[0];
+      var f1 = g * (1.0 - d * d);
       return new double[] { f0, f1 };
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT3.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT3.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT3.cs	(revision 16171)
@@ -44,9 +44,9 @@
     public override double[] Evaluate(RealVector r) {
       double g = 0;
-      for (int i = 1; i < r.Length; i++) g += r[i];
+      for (var i = 1; i < r.Length; i++) g += r[i];
       g = 1.0 + 9.0 * g / (r.Length - 1);
-      double d = r[0] / g;
-      double f0 = r[0];
-      double f1 = g * (1.0 - Math.Sqrt(d) - d * Math.Sin(10 * Math.PI * r[0]));
+      var d = r[0] / g;
+      var f0 = r[0];
+      var f1 = g * (1.0 - Math.Sqrt(d) - d * Math.Sin(10 * Math.PI * r[0]));
       return new double[] { f0, f1 };
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT4.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT4.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT4.cs	(revision 16171)
@@ -30,7 +30,7 @@
   public class ZDT4 : ZDT {
     protected override double[,] GetBounds(int objectives) {
-      double[,] bounds = new double[objectives, 2];
+      var bounds = new double[objectives, 2];
       bounds[0, 0] = 0; bounds[0, 1] = 1;
-      for (int i = 1; i < objectives; i++) {
+      for (var i = 1; i < objectives; i++) {
         bounds[i, 0] = -5;
         bounds[i, 1] = 5;
@@ -53,12 +53,12 @@
     public override double[] Evaluate(RealVector r) {
       double g = 0;
-      for (int i = 1; i < r.Length; i++) {
-        double v = r[i];
+      for (var i = 1; i < r.Length; i++) {
+        var v = r[i];
         g += v * v - 10 * Math.Cos(4 * Math.PI * v);
       }
       g = 1.0 + 10.0 * (r.Length - 1) + g;
-      double d = r[0] / g;
-      double f0 = r[0];
-      double f1 = 1 - Math.Sqrt(d);
+      var d = r[0] / g;
+      var f0 = r[0];
+      var f1 = 1 - Math.Sqrt(d);
       return new double[] { f0, f1 };
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT6.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT6.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/TestFunctions/ZDT/ZDT6.cs	(revision 16171)
@@ -43,9 +43,9 @@
     public override double[] Evaluate(RealVector r) {
       double g = 0;
-      for (int i = 1; i < r.Length; i++) g += r[i];
+      for (var i = 1; i < r.Length; i++) g += r[i];
       g = 1.0 + 9.0 * Math.Pow(g / (r.Length - 1), 0.25);
-      double f1 = 1 - Math.Exp(-4 * r[0]) * Math.Pow(Math.Sin(6 * Math.PI * r[0]), 6);
-      double d = f1 / g;
-      double f2 = g * (1.0 - d * d);
+      var f1 = 1 - Math.Exp(-4 * r[0]) * Math.Pow(Math.Sin(6 * Math.PI * r[0]), 6);
+      var d = f1 / g;
+      var f2 = g * (1.0 - d * d);
       return new double[] { f1, f2 };
     }
Index: branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Utilities.cs
===================================================================
--- branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Utilities.cs	(revision 16123)
+++ branches/2943_MOBasicProblem_MOCMAES/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Utilities.cs	(revision 16171)
@@ -26,32 +26,13 @@
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
   internal static class Utilities {
-    internal static double MinimumDistance(double[] point, IEnumerable<double[]> points) {
-      if (point == null) throw new ArgumentNullException("Point must not be null.");
-      if (points == null) throw new ArgumentNullException("Points must not be null.");
-      if (!points.Any()) throw new ArgumentException("Points must not be empty.");
-
-      double minDistance = double.MaxValue;
-      foreach (double[] r in points) {
-        if (r.Length != point.Length) throw new ArgumentException("Dimensions of Points and Point do not match.");
-
-        double squaredDistance = 0;
-        for (int i = 0; i < r.Length; i++) {
-          squaredDistance += (point[i] - r[i]) * (point[i] - r[i]);
-        }
-        minDistance = Math.Min(squaredDistance, minDistance);
-      }
-
-      return Math.Sqrt(minDistance);
-    }
-
     internal static DoubleMatrix ToMatrix(IEnumerable<double[]> source) {
       try {
-        int firstDimension = source.Count();
-        int secondDimension = source.GroupBy(row => row.Length).Single().Key; // throws InvalidOperationException if source is not rectangular
+        var firstDimension = source.Count();
+        var secondDimension = source.GroupBy(row => row.Length).Single().Key; // throws InvalidOperationException if source is not rectangular
 
         var result = new DoubleMatrix(firstDimension, secondDimension);
         var enumarator = source.GetEnumerator();
-        for (int i = 0; i < firstDimension && enumarator.MoveNext(); ++i)
-          for (int j = 0; j < secondDimension; ++j)
+        for (var i = 0; i < firstDimension && enumarator.MoveNext(); ++i)
+          for (var j = 0; j < secondDimension; ++j)
             result[i, j] = enumarator.Current[j];
         return result;
@@ -62,19 +43,5 @@
     }
 
-    internal class DimensionComparer : IComparer<double[]> {
-      private readonly int dim;
-      private readonly int descending;
-
-      public DimensionComparer(int dimension, bool descending) {
-        this.dim = dimension;
-        this.descending = descending ? -1 : 1;
-      }
-
-      public int Compare(double[] x, double[] y) {
-        if (x[dim] < y[dim]) return -descending;
-        else if (x[dim] > y[dim]) return descending;
-        else return 0;
-      }
-    }
+    
   }
 }
