Index: /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/HypervolumeAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/HypervolumeAnalyzer.cs	(revision 14091)
+++ /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/HypervolumeAnalyzer.cs	(revision 14092)
@@ -35,6 +35,11 @@
   public class HypervolumeAnalyzer : MOTFAnalyzer {
 
+    public ILookupParameter<DoubleArray> ReferencePointParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["ReferencePoint"]; }
+    }
+
     [StorableConstructor]
-    protected HypervolumeAnalyzer(bool deserializing) : base(deserializing) { }
+    protected HypervolumeAnalyzer(bool deserializing) : base(deserializing) {
+    }
 
     protected HypervolumeAnalyzer(HypervolumeAnalyzer original, Cloner cloner)
@@ -45,5 +50,7 @@
     }
 
-    public HypervolumeAnalyzer() { }
+    public HypervolumeAnalyzer() {
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferencePoint", "The reference point for hypervolume calculation"));
+    }
 
     public override IOperation Apply() {
@@ -52,18 +59,20 @@
       var testFunction = TestFunctionParameter.ActualValue;
       int objectives = qualities[0].Length;
-      var referencePoint = testFunction.ReferencePoint(objectives);
+      var referencePoint = ReferencePointParameter.ActualValue;
 
-      if (!results.ContainsKey("Hypervolume")) results.Add(new Result("Hypervolume", typeof(DoubleValue)));
-      if (!results.ContainsKey("Absolute Distance to BestKnownHypervolume")) results.Add(new Result("Absolute Distance to BestKnownHypervolume", typeof(DoubleValue)));
+      if (!results.ContainsKey("Hypervolume")) results.Add(new Result("Hypervolume", new DoubleValue(0)));
+      if (!results.ContainsKey("Absolute Distance to BestKnownHypervolume")) results.Add(new Result("Absolute Distance to BestKnownHypervolume", new DoubleValue(0)));
 
       double best = testFunction.OptimalHypervolume(objectives);
       if (!results.ContainsKey("BestKnownHypervolume")) {
-        results.Add(new Result("BestKnownHypervolume", typeof(DoubleValue)));
+        results.Add(new Result("BestKnownHypervolume", new DoubleValue(0)));
+      } else {
+        best = Math.Max(best, ((DoubleValue)(results["BestKnownHypervolume"].Value)).Value);
       }
-      best = Math.Max(best, ((DoubleValue)(results["BestKnownHypervolume"].Value)).Value);
+
 
       IEnumerable<double[]> front = NonDominatedSelect.SelectNonDominatedVectors(qualities.Select(q => q.ToArray()), testFunction.Maximization(objectives), true);
 
-      double hv = Hypervolume.Calculate(front, (double[])referencePoint.Clone(), testFunction.Maximization(objectives));
+      double hv = Hypervolume.Calculate(front, referencePoint.ToArray(), testFunction.Maximization(objectives));
 
       if (double.IsNaN(best) || best < hv) {
Index: anches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/NormalizedHypervolumeAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/NormalizedHypervolumeAnalyzer.cs	(revision 14091)
+++ 	(revision )
@@ -1,136 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
-  [StorableClass]
-  [Item("NormalizedHypervolumeAnalyzer", "Computes the enclosed Hypervolume between the current front and a given reference Point")]
-  public class NormalizedHypervolumeAnalyzer : MOTFAnalyzer {
-    private const string bestKnownFront = "BestKnownFront Zitzler";
-    private const string resultsHV = "NormalizedHypervolume";
-    private const string resultsDist = "Absolute Distance to Normalized BestKnownHypervolume";
-
-    private const string bestknownHV = "NormalizedBestKnownHyperVolume";
-
-    public IValueParameter<DoubleMatrix> OptimalFrontParameter {
-      get { return (IValueParameter<DoubleMatrix>)Parameters[bestKnownFront]; }
-    }
-
-    public IValueParameter<DoubleValue> BestKnownHyperVolumeParameter {
-      get { return (IValueParameter<DoubleValue>)Parameters[bestknownHV]; }
-    }
-
-
-    public NormalizedHypervolumeAnalyzer()
-      : base() {
-      Parameters.Add(new ValueParameter<DoubleMatrix>(bestKnownFront, "The true / best known pareto front"));
-      Parameters.Add(new ValueParameter<DoubleValue>(bestknownHV, "The currently best known hypervolume"));
-    }
-
-    [StorableConstructor]
-    protected NormalizedHypervolumeAnalyzer(bool deserializing) : base(deserializing) { }
-    protected NormalizedHypervolumeAnalyzer(NormalizedHypervolumeAnalyzer original, Cloner cloner) : base(original, cloner) { }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new NormalizedHypervolumeAnalyzer(this, cloner);
-    }
-
-
-    private void RegisterEventHandlers() {
-      OptimalFrontParameter.ValueChanged += OptimalFrontParameterOnValueChanged;
-    }
-
-    private void OptimalFrontParameterOnValueChanged(object sender, EventArgs e) {
-      BestKnownHyperVolumeParameter.Value = new DoubleValue(0);
-    }
-
-    public override IOperation Apply() {
-      var results = ResultsParameter.ActualValue;
-      var qualities = QualitiesParameter.ActualValue;
-      var testFunction = TestFunctionParameter.ActualValue;
-      int objectives = qualities[0].Length;
-
-      double best = BestKnownHyperVolumeParameter.Value.Value;
-      if (OptimalFrontParameter.Value == null || OptimalFrontParameter.Value.Rows < 1 || OptimalFrontParameter.Value.Columns != qualities[0].Length) {
-        return base.Apply(); // too pareto front nonexistant or with wrong number of dimensions
-      }
-
-      IEnumerable<double[]> front = NonDominatedSelect.SelectNonDominatedVectors(qualities.Select(q => q.ToArray()), testFunction.Maximization(objectives), true);
-
-      if (!results.ContainsKey(resultsHV)) results.Add(new Result(resultsHV, typeof(DoubleValue)));
-      if (!results.ContainsKey(resultsDist)) results.Add(new Result(resultsDist, typeof(DoubleValue)));
-      if (!results.ContainsKey(bestknownHV)) results.Add(new Result(bestknownHV, typeof(DoubleValue)));
-      else {
-        DoubleValue dv = (DoubleValue)(results[bestknownHV].Value);
-        best = dv.Value;
-      }
-
-      bool[] maximization = testFunction.Maximization(objectives);
-      double[] invPoint = GetBestPoint(OptimalFrontParameter.Value, maximization);
-      double[] refPoint = GetWorstPoint(OptimalFrontParameter.Value, maximization);
-      double normalization = Hypervolume.Calculate(new double[][] { invPoint }, refPoint, maximization);
-      double hv = front.Any() ? Hypervolume.Calculate(front, refPoint, maximization) / normalization : 0;
-
-      if (double.IsNaN(best) || best < hv) {
-        best = hv;
-        BestKnownFrontParameter.ActualValue = new DoubleMatrix(MultiObjectiveTestFunctionProblem.To2D(qualities.Select(q => q.ToArray()).ToArray()));
-      }
-
-      results[resultsHV].Value = new DoubleValue(hv);
-      results[bestknownHV].Value = new DoubleValue(best);
-      results[resultsDist].Value = new DoubleValue(best - hv);
-
-      return base.Apply();
-    }
-
-
-    private static double[] GetWorstPoint(DoubleMatrix value, bool[] maximization) {
-      bool[] invMax = new bool[maximization.Length];
-      int i = 0;
-      foreach (bool b in maximization) {
-        invMax[i++] = !b;
-      }
-      return GetBestPoint(value, invMax);
-    }
-
-    private static double[] GetBestPoint(DoubleMatrix value, bool[] maximization) {
-      double[] res = new double[maximization.Length];
-      for (int i = 0; i < maximization.Length; i++) {
-        res[i] = maximization[i] ? Double.MinValue : Double.MaxValue;
-      }
-
-      for (int r = 0; r < value.Rows; r++) {
-        for (int c = 0; c < maximization.Length; c++) {
-          res[c] = maximization[c] ? Math.Max(res[c], value[r, c]) : Math.Min(res[c], value[r, c]);
-        }
-      }
-      return res;
-    }
-  }
-}
Index: /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/ScatterPlotAnalyzer.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 14091)
+++ /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 14092)
@@ -56,5 +56,5 @@
 
       if (!results.ContainsKey("Scatterplot")) {
-        results.Add(new Result("Scatterplot", typeof(IMOFrontModel)));
+        results.Add(new Result("Scatterplot", typeof(ScatterPlotContent)));
       }
 
@@ -66,5 +66,5 @@
       var solutionClones = individuals.Select(s => s.ToArray()).ToArray();
 
-      results["Scatterplot"].Value = new MOSolution(qualityClones, solutionClones, optimalFront, objectives);
+      results["Scatterplot"].Value = new ScatterPlotContent(qualityClones, solutionClones, optimalFront, objectives);
 
       return base.Apply();
Index: /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/HeuristicLab.Problems.MultiObjectiveTestFunctions-3.3.csproj
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/HeuristicLab.Problems.MultiObjectiveTestFunctions-3.3.csproj	(revision 14091)
+++ /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/HeuristicLab.Problems.MultiObjectiveTestFunctions-3.3.csproj	(revision 14092)
@@ -146,5 +146,4 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Analyzers\NormalizedHypervolumeAnalyzer.cs" />
     <Compile Include="Analyzers\ScatterPlotAnalyzer.cs" />
     <Compile Include="Analyzers\CrowdingAnalyzer.cs" />
@@ -168,5 +167,4 @@
     <Compile Include="Instances\MOTFDataDescriptor.cs" />
     <Compile Include="Instances\DTLZInstanceProvider.cs" />
-    <Compile Include="Interfaces\IMOFrontModel.cs" />
     <Compile Include="TestFunctions\Misc\CIGTAB.cs" />
     <Compile Include="TestFunctions\IHR\IHR.cs" />
@@ -177,5 +175,5 @@
     <Compile Include="TestFunctions\IHR\IHR2.cs" />
     <Compile Include="TestFunctions\Misc\ELLI1.cs" />
-    <Compile Include="Views\MOSolution.cs" />
+    <Compile Include="Views\ScatterPlotContent.cs" />
     <Compile Include="Views\MOFrontScatterPlotView.cs">
       <SubType>UserControl</SubType>
Index: anches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Interfaces/IMOFrontModel.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Interfaces/IMOFrontModel.cs	(revision 14091)
+++ 	(revision )
@@ -1,31 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
-  public interface IMOFrontModel : IItem, IStorableContent {
-    int Objectives { get; set; }
-    double[][] Qualities { get; set; }
-    double[][] ParetoFront { get; set; }
-    double[][] Solutions { get; set; }
-  }
-}
Index: /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/MultiObjectiveTestFunctionProblem.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/MultiObjectiveTestFunctionProblem.cs	(revision 14091)
+++ /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/MultiObjectiveTestFunctionProblem.cs	(revision 14092)
@@ -196,5 +196,5 @@
       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));
       ParameterizeAnalyzers();
       UpdateParameterValues();
@@ -222,5 +222,4 @@
       Operators.Add(new SpacingAnalyzer());
       Operators.Add(new ScatterPlotAnalyzer());
-      Operators.Add(new NormalizedHypervolumeAnalyzer());
 
       ParameterizeAnalyzers();
@@ -243,11 +242,4 @@
         }
 
-        var hyperVolumeAnalyzer = analyzer as HypervolumeAnalyzer;
-
-        var normalizedHyperVolumeAnalyzer = analyzer as NormalizedHypervolumeAnalyzer;
-        if (normalizedHyperVolumeAnalyzer != null) {
-          normalizedHyperVolumeAnalyzer.OptimalFrontParameter.Value = (DoubleMatrix)BestKnownFrontParameter.ActualValue;
-        }
-
         var scatterPlotAnalyzer = analyzer as ScatterPlotAnalyzer;
         if (scatterPlotAnalyzer != null) {
Index: /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/MOFrontScatterPlotView.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/MOFrontScatterPlotView.cs	(revision 14091)
+++ /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/MOFrontScatterPlotView.cs	(revision 14092)
@@ -31,5 +31,5 @@
 namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
   [View("Scatter Plot")]
-  [Content(typeof(IMOFrontModel))]
+  [Content(typeof(ScatterPlotContent))]
   public partial class MOQualitiesScatterPlotView : ItemView {
     private const string QUALITIES = "Qualities";
@@ -41,6 +41,6 @@
     int objectives = -1;
 
-    public new IMOFrontModel Content {
-      get { return (IMOFrontModel)base.Content; }
+    public new ScatterPlotContent Content {
+      get { return (ScatterPlotContent)base.Content; }
       set { base.Content = value; }
     }
Index: anches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/MOSolution.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/MOSolution.cs	(revision 14091)
+++ 	(revision )
@@ -1,166 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-using System;
-using System.Drawing;
-using HeuristicLab.Common;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
-  [StorableClass]
-  public class MOSolution : IMOFrontModel {
-    public bool CanChangeDescription {
-      get {
-        return false;
-      }
-    }
-
-    public bool CanChangeName {
-      get {
-        return false;
-      }
-    }
-
-    public string Description {
-      get {
-        return "MYResult";
-      }
-
-      set { }
-    }
-
-    public string Filename {
-      get { return "MyFilename"; }
-
-      set { }
-    }
-
-    public string ItemDescription {
-      get { return "this is MOSolutionImplementation"; }
-    }
-
-    public Image ItemImage {
-      get {
-        return HeuristicLab.Common.Resources.VSImageLibrary.Function;
-      }
-    }
-
-    public string ItemName {
-      get {
-        return "MOSolution";
-      }
-    }
-
-    public Version ItemVersion {
-      get { return Version.Parse("0.1"); }
-    }
-
-    public string Name {
-      get {
-        return ItemName;
-      }
-
-      set { }
-    }
-
-    private double[][] qualities;
-
-    public double[][] Qualities {
-      get {
-        return qualities;
-      }
-
-      set {
-        qualities = value;
-      }
-    }
-
-    private int objectives;
-    public int Objectives {
-      get {
-        return objectives;
-      }
-
-      set {
-        objectives = value;
-      }
-    }
-
-    private double[][] solutions;
-    public double[][] Solutions {
-      get {
-        return solutions;
-      }
-
-      set {
-        solutions = value;
-      }
-    }
-
-    private double[][] paretoFront;
-    public double[][] ParetoFront {
-      get {
-        return paretoFront;
-      }
-
-      set {
-        paretoFront = value;
-      }
-    }
-
-    public event EventHandler DescriptionChanged;
-    public event EventHandler ItemImageChanged;
-    public event EventHandler NameChanged;
-    public event EventHandler<CancelEventArgs<string>> NameChanging;
-    public event EventHandler ToStringChanged;
-
-    [StorableConstructor]
-    protected MOSolution(bool deserializing) : base() { }
-
-
-    protected MOSolution(MOSolution original, Cloner cloner) : this(original) {
-      this.qualities = original.qualities;
-      this.solutions = original.solutions;
-      this.paretoFront = original.paretoFront;
-      this.objectives = original.objectives;
-    }
-    protected MOSolution(MOSolution original) : base() {
-      this.qualities = original.qualities;
-      this.solutions = original.solutions;
-      this.paretoFront = original.paretoFront;
-      this.objectives = original.objectives;
-    }
-    protected MOSolution() : base() { }
-    public MOSolution(double[][] qualities, double[][] solutions, double[][] paretoFront, int objectives) {
-      this.qualities = qualities;
-      this.solutions = solutions;
-      this.paretoFront = paretoFront;
-      this.objectives = objectives;
-    }
-
-    public object Clone() {
-      return new MOSolution(this);
-    }
-
-    public IDeepCloneable Clone(Cloner cloner) {
-      return (IDeepCloneable)Clone();
-    }
-  }
-}
Index: /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/ScatterPlotContent.cs
===================================================================
--- /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/ScatterPlotContent.cs	(revision 14092)
+++ /branches/HeuristicLab.Problems.MultiObjectiveTestFunctions/HeuristicLab.Problems.MultiObjectiveTestFunctions/3.3/Views/ScatterPlotContent.cs	(revision 14092)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MultiObjectiveTestFunctions {
+  [StorableClass]
+  public class ScatterPlotContent : Item {
+
+    [Storable]
+    private double[][] qualities;
+    public double[][] Qualities {
+      get {
+        return qualities;
+      }
+
+      set {
+        qualities = value;
+      }
+    }
+
+    [Storable]
+    private int objectives;
+    public int Objectives {
+      get {
+        return objectives;
+      }
+
+      set {
+        objectives = value;
+      }
+    }
+
+    [Storable]
+    private double[][] solutions;
+    public double[][] Solutions {
+      get {
+        return solutions;
+      }
+
+      set {
+        solutions = value;
+      }
+    }
+
+    [Storable]
+    private double[][] paretoFront;
+    public double[][] ParetoFront {
+      get {
+        return paretoFront;
+      }
+
+      set {
+        paretoFront = value;
+      }
+    }
+
+    [StorableConstructor]
+    protected ScatterPlotContent(bool deserializing) : base() { }
+
+    protected ScatterPlotContent(ScatterPlotContent original, Cloner cloner) : this() {
+      this.qualities = original.qualities.Select(s => s.ToArray()).ToArray();
+      this.solutions = original.solutions.Select(s => s.ToArray()).ToArray();
+      this.paretoFront = original.paretoFront.Select(s => s.ToArray()).ToArray();
+      this.objectives = original.objectives;
+    }
+    protected ScatterPlotContent() : base() { }
+    public ScatterPlotContent(double[][] qualities, double[][] solutions, double[][] paretoFront, int objectives) {
+      this.qualities = qualities;
+      this.solutions = solutions;
+      this.paretoFront = paretoFront;
+      this.objectives = objectives;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return cloner.Clone(this);
+    }
+  }
+}
