Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/CrowdingAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/CrowdingAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/CrowdingAnalyzer.cs	(revision 17225)
@@ -30,10 +30,6 @@
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
   [StorableType("F06FB45C-051E-4AD8-BD82-16DA9DCBCACB")]
-  [Item("CrowdingAnalyzer", "The mean crowding distance for each point of the Front (see Multi-Objective Performance Metrics - Shodhganga for more information)")]
+  [Item("CrowdingAnalyzer", "This analyzer is functionally equivalent to the CrowdingAnalyzer in HeuristicLab.Analysis, but is kept as not to break backwards compatibility")]
   public class CrowdingAnalyzer : MOTFAnalyzer {
-
-    public ILookupParameter<DoubleMatrix> BoundsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
-    }
 
     public IResultParameter<DoubleValue> CrowdingResultParameter {
@@ -43,7 +39,5 @@
     [StorableConstructor]
     protected CrowdingAnalyzer(StorableConstructorFlag _) : base(_) { }
-    public CrowdingAnalyzer(CrowdingAnalyzer original, Cloner cloner)
-      : base(original, cloner) {
-    }
+    public CrowdingAnalyzer(CrowdingAnalyzer original, Cloner cloner): base(original, cloner) {}
     public override IDeepCloneable Clone(Cloner cloner) {
       return new CrowdingAnalyzer(this, cloner);
@@ -51,18 +45,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/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/GenerationalDistanceAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/GenerationalDistanceAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/GenerationalDistanceAnalyzer.cs	(revision 17225)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
   [StorableType("EBC72F16-E329-4D18-800C-8642EFD0F05C")]
-  [Item("GenerationalDistanceAnalyzer", "The generational distance between the current and the best known front (see Multi-Objective Performance Metrics - Shodhganga for more information)")]
+  [Item("GenerationalDistanceAnalyzer", "This analyzer is functionally equivalent to the GenerationalDistanceAnalyzer in HeuristicLab.Analysis, but is kept as not to break backwards compatibility")]
   public class GenerationalDistanceAnalyzer : MOTFAnalyzer {
 
@@ -63,12 +63,9 @@
     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;
-
+      var q = qualities.Select(x => x.ToArray());
+      GenerationalDistanceResultParameter.ActualValue.Value = GenerationalDistance.Calculate(q, optimalfront, Dampening);
       return base.Apply();
     }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/HypervolumeAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/HypervolumeAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/HypervolumeAnalyzer.cs	(revision 17225)
@@ -32,5 +32,5 @@
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
   [StorableType("13D363E4-76FF-4A5A-9B2C-767D9E880E4B")]
-  [Item("HypervolumeAnalyzer", "Computes the enclosed Hypervolume between the current front and a given reference Point")]
+  [Item("HypervolumeAnalyzer", "This analyzer is functionally equivalent to the HypervolumeAnalyzer in HeuristicLab.Analysis, but is kept as not to break backwards compatibility")]
   public class HypervolumeAnalyzer : MOTFAnalyzer {
 
@@ -38,10 +38,13 @@
       get { return (ILookupParameter<DoubleArray>)Parameters["ReferencePoint"]; }
     }
+
     public IResultParameter<DoubleValue> HypervolumeResultParameter {
       get { return (IResultParameter<DoubleValue>)Parameters["Hypervolume"]; }
     }
+
     public IResultParameter<DoubleValue> BestKnownHypervolumeResultParameter {
       get { return (IResultParameter<DoubleValue>)Parameters["Best known hypervolume"]; }
     }
+
     public IResultParameter<DoubleValue> HypervolumeDistanceResultParameter {
       get { return (IResultParameter<DoubleValue>)Parameters["Absolute Distance to BestKnownHypervolume"]; }
@@ -53,7 +56,6 @@
     }
 
-    protected HypervolumeAnalyzer(HypervolumeAnalyzer original, Cloner cloner)
-      : base(original, cloner) {
-    }
+    protected HypervolumeAnalyzer(HypervolumeAnalyzer original, Cloner cloner) : base(original, cloner) {}
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new HypervolumeAnalyzer(this, cloner);
@@ -68,6 +70,4 @@
       BestKnownHypervolumeResultParameter.DefaultValue = new DoubleValue(0);
       HypervolumeDistanceResultParameter.DefaultValue = new DoubleValue(0);
-
-
     }
 
@@ -75,15 +75,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/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/InvertedGenerationalDistanceAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/InvertedGenerationalDistanceAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/InvertedGenerationalDistanceAnalyzer.cs	(revision 17225)
@@ -30,7 +30,9 @@
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
   [StorableType("EC99F3C1-D8D2-4738-9523-0D07438647A5")]
-  [Item("InvertedGenerationalDistanceAnalyzer", "The inverted generational distance between the current and the best known front (see Multi-Objective Performance Metrics - Shodhganga for more information)")]
+  [Item("InvertedGenerationalDistanceAnalyzer", "This analyzer is functionally equivalent to the InvertedGenerationalDistanceAnalyzer in HeuristicLab.Analysis, but is kept as not to break backwards compatibility")]
   public class InvertedGenerationalDistanceAnalyzer : MOTFAnalyzer {
-    public override bool EnabledByDefault { get { return false; } }
+    public override bool EnabledByDefault {
+      get { return false; }
+    }
 
     private IFixedValueParameter<DoubleValue> DampeningParameter {
@@ -51,5 +53,4 @@
       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);
-
     }
 
@@ -64,17 +65,11 @@
     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;
-
+      var q = qualities.Select(x => x.ToArray());
+      InvertedGenerationalDistanceResultParameter.ActualValue.Value = InvertedGenerationalDistance.Calculate(q, optimalfront, Dampening);
       return base.Apply();
     }
-
-
   }
 }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/MOTFAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/MOTFAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/MOTFAnalyzer.cs	(revision 17225)
@@ -33,5 +33,7 @@
   [StorableType("CFBB2CAB-C1B7-4F14-9A01-6D5624B7B681")]
   public abstract class MOTFAnalyzer : SingleSuccessorOperator, IMultiObjectiveTestFunctionAnalyzer {
-    public virtual bool EnabledByDefault { get { return true; } }
+    public virtual bool EnabledByDefault {
+      get { return true; }
+    }
 
     public IScopeTreeLookupParameter<DoubleArray> QualitiesParameter {
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 17225)
@@ -23,4 +23,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
@@ -41,5 +42,4 @@
     }
 
-
     [StorableConstructor]
     protected ScatterPlotAnalyzer(StorableConstructorFlag _) : base(_) { }
@@ -52,5 +52,4 @@
       Parameters.Add(new ScopeTreeLookupParameter<RealVector>("Individuals", "The individual solutions to the problem"));
       Parameters.Add(new ResultParameter<ParetoFrontScatterPlot>("Scatterplot", "The scatterplot for the current and optimal (if known front)"));
-
     }
 
@@ -59,10 +58,16 @@
       var individuals = IndividualsParameter.ActualValue;
       var testFunction = TestFunctionParameter.ActualValue;
-      int objectives = qualities[0].Length;
-      int problemSize = individuals[0].Length;
+      var objectives = qualities.Length != 0 ? qualities[0].Length:0;    
+      var problemSize = individuals.Length != 0 ? individuals[0].Length:0;
 
-      double[][] optimalFront = new double[0][];
-      var front = testFunction.OptimalParetoFront(objectives);
-      if (front != null) optimalFront = front.ToArray();
+      var optimalFront = new double[0][];               
+      if (testFunction != null) {
+        var front = testFunction.OptimalParetoFront(objectives);
+        if (front != null) optimalFront = front.ToArray();
+      }
+      else {
+        var mat = BestKnownFrontParameter.ActualValue;
+        optimalFront = mat == null ? null : Enumerable.Range(0, mat.Rows).Select(r => Enumerable.Range(0, mat.Columns).Select(c => mat[r, c]).ToArray()).ToArray();
+      }
 
       var qualityClones = qualities.Select(s => s.ToArray()).ToArray();
@@ -70,5 +75,4 @@
 
       ScatterPlotResultParameter.ActualValue = new ParetoFrontScatterPlot(qualityClones, solutionClones, optimalFront, objectives, problemSize);
-
       return base.Apply();
     }
Index: branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/SpacingAnalyzer.cs
===================================================================
--- branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/SpacingAnalyzer.cs	(revision 16723)
+++ branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/SpacingAnalyzer.cs	(revision 17225)
@@ -21,13 +21,13 @@
 
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
   [StorableType("F32027A7-3116-4864-A404-820F866BFD65")]
-  [Item("SpacingAnalyzer", "The spacing of the current front (see Multi-Objective Performance Metrics - Shodhganga for more information)")]
+  [Item("SpacingAnalyzer", "This analyzer is functionally equivalent to the SpacingAnalyzer in HeuristicLab.Analysis, but is kept as not to break backwards compatibility")]
   public class SpacingAnalyzer : MOTFAnalyzer {
 
@@ -35,7 +35,7 @@
       get { return (IResultParameter<DoubleValue>)Parameters["Spacing"]; }
     }
+
     [StorableConstructor]
     protected SpacingAnalyzer(StorableConstructorFlag _) : base(_) { }
-
 
     protected SpacingAnalyzer(SpacingAnalyzer original, Cloner cloner) : base(original, cloner) { }
@@ -51,7 +51,6 @@
     public override IOperation Apply() {
       var qualities = QualitiesParameter.ActualValue;
-      var spacing = Spacing.Calculate(qualities.Select(q => q.ToArray()));
-      SpacingResultParameter.ActualValue.Value = spacing;
-
+      var q = qualities.Select(x => x.ToArray());
+      SpacingResultParameter.ActualValue.Value = Spacing.Calculate(q);
       return base.Apply();
     }
