Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 17229)
@@ -144,4 +144,16 @@
       <DependentUpon>IndexedDataTableView.cs</DependentUpon>
     </Compile>
+    <Compile Include="ParetoFrontScatterPlotViewOfT.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParetoFrontScatterPlotViewOfT.Designer.cs">
+      <DependentUpon>ParetoFrontScatterPlotViewOfT.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ParetoFrontScatterPlotView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParetoFrontScatterPlotView.Designer.cs">
+      <DependentUpon>ParetoFrontScatterPlotView.cs</DependentUpon>
+    </Compile>
     <Compile Include="ScatterPlotView.cs">
       <SubType>UserControl</SubType>
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotView.Designer.cs	(revision 17229)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotView.Designer.cs	(revision 17229)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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
+
+namespace HeuristicLab.Analysis.Views {
+  partial class ParetoFrontScatterPlotView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.scatterPlotView = new HeuristicLab.Analysis.Views.ScatterPlotView();
+      this.xAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.yAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.xLabel = new System.Windows.Forms.Label();
+      this.yLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // scatterPlotView
+      // 
+      this.scatterPlotView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.scatterPlotView.Caption = "ScatterPlot View";
+      this.scatterPlotView.Content = null;
+      this.scatterPlotView.Location = new System.Drawing.Point(3, 37);
+      this.scatterPlotView.Name = "scatterPlotView";
+      this.scatterPlotView.ReadOnly = false;
+      this.scatterPlotView.ShowChartOnly = true;
+      this.scatterPlotView.Size = new System.Drawing.Size(615, 342);
+      this.scatterPlotView.TabIndex = 3;
+      // 
+      // xAxisComboBox
+      // 
+      this.xAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.xAxisComboBox.FormattingEnabled = true;
+      this.xAxisComboBox.Location = new System.Drawing.Point(29, 3);
+      this.xAxisComboBox.Name = "xAxisComboBox";
+      this.xAxisComboBox.Size = new System.Drawing.Size(135, 28);
+      this.xAxisComboBox.TabIndex = 4;
+      this.xAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
+      // 
+      // yAxisComboBox
+      // 
+      this.yAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.yAxisComboBox.FormattingEnabled = true;
+      this.yAxisComboBox.Location = new System.Drawing.Point(240, 3);
+      this.yAxisComboBox.Name = "yAxisComboBox";
+      this.yAxisComboBox.Size = new System.Drawing.Size(135, 28);
+      this.yAxisComboBox.TabIndex = 5;
+      this.yAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
+      // 
+      // xLabel
+      // 
+      this.xLabel.AutoSize = true;
+      this.xLabel.Location = new System.Drawing.Point(3, 6);
+      this.xLabel.Name = "xLabel";
+      this.xLabel.Size = new System.Drawing.Size(20, 20);
+      this.xLabel.TabIndex = 6;
+      this.xLabel.Text = "x:";
+      // 
+      // yLabel
+      // 
+      this.yLabel.AutoSize = true;
+      this.yLabel.Location = new System.Drawing.Point(214, 6);
+      this.yLabel.Name = "yLabel";
+      this.yLabel.Size = new System.Drawing.Size(20, 20);
+      this.yLabel.TabIndex = 7;
+      this.yLabel.Text = "y:";
+      // 
+      // ParetoFrontScatterPlotView
+      // 
+      this.AllowDrop = true;
+      this.Controls.Add(this.yLabel);
+      this.Controls.Add(this.xLabel);
+      this.Controls.Add(this.yAxisComboBox);
+      this.Controls.Add(this.xAxisComboBox);
+      this.Controls.Add(this.scatterPlotView);
+      this.Margin = new System.Windows.Forms.Padding(6);
+      this.Name = "ParetoFrontScatterPlotView";
+      this.Size = new System.Drawing.Size(621, 382);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+    private HeuristicLab.Analysis.Views.ScatterPlotView scatterPlotView;
+    private System.Windows.Forms.ComboBox xAxisComboBox;
+    private System.Windows.Forms.ComboBox yAxisComboBox;
+    private System.Windows.Forms.Label xLabel;
+    private System.Windows.Forms.Label yLabel;
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotView.cs	(revision 17229)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotView.cs	(revision 17229)
@@ -0,0 +1,189 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.Views {
+  [View("Scatter Plot")]
+#pragma warning disable CS0618 // Type or member is obsolete
+  [Content(typeof(ParetoFrontScatterPlot))]
+#pragma warning restore CS0618 // Type or member is obsolete
+  public partial class ParetoFrontScatterPlotView : ItemView {
+
+    private readonly ScatterPlot scatterPlot;
+    private readonly ScatterPlotDataRow qualitiesRow;
+    private readonly ScatterPlotDataRow paretoFrontRow;
+
+    private int oldObjectives = -1;
+    private int oldProblemSize = -1;
+
+    private bool suppressEvents;
+
+#pragma warning disable CS0618 // Type or member is obsolete
+    public new ParetoFrontScatterPlot Content {
+      get { return (ParetoFrontScatterPlot)base.Content; }
+      set { base.Content = value; }
+    }
+#pragma warning restore CS0618 // Type or member is obsolete
+
+    public ParetoFrontScatterPlotView() {
+      InitializeComponent();
+
+      scatterPlot = new ScatterPlot();
+
+      qualitiesRow = new ScatterPlotDataRow("Qualities", string.Empty, Enumerable.Empty<Point2D<double>>()) {
+        VisualProperties = {
+          PointSize = 8 ,
+          PointStyle = ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Circle
+        }
+      };
+      scatterPlot.Rows.Add(qualitiesRow);
+
+      paretoFrontRow = new ScatterPlotDataRow("Best Known Pareto Front", string.Empty, Enumerable.Empty<Point2D<double>>()) {
+        VisualProperties = {
+            PointSize = 4,
+            PointStyle = ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Square
+          }
+      };
+      scatterPlot.Rows.Add(paretoFrontRow);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        scatterPlotView.Content = null;
+        xAxisComboBox.Items.Clear();
+        xAxisComboBox.SelectedIndex = -1;
+        yAxisComboBox.Items.Clear();
+        yAxisComboBox.SelectedIndex = -1;
+        return;
+      }
+
+      scatterPlotView.Content = scatterPlot;
+
+      if (oldObjectives != Content.Objectives || oldProblemSize != Content.ProblemSize)
+        UpdateAxisComboBoxes();
+
+      UpdateChartData();
+
+      oldObjectives = Content.Objectives;
+      oldProblemSize = Content.ProblemSize;
+    }
+
+    private void UpdateChartData() {
+      if (InvokeRequired) {
+        Invoke((Action)UpdateChartData);
+        return;
+      }
+
+      int xDimGlobal = xAxisComboBox.SelectedIndex;
+      int yDimGlobal = yAxisComboBox.SelectedIndex;
+
+      qualitiesRow.Points.Replace(CreatePoints(Content.Qualities, Content.Solutions, xDimGlobal, yDimGlobal));
+
+      paretoFrontRow.Points.Replace(CreatePoints(Content.ParetoFront, null, xDimGlobal, yDimGlobal));
+      paretoFrontRow.VisualProperties.IsVisibleInLegend = paretoFrontRow.Points.Count > 0; // hide if empty
+    }
+
+    private void UpdateAxisComboBoxes() {
+      try {
+        suppressEvents = true;
+
+        string prevSelectedX = (string)xAxisComboBox.SelectedItem;
+        string prevSelectedY = (string)yAxisComboBox.SelectedItem;
+
+        xAxisComboBox.Items.Clear();
+        yAxisComboBox.Items.Clear();
+
+        // Add Objectives first
+        for (int i = 0; i < Content.Objectives; i++) {
+          xAxisComboBox.Items.Add("Objective " + i);
+          yAxisComboBox.Items.Add("Objective " + i);
+        }
+
+        // Add Problem Dimension
+        for (int i = 0; i < Content.ProblemSize; i++) {
+          xAxisComboBox.Items.Add("Problem Dimension " + i);
+          yAxisComboBox.Items.Add("Problem Dimension " + i);
+        }
+
+        // Selection
+        int count = xAxisComboBox.Items.Count;
+        if (count > 0) {
+          if (prevSelectedX != null && xAxisComboBox.Items.Contains(prevSelectedX))
+            xAxisComboBox.SelectedItem = prevSelectedX;
+          else xAxisComboBox.SelectedIndex = 0;
+
+          if (prevSelectedY != null && yAxisComboBox.Items.Contains(prevSelectedY))
+            yAxisComboBox.SelectedItem = prevSelectedY;
+          else yAxisComboBox.SelectedIndex = Math.Min(1, count - 1);
+        } else {
+          xAxisComboBox.SelectedIndex = -1;
+          yAxisComboBox.SelectedIndex = -1;
+        }
+
+        UpdateAxisDescription();
+      } finally {
+        suppressEvents = false;
+      }
+    }
+
+    private void UpdateAxisDescription() {
+      scatterPlot.VisualProperties.XAxisTitle = (string)xAxisComboBox.SelectedItem;
+      scatterPlot.VisualProperties.YAxisTitle = (string)yAxisComboBox.SelectedItem;
+    }
+
+    private static Point2D<double>[] CreatePoints(double[][] qualities, double[][] solutions, int xDimGlobal, int yDimGlobal) {
+      if (qualities == null || qualities.Length == 0) return new Point2D<double>[0];
+
+      int objectives = qualities[0].Length;
+
+      // "Global" dimension index describes the index as if the qualities and solutions would be in a single array
+      // If the global dimension index is too long for the qualities, use solutions
+      var xDimArray = xDimGlobal < objectives ? qualities : solutions;
+      var yDimArray = yDimGlobal < objectives ? qualities : solutions;
+      var xDimIndex = xDimGlobal < objectives ? xDimGlobal : xDimGlobal - objectives;
+      var yDimIndex = yDimGlobal < objectives ? yDimGlobal : yDimGlobal - objectives;
+
+      if (xDimArray == null || yDimArray == null)
+        return new Point2D<double>[0];
+
+      var points = new Point2D<double>[xDimArray.Length];
+      for (int i = 0; i < xDimArray.Length; i++) {
+        points[i] = new Point2D<double>(xDimArray[i][xDimIndex], yDimArray[i][yDimIndex]);
+      }
+      return points;
+    }
+
+    #region Event Handler
+    private void axisComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (suppressEvents) return;
+      UpdateAxisDescription();
+      UpdateChartData();
+    }
+    #endregion
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotViewOfT.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotViewOfT.Designer.cs	(revision 17229)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotViewOfT.Designer.cs	(revision 17229)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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
+
+namespace HeuristicLab.Analysis.Views {
+  partial class ParetoFrontScatterPlotView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.scatterPlotView = new HeuristicLab.Analysis.Views.ScatterPlotView();
+      this.xAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.yAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.xLabel = new System.Windows.Forms.Label();
+      this.yLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // scatterPlotView
+      // 
+      this.scatterPlotView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.scatterPlotView.Caption = "ScatterPlot View";
+      this.scatterPlotView.Content = null;
+      this.scatterPlotView.Location = new System.Drawing.Point(3, 37);
+      this.scatterPlotView.Name = "scatterPlotView";
+      this.scatterPlotView.ReadOnly = false;
+      this.scatterPlotView.ShowChartOnly = true;
+      this.scatterPlotView.Size = new System.Drawing.Size(615, 342);
+      this.scatterPlotView.TabIndex = 3;
+      // 
+      // xAxisComboBox
+      // 
+      this.xAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.xAxisComboBox.FormattingEnabled = true;
+      this.xAxisComboBox.Location = new System.Drawing.Point(29, 3);
+      this.xAxisComboBox.Name = "xAxisComboBox";
+      this.xAxisComboBox.Size = new System.Drawing.Size(135, 28);
+      this.xAxisComboBox.TabIndex = 4;
+      this.xAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
+      // 
+      // yAxisComboBox
+      // 
+      this.yAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.yAxisComboBox.FormattingEnabled = true;
+      this.yAxisComboBox.Location = new System.Drawing.Point(240, 3);
+      this.yAxisComboBox.Name = "yAxisComboBox";
+      this.yAxisComboBox.Size = new System.Drawing.Size(135, 28);
+      this.yAxisComboBox.TabIndex = 5;
+      this.yAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
+      // 
+      // xLabel
+      // 
+      this.xLabel.AutoSize = true;
+      this.xLabel.Location = new System.Drawing.Point(3, 6);
+      this.xLabel.Name = "xLabel";
+      this.xLabel.Size = new System.Drawing.Size(20, 20);
+      this.xLabel.TabIndex = 6;
+      this.xLabel.Text = "x:";
+      // 
+      // yLabel
+      // 
+      this.yLabel.AutoSize = true;
+      this.yLabel.Location = new System.Drawing.Point(214, 6);
+      this.yLabel.Name = "yLabel";
+      this.yLabel.Size = new System.Drawing.Size(20, 20);
+      this.yLabel.TabIndex = 7;
+      this.yLabel.Text = "y:";
+      // 
+      // ParetoFrontScatterPlotView
+      // 
+      this.AllowDrop = true;
+      this.Controls.Add(this.yLabel);
+      this.Controls.Add(this.xLabel);
+      this.Controls.Add(this.yAxisComboBox);
+      this.Controls.Add(this.xAxisComboBox);
+      this.Controls.Add(this.scatterPlotView);
+      this.Margin = new System.Windows.Forms.Padding(6);
+      this.Name = "ParetoFrontScatterPlotView";
+      this.Size = new System.Drawing.Size(621, 382);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+    private HeuristicLab.Analysis.Views.ScatterPlotView scatterPlotView;
+    private System.Windows.Forms.ComboBox xAxisComboBox;
+    private System.Windows.Forms.ComboBox yAxisComboBox;
+    private System.Windows.Forms.Label xLabel;
+    private System.Windows.Forms.Label yLabel;
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotViewOfT.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotViewOfT.cs	(revision 17229)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis.Views/3.3/ParetoFrontScatterPlotViewOfT.cs	(revision 17229)
@@ -0,0 +1,197 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.Views {
+  [View("Scatter Plot")]
+  [Content(typeof(ParetoFrontScatterPlot<>))]
+  public partial class ParetoFrontScatterPlotView<T> : ItemView where T : class, IItem {
+
+    private readonly ScatterPlot scatterPlot;
+    private LinkedList<ScatterPlotDataRow> frontsRow;
+    private ScatterPlotDataRow bestKnownFrontRow;
+
+    private int oldObjectives = -1;
+
+    private bool suppressEvents;
+
+    public new ParetoFrontScatterPlot<T> Content {
+      get { return (ParetoFrontScatterPlot<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ParetoFrontScatterPlotView() {
+      InitializeComponent();
+
+      scatterPlot = new ScatterPlot();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        scatterPlotView.Content = null;
+        xAxisComboBox.Items.Clear();
+        xAxisComboBox.SelectedIndex = -1;
+        yAxisComboBox.Items.Clear();
+        yAxisComboBox.SelectedIndex = -1;
+        return;
+      }
+
+      scatterPlotView.Content = scatterPlot;
+
+      if (oldObjectives != Content.Objectives)
+        UpdateAxisComboBoxes();
+
+      UpdateChartData();
+
+      oldObjectives = Content.Objectives;
+    }
+
+    private void UpdateChartData() {
+      if (InvokeRequired) {
+        Invoke((Action)UpdateChartData);
+        return;
+      }
+
+      int xDimIndex = xAxisComboBox.SelectedIndex;
+      int yDimIndex = yAxisComboBox.SelectedIndex;
+
+      if (Content.BestKnownFront != null && Content.BestKnownFront.Count > 0) {
+        if (bestKnownFrontRow == null) {
+          bestKnownFrontRow = new ScatterPlotDataRow("Best Known Pareto Front", string.Empty, Enumerable.Empty<Point2D<double>>()) {
+            VisualProperties = {
+            PointSize = 4,
+            PointStyle = ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Square,
+            Color = Color.Gray
+          }
+          };
+          scatterPlot.Rows.Add(bestKnownFrontRow);
+        }
+        bestKnownFrontRow.Points.Replace(CreatePoints(Content.BestKnownFront, null, xDimIndex, yDimIndex));
+      } else if (bestKnownFrontRow != null) {
+        scatterPlot.Rows.Remove(bestKnownFrontRow);
+        bestKnownFrontRow = null;
+      }
+
+      if (Content.Fronts == null || Content.Fronts.Count == 0) {
+        if (frontsRow != null) {
+          foreach (var row in frontsRow) scatterPlot.Rows.Remove(row);
+          frontsRow = null;
+        }
+      } else {
+        if (frontsRow == null) frontsRow = new LinkedList<ScatterPlotDataRow>();
+        var row = frontsRow.First;
+        var front = 0;
+        while (front < Content.Fronts.Count) {
+          if (Content.Fronts[front].Length == 0) break;
+          if(row == null) {
+            row = frontsRow.AddLast(new ScatterPlotDataRow("Front " + front, "Points on Front #" + front, Enumerable.Empty<Point2D<double>>()) {
+              VisualProperties = {
+                  PointSize = 8,
+                  PointStyle = front == 0 ? ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Diamond : ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Circle,
+                  Color = front == 0 ? Color.Goldenrod : Color.DodgerBlue
+                }
+            });
+            scatterPlot.Rows.Add(row.Value);
+          }
+          row.Value.Points.Replace(CreatePoints(Content.Fronts[front], Content.Items[front], xDimIndex, yDimIndex));
+          row = row.Next;
+          front++;
+        }
+        while (row != null) {
+          scatterPlot.Rows.Remove(row.Value);
+          var next = row.Next;
+          frontsRow.Remove(row);
+          row = next;
+        }
+      }
+    }
+
+    private void UpdateAxisComboBoxes() {
+      try {
+        suppressEvents = true;
+
+        string prevSelectedX = (string)xAxisComboBox.SelectedItem;
+        string prevSelectedY = (string)yAxisComboBox.SelectedItem;
+
+        xAxisComboBox.Items.Clear();
+        yAxisComboBox.Items.Clear();
+
+        // Add Objectives first
+        for (int i = 0; i < Content.Objectives; i++) {
+          xAxisComboBox.Items.Add("Objective " + i);
+          yAxisComboBox.Items.Add("Objective " + i);
+        }
+
+        // Selection
+        int count = xAxisComboBox.Items.Count;
+        if (count > 0) {
+          if (prevSelectedX != null && xAxisComboBox.Items.Contains(prevSelectedX))
+            xAxisComboBox.SelectedItem = prevSelectedX;
+          else xAxisComboBox.SelectedIndex = 0;
+
+          if (prevSelectedY != null && yAxisComboBox.Items.Contains(prevSelectedY))
+            yAxisComboBox.SelectedItem = prevSelectedY;
+          else yAxisComboBox.SelectedIndex = Math.Min(1, count - 1);
+        } else {
+          xAxisComboBox.SelectedIndex = -1;
+          yAxisComboBox.SelectedIndex = -1;
+        }
+
+        UpdateAxisDescription();
+      } finally {
+        suppressEvents = false;
+      }
+    }
+
+    private void UpdateAxisDescription() {
+      scatterPlot.VisualProperties.XAxisTitle = (string)xAxisComboBox.SelectedItem;
+      scatterPlot.VisualProperties.YAxisTitle = (string)yAxisComboBox.SelectedItem;
+    }
+
+    private static Point2D<double>[] CreatePoints(IList<double[]> front, T[] solutions, int xDimIndex, int yDimIndex) {
+      if (front == null || front.Count == 0) return new Point2D<double>[0];
+      
+      var points = new Point2D<double>[front.Count];
+      for (int i = 0; i < front.Count; i++) {
+        points[i] = new Point2D<double>(front[i][xDimIndex], front[i][yDimIndex], solutions != null ? solutions[i] : null);
+      }
+      return points;
+    }
+
+    #region Event Handler
+    private void axisComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (suppressEvents) return;
+      UpdateAxisDescription();
+      UpdateChartData();
+    }
+    #endregion
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 17229)
@@ -155,4 +155,5 @@
     <Compile Include="MultiObjective\InvertedGenerationalDistanceAnalyzer.cs" />
     <Compile Include="MultiObjective\MultiObjectiveSuccessAnalyzer.cs" />
+    <Compile Include="MultiObjective\ParetoFrontScatterPlot.cs" />
     <Compile Include="MultiObjective\RankBasedParetoFrontAnalyzer.cs" />
     <Compile Include="MultiObjective\ParetoFrontAnalyzer.cs" />
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Analysis/3.3/MultiObjective/ParetoFrontScatterPlot.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Analysis/3.3/MultiObjective/ParetoFrontScatterPlot.cs	(revision 17229)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Analysis/3.3/MultiObjective/ParetoFrontScatterPlot.cs	(revision 17229)
@@ -0,0 +1,148 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Drawing;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Analysis {
+  [StorableType("1bc5f640-ed3a-49dd-9dca-aa034cc81e12")]
+  [Item("Pareto Front Scatter Plot", "The optimal front, current front(s) and associated items.")]
+  public class ParetoFrontScatterPlot<T> : Item where T: class, IItem {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    [Storable]
+    private int objectives;
+    public int Objectives {
+      get { return objectives; }
+    }
+
+    [Storable]
+    private IList<double[][]> fronts;
+    public IList<double[][]> Fronts {
+      get { return fronts; }
+    }
+
+    [Storable]
+    private IList<T[]> items;
+    public IList<T[]> Items {
+      get { return items; }
+    }
+
+    [Storable]
+    private IList<double[]> bestKnownFront;
+    public IList<double[]> BestKnownFront {
+      get { return bestKnownFront; }
+    }
+
+    [StorableConstructor]
+    protected ParetoFrontScatterPlot(StorableConstructorFlag _) : base(_) { }
+    public ParetoFrontScatterPlot() { }
+    public ParetoFrontScatterPlot(IList<double[][]> qualities, IList<T[]> items, IList<double[]> paretoFront, int objectives) {
+      this.fronts = qualities;
+      this.items = items;
+      this.bestKnownFront = paretoFront;
+      this.objectives = objectives;
+    }
+    protected ParetoFrontScatterPlot(ParetoFrontScatterPlot<T> original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.fronts != null) fronts = original.fronts.Select(s => s.Select(x => x.ToArray()).ToArray()).ToArray();
+      if (original.items != null) items = original.items.Select(s => s.Select(cloner.Clone).ToArray()).ToArray();
+      if (original.bestKnownFront != null) bestKnownFront = original.bestKnownFront.Select(s => s.ToArray()).ToArray();
+      objectives = original.objectives;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParetoFrontScatterPlot<T>(this, cloner);
+    }
+  }
+
+  [StorableType("3BF7AD0E-8D55-4033-974A-01DB16F9E41A")]
+  [Item("Pareto Front Scatter Plot", "The optimal front, current front and its associated Points in the searchspace")]
+  [Obsolete("Use the generic ParetoFrontScatterPlot<T> instead.")]
+  public class ParetoFrontScatterPlot : Item {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    [Storable]
+    private int objectives;
+    public int Objectives {
+      get { return objectives; }
+    }
+
+    [Storable]
+    private int problemSize;
+    public int ProblemSize {
+      get { return problemSize; }
+    }
+
+    [Storable]
+    private double[][] qualities;
+    public double[][] Qualities {
+      get { return qualities; }
+    }
+
+    [Storable]
+    private double[][] solutions;
+    public double[][] Solutions {
+      get { return solutions; }
+    }
+
+    [Storable]
+    private double[][] paretoFront;
+    public double[][] ParetoFront {
+      get { return paretoFront; }
+    }
+
+    #region Constructor, Cloning & Persistance
+    public ParetoFrontScatterPlot(double[][] qualities, double[][] solutions, double[][] paretoFront, int objectives, int problemSize) {
+      this.qualities = qualities;
+      this.solutions = solutions;
+      this.paretoFront = paretoFront;
+      this.objectives = objectives;
+      this.problemSize = problemSize;
+    }
+    public ParetoFrontScatterPlot() { }
+
+    protected ParetoFrontScatterPlot(ParetoFrontScatterPlot original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.qualities != null) qualities = original.qualities.Select(s => s.ToArray()).ToArray();
+      if (original.solutions != null) solutions = original.solutions.Select(s => s.ToArray()).ToArray();
+      if (original.paretoFront != null) paretoFront = original.paretoFront.Select(s => s.ToArray()).ToArray();
+      objectives = original.objectives;
+      problemSize = original.problemSize;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParetoFrontScatterPlot(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected ParetoFrontScatterPlot(StorableConstructorFlag _) : base(_) { }
+    #endregion
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 17229)
@@ -1,3 +1,4 @@
-﻿#region License Information
+﻿
+#region License Information
 /* HeuristicLab
  * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj	(revision 17229)
@@ -130,4 +130,5 @@
     <Compile Include="ArchitectureManipulators\SymbolicExpressionTreeArchitectureManipulator.cs" />
     <Compile Include="Grammars\GrammarUtils.cs" />
+    <Compile Include="SymbolicExpressionTreeMultiObjectiveProblem.cs" />
     <Compile Include="SymbolicExpressionTreeProblem.cs" />
     <Compile Include="Compiler\Instruction.cs" />
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMultiObjectiveProblem.cs	(revision 17229)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeMultiObjectiveProblem.cs	(revision 17229)
@@ -0,0 +1,71 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
+  [StorableType("f4819c68-b6fc-469f-bcb5-cb5b2a9d8aff")]
+  public abstract class SymbolicExpressionTreeMultiObjectiveProblem : MultiObjectiveProblem<SymbolicExpressionTreeEncoding, ISymbolicExpressionTree> {
+
+    // persistence
+    [StorableConstructor]
+    protected SymbolicExpressionTreeMultiObjectiveProblem(StorableConstructorFlag _) : base(_) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+
+    // cloning
+    protected SymbolicExpressionTreeMultiObjectiveProblem(SymbolicExpressionTreeMultiObjectiveProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected SymbolicExpressionTreeMultiObjectiveProblem(SymbolicExpressionTreeEncoding encoding)
+      : base(encoding) {
+      EncodingParameter.ReadOnly = true;
+    }
+
+    public override void Analyze(ISymbolicExpressionTree[] trees, double[][] qualities, ResultCollection results,
+      IRandom random) {
+      base.Analyze(trees, qualities, results, random);
+      var front = DominationCalculator.CalculateBestParetoFront(trees, qualities, Maximization);
+
+      // TODO: Calculate Pareto front and add to results
+    }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityCalculator.SolutionVariableName = Encoding.Name;
+        similarityCalculator.QualityVariableName = Evaluator.QualitiesParameter.ActualName;
+      }
+    }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeProblem.cs	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeProblem.cs	(revision 17229)
@@ -71,4 +71,16 @@
       }
     }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityCalculator.SolutionVariableName = Encoding.Name;
+        similarityCalculator.QualityVariableName = Evaluator.QualityParameter.ActualName;
+      }
+    }
   }
 }
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 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/Analyzers/ScatterPlotAnalyzer.cs	(revision 17229)
@@ -21,11 +21,11 @@
 
 using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
@@ -38,6 +38,6 @@
     }
 
-    public IResultParameter<ParetoFrontScatterPlot> ScatterPlotResultParameter {
-      get { return (IResultParameter<ParetoFrontScatterPlot>)Parameters["Scatterplot"]; }
+    public IResultParameter<ParetoFrontScatterPlot<RealVector>> ScatterPlotResultParameter {
+      get { return (IResultParameter<ParetoFrontScatterPlot<RealVector>>)Parameters["Scatterplot"]; }
     }
 
@@ -51,5 +51,5 @@
     public ScatterPlotAnalyzer() {
       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)"));
+      Parameters.Add(new ResultParameter<ParetoFrontScatterPlot<RealVector>>("Scatterplot", "The scatterplot for the current and optimal (if known front)"));
     }
 
@@ -58,6 +58,5 @@
       var individuals = IndividualsParameter.ActualValue;
       var testFunction = TestFunctionParameter.ActualValue;
-      var objectives = qualities.Length != 0 ? qualities[0].Length:0;    
-      var problemSize = individuals.Length != 0 ? individuals[0].Length:0;
+      var objectives = qualities.Length != 0 ? qualities[0].Length:0;
 
       var optimalFront = new double[0][];               
@@ -71,8 +70,10 @@
       }
 
-      var qualityClones = qualities.Select(s => s.ToArray()).ToArray();
-      var solutionClones = individuals.Select(s => s.ToArray()).ToArray();
-
-      ScatterPlotResultParameter.ActualValue = new ParetoFrontScatterPlot(qualityClones, solutionClones, optimalFront, objectives, problemSize);
+      var fronts = DominationCalculator.CalculateAllParetoFronts(individuals.ToArray(), qualities.Select(x => x.ToArray()).ToArray(), testFunction.Maximization(objectives), out var rank);
+      
+      ScatterPlotResultParameter.ActualValue = new ParetoFrontScatterPlot<RealVector>(
+        fronts.Select(x => x.Select(y => y.Item2).ToArray()).ToArray(),
+        fronts.Select(x => x.Select(y => y.Item1).ToArray()).ToArray(),
+        optimalFront, objectives);
       return base.Apply();
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/HeuristicLab.Problems.TestFunctions.MultiObjective-3.3.csproj	(revision 17229)
@@ -111,5 +111,4 @@
     <Compile Include="Calculators\InvertedGenerationalDistance.cs" />
     <Compile Include="Calculators\GenerationalDistance.cs" />
-    <Compile Include="ParetoFrontScatterPlot.cs" />
     <Compile Include="Utilities.cs" />
     <Compile Include="Instances\MISCInstanceProvider.cs" />
Index: anches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/ParetoFrontScatterPlot.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.MultiObjective/3.3/ParetoFrontScatterPlot.cs	(revision 17228)
+++ 	(revision )
@@ -1,92 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 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.Drawing;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HEAL.Attic;
-
-namespace HeuristicLab.Problems.TestFunctions.MultiObjective {
-  [StorableType("3BF7AD0E-8D55-4033-974A-01DB16F9E41A")]
-  [Item("Pareto Front Scatter Plot", "The optimal front, current front and its associated Points in the searchspace")]
-  public class ParetoFrontScatterPlot : Item {
-    public static new Image StaticItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
-    }
-
-    [Storable]
-    private int objectives;
-    public int Objectives {
-      get { return objectives; }
-    }
-
-    [Storable]
-    private int problemSize;
-    public int ProblemSize {
-      get { return problemSize; }
-    }
-
-    [Storable]
-    private double[][] qualities;
-    public double[][] Qualities {
-      get { return qualities; }
-    }
-
-    [Storable]
-    private double[][] solutions;
-    public double[][] Solutions {
-      get { return solutions; }
-    }
-
-    [Storable]
-    private double[][] paretoFront;
-    public double[][] ParetoFront {
-      get { return paretoFront; }
-    }
-
-    #region Constructor, Cloning & Persistance
-    public ParetoFrontScatterPlot(double[][] qualities, double[][] solutions, double[][] paretoFront, int objectives, int problemSize) {
-      this.qualities = qualities;
-      this.solutions = solutions;
-      this.paretoFront = paretoFront;
-      this.objectives = objectives;
-      this.problemSize = problemSize;
-    }
-    public ParetoFrontScatterPlot() { }
-
-    protected ParetoFrontScatterPlot(ParetoFrontScatterPlot original, Cloner cloner)
-      : base(original, cloner) {
-      if (original.qualities != null) qualities = original.qualities.Select(s => s.ToArray()).ToArray();
-      if (original.solutions != null) solutions = original.solutions.Select(s => s.ToArray()).ToArray();
-      if (original.paretoFront != null) paretoFront = original.paretoFront.Select(s => s.ToArray()).ToArray();
-      objectives = original.objectives;
-      problemSize = original.problemSize;
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ParetoFrontScatterPlot(this, cloner);
-    }
-
-    [StorableConstructor]
-    protected ParetoFrontScatterPlot(StorableConstructorFlag _) : base(_) { }
-    #endregion
-  }
-}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/HeuristicLab.Problems.TestFunctions.Views-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/HeuristicLab.Problems.TestFunctions.Views-3.3.csproj	(revision 17228)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/HeuristicLab.Problems.TestFunctions.Views-3.3.csproj	(revision 17229)
@@ -107,10 +107,4 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="ParetoFrontScatterPlotView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ParetoFrontScatterPlotView.Designer.cs">
-      <DependentUpon>ParetoFrontScatterPlotView.cs</DependentUpon>
-    </Compile>
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: anches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/ParetoFrontScatterPlotView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/ParetoFrontScatterPlotView.Designer.cs	(revision 17228)
+++ 	(revision )
@@ -1,129 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 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
-
-namespace HeuristicLab.Problems.TestFunctions.Views {
-  partial class ParetoFrontScatterPlotView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.scatterPlotView = new HeuristicLab.Analysis.Views.ScatterPlotView();
-      this.xAxisComboBox = new System.Windows.Forms.ComboBox();
-      this.yAxisComboBox = new System.Windows.Forms.ComboBox();
-      this.xLabel = new System.Windows.Forms.Label();
-      this.yLabel = new System.Windows.Forms.Label();
-      this.SuspendLayout();
-      // 
-      // scatterPlotView
-      // 
-      this.scatterPlotView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.scatterPlotView.Caption = "ScatterPlot View";
-      this.scatterPlotView.Content = null;
-      this.scatterPlotView.Location = new System.Drawing.Point(3, 37);
-      this.scatterPlotView.Name = "scatterPlotView";
-      this.scatterPlotView.ReadOnly = false;
-      this.scatterPlotView.ShowChartOnly = true;
-      this.scatterPlotView.Size = new System.Drawing.Size(615, 342);
-      this.scatterPlotView.TabIndex = 3;
-      // 
-      // xAxisComboBox
-      // 
-      this.xAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.xAxisComboBox.FormattingEnabled = true;
-      this.xAxisComboBox.Location = new System.Drawing.Point(29, 3);
-      this.xAxisComboBox.Name = "xAxisComboBox";
-      this.xAxisComboBox.Size = new System.Drawing.Size(135, 28);
-      this.xAxisComboBox.TabIndex = 4;
-      this.xAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
-      // 
-      // yAxisComboBox
-      // 
-      this.yAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.yAxisComboBox.FormattingEnabled = true;
-      this.yAxisComboBox.Location = new System.Drawing.Point(240, 3);
-      this.yAxisComboBox.Name = "yAxisComboBox";
-      this.yAxisComboBox.Size = new System.Drawing.Size(135, 28);
-      this.yAxisComboBox.TabIndex = 5;
-      this.yAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
-      // 
-      // xLabel
-      // 
-      this.xLabel.AutoSize = true;
-      this.xLabel.Location = new System.Drawing.Point(3, 6);
-      this.xLabel.Name = "xLabel";
-      this.xLabel.Size = new System.Drawing.Size(20, 20);
-      this.xLabel.TabIndex = 6;
-      this.xLabel.Text = "x:";
-      // 
-      // yLabel
-      // 
-      this.yLabel.AutoSize = true;
-      this.yLabel.Location = new System.Drawing.Point(214, 6);
-      this.yLabel.Name = "yLabel";
-      this.yLabel.Size = new System.Drawing.Size(20, 20);
-      this.yLabel.TabIndex = 7;
-      this.yLabel.Text = "y:";
-      // 
-      // ParetoFrontScatterPlotView
-      // 
-      this.AllowDrop = true;
-      this.Controls.Add(this.yLabel);
-      this.Controls.Add(this.xLabel);
-      this.Controls.Add(this.yAxisComboBox);
-      this.Controls.Add(this.xAxisComboBox);
-      this.Controls.Add(this.scatterPlotView);
-      this.Margin = new System.Windows.Forms.Padding(6);
-      this.Name = "ParetoFrontScatterPlotView";
-      this.Size = new System.Drawing.Size(621, 382);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-    private HeuristicLab.Analysis.Views.ScatterPlotView scatterPlotView;
-    private System.Windows.Forms.ComboBox xAxisComboBox;
-    private System.Windows.Forms.ComboBox yAxisComboBox;
-    private System.Windows.Forms.Label xLabel;
-    private System.Windows.Forms.Label yLabel;
-  }
-}
Index: anches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/ParetoFrontScatterPlotView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TestFunctions.Views/3.3/ParetoFrontScatterPlotView.cs	(revision 17228)
+++ 	(revision )
@@ -1,187 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 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.Linq;
-using HeuristicLab.Analysis;
-using HeuristicLab.Common;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-using HeuristicLab.Problems.TestFunctions.MultiObjective;
-
-namespace HeuristicLab.Problems.TestFunctions.Views {
-  [View("Scatter Plot")]
-  [Content(typeof(ParetoFrontScatterPlot))]
-  public partial class ParetoFrontScatterPlotView : ItemView {
-
-    private readonly ScatterPlot scatterPlot;
-    private readonly ScatterPlotDataRow qualitiesRow;
-    private readonly ScatterPlotDataRow paretoFrontRow;
-
-    private int oldObjectives = -1;
-    private int oldProblemSize = -1;
-
-    private bool suppressEvents;
-
-    public new ParetoFrontScatterPlot Content {
-      get { return (ParetoFrontScatterPlot)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public ParetoFrontScatterPlotView() {
-      InitializeComponent();
-
-      scatterPlot = new ScatterPlot();
-
-      qualitiesRow = new ScatterPlotDataRow("Qualities", string.Empty, Enumerable.Empty<Point2D<double>>()) {
-        VisualProperties = {
-          PointSize = 8 ,
-          PointStyle = ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Circle
-        }
-      };
-      scatterPlot.Rows.Add(qualitiesRow);
-
-      paretoFrontRow = new ScatterPlotDataRow("Best Known Pareto Front", string.Empty, Enumerable.Empty<Point2D<double>>()) {
-        VisualProperties = {
-            PointSize = 4,
-            PointStyle = ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Square
-          }
-      };
-      scatterPlot.Rows.Add(paretoFrontRow);
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-
-      if (Content == null) {
-        scatterPlotView.Content = null;
-        xAxisComboBox.Items.Clear();
-        xAxisComboBox.SelectedIndex = -1;
-        yAxisComboBox.Items.Clear();
-        yAxisComboBox.SelectedIndex = -1;
-        return;
-      }
-
-      scatterPlotView.Content = scatterPlot;
-
-      if (oldObjectives != Content.Objectives || oldProblemSize != Content.ProblemSize)
-        UpdateAxisComboBoxes();
-
-      UpdateChartData();
-
-      oldObjectives = Content.Objectives;
-      oldProblemSize = Content.ProblemSize;
-    }
-
-    private void UpdateChartData() {
-      if (InvokeRequired) {
-        Invoke((Action)UpdateChartData);
-        return;
-      }
-
-      int xDimGlobal = xAxisComboBox.SelectedIndex;
-      int yDimGlobal = yAxisComboBox.SelectedIndex;
-
-      qualitiesRow.Points.Replace(CreatePoints(Content.Qualities, Content.Solutions, xDimGlobal, yDimGlobal));
-
-      paretoFrontRow.Points.Replace(CreatePoints(Content.ParetoFront, null, xDimGlobal, yDimGlobal));
-      paretoFrontRow.VisualProperties.IsVisibleInLegend = paretoFrontRow.Points.Count > 0; // hide if empty
-    }
-
-    private void UpdateAxisComboBoxes() {
-      try {
-        suppressEvents = true;
-
-        string prevSelectedX = (string)xAxisComboBox.SelectedItem;
-        string prevSelectedY = (string)yAxisComboBox.SelectedItem;
-
-        xAxisComboBox.Items.Clear();
-        yAxisComboBox.Items.Clear();
-
-        // Add Objectives first
-        for (int i = 0; i < Content.Objectives; i++) {
-          xAxisComboBox.Items.Add("Objective " + i);
-          yAxisComboBox.Items.Add("Objective " + i);
-        }
-
-        // Add Problem Dimension
-        for (int i = 0; i < Content.ProblemSize; i++) {
-          xAxisComboBox.Items.Add("Problem Dimension " + i);
-          yAxisComboBox.Items.Add("Problem Dimension " + i);
-        }
-
-        // Selection
-        int count = xAxisComboBox.Items.Count;
-        if (count > 0) {
-          if (prevSelectedX != null && xAxisComboBox.Items.Contains(prevSelectedX))
-            xAxisComboBox.SelectedItem = prevSelectedX;
-          else xAxisComboBox.SelectedIndex = 0;
-
-          if (prevSelectedY != null && yAxisComboBox.Items.Contains(prevSelectedY))
-            yAxisComboBox.SelectedItem = prevSelectedY;
-          else yAxisComboBox.SelectedIndex = Math.Min(1, count - 1);
-        } else {
-          xAxisComboBox.SelectedIndex = -1;
-          yAxisComboBox.SelectedIndex = -1;
-        }
-
-        UpdateAxisDescription();
-      } finally {
-        suppressEvents = false;
-      }
-    }
-
-    private void UpdateAxisDescription() {
-      scatterPlot.VisualProperties.XAxisTitle = (string)xAxisComboBox.SelectedItem;
-      scatterPlot.VisualProperties.YAxisTitle = (string)yAxisComboBox.SelectedItem;
-    }
-
-    private static Point2D<double>[] CreatePoints(double[][] qualities, double[][] solutions, int xDimGlobal, int yDimGlobal) {
-      if (qualities == null || qualities.Length == 0) return new Point2D<double>[0];
-
-      int objectives = qualities[0].Length;
-
-      // "Global" dimension index describes the index as if the qualities and solutions would be in a single array
-      // If the global dimension index is too long for the qualities, use solutions
-      var xDimArray = xDimGlobal < objectives ? qualities : solutions;
-      var yDimArray = yDimGlobal < objectives ? qualities : solutions;
-      var xDimIndex = xDimGlobal < objectives ? xDimGlobal : xDimGlobal - objectives;
-      var yDimIndex = yDimGlobal < objectives ? yDimGlobal : yDimGlobal - objectives;
-
-      if (xDimArray == null || yDimArray == null)
-        return new Point2D<double>[0];
-
-      var points = new Point2D<double>[xDimArray.Length];
-      for (int i = 0; i < xDimArray.Length; i++) {
-        points[i] = new Point2D<double>(xDimArray[i][xDimIndex], yDimArray[i][yDimIndex]);
-      }
-      return points;
-    }
-
-    #region Event Handler
-    private void axisComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      if (suppressEvents) return;
-      UpdateAxisDescription();
-      UpdateChartData();
-    }
-    #endregion
-  }
-}
