Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/CheckedTransformationListView.cs	(revision 15242)
@@ -32,8 +32,6 @@
 namespace HeuristicLab.DataPreprocessing.Views {
   [View("CheckedTransformationList View")]
-  //[Content(typeof(RunCollectionConstraintCollection), true)]
   [Content(typeof(ICheckedItemList<ITransformation>), false)]
   public partial class CheckedTransformationListView : CheckedItemListView<ITransformation> {
-
     public CheckedTransformationListView() {
       InitializeComponent();
@@ -56,6 +54,5 @@
 
           return (ITransformation)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType(new[] { columnNames });
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
           ErrorHandling.ShowErrorDialog(this, ex);
         }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ComparisonFilterView.cs	(revision 15242)
@@ -32,8 +32,4 @@
   [Content(typeof(ComparisonFilter), false)]
   public partial class ComparisonFilterView : ItemView {
-    public ComparisonFilterView() {
-      InitializeComponent();
-    }
-
     public new ComparisonFilter Content {
       get { return (ComparisonFilter)base.Content; }
@@ -41,9 +37,12 @@
     }
 
+    public ComparisonFilterView() {
+      InitializeComponent();
+    }
 
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      cbAttr.Items.Clear(); //cmbConstraintColumn.Items.Clear();
-      cbFilterOperation.Items.Clear(); //cmbConstraintOperation.Items.Clear();
+      cbAttr.Items.Clear();
+      cbFilterOperation.Items.Clear();
       tbFilterData.Text = string.Empty;
       if (Content != null) {
@@ -121,5 +120,4 @@
     }
 
-
     protected virtual void Content_ComparisonOperationChanged(object sender, EventArgs e) {
       if (Content.ConstraintOperation != (ConstraintOperation)this.cbFilterOperation.SelectedItem)
@@ -178,5 +176,4 @@
         errorProvider.Clear();
     }
-
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.Designer.cs	(revision 15242)
@@ -54,9 +54,11 @@
       // chart
       // 
-      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.chart.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)));
       chartArea1.Name = "ChartArea1";
       this.chart.ChartAreas.Add(chartArea1);
+      legend1.Alignment = System.Drawing.StringAlignment.Center;
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
       legend1.Name = "Legend1";
       this.chart.Legends.Add(legend1);
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataCompletenessView.cs	(revision 15242)
@@ -24,5 +24,4 @@
 using System.Drawing;
 using System.Linq;
-using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
 using HeuristicLab.Core.Views;
@@ -30,5 +29,4 @@
 
 namespace HeuristicLab.DataPreprocessing.Views {
-
   [View("Histogram View")]
   [Content(typeof(DataCompletenessChartContent), true)]
@@ -69,5 +67,4 @@
 
     private void PrepareChart() {
-      chart.Titles.Add("DataCompletenessChart");
       chart.EnableDoubleClickResetsZoom = true;
       chart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 0;
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.Designer.cs	(revision 15242)
@@ -63,10 +63,20 @@
       this.btnReplace = new System.Windows.Forms.Button();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
       this.addRowButton = new System.Windows.Forms.Button();
       this.addColumnButton = new System.Windows.Forms.Button();
       this.renameColumnsButton = new System.Windows.Forms.Button();
+      this.showVariablesGroupBox = new System.Windows.Forms.GroupBox();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.contextMenuCell.SuspendLayout();
+      this.showVariablesGroupBox.SuspendLayout();
       this.SuspendLayout();
+      // 
+      // rowsLabel
+      // 
+      this.rowsLabel.Size = new System.Drawing.Size(55, 13);
+      this.rowsLabel.Text = "Datarows:";
       // 
       // rowsTextBox
@@ -82,12 +92,16 @@
       this.columnsTextBox.Size = new System.Drawing.Size(71, 20);
       // 
+      // columnsLabel
+      // 
+      this.columnsLabel.Size = new System.Drawing.Size(53, 13);
+      this.columnsLabel.Text = "Variables:";
+      // 
       // statisticsTextBox
       // 
-      this.statisticsTextBox.Location = new System.Drawing.Point(3, 387);
       this.statisticsTextBox.Size = new System.Drawing.Size(421, 13);
       // 
       // btnApplySort
       // 
-      this.btnApplySort.Location = new System.Drawing.Point(234, 0);
+      this.btnApplySort.Location = new System.Drawing.Point(228, 0);
       this.btnApplySort.Name = "btnApplySort";
       this.btnApplySort.Size = new System.Drawing.Size(104, 23);
@@ -104,5 +118,5 @@
             this.replaceValueOverSelectionToolStripMenuItem});
       this.contextMenuCell.Name = "contextMenuCell";
-      this.contextMenuCell.Size = new System.Drawing.Size(225, 48);
+      this.contextMenuCell.Size = new System.Drawing.Size(224, 48);
       // 
       // replaceValueOverColumnToolStripMenuItem
@@ -116,6 +130,6 @@
             this.smoothingToolStripMenuItem_Column});
       this.replaceValueOverColumnToolStripMenuItem.Name = "replaceValueOverColumnToolStripMenuItem";
-      this.replaceValueOverColumnToolStripMenuItem.Size = new System.Drawing.Size(224, 22);
-      this.replaceValueOverColumnToolStripMenuItem.Text = "Replace Value over Column";
+      this.replaceValueOverColumnToolStripMenuItem.Size = new System.Drawing.Size(223, 22);
+      this.replaceValueOverColumnToolStripMenuItem.Text = "Replace Value over Variable";
       // 
       // averageToolStripMenuItem_Column
@@ -169,5 +183,5 @@
             this.mostCommonToolStripMenuItem_Selection});
       this.replaceValueOverSelectionToolStripMenuItem.Name = "replaceValueOverSelectionToolStripMenuItem";
-      this.replaceValueOverSelectionToolStripMenuItem.Size = new System.Drawing.Size(224, 22);
+      this.replaceValueOverSelectionToolStripMenuItem.Size = new System.Drawing.Size(223, 22);
       this.replaceValueOverSelectionToolStripMenuItem.Text = "Replace Value over Selection";
       // 
@@ -202,5 +216,5 @@
       // btnSearch
       // 
-      this.btnSearch.Location = new System.Drawing.Point(173, 0);
+      this.btnSearch.Location = new System.Drawing.Point(167, 0);
       this.btnSearch.Name = "btnSearch";
       this.btnSearch.Size = new System.Drawing.Size(55, 23);
@@ -213,5 +227,5 @@
       // btnReplace
       // 
-      this.btnReplace.Location = new System.Drawing.Point(173, 26);
+      this.btnReplace.Location = new System.Drawing.Point(167, 26);
       this.btnReplace.Name = "btnReplace";
       this.btnReplace.Size = new System.Drawing.Size(55, 23);
@@ -222,11 +236,44 @@
       this.btnReplace.Click += new System.EventHandler(this.btnReplace_Click);
       // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(36, 19);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Select Inputs & Target");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(66, 19);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "Select None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(6, 19);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.checkAllButton, "Select All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
+      // 
       // addRowButton
       // 
-      this.addRowButton.Location = new System.Drawing.Point(344, 26);
+      this.addRowButton.Location = new System.Drawing.Point(338, 26);
       this.addRowButton.Name = "addRowButton";
-      this.addRowButton.Size = new System.Drawing.Size(76, 23);
+      this.addRowButton.Size = new System.Drawing.Size(83, 23);
       this.addRowButton.TabIndex = 10;
-      this.addRowButton.Text = "Add Row";
+      this.addRowButton.Text = "Add Datarow";
       this.addRowButton.UseVisualStyleBackColor = true;
       this.addRowButton.Click += new System.EventHandler(this.addRowButton_Click);
@@ -234,9 +281,9 @@
       // addColumnButton
       // 
-      this.addColumnButton.Location = new System.Drawing.Point(344, 0);
+      this.addColumnButton.Location = new System.Drawing.Point(338, 0);
       this.addColumnButton.Name = "addColumnButton";
-      this.addColumnButton.Size = new System.Drawing.Size(76, 23);
+      this.addColumnButton.Size = new System.Drawing.Size(83, 23);
       this.addColumnButton.TabIndex = 10;
-      this.addColumnButton.Text = "Add Column";
+      this.addColumnButton.Text = "Add Variable";
       this.addColumnButton.UseVisualStyleBackColor = true;
       this.addColumnButton.Click += new System.EventHandler(this.addColumnButton_Click);
@@ -244,16 +291,29 @@
       // renameColumnsButton
       // 
-      this.renameColumnsButton.Location = new System.Drawing.Point(234, 26);
+      this.renameColumnsButton.Location = new System.Drawing.Point(228, 26);
       this.renameColumnsButton.Name = "renameColumnsButton";
       this.renameColumnsButton.Size = new System.Drawing.Size(104, 23);
       this.renameColumnsButton.TabIndex = 11;
-      this.renameColumnsButton.Text = "Rename Columns";
+      this.renameColumnsButton.Text = "Rename Variables";
       this.renameColumnsButton.UseVisualStyleBackColor = true;
       this.renameColumnsButton.Click += new System.EventHandler(this.renameColumnsButton_Click);
       // 
+      // showVariablesGroupBox
+      // 
+      this.showVariablesGroupBox.Controls.Add(this.checkInputsTargetButton);
+      this.showVariablesGroupBox.Controls.Add(this.uncheckAllButton);
+      this.showVariablesGroupBox.Controls.Add(this.checkAllButton);
+      this.showVariablesGroupBox.Location = new System.Drawing.Point(448, 0);
+      this.showVariablesGroupBox.Name = "showVariablesGroupBox";
+      this.showVariablesGroupBox.Size = new System.Drawing.Size(97, 49);
+      this.showVariablesGroupBox.TabIndex = 17;
+      this.showVariablesGroupBox.TabStop = false;
+      this.showVariablesGroupBox.Text = "Show Variables";
+      // 
       // DataGridContentView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.showVariablesGroupBox);
       this.Controls.Add(this.renameColumnsButton);
       this.Controls.Add(this.addColumnButton);
@@ -263,5 +323,4 @@
       this.Controls.Add(this.btnApplySort);
       this.Name = "DataGridContentView";
-      this.Size = new System.Drawing.Size(430, 403);
       this.Controls.SetChildIndex(this.btnApplySort, 0);
       this.Controls.SetChildIndex(this.btnSearch, 0);
@@ -275,6 +334,8 @@
       this.Controls.SetChildIndex(this.rowsTextBox, 0);
       this.Controls.SetChildIndex(this.columnsTextBox, 0);
+      this.Controls.SetChildIndex(this.showVariablesGroupBox, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.contextMenuCell.ResumeLayout(false);
+      this.showVariablesGroupBox.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -304,4 +365,8 @@
     private System.Windows.Forms.Button addColumnButton;
     private System.Windows.Forms.Button renameColumnsButton;
+    private System.Windows.Forms.GroupBox showVariablesGroupBox;
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataGridContentView.cs	(revision 15242)
@@ -33,5 +33,4 @@
   [Content(typeof(DataGridContent), true)]
   public partial class DataGridContentView : StringConvertibleMatrixView {
-
     private bool isSearching = false;
     private bool updateOnMouseUp = false;
@@ -81,5 +80,4 @@
         base.Sort();
       }
-
     }
 
@@ -141,5 +139,4 @@
       }
     }
-
 
     protected override void PasteValuesToDataGridView() {
@@ -692,4 +689,25 @@
       }
     }
+
+    private void checkInputsTargetButton_Click(object sender, EventArgs e) {
+      foreach (DataGridViewColumn column in DataGridView.Columns) {
+        var variable = column.HeaderText;
+        bool isInputTarget = Content.PreProcessingData.InputVariables.Contains(variable)
+          || Content.PreProcessingData.TargetVariable == variable;
+        column.Visible = isInputTarget;
+      }
+    }
+
+    private void checkAllButton_Click(object sender, EventArgs e) {
+      foreach (DataGridViewColumn column in DataGridView.Columns) {
+        column.Visible = true;
+      }
+    }
+
+    private void uncheckAllButton_Click(object sender, EventArgs e) {
+      foreach (DataGridViewColumn column in DataGridView.Columns) {
+        column.Visible = false;
+      }
+    }
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 15242)
@@ -36,12 +36,11 @@
   [Content(typeof(PreprocessingContext), true)]
   public partial class DataPreprocessingView : NamedItemView {
-
-    public DataPreprocessingView() {
-      InitializeComponent();
-    }
-
     public new PreprocessingContext Content {
       get { return (PreprocessingContext)base.Content; }
       set { base.Content = value; }
+    }
+
+    public DataPreprocessingView() {
+      InitializeComponent();
     }
 
@@ -57,9 +56,10 @@
         var viewShortcuts = new ItemList<IViewShortcut> {
           new DataGridContent(data, manipulationLogic, filterLogic),
-          new StatisticsContent(statisticsLogic),
+          new StatisticsContent(data, statisticsLogic),
 
           new LineChartContent(data),
           new HistogramContent(data),
-          new ScatterPlotContent(data),
+          new SingleScatterPlotContent(data),
+          new MultiScatterPlotContent(data),
           new CorrelationMatrixContent(Content),
           new DataCompletenessChartContent(searchLogic),
@@ -125,11 +125,22 @@
     }
     private void newRegressionToolStripMenuItem_Click(object sender, EventArgs e) {
-      Content.Import(new RegressionProblemData());
+      if (CheckNew("Regression"))
+        Content.Import(new RegressionProblemData());
     }
     private void newClassificationToolStripMenuItem_Click(object sender, EventArgs e) {
-      Content.Import(new ClassificationProblemData());
+      if (CheckNew("Classification"))
+        Content.Import(new ClassificationProblemData());
     }
     private void newTimeSeriesToolStripMenuItem_Click(object sender, EventArgs e) {
-      Content.Import(new TimeSeriesPrognosisProblemData());
+      if (CheckNew("Time Series Prognosis"))
+        Content.Import(new TimeSeriesPrognosisProblemData());
+    }
+
+    private bool CheckNew(string type) {
+      return DialogResult.OK == MessageBox.Show(
+               this,
+               string.Format("When creating a new {0}, all previous information will be lost.", type),
+               "Continue?",
+               MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
     }
     #endregion
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessorStarter.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessorStarter.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessorStarter.cs	(revision 15242)
@@ -29,5 +29,4 @@
 namespace HeuristicLab.DataPreprocessing.Views {
   public class DataPreprocessorStarter : IDataPreprocessorStarter {
-
     public void Start(IDataAnalysisProblemData problemData, IContentView currentView) {
       IAlgorithm algorithm;
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.Designer.cs	(revision 15242)
@@ -62,12 +62,14 @@
       this.label2 = new System.Windows.Forms.Label();
       this.label3 = new System.Windows.Forms.Label();
+      this.bottomPanel = new System.Windows.Forms.Panel();
       this.groupBoxFilter.SuspendLayout();
       this.groupBoxFilterInfo.SuspendLayout();
       this.groupBox1.SuspendLayout();
+      this.bottomPanel.SuspendLayout();
       this.SuspendLayout();
       // 
       // groupBoxFilter
       // 
-      this.groupBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.groupBoxFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.groupBoxFilter.Controls.Add(this.checkedFilterView);
@@ -93,5 +95,5 @@
       // groupBoxFilterInfo
       // 
-      this.groupBoxFilterInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.groupBoxFilterInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.groupBoxFilterInfo.Controls.Add(this.lblPercentage);
@@ -103,5 +105,5 @@
       this.groupBoxFilterInfo.Location = new System.Drawing.Point(4, 337);
       this.groupBoxFilterInfo.Name = "groupBoxFilterInfo";
-      this.groupBoxFilterInfo.Size = new System.Drawing.Size(659, 102);
+      this.groupBoxFilterInfo.Size = new System.Drawing.Size(658, 102);
       this.groupBoxFilterInfo.TabIndex = 1;
       this.groupBoxFilterInfo.TabStop = false;
@@ -119,23 +121,23 @@
       // tbPercentage
       // 
-      this.tbPercentage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.tbPercentage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.tbPercentage.Enabled = false;
       this.tbPercentage.Location = new System.Drawing.Point(104, 71);
       this.tbPercentage.Name = "tbPercentage";
-      this.tbPercentage.Size = new System.Drawing.Size(549, 20);
+      this.tbPercentage.Size = new System.Drawing.Size(548, 20);
       this.tbPercentage.TabIndex = 10;
       // 
-      // tbFiltered
-      // 
-      this.tbRemaining.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      // tbRemaining
+      // 
+      this.tbRemaining.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.tbRemaining.Enabled = false;
       this.tbRemaining.Location = new System.Drawing.Point(104, 45);
       this.tbRemaining.Name = "tbRemaining";
-      this.tbRemaining.Size = new System.Drawing.Size(549, 20);
+      this.tbRemaining.Size = new System.Drawing.Size(548, 20);
       this.tbRemaining.TabIndex = 9;
       // 
-      // lblFiltered
+      // lblRemaining
       // 
       this.lblRemaining.AutoSize = true;
@@ -148,10 +150,10 @@
       // tbTotal
       // 
-      this.tbTotal.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.tbTotal.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.tbTotal.Enabled = false;
       this.tbTotal.Location = new System.Drawing.Point(104, 19);
       this.tbTotal.Name = "tbTotal";
-      this.tbTotal.Size = new System.Drawing.Size(549, 20);
+      this.tbTotal.Size = new System.Drawing.Size(548, 20);
       this.tbTotal.TabIndex = 7;
       // 
@@ -167,8 +169,8 @@
       // applyFilterButton
       // 
-      this.applyFilterButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.applyFilterButton.Anchor = System.Windows.Forms.AnchorStyles.Right;
       this.applyFilterButton.Cursor = System.Windows.Forms.Cursors.Default;
       this.applyFilterButton.Enabled = false;
-      this.applyFilterButton.Location = new System.Drawing.Point(554, 628);
+      this.applyFilterButton.Location = new System.Drawing.Point(559, 3);
       this.applyFilterButton.Name = "applyFilterButton";
       this.applyFilterButton.Size = new System.Drawing.Size(107, 23);
@@ -180,9 +182,9 @@
       // rBtnOr
       // 
-      this.rBtnOr.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.rBtnOr.Anchor = System.Windows.Forms.AnchorStyles.Left;
       this.rBtnOr.AutoSize = true;
       this.rBtnOr.Cursor = System.Windows.Forms.Cursors.Default;
       this.rBtnOr.Enabled = false;
-      this.rBtnOr.Location = new System.Drawing.Point(60, 634);
+      this.rBtnOr.Location = new System.Drawing.Point(53, 6);
       this.rBtnOr.Name = "rBtnOr";
       this.rBtnOr.Size = new System.Drawing.Size(36, 17);
@@ -193,10 +195,10 @@
       // rBtnAnd
       // 
-      this.rBtnAnd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.rBtnAnd.Anchor = System.Windows.Forms.AnchorStyles.Left;
       this.rBtnAnd.AutoSize = true;
       this.rBtnAnd.Checked = true;
       this.rBtnAnd.Cursor = System.Windows.Forms.Cursors.Default;
       this.rBtnAnd.Enabled = false;
-      this.rBtnAnd.Location = new System.Drawing.Point(10, 634);
+      this.rBtnAnd.Location = new System.Drawing.Point(3, 6);
       this.rBtnAnd.Name = "rBtnAnd";
       this.rBtnAnd.Size = new System.Drawing.Size(44, 17);
@@ -209,5 +211,5 @@
       // groupBox1
       // 
-      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.groupBox1.Controls.Add(this.label4);
@@ -215,7 +217,7 @@
       this.groupBox1.Controls.Add(this.label2);
       this.groupBox1.Controls.Add(this.label3);
-      this.groupBox1.Location = new System.Drawing.Point(7, 445);
+      this.groupBox1.Location = new System.Drawing.Point(4, 445);
       this.groupBox1.Name = "groupBox1";
-      this.groupBox1.Size = new System.Drawing.Size(659, 130);
+      this.groupBox1.Size = new System.Drawing.Size(658, 130);
       this.groupBox1.TabIndex = 12;
       this.groupBox1.TabStop = false;
@@ -261,16 +263,25 @@
       this.label3.Text = "A filter specifies the data rows which should remain.";
       // 
+      // bottomPanel
+      // 
+      this.bottomPanel.Controls.Add(this.applyFilterButton);
+      this.bottomPanel.Controls.Add(this.rBtnAnd);
+      this.bottomPanel.Controls.Add(this.rBtnOr);
+      this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.bottomPanel.Location = new System.Drawing.Point(0, 580);
+      this.bottomPanel.Name = "bottomPanel";
+      this.bottomPanel.Size = new System.Drawing.Size(670, 30);
+      this.bottomPanel.TabIndex = 13;
+      // 
       // FilterView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.bottomPanel);
       this.Controls.Add(this.groupBox1);
-      this.Controls.Add(this.rBtnAnd);
-      this.Controls.Add(this.rBtnOr);
-      this.Controls.Add(this.applyFilterButton);
       this.Controls.Add(this.groupBoxFilterInfo);
       this.Controls.Add(this.groupBoxFilter);
       this.Name = "FilterView";
-      this.Size = new System.Drawing.Size(670, 660);
+      this.Size = new System.Drawing.Size(670, 610);
       this.groupBoxFilter.ResumeLayout(false);
       this.groupBoxFilterInfo.ResumeLayout(false);
@@ -278,6 +289,7 @@
       this.groupBox1.ResumeLayout(false);
       this.groupBox1.PerformLayout();
+      this.bottomPanel.ResumeLayout(false);
+      this.bottomPanel.PerformLayout();
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -302,6 +314,5 @@
     private System.Windows.Forms.Label label2;
     private System.Windows.Forms.Label label3;
-
-
+    private System.Windows.Forms.Panel bottomPanel;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/FilterView.cs	(revision 15242)
@@ -32,4 +32,8 @@
   [Content(typeof(FilterContent), true)]
   public partial class FilterView : ItemView {
+    public new FilterContent Content {
+      get { return (FilterContent)base.Content; }
+      set { base.Content = value; }
+    }
 
     public FilterView() {
@@ -45,9 +49,4 @@
       checkedFilterView.Content.ItemsRemoved += Content_ItemsRemoved;
       checkedFilterView.Content.CheckedItemsChanged += Content_CheckedItemsChanged;
-    }
-
-    public new FilterContent Content {
-      get { return (FilterContent)base.Content; }
-      set { base.Content = value; }
     }
 
@@ -122,5 +121,4 @@
       }
     }
-
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 15242)
@@ -89,10 +89,7 @@
   <ItemGroup>
     <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Windows.Forms.DataVisualization" />
-    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
@@ -128,4 +125,9 @@
       <DependentUpon>ComparisonFilterView.cs</DependentUpon>
     </Compile>
+    <Compile Include="PreprocessingIcons.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PreprocessingIcons.resx</DependentUpon>
+    </Compile>
     <Compile Include="RenameColumnsDialog.cs">
       <SubType>Form</SubType>
@@ -159,10 +161,4 @@
     </Compile>
     <Compile Include="DataPreprocessorStarter.cs" />
-    <Compile Include="PreprocessingDataTableView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="PreprocessingDataTableView.Designer.cs">
-      <DependentUpon>PreprocessingDataTableView.cs</DependentUpon>
-    </Compile>
     <Compile Include="FilterView.cs">
       <SubType>UserControl</SubType>
@@ -177,10 +173,4 @@
       <DependentUpon>ScatterPlotMultiView.cs</DependentUpon>
     </Compile>
-    <Compile Include="PreprocessingScatterPlotView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="PreprocessingScatterPlotView.Designer.cs">
-      <DependentUpon>PreprocessingScatterPlotView.cs</DependentUpon>
-    </Compile>
     <Compile Include="SearchAndReplaceDialog.cs">
       <SubType>Form</SubType>
@@ -214,10 +204,4 @@
       <DependentUpon>PreprocessingChartView.cs</DependentUpon>
     </Compile>
-    <Compile Include="PreprocessingCheckedItemListView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="PreprocessingCheckedItemListView.Designer.cs">
-      <DependentUpon>PreprocessingCheckedItemListView.cs</DependentUpon>
-    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="StatisticsView.cs">
@@ -235,4 +219,7 @@
     <Compile Include="Utils\FindPreprocessingItemsIterator.cs" />
     <Compile Include="Utils\IFindPreprocessingItemsIterator.cs" />
+    <Compile Include="Utils\VerticalLabel.cs">
+      <SubType>Component</SubType>
+    </Compile>
     <Compile Include="ViewShortcutListView.cs">
       <SubType>UserControl</SubType>
@@ -249,15 +236,15 @@
   <ItemGroup>
     <ProjectReference Include="..\..\HeuristicLab.Analysis.Views\3.3\HeuristicLab.Analysis.Views-3.3.csproj">
-      <Project>{76945d76-ca61-4147-9dc2-0acdcddf87f9}</Project>
+      <Project>{76945D76-CA61-4147-9DC2-0ACDCDDF87F9}</Project>
       <Name>HeuristicLab.Analysis.Views-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
-      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
       <Name>HeuristicLab.Analysis-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
-      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
       <Name>HeuristicLab.Collections-3.3</Name>
       <Private>False</Private>
@@ -269,15 +256,15 @@
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
-      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
       <Name>HeuristicLab.Common-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
-      <Project>{e226881d-315f-423d-b419-a766fe0d8685}</Project>
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
       <Name>HeuristicLab.Core.Views-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
-      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
       <Name>HeuristicLab.Core-3.3</Name>
       <Private>False</Private>
@@ -289,10 +276,10 @@
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.DataPreprocessing\3.4\HeuristicLab.DataPreprocessing-3.4.csproj">
-      <Project>{3b90f866-70f8-43ef-a541-51819d255b7b}</Project>
+      <Project>{3B90F866-70F8-43EF-A541-51819D255B7B}</Project>
       <Name>HeuristicLab.DataPreprocessing-3.4</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
-      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
       <Name>HeuristicLab.Data-3.3</Name>
       <Private>False</Private>
@@ -304,10 +291,10 @@
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
-      <Project>{3bd61258-31da-4b09-89c0-4f71fef5f05a}</Project>
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
       <Name>HeuristicLab.MainForm-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
-      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
       <Private>False</Private>
@@ -319,15 +306,15 @@
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
-      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
       <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Views\3.4\HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj">
-      <Project>{3e9e8944-44ff-40bb-a622-3a4a7dd0f198}</Project>
+      <Project>{3E9E8944-44FF-40BB-A622-3A4A7DD0F198}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis.Views-3.4</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis\3.4\HeuristicLab.Problems.DataAnalysis-3.4.csproj">
-      <Project>{df87c13e-a889-46ff-8153-66dcaa8c5674}</Project>
+      <Project>{DF87C13E-A889-46FF-8153-66DCAA8C5674}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
       <Private>False</Private>
@@ -353,4 +340,18 @@
       <Private>False</Private>
     </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="PreprocessingIcons.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>PreprocessingIcons.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ScatterPlotSingleView.resx">
+      <DependentUpon>ScatterPlotSingleView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Icons\All.png" />
+    <Content Include="Icons\Inputs.png" />
+    <Content Include="Icons\None.png" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.Designer.cs	(revision 15242)
@@ -45,14 +45,25 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       this.optionsBox = new System.Windows.Forms.GroupBox();
-      this.displayDetailsCheckBox = new System.Windows.Forms.CheckBox();
-      this.label1 = new System.Windows.Forms.Label();
-      this.classifierComboBox = new System.Windows.Forms.ComboBox();
+      this.groupingTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.variableLabel = new System.Windows.Forms.Label();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.aggregationLabel = new System.Windows.Forms.Label();
+      this.orderComboBox = new System.Windows.Forms.ComboBox();
+      this.groupingComboBox = new System.Windows.Forms.ComboBox();
+      this.aggregationComboBox = new System.Windows.Forms.ComboBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.SuspendLayout();
       this.optionsBox.SuspendLayout();
+      this.groupingTableLayoutPanel.SuspendLayout();
       this.SuspendLayout();
       // 
+      // sizeGroupBox
+      // 
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 258);
+      // 
       // splitContainer
       // 
@@ -64,49 +75,101 @@
       // optionsBox
       // 
-      this.optionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.optionsBox.Controls.Add(this.displayDetailsCheckBox);
-      this.optionsBox.Controls.Add(this.label1);
-      this.optionsBox.Controls.Add(this.classifierComboBox);
-      this.optionsBox.Location = new System.Drawing.Point(4, 262);
+      this.optionsBox.Controls.Add(this.groupingTableLayoutPanel);
+      this.optionsBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.optionsBox.Location = new System.Drawing.Point(0, 302);
       this.optionsBox.Name = "optionsBox";
-      this.optionsBox.Size = new System.Drawing.Size(84, 138);
+      this.optionsBox.Size = new System.Drawing.Size(180, 101);
       this.optionsBox.TabIndex = 7;
       this.optionsBox.TabStop = false;
-      this.optionsBox.Text = "Options";
-      // 
-      // displayDetailsCheckBox
-      // 
-      this.displayDetailsCheckBox.AutoSize = true;
-      this.displayDetailsCheckBox.Location = new System.Drawing.Point(5, 58);
-      this.displayDetailsCheckBox.Margin = new System.Windows.Forms.Padding(2);
-      this.displayDetailsCheckBox.Name = "displayDetailsCheckBox";
-      this.displayDetailsCheckBox.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
-      this.displayDetailsCheckBox.Size = new System.Drawing.Size(119, 17);
-      this.displayDetailsCheckBox.TabIndex = 3;
-      this.displayDetailsCheckBox.Text = "Display value count";
-      this.displayDetailsCheckBox.UseVisualStyleBackColor = true;
-      this.displayDetailsCheckBox.CheckedChanged += new System.EventHandler(this.displayDetailsCheckBox_CheckedChanged);
-      // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 15);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(81, 13);
-      this.label1.TabIndex = 2;
-      this.label1.Text = "Target variable:";
-      // 
-      // classifierComboBox
-      // 
-      this.classifierComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.classifierComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.classifierComboBox.FormattingEnabled = true;
-      this.classifierComboBox.Location = new System.Drawing.Point(5, 32);
-      this.classifierComboBox.Name = "classifierComboBox";
-      this.classifierComboBox.Size = new System.Drawing.Size(73, 21);
-      this.classifierComboBox.TabIndex = 1;
-      this.classifierComboBox.SelectedIndexChanged += new System.EventHandler(this.classifierComboBox_SelectedIndexChanged);
+      this.optionsBox.Text = "Grouping Options";
+      // 
+      // groupingTableLayoutPanel
+      // 
+      this.groupingTableLayoutPanel.ColumnCount = 2;
+      this.groupingTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.groupingTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+      this.groupingTableLayoutPanel.Controls.Add(this.variableLabel, 0, 0);
+      this.groupingTableLayoutPanel.Controls.Add(this.orderLabel, 0, 2);
+      this.groupingTableLayoutPanel.Controls.Add(this.aggregationLabel, 0, 1);
+      this.groupingTableLayoutPanel.Controls.Add(this.orderComboBox, 1, 2);
+      this.groupingTableLayoutPanel.Controls.Add(this.groupingComboBox, 1, 0);
+      this.groupingTableLayoutPanel.Controls.Add(this.aggregationComboBox, 1, 1);
+      this.groupingTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupingTableLayoutPanel.Location = new System.Drawing.Point(3, 16);
+      this.groupingTableLayoutPanel.Name = "groupingTableLayoutPanel";
+      this.groupingTableLayoutPanel.RowCount = 3;
+      this.groupingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.groupingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.groupingTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.groupingTableLayoutPanel.Size = new System.Drawing.Size(174, 82);
+      this.groupingTableLayoutPanel.TabIndex = 3;
+      // 
+      // variableLabel
+      // 
+      this.variableLabel.AutoSize = true;
+      this.variableLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableLabel.Location = new System.Drawing.Point(3, 0);
+      this.variableLabel.Name = "variableLabel";
+      this.variableLabel.Size = new System.Drawing.Size(48, 27);
+      this.variableLabel.TabIndex = 2;
+      this.variableLabel.Text = "Variable:";
+      this.variableLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.orderLabel.Location = new System.Drawing.Point(3, 54);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(48, 28);
+      this.orderLabel.TabIndex = 2;
+      this.orderLabel.Text = "Order:";
+      this.orderLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.toolTip.SetToolTip(this.orderLabel, "Order of Legend Entries");
+      // 
+      // aggregationLabel
+      // 
+      this.aggregationLabel.AutoSize = true;
+      this.aggregationLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.aggregationLabel.Location = new System.Drawing.Point(3, 27);
+      this.aggregationLabel.Name = "aggregationLabel";
+      this.aggregationLabel.Size = new System.Drawing.Size(48, 27);
+      this.aggregationLabel.TabIndex = 2;
+      this.aggregationLabel.Text = "Aggr.:";
+      this.aggregationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.toolTip.SetToolTip(this.aggregationLabel, "Aggregation");
+      // 
+      // orderComboBox
+      // 
+      this.orderComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.orderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.orderComboBox.FormattingEnabled = true;
+      this.orderComboBox.Location = new System.Drawing.Point(57, 57);
+      this.orderComboBox.Name = "orderComboBox";
+      this.orderComboBox.Size = new System.Drawing.Size(114, 21);
+      this.orderComboBox.TabIndex = 1;
+      this.orderComboBox.SelectedIndexChanged += new System.EventHandler(this.orderComboBox_SelectedIndexChanged);
+      // 
+      // groupingComboBox
+      // 
+      this.groupingComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupingComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.groupingComboBox.FormattingEnabled = true;
+      this.groupingComboBox.Location = new System.Drawing.Point(57, 3);
+      this.groupingComboBox.Name = "groupingComboBox";
+      this.groupingComboBox.Size = new System.Drawing.Size(114, 21);
+      this.groupingComboBox.TabIndex = 1;
+      this.groupingComboBox.SelectedIndexChanged += new System.EventHandler(this.classifierComboBox_SelectedIndexChanged);
+      // 
+      // aggregationComboBox
+      // 
+      this.aggregationComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.aggregationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.aggregationComboBox.FormattingEnabled = true;
+      this.aggregationComboBox.Location = new System.Drawing.Point(57, 30);
+      this.aggregationComboBox.Name = "aggregationComboBox";
+      this.aggregationComboBox.Size = new System.Drawing.Size(114, 21);
+      this.aggregationComboBox.TabIndex = 1;
+      this.aggregationComboBox.SelectedIndexChanged += new System.EventHandler(this.aggregationComboBox_SelectedIndexChanged);
       // 
       // HistogramView
@@ -120,5 +183,6 @@
       this.splitContainer.ResumeLayout(false);
       this.optionsBox.ResumeLayout(false);
-      this.optionsBox.PerformLayout();
+      this.groupingTableLayoutPanel.ResumeLayout(false);
+      this.groupingTableLayoutPanel.PerformLayout();
       this.ResumeLayout(false);
 
@@ -128,8 +192,12 @@
 
     private System.Windows.Forms.GroupBox optionsBox;
-    private System.Windows.Forms.ComboBox classifierComboBox;
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.CheckBox displayDetailsCheckBox;
-
+    private System.Windows.Forms.ComboBox groupingComboBox;
+    private System.Windows.Forms.Label variableLabel;
+    private System.Windows.Forms.Label aggregationLabel;
+    private System.Windows.Forms.ComboBox aggregationComboBox;
+    private System.Windows.Forms.TableLayoutPanel groupingTableLayoutPanel;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.ComboBox orderComboBox;
+    private System.Windows.Forms.ToolTip toolTip;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/HistogramView.cs	(revision 15242)
@@ -21,36 +21,12 @@
 
 using System;
+using System.Drawing;
 using HeuristicLab.Analysis;
 using HeuristicLab.MainForm;
 
 namespace HeuristicLab.DataPreprocessing.Views {
-
   [View("Histogram View")]
   [Content(typeof(HistogramContent), true)]
   public partial class HistogramView : PreprocessingChartView {
-    private const string HISTOGRAM_CHART_TITLE = "Histogram";
-
-    public HistogramView() {
-      InitializeComponent();
-      chartType = DataRowVisualProperties.DataRowChartType.Histogram;
-      chartTitle = HISTOGRAM_CHART_TITLE;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content != null) {
-        classifierComboBox.Items.Clear();
-        classifierComboBox.Items.Add("None");
-
-        foreach (string var in Content.GetVariableNamesForHistogramClassification()) {
-          classifierComboBox.Items.Add(var);
-        }
-
-        if (classifierComboBox.SelectedItem == null && Content.ClassifierVariableIndex < classifierComboBox.Items.Count) {
-          classifierComboBox.SelectedIndex = Content.ClassifierVariableIndex;
-        }
-      }
-    }
-
     public new HistogramContent Content {
       get { return (HistogramContent)base.Content; }
@@ -58,29 +34,55 @@
     }
 
-    private void classifierComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      if (classifierComboBox.SelectedItem == null)
-        return;
+    public HistogramView() {
+      InitializeComponent();
+      aggregationComboBox.DataSource = Enum.GetValues(typeof(DataTableVisualProperties.DataTableHistogramAggregation));
+      aggregationComboBox.SelectedItem = DataTableVisualProperties.DataTableHistogramAggregation.Overlapping;
+      orderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
+      orderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
+    }
 
-      if (classifierComboBox.SelectedIndex != 0) {
-        int columndIndex = Content.PreprocessingData.GetColumnIndex(classifierComboBox.SelectedItem.ToString());
-        Classification = Content.PreprocessingData.GetValues<double>(columndIndex);
-      } else {
-        Classification = null;
-      }
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      groupingComboBox.Items.Clear();
+      groupingComboBox.Items.Add(string.Empty);
 
-      Content.ClassifierVariableIndex = classifierComboBox.SelectedIndex;
-      if (Content.IsDetailedChartViewEnabled != IsDetailedChartViewEnabled) {
-        displayDetailsCheckBox.Checked = Content.IsDetailedChartViewEnabled;
-      } else {
-        GenerateChart();
+      if (Content != null) {
+        foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData)) {
+          groupingComboBox.Items.Add(var);
+        }
+
+        groupingComboBox.SelectedItem = Content.GroupingVariableName ?? string.Empty;
       }
     }
-    private void displayDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
-      bool isChecked = displayDetailsCheckBox.Checked;
-      if (IsDetailedChartViewEnabled != isChecked) {
-        IsDetailedChartViewEnabled = isChecked;
-        Content.IsDetailedChartViewEnabled = isChecked;
-        GenerateChart();
+
+    protected override DataTable CreateDataTable(string variableName) {
+      var aggregation = (DataTableVisualProperties.DataTableHistogramAggregation)aggregationComboBox.SelectedItem;
+      var hist = HistogramContent.CreateHistogram(Content.PreprocessingData, variableName, Content.GroupingVariableName, aggregation, Content.Order);
+      hist.VisualProperties.TitleFont = new Font(DefaultFont.FontFamily, 10, FontStyle.Bold);
+      return hist;
+    }
+
+    private void classifierComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.GroupingVariableName = groupingComboBox.SelectedItem.ToString();
+
+      // rebuild datatables
+      InitData();
+      GenerateLayout();
+    }
+
+    private void aggregationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      foreach (var dt in dataTables.Values) {
+        dt.VisualProperties.HistogramAggregation = (DataTableVisualProperties.DataTableHistogramAggregation)aggregationComboBox.SelectedItem;
       }
+    }
+
+    private void orderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (Content == null) return;
+
+      Content.Order = (PreprocessingChartContent.LegendOrder)orderComboBox.SelectedItem;
+
+      // rebuild datatables
+      InitData();
+      GenerateLayout();
     }
   }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.Designer.cs	(revision 15242)
@@ -62,10 +62,9 @@
       // optionsBox
       // 
-      this.optionsBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
       this.optionsBox.Controls.Add(this.allInOneCheckBox);
-      this.optionsBox.Location = new System.Drawing.Point(4, 262);
+      this.optionsBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.optionsBox.Location = new System.Drawing.Point(0, 357);
       this.optionsBox.Name = "optionsBox";
-      this.optionsBox.Size = new System.Drawing.Size(84, 138);
+      this.optionsBox.Size = new System.Drawing.Size(180, 46);
       this.optionsBox.TabIndex = 7;
       this.optionsBox.TabStop = false;
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/LineChartView.cs	(revision 15242)
@@ -21,20 +21,20 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Analysis;
+using HeuristicLab.Analysis.Views;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
 using HeuristicLab.MainForm;
+using HeuristicLab.Visualization.ChartControlsExtensions;
 
 namespace HeuristicLab.DataPreprocessing.Views {
-
   [View("Line Chart View")]
   [Content(typeof(LineChartContent), true)]
   public partial class LineChartView : PreprocessingChartView {
-
-    private const string LINE_CHART_TITLE = "Line Chart";
-
-    public LineChartView() {
-      InitializeComponent();
-      chartType = DataRowVisualProperties.DataRowChartType.Line;
-      chartTitle = LINE_CHART_TITLE;
-    }
+    protected Dictionary<string, DataRow> allInOneDataRows;
+    protected DataTable allInOneDataTable;
+    protected DataTableView allInOneDataTableView;
 
     public new LineChartContent Content {
@@ -43,8 +43,63 @@
     }
 
+    public LineChartView() {
+      InitializeComponent();
+      sizeGroupBox.Visible = false;
+
+      allInOneDataRows = new Dictionary<string, DataRow>();
+      allInOneDataTable = new DataTable();
+    }
+
+    protected override void InitData() {
+      base.InitData();
+
+      allInOneDataRows.Clear();
+      foreach (var x in Content.VariableItemList.Select((v, i) => new { variable = v.Value, i })) {
+        var row = Content.CreateDataRow(x.variable, DataRowVisualProperties.DataRowChartType.Line);
+        row.VisualProperties.Color = Colors[x.i % Colors.Length];
+        allInOneDataRows.Add(x.variable, row);
+      }
+
+      allInOneDataTable.Rows.Clear();
+      var rows = Content.VariableItemList.CheckedItems.Select(v => allInOneDataRows[v.Value.Value]);
+      allInOneDataTable.Rows.AddRange(rows);
+    }
+
+    protected override int GetNumberOfVisibleDataTables() {
+      return Content.AllInOneMode ? 1 : base.GetNumberOfVisibleDataTables();
+    }
+    protected override IEnumerable<DataTableView> GetVisibleDataTables() {
+      if (Content.AllInOneMode) {
+        if (allInOneDataTableView == null)
+          allInOneDataTableView = new DataTableView() { Content = allInOneDataTable, ShowChartOnly = true };
+        return new[] { allInOneDataTableView };
+      }
+      return base.GetVisibleDataTables();
+    }
+    protected override DataTable CreateDataTable(string variableName) {
+      var dt = new DataTable();
+      var row = Content.CreateDataRow(variableName, DataRowVisualProperties.DataRowChartType.Line);
+      dt.Rows.Add(row);
+
+      var validValues = row.Values.Where(x => !double.IsNaN(x) && !double.IsInfinity(x)).ToList();
+      if (validValues.Any()) {
+        try {
+          double axisMin, axisMax, axisInterval;
+          ChartUtil.CalculateOptimalAxisInterval(validValues.Min(), validValues.Max(), out axisMin, out axisMax, out axisInterval);
+          dt.VisualProperties.YAxisMinimumAuto = false;
+          dt.VisualProperties.YAxisMaximumAuto = false;
+          dt.VisualProperties.YAxisMinimumFixedValue = axisMin;
+          dt.VisualProperties.YAxisMaximumFixedValue = axisMax;
+        } catch (ArgumentOutOfRangeException) { }
+      }
+      return dt;
+    }
+
     private void allInOneCheckBox_CheckedChanged(object sender, EventArgs e) {
       Content.AllInOneMode = allInOneCheckBox.Checked;
 
-      GenerateChart();
+      sizeGroupBox.Visible = !allInOneCheckBox.Checked;
+
+      GenerateLayout();
     }
 
@@ -55,4 +110,42 @@
       }
     }
+
+    protected override void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+      base.CheckedItemsChanged(sender, checkedItems);
+
+      foreach (IndexedItem<StringValue> item in checkedItems.Items) {
+        string variableName = item.Value.Value;
+
+        if (IsVariableChecked(variableName)) {
+          // ToDo: avoid clearing all rows, but how?
+          allInOneDataTable.Rows.Clear();
+          var rows = Content.VariableItemList.CheckedItems.Select(r => allInOneDataRows[r.Value.Value]);
+          allInOneDataTable.Rows.AddRange(rows);
+        } else {
+          allInOneDataTable.Rows.Remove(variableName);
+        }
+      }
+    }
+
+    #region Add/Remove/Update Variable, Reset
+    protected override void AddVariable(string name) {
+      base.AddVariable(name);
+      var row = Content.CreateDataRow(name, DataRowVisualProperties.DataRowChartType.Line);
+      allInOneDataTable.Rows.Add(row);
+    }
+
+    // remove variable from data table and item list
+    protected override void RemoveVariable(string name) {
+      base.RemoveVariable(name);
+      allInOneDataTable.Rows.Remove(name);
+    }
+
+    protected override void UpdateVariable(string name) {
+      base.UpdateVariable(name);
+      allInOneDataTable.Rows.Remove(name);
+      var newRow = Content.CreateDataRow(name, DataRowVisualProperties.DataRowChartType.Line);
+      allInOneDataTable.Rows.Add(newRow);
+    }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ManipulationView.cs	(revision 15242)
@@ -31,11 +31,14 @@
 
 namespace HeuristicLab.DataPreprocessing.Views {
-
   [View("Manipulation Chart View")]
   [Content(typeof(ManipulationContent), true)]
   public partial class ManipulationView : ItemView {
-
     private Action[] validators;
     private Action[] manipulations;
+
+    public new ManipulationContent Content {
+      get { return (ManipulationContent)base.Content; }
+      set { base.Content = value; }
+    }
 
     public ManipulationView() {
@@ -49,18 +52,18 @@
       tabsPreview.SizeMode = TabSizeMode.Fixed;
 
-      validators = new Action[] { 
-        ()=>validateDeleteColumnsInfo(),
-        ()=>validateDeleteColumnsVariance(),
-        ()=>validateDeleteRowsInfo(),
-        ()=>validateReplaceWith(),
-        ()=>validateShuffle()
+      validators = new Action[] {
+        () => ValidateDeleteColumnsInfo(),
+        () => ValidateDeleteColumnsVariance(),
+        () => ValidateDeleteRowsInfo(),
+        () => ValidateReplaceWith(),
+        () => ValidateShuffle()
       };
 
-      manipulations = new Action[] { 
-        ()=>Content.ManipulationLogic.DeleteColumnsWithMissingValuesGreater(getDeleteColumnsInfo()),
-        ()=>Content.ManipulationLogic.DeleteColumnsWithVarianceSmaller(getDeleteColumnsVariance()),
-        ()=>Content.ManipulationLogic.DeleteRowsWithMissingValuesGreater(getRowsColumnsInfo()),
-        ()=>replaceMissingValues(),
-        ()=>Content.ManipulationLogic.Shuffle(shuffleSeparatelyCheckbox.Checked)
+      manipulations = new Action[] {
+        () => Content.ManipulationLogic.DeleteColumnsWithMissingValuesGreater(GetDeleteColumnsInfo()),
+        () => Content.ManipulationLogic.DeleteColumnsWithVarianceSmaller(GetDeleteColumnsVariance()),
+        () => Content.ManipulationLogic.DeleteRowsWithMissingValuesGreater(GetRowsColumnsInfo()),
+        () => ReplaceMissingValues(),
+        () => Content.ManipulationLogic.Shuffle(shuffleSeparatelyCheckbox.Checked)
       };
     }
@@ -111,17 +114,17 @@
     }
 
-    private double getDeleteColumnsInfo() {
+    private double GetDeleteColumnsInfo() {
       return double.Parse(txtDeleteColumnsInfo.Text);
     }
 
-    private double getDeleteColumnsVariance() {
+    private double GetDeleteColumnsVariance() {
       return double.Parse(txtDeleteColumnsVariance.Text);
     }
 
-    private double getRowsColumnsInfo() {
+    private double GetRowsColumnsInfo() {
       return double.Parse(txtDeleteRowsInfo.Text);
     }
 
-    private void replaceMissingValues() {
+    private void ReplaceMissingValues() {
       var allIndices = Content.SearchLogic.GetMissingValueIndices();
       var columnIndex = cmbVariableNames.SelectedIndex;
@@ -149,8 +152,8 @@
     }
 
-    private void validateDeleteColumnsInfo() {
-      validateDoubleTextBox(txtDeleteColumnsInfo.Text);
+    private void ValidateDeleteColumnsInfo() {
+      ValidateDoubleTextBox(txtDeleteColumnsInfo.Text);
       if (btnApply.Enabled) {
-        var filteredColumns = Content.ManipulationLogic.ColumnsWithMissingValuesGreater(getDeleteColumnsInfo());
+        var filteredColumns = Content.ManipulationLogic.ColumnsWithMissingValuesGreater(GetDeleteColumnsInfo());
         int count = filteredColumns.Count;
         int columnCount = Content.FilterLogic.PreprocessingData.Columns;
@@ -180,8 +183,8 @@
     }
 
-    private void validateDeleteColumnsVariance() {
-      validateDoubleTextBox(txtDeleteColumnsVariance.Text);
+    private void ValidateDeleteColumnsVariance() {
+      ValidateDoubleTextBox(txtDeleteColumnsVariance.Text);
       if (btnApply.Enabled) {
-        var filteredColumns = Content.ManipulationLogic.ColumnsWithVarianceSmaller(getDeleteColumnsVariance());
+        var filteredColumns = Content.ManipulationLogic.ColumnsWithVarianceSmaller(GetDeleteColumnsVariance());
         int count = filteredColumns.Count;
         int columnCount = Content.FilterLogic.PreprocessingData.Columns;
@@ -211,8 +214,8 @@
     }
 
-    private void validateDeleteRowsInfo() {
-      validateDoubleTextBox(txtDeleteRowsInfo.Text);
+    private void ValidateDeleteRowsInfo() {
+      ValidateDoubleTextBox(txtDeleteRowsInfo.Text);
       if (btnApply.Enabled) {
-        int count = Content.ManipulationLogic.RowsWithMissingValuesGreater(getRowsColumnsInfo()).Count;
+        int count = Content.ManipulationLogic.RowsWithMissingValuesGreater(GetRowsColumnsInfo()).Count;
         int rowCount = Content.FilterLogic.PreprocessingData.Rows;
         lblPreviewRowsInfo.Text = count + " row" + (count > 1 || count == 0 ? "s" : "") + " of " + rowCount + " (" + string.Format("{0:F2}%", 100d / rowCount * count) + ") were detected with more than " + txtDeleteRowsInfo.Text + "% missing values.";
@@ -227,5 +230,5 @@
     }
 
-    private void validateReplaceWith() {
+    private void ValidateReplaceWith() {
       btnApply.Enabled = false;
       string replaceWith = (string)cmbReplaceWith.SelectedItem;
@@ -260,5 +263,5 @@
     }
 
-    private void validateShuffle() {
+    private void ValidateShuffle() {
       btnApply.Enabled = true;
       lblShuffleProperties.Enabled = false;
@@ -268,9 +271,4 @@
     }
 
-    public new ManipulationContent Content {
-      get { return (ManipulationContent)base.Content; }
-      set { base.Content = value; }
-    }
-
     private void lstMethods_SelectedIndexChanged(object sender, System.EventArgs e) {
       int index = lstMethods.SelectedIndex;
@@ -308,5 +306,5 @@
     }
 
-    private void validateDoubleTextBox(String text) {
+    private void ValidateDoubleTextBox(String text) {
       btnApply.Enabled = false;
       if (!string.IsNullOrEmpty(text)) {
@@ -319,13 +317,13 @@
 
     private void txtDeleteColumnsInfo_TextChanged(object sender, EventArgs e) {
-      validateDeleteColumnsInfo();
+      ValidateDeleteColumnsInfo();
     }
 
     private void txtDeleteColumnsVariance_TextChanged(object sender, EventArgs e) {
-      validateDeleteColumnsVariance();
+      ValidateDeleteColumnsVariance();
     }
 
     private void txtDeleteRowsInfo_TextChanged(object sender, EventArgs e) {
-      validateDeleteRowsInfo();
+      ValidateDeleteRowsInfo();
     }
 
@@ -334,9 +332,9 @@
       lblValueColon.Visible = isReplaceWithValueSelected;
       txtReplaceValue.Visible = isReplaceWithValueSelected;
-      validateReplaceWith();
+      ValidateReplaceWith();
     }
 
     private void txtReplaceValue_TextChanged(object sender, EventArgs e) {
-      validateReplaceWith();
+      ValidateReplaceWith();
     }
   }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs	(revision 15242)
@@ -45,11 +45,16 @@
     /// </summary>
     private void InitializeComponent() {
-      this.dataTableView = new HeuristicLab.DataPreprocessing.Views.PreprocessingDataTableView();
       this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.sizeGroupBox = new System.Windows.Forms.GroupBox();
+      this.columnsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.columnsLabel = new System.Windows.Forms.Label();
+      this.scrollPanel = new System.Windows.Forms.Panel();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
       this.splitContainer.SuspendLayout();
-      this.tableLayoutPanel.SuspendLayout();
+      this.sizeGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.columnsNumericUpDown)).BeginInit();
+      this.scrollPanel.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -57,32 +62,20 @@
       // 
       // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.sizeGroupBox);
+      // 
       // splitContainer.Panel2
       // 
-      this.splitContainer.Panel2.Controls.Add(this.tableLayoutPanel);
-      // 
-      // dataTableView
-      // 
-      this.dataTableView.AutoScroll = true;
-      this.dataTableView.Caption = "DataTable View";
-      this.dataTableView.Classification = null;
-      this.dataTableView.Content = null;
-      this.dataTableView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.dataTableView.IsDetailedChartViewEnabled = false;
-      this.dataTableView.Location = new System.Drawing.Point(3, 3);
-      this.dataTableView.Name = "dataTableView";
-      this.dataTableView.ReadOnly = false;
-      this.dataTableView.ShowLegend = true;
-      this.dataTableView.Size = new System.Drawing.Size(553, 397);
-      this.dataTableView.TabIndex = 0;
-      this.dataTableView.XAxisFormat = "";
-      this.dataTableView.YAxisFormat = "";
+      this.splitContainer.Panel2.Controls.Add(this.scrollPanel);
+      this.splitContainer.Panel2.Resize += new System.EventHandler(this.splitContainer_Panel2_Resize);
       // 
       // tableLayoutPanel
       // 
+      this.tableLayoutPanel.AutoSize = true;
+      this.tableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
       this.tableLayoutPanel.ColumnCount = 1;
       this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
       this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
-      this.tableLayoutPanel.Controls.Add(this.dataTableView, 0, 0);
-      this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
       this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
       this.tableLayoutPanel.Name = "tableLayoutPanel";
@@ -90,7 +83,58 @@
       this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
       this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
-      this.tableLayoutPanel.Size = new System.Drawing.Size(559, 403);
+      this.tableLayoutPanel.Size = new System.Drawing.Size(0, 0);
       this.tableLayoutPanel.TabIndex = 0;
       this.tableLayoutPanel.Layout += new System.Windows.Forms.LayoutEventHandler(this.tableLayoutPanel_Layout);
+      // 
+      // sizeGroupBox
+      // 
+      this.sizeGroupBox.Controls.Add(this.columnsNumericUpDown);
+      this.sizeGroupBox.Controls.Add(this.columnsLabel);
+      this.sizeGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 359);
+      this.sizeGroupBox.Name = "sizeGroupBox";
+      this.sizeGroupBox.Size = new System.Drawing.Size(180, 44);
+      this.sizeGroupBox.TabIndex = 8;
+      this.sizeGroupBox.TabStop = false;
+      this.sizeGroupBox.Text = "Chart Size";
+      // 
+      // columnsNumericUpDown
+      // 
+      this.columnsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.columnsNumericUpDown.Location = new System.Drawing.Point(88, 14);
+      this.columnsNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.columnsNumericUpDown.Name = "columnsNumericUpDown";
+      this.columnsNumericUpDown.Size = new System.Drawing.Size(86, 20);
+      this.columnsNumericUpDown.TabIndex = 3;
+      this.columnsNumericUpDown.Value = new decimal(new int[] {
+            3,
+            0,
+            0,
+            0});
+      this.columnsNumericUpDown.ValueChanged += new System.EventHandler(this.columnsNumericUpDown_ValueChanged);
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.AutoSize = true;
+      this.columnsLabel.Location = new System.Drawing.Point(6, 16);
+      this.columnsLabel.Name = "columnsLabel";
+      this.columnsLabel.Size = new System.Drawing.Size(76, 13);
+      this.columnsLabel.TabIndex = 1;
+      this.columnsLabel.Text = "Max. Columns:";
+      // 
+      // scrollPanel
+      // 
+      this.scrollPanel.AutoScroll = true;
+      this.scrollPanel.Controls.Add(this.tableLayoutPanel);
+      this.scrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scrollPanel.Location = new System.Drawing.Point(0, 0);
+      this.scrollPanel.Name = "scrollPanel";
+      this.scrollPanel.Size = new System.Drawing.Size(470, 403);
+      this.scrollPanel.TabIndex = 1;
       // 
       // PreprocessingChartView
@@ -103,5 +147,9 @@
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
-      this.tableLayoutPanel.ResumeLayout(false);
+      this.sizeGroupBox.ResumeLayout(false);
+      this.sizeGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.columnsNumericUpDown)).EndInit();
+      this.scrollPanel.ResumeLayout(false);
+      this.scrollPanel.PerformLayout();
       this.ResumeLayout(false);
 
@@ -110,6 +158,9 @@
     #endregion
 
-    private DataPreprocessing.Views.PreprocessingDataTableView dataTableView;
-    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+    protected System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+    private System.Windows.Forms.NumericUpDown columnsNumericUpDown;
+    private System.Windows.Forms.Label columnsLabel;
+    private System.Windows.Forms.Panel scrollPanel;
+    protected System.Windows.Forms.GroupBox sizeGroupBox;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 15242)
@@ -22,10 +22,13 @@
 using System;
 using System.Collections.Generic;
+using System.Drawing;
 using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Analysis;
+using HeuristicLab.Analysis.Views;
 using HeuristicLab.Collections;
 using HeuristicLab.Data;
 using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
 
 namespace HeuristicLab.DataPreprocessing.Views {
@@ -33,25 +36,20 @@
   [Content(typeof(PreprocessingChartContent), false)]
   public partial class PreprocessingChartView : PreprocessingCheckedVariablesView {
-
-    protected PreprocessingDataTable dataTable;
-    protected List<PreprocessingDataTable> dataTablePerVariable;
-    protected List<DataRow> dataRows;
-    protected List<DataRow> selectedDataRows;
-
-    protected DataRowVisualProperties.DataRowChartType chartType;
-    protected string chartTitle;
-
-    private const string DEFAULT_CHART_TITLE = "Chart";
-    private const int FIXED_CHART_SIZE = 300;
-    private const int MAX_TABLE_AUTO_SIZE_ROWS = 3;
-
-
-    public IEnumerable<double> Classification { get; set; }
-    public bool IsDetailedChartViewEnabled { get; set; }
+    protected Dictionary<string, DataTable> dataTables;
+    protected Dictionary<string, DataTableView> dataTableViews;
+
+    public static readonly Color[] Colors = {
+      Color.FromArgb(59, 136, 239), Color.FromArgb(252, 177, 59), Color.FromArgb(226, 64, 10),
+      Color.FromArgb(5, 100, 146), Color.FromArgb(191, 191, 191), Color.FromArgb(26, 59, 105),
+      Color.FromArgb(255, 226, 126), Color.FromArgb(18, 156, 221), Color.FromArgb(202, 107, 75),
+      Color.FromArgb(0, 92, 219), Color.FromArgb(243, 210, 136), Color.FromArgb(80, 99, 129),
+      Color.FromArgb(241, 185, 168), Color.FromArgb(224, 131, 10), Color.FromArgb(120, 147, 190)
+    };
 
     public PreprocessingChartView() {
       InitializeComponent();
-      chartType = DataRowVisualProperties.DataRowChartType.Line;
-      chartTitle = DEFAULT_CHART_TITLE;
+      dataTables = new Dictionary<string, DataTable>();
+      dataTableViews = new Dictionary<string, DataTableView>();
+      scrollPanel.HorizontalScroll.Visible = false;
     }
 
@@ -60,37 +58,30 @@
       if (Content != null) {
         InitData();
-        GenerateChart();
-
-        foreach (var row in dataRows) {
-          string variableName = row.Name;
-          if (!IsVariableChecked(variableName)) {
-            dataTableView.SetRowEnabled(variableName, false);
-            dataTable.SelectedRows.Remove(variableName);
-            dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName)));
-          }
-        }
-      }
-    }
-
-    private void InitData() {
-      //Create data tables and data rows
-      dataRows = Content.CreateAllDataRows(chartType);
-      dataTable = new PreprocessingDataTable(chartTitle);
-      dataTablePerVariable = new List<PreprocessingDataTable>();
-
-      //add data rows to data tables according to checked item list
-      foreach (var row in dataRows) {
-        string variableName = row.Name;
-
-        //add row to data table
-        dataTable.Rows.Add(row);
-
-        //add row to data table per variable
-        PreprocessingDataTable d = new PreprocessingDataTable(variableName);
-        d.Rows.Add(row);
-        dataTablePerVariable.Add(d);
-      }
-
-      UpdateSelection();
+        GenerateLayout();
+      }
+    }
+
+    protected virtual int GetNumberOfVisibleDataTables() {
+      return Content.VariableItemList.CheckedItems.Count();
+    }
+
+    protected virtual IEnumerable<DataTableView> GetVisibleDataTables() {
+      foreach (var name in Content.VariableItemList.CheckedItems) {
+        if (!dataTableViews.ContainsKey(name.Value.Value))
+          dataTableViews.Add(name.Value.Value, new DataTableView() { Content = dataTables[name.Value.Value], ShowChartOnly = true });
+        yield return dataTableViews[name.Value.Value];
+      }
+    }
+
+    protected virtual DataTable CreateDataTable(string variableName) {
+      return null;
+    }
+
+    protected virtual void InitData() {
+      dataTables.Clear();
+      dataTableViews.Clear();
+      foreach (var variable in Content.VariableItemList.Select(v => v.Value)) {
+        dataTables.Add(variable, CreateDataTable(variable));
+      }
     }
 
@@ -98,64 +89,14 @@
       base.CheckedItemsChanged(sender, checkedItems);
 
-      foreach (IndexedItem<StringValue> item in checkedItems.Items) {
-        string variableName = item.Value.Value;
-
-
-        if (!IsVariableChecked(variableName)) {
-          // not checked -> remove
-          dataTableView.SetRowEnabled(variableName, false);
-          dataTable.SelectedRows.Remove(variableName);
-          dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == variableName)));
-        } else {
-          // checked -> add
-          DataRow row = GetDataRow(variableName);
-          DataRow selectedRow = GetSelectedDataRow(variableName);
-          dataTableView.SetRowEnabled(variableName, true);
-
-          PreprocessingDataTable pdt = new PreprocessingDataTable(variableName);
-          pdt.Rows.Add(row);
-          // dataTablePerVariable does not contain unchecked variables => reduce insert position by number of uncheckt variables to correct the index
-          int uncheckedUntilVariable = checkedItemList.Content.TakeWhile(x => x.Value != variableName).Count(x => !checkedItemList.Content.ItemChecked(x));
-          dataTablePerVariable.Insert(item.Index - uncheckedUntilVariable, pdt);
-
-          //update selection
-          if (selectedRow != null) {
-            dataTable.SelectedRows.Add(selectedRow);
-            pdt.SelectedRows.Add(selectedRow);
-          }
-        }
-      }
-
-      // update chart if not in all in one mode
-      if (Content != null && !Content.AllInOneMode)
-        GenerateChart();
-    }
-
-    private DataRow GetSelectedDataRow(string variableName) {
-      foreach (DataRow row in selectedDataRows) {
-        if (row.Name == variableName)
-          return row;
-      }
-      return null;
-    }
-    private DataRow GetDataRow(string variableName) {
-      foreach (DataRow row in dataRows) {
-        if (row.Name == variableName)
-          return row;
-      }
-      return null;
-    }
+      GenerateLayout();
+    }
+
 
     #region Add/Remove/Update Variable, Reset
     protected override void AddVariable(string name) {
       base.AddVariable(name);
-      DataRow row = Content.CreateDataRow(name, chartType);
-      dataTable.Rows.Add(row);
-      PreprocessingDataTable d = new PreprocessingDataTable(name);
-      d.Rows.Add(row);
-      dataTablePerVariable.Add(d);
-
-      if (!Content.AllInOneMode)
-        GenerateChart();
+      dataTables.Add(name, CreateDataTable(name));
+
+      GenerateLayout();
     }
 
@@ -163,21 +104,17 @@
     protected override void RemoveVariable(string name) {
       base.RemoveVariable(name);
-      dataTable.Rows.Remove(name);
-      dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == name)));
-
-      if (!Content.AllInOneMode)
-        GenerateChart();
+      dataTables.Remove(name);
+      dataTableViews.Remove(name);
+
+      GenerateLayout();
     }
 
     protected override void UpdateVariable(string name) {
       base.UpdateVariable(name);
-      DataRow newRow = Content.CreateDataRow(name, chartType);
-      dataTable.Rows.Remove(name);
-      dataTable.Rows.Add(newRow);
-      DataTable dt = dataTablePerVariable.Find(x => x.Rows.Find(y => y.Name == name) != null);
-      if (dt != null) {
-        dt.Rows.Remove(name);
-        dt.Rows.Add(newRow);
-      }
+      dataTables.Remove(name);
+      var newDataTable = CreateDataTable(name);
+      dataTables.Add(name, newDataTable);
+      dataTableViews[name].Content = newDataTable;
+      GenerateLayout();
     }
     protected override void ResetAllVariables() {
@@ -186,94 +123,59 @@
     #endregion
 
-    #region Generate Charts
-    protected void GenerateChart() {
+    protected override void CheckedChangedUpdate() {
+      GenerateLayout();
+    }
+
+    #region Generate Layout
+    protected void GenerateLayout() {
+      if (SuppressCheckedChangedUpdate)
+        return;
+
+      scrollPanel.SuspendRepaint();
+
       ClearTableLayout();
-      if (Content.AllInOneMode) {
-        GenerateSingleChartLayout();
-      } else
-        GenerateMultiChartLayout();
-    }
-
-    private void GenerateSingleChartLayout() {
-      tableLayoutPanel.ColumnCount = 1;
-      tableLayoutPanel.RowCount = 1;
-      tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
-      tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100));
-      tableLayoutPanel.Controls.Add(dataTableView, 0, 0);
-      dataTableView.Content = dataTable;
-    }
-
-    private void GenerateMultiChartLayout() {
-      int checkedItemsCnt = 0;
-      foreach (var item in Content.VariableItemList.CheckedItems)
-        checkedItemsCnt++;
-
-      // set columns and rows based on number of items
-      int columns = GetNrOfMultiChartColumns(checkedItemsCnt);
-      int rows = GetNrOfMultiChartRows(checkedItemsCnt, columns);
-
-      tableLayoutPanel.ColumnCount = columns;
-      tableLayoutPanel.RowCount = rows;
-
-      List<PreprocessingDataTable>.Enumerator enumerator = dataTablePerVariable.GetEnumerator();
-      for (int x = 0; x < columns; x++) {
-
-        if (rows <= MAX_TABLE_AUTO_SIZE_ROWS)
-          tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100 / columns));
-        else
-          //scrollbar is shown if there are more than 3 rows -> remove scroll bar width from total width
-          tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, (tableLayoutPanel.Width - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth) / columns));
-        for (int y = 0; y < rows; y++) {
-          //Add a row only when creating the first column
-          if (x == 0) {
-            // fixed chart size when there are more than 3 tables
-            if (rows > MAX_TABLE_AUTO_SIZE_ROWS)
-              tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, FIXED_CHART_SIZE));
-            else
-              tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100 / rows));
+
+      int nrCharts = GetNumberOfVisibleDataTables();
+
+      // Set columns and rows based on number of items
+      int columns = Math.Min(nrCharts, (int)columnsNumericUpDown.Value);
+      int rows = (int)Math.Ceiling((float)nrCharts / columns);
+
+      tableLayoutPanel.ColumnCount = Math.Max(columns, 0);
+      tableLayoutPanel.RowCount = Math.Max(rows, 0);
+
+      if (columns > 0 && rows > 0) {
+        var width = (splitContainer.Panel2.Width - SystemInformation.VerticalScrollBarWidth) / columns;
+        var height = width * 0.75f;
+
+        using (var enumerator = GetVisibleDataTables().GetEnumerator()) {
+          for (int row = 0; row < rows; row++) {
+            tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, height));
+            for (int col = 0; col < columns; col++) {
+              if (row == 0) {
+                // Add a column-style only when creating the first row
+                tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, width));
+              }
+
+              if (enumerator.MoveNext())
+                AddDataTableToTableLayout(enumerator.Current, row, col);
+
+            }
           }
-
-          enumerator.MoveNext();
-          PreprocessingDataTable d = enumerator.Current;
-          AddDataTableToTableLayout(d, x, y);
-
         }
-      }
-    }
-    private int GetNrOfMultiChartColumns(int itemCount) {
-      int columns = 0;
-      if (itemCount <= 2)
-        columns = 1;
-      else if (itemCount <= 6)
-        columns = 2;
-      else
-        columns = 3;
-      return columns;
-    }
-    private int GetNrOfMultiChartRows(int itemCount, int columns) {
-      int rows = 0;
-      if (columns == 3)
-        rows = (itemCount + 2) / columns;
-      else if (columns == 2)
-        rows = (itemCount + 1) / columns;
-      else
-        rows = itemCount / columns;
-      return rows;
-    }
-
-    private void AddDataTableToTableLayout(PreprocessingDataTable dataTable, int x, int y) {
-      PreprocessingDataTableView dataView = new PreprocessingDataTableView();
-      dataView.Classification = Classification;
-      dataView.IsDetailedChartViewEnabled = IsDetailedChartViewEnabled;
-
+        tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 0));
+      }
+
+      scrollPanel.ResumeRepaint(true);
+    }
+
+    private void AddDataTableToTableLayout(DataTableView dataTable, int row, int col) {
       if (dataTable == null) {
         // dummy panel for empty field 
-        Panel p = new Panel();
-        p.Dock = DockStyle.Fill;
-        tableLayoutPanel.Controls.Add(p, y, x);
+        Panel p = new Panel { Dock = DockStyle.Fill };
+        tableLayoutPanel.Controls.Add(p, col, row);
       } else {
-        dataView.Content = dataTable;
-        dataView.Dock = DockStyle.Fill;
-        tableLayoutPanel.Controls.Add(dataView, y, x);
+        dataTable.Dock = DockStyle.Fill;
+        tableLayoutPanel.Controls.Add(dataTable, col, row);
       }
     }
@@ -286,6 +188,4 @@
       tableLayoutPanel.ColumnStyles.Clear();
       tableLayoutPanel.RowStyles.Clear();
-      tableLayoutPanel.AutoScroll = false;
-      tableLayoutPanel.AutoScroll = true;
     }
     //Remove horizontal scroll bar if visible
@@ -293,6 +193,5 @@
       if (tableLayoutPanel.HorizontalScroll.Visible) {
         // Add padding on the right in order to accomodate the vertical scrollbar
-        int vWidth = SystemInformation.VerticalScrollBarWidth;
-        tableLayoutPanel.Padding = new Padding(0, 0, vWidth, 0);
+        tableLayoutPanel.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0);
       } else {
         // Reset padding
@@ -302,28 +201,28 @@
     #endregion
 
-    #region Update Selection
-    protected override void PreprocessingData_SelctionChanged(object sender, EventArgs e) {
-      base.PreprocessingData_SelctionChanged(sender, e);
-      UpdateSelection();
-    }
-
-    private void UpdateSelection() {
-      //update data table selection
-      selectedDataRows = Content.CreateAllSelectedDataRows(chartType);
-      dataTable.SelectedRows.Clear();
-      foreach (var selectedRow in selectedDataRows) {
-        if (IsVariableChecked(selectedRow.Name))
-          dataTable.SelectedRows.Add(selectedRow);
-      }
-
-      //update data table per variable selection
-      foreach (PreprocessingDataTable d in dataTablePerVariable) {
-        d.SelectedRows.Clear();
-        DataRow row = selectedDataRows.Find(x => x.Name == d.Name);
-        if (row != null)
-          d.SelectedRows.Add(row);
-      }
-    }
-    #endregion
+    private void columnsNumericUpDown_ValueChanged(object sender, System.EventArgs e) {
+      GenerateLayout();
+    }
+
+    private void splitContainer_Panel2_Resize(object sender, EventArgs e) {
+      if (SuppressCheckedChangedUpdate)
+        return;
+
+      scrollPanel.SuspendRepaint();
+
+      if (tableLayoutPanel.ColumnCount > 0 && tableLayoutPanel.RowCount > 0) {
+        var width = (splitContainer.Panel2.Width - SystemInformation.VerticalScrollBarWidth) / tableLayoutPanel.ColumnCount;
+        var height = width * 0.75f;
+
+        for (int i = 0; i < tableLayoutPanel.RowStyles.Count - 1; i++) {
+          tableLayoutPanel.RowStyles[i].Height = height;
+        }
+        for (int i = 0; i < tableLayoutPanel.ColumnStyles.Count; i++) {
+          tableLayoutPanel.ColumnStyles[i].Width = width;
+        }
+      }
+
+      scrollPanel.ResumeRepaint(true);
+    }
   }
 }
Index: able/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedItemListView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedItemListView.Designer.cs	(revision 15241)
+++ 	(revision )
@@ -1,55 +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
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  partial class PreprocessingCheckedItemListView {
-    /// <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() {
-      components = new System.ComponentModel.Container();
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-    }
-
-    #endregion
-  }
-}
Index: able/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedItemListView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedItemListView.cs	(revision 15241)
+++ 	(revision )
@@ -1,56 +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.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.Data;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.DataPreprocessing.Views {
-
-  [View("PreprocessingCheckedItemList View")]
-  [Content(typeof(CheckedItemList<StringValue>), false)]
-  [Content(typeof(ICheckedItemList<StringValue>), false)]
-  public partial class PreprocessingCheckedItemListView : CheckedItemListView<StringValue> {
-
-    public new ICheckedItemList<StringValue> Content {
-      get { return (ICheckedItemList<StringValue>)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public PreprocessingCheckedItemListView()
-      : base() {
-      InitializeComponent();
-      DisableDetails();
-    }
-
-    private void DisableDetails() {
-      splitContainer.Panel2Collapsed = true;
-      viewHost.Content = null;
-      showDetailsCheckBox.Visible = false;
-
-    }
-  }
-
-
-}
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 15242)
@@ -47,14 +47,15 @@
       this.components = new System.ComponentModel.Container();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.checkedItemList = new HeuristicLab.DataPreprocessing.Views.PreprocessingCheckedItemListView();
-      this.variablesListcontextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
-      this.checkInputsTargetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-      this.checkOnlyInputsTargetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-      this.checkAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-      this.uncheckAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesListView = new System.Windows.Forms.ListView();
+      this.columnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.SuspendLayout();
-      this.variablesListcontextMenuStrip.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -62,4 +63,5 @@
       // 
       this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
       this.splitContainer.Location = new System.Drawing.Point(0, 0);
       this.splitContainer.Name = "splitContainer";
@@ -67,61 +69,77 @@
       // splitContainer.Panel1
       // 
-      this.splitContainer.Panel1.Controls.Add(this.checkedItemList);
-      this.splitContainer.Size = new System.Drawing.Size(654, 403);
-      this.splitContainer.SplitterDistance = 91;
+      this.splitContainer.Panel1.Controls.Add(this.variablesGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(940, 698);
+      this.splitContainer.SplitterDistance = 180;
       this.splitContainer.TabIndex = 7;
       // 
-      // checkedItemList
+      // variablesGroupBox
       // 
-      this.checkedItemList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.variablesGroupBox.Controls.Add(this.uncheckAllButton);
+      this.variablesGroupBox.Controls.Add(this.checkAllButton);
+      this.variablesGroupBox.Controls.Add(this.checkInputsTargetButton);
+      this.variablesGroupBox.Controls.Add(this.variablesListView);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(180, 698);
+      this.variablesGroupBox.TabIndex = 7;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Variables";
+      // 
+      // variablesListView
+      // 
+      this.variablesListView.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.checkedItemList.Caption = "View";
-      this.checkedItemList.Content = null;
-      this.checkedItemList.ContextMenuStrip = this.variablesListcontextMenuStrip;
-      this.checkedItemList.Location = new System.Drawing.Point(4, 4);
-      this.checkedItemList.Name = "checkedItemList";
-      this.checkedItemList.ReadOnly = false;
-      this.checkedItemList.Size = new System.Drawing.Size(84, 252);
-      this.checkedItemList.TabIndex = 4;
+      this.variablesListView.CheckBoxes = true;
+      this.variablesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader});
+      this.variablesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variablesListView.HideSelection = false;
+      this.variablesListView.Location = new System.Drawing.Point(6, 49);
+      this.variablesListView.Name = "variablesListView";
+      this.variablesListView.Size = new System.Drawing.Size(168, 643);
+      this.variablesListView.TabIndex = 12;
+      this.variablesListView.UseCompatibleStateImageBehavior = false;
+      this.variablesListView.View = System.Windows.Forms.View.Details;
       // 
-      // variablesListcontextMenuStrip
+      // columnHeader
       // 
-      this.variablesListcontextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.checkInputsTargetToolStripMenuItem,
-            this.checkOnlyInputsTargetToolStripMenuItem,
-            this.checkAllToolStripMenuItem,
-            this.uncheckAllToolStripMenuItem});
-      this.variablesListcontextMenuStrip.Name = "variablesListcontextMenuStrip";
-      this.variablesListcontextMenuStrip.Size = new System.Drawing.Size(211, 92);
-      this.variablesListcontextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.variablesListcontextMenuStrip_Opening);
+      this.columnHeader.Text = "";
+      this.columnHeader.Width = 164;
       // 
-      // checkInputsTargetToolStripMenuItem
+      // uncheckAllButton
       // 
-      this.checkInputsTargetToolStripMenuItem.Name = "checkInputsTargetToolStripMenuItem";
-      this.checkInputsTargetToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
-      this.checkInputsTargetToolStripMenuItem.Text = "Check Inputs+Target";
-      this.checkInputsTargetToolStripMenuItem.Click += new System.EventHandler(this.checkInputsTargetToolStripMenuItem_Click);
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(66, 19);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 9;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "Show None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
       // 
-      // checkOnlyInputsTargetToolStripMenuItem
+      // checkAllButton
       // 
-      this.checkOnlyInputsTargetToolStripMenuItem.Name = "checkOnlyInputsTargetToolStripMenuItem";
-      this.checkOnlyInputsTargetToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
-      this.checkOnlyInputsTargetToolStripMenuItem.Text = "Check only Inputs+Target";
-      this.checkOnlyInputsTargetToolStripMenuItem.Click += new System.EventHandler(this.checkOnlyInputsTargetToolStripMenuItem_Click);
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(6, 19);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.checkAllButton, "Show All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
       // 
-      // checkAllToolStripMenuItem
+      // checkInputsTargetButton
       // 
-      this.checkAllToolStripMenuItem.Name = "checkAllToolStripMenuItem";
-      this.checkAllToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
-      this.checkAllToolStripMenuItem.Text = "Check All";
-      this.checkAllToolStripMenuItem.Click += new System.EventHandler(this.checkAllToolStripMenuItem_Click);
-      // 
-      // uncheckAllToolStripMenuItem
-      // 
-      this.uncheckAllToolStripMenuItem.Name = "uncheckAllToolStripMenuItem";
-      this.uncheckAllToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
-      this.uncheckAllToolStripMenuItem.Text = "Uncheck All";
-      this.uncheckAllToolStripMenuItem.Click += new System.EventHandler(this.uncheckAllToolStripMenuItem_Click);
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(36, 19);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 8;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Show Inputs & Target");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
       // 
       // PreprocessingCheckedVariablesView
@@ -131,9 +149,9 @@
       this.Controls.Add(this.splitContainer);
       this.Name = "PreprocessingCheckedVariablesView";
-      this.Size = new System.Drawing.Size(654, 403);
+      this.Size = new System.Drawing.Size(940, 698);
       this.splitContainer.Panel1.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
-      this.variablesListcontextMenuStrip.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -141,12 +159,12 @@
 
     #endregion
-
-    protected PreprocessingCheckedItemListView checkedItemList;
     protected System.Windows.Forms.SplitContainer splitContainer;
-    private System.Windows.Forms.ContextMenuStrip variablesListcontextMenuStrip;
-    private System.Windows.Forms.ToolStripMenuItem checkInputsTargetToolStripMenuItem;
-    private System.Windows.Forms.ToolStripMenuItem checkAllToolStripMenuItem;
-    private System.Windows.Forms.ToolStripMenuItem uncheckAllToolStripMenuItem;
-    private System.Windows.Forms.ToolStripMenuItem checkOnlyInputsTargetToolStripMenuItem;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ColumnHeader columnHeader;
+    private System.Windows.Forms.ListView variablesListView;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs	(revision 15242)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
 using System.Drawing;
@@ -34,4 +33,5 @@
   [Content(typeof(PreprocessingChartContent), false)]
   public abstract partial class PreprocessingCheckedVariablesView : ItemView {
+    protected bool SuppressCheckedChangedUpdate = false;
 
     public new PreprocessingChartContent Content {
@@ -48,5 +48,5 @@
     }
     protected IList<string> GetCheckedVariables() {
-      return checkedItemList.Content.CheckedItems.Select(i => i.Value.Value).ToList();
+      return Content.VariableItemList.CheckedItems.Select(i => i.Value.Value).ToList();
     }
 
@@ -55,35 +55,38 @@
       if (Content == null) return;
 
-      if (Content.VariableItemList == null) {
-        IList<string> inputs = Content.PreprocessingData.InputVariables;
-        if (Content.PreprocessingData.TargetVariable != null)
-          inputs = inputs.Union(new[] { Content.PreprocessingData.TargetVariable }).ToList();
-        Content.VariableItemList = Content.CreateVariableItemList(inputs);
-      } else {
-        var checkedNames = Content.VariableItemList.CheckedItems.Select(x => x.Value.Value);
-        Content.VariableItemList = Content.CreateVariableItemList(checkedNames.ToList());
+      variablesListView.ItemChecked -= variablesListView_ItemChecked;
+      variablesListView.Items.Clear();
+      foreach (var variable in Content.VariableItemList) {
+        bool isInputTarget = Content.PreprocessingData.InputVariables.Contains(variable.Value)
+          || Content.PreprocessingData.TargetVariable == variable.Value;
+        variablesListView.Items.Add(new ListViewItem(variable.Value) {
+          Tag = variable,
+          Checked = IsVariableChecked(variable.Value),
+          ForeColor = isInputTarget ? Color.Black : Color.Gray
+        });
       }
-      Content.VariableItemList.CheckedItemsChanged += CheckedItemsChanged;
-
-      checkedItemList.Content = Content.VariableItemList;
-      var target = Content.PreprocessingData.TargetVariable;
-      var inputAndTarget = Content.PreprocessingData.InputVariables.Union(target != null ? new[] { target } : new string[] { });
-      foreach (var col in Content.PreprocessingData.GetDoubleVariableNames().Except(inputAndTarget)) {
-        var listViewItem = checkedItemList.ItemsListView.FindItemWithText(col, false, 0, false);
-        listViewItem.ForeColor = Color.LightGray;
-      }
+      variablesListView.ItemChecked += variablesListView_ItemChecked;
     }
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
       Content.PreprocessingData.Changed += PreprocessingData_Changed;
-      Content.PreprocessingData.SelectionChanged += PreprocessingData_SelctionChanged;
+      Content.VariableItemList.CheckedItemsChanged += CheckedItemsChanged;
     }
+
     protected override void DeregisterContentEvents() {
       Content.PreprocessingData.Changed -= PreprocessingData_Changed;
-      Content.PreprocessingData.SelectionChanged -= PreprocessingData_SelctionChanged;
+      Content.VariableItemList.CheckedItemsChanged -= CheckedItemsChanged;
       base.DeregisterContentEvents();
     }
 
     protected virtual void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+      // sync listview
+      foreach (var item in checkedItems.Items)
+        variablesListView.Items[item.Index].Checked = Content.VariableItemList.ItemChecked(item.Value);
+    }
+    private void variablesListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      // sync checked item list
+      var variable = (StringValue)e.Item.Tag;
+      Content.VariableItemList.SetItemCheckedState(variable, e.Item.Checked);
     }
 
@@ -109,5 +112,5 @@
       Content.VariableItemList.Add(new StringValue(name));
       if (!Content.PreprocessingData.InputVariables.Contains(name) && Content.PreprocessingData.TargetVariable != name) {
-        var listViewItem = checkedItemList.ItemsListView.FindItemWithText(name, false, 0, false);
+        var listViewItem = variablesListView.FindItemWithText(name, false, 0, false);
         listViewItem.ForeColor = Color.LightGray;
       }
@@ -118,43 +121,35 @@
         Content.VariableItemList.Remove(stringValue);
     }
-    protected virtual void UpdateVariable(string name) {
-    }
-    protected virtual void ResetAllVariables() {
+    protected virtual void UpdateVariable(string name) { }
+    protected virtual void ResetAllVariables() { }
+    protected virtual void CheckedChangedUpdate() { }
+
+    private void checkInputsTargetButton_Click(object sender, System.EventArgs e) {
+      SuppressCheckedChangedUpdate = true;
+      foreach (var name in Content.VariableItemList) {
+        var isInputTarget = Content.PreprocessingData.InputVariables.Contains(name.Value) || Content.PreprocessingData.TargetVariable == name.Value;
+        Content.VariableItemList.SetItemCheckedState(name, isInputTarget);
+      }
+      SuppressCheckedChangedUpdate = false;
+      CheckedChangedUpdate();
     }
 
-    protected virtual void PreprocessingData_SelctionChanged(object sender, EventArgs e) {
+    private void checkAllButton_Click(object sender, System.EventArgs e) {
+      SuppressCheckedChangedUpdate = true;
+      foreach (var name in Content.VariableItemList) {
+        Content.VariableItemList.SetItemCheckedState(name, true);
+      }
+      SuppressCheckedChangedUpdate = false;
+      CheckedChangedUpdate();
     }
 
-    #region ContextMenu Events
-    private void variablesListcontextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e) {
-      var data = Content.PreprocessingData;
-      checkInputsTargetToolStripMenuItem.Text = "Check Inputs" + (data.TargetVariable != null ? "+Target" : "");
-      checkOnlyInputsTargetToolStripMenuItem.Text = "Check only Inputs" + (data.TargetVariable != null ? "+Target" : "");
+    private void uncheckAllButton_Click(object sender, System.EventArgs e) {
+      SuppressCheckedChangedUpdate = true;
+      foreach (var name in Content.VariableItemList) {
+        Content.VariableItemList.SetItemCheckedState(name, false);
+      }
+      SuppressCheckedChangedUpdate = false;
+      CheckedChangedUpdate();
     }
-    private void checkInputsTargetToolStripMenuItem_Click(object sender, EventArgs e) {
-      foreach (var name in checkedItemList.Content) {
-        var isInputTarget = Content.PreprocessingData.InputVariables.Contains(name.Value) || Content.PreprocessingData.TargetVariable == name.Value;
-        if (isInputTarget) {
-          checkedItemList.Content.SetItemCheckedState(name, true);
-        }
-      }
-    }
-    private void checkOnlyInputsTargetToolStripMenuItem_Click(object sender, EventArgs e) {
-      foreach (var name in checkedItemList.Content) {
-        var isInputTarget = Content.PreprocessingData.InputVariables.Contains(name.Value) || Content.PreprocessingData.TargetVariable == name.Value;
-        checkedItemList.Content.SetItemCheckedState(name, isInputTarget);
-      }
-    }
-    private void checkAllToolStripMenuItem_Click(object sender, EventArgs e) {
-      foreach (var name in checkedItemList.Content) {
-        checkedItemList.Content.SetItemCheckedState(name, true);
-      }
-    }
-    private void uncheckAllToolStripMenuItem_Click(object sender, EventArgs e) {
-      foreach (var name in checkedItemList.Content) {
-        checkedItemList.Content.SetItemCheckedState(name, false);
-      }
-    }
-    #endregion
   }
 }
Index: able/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.Designer.cs	(revision 15241)
+++ 	(revision )
@@ -1,109 +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
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  partial class PreprocessingDataTableView {
-    /// <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) {
-        if (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.components = new System.ComponentModel.Container();
-      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
-      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
-      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
-      System.Windows.Forms.DataVisualization.Charting.Title title1 = new System.Windows.Forms.DataVisualization.Charting.Title();
-      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
-      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // chart
-      // 
-      this.chart.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.chart.BorderlineColor = System.Drawing.Color.Black;
-      this.chart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
-      chartArea1.AxisX.Minimum = 0D;
-      chartArea1.CursorX.IsUserEnabled = true;
-      chartArea1.CursorX.IsUserSelectionEnabled = true;
-      chartArea1.CursorY.IsUserEnabled = true;
-      chartArea1.CursorY.IsUserSelectionEnabled = true;
-      chartArea1.Name = "Default";
-      this.chart.ChartAreas.Add(chartArea1);
-      legend1.Alignment = System.Drawing.StringAlignment.Center;
-      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
-      legend1.Name = "Default";
-      this.chart.Legends.Add(legend1);
-      this.chart.Location = new System.Drawing.Point(0, 0);
-      this.chart.Name = "chart";
-      series1.ChartArea = "Default";
-      series1.Legend = "Default";
-      series1.Name = "Default";
-      this.chart.Series.Add(series1);
-      this.chart.Size = new System.Drawing.Size(359, 274);
-      this.chart.TabIndex = 3;
-      this.chart.Text = "chart";
-      title1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      title1.Name = "Default";
-      title1.Text = "Title";
-      title1.Visible = false;
-      this.chart.Titles.Add(title1);
-      this.chart.CustomizeLegend += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.CustomizeLegendEventArgs>(this.chart_CustomizeLegend);
-      this.chart.DoubleClick += new System.EventHandler(this.chart_DoubleClick);
-      this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
-      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
-      // 
-      // PreprocessingDataTableView
-      // 
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.chart);
-      this.Name = "PreprocessingDataTableView";
-      this.Size = new System.Drawing.Size(359, 274);
-      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    protected HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
-
-  }
-}
Index: able/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs	(revision 15241)
+++ 	(revision )
@@ -1,869 +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.Drawing;
-using System.Linq;
-using System.Windows.Forms;
-using System.Windows.Forms.DataVisualization.Charting;
-using HeuristicLab.Analysis;
-using HeuristicLab.Analysis.Views;
-using HeuristicLab.Collections;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  [View("Preprocessing DataTable View")]
-  [Content(typeof(PreprocessingDataTable), false)]
-  public partial class PreprocessingDataTableView : ItemView, IConfigureableView {
-    protected List<Series> invisibleSeries;
-    protected Dictionary<IObservableList<double>, DataRow> valuesRowsTable;
-    private event EventHandler chartDoubleClick;
-
-    public new PreprocessingDataTable Content {
-      get { return (PreprocessingDataTable)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public bool ShowLegend {
-      get { return chart.Legends[0].Enabled; }
-      set { chart.Legends[0].Enabled = value; }
-    }
-
-    public string XAxisFormat {
-      get { return chart.ChartAreas[0].AxisX.LabelStyle.Format; }
-      set { chart.ChartAreas[0].AxisX.LabelStyle.Format = value; }
-    }
-    public string YAxisFormat {
-      get { return chart.ChartAreas[0].AxisY.LabelStyle.Format; }
-      set { chart.ChartAreas[0].AxisY.LabelStyle.Format = value; }
-    }
-
-    public IEnumerable<double> Classification { get; set; }
-    public bool IsDetailedChartViewEnabled { get; set; }
-
-    public PreprocessingDataTableView() {
-      InitializeComponent();
-      valuesRowsTable = new Dictionary<IObservableList<double>, DataRow>();
-      invisibleSeries = new List<Series>();
-      chart.CustomizeAllChartAreas();
-      chart.ChartAreas[0].CursorX.Interval = 1;
-    }
-
-    #region Event Handler Registration
-    protected override void DeregisterContentEvents() {
-      foreach (DataRow row in Content.Rows)
-        DeregisterDataRowEvents(row);
-      Content.VisualPropertiesChanged -= new EventHandler(Content_VisualPropertiesChanged);
-      Content.Rows.ItemsAdded -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded);
-      Content.Rows.ItemsRemoved -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsRemoved);
-      Content.Rows.ItemsReplaced -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced);
-      Content.Rows.CollectionReset -= new CollectionItemsChangedEventHandler<DataRow>(Rows_CollectionReset);
-
-      Content.SelectedRows.ItemsAdded -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded);
-      Content.SelectedRows.ItemsRemoved -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsRemoved);
-      Content.SelectedRows.ItemsReplaced -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced);
-      Content.SelectedRows.CollectionReset -= new CollectionItemsChangedEventHandler<DataRow>(Rows_CollectionReset);
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.VisualPropertiesChanged += new EventHandler(Content_VisualPropertiesChanged);
-      Content.Rows.ItemsAdded += new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded);
-      Content.Rows.ItemsRemoved += new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsRemoved);
-      Content.Rows.ItemsReplaced += new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced);
-      Content.Rows.CollectionReset += new CollectionItemsChangedEventHandler<DataRow>(Rows_CollectionReset);
-
-      Content.SelectedRows.ItemsAdded += new CollectionItemsChangedEventHandler<DataRow>(SelectedRows_ItemsAdded);
-      Content.SelectedRows.ItemsRemoved += new CollectionItemsChangedEventHandler<DataRow>(SelectedRows_ItemsRemoved);
-      Content.SelectedRows.ItemsReplaced += new CollectionItemsChangedEventHandler<DataRow>(SelectedRows_ItemsReplaced);
-      Content.SelectedRows.CollectionReset += new CollectionItemsChangedEventHandler<DataRow>(SelectedRows_CollectionReset);
-    }
-
-
-    protected virtual void RegisterDataRowEvents(DataRow row) {
-      row.NameChanged += new EventHandler(Row_NameChanged);
-      row.VisualPropertiesChanged += new EventHandler(Row_VisualPropertiesChanged);
-      valuesRowsTable.Add(row.Values, row);
-      row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded);
-      row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved);
-      row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced);
-      row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved);
-      row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset);
-    }
-    protected virtual void DeregisterDataRowEvents(DataRow row) {
-      row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded);
-      row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved);
-      row.Values.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced);
-      row.Values.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved);
-      row.Values.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset);
-      valuesRowsTable.Remove(row.Values);
-      row.VisualPropertiesChanged -= new EventHandler(Row_VisualPropertiesChanged);
-      row.NameChanged -= new EventHandler(Row_NameChanged);
-    }
-    #endregion
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      invisibleSeries.Clear();
-      chart.ChartAreas[0].AxisX.Title = string.Empty;
-      chart.ChartAreas[0].AxisY.Title = string.Empty;
-      chart.ChartAreas[0].AxisY2.Title = string.Empty;
-      chart.Series.Clear();
-      if (Content != null) {
-
-        if (Classification != null)
-          chart.Titles[0].Text = Content.Name;
-
-        AddDataRows(Content.Rows);
-        AddSelectedDataRows(Content.SelectedRows);
-        ConfigureChartArea(chart.ChartAreas[0]);
-        RecalculateAxesScale(chart.ChartAreas[0]);
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      chart.Enabled = Content != null;
-    }
-
-    public void ShowConfiguration() {
-      if (Content != null) {
-        using (var dialog = new DataTableVisualPropertiesDialog(Content)) {
-          dialog.ShowDialog(this);
-        }
-      } else MessageBox.Show("Nothing to configure.");
-    }
-
-    public bool IsRowEnabled(string name) {
-      return chart.Series.FindByName(name) != null && chart.Series[name].Enabled;
-    }
-    public void SetRowEnabled(string name, bool enabled) {
-      if (chart.Series.FindByName(name) != null)
-        chart.Series[name].Enabled = enabled;
-    }
-
-    protected virtual void AddDataRows(IEnumerable<DataRow> rows) {
-      foreach (var row in rows) {
-        RegisterDataRowEvents(row);
-        var series = new Series(row.Name);
-        if (row.VisualProperties.DisplayName.Trim() != String.Empty)
-          series.LegendText = row.VisualProperties.DisplayName;
-        else series.LegendText = row.Name;
-
-        ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-
-        if (IsDetailedChartViewEnabled) {
-          series.LegendText += " Values: " + row.Values.Count;
-        }
-        if (Classification == null)
-          chart.Series.Add(series);
-      }
-
-      ConfigureChartArea(chart.ChartAreas[0]);
-      RecalculateAxesScale(chart.ChartAreas[0]);
-      UpdateYCursorInterval();
-    }
-
-    protected virtual void AddSelectedDataRows(IEnumerable<DataRow> rows) {
-
-      // only paint selection for line chart
-      if (rows.Count() > 0 && rows.ElementAt(0).VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Line) {
-        // add dummy series for selction entry in legend
-        if (rows.Count() > 0 && chart.Series.FindByName("(Selection)") == null) {
-          Series series = new Series("(Selection)");
-          series.IsVisibleInLegend = true;
-          series.Color = Color.Green;
-          series.BorderWidth = 1;
-          series.BorderDashStyle = ChartDashStyle.Solid;
-          series.BorderColor = Color.Empty;
-          series.ChartType = SeriesChartType.FastLine;
-          chart.Series.Add(series);
-        }
-
-        foreach (var row in rows) {
-          row.VisualProperties.IsVisibleInLegend = false;
-          row.VisualProperties.Color = Color.Green;
-          //add selected to name in order to avoid naming conflict
-          var series = new Series(row.Name + "(Selected)");
-          ConfigureSeries(series, row);
-          FillSeriesWithRowValues(series, row);
-
-          if (Classification == null)
-            chart.Series.Add(series);
-
-        }
-      }
-    }
-
-    protected virtual void RemoveSelectedDataRows(IEnumerable<DataRow> rows) {
-
-      // only remove selection for line chart
-      if (rows.Count() > 0 && rows.ElementAt(0).VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Line) {
-        //remove selection entry in legend
-        if (Content.SelectedRows.Count == 0) {
-          Series series = chart.Series["(Selection)"];
-          chart.Series.Remove(series);
-        }
-
-        foreach (var row in rows) {
-          Series series = chart.Series[row.Name + "(Selected)"];
-          chart.Series.Remove(series);
-        }
-      }
-    }
-
-    protected virtual void RemoveDataRows(IEnumerable<DataRow> rows) {
-      foreach (var row in rows) {
-        DeregisterDataRowEvents(row);
-        Series series = chart.Series[row.Name];
-        chart.Series.Remove(series);
-        if (invisibleSeries.Contains(series))
-          invisibleSeries.Remove(series);
-      }
-      RecalculateAxesScale(chart.ChartAreas[0]);
-    }
-
-    private void ConfigureSeries(Series series, DataRow row) {
-      RemoveCustomPropertyIfExists(series, "PointWidth");
-      series.BorderWidth = 1;
-      series.BorderDashStyle = ChartDashStyle.Solid;
-      series.BorderColor = Color.Empty;
-
-      if (row.VisualProperties.Color != Color.Empty)
-        series.Color = row.VisualProperties.Color;
-      else series.Color = Color.Empty;
-      series.IsVisibleInLegend = row.VisualProperties.IsVisibleInLegend;
-
-      switch (row.VisualProperties.ChartType) {
-        case DataRowVisualProperties.DataRowChartType.Line:
-          series.ChartType = SeriesChartType.FastLine;
-          series.BorderWidth = row.VisualProperties.LineWidth;
-          series.BorderDashStyle = ConvertLineStyle(row.VisualProperties.LineStyle);
-          break;
-        case DataRowVisualProperties.DataRowChartType.Bars:
-          // Bar is incompatible with anything but Bar and StackedBar*
-          if (!chart.Series.Any(x => x.ChartType != SeriesChartType.Bar && x.ChartType != SeriesChartType.StackedBar && x.ChartType != SeriesChartType.StackedBar100))
-            series.ChartType = SeriesChartType.Bar;
-          else {
-            series.ChartType = SeriesChartType.FastPoint; //default
-            row.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Points;
-          }
-          break;
-        case DataRowVisualProperties.DataRowChartType.Columns:
-          series.ChartType = SeriesChartType.Column;
-          break;
-        case DataRowVisualProperties.DataRowChartType.Points:
-          series.ChartType = SeriesChartType.FastPoint;
-          break;
-        case DataRowVisualProperties.DataRowChartType.Histogram:
-          series.ChartType = SeriesChartType.StackedColumn;
-          series.SetCustomProperty("PointWidth", "1");
-          if (!series.Color.IsEmpty && series.Color.GetBrightness() < 0.25)
-            series.BorderColor = Color.White;
-          else series.BorderColor = Color.Black;
-          break;
-        case DataRowVisualProperties.DataRowChartType.StepLine:
-          series.ChartType = SeriesChartType.StepLine;
-          series.BorderWidth = row.VisualProperties.LineWidth;
-          series.BorderDashStyle = ConvertLineStyle(row.VisualProperties.LineStyle);
-          break;
-        default:
-          series.ChartType = SeriesChartType.FastPoint;
-          break;
-      }
-      series.YAxisType = row.VisualProperties.SecondYAxis ? AxisType.Secondary : AxisType.Primary;
-      series.XAxisType = row.VisualProperties.SecondXAxis ? AxisType.Secondary : AxisType.Primary;
-      if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
-      else series.LegendText = row.Name;
-
-      string xAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.XAxisTitle)
-                      ? "X"
-                      : Content.VisualProperties.XAxisTitle;
-      string yAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.YAxisTitle)
-                            ? "Y"
-                            : Content.VisualProperties.YAxisTitle;
-      series.ToolTip =
-        series.LegendText + Environment.NewLine +
-        xAxisTitle + " = " + "#INDEX," + Environment.NewLine +
-        yAxisTitle + " = " + "#VAL";
-    }
-
-    private void ConfigureChartArea(ChartArea area) {
-      if (Content.VisualProperties.TitleFont != null) chart.Titles[0].Font = Content.VisualProperties.TitleFont;
-      if (!Content.VisualProperties.TitleColor.IsEmpty) chart.Titles[0].ForeColor = Content.VisualProperties.TitleColor;
-      chart.Titles[0].Text = Content.VisualProperties.Title;
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisX.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisX.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisX.Title = Content.VisualProperties.XAxisTitle;
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisX2.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisX2.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisX2.Title = Content.VisualProperties.SecondXAxisTitle;
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisY.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisY.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisY.Title = Content.VisualProperties.YAxisTitle;
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisY2.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisY2.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisY2.Title = Content.VisualProperties.SecondYAxisTitle;
-
-      area.AxisX.IsLogarithmic = Content.VisualProperties.XAxisLogScale;
-      area.AxisX2.IsLogarithmic = Content.VisualProperties.SecondXAxisLogScale;
-      area.AxisY.IsLogarithmic = Content.VisualProperties.YAxisLogScale;
-      area.AxisY2.IsLogarithmic = Content.VisualProperties.SecondYAxisLogScale;
-    }
-
-    private void RecalculateAxesScale(ChartArea area) {
-      // Reset the axes bounds so that RecalculateAxesScale() will assign new bounds
-      foreach (Axis a in area.Axes) {
-        a.Minimum = double.NaN;
-        a.Maximum = double.NaN;
-      }
-      area.RecalculateAxesScale();
-      area.AxisX.IsMarginVisible = false;
-      area.AxisX2.IsMarginVisible = false;
-
-      if (!Content.VisualProperties.XAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.XAxisMinimumFixedValue)) area.AxisX.Minimum = Content.VisualProperties.XAxisMinimumFixedValue;
-      if (!Content.VisualProperties.XAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.XAxisMaximumFixedValue)) area.AxisX.Maximum = Content.VisualProperties.XAxisMaximumFixedValue;
-      if (!Content.VisualProperties.SecondXAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.SecondXAxisMinimumFixedValue)) area.AxisX2.Minimum = Content.VisualProperties.SecondXAxisMinimumFixedValue;
-      if (!Content.VisualProperties.SecondXAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.SecondXAxisMaximumFixedValue)) area.AxisX2.Maximum = Content.VisualProperties.SecondXAxisMaximumFixedValue;
-      if (!Content.VisualProperties.YAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.YAxisMinimumFixedValue)) area.AxisY.Minimum = Content.VisualProperties.YAxisMinimumFixedValue;
-      if (!Content.VisualProperties.YAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.YAxisMaximumFixedValue)) area.AxisY.Maximum = Content.VisualProperties.YAxisMaximumFixedValue;
-      if (!Content.VisualProperties.SecondYAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.SecondYAxisMinimumFixedValue)) area.AxisY2.Minimum = Content.VisualProperties.SecondYAxisMinimumFixedValue;
-      if (!Content.VisualProperties.SecondYAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.SecondYAxisMaximumFixedValue)) area.AxisY2.Maximum = Content.VisualProperties.SecondYAxisMaximumFixedValue;
-      if (area.AxisX.Minimum >= area.AxisX.Maximum) area.AxisX.Maximum = area.AxisX.Minimum + 1;
-      if (area.AxisX2.Minimum >= area.AxisX2.Maximum) area.AxisX2.Maximum = area.AxisX2.Minimum + 1;
-      if (area.AxisY.Minimum >= area.AxisY.Maximum) area.AxisY.Maximum = area.AxisY.Minimum + 1;
-      if (area.AxisY2.Minimum >= area.AxisY2.Maximum) area.AxisY2.Maximum = area.AxisY2.Minimum + 1;
-    }
-
-    protected virtual void UpdateYCursorInterval() {
-      double interestingValuesRange = (
-        from series in chart.Series
-        where series.Enabled
-        let values = (from point in series.Points
-                      where !point.IsEmpty
-                      select point.YValues[0]).DefaultIfEmpty(1.0)
-        let range = values.Max() - values.Min()
-        where range > 0.0
-        select range
-        ).DefaultIfEmpty(1.0).Min();
-
-      double digits = (int)Math.Log10(interestingValuesRange) - 3;
-      double yZoomInterval = Math.Pow(10, digits);
-      this.chart.ChartAreas[0].CursorY.Interval = yZoomInterval;
-    }
-
-    #region Event Handlers
-    #region Content Event Handlers
-    private void Content_VisualPropertiesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_VisualPropertiesChanged), sender, e);
-      else {
-        ConfigureChartArea(chart.ChartAreas[0]);
-        RecalculateAxesScale(chart.ChartAreas[0]); // axes min/max could have changed
-      }
-    }
-    #endregion
-    #region Rows Event Handlers
-
-    private void SelectedRows_CollectionReset(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced), sender, e);
-      else {
-        RemoveSelectedDataRows(e.OldItems);
-        AddSelectedDataRows(e.Items);
-      }
-    }
-
-    private void SelectedRows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced), sender, e);
-      else {
-        RemoveSelectedDataRows(e.OldItems);
-        AddSelectedDataRows(e.Items);
-      }
-    }
-
-    private void SelectedRows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsRemoved), sender, e);
-      else {
-        RemoveSelectedDataRows(e.Items);
-      }
-    }
-
-    private void SelectedRows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded), sender, e);
-      else {
-        AddSelectedDataRows(e.Items);
-      }
-    }
-
-
-    private void Rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded), sender, e);
-      else {
-        AddDataRows(e.Items);
-      }
-    }
-    private void Rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsRemoved), sender, e);
-      else {
-        RemoveDataRows(e.Items);
-      }
-    }
-    private void Rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced), sender, e);
-      else {
-        RemoveDataRows(e.OldItems);
-        AddDataRows(e.Items);
-      }
-    }
-    private void Rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<DataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<DataRow>(Rows_CollectionReset), sender, e);
-      else {
-        RemoveDataRows(e.OldItems);
-        AddDataRows(e.Items);
-      }
-    }
-    #endregion
-    #region Row Event Handlers
-    private void Row_VisualPropertiesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Row_VisualPropertiesChanged), sender, e);
-      else {
-        DataRow row = (DataRow)sender;
-        Series series = chart.Series[row.Name];
-        series.Points.Clear();
-        ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-        RecalculateAxesScale(chart.ChartAreas[0]);
-      }
-    }
-    private void Row_NameChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Row_NameChanged), sender, e);
-      else {
-        DataRow row = (DataRow)sender;
-        chart.Series[row.Name].Name = row.Name;
-      }
-    }
-    #endregion
-    #region Values Event Handlers
-    private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded), sender, e);
-      else {
-        DataRow row = null;
-        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Values_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved), sender, e);
-      else {
-        DataRow row = null;
-        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Values_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced), sender, e);
-      else {
-        DataRow row = null;
-        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            if (row.VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Histogram) {
-              rowSeries.Points.Clear();
-              FillSeriesWithRowValues(rowSeries, row);
-            } else {
-              foreach (IndexedItem<double> item in e.Items) {
-                if (IsInvalidValue(item.Value))
-                  rowSeries.Points[item.Index].IsEmpty = true;
-                else {
-                  rowSeries.Points[item.Index].YValues = new double[] { item.Value };
-                  rowSeries.Points[item.Index].IsEmpty = false;
-                }
-              }
-            }
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Values_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved), sender, e);
-      else {
-        DataRow row = null;
-        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-
-    private void Values_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<double>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset), sender, e);
-      else {
-        DataRow row = null;
-        valuesRowsTable.TryGetValue((IObservableList<double>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    #endregion
-    #endregion
-
-    #region Chart Event Handlers
-    private void chart_MouseDown(object sender, MouseEventArgs e) {
-      HitTestResult result = chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem) {
-        ToggleSeriesVisible(result.Series);
-      }
-    }
-    private void chart_MouseMove(object sender, MouseEventArgs e) {
-      HitTestResult result = chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem)
-        this.Cursor = Cursors.Hand;
-      else
-        this.Cursor = Cursors.Default;
-    }
-    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
-      foreach (LegendItem legendItem in e.LegendItems) {
-        var series = chart.Series[legendItem.SeriesName];
-        if (series != null) {
-          bool seriesIsInvisible = invisibleSeries.Contains(series);
-          foreach (LegendCell cell in legendItem.Cells) {
-            cell.ForeColor = seriesIsInvisible ? Color.Gray : Color.Black;
-          }
-        }
-      }
-    }
-    #endregion
-
-    private void ToggleSeriesVisible(Series series) {
-
-      if (!Content.Rows.Any(x => x.Name == series.Name))
-        return;
-
-      if (!invisibleSeries.Contains(series)) {
-        series.Points.Clear();
-        invisibleSeries.Add(series);
-      } else {
-        invisibleSeries.Remove(series);
-        if (Content != null) {
-
-          var row = (from r in Content.Rows
-                     where r.Name == series.Name
-                     select r).Single();
-          FillSeriesWithRowValues(series, row);
-          this.chart.Legends[series.Legend].ForeColor = Color.Black;
-          RecalculateAxesScale(chart.ChartAreas[0]);
-          UpdateYCursorInterval();
-        }
-      }
-    }
-
-    private void FillSeriesWithRowValues(Series series, DataRow row) {
-      switch (row.VisualProperties.ChartType) {
-        case DataRowVisualProperties.DataRowChartType.Histogram:
-          CalculateHistogram(series, row);
-          break;
-        default: {
-            bool yLogarithmic = series.YAxisType == AxisType.Primary
-                                  ? Content.VisualProperties.YAxisLogScale
-                                  : Content.VisualProperties.SecondYAxisLogScale;
-            bool xLogarithmic = series.XAxisType == AxisType.Primary
-                                  ? Content.VisualProperties.XAxisLogScale
-                                  : Content.VisualProperties.SecondXAxisLogScale;
-            for (int i = 0; i < row.Values.Count; i++) {
-              var value = row.Values[i];
-              var point = new DataPoint();
-              point.XValue = row.VisualProperties.StartIndexZero && !xLogarithmic ? i : i + 1;
-              if (IsInvalidValue(value) || (yLogarithmic && value <= 0))
-                point.IsEmpty = true;
-              else
-                point.YValues = new double[] { value };
-              series.Points.Add(point);
-            }
-          }
-          break;
-      }
-    }
-
-    // get minimum ignores nan values
-    private double GetMinimum(IEnumerable<double> values) {
-      double min = Double.MaxValue;
-
-      foreach (double value in values) {
-        if (!Double.IsNaN(value) && value < min)
-          min = value;
-      }
-      return min;
-    }
-
-    //get maximium ignores nan values
-    private double GetMaximum(IEnumerable<double> values) {
-      double max = Double.MinValue;
-
-      foreach (double value in values) {
-        if (!Double.IsNaN(value) && value > max)
-          max = value;
-      }
-      return max;
-    }
-
-    protected virtual void CalculateHistogram(Series series, DataRow row) {
-      if (Classification != null) {
-
-        var valuesPerClass = row.Values.Select((i, index) => new { i, j = Classification.ToList()[index] })
-                                       .GroupBy((x) => x.j)
-                                       .ToDictionary(x => x.Key, x => x.Select(v => v.i)
-                                       .ToList());
-
-        chart.Titles.Add(row.Name);
-        int featureOverallValueCount = 0;
-        if (IsDetailedChartViewEnabled)
-          featureOverallValueCount = row.Values.Count(x => !IsInvalidValue(x));
-        foreach (KeyValuePair<double, List<double>> entry in valuesPerClass) {
-          var s = new Series(row.Name + entry.Key);
-
-          ConfigureSeries(s, row);
-          AddPointsToHistogramSeries(s, row, entry.Value);
-
-          s.LegendText = entry.Key.ToString();
-          if (IsDetailedChartViewEnabled) {
-            int featureValueCount = entry.Value.Count(x => !IsInvalidValue(x));
-            s.LegendText += " Values: ";
-            s.LegendText += (featureOverallValueCount > 0) ?
-              string.Format("{0} ({1:F2}%)", featureValueCount, (featureValueCount / (double)featureOverallValueCount) * 100)
-            : "0";
-          }
-          chart.Series.Add(s);
-        }
-      } else {
-        series.Points.Clear();
-        ConfigureSeries(series, row);
-        AddPointsToHistogramSeries(series, row, null);
-      }
-    }
-
-    private void AddPointsToHistogramSeries(Series series, DataRow row, List<double> values) {
-      if (!row.Values.Any()) return;
-      int bins = Content.VisualProperties.HistogramBins;
-
-      double minValue = GetMinimum(row.Values);
-      double maxValue = GetMaximum(row.Values);
-      double intervalWidth = (maxValue - minValue) / bins;
-      if (intervalWidth < 0) return;
-      if (intervalWidth == 0) {
-        series.Points.AddXY(minValue, row.Values.Count);
-        return;
-      }
-
-
-      if (!Content.VisualProperties.HistogramExactBins) {
-        intervalWidth = HumanRoundRange(intervalWidth);
-        minValue = Math.Floor(minValue / intervalWidth) * intervalWidth;
-        maxValue = Math.Ceiling(maxValue / intervalWidth) * intervalWidth;
-      }
-
-      double intervalCenter = intervalWidth / 2;
-
-      double min = 0.0, max = 0.0;
-      if (!Double.IsNaN(Content.VisualProperties.XAxisMinimumFixedValue) && !Content.VisualProperties.XAxisMinimumAuto)
-        min = Content.VisualProperties.XAxisMinimumFixedValue;
-      else min = minValue;
-      if (!Double.IsNaN(Content.VisualProperties.XAxisMaximumFixedValue) && !Content.VisualProperties.XAxisMaximumAuto)
-        max = Content.VisualProperties.XAxisMaximumFixedValue;
-      else max = maxValue + intervalWidth;
-
-      double axisInterval = intervalWidth / row.VisualProperties.ScaleFactor;
-
-      var area = chart.ChartAreas[0];
-      area.AxisX.Interval = axisInterval;
-
-      series.SetCustomProperty("PointWidth", "1"); // 0.8 is the default value
-
-      // get the range or intervals which define the grouping of the frequency values
-      var doubleRange = DoubleRange(min, max, intervalWidth).Skip(1).ToList();
-
-
-      if (values == null) {
-        values = row.Values.ToList(); ;
-      }
-
-      // aggregate the row values by unique key and frequency value
-      var valueFrequencies = (from v in values
-                              where !IsInvalidValue(v)
-                              orderby v
-                              group v by v into g
-                              select new Tuple<double, double>(g.First(), g.Count())).ToList();
-
-      //  shift the chart to the left so the bars are placed on the intervals
-      if (Classification != null || (valueFrequencies.Any() && valueFrequencies.First().Item1 < doubleRange.First())) {
-        series.Points.Add(new DataPoint(min - intervalWidth, 0));
-        series.Points.Add(new DataPoint(max + intervalWidth, 0));
-      }
-
-      // add data points
-      int j = 0;
-      foreach (var d in doubleRange) {
-        double sum = 0.0;
-        // sum the frequency values that fall within the same interval
-        while (j < valueFrequencies.Count && valueFrequencies[j].Item1 < d) {
-          sum += valueFrequencies[j].Item2;
-          ++j;
-        }
-        string xAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.XAxisTitle)
-                              ? "X"
-                              : Content.VisualProperties.XAxisTitle;
-        string yAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.YAxisTitle)
-                              ? "Y"
-                              : Content.VisualProperties.YAxisTitle;
-        DataPoint newDataPoint = new DataPoint(d - intervalCenter, sum);
-        newDataPoint.ToolTip =
-          xAxisTitle + ": [" + (d - intervalWidth) + "-" + d + ")" + Environment.NewLine +
-          yAxisTitle + ": " + sum;
-        int overallValueCount = row.Values.Count();
-        if (overallValueCount > 0)
-          newDataPoint.ToolTip += string.Format(" ({0:F2}%)", (sum / overallValueCount) * 100);
-        series.Points.Add(newDataPoint);
-      }
-    }
-
-    public event EventHandler ChartDoubleClick {
-      add { chartDoubleClick += value; }
-      remove { chartDoubleClick -= value; }
-    }
-
-    #region Helpers
-    public static IEnumerable<double> DoubleRange(double min, double max, double step) {
-      double i;
-      for (i = min; i <= max; i += step)
-        yield return i;
-
-      if (i != max + step)
-        yield return i;
-    }
-
-    protected void RemoveCustomPropertyIfExists(Series series, string property) {
-      if (series.IsCustomPropertySet(property)) series.DeleteCustomProperty(property);
-    }
-
-    private double HumanRoundRange(double range) {
-      double base10 = Math.Pow(10.0, Math.Floor(Math.Log10(range)));
-      double rounding = range / base10;
-      if (rounding <= 1.5) rounding = 1;
-      else if (rounding <= 2.25) rounding = 2;
-      else if (rounding <= 3.75) rounding = 2.5;
-      else if (rounding <= 7.5) rounding = 5;
-      else rounding = 10;
-      return rounding * base10;
-    }
-
-    private double HumanRoundMax(double max) {
-      double base10;
-      if (max > 0) base10 = Math.Pow(10.0, Math.Floor(Math.Log10(max)));
-      else base10 = Math.Pow(10.0, Math.Ceiling(Math.Log10(-max)));
-      double rounding = (max > 0) ? base10 : -base10;
-      while (rounding < max) rounding += base10;
-      return rounding;
-    }
-
-    private ChartDashStyle ConvertLineStyle(DataRowVisualProperties.DataRowLineStyle dataRowLineStyle) {
-      switch (dataRowLineStyle) {
-        case DataRowVisualProperties.DataRowLineStyle.Dash:
-          return ChartDashStyle.Dash;
-        case DataRowVisualProperties.DataRowLineStyle.DashDot:
-          return ChartDashStyle.DashDot;
-        case DataRowVisualProperties.DataRowLineStyle.DashDotDot:
-          return ChartDashStyle.DashDotDot;
-        case DataRowVisualProperties.DataRowLineStyle.Dot:
-          return ChartDashStyle.Dot;
-        case DataRowVisualProperties.DataRowLineStyle.NotSet:
-          return ChartDashStyle.NotSet;
-        case DataRowVisualProperties.DataRowLineStyle.Solid:
-          return ChartDashStyle.Solid;
-        default:
-          return ChartDashStyle.NotSet;
-      }
-    }
-
-    protected static bool IsInvalidValue(double x) {
-      return double.IsNaN(x) || x < (double)decimal.MinValue || x > (double)decimal.MaxValue;
-    }
-    #endregion
-
-    //bubble double click event with data table view as sender
-    private void chart_DoubleClick(object sender, EventArgs e) {
-      if (chartDoubleClick != null)
-        chartDoubleClick(this, e);
-    }
-  }
-}
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.Designer.cs	(revision 15242)
@@ -22,5 +22,5 @@
 #endregion
 
-namespace HeuristicLab.Problems.DataAnalysis.Views {
+namespace HeuristicLab.DataPreprocessing.Views {
   partial class PreprocessingFeatureCorrelationView {
     /// <summary> 
@@ -48,8 +48,88 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.correlationView = new HeuristicLab.Problems.DataAnalysis.Views.FeatureCorrelationView();
+      this.variablesLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(736, 5);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Inputs & Target Variables");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(766, 5);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(706, 5);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.checkAllButton, "All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
+      // 
+      // correlationView
+      // 
+      this.correlationView.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.correlationView.Caption = "Feature Correlation View";
+      this.correlationView.Content = null;
+      this.correlationView.Location = new System.Drawing.Point(0, 0);
+      this.correlationView.Name = "correlationView";
+      this.correlationView.ReadOnly = false;
+      this.correlationView.Size = new System.Drawing.Size(1013, 640);
+      this.correlationView.TabIndex = 18;
+      // 
+      // variablesLabel
+      // 
+      this.variablesLabel.AutoSize = true;
+      this.variablesLabel.Location = new System.Drawing.Point(650, 11);
+      this.variablesLabel.Name = "variablesLabel";
+      this.variablesLabel.Size = new System.Drawing.Size(50, 13);
+      this.variablesLabel.TabIndex = 15;
+      this.variablesLabel.Text = "Variables";
+      // 
+      // PreprocessingFeatureCorrelationView
+      // 
+      this.Controls.Add(this.variablesLabel);
+      this.Controls.Add(this.checkInputsTargetButton);
+      this.Controls.Add(this.uncheckAllButton);
+      this.Controls.Add(this.checkAllButton);
+      this.Controls.Add(this.correlationView);
+      this.Name = "PreprocessingFeatureCorrelationView";
+      this.Size = new System.Drawing.Size(1013, 640);
       this.ResumeLayout(false);
+      this.PerformLayout();
+
     }
 
     #endregion
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
+    private HeuristicLab.Problems.DataAnalysis.Views.FeatureCorrelationView correlationView;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Label variablesLabel;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingFeatureCorrelationView.cs	(revision 15242)
@@ -20,14 +20,14 @@
 #endregion
 
-using System.Windows.Forms;
-using HeuristicLab.DataPreprocessing;
+using System;
+using System.Linq;
+using HeuristicLab.Data.Views;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
 
-namespace HeuristicLab.Problems.DataAnalysis.Views {
+namespace HeuristicLab.DataPreprocessing.Views {
   [View("Preprocessing Feature Correlation View")]
-  [Content(typeof(CorrelationMatrixContent), false)]
+  [Content(typeof(CorrelationMatrixContent), true)]
   public partial class PreprocessingFeatureCorrelationView : AsynchronousContentView {
-
     public new CorrelationMatrixContent Content {
       get { return (CorrelationMatrixContent)base.Content; }
@@ -35,13 +35,7 @@
     }
 
-    FeatureCorrelationView correlationView;
-
     public PreprocessingFeatureCorrelationView() {
       InitializeComponent();
-      correlationView = new FeatureCorrelationView();
-      correlationView.Dock = DockStyle.Fill;
-      this.Controls.Add(correlationView);
     }
-
 
     protected override void RegisterContentEvents() {
@@ -61,11 +55,31 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      if (Content == null) {
-        correlationView.Content = null;
+      correlationView.Content = Content != null ? Content.ProblemData : null;
+    }
+
+    #region Check Variables
+    private void checkAllButton_Click(object sender, System.EventArgs e) {
+      SetVisibility(x => true);
+    }
+    private void checkInputsTargetButton_Click(object sender, System.EventArgs e) {
+      var ppd = Content.PreprocessingData;
+      SetVisibility(x => ppd.InputVariables.Contains(x) || ppd.TargetVariable == x);
+    }
+    private void uncheckAllButton_Click(object sender, System.EventArgs e) {
+      SetVisibility(x => false);
+    }
+    private void SetVisibility(Func<string, bool> check) {
+      var dataView = (EnhancedStringConvertibleMatrixView)correlationView.Controls.Find("DataView", searchAllChildren: true).Single();
+      var ppd = Content.PreprocessingData;
+      var visibilities = ppd.VariableNames.Where((v, i) => ppd.VariableHasType<double>(i)).Select(check).ToList();
+      if (dataView.Content.Rows != dataView.Content.Columns || dataView.Content.Rows != visibilities.Count)
         return;
-      }
 
-      correlationView.Content = Content.ProblemData;
+      dataView.ColumnVisibility = visibilities;
+      dataView.RowVisibility = visibilities;
+      dataView.UpdateColumnHeaders();
+      dataView.UpdateRowHeaders();
     }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.Designer.cs	(revision 15242)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.Designer.cs	(revision 15242)
@@ -0,0 +1,93 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.DataPreprocessing.Views {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class PreprocessingIcons {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal PreprocessingIcons() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.DataPreprocessing.Views.PreprocessingIcons", typeof(PreprocessingIcons).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap All {
+            get {
+                object obj = ResourceManager.GetObject("All", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Inputs {
+            get {
+                object obj = ResourceManager.GetObject("Inputs", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap None {
+            get {
+                object obj = ResourceManager.GetObject("None", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.resx
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.resx	(revision 15242)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingIcons.resx	(revision 15242)
@@ -0,0 +1,130 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="All" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Icons\All.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Inputs" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Icons\Inputs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="None" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Icons\None.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: able/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.Designer.cs	(revision 15241)
+++ 	(revision )
@@ -1,109 +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
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  partial class PreprocessingScatterPlotView {
-    /// <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) {
-        if (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.components = new System.ComponentModel.Container();
-      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
-      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
-      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
-      System.Windows.Forms.DataVisualization.Charting.Title title1 = new System.Windows.Forms.DataVisualization.Charting.Title();
-      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
-      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // chart
-      // 
-      this.chart.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.chart.BorderlineColor = System.Drawing.Color.Black;
-      this.chart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
-      chartArea1.AxisX.Minimum = 0D;
-      chartArea1.CursorX.IsUserEnabled = true;
-      chartArea1.CursorX.IsUserSelectionEnabled = true;
-      chartArea1.CursorY.IsUserEnabled = true;
-      chartArea1.CursorY.IsUserSelectionEnabled = true;
-      chartArea1.Name = "Default";
-      this.chart.ChartAreas.Add(chartArea1);
-      legend1.Alignment = System.Drawing.StringAlignment.Center;
-      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
-      legend1.Name = "Default";
-      this.chart.Legends.Add(legend1);
-      this.chart.Location = new System.Drawing.Point(0, 0);
-      this.chart.Name = "chart";
-      series1.ChartArea = "Default";
-      series1.Legend = "Default";
-      series1.Name = "Default";
-      this.chart.Series.Add(series1);
-      this.chart.Size = new System.Drawing.Size(359, 274);
-      this.chart.TabIndex = 3;
-      this.chart.Text = "chart";
-      title1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      title1.Name = "Default";
-      title1.Text = "Title";
-      title1.Visible = false;
-      this.chart.Titles.Add(title1);
-      this.chart.CustomizeLegend += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.CustomizeLegendEventArgs>(this.chart_CustomizeLegend);
-      this.chart.DoubleClick += new System.EventHandler(this.chart_DoubleClick);
-      this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
-      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
-      // 
-      // PreprocessingScatterPlotView
-      // 
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.chart);
-      this.Name = "PreprocessingScatterPlotView";
-      this.Size = new System.Drawing.Size(359, 274);
-      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    protected HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
-
-  }
-}
Index: able/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs	(revision 15241)
+++ 	(revision )
@@ -1,480 +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.Drawing;
-using System.Linq;
-using System.Windows.Forms;
-using System.Windows.Forms.DataVisualization.Charting;
-using HeuristicLab.Analysis;
-using HeuristicLab.Analysis.Views;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  [View("Preprocessing ScatterPlot View")]
-  [Content(typeof(ScatterPlot), false)]
-  public partial class PreprocessingScatterPlotView : ItemView, IConfigureableView {
-    protected List<Series> invisibleSeries;
-    protected Dictionary<IObservableList<Point2D<double>>, ScatterPlotDataRow> pointsRowsTable;
-    private event EventHandler chartDoubleClick;
-
-    public new ScatterPlot Content {
-      get { return (ScatterPlot)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public bool ShowLegend {
-      get { return chart.Legends[0].Enabled; }
-      set { chart.Legends[0].Enabled = value; }
-    }
-
-    public string XAxisFormat {
-      get { return chart.ChartAreas[0].AxisX.LabelStyle.Format; }
-      set { chart.ChartAreas[0].AxisX.LabelStyle.Format = value; }
-    }
-    public string YAxisFormat {
-      get { return chart.ChartAreas[0].AxisY.LabelStyle.Format; }
-      set { chart.ChartAreas[0].AxisY.LabelStyle.Format = value; }
-    }
-
-    public PreprocessingScatterPlotView() {
-      InitializeComponent();
-      pointsRowsTable = new Dictionary<IObservableList<Point2D<double>>, ScatterPlotDataRow>();
-      invisibleSeries = new List<Series>();
-      chart.CustomizeAllChartAreas();
-      chart.ChartAreas[0].CursorX.Interval = 1;
-    }
-
-    #region Event Handler Registration
-    protected override void DeregisterContentEvents() {
-      foreach (ScatterPlotDataRow row in Content.Rows)
-        DeregisterScatterPlotDataRowEvents(row);
-      Content.VisualPropertiesChanged -= new EventHandler(Content_VisualPropertiesChanged);
-      Content.Rows.ItemsAdded -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded);
-      Content.Rows.ItemsRemoved -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsRemoved);
-      Content.Rows.ItemsReplaced -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced);
-      Content.Rows.CollectionReset -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset);
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.VisualPropertiesChanged += new EventHandler(Content_VisualPropertiesChanged);
-      Content.Rows.ItemsAdded += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded);
-      Content.Rows.ItemsRemoved += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsRemoved);
-      Content.Rows.ItemsReplaced += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced);
-      Content.Rows.CollectionReset += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset);
-    }
-
-    protected virtual void RegisterScatterPlotDataRowEvents(ScatterPlotDataRow row) {
-      row.NameChanged += new EventHandler(Row_NameChanged);
-      row.VisualPropertiesChanged += new EventHandler(Row_VisualPropertiesChanged);
-      pointsRowsTable.Add(row.Points, row);
-      row.Points.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsAdded);
-      row.Points.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsRemoved);
-      row.Points.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsReplaced);
-      row.Points.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_CollectionReset);
-    }
-    protected virtual void DeregisterScatterPlotDataRowEvents(ScatterPlotDataRow row) {
-      row.Points.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsAdded);
-      row.Points.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsRemoved);
-      row.Points.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsReplaced);
-      row.Points.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_CollectionReset);
-      pointsRowsTable.Remove(row.Points);
-      row.VisualPropertiesChanged -= new EventHandler(Row_VisualPropertiesChanged);
-      row.NameChanged -= new EventHandler(Row_NameChanged);
-    }
-    #endregion
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      invisibleSeries.Clear();
-      chart.ChartAreas[0].AxisX.Title = string.Empty;
-      chart.ChartAreas[0].AxisY.Title = string.Empty;
-      chart.Series.Clear();
-      if (Content != null) {
-        AddScatterPlotDataRows(Content.Rows);
-        ConfigureChartArea(chart.ChartAreas[0]);
-        RecalculateAxesScale(chart.ChartAreas[0]);
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      chart.Enabled = Content != null;
-    }
-
-    public void ShowConfiguration() {
-      if (Content != null) {
-        using (ScatterPlotVisualPropertiesDialog dialog = new ScatterPlotVisualPropertiesDialog(Content)) {
-          dialog.ShowDialog(this);
-        }
-      } else MessageBox.Show("Nothing to configure.");
-    }
-
-    protected virtual void AddScatterPlotDataRows(IEnumerable<ScatterPlotDataRow> rows) {
-      foreach (var row in rows) {
-        RegisterScatterPlotDataRowEvents(row);
-        Series series = new Series(row.Name);
-        if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
-        else series.LegendText = row.Name;
-        ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-        chart.Series.Add(series);
-      }
-      ConfigureChartArea(chart.ChartAreas[0]);
-      RecalculateAxesScale(chart.ChartAreas[0]);
-      UpdateYCursorInterval();
-    }
-
-    protected virtual void RemoveScatterPlotDataRows(IEnumerable<ScatterPlotDataRow> rows) {
-      foreach (var row in rows) {
-        DeregisterScatterPlotDataRowEvents(row);
-        Series series = chart.Series[row.Name];
-        chart.Series.Remove(series);
-        if (invisibleSeries.Contains(series))
-          invisibleSeries.Remove(series);
-      }
-      RecalculateAxesScale(chart.ChartAreas[0]);
-    }
-
-    private void ConfigureSeries(Series series, ScatterPlotDataRow row) {
-      series.BorderWidth = 1;
-      series.BorderDashStyle = ChartDashStyle.Solid;
-      series.BorderColor = Color.Empty;
-
-      if (row.VisualProperties.Color != Color.Empty)
-        series.Color = row.VisualProperties.Color;
-      else series.Color = Color.Empty;
-      series.IsVisibleInLegend = row.VisualProperties.IsVisibleInLegend;
-      series.ChartType = SeriesChartType.FastPoint;
-      series.MarkerSize = row.VisualProperties.PointSize;
-      series.MarkerStyle = ConvertPointStyle(row.VisualProperties.PointStyle);
-      series.XAxisType = AxisType.Primary;
-      series.YAxisType = AxisType.Primary;
-
-      if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
-      else series.LegendText = row.Name;
-
-      string xAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.XAxisTitle)
-                      ? "X"
-                      : Content.VisualProperties.XAxisTitle;
-      string yAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.YAxisTitle)
-                            ? "Y"
-                            : Content.VisualProperties.YAxisTitle;
-      series.ToolTip =
-        series.LegendText + Environment.NewLine +
-        xAxisTitle + " = " + "#VALX," + Environment.NewLine +
-        yAxisTitle + " = " + "#VAL";
-    }
-
-    private void ConfigureChartArea(ChartArea area) {
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisX.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisX.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisX.Title = Content.VisualProperties.XAxisTitle;
-      area.AxisX.MajorGrid.Enabled = Content.VisualProperties.XAxisGrid;
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisY.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisY.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisY.Title = Content.VisualProperties.YAxisTitle;
-      area.AxisY.MajorGrid.Enabled = Content.VisualProperties.YAxisGrid;
-    }
-
-    private void RecalculateAxesScale(ChartArea area) {
-      // Reset the axes bounds so that RecalculateAxesScale() will assign new bounds
-      foreach (Axis a in area.Axes) {
-        a.Minimum = double.NaN;
-        a.Maximum = double.NaN;
-      }
-      area.RecalculateAxesScale();
-      area.AxisX.IsMarginVisible = false;
-
-      if (!Content.VisualProperties.XAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.XAxisMinimumFixedValue)) area.AxisX.Minimum = Content.VisualProperties.XAxisMinimumFixedValue;
-      if (!Content.VisualProperties.XAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.XAxisMaximumFixedValue)) area.AxisX.Maximum = Content.VisualProperties.XAxisMaximumFixedValue;
-      if (!Content.VisualProperties.YAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.YAxisMinimumFixedValue)) area.AxisY.Minimum = Content.VisualProperties.YAxisMinimumFixedValue;
-      if (!Content.VisualProperties.YAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.YAxisMaximumFixedValue)) area.AxisY.Maximum = Content.VisualProperties.YAxisMaximumFixedValue;
-      if (area.AxisX.Minimum >= area.AxisX.Maximum) area.AxisX.Maximum = area.AxisX.Minimum + 1;
-      if (area.AxisY.Minimum >= area.AxisY.Maximum) area.AxisY.Maximum = area.AxisY.Minimum + 1;
-    }
-
-    protected virtual void UpdateYCursorInterval() {
-      double interestingValuesRange = (
-        from series in chart.Series
-        where series.Enabled
-        let values = (from point in series.Points
-                      where !point.IsEmpty
-                      select point.YValues[0]).DefaultIfEmpty(1.0)
-        let range = values.Max() - values.Min()
-        where range > 0.0
-        select range
-        ).DefaultIfEmpty(1.0).Min();
-
-      double digits = (int)Math.Log10(interestingValuesRange) - 3;
-      double yZoomInterval = Math.Pow(10, digits);
-      this.chart.ChartAreas[0].CursorY.Interval = yZoomInterval;
-    }
-
-
-    public event EventHandler ChartDoubleClick {
-      add { chartDoubleClick += value; }
-      remove { chartDoubleClick -= value; }
-    }
-
-    #region Event Handlers
-    #region Content Event Handlers
-
-    private void Content_VisualPropertiesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_VisualPropertiesChanged), sender, e);
-      else {
-        ConfigureChartArea(chart.ChartAreas[0]);
-        RecalculateAxesScale(chart.ChartAreas[0]); // axes min/max could have changed
-      }
-    }
-    #endregion
-    #region Rows Event Handlers
-    private void Rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded), sender, e);
-      else {
-        AddScatterPlotDataRows(e.Items);
-      }
-    }
-    private void Rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsRemoved), sender, e);
-      else {
-        RemoveScatterPlotDataRows(e.Items);
-      }
-    }
-    private void Rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced), sender, e);
-      else {
-        RemoveScatterPlotDataRows(e.OldItems);
-        AddScatterPlotDataRows(e.Items);
-      }
-    }
-    private void Rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset), sender, e);
-      else {
-        RemoveScatterPlotDataRows(e.OldItems);
-        AddScatterPlotDataRows(e.Items);
-      }
-    }
-    #endregion
-    #region Row Event Handlers
-    private void Row_VisualPropertiesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Row_VisualPropertiesChanged), sender, e);
-      else {
-        ScatterPlotDataRow row = (ScatterPlotDataRow)sender;
-        Series series = chart.Series[row.Name];
-        series.Points.Clear();
-        ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-        RecalculateAxesScale(chart.ChartAreas[0]);
-      }
-    }
-    private void Row_NameChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Row_NameChanged), sender, e);
-      else {
-        ScatterPlotDataRow row = (ScatterPlotDataRow)sender;
-        chart.Series[row.Name].Name = row.Name;
-      }
-    }
-    #endregion
-    #region Points Event Handlers
-    private void Points_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsAdded), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Points_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsRemoved), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Points_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsReplaced), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Points_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_CollectionReset), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    #endregion
-    #endregion
-
-    #region Chart Event Handlers
-    private void chart_MouseDown(object sender, MouseEventArgs e) {
-      HitTestResult result = chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem) {
-        ToggleSeriesVisible(result.Series);
-      }
-    }
-    private void chart_MouseMove(object sender, MouseEventArgs e) {
-      HitTestResult result = chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem)
-        this.Cursor = Cursors.Hand;
-      else
-        this.Cursor = Cursors.Default;
-    }
-    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
-      foreach (LegendItem legendItem in e.LegendItems) {
-        var series = chart.Series[legendItem.SeriesName];
-        if (series != null) {
-          bool seriesIsInvisible = invisibleSeries.Contains(series);
-          foreach (LegendCell cell in legendItem.Cells) {
-            cell.ForeColor = seriesIsInvisible ? Color.Gray : Color.Black;
-          }
-        }
-      }
-    }
-    #endregion
-
-    private void ToggleSeriesVisible(Series series) {
-      if (!invisibleSeries.Contains(series)) {
-        series.Points.Clear();
-        invisibleSeries.Add(series);
-      } else {
-        invisibleSeries.Remove(series);
-        if (Content != null) {
-
-          var row = (from r in Content.Rows
-                     where r.Name == series.Name
-                     select r).Single();
-          FillSeriesWithRowValues(series, row);
-          this.chart.Legends[series.Legend].ForeColor = Color.Black;
-          RecalculateAxesScale(chart.ChartAreas[0]);
-          UpdateYCursorInterval();
-        }
-      }
-    }
-
-    private void FillSeriesWithRowValues(Series series, ScatterPlotDataRow row) {
-      for (int i = 0; i < row.Points.Count; i++) {
-        var value = row.Points[i];
-        DataPoint point = new DataPoint();
-        if (IsInvalidValue(value.X) || IsInvalidValue(value.Y))
-          point.IsEmpty = true;
-        else {
-          point.XValue = value.X;
-          point.YValues = new double[] { value.Y };
-        }
-        series.Points.Add(point);
-      }
-    }
-
-    #region Helpers
-    private MarkerStyle ConvertPointStyle(ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle pointStyle) {
-      switch (pointStyle) {
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Circle:
-          return MarkerStyle.Circle;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Cross:
-          return MarkerStyle.Cross;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Diamond:
-          return MarkerStyle.Diamond;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Square:
-          return MarkerStyle.Square;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star4:
-          return MarkerStyle.Star4;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star5:
-          return MarkerStyle.Star5;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star6:
-          return MarkerStyle.Star6;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star10:
-          return MarkerStyle.Star10;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Triangle:
-          return MarkerStyle.Triangle;
-        default:
-          return MarkerStyle.None;
-      }
-    }
-
-    protected static bool IsInvalidValue(double x) {
-      return double.IsNaN(x) || x < (double)decimal.MinValue || x > (double)decimal.MaxValue;
-    }
-    #endregion
-
-    //bubble double click event with scatter plot view as sender
-    private void chart_DoubleClick(object sender, EventArgs e) {
-      if (chartDoubleClick != null)
-        chartDoubleClick(this, e);
-    }
-  }
-}
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/RenameColumnsDialog.cs	(revision 15242)
@@ -26,5 +26,4 @@
 namespace HeuristicLab.DataPreprocessing.Views {
   public partial class RenameColumnsDialog : Form {
-
     public IList<string> ColumnNames {
       get {
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 15242)
@@ -53,8 +53,27 @@
       this.bodyTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
       this.sizeGroupBox = new System.Windows.Forms.GroupBox();
+      this.heightNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.widthNumericUpDown = new System.Windows.Forms.NumericUpDown();
       this.heightLabel = new System.Windows.Forms.Label();
       this.widthLabel = new System.Windows.Forms.Label();
-      this.heightTrackBar = new System.Windows.Forms.TrackBar();
-      this.widthTrackBar = new System.Windows.Forms.TrackBar();
+      this.lockAspectCheckBox = new System.Windows.Forms.CheckBox();
+      this.pointSizeNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.pointSizeLabel = new System.Windows.Forms.Label();
+      this.regressionGroupBox = new System.Windows.Forms.GroupBox();
+      this.regressionTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.polynomialRegressionOrderNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.regressionTyleLabel = new System.Windows.Forms.Label();
+      this.groupingOptionsBox = new System.Windows.Forms.GroupBox();
+      this.legendGroupBox = new System.Windows.Forms.GroupBox();
+      this.legendCheckbox = new System.Windows.Forms.CheckBox();
+      this.legendOrderComboBox = new System.Windows.Forms.ComboBox();
+      this.legendOrderLabel = new System.Windows.Forms.Label();
+      this.aggregationLabel = new System.Windows.Forms.Label();
+      this.aggregationComboBox = new System.Windows.Forms.ComboBox();
+      this.groupingComboBox = new System.Windows.Forms.ComboBox();
+      this.opacityLabel = new System.Windows.Forms.Label();
+      this.pointOpacityNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.pointsGroupBox = new System.Windows.Forms.GroupBox();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
@@ -66,12 +85,15 @@
       this.bodyScrollPanel.SuspendLayout();
       this.sizeGroupBox.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.heightTrackBar)).BeginInit();
-      ((System.ComponentModel.ISupportInitialize)(this.widthTrackBar)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.heightNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.widthNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.pointSizeNumericUpDown)).BeginInit();
+      this.regressionGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).BeginInit();
+      this.groupingOptionsBox.SuspendLayout();
+      this.legendGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pointOpacityNumericUpDown)).BeginInit();
+      this.pointsGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
-      // checkedItemList
-      // 
-      this.checkedItemList.Size = new System.Drawing.Size(113, 369);
-      // 
       // splitContainer
       // 
@@ -80,10 +102,12 @@
       // 
       this.splitContainer.Panel1.Controls.Add(this.sizeGroupBox);
+      this.splitContainer.Panel1.Controls.Add(this.pointsGroupBox);
+      this.splitContainer.Panel1.Controls.Add(this.groupingOptionsBox);
+      this.splitContainer.Panel1.Controls.Add(this.regressionGroupBox);
       // 
       // splitContainer.Panel2
       // 
       this.splitContainer.Panel2.Controls.Add(this.frameTableLayoutPanel);
-      this.splitContainer.Size = new System.Drawing.Size(863, 520);
-      this.splitContainer.SplitterDistance = 120;
+      this.splitContainer.Size = new System.Drawing.Size(589, 451);
       // 
       // frameTableLayoutPanel
@@ -101,5 +125,5 @@
       this.frameTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
       this.frameTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
-      this.frameTableLayoutPanel.Size = new System.Drawing.Size(739, 520);
+      this.frameTableLayoutPanel.Size = new System.Drawing.Size(405, 451);
       this.frameTableLayoutPanel.TabIndex = 0;
       // 
@@ -111,5 +135,5 @@
       this.columnHeaderScrollPanel.Margin = new System.Windows.Forms.Padding(0);
       this.columnHeaderScrollPanel.Name = "columnHeaderScrollPanel";
-      this.columnHeaderScrollPanel.Size = new System.Drawing.Size(699, 40);
+      this.columnHeaderScrollPanel.Size = new System.Drawing.Size(365, 40);
       this.columnHeaderScrollPanel.TabIndex = 3;
       // 
@@ -138,5 +162,5 @@
       this.rowHeaderScrollPanel.Margin = new System.Windows.Forms.Padding(0);
       this.rowHeaderScrollPanel.Name = "rowHeaderScrollPanel";
-      this.rowHeaderScrollPanel.Size = new System.Drawing.Size(40, 480);
+      this.rowHeaderScrollPanel.Size = new System.Drawing.Size(40, 411);
       this.rowHeaderScrollPanel.TabIndex = 4;
       // 
@@ -166,5 +190,5 @@
       this.bodyScrollPanel.Margin = new System.Windows.Forms.Padding(0);
       this.bodyScrollPanel.Name = "bodyScrollPanel";
-      this.bodyScrollPanel.Size = new System.Drawing.Size(699, 480);
+      this.bodyScrollPanel.Size = new System.Drawing.Size(365, 411);
       this.bodyScrollPanel.TabIndex = 5;
       this.bodyScrollPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.bodyScrollPanel_Scroll);
@@ -188,21 +212,71 @@
       // sizeGroupBox
       // 
-      this.sizeGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
+      this.sizeGroupBox.Controls.Add(this.heightNumericUpDown);
+      this.sizeGroupBox.Controls.Add(this.widthNumericUpDown);
       this.sizeGroupBox.Controls.Add(this.heightLabel);
       this.sizeGroupBox.Controls.Add(this.widthLabel);
-      this.sizeGroupBox.Controls.Add(this.heightTrackBar);
-      this.sizeGroupBox.Controls.Add(this.widthTrackBar);
-      this.sizeGroupBox.Location = new System.Drawing.Point(4, 379);
+      this.sizeGroupBox.Controls.Add(this.lockAspectCheckBox);
+      this.sizeGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 78);
       this.sizeGroupBox.Name = "sizeGroupBox";
-      this.sizeGroupBox.Size = new System.Drawing.Size(113, 124);
+      this.sizeGroupBox.Size = new System.Drawing.Size(180, 98);
       this.sizeGroupBox.TabIndex = 5;
       this.sizeGroupBox.TabStop = false;
       this.sizeGroupBox.Text = "Chart Size";
       // 
+      // heightNumericUpDown
+      // 
+      this.heightNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.heightNumericUpDown.Increment = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+      this.heightNumericUpDown.Location = new System.Drawing.Point(50, 46);
+      this.heightNumericUpDown.Maximum = new decimal(new int[] {
+            100000,
+            0,
+            0,
+            0});
+      this.heightNumericUpDown.Name = "heightNumericUpDown";
+      this.heightNumericUpDown.Size = new System.Drawing.Size(124, 20);
+      this.heightNumericUpDown.TabIndex = 4;
+      this.heightNumericUpDown.Value = new decimal(new int[] {
+            225,
+            0,
+            0,
+            0});
+      this.heightNumericUpDown.ValueChanged += new System.EventHandler(this.heightNumericUpDown_ValueChanged);
+      // 
+      // widthNumericUpDown
+      // 
+      this.widthNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.widthNumericUpDown.Increment = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+      this.widthNumericUpDown.Location = new System.Drawing.Point(50, 20);
+      this.widthNumericUpDown.Maximum = new decimal(new int[] {
+            10000,
+            0,
+            0,
+            0});
+      this.widthNumericUpDown.Name = "widthNumericUpDown";
+      this.widthNumericUpDown.Size = new System.Drawing.Size(124, 20);
+      this.widthNumericUpDown.TabIndex = 3;
+      this.widthNumericUpDown.Value = new decimal(new int[] {
+            300,
+            0,
+            0,
+            0});
+      this.widthNumericUpDown.ValueChanged += new System.EventHandler(this.widthNumericUpDown_ValueChanged);
+      // 
       // heightLabel
       // 
       this.heightLabel.AutoSize = true;
-      this.heightLabel.Location = new System.Drawing.Point(6, 64);
+      this.heightLabel.Location = new System.Drawing.Point(6, 48);
       this.heightLabel.Name = "heightLabel";
       this.heightLabel.Size = new System.Drawing.Size(41, 13);
@@ -213,5 +287,5 @@
       // 
       this.widthLabel.AutoSize = true;
-      this.widthLabel.Location = new System.Drawing.Point(6, 16);
+      this.widthLabel.Location = new System.Drawing.Point(6, 22);
       this.widthLabel.Name = "widthLabel";
       this.widthLabel.Size = new System.Drawing.Size(38, 13);
@@ -219,33 +293,263 @@
       this.widthLabel.Text = "Width:";
       // 
-      // heightTrackBar
-      // 
-      this.heightTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.heightTrackBar.LargeChange = 50;
-      this.heightTrackBar.Location = new System.Drawing.Point(6, 83);
-      this.heightTrackBar.Maximum = 100;
-      this.heightTrackBar.Name = "heightTrackBar";
-      this.heightTrackBar.Size = new System.Drawing.Size(101, 45);
-      this.heightTrackBar.SmallChange = 10;
-      this.heightTrackBar.TabIndex = 0;
-      this.heightTrackBar.TickFrequency = 10;
-      this.heightTrackBar.Value = 20;
-      this.heightTrackBar.ValueChanged += new System.EventHandler(this.heightTrackBar_ValueChanged);
-      // 
-      // widthTrackBar
-      // 
-      this.widthTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.widthTrackBar.LargeChange = 50;
-      this.widthTrackBar.Location = new System.Drawing.Point(6, 32);
-      this.widthTrackBar.Maximum = 100;
-      this.widthTrackBar.Name = "widthTrackBar";
-      this.widthTrackBar.Size = new System.Drawing.Size(101, 45);
-      this.widthTrackBar.SmallChange = 10;
-      this.widthTrackBar.TabIndex = 0;
-      this.widthTrackBar.TickFrequency = 10;
-      this.widthTrackBar.Value = 20;
-      this.widthTrackBar.ValueChanged += new System.EventHandler(this.widthTrackBar_ValueChanged);
+      // lockAspectCheckBox
+      // 
+      this.lockAspectCheckBox.AutoSize = true;
+      this.lockAspectCheckBox.Checked = true;
+      this.lockAspectCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.lockAspectCheckBox.Location = new System.Drawing.Point(50, 73);
+      this.lockAspectCheckBox.Name = "lockAspectCheckBox";
+      this.lockAspectCheckBox.Size = new System.Drawing.Size(114, 17);
+      this.lockAspectCheckBox.TabIndex = 6;
+      this.lockAspectCheckBox.Text = "Lock Aspect Ratio";
+      this.lockAspectCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // pointSizeNumericUpDown
+      // 
+      this.pointSizeNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pointSizeNumericUpDown.Location = new System.Drawing.Point(58, 15);
+      this.pointSizeNumericUpDown.Maximum = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+      this.pointSizeNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.pointSizeNumericUpDown.Name = "pointSizeNumericUpDown";
+      this.pointSizeNumericUpDown.Size = new System.Drawing.Size(116, 20);
+      this.pointSizeNumericUpDown.TabIndex = 8;
+      this.pointSizeNumericUpDown.Value = new decimal(new int[] {
+            3,
+            0,
+            0,
+            0});
+      this.pointSizeNumericUpDown.ValueChanged += new System.EventHandler(this.pointSizeNumericUpDown_ValueChanged);
+      // 
+      // pointSizeLabel
+      // 
+      this.pointSizeLabel.AutoSize = true;
+      this.pointSizeLabel.Location = new System.Drawing.Point(6, 17);
+      this.pointSizeLabel.Name = "pointSizeLabel";
+      this.pointSizeLabel.Size = new System.Drawing.Size(30, 13);
+      this.pointSizeLabel.TabIndex = 7;
+      this.pointSizeLabel.Text = "Size:";
+      // 
+      // regressionGroupBox
+      // 
+      this.regressionGroupBox.Controls.Add(this.regressionTypeComboBox);
+      this.regressionGroupBox.Controls.Add(this.polynomialRegressionOrderNumericUpDown);
+      this.regressionGroupBox.Controls.Add(this.orderLabel);
+      this.regressionGroupBox.Controls.Add(this.regressionTyleLabel);
+      this.regressionGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.regressionGroupBox.Location = new System.Drawing.Point(0, 376);
+      this.regressionGroupBox.Name = "regressionGroupBox";
+      this.regressionGroupBox.Size = new System.Drawing.Size(180, 75);
+      this.regressionGroupBox.TabIndex = 3;
+      this.regressionGroupBox.TabStop = false;
+      this.regressionGroupBox.Text = "Regression";
+      // 
+      // regressionTypeComboBox
+      // 
+      this.regressionTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.regressionTypeComboBox.FormattingEnabled = true;
+      this.regressionTypeComboBox.Location = new System.Drawing.Point(67, 19);
+      this.regressionTypeComboBox.Name = "regressionTypeComboBox";
+      this.regressionTypeComboBox.Size = new System.Drawing.Size(107, 21);
+      this.regressionTypeComboBox.TabIndex = 14;
+      this.regressionTypeComboBox.SelectedValueChanged += new System.EventHandler(this.regressionTypeComboBox_SelectedValueChanged);
+      // 
+      // polynomialRegressionOrderNumericUpDown
+      // 
+      this.polynomialRegressionOrderNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.polynomialRegressionOrderNumericUpDown.Location = new System.Drawing.Point(67, 45);
+      this.polynomialRegressionOrderNumericUpDown.Margin = new System.Windows.Forms.Padding(9, 3, 3, 3);
+      this.polynomialRegressionOrderNumericUpDown.Maximum = new decimal(new int[] {
+            6,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Minimum = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Name = "polynomialRegressionOrderNumericUpDown";
+      this.polynomialRegressionOrderNumericUpDown.Size = new System.Drawing.Size(107, 20);
+      this.polynomialRegressionOrderNumericUpDown.TabIndex = 15;
+      this.polynomialRegressionOrderNumericUpDown.Value = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.ValueChanged += new System.EventHandler(this.polynomialRegressionOrderNumericUpDown_ValueChanged);
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Location = new System.Drawing.Point(6, 47);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(36, 13);
+      this.orderLabel.TabIndex = 16;
+      this.orderLabel.Text = "Order:";
+      // 
+      // regressionTyleLabel
+      // 
+      this.regressionTyleLabel.AutoSize = true;
+      this.regressionTyleLabel.Location = new System.Drawing.Point(6, 22);
+      this.regressionTyleLabel.Name = "regressionTyleLabel";
+      this.regressionTyleLabel.Size = new System.Drawing.Size(34, 13);
+      this.regressionTyleLabel.TabIndex = 13;
+      this.regressionTyleLabel.Text = "Type:";
+      // 
+      // groupingOptionsBox
+      // 
+      this.groupingOptionsBox.Controls.Add(this.legendGroupBox);
+      this.groupingOptionsBox.Controls.Add(this.aggregationLabel);
+      this.groupingOptionsBox.Controls.Add(this.aggregationComboBox);
+      this.groupingOptionsBox.Controls.Add(this.groupingComboBox);
+      this.groupingOptionsBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.groupingOptionsBox.Location = new System.Drawing.Point(0, 245);
+      this.groupingOptionsBox.Name = "groupingOptionsBox";
+      this.groupingOptionsBox.Size = new System.Drawing.Size(180, 131);
+      this.groupingOptionsBox.TabIndex = 8;
+      this.groupingOptionsBox.TabStop = false;
+      this.groupingOptionsBox.Text = "Grouping";
+      // 
+      // legendGroupBox
+      // 
+      this.legendGroupBox.Controls.Add(this.legendCheckbox);
+      this.legendGroupBox.Controls.Add(this.legendOrderComboBox);
+      this.legendGroupBox.Controls.Add(this.legendOrderLabel);
+      this.legendGroupBox.Enabled = false;
+      this.legendGroupBox.Location = new System.Drawing.Point(6, 73);
+      this.legendGroupBox.Name = "legendGroupBox";
+      this.legendGroupBox.Size = new System.Drawing.Size(167, 50);
+      this.legendGroupBox.TabIndex = 7;
+      this.legendGroupBox.TabStop = false;
+      this.legendGroupBox.Text = "Legend";
+      // 
+      // legendCheckbox
+      // 
+      this.legendCheckbox.AutoSize = true;
+      this.legendCheckbox.Checked = true;
+      this.legendCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.legendCheckbox.Location = new System.Drawing.Point(56, -1);
+      this.legendCheckbox.Name = "legendCheckbox";
+      this.legendCheckbox.Size = new System.Drawing.Size(56, 17);
+      this.legendCheckbox.TabIndex = 0;
+      this.legendCheckbox.Text = "Visible";
+      this.legendCheckbox.UseVisualStyleBackColor = true;
+      this.legendCheckbox.CheckedChanged += new System.EventHandler(this.legendCheckbox_CheckedChanged);
+      // 
+      // legendOrderComboBox
+      // 
+      this.legendOrderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.legendOrderComboBox.FormattingEnabled = true;
+      this.legendOrderComboBox.Location = new System.Drawing.Point(49, 19);
+      this.legendOrderComboBox.Name = "legendOrderComboBox";
+      this.legendOrderComboBox.Size = new System.Drawing.Size(109, 21);
+      this.legendOrderComboBox.TabIndex = 5;
+      this.legendOrderComboBox.SelectedIndexChanged += new System.EventHandler(this.legendOrderComboBox_SelectedIndexChanged);
+      // 
+      // legendOrderLabel
+      // 
+      this.legendOrderLabel.AutoSize = true;
+      this.legendOrderLabel.Location = new System.Drawing.Point(7, 22);
+      this.legendOrderLabel.Name = "legendOrderLabel";
+      this.legendOrderLabel.Size = new System.Drawing.Size(36, 13);
+      this.legendOrderLabel.TabIndex = 4;
+      this.legendOrderLabel.Text = "Order:";
+      this.legendOrderLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // aggregationLabel
+      // 
+      this.aggregationLabel.AutoSize = true;
+      this.aggregationLabel.Enabled = false;
+      this.aggregationLabel.Location = new System.Drawing.Point(5, 49);
+      this.aggregationLabel.Name = "aggregationLabel";
+      this.aggregationLabel.Size = new System.Drawing.Size(67, 13);
+      this.aggregationLabel.TabIndex = 3;
+      this.aggregationLabel.Text = "Aggregation:";
+      // 
+      // aggregationComboBox
+      // 
+      this.aggregationComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.aggregationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.aggregationComboBox.Enabled = false;
+      this.aggregationComboBox.FormattingEnabled = true;
+      this.aggregationComboBox.Location = new System.Drawing.Point(79, 46);
+      this.aggregationComboBox.Name = "aggregationComboBox";
+      this.aggregationComboBox.Size = new System.Drawing.Size(96, 21);
+      this.aggregationComboBox.TabIndex = 2;
+      this.aggregationComboBox.SelectedIndexChanged += new System.EventHandler(this.aggregationComboBox_SelectedIndexChanged);
+      // 
+      // groupingComboBox
+      // 
+      this.groupingComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupingComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.groupingComboBox.FormattingEnabled = true;
+      this.groupingComboBox.Location = new System.Drawing.Point(6, 19);
+      this.groupingComboBox.Name = "groupingComboBox";
+      this.groupingComboBox.Size = new System.Drawing.Size(169, 21);
+      this.groupingComboBox.TabIndex = 1;
+      this.groupingComboBox.SelectedIndexChanged += new System.EventHandler(this.groupingComboBox_SelectedIndexChanged);
+      // 
+      // opacityLabel
+      // 
+      this.opacityLabel.AutoSize = true;
+      this.opacityLabel.Location = new System.Drawing.Point(6, 43);
+      this.opacityLabel.Name = "opacityLabel";
+      this.opacityLabel.Size = new System.Drawing.Size(46, 13);
+      this.opacityLabel.TabIndex = 7;
+      this.opacityLabel.Text = "Opacity:";
+      // 
+      // pointOpacityNumericUpDown
+      // 
+      this.pointOpacityNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pointOpacityNumericUpDown.DecimalPlaces = 2;
+      this.pointOpacityNumericUpDown.Increment = new decimal(new int[] {
+            1,
+            0,
+            0,
+            65536});
+      this.pointOpacityNumericUpDown.Location = new System.Drawing.Point(58, 41);
+      this.pointOpacityNumericUpDown.Maximum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.pointOpacityNumericUpDown.Name = "pointOpacityNumericUpDown";
+      this.pointOpacityNumericUpDown.Size = new System.Drawing.Size(115, 20);
+      this.pointOpacityNumericUpDown.TabIndex = 8;
+      this.pointOpacityNumericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.pointOpacityNumericUpDown.ValueChanged += new System.EventHandler(this.pointOpacityNumericUpDown_ValueChanged);
+      // 
+      // pointsGroupBox
+      // 
+      this.pointsGroupBox.Controls.Add(this.pointOpacityNumericUpDown);
+      this.pointsGroupBox.Controls.Add(this.pointSizeLabel);
+      this.pointsGroupBox.Controls.Add(this.pointSizeNumericUpDown);
+      this.pointsGroupBox.Controls.Add(this.opacityLabel);
+      this.pointsGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.pointsGroupBox.Location = new System.Drawing.Point(0, 176);
+      this.pointsGroupBox.Name = "pointsGroupBox";
+      this.pointsGroupBox.Size = new System.Drawing.Size(180, 69);
+      this.pointsGroupBox.TabIndex = 4;
+      this.pointsGroupBox.TabStop = false;
+      this.pointsGroupBox.Text = "Points";
       // 
       // ScatterPlotMultiView
@@ -254,5 +558,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Name = "ScatterPlotMultiView";
-      this.Size = new System.Drawing.Size(863, 520);
+      this.Size = new System.Drawing.Size(589, 451);
       this.splitContainer.Panel1.ResumeLayout(false);
       this.splitContainer.Panel2.ResumeLayout(false);
@@ -268,6 +572,17 @@
       this.sizeGroupBox.ResumeLayout(false);
       this.sizeGroupBox.PerformLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.heightTrackBar)).EndInit();
-      ((System.ComponentModel.ISupportInitialize)(this.widthTrackBar)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.heightNumericUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.widthNumericUpDown)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.pointSizeNumericUpDown)).EndInit();
+      this.regressionGroupBox.ResumeLayout(false);
+      this.regressionGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).EndInit();
+      this.groupingOptionsBox.ResumeLayout(false);
+      this.groupingOptionsBox.PerformLayout();
+      this.legendGroupBox.ResumeLayout(false);
+      this.legendGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pointOpacityNumericUpDown)).EndInit();
+      this.pointsGroupBox.ResumeLayout(false);
+      this.pointsGroupBox.PerformLayout();
       this.ResumeLayout(false);
 
@@ -284,8 +599,27 @@
     private System.Windows.Forms.Panel bodyScrollPanel;
     private System.Windows.Forms.GroupBox sizeGroupBox;
-    private System.Windows.Forms.TrackBar widthTrackBar;
-    private System.Windows.Forms.TrackBar heightTrackBar;
     private System.Windows.Forms.Label heightLabel;
     private System.Windows.Forms.Label widthLabel;
+    private System.Windows.Forms.GroupBox regressionGroupBox;
+    private System.Windows.Forms.ComboBox regressionTypeComboBox;
+    private System.Windows.Forms.NumericUpDown polynomialRegressionOrderNumericUpDown;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.Label regressionTyleLabel;
+    private System.Windows.Forms.GroupBox groupingOptionsBox;
+    private System.Windows.Forms.ComboBox groupingComboBox;
+    private System.Windows.Forms.NumericUpDown widthNumericUpDown;
+    private System.Windows.Forms.NumericUpDown heightNumericUpDown;
+    private System.Windows.Forms.CheckBox lockAspectCheckBox;
+    private System.Windows.Forms.NumericUpDown pointSizeNumericUpDown;
+    private System.Windows.Forms.Label pointSizeLabel;
+    private System.Windows.Forms.Label aggregationLabel;
+    private System.Windows.Forms.ComboBox aggregationComboBox;
+    private System.Windows.Forms.GroupBox pointsGroupBox;
+    private System.Windows.Forms.NumericUpDown pointOpacityNumericUpDown;
+    private System.Windows.Forms.Label opacityLabel;
+    private System.Windows.Forms.Label legendOrderLabel;
+    private System.Windows.Forms.ComboBox legendOrderComboBox;
+    private System.Windows.Forms.GroupBox legendGroupBox;
+    private System.Windows.Forms.CheckBox legendCheckbox;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 15242)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#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.Drawing;
@@ -5,21 +26,39 @@
 using System.Windows.Forms;
 using HeuristicLab.Analysis;
+using HeuristicLab.Analysis.Views;
 using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core.Views;
 using HeuristicLab.Data;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
+using AggregationType = HeuristicLab.Analysis.DataTableVisualProperties.DataTableHistogramAggregation;
+using RegressionType = HeuristicLab.Analysis.ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType;
 
 namespace HeuristicLab.DataPreprocessing.Views {
   [View("Scatter Plot Multi View")]
-  [Content(typeof(ScatterPlotContent), false)]
-  public partial class ScatterPlotMultiView : PreprocessingCheckedVariablesView {
-    private readonly IDictionary<string, Label> columnHeaderCache;
-    private readonly IDictionary<string, Label> rowHeaderCache;
-    private readonly IDictionary<Tuple<string/*col*/, string/*row*/>, ItemView> bodyCache;
+  [Content(typeof(MultiScatterPlotContent), true)]
+  public sealed partial class ScatterPlotMultiView : PreprocessingCheckedVariablesView {
+    private readonly IDictionary<string, Label> columnHeaderCache = new Dictionary<string, Label>();
+    private readonly IDictionary<string, VerticalLabel> rowHeaderCache = new Dictionary<string, VerticalLabel>();
+    private readonly IDictionary<Tuple<string/*col*/, string/*row*/>, Control> bodyCache = new Dictionary<Tuple<string, string>, Control>();
+
+    public new MultiScatterPlotContent Content {
+      get { return (MultiScatterPlotContent)base.Content; }
+      set { base.Content = value; }
+    }
 
     public ScatterPlotMultiView() {
       InitializeComponent();
+
+      oldWidth = (int)widthNumericUpDown.Value;
+      oldHeight = (int)heightNumericUpDown.Value;
+
+      regressionTypeComboBox.DataSource = Enum.GetValues(typeof(RegressionType));
+      regressionTypeComboBox.SelectedItem = RegressionType.None;
+
+      aggregationComboBox.DataSource = Enum.GetValues(typeof(AggregationType));
+      aggregationComboBox.SelectedItem = AggregationType.Overlapping;
+
+      legendOrderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
+      legendOrderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
 
       #region Initialize Scrollbars
@@ -41,14 +80,5 @@
       #endregion
 
-      columnHeaderCache = new Dictionary<string, Label>();
-      rowHeaderCache = new Dictionary<string, Label>();
-      bodyCache = new Dictionary<Tuple<string, string>, ItemView>();
-
       bodyScrollPanel.MouseWheel += bodyScrollPanel_MouseWheel;
-    }
-
-    public new ScatterPlotContent Content {
-      get { return (ScatterPlotContent)base.Content; }
-      set { base.Content = value; }
     }
 
@@ -56,24 +86,185 @@
       base.OnContentChanged();
       if (Content != null) {
-        GenerateCharts();
-      }
+        groupingComboBox.Items.Add(string.Empty);
+        foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData)) {
+          groupingComboBox.Items.Add(var);
+        }
+        SuppressCheckedChangedUpdate = true;
+        groupingComboBox.SelectedItem = Content.GroupingVariable ?? string.Empty;
+        SuppressCheckedChangedUpdate = false;
+
+        // uncheck variables that max 20 vars are selected initially
+        var variables = Content.VariableItemList;
+        int numChecked = variables.CheckedItems.Count();
+        if (numChecked > 20) {
+          string message = string.Format("Display all {0} input variables ({1} charts)?" + Environment.NewLine +
+                                         "Press No to reduce the number of checked variables to 20." + Environment.NewLine +
+                                         "Press Cancel to uncheck all.",
+            numChecked, numChecked * numChecked);
+          var dialogResult = MessageBox.Show(this, message, "Display All Input Variables?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
+          if (dialogResult == DialogResult.No || dialogResult == DialogResult.Cancel) {
+            SuppressCheckedChangedUpdate = true;
+            IEnumerable<StringValue> toUncheck = variables;
+            if (dialogResult == DialogResult.No) // only show the first 20
+              toUncheck = variables.CheckedItems.Reverse().Take(numChecked - 20).Select(x => x.Value);
+            foreach (var var in toUncheck)
+              Content.VariableItemList.SetItemCheckedState(var, false);
+            SuppressCheckedChangedUpdate = false;
+          }
+        }
+        GenerateCharts(true);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
+      sizeGroupBox.Enabled = Content != null;
+      pointsGroupBox.Enabled = Content != null;
+      groupingComboBox.Enabled = Content != null;
+      regressionGroupBox.Enabled = Content != null;
     }
 
     protected override void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
       base.CheckedItemsChanged(sender, checkedItems);
-      foreach (var variable in checkedItems.Items.Select(i => i.Value.Value)) {
-        if (IsVariableChecked(variable))
-          AddChartToTable(variable);
+      if (SuppressCheckedChangedUpdate) return;
+
+      foreach (var variable in checkedItems.Items) {
+        if (Content.VariableItemList.ItemChecked(variable.Value))
+          ShowChartOnTable(variable.Value.Value, variable.Index);
         else
-          RemoveChartFromTable(variable);
-      }
-    }
-
-    #region Add and remove charts
+          HideChartFromTable(variable.Value.Value, variable.Index);
+      }
+    }
+
+    #region Show and Hide charts
+    private void ShowChartOnTable(string variable, int idx) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // show column header
+      var colH = columnHeaderTableLayoutPanel;
+      colH.ColumnStyles[idx].Width = GetColumnWidth();
+      if (colH.GetControlFromPosition(idx, 0) == null)
+        colH.Controls.Add(GetColumnHeader(variable), idx, 0);
+      else
+        colH.GetControlFromPosition(idx, 0).Visible = true;
+
+      // show row header
+      var rowH = rowHeaderTableLayoutPanel;
+      rowH.RowStyles[idx].Height = GetRowHeight();
+      if (rowH.GetControlFromPosition(0, idx) == null)
+        rowH.Controls.Add(GetRowHeader(variable), 0, idx);
+      else
+        rowH.GetControlFromPosition(0, idx).Visible = true;
+
+      // show body
+      var body = bodyTableLayoutPanel;
+      ShowColumnHelper(body, idx, r => GetBody(variable, Content.VariableItemList[r].Value));
+      ShowRowHelper(body, idx, c => GetBody(Content.VariableItemList[c].Value, variable));
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void ShowColumnHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      tlp.ColumnStyles[idx].Width = GetColumnWidth();
+      for (int r = 0; r < tlp.RowCount; r++) {
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[r])) {
+          var control = tlp.GetControlFromPosition(idx, r);
+          if (control == null)
+            tlp.Controls.Add(creatorFunc(r), idx, r);
+          else
+            control.Visible = true;
+        }
+      }
+    }
+    private void ShowRowHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      tlp.RowStyles[idx].Height = GetRowHeight();
+      for (int c = 0; c < tlp.ColumnCount; c++) {
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[c])) {
+          var control = tlp.GetControlFromPosition(c, idx);
+          if (control == null)
+            tlp.Controls.Add(creatorFunc(c), c, idx);
+          else
+            tlp.GetControlFromPosition(c, idx).Visible = true;
+        }
+      }
+    }
+
+    private void HideChartFromTable(string variable, int idx) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // hide column header
+      var colH = columnHeaderTableLayoutPanel;
+      HideColumnHelper(colH, idx);
+
+      // hide row header
+      var rowH = rowHeaderTableLayoutPanel;
+      HideRowHelper(rowH, idx);
+
+      // hide from body
+      var body = bodyTableLayoutPanel;
+      HideColumnHelper(body, idx);
+      HideRowHelper(body, idx);
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void HideColumnHelper(TableLayoutPanel tlp, int idx) {
+      tlp.ColumnStyles[idx].Width = 0;
+      // hide controls
+      for (int r = 0; r < tlp.RowCount; r++) {
+        var control = tlp.GetControlFromPosition(idx, r);
+        if (control != null)
+          control.Visible = false;
+      }
+    }
+    private void HideRowHelper(TableLayoutPanel tlp, int idx) {
+      tlp.RowStyles[idx].Height = 0;
+      // hide controls
+      for (int c = 0; c < tlp.ColumnCount; c++) {
+        var control = tlp.GetControlFromPosition(c, idx);
+        if (control != null)
+          control.Visible = false;
+      }
+    }
+    #endregion
+
+    #region Add/Remove/Update Variable
+    protected override void AddVariable(string name) {
+      base.AddVariable(name);
+      if (IsVariableChecked(name))
+        AddChartToTable(name);
+    }
+    protected override void RemoveVariable(string name) {
+      base.RemoveVariable(name);
+
+      if (IsVariableChecked(name)) {
+        RemoveChartFromTable(name);
+      }
+
+      // clear caches
+      columnHeaderCache[name].Dispose();
+      columnHeaderCache.Remove(name);
+      rowHeaderCache[name].Dispose();
+      rowHeaderCache.Remove(name);
+      var keys = bodyCache.Keys.Where(t => t.Item1 == name || t.Item2 == name).ToList();
+      foreach (var key in keys) {
+        bodyCache[key].Dispose();
+        bodyCache.Remove(key);
+      }
+    }
+    protected override void UpdateVariable(string name) {
+      base.UpdateVariable(name);
+      RemoveVariable(name);
+      AddVariable(name);
+    }
+    protected override void ResetAllVariables() {
+      GenerateCharts(true);
+    }
+
     private void AddChartToTable(string variable) {
       frameTableLayoutPanel.SuspendLayout();
 
       // find index to insert 
-      var variables = checkedItemList.Content.Select(v => v.Value).ToList();
+      var variables = Content.VariableItemList.Select(v => v.Value).ToList();
       int idx = variables              // all variables
         .TakeWhile(t => t != variable) // ... until the variable that was checked
@@ -102,5 +293,5 @@
       tlp.ColumnStyles.Insert(idx, new ColumnStyle(SizeType.Absolute, GetColumnWidth()));
       // shift right
-      for (int c = tlp.ColumnCount; c >  idx - 1; c--) {
+      for (int c = tlp.ColumnCount; c > idx - 1; c--) {
         for (int r = 0; r < tlp.RowCount; r++) {
           var control = tlp.GetControlFromPosition(c, r);
@@ -192,35 +383,5 @@
     #endregion
 
-    #region Add/Remove/Update Variable
-    protected override void AddVariable(string name) {
-      base.AddVariable(name);
-      if (IsVariableChecked(name))
-        AddChartToTable(name);
-    }
-    protected override void RemoveVariable(string name) {
-      base.RemoveVariable(name);
-
-      // clear caches
-      columnHeaderCache.Remove(name);
-      rowHeaderCache.Remove(name);
-      var keys = bodyCache.Keys.Where(t => t.Item1 == name || t.Item2 == name).ToList();
-      foreach (var key in keys)
-        bodyCache.Remove(key);
-
-      if (IsVariableChecked(name)) {
-        RemoveChartFromTable(name);
-      }
-    }
-    protected override void UpdateVariable(string name) {
-      base.UpdateVariable(name);
-      RemoveVariable(name);
-      AddVariable(name);
-    }
-    protected override void ResetAllVariables() {
-      GenerateCharts();
-    }
-    #endregion
-
-    #region Creating Headers and Body 
+    #region Creating Headers and Body
     private Label GetColumnHeader(string variable) {
       if (!columnHeaderCache.ContainsKey(variable)) {
@@ -238,9 +399,10 @@
     private Label GetRowHeader(string variable) {
       if (!rowHeaderCache.ContainsKey(variable)) {
-        rowHeaderCache.Add(variable, new Label() {
+        rowHeaderCache.Add(variable, new VerticalLabel() {
           Text = variable,
           TextAlign = ContentAlignment.MiddleCenter,
           Name = variable,
           Width = rowHeaderTableLayoutPanel.Width,
+          Height = columnHeaderScrollPanel.Width,
           Dock = DockStyle.Fill,
           Margin = new Padding(3)
@@ -249,31 +411,56 @@
       return rowHeaderCache[variable];
     }
-    private ItemView GetBody(string colVariable, string rowVariable) {
+    private Control GetBody(string colVariable, string rowVariable) {
       var key = Tuple.Create(colVariable, rowVariable);
       if (!bodyCache.ContainsKey(key)) {
         if (rowVariable == colVariable) { // use historgram if x and y variable are equal
-          PreprocessingDataTable dataTable = new PreprocessingDataTable();
-          DataRow dataRow = Content.CreateDataRow(rowVariable, DataRowVisualProperties.DataRowChartType.Histogram);
-          dataTable.Rows.Add(dataRow);
-          PreprocessingDataTableView pcv = new PreprocessingDataTableView {
+          var dataTable = HistogramContent.CreateHistogram(
+            Content.PreprocessingData,
+            rowVariable,
+            (string)groupingComboBox.SelectedItem,
+            (AggregationType)aggregationComboBox.SelectedItem,
+            (PreprocessingChartContent.LegendOrder)legendOrderComboBox.SelectedItem);
+          dataTable.VisualProperties.Title = string.Empty;
+          foreach (var dataRow in dataTable.Rows) {
+            dataRow.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+          }
+          var pcv = new DataTableView {
             Name = key.ToString(),
             Content = dataTable,
             Dock = DockStyle.Fill,
-            ShowLegend = false,
-            XAxisFormat = "G3"
+            ShowChartOnly = true
           };
-          pcv.ChartDoubleClick += HistogramDoubleClick;
+          //pcv.ChartDoubleClick += HistogramDoubleClick;  // ToDo: not working; double click is already handled by the chart
           bodyCache.Add(key, pcv);
         } else { //scatter plot
-          ScatterPlot scatterPlot = Content.CreateScatterPlot(colVariable, rowVariable);
-          PreprocessingScatterPlotView pspv = new PreprocessingScatterPlotView {
+          var scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData,
+            colVariable,
+            rowVariable,
+            (string)groupingComboBox.SelectedItem,
+            (PreprocessingChartContent.LegendOrder)legendOrderComboBox.SelectedItem);
+          var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+          int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+          int i = 0;
+          var colors = PreprocessingChartView.Colors;
+          foreach (var row in scatterPlot.Rows) {
+            row.VisualProperties.PointSize = (int)pointSizeNumericUpDown.Value;
+            row.VisualProperties.Color = Color.FromArgb((int)(pointOpacityNumericUpDown.Value * 255),
+              row.VisualProperties.Color.IsEmpty ? colors[i++ % colors.Length] : row.VisualProperties.Color);
+            row.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+            row.VisualProperties.IsRegressionVisibleInLegend = false;
+            row.VisualProperties.RegressionType = regressionType;
+            row.VisualProperties.PolynomialRegressionOrder = order;
+          }
+          scatterPlot.VisualProperties.Title = string.Empty;
+          var scatterPlotView = new ScatterPlotView {
             Name = key.ToString(),
             Content = scatterPlot,
             Dock = DockStyle.Fill,
-            ShowLegend = false,
-            XAxisFormat = "G3"
+            ShowName = false
+            //ShowLegend = false,
+            //XAxisFormat = "G3"
           };
-          pspv.ChartDoubleClick += ScatterPlotDoubleClick;
-          bodyCache.Add(key, pspv);
+          //scatterPlotView.DoubleClick += ScatterPlotDoubleClick; // ToDo: not working; double click is already handled by the chart
+          bodyCache.Add(key, scatterPlotView);
         }
       }
@@ -282,7 +469,11 @@
     #endregion
 
+    protected override void CheckedChangedUpdate() {
+      GenerateCharts(false); // only checked-changes -> reuse cached values
+    }
+
     #region Generate Charts
-    private void GenerateCharts() {
-      var variables = GetCheckedVariables();
+    private void GenerateCharts(bool clearCache) {
+      if (Content == null || SuppressCheckedChangedUpdate) return;
 
       // Clear old layouts and cache
@@ -292,7 +483,15 @@
         tableLayoutPanel.RowStyles.Clear();
       }
-      columnHeaderCache.Clear();
-      rowHeaderCache.Clear();
-      bodyCache.Clear();
+
+      if (clearCache) {
+        foreach (var control in bodyCache.Values.Concat(columnHeaderCache.Values).Concat(rowHeaderCache.Values)) {
+          control.Dispose();
+        }
+        columnHeaderCache.Clear();
+        rowHeaderCache.Clear();
+        bodyCache.Clear();
+      }
+
+      var variables = Content.VariableItemList.Select(x => x.Value).ToList();
 
       // Set row and column count
@@ -304,8 +503,9 @@
       // Set column and row layout
       for (int i = 0; i < variables.Count; i++) {
-        columnHeaderTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, GetColumnWidth()));
-        rowHeaderTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, GetRowHeight()));
-        bodyTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, GetColumnWidth()));
-        bodyTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, GetRowHeight()));
+        bool @checked = Content.VariableItemList.ItemChecked(Content.VariableItemList[i]);
+        columnHeaderTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, @checked ? GetColumnWidth() : 0));
+        rowHeaderTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, @checked ? GetRowHeight() : 0));
+        bodyTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, @checked ? GetColumnWidth() : 0));
+        bodyTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, @checked ? GetRowHeight() : 0));
       }
 
@@ -318,23 +518,23 @@
 
     private void AddHeaderToTableLayoutPanels() {
-      int i = 0;
-      foreach (var variable in GetCheckedVariables()) {
-        columnHeaderTableLayoutPanel.Controls.Add(GetColumnHeader(variable), i, 0);
-        rowHeaderTableLayoutPanel.Controls.Add(GetRowHeader(variable), 0, i);
-        i++;
+      for (int i = 0; i < Content.VariableItemList.Count; i++) {
+        var variable = Content.VariableItemList[i];
+        if (Content.VariableItemList.ItemChecked(variable)) {
+          columnHeaderTableLayoutPanel.Controls.Add(GetColumnHeader(variable.Value), i, 0);
+          rowHeaderTableLayoutPanel.Controls.Add(GetRowHeader(variable.Value), 0, i);
+        }
       }
     }
     private void AddChartsToTableLayoutPanel() {
-      int c = 0;
-      foreach (var colVar in GetCheckedVariables()) {
+      for (int c = 0; c < Content.VariableItemList.Count; c++) {
+        var colVar = Content.VariableItemList[c].Value;
         if (!IsVariableChecked(colVar)) continue;
-        int r = 0;
-        foreach (var rowVar in GetCheckedVariables()) {
+        for (int r = 0; r < Content.VariableItemList.Count; r++) {
+          var rowVar = Content.VariableItemList[r].Value;
           if (!IsVariableChecked(rowVar)) continue;
           bodyTableLayoutPanel.Controls.Add(GetBody(colVar, rowVar), c, r);
-          r++;
-        }
-        c++;
-      }
+        }
+      }
+      UpdateRegressionLine();
     }
 
@@ -344,7 +544,7 @@
     //Open scatter plot in new tab with new content when double clicked
     private void ScatterPlotDoubleClick(object sender, EventArgs e) {
-      PreprocessingScatterPlotView pspv = (PreprocessingScatterPlotView)sender;
-      ScatterPlotContent scatterContent = new ScatterPlotContent(Content, new Cloner());  // create new content
-      ScatterPlot scatterPlot = pspv.Content;
+      var scatterPlotView = (ScatterPlotView)sender;
+      var scatterContent = new SingleScatterPlotContent(Content.PreprocessingData);
+      ScatterPlot scatterPlot = scatterPlotView.Content;
 
       //Extract variable names from scatter plot and set them in content
@@ -355,13 +555,13 @@
       }
 
-      MainFormManager.MainForm.ShowContent(scatterContent, typeof(ScatterPlotSingleView));  // open in new tab
+      MainFormManager.MainForm.ShowContent(scatterContent, typeof(ScatterPlotSingleView)); // open in new tab
     }
 
     //open histogram in new tab with new content when double clicked
     private void HistogramDoubleClick(object sender, EventArgs e) {
-      PreprocessingDataTableView pcv = (PreprocessingDataTableView)sender;
+      DataTableView pcv = (DataTableView)sender;
       HistogramContent histoContent = new HistogramContent(Content.PreprocessingData);  // create new content     
-      histoContent.VariableItemList = Content.CreateVariableItemList();
-      PreprocessingDataTable dataTable = pcv.Content;
+                                                                                        //ToDo: histoContent.VariableItemList = Content.CreateVariableItemList();
+      var dataTable = pcv.Content;
 
       //Set variable item list from with variable from data table
@@ -374,5 +574,5 @@
         }
       }
-      MainFormManager.MainForm.ShowContent(histoContent, typeof(HistogramView));  // open in new tab
+      MainFormManager.MainForm.ShowContent(histoContent, typeof(HistogramView)); // open in new tab
     }
     #endregion
@@ -413,24 +613,156 @@
 
     #region Sizing of Charts
-    private int GetColumnWidth() { return (int)(bodyScrollPanel.Width * ((float)widthTrackBar.Value / 100)); }
-    private int GetRowHeight() { return (int)(bodyScrollPanel.Height * ((float)heightTrackBar.Value / 100)); }
-    private void widthTrackBar_ValueChanged(object sender, EventArgs e) {
+    private int oldWidth;
+    private int oldHeight;
+    private float AspectRatio {
+      get {
+        if (oldWidth == 0 || oldHeight == 0) return 1;
+        return (float)oldWidth / oldHeight;
+      }
+    }
+    private bool lockChange = false;
+
+    private int GetColumnWidth() { return (int)widthNumericUpDown.Value; }
+    private int GetRowHeight() { return (int)heightNumericUpDown.Value; }
+
+    private void widthNumericUpDown_ValueChanged(object sender, EventArgs e) {
       frameTableLayoutPanel.SuspendRepaint();
+      if (lockAspectCheckBox.Checked && !lockChange) {
+        lockChange = true;
+        heightNumericUpDown.Value = (int)((double)widthNumericUpDown.Value / AspectRatio);
+        lockChange = false;
+      }
       for (int i = 0; i < columnHeaderTableLayoutPanel.ColumnCount; i++) {
-        columnHeaderTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
-        bodyTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
-      }
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[i])) {
+          columnHeaderTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
+          bodyTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
+        }
+      }
+      oldWidth = GetColumnWidth();
+      oldHeight = GetRowHeight();
       frameTableLayoutPanel.ResumeRepaint(true);
     }
-    private void heightTrackBar_ValueChanged(object sender, EventArgs e) {
+    private void heightNumericUpDown_ValueChanged(object sender, EventArgs e) {
       frameTableLayoutPanel.SuspendRepaint();
-
+      if (lockAspectCheckBox.Checked && !lockChange) {
+        lockChange = true;
+        widthNumericUpDown.Value = (int)((double)heightNumericUpDown.Value * AspectRatio);
+        lockChange = false;
+      }
       for (int i = 0; i < rowHeaderTableLayoutPanel.RowCount; i++) {
-        rowHeaderTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
-        bodyTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
-      }
+        if (Content.VariableItemList.ItemChecked(Content.VariableItemList[i])) {
+          rowHeaderTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
+          bodyTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
+        }
+      }
+      oldWidth = GetColumnWidth();
+      oldHeight = GetRowHeight();
       frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    private void pointSizeNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      int pointSize = (int)pointSizeNumericUpDown.Value;
+      foreach (var control in bodyCache.ToList()) {
+        var scatterPlotView = control.Value as ScatterPlotView;
+        if (scatterPlotView != null) {
+          foreach (var row in scatterPlotView.Content.Rows) {
+            row.VisualProperties.PointSize = pointSize;
+          }
+        }
+      }
+    }
+    private void pointOpacityNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      float opacity = (float)pointOpacityNumericUpDown.Value;
+      foreach (var control in bodyCache.ToList()) {
+        var scatterPlotView = control.Value as ScatterPlotView;
+        if (scatterPlotView != null) {
+          foreach (var row in scatterPlotView.Content.Rows) {
+            var color = row.VisualProperties.Color;
+            if (color.IsEmpty)
+              color = PreprocessingChartView.Colors.First();
+            row.VisualProperties.Color = Color.FromArgb((int)(opacity * 255), color);
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Regression Line
+    private void regressionTypeComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
+      UpdateRegressionLine();
+    }
+
+    private void polynomialRegressionOrderNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      UpdateRegressionLine();
+    }
+
+    private void UpdateRegressionLine() {
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+
+      foreach (var control in bodyCache.ToList()) {
+        // hidden chart => reset cache
+        if (!bodyTableLayoutPanel.Controls.Contains(control.Value)) {
+          bodyCache.Remove(control.Key);
+        }
+
+        var scatterPlotView = control.Value as ScatterPlotView;
+        if (scatterPlotView != null) {
+          foreach (var row in scatterPlotView.Content.Rows) {
+            row.VisualProperties.IsRegressionVisibleInLegend = false;
+            row.VisualProperties.RegressionType = regressionType;
+            row.VisualProperties.PolynomialRegressionOrder = order;
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Grouping
+    private void groupingComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      aggregationLabel.Enabled = groupingComboBox.SelectedIndex > 0;
+      aggregationComboBox.Enabled = groupingComboBox.SelectedIndex > 0;
+      legendGroupBox.Enabled = groupingComboBox.SelectedIndex > 0;
+      GenerateCharts(true); // new series within charts -> clear cache
+    }
+
+    private void aggregationComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      var aggregation = (AggregationType)aggregationComboBox.SelectedValue;
+      foreach (var control in bodyCache.ToList()) {
+        // hidden chart => reset cache
+        if (!bodyTableLayoutPanel.Controls.Contains(control.Value)) {
+          bodyCache.Remove(control.Key);
+        }
+
+        var histogramView = control.Value as DataTableView;
+        if (histogramView != null) {
+          histogramView.Content.VisualProperties.HistogramAggregation = aggregation;
+        }
+      }
+    }
+
+    private void legendCheckbox_CheckedChanged(object sender, EventArgs e) {
+      foreach (var control in bodyCache.ToList()) {
+        var histogramControl = control.Value as DataTableView;
+        if (histogramControl != null) {
+          foreach (var row in histogramControl.Content.Rows) {
+            row.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+          }
+        }
+        var scatterplotControl = control.Value as ScatterPlotView;
+        if (scatterplotControl != null) {
+          foreach (var row in scatterplotControl.Content.Rows) {
+            row.VisualProperties.IsVisibleInLegend = legendCheckbox.Checked && groupingComboBox.SelectedIndex > 0;
+          }
+        }
+      }
+    }
+
+    private void legendOrderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      GenerateCharts(true);
     }
     #endregion
   }
 }
+
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs	(revision 15242)
@@ -45,102 +45,302 @@
     /// </summary>
     private void InitializeComponent() {
-      this.scatterPlotView = new HeuristicLab.DataPreprocessing.Views.PreprocessingScatterPlotView();
-      this.groupBox1 = new System.Windows.Forms.GroupBox();
-      this.label2 = new System.Windows.Forms.Label();
-      this.label1 = new System.Windows.Forms.Label();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScatterPlotSingleView));
+      this.scatterPlotView = new HeuristicLab.Analysis.Views.ScatterPlotView();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.orderComboBox = new System.Windows.Forms.ComboBox();
+      this.legendOrderLabel = new System.Windows.Forms.Label();
+      this.useGradientCheckBox = new System.Windows.Forms.CheckBox();
+      this.groupLabel = new System.Windows.Forms.Label();
+      this.yLabel = new System.Windows.Forms.Label();
+      this.xLabel = new System.Windows.Forms.Label();
+      this.comboBoxGroup = new System.Windows.Forms.ComboBox();
       this.comboBoxYVariable = new System.Windows.Forms.ComboBox();
       this.comboBoxXVariable = new System.Windows.Forms.ComboBox();
-      this.label3 = new System.Windows.Forms.Label();
-      this.comboBoxColor = new System.Windows.Forms.ComboBox();
-      this.groupBox1.SuspendLayout();
+      this.regressionGroupBox = new System.Windows.Forms.GroupBox();
+      this.regressionTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.polynomialRegressionOrderNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.regressionTypeLabel = new System.Windows.Forms.Label();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.gradientPanel = new System.Windows.Forms.Panel();
+      this.gradientPictureBox = new System.Windows.Forms.PictureBox();
+      this.gradientMinimumLabel = new System.Windows.Forms.Label();
+      this.gradientMaximumLabel = new System.Windows.Forms.Label();
+      this.variablesGroupBox.SuspendLayout();
+      this.regressionGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.gradientPanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.gradientPictureBox)).BeginInit();
       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.Caption = "View";
       this.scatterPlotView.Content = null;
-      this.scatterPlotView.Location = new System.Drawing.Point(169, 3);
+      this.scatterPlotView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scatterPlotView.Location = new System.Drawing.Point(0, 0);
       this.scatterPlotView.Name = "scatterPlotView";
       this.scatterPlotView.ReadOnly = false;
-      this.scatterPlotView.Size = new System.Drawing.Size(689, 509);
+      this.scatterPlotView.ShowName = false;
+      this.scatterPlotView.Size = new System.Drawing.Size(618, 517);
       this.scatterPlotView.TabIndex = 0;
       // 
-      // groupBox1
-      // 
-      this.groupBox1.Controls.Add(this.label3);
-      this.groupBox1.Controls.Add(this.label2);
-      this.groupBox1.Controls.Add(this.label1);
-      this.groupBox1.Controls.Add(this.comboBoxColor);
-      this.groupBox1.Controls.Add(this.comboBoxYVariable);
-      this.groupBox1.Controls.Add(this.comboBoxXVariable);
-      this.groupBox1.Location = new System.Drawing.Point(3, 3);
-      this.groupBox1.Name = "groupBox1";
-      this.groupBox1.Size = new System.Drawing.Size(160, 215);
-      this.groupBox1.TabIndex = 1;
-      this.groupBox1.TabStop = false;
-      this.groupBox1.Text = "Options";
-      // 
-      // label2
-      // 
-      this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(17, 80);
-      this.label2.Name = "label2";
-      this.label2.Size = new System.Drawing.Size(55, 13);
-      this.label2.TabIndex = 3;
-      this.label2.Text = "Y Variable";
-      // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(17, 25);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(55, 13);
-      this.label1.TabIndex = 2;
-      this.label1.Text = "X Variable";
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.orderComboBox);
+      this.variablesGroupBox.Controls.Add(this.legendOrderLabel);
+      this.variablesGroupBox.Controls.Add(this.useGradientCheckBox);
+      this.variablesGroupBox.Controls.Add(this.groupLabel);
+      this.variablesGroupBox.Controls.Add(this.yLabel);
+      this.variablesGroupBox.Controls.Add(this.xLabel);
+      this.variablesGroupBox.Controls.Add(this.comboBoxGroup);
+      this.variablesGroupBox.Controls.Add(this.comboBoxYVariable);
+      this.variablesGroupBox.Controls.Add(this.comboBoxXVariable);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Top;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(172, 178);
+      this.variablesGroupBox.TabIndex = 1;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "Variables";
+      // 
+      // orderComboBox
+      // 
+      this.orderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.orderComboBox.FormattingEnabled = true;
+      this.orderComboBox.Location = new System.Drawing.Point(51, 144);
+      this.orderComboBox.Name = "orderComboBox";
+      this.orderComboBox.Size = new System.Drawing.Size(115, 21);
+      this.orderComboBox.TabIndex = 6;
+      this.orderComboBox.SelectedIndexChanged += new System.EventHandler(this.orderComboBox_SelectedIndexChanged);
+      // 
+      // legendOrderLabel
+      // 
+      this.legendOrderLabel.AutoSize = true;
+      this.legendOrderLabel.Location = new System.Drawing.Point(6, 149);
+      this.legendOrderLabel.Name = "legendOrderLabel";
+      this.legendOrderLabel.Size = new System.Drawing.Size(36, 13);
+      this.legendOrderLabel.TabIndex = 5;
+      this.legendOrderLabel.Text = "Order:";
+      this.legendOrderLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // useGradientCheckBox
+      // 
+      this.useGradientCheckBox.AutoSize = true;
+      this.useGradientCheckBox.Location = new System.Drawing.Point(51, 121);
+      this.useGradientCheckBox.Name = "useGradientCheckBox";
+      this.useGradientCheckBox.Size = new System.Drawing.Size(115, 17);
+      this.useGradientCheckBox.TabIndex = 4;
+      this.useGradientCheckBox.Text = "Use Color Gradient";
+      this.useGradientCheckBox.UseVisualStyleBackColor = true;
+      this.useGradientCheckBox.CheckedChanged += new System.EventHandler(this.useGradientCheckBox_CheckedChanged);
+      // 
+      // groupLabel
+      // 
+      this.groupLabel.AutoSize = true;
+      this.groupLabel.Location = new System.Drawing.Point(6, 97);
+      this.groupLabel.Name = "groupLabel";
+      this.groupLabel.Size = new System.Drawing.Size(39, 13);
+      this.groupLabel.TabIndex = 3;
+      this.groupLabel.Text = "Group:";
+      // 
+      // yLabel
+      // 
+      this.yLabel.AutoSize = true;
+      this.yLabel.Location = new System.Drawing.Point(6, 63);
+      this.yLabel.Name = "yLabel";
+      this.yLabel.Size = new System.Drawing.Size(17, 13);
+      this.yLabel.TabIndex = 3;
+      this.yLabel.Text = "Y:";
+      // 
+      // xLabel
+      // 
+      this.xLabel.AutoSize = true;
+      this.xLabel.Location = new System.Drawing.Point(6, 29);
+      this.xLabel.Name = "xLabel";
+      this.xLabel.Size = new System.Drawing.Size(17, 13);
+      this.xLabel.TabIndex = 2;
+      this.xLabel.Text = "X:";
+      // 
+      // comboBoxGroup
+      // 
+      this.comboBoxGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.comboBoxGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.comboBoxGroup.FormattingEnabled = true;
+      this.comboBoxGroup.Location = new System.Drawing.Point(51, 94);
+      this.comboBoxGroup.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
+      this.comboBoxGroup.Name = "comboBoxGroup";
+      this.comboBoxGroup.Size = new System.Drawing.Size(115, 21);
+      this.comboBoxGroup.TabIndex = 1;
+      this.comboBoxGroup.SelectedIndexChanged += new System.EventHandler(this.comboBoxGroup_SelectedIndexChanged);
       // 
       // comboBoxYVariable
       // 
+      this.comboBoxYVariable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.comboBoxYVariable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.comboBoxYVariable.FormattingEnabled = true;
-      this.comboBoxYVariable.Location = new System.Drawing.Point(20, 103);
+      this.comboBoxYVariable.Location = new System.Drawing.Point(51, 60);
       this.comboBoxYVariable.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
       this.comboBoxYVariable.Name = "comboBoxYVariable";
-      this.comboBoxYVariable.Size = new System.Drawing.Size(121, 21);
+      this.comboBoxYVariable.Size = new System.Drawing.Size(115, 21);
       this.comboBoxYVariable.TabIndex = 1;
-      this.comboBoxYVariable.SelectedIndexChanged += new System.EventHandler(this.comboBox_SelectedIndexChanged);
+      this.comboBoxYVariable.SelectedIndexChanged += new System.EventHandler(this.comboBoxYVariable_SelectedIndexChanged);
       // 
       // comboBoxXVariable
       // 
+      this.comboBoxXVariable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.comboBoxXVariable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.comboBoxXVariable.FormattingEnabled = true;
-      this.comboBoxXVariable.Location = new System.Drawing.Point(20, 48);
+      this.comboBoxXVariable.Location = new System.Drawing.Point(51, 26);
       this.comboBoxXVariable.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
       this.comboBoxXVariable.Name = "comboBoxXVariable";
-      this.comboBoxXVariable.Size = new System.Drawing.Size(121, 21);
+      this.comboBoxXVariable.Size = new System.Drawing.Size(115, 21);
       this.comboBoxXVariable.TabIndex = 0;
-      this.comboBoxXVariable.SelectedIndexChanged += new System.EventHandler(this.comboBox_SelectedIndexChanged);
-      // 
-      // label3
-      // 
-      this.label3.AutoSize = true;
-      this.label3.Location = new System.Drawing.Point(17, 141);
-      this.label3.Name = "label3";
-      this.label3.Size = new System.Drawing.Size(31, 13);
-      this.label3.TabIndex = 3;
-      this.label3.Text = "Color";
-      // 
-      // comboBoxColor
-      // 
-      this.comboBoxColor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.comboBoxColor.FormattingEnabled = true;
-      this.comboBoxColor.Location = new System.Drawing.Point(20, 164);
-      this.comboBoxColor.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
-      this.comboBoxColor.Name = "comboBoxColor";
-      this.comboBoxColor.Size = new System.Drawing.Size(121, 21);
-      this.comboBoxColor.TabIndex = 1;
-      this.comboBoxColor.SelectedIndexChanged += new System.EventHandler(this.comboBox_SelectedIndexChanged);
+      this.comboBoxXVariable.SelectedIndexChanged += new System.EventHandler(this.comboBoxXVariable_SelectedIndexChanged);
+      // 
+      // regressionGroupBox
+      // 
+      this.regressionGroupBox.Controls.Add(this.regressionTypeComboBox);
+      this.regressionGroupBox.Controls.Add(this.polynomialRegressionOrderNumericUpDown);
+      this.regressionGroupBox.Controls.Add(this.orderLabel);
+      this.regressionGroupBox.Controls.Add(this.regressionTypeLabel);
+      this.regressionGroupBox.Dock = System.Windows.Forms.DockStyle.Top;
+      this.regressionGroupBox.Location = new System.Drawing.Point(0, 178);
+      this.regressionGroupBox.Name = "regressionGroupBox";
+      this.regressionGroupBox.Size = new System.Drawing.Size(172, 78);
+      this.regressionGroupBox.TabIndex = 4;
+      this.regressionGroupBox.TabStop = false;
+      this.regressionGroupBox.Text = "Regression";
+      // 
+      // regressionTypeComboBox
+      // 
+      this.regressionTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.regressionTypeComboBox.FormattingEnabled = true;
+      this.regressionTypeComboBox.Location = new System.Drawing.Point(51, 19);
+      this.regressionTypeComboBox.Name = "regressionTypeComboBox";
+      this.regressionTypeComboBox.Size = new System.Drawing.Size(115, 21);
+      this.regressionTypeComboBox.TabIndex = 14;
+      this.regressionTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.regressionTypeComboBox_SelectedIndexChanged);
+      // 
+      // polynomialRegressionOrderNumericUpDown
+      // 
+      this.polynomialRegressionOrderNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.polynomialRegressionOrderNumericUpDown.Location = new System.Drawing.Point(51, 47);
+      this.polynomialRegressionOrderNumericUpDown.Margin = new System.Windows.Forms.Padding(9, 3, 3, 3);
+      this.polynomialRegressionOrderNumericUpDown.Maximum = new decimal(new int[] {
+            6,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Minimum = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Name = "polynomialRegressionOrderNumericUpDown";
+      this.polynomialRegressionOrderNumericUpDown.Size = new System.Drawing.Size(115, 20);
+      this.polynomialRegressionOrderNumericUpDown.TabIndex = 15;
+      this.polynomialRegressionOrderNumericUpDown.Value = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.ValueChanged += new System.EventHandler(this.polynomialRegressionOrderNumericUpDown_ValueChanged);
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Location = new System.Drawing.Point(6, 49);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(36, 13);
+      this.orderLabel.TabIndex = 16;
+      this.orderLabel.Text = "Order:";
+      // 
+      // regressionTypeLabel
+      // 
+      this.regressionTypeLabel.AutoSize = true;
+      this.regressionTypeLabel.Location = new System.Drawing.Point(6, 22);
+      this.regressionTypeLabel.Name = "regressionTypeLabel";
+      this.regressionTypeLabel.Size = new System.Drawing.Size(34, 13);
+      this.regressionTypeLabel.TabIndex = 13;
+      this.regressionTypeLabel.Text = "Type:";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.regressionGroupBox);
+      this.splitContainer.Panel1.Controls.Add(this.variablesGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.scatterPlotView);
+      this.splitContainer.Panel2.Controls.Add(this.gradientPanel);
+      this.splitContainer.Size = new System.Drawing.Size(863, 517);
+      this.splitContainer.SplitterDistance = 172;
+      this.splitContainer.TabIndex = 5;
+      // 
+      // gradientPanel
+      // 
+      this.gradientPanel.Controls.Add(this.gradientPictureBox);
+      this.gradientPanel.Controls.Add(this.gradientMinimumLabel);
+      this.gradientPanel.Controls.Add(this.gradientMaximumLabel);
+      this.gradientPanel.Dock = System.Windows.Forms.DockStyle.Right;
+      this.gradientPanel.Location = new System.Drawing.Point(618, 0);
+      this.gradientPanel.Name = "gradientPanel";
+      this.gradientPanel.Size = new System.Drawing.Size(69, 517);
+      this.gradientPanel.TabIndex = 1;
+      this.gradientPanel.Visible = false;
+      // 
+      // gradientPictureBox
+      // 
+      this.gradientPictureBox.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.gradientPictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.gradientPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("gradientPictureBox.Image")));
+      this.gradientPictureBox.Location = new System.Drawing.Point(17, 29);
+      this.gradientPictureBox.Name = "gradientPictureBox";
+      this.gradientPictureBox.Size = new System.Drawing.Size(35, 460);
+      this.gradientPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+      this.gradientPictureBox.TabIndex = 19;
+      this.gradientPictureBox.TabStop = false;
+      // 
+      // gradientMinimumLabel
+      // 
+      this.gradientMinimumLabel.BackColor = System.Drawing.Color.Transparent;
+      this.gradientMinimumLabel.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.gradientMinimumLabel.Location = new System.Drawing.Point(0, 492);
+      this.gradientMinimumLabel.Name = "gradientMinimumLabel";
+      this.gradientMinimumLabel.Size = new System.Drawing.Size(69, 25);
+      this.gradientMinimumLabel.TabIndex = 18;
+      this.gradientMinimumLabel.Text = "0.0";
+      this.gradientMinimumLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+      // 
+      // gradientMaximumLabel
+      // 
+      this.gradientMaximumLabel.BackColor = System.Drawing.Color.Transparent;
+      this.gradientMaximumLabel.Dock = System.Windows.Forms.DockStyle.Top;
+      this.gradientMaximumLabel.Location = new System.Drawing.Point(0, 0);
+      this.gradientMaximumLabel.Name = "gradientMaximumLabel";
+      this.gradientMaximumLabel.Size = new System.Drawing.Size(69, 25);
+      this.gradientMaximumLabel.TabIndex = 17;
+      this.gradientMaximumLabel.Text = "1.0";
+      this.gradientMaximumLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
       // 
       // ScatterPlotSingleView
@@ -148,10 +348,18 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.groupBox1);
-      this.Controls.Add(this.scatterPlotView);
+      this.Controls.Add(this.splitContainer);
       this.Name = "ScatterPlotSingleView";
       this.Size = new System.Drawing.Size(863, 517);
-      this.groupBox1.ResumeLayout(false);
-      this.groupBox1.PerformLayout();
+      this.variablesGroupBox.ResumeLayout(false);
+      this.variablesGroupBox.PerformLayout();
+      this.regressionGroupBox.ResumeLayout(false);
+      this.regressionGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.gradientPanel.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.gradientPictureBox)).EndInit();
       this.ResumeLayout(false);
 
@@ -160,12 +368,25 @@
     #endregion
 
-    private HeuristicLab.DataPreprocessing.Views.PreprocessingScatterPlotView scatterPlotView;
-    private System.Windows.Forms.GroupBox groupBox1;
-    private System.Windows.Forms.Label label2;
-    private System.Windows.Forms.Label label1;
+    private HeuristicLab.Analysis.Views.ScatterPlotView scatterPlotView;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.Label yLabel;
+    private System.Windows.Forms.Label xLabel;
     private System.Windows.Forms.ComboBox comboBoxYVariable;
     private System.Windows.Forms.ComboBox comboBoxXVariable;
-    private System.Windows.Forms.ComboBox comboBoxColor;
-    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.ComboBox comboBoxGroup;
+    private System.Windows.Forms.Label groupLabel;
+    private System.Windows.Forms.GroupBox regressionGroupBox;
+    private System.Windows.Forms.ComboBox regressionTypeComboBox;
+    private System.Windows.Forms.NumericUpDown polynomialRegressionOrderNumericUpDown;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.Label regressionTypeLabel;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.CheckBox useGradientCheckBox;
+    private System.Windows.Forms.Panel gradientPanel;
+    private System.Windows.Forms.Label gradientMinimumLabel;
+    private System.Windows.Forms.Label gradientMaximumLabel;
+    private System.Windows.Forms.PictureBox gradientPictureBox;
+    private System.Windows.Forms.Label legendOrderLabel;
+    private System.Windows.Forms.ComboBox orderComboBox;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs	(revision 15242)
@@ -22,17 +22,21 @@
 using System;
 using System.Collections.Generic;
+using System.Drawing;
 using System.Linq;
 using HeuristicLab.Analysis;
+using HeuristicLab.Common;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
+using RegressionType = HeuristicLab.Analysis.ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType;
 
 namespace HeuristicLab.DataPreprocessing.Views {
 
   [View("Scatter Plot Single View")]
-  [Content(typeof(ScatterPlotContent), true)]
-  public partial class ScatterPlotSingleView : ItemView {
-
-    public new ScatterPlotContent Content {
-      get { return (ScatterPlotContent)base.Content; }
+  [Content(typeof(SingleScatterPlotContent), true)]
+  public sealed partial class ScatterPlotSingleView : ItemView {
+    private readonly string NoGroupItem = "";
+
+    public new SingleScatterPlotContent Content {
+      get { return (SingleScatterPlotContent)base.Content; }
       set { base.Content = value; }
     }
@@ -40,34 +44,49 @@
     public ScatterPlotSingleView() {
       InitializeComponent();
-    }
-
-    public void InitData() {
+
+      regressionTypeComboBox.DataSource = Enum.GetValues(typeof(RegressionType));
+      regressionTypeComboBox.SelectedItem = RegressionType.None;
+      orderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
+      orderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      useGradientCheckBox.Enabled = (string)comboBoxGroup.SelectedItem != NoGroupItem;
+      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked; ;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        InitData();
+      }
+    }
+
+    private void InitData() {
       IEnumerable<string> variables = Content.PreprocessingData.GetDoubleVariableNames();
 
-      // add variables to combo boxes
       comboBoxXVariable.Items.Clear();
       comboBoxYVariable.Items.Clear();
-      comboBoxColor.Items.Clear();
+      comboBoxGroup.Items.Clear();
+
       comboBoxXVariable.Items.AddRange(variables.ToArray());
       comboBoxYVariable.Items.AddRange(variables.ToArray());
-      comboBoxColor.Items.Add("-");
-      for (int i = 0; i < Content.PreprocessingData.Columns; ++i) {
-        if (Content.PreprocessingData.VariableHasType<double>(i)) {
-          double distinctValueCount = Content.PreprocessingData.GetValues<double>(i).GroupBy(x => x).Count();
-          if (distinctValueCount <= 20)
-            comboBoxColor.Items.Add(Content.PreprocessingData.GetVariableName(i));
-        }
-      }
+      comboBoxGroup.Items.Add(NoGroupItem);
+      foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData, 50)) {
+        comboBoxGroup.Items.Add(var);
+      }
+      comboBoxGroup.SelectedItem = Content.GroupingVariable ?? NoGroupItem;
 
       // use x and y variable from content
-      if (Content.SelectedXVariable != null && Content.SelectedYVariable != null && Content.SelectedColorVariable != null) {
+      if (Content.SelectedXVariable != null && Content.SelectedYVariable != null && Content.GroupingVariable != null) {
         comboBoxXVariable.SelectedItem = Content.SelectedXVariable;
         comboBoxYVariable.SelectedItem = Content.SelectedYVariable;
-        comboBoxColor.SelectedItem = Content.SelectedColorVariable;
+        comboBoxGroup.SelectedItem = Content.GroupingVariable;
       } else {
         if (variables.Count() >= 2) {
           comboBoxXVariable.SelectedIndex = 0;
           comboBoxYVariable.SelectedIndex = 1;
-          comboBoxColor.SelectedIndex = 0;
+          comboBoxGroup.SelectedIndex = 0;
           UpdateScatterPlot();
         }
@@ -75,22 +94,30 @@
     }
 
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content != null) {
-        InitData();
-      }
-    }
-
-    private void comboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      UpdateScatterPlot();
-    }
-
     private void UpdateScatterPlot() {
-      if (comboBoxXVariable.SelectedItem != null && comboBoxYVariable.SelectedItem != null && comboBoxColor.SelectedItem != null) {
-        //get scatter plot with selected x and y variable
-        ScatterPlot scatterPlot = Content.CreateScatterPlot(
-          (string)comboBoxXVariable.SelectedItem,
-          (string)comboBoxYVariable.SelectedItem,
-          (string)comboBoxColor.SelectedItem);
+      if (comboBoxXVariable.SelectedItem != null && comboBoxYVariable.SelectedItem != null && comboBoxGroup.SelectedItem != null) {
+        var xVariable = (string)comboBoxXVariable.SelectedItem;
+        var yVariable = (string)comboBoxYVariable.SelectedItem;
+        var groupVariable = (string)comboBoxGroup.SelectedItem;
+        var legendOrder = (PreprocessingChartContent.LegendOrder)orderComboBox.SelectedItem;
+
+        ScatterPlot scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData, xVariable, yVariable, groupVariable, legendOrder);
+        //rows are saved and removed to avoid firing of visual property changed events
+        var rows = scatterPlot.Rows.ToList();
+        scatterPlot.Rows.Clear();
+        var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+        int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+        foreach (var row in rows) {
+          row.VisualProperties.PointSize = 6;
+          row.VisualProperties.IsRegressionVisibleInLegend = false;
+          row.VisualProperties.RegressionType = regressionType;
+          row.VisualProperties.PolynomialRegressionOrder = order;
+          row.VisualProperties.IsVisibleInLegend = !useGradientCheckBox.Checked;
+        }
+        scatterPlot.Rows.AddRange(rows);
+        var vp = scatterPlot.VisualProperties;
+        vp.Title = string.Empty;
+        vp.XAxisTitle = xVariable;
+        vp.YAxisTitle = yVariable;
+
         scatterPlotView.Content = scatterPlot;
 
@@ -98,7 +125,125 @@
         this.Content.SelectedXVariable = (string)comboBoxXVariable.SelectedItem;
         this.Content.SelectedYVariable = (string)comboBoxYVariable.SelectedItem;
-        this.Content.SelectedColorVariable = (string)comboBoxColor.SelectedItem;
-      }
+        this.Content.GroupingVariable = (string)comboBoxGroup.SelectedItem;
+      }
+    }
+
+    private void comboBoxXVariable_SelectedIndexChanged(object sender, EventArgs e) {
+      var oldPlot = scatterPlotView.Content;
+      UpdateScatterPlot();
+      var newPlot = scatterPlotView.Content;
+
+      if (oldPlot == null || newPlot == null) return;
+      newPlot.VisualProperties.YAxisMinimumAuto = oldPlot.VisualProperties.YAxisMinimumAuto;
+      newPlot.VisualProperties.YAxisMaximumAuto = oldPlot.VisualProperties.YAxisMaximumAuto;
+      newPlot.VisualProperties.YAxisMinimumFixedValue = oldPlot.VisualProperties.YAxisMinimumFixedValue;
+      newPlot.VisualProperties.YAxisMaximumFixedValue = oldPlot.VisualProperties.YAxisMaximumFixedValue;
+
+      foreach (var x in newPlot.Rows.Zip(oldPlot.Rows, (nr, or) => new { nr, or })) {
+        var newVisuapProperties = (ScatterPlotDataRowVisualProperties)x.or.VisualProperties.Clone();
+        newVisuapProperties.DisplayName = x.nr.VisualProperties.DisplayName;
+        x.nr.VisualProperties = newVisuapProperties;
+      }
+    }
+
+    private void comboBoxYVariable_SelectedIndexChanged(object sender, EventArgs e) {
+      SuspendRepaint();
+      var oldPlot = scatterPlotView.Content;
+      UpdateScatterPlot();
+      var newPlot = scatterPlotView.Content;
+
+      if (oldPlot == null || newPlot == null) return;
+      newPlot.VisualProperties.XAxisMinimumAuto = oldPlot.VisualProperties.XAxisMinimumAuto;
+      newPlot.VisualProperties.XAxisMaximumAuto = oldPlot.VisualProperties.XAxisMaximumAuto;
+      newPlot.VisualProperties.XAxisMinimumFixedValue = oldPlot.VisualProperties.XAxisMinimumFixedValue;
+      newPlot.VisualProperties.XAxisMaximumFixedValue = oldPlot.VisualProperties.XAxisMaximumFixedValue;
+
+      foreach (var x in newPlot.Rows.Zip(oldPlot.Rows, (nr, or) => new { nr, or })) {
+        var newVisuapProperties = (ScatterPlotDataRowVisualProperties)x.or.VisualProperties.Clone();
+        newVisuapProperties.DisplayName = x.nr.VisualProperties.DisplayName;
+        x.nr.VisualProperties = newVisuapProperties;
+      }
+      ResumeRepaint(true);
+    }
+
+    private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e) {
+      useGradientCheckBox.Enabled = (string)comboBoxGroup.SelectedItem != NoGroupItem && Content.PreprocessingData.GetDoubleVariableNames().Contains((string)comboBoxGroup.SelectedItem);
+      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked;
+      UpdateScatterPlot();
+    }
+
+    #region Regression Line
+    private void regressionTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
+
+      UpdateRegressionLine();
+    }
+
+    private void polynomialRegressionOrderNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      UpdateRegressionLine();
+    }
+
+    private void UpdateRegressionLine() {
+      if (Content == null) return;
+
+      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
+      int order = (int)polynomialRegressionOrderNumericUpDown.Value;
+
+      foreach (var row in scatterPlotView.Content.Rows) {
+        row.VisualProperties.IsRegressionVisibleInLegend = false;
+        row.VisualProperties.RegressionType = regressionType;
+        row.VisualProperties.PolynomialRegressionOrder = order;
+      }
+    }
+    #endregion
+
+    private void useGradientCheckBox_CheckedChanged(object sender, EventArgs e) {
+      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked;
+
+      // remove rows and re-add them later to avoid firing visual property changd events
+      var rows = scatterPlotView.Content.Rows.ToDictionary(r => r.Name, r => r);
+      scatterPlotView.Content.Rows.Clear();
+
+      if (useGradientCheckBox.Checked) {
+        var groupVariable = (string)comboBoxGroup.SelectedItem;
+        if (groupVariable == NoGroupItem) return;
+
+        var groupValues = Content.PreprocessingData.GetValues<double>(Content.PreprocessingData.GetColumnIndex(groupVariable))
+          .Distinct().OrderBy(x => x).ToList();
+        double min = groupValues.FirstOrDefault(x => !double.IsNaN(x)), max = groupValues.LastOrDefault(x => !double.IsNaN(x));
+        foreach (var group in groupValues) {
+          ScatterPlotDataRow row;
+          if (rows.TryGetValue(group.ToString("R"), out row)) {
+            row.VisualProperties.Color = GetColor(group, min, max);
+            row.VisualProperties.IsVisibleInLegend = false;
+          }
+        }
+        gradientMinimumLabel.Text = min.ToString("G5");
+        gradientMaximumLabel.Text = max.ToString("G5");
+      } else {
+        foreach (var row in rows.Values) {
+          row.VisualProperties.Color = Color.Empty;
+          row.VisualProperties.IsVisibleInLegend = true;
+        }
+      }
+      scatterPlotView.Content.Rows.AddRange(rows.Values);
+    }
+
+    private static Color GetColor(double value, double min, double max) {
+      if (double.IsNaN(value)) {
+        return Color.Black;
+      }
+      var colors = ColorGradient.Colors;
+      int index = (int)((colors.Count - 1) * (value - min) / (max - min));
+      if (index >= colors.Count) index = colors.Count - 1;
+      if (index < 0) index = 0;
+      return colors[index];
+    }
+
+    private void orderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateScatterPlot();
     }
   }
 }
+
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.resx
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.resx	(revision 15242)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.resx	(revision 15242)
@@ -0,0 +1,1022 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="gradientPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        Qk0S0gAAAAAAADYAAAAoAAAAMQAAAGsBAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe/wAe
+        /wAe/wAe/wAe/wAe/wAe/wAe/wAeAP8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8A
+        G/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8A
+        G/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AG/8AGwD/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/ABj/
+        ABj/ABj/ABj/ABj/ABj/ABgA/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV
+        /wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV
+        /wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAV/wAVAP8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8AEv8A
+        Ev8AEv8AEv8AEv8AEgD/AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//
+        AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//
+        AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA//AA8A/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM/wAM
+        /wAM/wAM/wAMAP8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8A
+        Cf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8A
+        Cf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACf8ACQD/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/AAb/
+        AAb/AAYA/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAGAP8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        AwD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMAAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAAD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQAA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwAAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAAD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgAA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUAAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAAD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwAA/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4AAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAAA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycAAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8qAP8q
+        AAD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/
+        LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/
+        LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQD/LQAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA
+        /zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA
+        /zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAA/zAAAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8z
+        AP8zAP8zAP8zAP8zAP8zAP8zAP8zAP8zAAD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/
+        NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/
+        NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgD/NgAA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA/zkA
+        /zkA/zkA/zkA/zkA/zkA/zkA/zkAAP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88
+        AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88
+        AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AP88AAD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/PwD/
+        PwD/PwD/PwD/PwD/PwD/PwAA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA
+        /0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA
+        /0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IA/0IAAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9FAP9F
+        AP9FAP9FAP9FAP9FAAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/
+        SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/
+        SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAD/SAAA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA/0sA
+        /0sA/0sA/0sAAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAAD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgAA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EAAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AAD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwAA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oAAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAAA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MAAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAAD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQAA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wAAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAAD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgAA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UAAP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94
+        AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94
+        AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AP94AAD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/ewD/
+        ewD/ewAA/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A
+        /34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34A
+        /34A/34A/34A/34A/34A/34A/34A/34A/34A/34A/34AAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+BAP+B
+        AAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/
+        hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/
+        hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAD/hAAA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA
+        /4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA
+        /4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cA/4cAAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+K
+        AP+KAP+KAP+KAP+KAP+KAP+KAP+KAP+KAAD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/
+        jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/
+        jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQD/jQAA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA/5AA
+        /5AA/5AA/5AA/5AA/5AA/5AA/5AAAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+T
+        AP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+T
+        AP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAP+TAAD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/lgD/
+        lgD/lgD/lgD/lgD/lgD/lgAA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA
+        /5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA
+        /5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kA/5kAAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAAA/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58AAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAAD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQAA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gAAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AAD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgAA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EAAP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AAD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twAA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oAAP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAAA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MAAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/GAP/G
+        AP/GAP/GAP/GAP/GAAD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/
+        yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/
+        yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQD/yQAA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA/8wA
+        /8wA/8wA/8wAAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/P
+        AP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/P
+        AP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAP/PAAD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/0gD/
+        0gD/0gAA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA
+        /9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA
+        /9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UA/9UAAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/YAP/Y
+        AAD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/
+        2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/
+        2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wD/2wAA/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A
+        /94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A
+        /94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94A/94AAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/h
+        AP/hAP/hAP/hAP/hAP/hAP/hAP/hAP/hAAD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/
+        5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/
+        5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AD/5AAA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA/+cA
+        /+cA/+cA/+cA/+cA/+cA/+cA/+cAAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAAD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gAA/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0AAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAAD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wAA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YAAP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AAD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AAA//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8AAPz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        AAD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wAA9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8AAPP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/AADw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wAA7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8AAOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AADn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn/wDn
+        /wDn/wDn/wDn/wDn/wDn/wAA5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A
+        5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A
+        5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8A5P8AAOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/AOH/
+        AOH/AOH/AOH/AOH/AADe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe
+        /wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe
+        /wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wDe/wAA2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A2/8A
+        2/8A2/8A2/8AANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/
+        ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/
+        ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/ANj/AADV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV/wDV
+        /wDV/wAA0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A
+        0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A
+        0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8A0v8AAM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//AM//
+        AADM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM
+        /wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM
+        /wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wDM/wAAyf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8A
+        yf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8A
+        yf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8Ayf8AAMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/
+        AMb/AMb/AMb/AMb/AMb/AMb/AMb/AMb/AADG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wAAw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8AAMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AAC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wAAuv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8AALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/AAC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wAAsf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8AAK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AACr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wAAqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AAKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AACi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wAAn/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8AAJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AACZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ
+        /wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ
+        /wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wCZ/wAAlv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8Alv8A
+        lv8Alv8Alv8Alv8Alv8Alv8Alv8AAJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/
+        AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/
+        AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AJP/AACQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ/wCQ
+        /wCQ/wCQ/wCQ/wCQ/wCQ/wAAjf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8A
+        jf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8A
+        jf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8Ajf8AAIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/AIr/
+        AIr/AIr/AIr/AIr/AACH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH
+        /wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH
+        /wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wCH/wAAhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8AhP8A
+        hP8AhP8AhP8AAIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/
+        AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/
+        AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AIH/AAB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+/wB+
+        /wB+/wAAe/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8A
+        e/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8A
+        e/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8Ae/8AAHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/AHj/
+        AAB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wAAdf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8AAHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AABv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wAAbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AAGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AABm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wAAY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AAGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AABd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wAAWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AAFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AABU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wAAUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AAE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AABL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL
+        /wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL
+        /wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wBL/wAASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8A
+        SP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8A
+        SP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8ASP8AAEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/
+        AEX/AEX/AEX/AEX/AEX/AEX/AEX/AEX/AABC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC
+        /wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC
+        /wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wBC/wAAP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8AP/8A
+        P/8AP/8AP/8AP/8AP/8AP/8AP/8AADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/
+        ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/
+        ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/ADz/AAA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5/wA5
+        /wA5/wA5/wA5/wA5/wA5/wAANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8A
+        Nv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8A
+        Nv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8ANv8AADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/ADP/
+        ADP/ADP/ADP/ADP/AAAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw
+        /wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw
+        /wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAw/wAALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8ALf8A
+        Lf8ALf8ALf8AACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/
+        ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/
+        ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/ACr/AAAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAAJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        AAAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAAHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/AAAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAAFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/AAAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8AAAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAAA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/
+        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA/wMA
+        /wMA/wMAAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8G
+        AP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAP8GAAD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/CQD/
+        CQAA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA
+        /wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwA/wwAAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8P
+        AP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAP8PAAD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/
+        EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgD/EgAA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA
+        /xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUA/xUAAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8YAP8Y
+        AP8YAP8YAP8YAP8YAP8YAP8YAP8YAAD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/
+        GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwD/GwAA/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A/x4A
+        /x4A/x4A/x4A/x4A/x4A/x4AAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8h
+        AP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAP8hAAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/JAD/
+        JAD/JAD/JAD/JAD/JAAA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA
+        /ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycA/ycAAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8nAP8n
+        AP8nAP8nAP8nAAD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/
+        KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/
+        KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgD/KgAA/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A/y0A
+        /y0A/y0AAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8w
+        AP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8w
+        AP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAP8wAAD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/MwD/
+        MwAA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA
+        /zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA
+        /zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYA/zYAAP85AP85AP85AP85AP85AP85AP85AP85AP85AP85
+        AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85
+        AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AP85AAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/
+        PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAD/PAAA/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A
+        /z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A
+        /z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8A/z8AAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9CAP9C
+        AP9CAP9CAP9CAP9CAP9CAP9CAP9CAAD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/
+        RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/
+        RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQD/RQAA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA/0gA
+        /0gA/0gA/0gA/0gA/0gA/0gAAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9L
+        AP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAP9LAAD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/TgD/
+        TgD/TgD/TgD/TgD/TgAA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA
+        /1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EA/1EAAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9UAP9U
+        AP9UAP9UAP9UAAD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/
+        VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwD/VwAA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA/1oA
+        /1oA/1oAAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9d
+        AP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAP9dAAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/YAD/
+        YAAA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA
+        /2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MA/2MAAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9m
+        AP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAP9mAAD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/
+        aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQD/aQAA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA
+        /2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wA/2wAAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9vAP9v
+        AP9vAP9vAP9vAP9vAP9vAP9vAP9vAAD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/
+        cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgD/cgAA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA/3UA
+        /3UA/3UA/3UA/3UA/3UA/3UAAP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91
+        AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91
+        AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AP91AAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/eAD/
+        eAD/eAD/eAD/eAD/eAAA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA
+        /3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA
+        /3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sA/3sAAP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+AP9+
+        AP9+AP9+AP9+AAD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/
+        gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/
+        gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQD/gQAA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA/4QA
+        /4QA/4QAAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+H
+        AP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+H
+        AP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAP+HAAD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/igD/
+        igAA/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A
+        /40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A/40A
+        /40A/40A/40A/40A/40A/40A/40A/40A/40A/40AAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+Q
+        AP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+Q
+        AP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAP+QAAD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/
+        kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwD/kwAA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA
+        /5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA
+        /5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YA/5YAAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+Z
+        AP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAP+ZAAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/
+        nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAD/nAAA/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A/58A
+        /58A/58A/58A/58A/58A/58AAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+i
+        AP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAP+iAAD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/pQD/
+        pQD/pQD/pQD/pQD/pQAA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA
+        /6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gA/6gAAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+rAP+r
+        AP+rAP+rAP+rAAD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/
+        rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgD/rgAA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA/7EA
+        /7EA/7EAAP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0
+        AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AP+0AAD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/twD/
+        twAA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA
+        /7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oA/7oAAP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9
+        AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AP+9AAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/
+        wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAD/wAAA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA
+        /8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MA/8MAAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/DAP/D
+        AP/DAP/DAP/DAP/DAP/DAP/DAP/DAAD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/
+        xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/
+        xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgD/xgAA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA/8kA
+        /8kA/8kA/8kA/8kA/8kA/8kAAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/M
+        AP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/M
+        AP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAP/MAAD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/zwD/
+        zwD/zwD/zwD/zwD/zwAA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA
+        /9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA
+        /9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IA/9IAAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/VAP/V
+        AP/VAP/VAP/VAAD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/
+        2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/
+        2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AD/2AAA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA/9sA
+        /9sA/9sAAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/e
+        AP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/e
+        AP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAP/eAAD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/4QD/
+        4QAA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA
+        /+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA
+        /+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QA/+QAAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/n
+        AP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAP/nAAD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/
+        6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gD/6gAA/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A
+        /+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0A/+0AAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/w
+        AP/wAP/wAP/wAP/wAP/wAP/wAP/wAAD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/
+        8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wD/8wAA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA//YA
+        //YA//YA//YA//YA//YA//YAAP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5
+        AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AP/5AAD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD/
+        /AD//AD//AD//AD//AAA//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A
+        //8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8A//8AAPz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/APz/
+        APz/APz/APz/AAD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5
+        /wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wD5/wAA9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A9v8A
+        9v8A9v8AAPP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/
+        APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/APP/AADw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw/wDw
+        /wAA7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A
+        7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8A7f8AAOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/
+        AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AOr/AADq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq
+        /wDq/wDq/wDq/wDq/wDq/wDq/wDq/wDq/wAA5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A
+        5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A
+        5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8A5/8AAOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/AOT/
+        AOT/AOT/AOT/AOT/AOT/AOT/AOT/AADh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh
+        /wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh
+        /wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wDh/wAA3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A3v8A
+        3v8A3v8A3v8A3v8A3v8A3v8AANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/
+        ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/
+        ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/ANv/AADY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY/wDY
+        /wDY/wDY/wDY/wDY/wAA1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A
+        1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A
+        1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8A1f8AANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/ANL/
+        ANL/ANL/ANL/AADP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP
+        /wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP
+        /wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wDP/wAAzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8AzP8A
+        zP8AzP8AAMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/
+        AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/
+        AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AMn/AADG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG/wDG
+        /wAAw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8A
+        w/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8Aw/8AAMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/
+        AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AMD/AAC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9
+        /wC9/wC9/wC9/wC9/wC9/wC9/wC9/wC9/wAAuv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8A
+        uv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8Auv8AALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/ALf/
+        ALf/ALf/ALf/ALf/ALf/ALf/ALf/AAC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0
+        /wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wC0/wAAsf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8Asf8A
+        sf8Asf8Asf8Asf8Asf8Asf8AAK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/
+        AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AK7/AACr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr/wCr
+        /wCr/wCr/wCr/wCr/wAAqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8A
+        qP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AqP8AAKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/AKX/
+        AKX/AKX/AKX/AACi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi
+        /wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wCi/wAAn/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8An/8A
+        n/8An/8AAJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/
+        AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AJz/AACc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc/wCc
+        /wAAmf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8A
+        mf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8A
+        mf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8Amf8AAJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/
+        AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/
+        AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AJb/AACT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT
+        /wCT/wCT/wCT/wCT/wCT/wCT/wCT/wCT/wAAkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8A
+        kP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8A
+        kP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AkP8AAI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/AI3/
+        AI3/AI3/AI3/AI3/AI3/AI3/AI3/AACK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK
+        /wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK
+        /wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wCK/wAAh/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8Ah/8A
+        h/8Ah/8Ah/8Ah/8Ah/8Ah/8AAIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/
+        AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/
+        AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AIT/AACB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB/wCB
+        /wCB/wCB/wCB/wCB/wAAfv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8A
+        fv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8A
+        fv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8Afv8AAHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/AHv/
+        AHv/AHv/AHv/AAB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4
+        /wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wB4/wAAdf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8Adf8A
+        df8Adf8AAHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/
+        AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AHL/AABv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv/wBv
+        /wAAbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8A
+        bP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AbP8AAGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/
+        AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AGn/AABm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm
+        /wBm/wBm/wBm/wBm/wBm/wBm/wBm/wBm/wAAY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8A
+        Y/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AY/8AAGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/AGD/
+        AGD/AGD/AGD/AGD/AGD/AGD/AGD/AABd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd
+        /wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wBd/wAAWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8AWv8A
+        Wv8AWv8AWv8AWv8AWv8AWv8AAFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/
+        AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AFf/AABU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU/wBU
+        /wBU/wBU/wBU/wBU/wAAUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8A
+        Uf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AUf8AAE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/AE7/
+        AE7/AE7/AE7/AABO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO
+        /wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO
+        /wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wBO/wAAS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8AS/8A
+        S/8AS/8AAEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/
+        AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/
+        AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AEj/AABF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF/wBF
+        /wAAQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8A
+        Qv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8A
+        Qv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AQv8AAD//AD//AD//AD//AD//AD//AD//AD//AD//AD//
+        AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//
+        AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AD//AAA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8
+        /wA8/wA8/wA8/wA8/wA8/wA8/wA8/wA8/wAAOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8A
+        Of8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8A
+        Of8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AOf8AADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/ADb/
+        ADb/ADb/ADb/ADb/ADb/ADb/ADb/AAAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz
+        /wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz
+        /wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAz/wAAMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8AMP8A
+        MP8AMP8AMP8AMP8AMP8AMP8AAC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/
+        AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/
+        AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AC3/AAAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq/wAq
+        /wAq/wAq/wAq/wAq/wAAJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8A
+        J/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AJ/8AACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/ACT/
+        ACT/ACT/ACT/AAAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh
+        /wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAh/wAAHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8AHv8A
+        Hv8AHv8AABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/
+        ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/ABv/AAAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY/wAY
+        /wAAFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8A
+        Ff8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AFf8AABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/
+        ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/ABL/AAAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP
+        /wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAP/wAADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8A
+        DP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8ADP8AAAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAn/
+        AAn/AAn/AAn/AAn/AAn/AAn/AAn/AAAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG
+        /wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAG/wAAA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8AA/8A
+        A/8AA/8AA/8AA/8AA/8AA/8A
+</value>
+  </data>
+</root>
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/SearchAndReplaceDialog.cs	(revision 15242)
@@ -43,12 +43,12 @@
 
   public partial class SearchAndReplaceDialog : Form {
-    private string[] cmbItemsText = { "Value", "Average", "Median", "Random", "Most Common", "Interpolation" };
-    private string[] cmbComparisonOperatorText = { "==", "<", "<=", ">", ">=", "!=" };
+    private static readonly string[] ItemsText = { "Value", "Average", "Median", "Random", "Most Common", "Interpolation" };
+    private static readonly string[] ComparisonOperatorText = { "==", "<", "<=", ">", ">=", "!=" };
 
     public SearchAndReplaceDialog() {
       InitializeComponent();
-      cmbReplaceWith.Items.AddRange(cmbItemsText);
+      cmbReplaceWith.Items.AddRange(ItemsText);
       cmbReplaceWith.SelectedIndex = (int)ReplaceAction.Value;
-      cmbComparisonOperator.Items.AddRange(cmbComparisonOperatorText);
+      cmbComparisonOperator.Items.AddRange(ComparisonOperatorText);
       cmbComparisonOperator.SelectedIndex = (int)ComparisonOperation.Equal;
     }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.Designer.cs	(revision 15242)
@@ -45,16 +45,32 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       this.lblRows = new System.Windows.Forms.Label();
-      this.txtRows = new System.Windows.Forms.Label();
       this.lblColumns = new System.Windows.Forms.Label();
       this.lblMissingValuesTotal = new System.Windows.Forms.Label();
-      this.txtColumns = new System.Windows.Forms.Label();
-      this.txtNumericColumns = new System.Windows.Forms.Label();
-      this.txtNominalColumns = new System.Windows.Forms.Label();
       this.lblNumericColumns = new System.Windows.Forms.Label();
       this.lblNominalColumns = new System.Windows.Forms.Label();
-      this.txtMissingValuesTotal = new System.Windows.Forms.Label();
-      this.dataGridView = new System.Windows.Forms.DataGridView();
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.stringMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.showVariablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.lblTNumValues = new System.Windows.Forms.Label();
+      this.orientationGroupBox = new System.Windows.Forms.GroupBox();
+      this.verticalRadioButton = new System.Windows.Forms.RadioButton();
+      this.horizontalRadioButton = new System.Windows.Forms.RadioButton();
+      this.rowsTextBox = new System.Windows.Forms.TextBox();
+      this.columnsTextBox = new System.Windows.Forms.TextBox();
+      this.totalValuesTextBox = new System.Windows.Forms.TextBox();
+      this.overviewTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.numericColumnsTextBox = new System.Windows.Forms.TextBox();
+      this.nominalColumnsTextBox5 = new System.Windows.Forms.TextBox();
+      this.missingValuesTextBox = new System.Windows.Forms.TextBox();
+      this.overviewGroupBox = new System.Windows.Forms.GroupBox();
+      this.checkInputsTargetButton = new System.Windows.Forms.Button();
+      this.uncheckAllButton = new System.Windows.Forms.Button();
+      this.checkAllButton = new System.Windows.Forms.Button();
+      this.showVariablesGroupBox.SuspendLayout();
+      this.orientationGroupBox.SuspendLayout();
+      this.overviewTableLayoutPanel.SuspendLayout();
+      this.overviewGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -62,108 +78,263 @@
       // 
       this.lblRows.AutoSize = true;
-      this.lblRows.Location = new System.Drawing.Point(3, 11);
+      this.lblRows.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblRows.Location = new System.Drawing.Point(3, 0);
       this.lblRows.Name = "lblRows";
-      this.lblRows.Size = new System.Drawing.Size(34, 13);
+      this.lblRows.Size = new System.Drawing.Size(52, 26);
       this.lblRows.TabIndex = 0;
-      this.lblRows.Text = "Rows";
-      // 
-      // txtRows
-      // 
-      this.txtRows.AutoSize = true;
-      this.txtRows.Location = new System.Drawing.Point(115, 11);
-      this.txtRows.Name = "txtRows";
-      this.txtRows.Size = new System.Drawing.Size(19, 13);
-      this.txtRows.TabIndex = 1;
-      this.txtRows.Text = "12";
+      this.lblRows.Text = "Datarows";
+      this.lblRows.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
       // 
       // lblColumns
       // 
       this.lblColumns.AutoSize = true;
-      this.lblColumns.Location = new System.Drawing.Point(3, 31);
+      this.lblColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblColumns.Location = new System.Drawing.Point(3, 26);
       this.lblColumns.Name = "lblColumns";
-      this.lblColumns.Size = new System.Drawing.Size(47, 13);
+      this.lblColumns.Size = new System.Drawing.Size(52, 26);
       this.lblColumns.TabIndex = 2;
-      this.lblColumns.Text = "Columns";
+      this.lblColumns.Text = "Variables";
+      this.lblColumns.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
       // 
       // lblMissingValuesTotal
       // 
       this.lblMissingValuesTotal.AutoSize = true;
-      this.lblMissingValuesTotal.Location = new System.Drawing.Point(3, 92);
+      this.lblMissingValuesTotal.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblMissingValuesTotal.Location = new System.Drawing.Point(275, 26);
       this.lblMissingValuesTotal.Name = "lblMissingValuesTotal";
-      this.lblMissingValuesTotal.Size = new System.Drawing.Size(100, 13);
+      this.lblMissingValuesTotal.Size = new System.Drawing.Size(77, 26);
       this.lblMissingValuesTotal.TabIndex = 3;
-      this.lblMissingValuesTotal.Text = "Missing Values total";
-      // 
-      // txtColumns
-      // 
-      this.txtColumns.AutoSize = true;
-      this.txtColumns.Location = new System.Drawing.Point(115, 31);
-      this.txtColumns.Name = "txtColumns";
-      this.txtColumns.Size = new System.Drawing.Size(25, 13);
-      this.txtColumns.TabIndex = 1;
-      this.txtColumns.Text = "123";
-      // 
-      // txtNumericColumns
-      // 
-      this.txtNumericColumns.AutoSize = true;
-      this.txtNumericColumns.Location = new System.Drawing.Point(115, 51);
-      this.txtNumericColumns.Name = "txtNumericColumns";
-      this.txtNumericColumns.Size = new System.Drawing.Size(25, 13);
-      this.txtNumericColumns.TabIndex = 1;
-      this.txtNumericColumns.Text = "456";
-      // 
-      // txtNominalColumns
-      // 
-      this.txtNominalColumns.AutoSize = true;
-      this.txtNominalColumns.Location = new System.Drawing.Point(115, 72);
-      this.txtNominalColumns.Name = "txtNominalColumns";
-      this.txtNominalColumns.Size = new System.Drawing.Size(25, 13);
-      this.txtNominalColumns.TabIndex = 1;
-      this.txtNominalColumns.Text = "789";
+      this.lblMissingValuesTotal.Text = "Missing Values";
+      this.lblMissingValuesTotal.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
       // 
       // lblNumericColumns
       // 
       this.lblNumericColumns.AutoSize = true;
-      this.lblNumericColumns.Location = new System.Drawing.Point(3, 51);
+      this.lblNumericColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblNumericColumns.Location = new System.Drawing.Point(119, 0);
       this.lblNumericColumns.Name = "lblNumericColumns";
-      this.lblNumericColumns.Size = new System.Drawing.Size(89, 13);
+      this.lblNumericColumns.Size = new System.Drawing.Size(92, 26);
       this.lblNumericColumns.TabIndex = 3;
-      this.lblNumericColumns.Text = "Numeric Columns";
+      this.lblNumericColumns.Text = "Numeric Variables";
+      this.lblNumericColumns.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
       // 
       // lblNominalColumns
       // 
       this.lblNominalColumns.AutoSize = true;
-      this.lblNominalColumns.Location = new System.Drawing.Point(3, 72);
+      this.lblNominalColumns.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblNominalColumns.Location = new System.Drawing.Point(119, 26);
       this.lblNominalColumns.Name = "lblNominalColumns";
-      this.lblNominalColumns.Size = new System.Drawing.Size(88, 13);
+      this.lblNominalColumns.Size = new System.Drawing.Size(92, 26);
       this.lblNominalColumns.TabIndex = 3;
-      this.lblNominalColumns.Text = "Nominal Columns";
-      // 
-      // txtMissingValuesTotal
-      // 
-      this.txtMissingValuesTotal.AutoSize = true;
-      this.txtMissingValuesTotal.Location = new System.Drawing.Point(115, 92);
-      this.txtMissingValuesTotal.Name = "txtMissingValuesTotal";
-      this.txtMissingValuesTotal.Size = new System.Drawing.Size(25, 13);
-      this.txtMissingValuesTotal.TabIndex = 1;
-      this.txtMissingValuesTotal.Text = "102";
-      // 
-      // dataGridView
-      // 
-      this.dataGridView.AllowUserToAddRows = false;
-      this.dataGridView.AllowUserToDeleteRows = false;
-      this.dataGridView.AllowUserToOrderColumns = true;
-      this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.lblNominalColumns.Text = "Nominal Variables";
+      this.lblNominalColumns.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // stringMatrixView
+      // 
+      this.stringMatrixView.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.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.dataGridView.Location = new System.Drawing.Point(5, 117);
-      this.dataGridView.Name = "dataGridView";
-      this.dataGridView.ReadOnly = true;
-      this.dataGridView.RowHeadersWidth = 80;
-      this.dataGridView.Size = new System.Drawing.Size(530, 278);
-      this.dataGridView.TabIndex = 4;
-      this.dataGridView.VirtualMode = true;
-      this.dataGridView.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.dataGridView_CellValueNeeded);
+      this.stringMatrixView.Caption = "StringConvertibleMatrix View";
+      this.stringMatrixView.Content = null;
+      this.stringMatrixView.Location = new System.Drawing.Point(3, 74);
+      this.stringMatrixView.Name = "stringMatrixView";
+      this.stringMatrixView.ReadOnly = true;
+      this.stringMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.stringMatrixView.ShowStatisticalInformation = true;
+      this.stringMatrixView.Size = new System.Drawing.Size(655, 374);
+      this.stringMatrixView.TabIndex = 4;
+      // 
+      // showVariablesGroupBox
+      // 
+      this.showVariablesGroupBox.Controls.Add(this.checkInputsTargetButton);
+      this.showVariablesGroupBox.Controls.Add(this.uncheckAllButton);
+      this.showVariablesGroupBox.Controls.Add(this.checkAllButton);
+      this.showVariablesGroupBox.Location = new System.Drawing.Point(458, 0);
+      this.showVariablesGroupBox.Name = "showVariablesGroupBox";
+      this.showVariablesGroupBox.Size = new System.Drawing.Size(97, 71);
+      this.showVariablesGroupBox.TabIndex = 16;
+      this.showVariablesGroupBox.TabStop = false;
+      this.showVariablesGroupBox.Text = "Show Variables";
+      // 
+      // lblTNumValues
+      // 
+      this.lblTNumValues.AutoSize = true;
+      this.lblTNumValues.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lblTNumValues.Location = new System.Drawing.Point(275, 0);
+      this.lblTNumValues.Name = "lblTNumValues";
+      this.lblTNumValues.Size = new System.Drawing.Size(77, 26);
+      this.lblTNumValues.TabIndex = 2;
+      this.lblTNumValues.Text = "Total Values";
+      this.lblTNumValues.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.toolTip.SetToolTip(this.lblTNumValues, "Valid Values (excl. missing Values)");
+      // 
+      // orientationGroupBox
+      // 
+      this.orientationGroupBox.Controls.Add(this.verticalRadioButton);
+      this.orientationGroupBox.Controls.Add(this.horizontalRadioButton);
+      this.orientationGroupBox.Location = new System.Drawing.Point(561, 0);
+      this.orientationGroupBox.Name = "orientationGroupBox";
+      this.orientationGroupBox.Size = new System.Drawing.Size(94, 71);
+      this.orientationGroupBox.TabIndex = 17;
+      this.orientationGroupBox.TabStop = false;
+      this.orientationGroupBox.Text = "Orientation";
+      // 
+      // verticalRadioButton
+      // 
+      this.verticalRadioButton.AutoSize = true;
+      this.verticalRadioButton.Checked = true;
+      this.verticalRadioButton.Location = new System.Drawing.Point(6, 32);
+      this.verticalRadioButton.Name = "verticalRadioButton";
+      this.verticalRadioButton.Size = new System.Drawing.Size(60, 17);
+      this.verticalRadioButton.TabIndex = 1;
+      this.verticalRadioButton.TabStop = true;
+      this.verticalRadioButton.Text = "Vertical";
+      this.verticalRadioButton.UseVisualStyleBackColor = true;
+      this.verticalRadioButton.CheckedChanged += new System.EventHandler(this.verticalRadioButton_CheckedChanged);
+      // 
+      // horizontalRadioButton
+      // 
+      this.horizontalRadioButton.AutoSize = true;
+      this.horizontalRadioButton.Location = new System.Drawing.Point(6, 14);
+      this.horizontalRadioButton.Name = "horizontalRadioButton";
+      this.horizontalRadioButton.Size = new System.Drawing.Size(72, 17);
+      this.horizontalRadioButton.TabIndex = 0;
+      this.horizontalRadioButton.Text = "Horizontal";
+      this.horizontalRadioButton.UseVisualStyleBackColor = true;
+      this.horizontalRadioButton.CheckedChanged += new System.EventHandler(this.horizontalRadioButton_CheckedChanged);
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.rowsTextBox.Location = new System.Drawing.Point(61, 3);
+      this.rowsTextBox.Name = "rowsTextBox";
+      this.rowsTextBox.ReadOnly = true;
+      this.rowsTextBox.Size = new System.Drawing.Size(52, 20);
+      this.rowsTextBox.TabIndex = 18;
+      this.rowsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.columnsTextBox.Location = new System.Drawing.Point(61, 29);
+      this.columnsTextBox.Name = "columnsTextBox";
+      this.columnsTextBox.ReadOnly = true;
+      this.columnsTextBox.Size = new System.Drawing.Size(52, 20);
+      this.columnsTextBox.TabIndex = 18;
+      this.columnsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // totalValuesTextBox
+      // 
+      this.totalValuesTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.totalValuesTextBox.Location = new System.Drawing.Point(358, 3);
+      this.totalValuesTextBox.Name = "totalValuesTextBox";
+      this.totalValuesTextBox.ReadOnly = true;
+      this.totalValuesTextBox.Size = new System.Drawing.Size(82, 20);
+      this.totalValuesTextBox.TabIndex = 18;
+      this.totalValuesTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // overviewTableLayoutPanel
+      // 
+      this.overviewTableLayoutPanel.ColumnCount = 6;
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 28.57143F));
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 28.57143F));
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.overviewTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 42.85715F));
+      this.overviewTableLayoutPanel.Controls.Add(this.lblRows, 0, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblColumns, 0, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.columnsTextBox, 1, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblNominalColumns, 2, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblNumericColumns, 2, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.rowsTextBox, 1, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.numericColumnsTextBox, 3, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.nominalColumnsTextBox5, 3, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.missingValuesTextBox, 5, 1);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblTNumValues, 4, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.totalValuesTextBox, 5, 0);
+      this.overviewTableLayoutPanel.Controls.Add(this.lblMissingValuesTotal, 4, 1);
+      this.overviewTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.overviewTableLayoutPanel.Location = new System.Drawing.Point(3, 16);
+      this.overviewTableLayoutPanel.Name = "overviewTableLayoutPanel";
+      this.overviewTableLayoutPanel.RowCount = 3;
+      this.overviewTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.overviewTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.overviewTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+      this.overviewTableLayoutPanel.Size = new System.Drawing.Size(443, 52);
+      this.overviewTableLayoutPanel.TabIndex = 19;
+      // 
+      // numericColumnsTextBox
+      // 
+      this.numericColumnsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.numericColumnsTextBox.Location = new System.Drawing.Point(217, 3);
+      this.numericColumnsTextBox.Name = "numericColumnsTextBox";
+      this.numericColumnsTextBox.ReadOnly = true;
+      this.numericColumnsTextBox.Size = new System.Drawing.Size(52, 20);
+      this.numericColumnsTextBox.TabIndex = 18;
+      this.numericColumnsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // nominalColumnsTextBox5
+      // 
+      this.nominalColumnsTextBox5.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.nominalColumnsTextBox5.Location = new System.Drawing.Point(217, 29);
+      this.nominalColumnsTextBox5.Name = "nominalColumnsTextBox5";
+      this.nominalColumnsTextBox5.ReadOnly = true;
+      this.nominalColumnsTextBox5.Size = new System.Drawing.Size(52, 20);
+      this.nominalColumnsTextBox5.TabIndex = 18;
+      this.nominalColumnsTextBox5.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // missingValuesTextBox
+      // 
+      this.missingValuesTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.missingValuesTextBox.Location = new System.Drawing.Point(358, 29);
+      this.missingValuesTextBox.Name = "missingValuesTextBox";
+      this.missingValuesTextBox.ReadOnly = true;
+      this.missingValuesTextBox.Size = new System.Drawing.Size(82, 20);
+      this.missingValuesTextBox.TabIndex = 18;
+      this.missingValuesTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      // 
+      // overviewGroupBox
+      // 
+      this.overviewGroupBox.Controls.Add(this.overviewTableLayoutPanel);
+      this.overviewGroupBox.Location = new System.Drawing.Point(3, 0);
+      this.overviewGroupBox.Name = "overviewGroupBox";
+      this.overviewGroupBox.Size = new System.Drawing.Size(449, 71);
+      this.overviewGroupBox.TabIndex = 20;
+      this.overviewGroupBox.TabStop = false;
+      this.overviewGroupBox.Text = "Overview";
+      // 
+      // checkInputsTargetButton
+      // 
+      this.checkInputsTargetButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.Inputs;
+      this.checkInputsTargetButton.Location = new System.Drawing.Point(36, 19);
+      this.checkInputsTargetButton.Name = "checkInputsTargetButton";
+      this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
+      this.checkInputsTargetButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.checkInputsTargetButton, "Show Inputs & Target");
+      this.checkInputsTargetButton.UseVisualStyleBackColor = true;
+      this.checkInputsTargetButton.Click += new System.EventHandler(this.checkInputsTargetButton_Click);
+      // 
+      // uncheckAllButton
+      // 
+      this.uncheckAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.None;
+      this.uncheckAllButton.Location = new System.Drawing.Point(66, 19);
+      this.uncheckAllButton.Name = "uncheckAllButton";
+      this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
+      this.uncheckAllButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.uncheckAllButton, "Show None");
+      this.uncheckAllButton.UseVisualStyleBackColor = true;
+      this.uncheckAllButton.Click += new System.EventHandler(this.uncheckAllButton_Click);
+      // 
+      // checkAllButton
+      // 
+      this.checkAllButton.Image = global::HeuristicLab.DataPreprocessing.Views.PreprocessingIcons.All;
+      this.checkAllButton.Location = new System.Drawing.Point(6, 19);
+      this.checkAllButton.Name = "checkAllButton";
+      this.checkAllButton.Size = new System.Drawing.Size(24, 24);
+      this.checkAllButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.checkAllButton, "Show All");
+      this.checkAllButton.UseVisualStyleBackColor = true;
+      this.checkAllButton.Click += new System.EventHandler(this.checkAllButton_Click);
       // 
       // StatisticsView
@@ -171,20 +342,17 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.dataGridView);
-      this.Controls.Add(this.lblNominalColumns);
-      this.Controls.Add(this.lblNumericColumns);
-      this.Controls.Add(this.lblMissingValuesTotal);
-      this.Controls.Add(this.txtMissingValuesTotal);
-      this.Controls.Add(this.txtNominalColumns);
-      this.Controls.Add(this.lblColumns);
-      this.Controls.Add(this.txtNumericColumns);
-      this.Controls.Add(this.txtColumns);
-      this.Controls.Add(this.txtRows);
-      this.Controls.Add(this.lblRows);
+      this.Controls.Add(this.overviewGroupBox);
+      this.Controls.Add(this.orientationGroupBox);
+      this.Controls.Add(this.showVariablesGroupBox);
+      this.Controls.Add(this.stringMatrixView);
       this.Name = "StatisticsView";
-      this.Size = new System.Drawing.Size(549, 408);
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.Size = new System.Drawing.Size(661, 451);
+      this.showVariablesGroupBox.ResumeLayout(false);
+      this.orientationGroupBox.ResumeLayout(false);
+      this.orientationGroupBox.PerformLayout();
+      this.overviewTableLayoutPanel.ResumeLayout(false);
+      this.overviewTableLayoutPanel.PerformLayout();
+      this.overviewGroupBox.ResumeLayout(false);
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -193,14 +361,26 @@
 
     private System.Windows.Forms.Label lblRows;
-    private System.Windows.Forms.Label txtRows;
     private System.Windows.Forms.Label lblColumns;
     private System.Windows.Forms.Label lblMissingValuesTotal;
-    private System.Windows.Forms.Label txtColumns;
-    private System.Windows.Forms.Label txtNumericColumns;
-    private System.Windows.Forms.Label txtNominalColumns;
     private System.Windows.Forms.Label lblNumericColumns;
     private System.Windows.Forms.Label lblNominalColumns;
-    private System.Windows.Forms.Label txtMissingValuesTotal;
-    private System.Windows.Forms.DataGridView dataGridView;
+    private HeuristicLab.Data.Views.StringConvertibleMatrixView stringMatrixView;
+    private System.Windows.Forms.GroupBox showVariablesGroupBox;
+    private System.Windows.Forms.Button checkInputsTargetButton;
+    private System.Windows.Forms.Button uncheckAllButton;
+    private System.Windows.Forms.Button checkAllButton;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.GroupBox orientationGroupBox;
+    private System.Windows.Forms.RadioButton verticalRadioButton;
+    private System.Windows.Forms.RadioButton horizontalRadioButton;
+    private System.Windows.Forms.Label lblTNumValues;
+    private System.Windows.Forms.TextBox rowsTextBox;
+    private System.Windows.Forms.TextBox columnsTextBox;
+    private System.Windows.Forms.TextBox totalValuesTextBox;
+    private System.Windows.Forms.TableLayoutPanel overviewTableLayoutPanel;
+    private System.Windows.Forms.TextBox numericColumnsTextBox;
+    private System.Windows.Forms.TextBox nominalColumnsTextBox5;
+    private System.Windows.Forms.TextBox missingValuesTextBox;
+    private System.Windows.Forms.GroupBox overviewGroupBox;
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/StatisticsView.cs	(revision 15242)
@@ -21,17 +21,33 @@
 
 using System;
+using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
 using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
 
 namespace HeuristicLab.DataPreprocessing.Views {
-
   [View("Statistics View")]
   [Content(typeof(StatisticsContent), true)]
   public partial class StatisticsView : ItemView {
-
-    private List<List<string>> columnsRowsMatrix;
-    private readonly int COLUMNS = 12;
+    private bool horizontal = false;
+    private StringMatrix statisticsMatrix;
+    private static readonly string[] StatisticsNames = new[] {
+      "Type",
+      "Missing Values",
+      "Min",
+      "Max",
+      "Median",
+      "Average",
+      "Std. Deviation",
+      "Variance",
+      "25th Percentile",
+      "75th Percentile",
+      "Most Common Value",
+      "Num. diff. Values"
+    };
 
     public new StatisticsContent Content {
@@ -47,10 +63,12 @@
       base.OnContentChanged();
       if (Content == null) {
-        txtRows.Text = "";
-        txtColumns.Text = "";
-        txtNumericColumns.Text = "";
-        txtNominalColumns.Text = "";
-        txtMissingValuesTotal.Text = "";
-        dataGridView.Columns.Clear();
+        rowsTextBox.Text = string.Empty;
+        columnsTextBox.Text = string.Empty;
+        numericColumnsTextBox.Text = string.Empty;
+        nominalColumnsTextBox5.Text = string.Empty;
+        missingValuesTextBox.Text = string.Empty;
+        totalValuesTextBox.Text = string.Empty;
+        stringMatrixView.Content = null;
+        statisticsMatrix = null;
       } else {
         UpdateData();
@@ -58,81 +76,78 @@
     }
 
-    /// <summary>
-    /// Adds eventhandlers to the current instance.
-    /// </summary>
     protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
       Content.Changed += Content_Changed;
     }
 
-
-    /// <summary>
-    /// Removes the eventhandlers from the current instance.
-    /// </summary>
     protected override void DeregisterContentEvents() {
       Content.Changed -= Content_Changed;
-    }
-
-    private void UpdateData() {
-      var logic = Content.StatisticsLogic;
-      var rowCount = logic.GetRowCount();
-      txtRows.Text = rowCount.ToString();
-      txtColumns.Text = logic.GetColumnCount().ToString();
-      txtNumericColumns.Text = logic.GetNumericColumnCount().ToString();
-      txtNominalColumns.Text = logic.GetNominalColumnCount().ToString();
-      txtMissingValuesTotal.Text = logic.GetMissingValueCount().ToString();
-
-      columnsRowsMatrix = new List<List<string>>();
-      DataGridViewColumn[] columns = new DataGridViewColumn[COLUMNS];
-      for (int i = 0; i < COLUMNS; ++i) {
-        var column = new DataGridViewTextBoxColumn();
-        column.SortMode = DataGridViewColumnSortMode.Automatic;
-        column.FillWeight = 1;
-        columns[i] = column;
-      }
-
-      columns[0].HeaderCell.Value = "Type";
-      columns[1].HeaderCell.Value = "Missing Values";
-      columns[2].HeaderCell.Value = "Min";
-      columns[3].HeaderCell.Value = "Max";
-      columns[4].HeaderCell.Value = "Median";
-      columns[5].HeaderCell.Value = "Average";
-      columns[6].HeaderCell.Value = "std. Deviation";
-      columns[7].HeaderCell.Value = "Variance";
-      columns[8].HeaderCell.Value = "25th Percentile";
-      columns[9].HeaderCell.Value = "75th Percentile";
-      columns[10].HeaderCell.Value = "Most Common Value";
-      columns[11].HeaderCell.Value = "Num. diff. Values";
-
-      if (rowCount > 0) {
-        for (int i = 0; i < logic.GetColumnCount(); ++i) {
-          columnsRowsMatrix.Add(GetList(i));
-        }
-      }
-
-      dataGridView.Columns.Clear();
-      dataGridView.Columns.AddRange(columns);
-      dataGridView.RowCount = columnsRowsMatrix.Count;
-
-      for (int i = 0; i < columnsRowsMatrix.Count; ++i) {
-        dataGridView.Rows[i].HeaderCell.Value = logic.GetVariableName(i);
-      }
-
-      dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
-      dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
-      dataGridView.AllowUserToResizeColumns = true;
-    }
-
-    private List<string> GetList(int i) {
+      base.DeregisterContentEvents();
+    }
+
+    private void UpdateData(Dictionary<string, bool> oldVisibility = null) {
+      var logic = Content.StatisticsLogic;
+      rowsTextBox.Text = logic.GetRowCount().ToString();
+      columnsTextBox.Text = logic.GetColumnCount().ToString();
+      numericColumnsTextBox.Text = logic.GetNumericColumnCount().ToString();
+      nominalColumnsTextBox5.Text = logic.GetNominalColumnCount().ToString();
+      missingValuesTextBox.Text = logic.GetMissingValueCount().ToString();
+      totalValuesTextBox.Text = (logic.GetColumnCount() * logic.GetRowCount() - logic.GetMissingValueCount()).ToString();
+
+      var variableNames = Content.PreprocessingData.VariableNames.ToList();
+      if (horizontal)
+        statisticsMatrix = new StringMatrix(StatisticsNames.Length, Content.PreprocessingData.Columns) {
+          RowNames = StatisticsView.StatisticsNames,
+          ColumnNames = variableNames
+        };
+      else
+        statisticsMatrix = new StringMatrix(Content.PreprocessingData.Columns, StatisticsNames.Length) {
+          RowNames = variableNames,
+          ColumnNames = StatisticsView.StatisticsNames
+        };
+
+      for (int i = 0; i < logic.GetColumnCount(); i++) {
+        var data = GetStatistics(i);
+        for (int j = 0; j < data.Count; j++) {
+          if (horizontal)
+            statisticsMatrix[j, i] = data[j];
+          else
+            statisticsMatrix[i, j] = data[j];
+        }
+      }
+
+      stringMatrixView.Parent.SuspendRepaint();
+      stringMatrixView.Content = statisticsMatrix;
+
+      var grid = stringMatrixView.DataGridView;
+      int idx = 0;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      foreach (DataGridViewBand band in list) {
+        var variable = variableNames[idx++];
+        if (oldVisibility != null) {
+          band.Visible = !oldVisibility.ContainsKey(variable) || oldVisibility[variable];
+        }
+      }
+      if (horizontal)
+        stringMatrixView.UpdateColumnHeaders();
+      else
+        stringMatrixView.UpdateRowHeaders();
+
+      stringMatrixView.DataGridView.AutoResizeColumns();
+      stringMatrixView.Parent.ResumeRepaint(true);
+    }
+
+    private List<string> GetStatistics(int varIdx) {
       List<string> list;
       var logic = Content.StatisticsLogic;
-      if (logic.VariableHasType<double>(i)) {
-        list = GetDoubleColumns(i);
-      } else if (logic.VariableHasType<string>(i)) {
-        list = GetStringColumns(i);
-      } else if (logic.VariableHasType<DateTime>(i)) {
-        list = GetDateTimeColumns(i);
+      if (logic.VariableHasType<double>(varIdx)) {
+        list = GetDoubleColumns(varIdx);
+      } else if (logic.VariableHasType<string>(varIdx)) {
+        list = GetStringColumns(varIdx);
+      } else if (logic.VariableHasType<DateTime>(varIdx)) {
+        list = GetDateTimeColumns(varIdx);
       } else {
         list = new List<string>();
-        for (int j = 0; j < COLUMNS; ++j) {
+        for (int j = 0; j < StatisticsNames.Length; ++j) {
           list.Add("unknown column type");
         }
@@ -141,27 +156,27 @@
     }
 
-    private List<string> GetDoubleColumns(int columnIndex) {
+    private List<string> GetDoubleColumns(int statIdx) {
       var logic = Content.StatisticsLogic;
       return new List<string> {
-        logic.GetColumnTypeAsString(columnIndex),
-        logic.GetMissingValueCount(columnIndex).ToString(),
-        logic.GetMin<double>(columnIndex,double.NaN).ToString(),
-        logic.GetMax<double>(columnIndex,double.NaN).ToString(),
-        logic.GetMedian(columnIndex).ToString(),
-        logic.GetAverage(columnIndex).ToString(),
-        logic.GetStandardDeviation(columnIndex).ToString(),
-        logic.GetVariance(columnIndex).ToString(),
-        logic.GetOneQuarterPercentile(columnIndex).ToString(),
-        logic.GetThreeQuarterPercentile(columnIndex).ToString(),
-        logic.GetMostCommonValue<double>(columnIndex,double.NaN).ToString(),
-        logic.GetDifferentValuesCount<double>(columnIndex).ToString()
+        logic.GetColumnTypeAsString(statIdx),
+        logic.GetMissingValueCount(statIdx).ToString(),
+        logic.GetMin<double>(statIdx, double.NaN).ToString(),
+        logic.GetMax<double>(statIdx, double.NaN).ToString(),
+        logic.GetMedian(statIdx).ToString(),
+        logic.GetAverage(statIdx).ToString(),
+        logic.GetStandardDeviation(statIdx).ToString(),
+        logic.GetVariance(statIdx).ToString(),
+        logic.GetOneQuarterPercentile(statIdx).ToString(),
+        logic.GetThreeQuarterPercentile(statIdx).ToString(),
+        logic.GetMostCommonValue<double>(statIdx, double.NaN).ToString(),
+        logic.GetDifferentValuesCount<double>(statIdx).ToString()
       };
     }
 
-    private List<string> GetStringColumns(int columnIndex) {
+    private List<string> GetStringColumns(int statIdx) {
       var logic = Content.StatisticsLogic;
       return new List<string> {
-        logic.GetColumnTypeAsString(columnIndex),
-        logic.GetMissingValueCount(columnIndex).ToString(),
+        logic.GetColumnTypeAsString(statIdx),
+        logic.GetMissingValueCount(statIdx).ToString(),
         "", //min
         "", //max
@@ -172,55 +187,89 @@
         "", //quarter percentile
         "", //three quarter percentile
-        logic.GetMostCommonValue<string>(columnIndex,string.Empty) ?? "",
-        logic.GetDifferentValuesCount<string>(columnIndex).ToString()
+        logic.GetMostCommonValue<string>(statIdx,string.Empty) ?? "",
+        logic.GetDifferentValuesCount<string>(statIdx).ToString()
       };
     }
 
-    private List<string> GetDateTimeColumns(int columnIndex) {
+    private List<string> GetDateTimeColumns(int statIdx) {
       var logic = Content.StatisticsLogic;
       return new List<string> {
-        logic.GetColumnTypeAsString(columnIndex),
-        logic.GetMissingValueCount(columnIndex).ToString(),
-        logic.GetMin<DateTime>(columnIndex,DateTime.MinValue).ToString(),
-        logic.GetMax<DateTime>(columnIndex,DateTime.MinValue).ToString(),
-        logic.GetMedianDateTime(columnIndex).ToString(),
-        logic.GetAverageDateTime(columnIndex).ToString(),
-        logic.GetStandardDeviation(columnIndex).ToString(),
-        logic.GetVariance(columnIndex).ToString(), //variance
-        logic.GetOneQuarterPercentile(columnIndex).ToString(),
-        logic.GetThreeQuarterPercentile(columnIndex).ToString(),
-        logic.GetMostCommonValue<DateTime>(columnIndex,DateTime.MinValue).ToString(),
-        logic.GetDifferentValuesCount<DateTime>(columnIndex).ToString()
+        logic.GetColumnTypeAsString(statIdx),
+        logic.GetMissingValueCount(statIdx).ToString(),
+        logic.GetMin<DateTime>(statIdx, DateTime.MinValue).ToString(),
+        logic.GetMax<DateTime>(statIdx, DateTime.MinValue).ToString(),
+        logic.GetMedianDateTime(statIdx).ToString(),
+        logic.GetAverageDateTime(statIdx).ToString(),
+        logic.GetStandardDeviation(statIdx).ToString(),
+        logic.GetVariance(statIdx).ToString(),
+        logic.GetOneQuarterPercentile(statIdx).ToString(),
+        logic.GetThreeQuarterPercentile(statIdx).ToString(),
+        logic.GetMostCommonValue<DateTime>(statIdx, DateTime.MinValue).ToString(),
+        logic.GetDifferentValuesCount<DateTime>(statIdx).ToString()
       };
     }
 
-    private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
-      if (Content != null && e.RowIndex < columnsRowsMatrix.Count && e.ColumnIndex < columnsRowsMatrix[0].Count) {
-        e.Value = columnsRowsMatrix[e.RowIndex][e.ColumnIndex];
-      }
-    }
-
     private void Content_Changed(object sender, DataPreprocessingChangedEventArgs e) {
-      switch (e.Type) {
-        case DataPreprocessingChangedEventType.DeleteColumn:
-          columnsRowsMatrix.RemoveAt(e.Column);
-          break;
-        case DataPreprocessingChangedEventType.AddColumn:
-          columnsRowsMatrix.Insert(e.Row, GetList(e.Column));
-          dataGridView.RowCount++;
-          break;
-        case DataPreprocessingChangedEventType.ChangeItem:
-          columnsRowsMatrix[e.Column] = GetList(e.Column);
-          break;
-        case DataPreprocessingChangedEventType.DeleteRow:
-        case DataPreprocessingChangedEventType.AddRow:
-        default:
-          for (int i = 0; i < columnsRowsMatrix.Count; ++i) {
-            columnsRowsMatrix[i] = GetList(e.Column);
-          }
-          break;
-      }
-      dataGridView.Refresh();
-    }
+      UpdateData();
+    }
+
+    #region Show/Hide Variables
+    private void checkInputsTargetButton_Click(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      var variableNames = Content.PreprocessingData.VariableNames.ToList();
+      int idx = 0;
+      foreach (DataGridViewBand band in list) {
+        var variable = variableNames[idx++];
+        bool isInputTarget = Content.PreprocessingData.InputVariables.Contains(variable)
+                             || Content.PreprocessingData.TargetVariable == variable;
+        band.Visible = isInputTarget;
+        if (horizontal)
+          stringMatrixView.UpdateColumnHeaders();
+        else
+          stringMatrixView.UpdateRowHeaders();
+      }
+
+    }
+    private void checkAllButton_Click(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      foreach (DataGridViewBand band in list) {
+        band.Visible = true;
+      }
+      if (horizontal)
+        stringMatrixView.UpdateColumnHeaders();
+      else
+        stringMatrixView.UpdateRowHeaders();
+    }
+    private void uncheckAllButton_Click(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var list = horizontal ? grid.Columns : grid.Rows as IList;
+      foreach (DataGridViewBand band in list) {
+        band.Visible = false;
+      }
+    }
+    #endregion
+
+    #region Orientation
+    private void horizontalRadioButton_CheckedChanged(object sender, EventArgs e) {
+      var grid = stringMatrixView.DataGridView;
+      var oldVisibility = new Dictionary<string, bool>();
+      var variableNames = Content.PreprocessingData.VariableNames.ToList();
+      if (stringMatrixView.Content != null) {
+        var list = horizontal ? grid.Columns : grid.Rows as IList;
+        int idx = 0;
+        foreach (DataGridViewBand band in list) {
+          var variable = variableNames[idx++];
+          oldVisibility.Add(variable, band.Visible);
+        }
+      }
+      horizontal = horizontalRadioButton.Checked;
+      UpdateData(oldVisibility);
+    }
+    private void verticalRadioButton_CheckedChanged(object sender, EventArgs e) {
+      // everything is handled in horizontalRadioButton_CheckedChanged 
+    }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/TransformationView.cs	(revision 15242)
@@ -28,9 +28,7 @@
 
 namespace HeuristicLab.DataPreprocessing.Views {
-
   [View("Transformation View")]
   [Content(typeof(TransformationContent), true)]
   public partial class TransformationView : AsynchronousContentView {
-
     public new TransformationContent Content {
       get { return (TransformationContent)base.Content; }
@@ -52,14 +50,8 @@
     }
 
-    /// <summary>
-    /// Adds eventhandlers to the current instance.
-    /// </summary>
     protected override void RegisterContentEvents() {
       Content.FilterLogic.FilterChanged += FilterLogic_FilterChanged;
     }
 
-    /// <summary>
-    /// Removes the eventhandlers from the current instance.
-    /// </summary>
     protected override void DeregisterContentEvents() {
       Content.FilterLogic.FilterChanged -= FilterLogic_FilterChanged;
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/Utils/FindPreprocessingItemsIterator.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/Utils/FindPreprocessingItemsIterator.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/Utils/FindPreprocessingItemsIterator.cs	(revision 15242)
@@ -26,5 +26,4 @@
 namespace HeuristicLab.DataPreprocessing.Views {
   class FindPreprocessingItemsIterator : IFindPreprocessingItemsIterator {
-
     private IDictionary<int, IList<int>> items;
     private Tuple<int, int> currentCell;
@@ -32,5 +31,5 @@
     public FindPreprocessingItemsIterator(IDictionary<int, IList<int>> items) {
       this.items = items;
-      Reset(); 
+      Reset();
     }
 
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/Utils/VerticalLabel.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/Utils/VerticalLabel.cs	(revision 15242)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/Utils/VerticalLabel.cs	(revision 15242)
@@ -0,0 +1,39 @@
+﻿#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.Drawing;
+using System.Windows.Forms;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  public class VerticalLabel : Label {
+    protected override void OnPaint(PaintEventArgs e) {
+      Brush b = new SolidBrush(ForeColor);
+      var stringFormat = new StringFormat(StringFormatFlags.DirectionVertical);
+
+      var textSize = e.Graphics.MeasureString(Text, Font, PointF.Empty, stringFormat);
+      e.Graphics.TranslateTransform(Width / 2 + textSize.Width / 2, Height / 2 + textSize.Height / 2);
+      e.Graphics.RotateTransform(180);
+
+      e.Graphics.DrawString(Text, Font, b, PointF.Empty, stringFormat);
+    }
+  }
+}
+
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.Designer.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.Designer.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.Designer.cs	(revision 15242)
@@ -53,49 +53,12 @@
       this.SuspendLayout();
       // 
-      // splitContainer
-      // 
-      this.splitContainer.Size = new System.Drawing.Size(526, 364);
-      // 
-      // itemsGroupBox
-      // 
-      this.itemsGroupBox.Size = new System.Drawing.Size(532, 383);
-      // 
       // itemsListView
       // 
-      this.itemsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
       this.itemsListView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.itemsListView.Location = new System.Drawing.Point(0, 0);
-      this.itemsListView.Size = new System.Drawing.Size(200, 364);
-      // 
-      // detailsGroupBox
-      // 
-      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
-      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
-      this.detailsGroupBox.Size = new System.Drawing.Size(322, 364);
-      // 
-      // addButton
-      // 
-      this.toolTip.SetToolTip(this.addButton, "Add");
-      this.addButton.Visible = false;
-      // 
-      // removeButton
-      // 
-      this.toolTip.SetToolTip(this.removeButton, "Remove");
-      this.removeButton.Visible = false;
-      // 
-      // moveUpButton
-      // 
-      this.toolTip.SetToolTip(this.moveUpButton, "Move Up");
-      this.moveUpButton.Visible = false;
-      // 
-      // moveDownButton
-      // 
-      this.toolTip.SetToolTip(this.moveDownButton, "Move Down");
-      this.moveDownButton.Visible = false;
       // 
       // viewHost
       // 
-      this.viewHost.Size = new System.Drawing.Size(310, 339);
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.ViewsLabelVisible = false;
       // 
       // showDetailsCheckBox
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/ViewShortcutListView.cs	(revision 15242)
@@ -21,5 +21,4 @@
 
 using System;
-using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
@@ -30,8 +29,12 @@
   [Content(typeof(IItemList<IViewShortcut>), true)]
   public partial class ViewShortcutListView : ItemListView<IViewShortcut> {
-
     public ViewShortcutListView() {
       InitializeComponent();
-      itemsGroupBox.Text = "View Shortcuts";
+      Controls.Clear();
+      Controls.Add(splitContainer);
+      splitContainer.Panel1.Controls.Clear();
+      splitContainer.Panel1.Controls.Add(itemsListView);
+      splitContainer.Panel2.Controls.Clear();
+      splitContainer.Panel2.Controls.Add(viewHost);
     }
 
@@ -42,12 +45,13 @@
         IViewShortcut item = itemsListView.SelectedItems[0].Tag as IViewShortcut;
         if (item != null) {
-
-          if (item is IViewChartShortcut)
-            item = (IViewChartShortcut)item.Clone(new Cloner());
-
-          IContentView view = MainFormManager.MainForm.ShowContent(item);
-          if (view != null) {
-            view.ReadOnly = ReadOnly;
-            view.Locked = Locked;
+          try {
+            item = (IViewShortcut)item.Clone();
+            var view = MainFormManager.MainForm.ShowContent(item);
+            if (view != null) {
+              view.ReadOnly = ReadOnly;
+              view.Locked = Locked;
+            }
+          } catch (NullReferenceException) {
+            // cloning for preprocessing not done properly yet
           }
         }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/CorrelationMatrixContent.cs	(revision 15242)
@@ -27,11 +27,11 @@
 namespace HeuristicLab.DataPreprocessing {
   [Item("Feature Correlation Matrix", "Represents the feature correlation matrix.")]
-  public class CorrelationMatrixContent : Item, IViewChartShortcut {
+  public class CorrelationMatrixContent : Item, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Gradient; }
     }
 
-    private PreprocessingContext Context { get; set; }
-    private ITransactionalPreprocessingData PreprocessingData {
+    public PreprocessingContext Context { get; private set; }
+    public ITransactionalPreprocessingData PreprocessingData {
       get { return Context.Data; }
     }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/DataCompletenessChartContent.cs	(revision 15242)
@@ -1,15 +1,35 @@
-﻿using System.Drawing;
+﻿#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.Drawing;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 
 namespace HeuristicLab.DataPreprocessing {
-  [Item("DataCompletenessChart", "Represents a datacompleteness chart.")]
+  [Item("Data Completeness Chart", "Represents a datacompleteness chart.")]
 
-  public class DataCompletenessChartContent : Item, IViewChartShortcut {
+  public class DataCompletenessChartContent : Item, IViewShortcut {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.EditBrightnessContrast; }
     }
 
-    //public DataGridLogic DataGridLogic { get; private set; }
     public SearchLogic SearchLogic { get; private set; }
 
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/DataGridContent.cs	(revision 15242)
@@ -30,12 +30,11 @@
 namespace HeuristicLab.DataPreprocessing {
 
-  [Item("DataGrid", "Represents a data grid.")]
+  [Item("Data Grid", "Represents a data grid.")]
   public class DataGridContent : Item, IStringConvertibleMatrix, IViewShortcut {
-
-    public ITransactionalPreprocessingData PreProcessingData { get; private set; }
-
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Table; }
     }
+
+    public ITransactionalPreprocessingData PreProcessingData { get; private set; }
 
     public ManipulationLogic ManipulationLogic { get; private set; }
@@ -43,46 +42,26 @@
 
     public int Rows {
-      get {
-        return PreProcessingData.Rows;
-      }
-      set {
-        //does nothing
-      }
+      get { return PreProcessingData.Rows; }
+      set { }
     }
 
     public int Columns {
-      get {
-        return PreProcessingData.Columns;
-      }
-      set {
-        //does nothing
-      }
+      get { return PreProcessingData.Columns; }
+      set { }
     }
 
     public IEnumerable<string> ColumnNames {
-      get {
-        return PreProcessingData.VariableNames;
-      }
-      set {
-
-      }
+      get { return PreProcessingData.VariableNames; }
+      set { }
     }
 
     public IEnumerable<string> RowNames {
-      get {
-        return Enumerable.Range(1, Rows).Select(n => n.ToString());
-      }
-      set {
-        throw new NotSupportedException();
-      }
+      get { return Enumerable.Range(1, Rows).Select(n => n.ToString()); }
+      set { throw new NotSupportedException(); }
     }
 
     public bool SortableView {
-      get {
-        return true;
-      }
-      set {
-        throw new NotSupportedException();
-      }
+      get { return true; }
+      set { throw new NotSupportedException(); }
     }
 
@@ -91,10 +70,8 @@
     }
 
-
     public IDictionary<int, IList<int>> Selection {
       get { return PreProcessingData.Selection; }
       set { PreProcessingData.Selection = value; }
     }
-
 
     public DataGridContent(ITransactionalPreprocessingData preProcessingData, ManipulationLogic theManipulationLogic, FilterLogic theFilterLogic) {
@@ -137,5 +114,4 @@
     }
 
-
     #region unused stuff/not implemented but necessary due to IStringConvertibleMatrix
 #pragma warning disable 0067
@@ -154,8 +130,6 @@
     public event EventHandler<EventArgs<int, int>> ItemChanged;
     public event EventHandler Reset;
-
 #pragma warning restore 0067
     #endregion
-
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/FilterContent.cs	(revision 15242)
@@ -28,33 +28,17 @@
   [Item("Filter", "Represents the filter grid.")]
   public class FilterContent : Item, IViewShortcut {
-
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Filter; }
     }
 
-    private ICheckedItemCollection<IFilter> filters = new CheckedItemCollection<IFilter>();
-
     public FilterLogic FilterLogic { get; private set; }
 
-    public ICheckedItemCollection<IFilter> Filters {
-      get {
-        return this.filters;
-      }
-      set {
-        this.filters = value;
-      }
-    }
+    public ICheckedItemCollection<IFilter> Filters { get; private set; }
 
-    private bool isAndCombination = true;
-    public bool IsAndCombination {
-      get {
-        return this.isAndCombination;
-      }
-      set {
-        this.isAndCombination = value;
-      }
-    }
+    public bool IsAndCombination { get; set; }
 
     public FilterContent(FilterLogic filterLogic) {
+      Filters = new CheckedItemCollection<IFilter>();
+      IsAndCombination = true;
       FilterLogic = filterLogic;
     }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/HistogramContent.cs	(revision 15242)
@@ -20,7 +20,8 @@
 #endregion
 
-using System.Collections.Generic;
+using System;
 using System.Drawing;
 using System.Linq;
+using HeuristicLab.Analysis;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,22 +30,19 @@
   [Item("Histogram", "Represents the histogram grid.")]
   public class HistogramContent : PreprocessingChartContent {
-
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Statistics; }
     }
-    private const int MAX_DISTINCT_VALUES_FOR_CLASSIFCATION = 20;
 
-    private int classifierVariableIndex = 0;
+    public string GroupingVariableName { get; set; }
 
-    public int ClassifierVariableIndex {
-      get { return this.classifierVariableIndex; }
-      set { this.classifierVariableIndex = value; }
-    }
-    public bool IsDetailedChartViewEnabled { get; set; }
+    public int Bins { get; set; }
+    public bool ExactBins { get; set; }
 
+    public LegendOrder Order { get; set; }
 
     public HistogramContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
-      AllInOneMode = false;
+      Bins = 10;
+      ExactBins = false;
     }
 
@@ -56,19 +54,47 @@
     }
 
-    public IEnumerable<string> GetVariableNamesForHistogramClassification() {
-      List<string> doubleVariableNames = new List<string>();
+    public static DataTable CreateHistogram(IFilteredPreprocessingData preprocessingData, string variableName, string groupingVariableName, DataTableVisualProperties.DataTableHistogramAggregation aggregation, LegendOrder legendOrder = LegendOrder.Alphabetically) {
+      var dataTable = new DataTable {
+        VisualProperties = { Title = variableName, HistogramAggregation = aggregation },
+      };
 
-      //only return variable names from type double
-      for (int i = 0; i < PreprocessingData.Columns; ++i) {
-        if (PreprocessingData.VariableHasType<double>(i)) {
-          double distinctValueCount = PreprocessingData.GetValues<double>(i).GroupBy(x => x).Count();
-          bool distinctValuesOk = distinctValueCount <= MAX_DISTINCT_VALUES_FOR_CLASSIFCATION;
-          if (distinctValuesOk)
-            doubleVariableNames.Add(PreprocessingData.GetVariableName(i));
-        }
+      if (string.IsNullOrEmpty(groupingVariableName)) {
+        var row = PreprocessingChartContent.CreateDataRow(preprocessingData, variableName, DataRowVisualProperties.DataRowChartType.Histogram);
+        row.VisualProperties.IsVisibleInLegend = false;
+        dataTable.Rows.Add(row);
+        return dataTable;
       }
-      return doubleVariableNames;
+
+      int variableIndex = preprocessingData.GetColumnIndex(variableName);
+      var variableValues = preprocessingData.GetValues<double>(variableIndex);
+      int groupVariableIndex = preprocessingData.GetColumnIndex(groupingVariableName);
+      var groupingValues = Enumerable.Empty<string>();
+
+      if (preprocessingData.VariableHasType<double>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<double>(groupVariableIndex).Select(x => x.ToString());
+      } else if (preprocessingData.VariableHasType<string>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<string>(groupVariableIndex);
+      } else if (preprocessingData.VariableHasType<DateTime>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<DateTime>(groupVariableIndex).Select(x => x.ToString());
+      }
+
+      var groups = groupingValues.Zip(variableValues, Tuple.Create).GroupBy(t => t.Item1, t => t.Item2);
+
+      if (legendOrder == LegendOrder.Alphabetically)
+        groups = groups.OrderBy(x => x.Key, new NaturalStringComparer());
+
+      foreach (var group in groups) {
+        var classRow = new DataRow {
+          Name = group.Key,
+          VisualProperties = {
+              ChartType = DataRowVisualProperties.DataRowChartType.Histogram,
+              IsVisibleInLegend = !string.IsNullOrEmpty(groupingVariableName)
+            }
+        };
+        classRow.Values.AddRange(group);
+        dataTable.Rows.Add(classRow);
+      }
+      return dataTable;
     }
-
   }
 }
Index: able/HeuristicLab.DataPreprocessing/3.4/Content/IViewChartShortcut.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/IViewChartShortcut.cs	(revision 15241)
+++ 	(revision )
@@ -1,26 +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
-
-
-namespace HeuristicLab.DataPreprocessing {
-  public interface IViewChartShortcut : IViewShortcut {
-  }
-}
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/LineChartContent.cs	(revision 15242)
@@ -26,6 +26,7 @@
 namespace HeuristicLab.DataPreprocessing {
 
-  [Item("LineChart", "Represents the line chart grid.")]
+  [Item("Line Chart", "Represents the line chart grid.")]
   public class LineChartContent : PreprocessingChartContent {
+    public bool AllInOneMode { get; set; }
 
     public static new Image StaticItemImage {
@@ -35,8 +36,10 @@
     public LineChartContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
+      AllInOneMode = true;
     }
 
     public LineChartContent(LineChartContent content, Cloner cloner)
       : base(content, cloner) {
+      this.AllInOneMode = content.AllInOneMode;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/ManipulationContent.cs	(revision 15242)
@@ -28,21 +28,16 @@
   [Item("Manipulation", "Represents the available manipulations on a data set.")]
   public class ManipulationContent : Item, IViewShortcut {
-
-    private ManipulationLogic manipulationLogic;
-    private SearchLogic searchLogic;
-    private FilterLogic filterLogic;
-
-    public ManipulationLogic ManipulationLogic { get { return manipulationLogic; } }
-    public SearchLogic SearchLogic { get { return searchLogic; } }
-    public FilterLogic FilterLogic { get { return filterLogic; } }
-
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
     }
 
-    public ManipulationContent(ManipulationLogic theManipulationLogic, SearchLogic theSearchLogic, FilterLogic theFilterLogic) {
-      manipulationLogic = theManipulationLogic;
-      searchLogic = theSearchLogic;
-      filterLogic = theFilterLogic;
+    public ManipulationLogic ManipulationLogic { get; private set; }
+    public SearchLogic SearchLogic { get; private set; }
+    public FilterLogic FilterLogic { get; private set; }
+
+    public ManipulationContent(ManipulationLogic manipulationLogic, SearchLogic searchLogic, FilterLogic filterLogic) {
+      ManipulationLogic = manipulationLogic;
+      SearchLogic = searchLogic;
+      FilterLogic = filterLogic;
     }
 
@@ -52,6 +47,4 @@
       return new ManipulationContent(this, cloner);
     }
-
-
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs	(revision 15242)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/MultiScatterPlotContent.cs	(revision 15242)
@@ -0,0 +1,46 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Multi Scatter Plot", "Represents a multi scatter plot.")]
+  public class MultiScatterPlotContent : ScatterPlotContent {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    public MultiScatterPlotContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+    }
+
+    public MultiScatterPlotContent(MultiScatterPlotContent content, Cloner cloner)
+      : base(content, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiScatterPlotContent(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingChartContent.cs	(revision 15242)
@@ -23,6 +23,8 @@
 using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -30,22 +32,28 @@
 namespace HeuristicLab.DataPreprocessing {
   [Item("PreprocessingChart", "Represents a preprocessing chart.")]
-  public class PreprocessingChartContent : Item, IViewChartShortcut {
-    public static new Image StaticItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.PieChart; }
+  public class PreprocessingChartContent : Item, IViewShortcut {
+    public enum LegendOrder {
+      Alphabetically,
+      Appearance
     }
 
-    private bool allInOneMode = true;
-    public bool AllInOneMode {
-      get { return this.allInOneMode; }
-      set { this.allInOneMode = value; }
+    public static new Image StaticItemImage {
+      get { return VSImageLibrary.PieChart; }
     }
 
     private ICheckedItemList<StringValue> variableItemList = null;
     public ICheckedItemList<StringValue> VariableItemList {
-      get { return this.variableItemList; }
-      set { this.variableItemList = value; }
+      get {
+        if (variableItemList == null)
+          variableItemList = CreateVariableItemList(PreprocessingData);
+        return this.variableItemList;
+      }
     }
 
     public IFilteredPreprocessingData PreprocessingData { get; private set; }
+    public event DataPreprocessingChangedEventHandler Changed {
+      add { PreprocessingData.Changed += value; }
+      remove { PreprocessingData.Changed -= value; }
+    }
 
     public PreprocessingChartContent(IFilteredPreprocessingData preprocessingData) {
@@ -55,5 +63,4 @@
     public PreprocessingChartContent(PreprocessingChartContent content, Cloner cloner)
       : base(content, cloner) {
-      this.allInOneMode = content.allInOneMode;
       this.PreprocessingData = content.PreprocessingData;
       this.variableItemList = cloner.Clone<ICheckedItemList<StringValue>>(variableItemList);
@@ -63,7 +70,10 @@
     }
 
+    public DataRow CreateDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
+      return CreateDataRow(PreprocessingData, variableName, chartType);
+    }
 
-    public DataRow CreateDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
-      IList<double> values = PreprocessingData.GetValues<double>(PreprocessingData.GetColumnIndex(variableName));
+    public static DataRow CreateDataRow(IFilteredPreprocessingData preprocessingData, string variableName, DataRowVisualProperties.DataRowChartType chartType) {
+      IList<double> values = preprocessingData.GetValues<double>(preprocessingData.GetColumnIndex(variableName));
       DataRow row = new DataRow(variableName, "", values);
       row.VisualProperties.ChartType = chartType;
@@ -71,73 +81,31 @@
     }
 
-    public List<DataRow> CreateAllDataRows(DataRowVisualProperties.DataRowChartType chartType) {
-      List<DataRow> dataRows = new List<DataRow>();
-      foreach (var name in PreprocessingData.GetDoubleVariableNames())
-        dataRows.Add(CreateDataRow(name, chartType));
-      return dataRows;
-    }
-
-    public DataRow CreateSelectedDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
-
-      IDictionary<int, IList<int>> selection = PreprocessingData.Selection;
-      int variableIndex = PreprocessingData.GetColumnIndex(variableName);
-
-      if (selection.Keys.Contains(variableIndex)) {
-        List<int> selectedIndices = new List<int>(selection[variableIndex]);
-        //need selection with more than 1 value
-        if (selectedIndices.Count < 2)
-          return null;
-
-        selectedIndices.Sort();
-        int start = selectedIndices[0];
-        int end = selectedIndices[selectedIndices.Count - 1];
-
-        DataRow rowSelect = CreateDataRowRange(variableName, start, end, chartType);
-        return rowSelect;
-      } else
-        return null;
-    }
-
-    public DataRow CreateDataRowRange(string variableName, int start, int end, DataRowVisualProperties.DataRowChartType chartType) {
-      IList<double> values = PreprocessingData.GetValues<double>(PreprocessingData.GetColumnIndex(variableName));
-      IList<double> valuesRange = new List<double>();
-      for (int i = 0; i < values.Count; i++) {
-        if (i >= start && i <= end)
-          valuesRange.Add(values[i]);
-        else
-          valuesRange.Add(Double.NaN);
-      }
-
-      DataRow row = new DataRow(variableName, "", valuesRange);
-      row.VisualProperties.ChartType = chartType;
-      return row;
-    }
-
-    public List<DataRow> CreateAllSelectedDataRows(DataRowVisualProperties.DataRowChartType chartType) {
-      List<DataRow> dataRows = new List<DataRow>();
-      foreach (var name in PreprocessingData.GetDoubleVariableNames()) {
-        DataRow row = CreateSelectedDataRow(name, chartType);
-        if (row != null)
-          dataRows.Add(row);
-      }
-      return dataRows;
-    }
-
-
-    public ICheckedItemList<StringValue> CreateVariableItemList(IList<string> checkedItems = null) {
-      if (checkedItems == null) checkedItems = new string[0];
+    private static ICheckedItemList<StringValue> CreateVariableItemList(IPreprocessingData preprocessingData) {
       ICheckedItemList<StringValue> itemList = new CheckedItemList<StringValue>();
-      foreach (string name in PreprocessingData.GetDoubleVariableNames()) {
+      foreach (string name in preprocessingData.GetDoubleVariableNames()) {
         var n = new StringValue(name);
-        itemList.Add(n, checkedItems.Contains(name));
+        bool isInputTarget = preprocessingData.InputVariables.Contains(name) || preprocessingData.TargetVariable == name;
+        itemList.Add(n, isInputTarget);
       }
       return new ReadOnlyCheckedItemList<StringValue>(itemList);
     }
 
-    public event DataPreprocessingChangedEventHandler Changed {
-      add { PreprocessingData.Changed += value; }
-      remove { PreprocessingData.Changed -= value; }
+    public static IEnumerable<string> GetVariableNamesForGrouping(IPreprocessingData preprocessingData, int maxDistinctValues = 20) {
+      var variableNames = new List<string>();
+
+      for (int i = 0; i < preprocessingData.Columns; ++i) {
+        int distinctValues = Int32.MaxValue;
+        if (preprocessingData.VariableHasType<double>(i))
+          distinctValues = preprocessingData.GetValues<double>(i).GroupBy(x => x).Count();
+        else if (preprocessingData.VariableHasType<string>(i))
+          distinctValues = preprocessingData.GetValues<string>(i).GroupBy(x => x).Count();
+        else if (preprocessingData.VariableHasType<DateTime>(i))
+          distinctValues = preprocessingData.GetValues<DateTime>(i).GroupBy(x => x).Count();
+
+        if (distinctValues <= maxDistinctValues)
+          variableNames.Add(preprocessingData.GetVariableName(i));
+      }
+      return variableNames;
     }
-
   }
 }
Index: able/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingDataTable.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/PreprocessingDataTable.cs	(revision 15241)
+++ 	(revision )
@@ -1,58 +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 HeuristicLab.Analysis;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.DataPreprocessing {
-  [Item("PreprossingDataTable", "A table of data values.")]
-  public class PreprocessingDataTable : DataTable {
-
-    public PreprocessingDataTable()
-      : base() {
-      SelectedRows = new NamedItemCollection<DataRow>();
-    }
-    public PreprocessingDataTable(string name)
-      : base(name) {
-      SelectedRows = new NamedItemCollection<DataRow>();
-    }
-
-    protected PreprocessingDataTable(PreprocessingDataTable original, Cloner cloner)
-      : base(original, cloner) {
-      this.selectedRows = cloner.Clone(original.selectedRows);
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PreprocessingDataTable(this, cloner);
-    }
-
-    private NamedItemCollection<DataRow> selectedRows;
-    public NamedItemCollection<DataRow> SelectedRows {
-      get { return selectedRows; }
-      private set {
-        if (selectedRows != null) throw new InvalidOperationException("Rows already set");
-        selectedRows = value;
-      }
-    }
-
-  }
-}
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 15242)
@@ -20,71 +20,86 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
-using System.Drawing;
 using System.Linq;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
-using HeuristicLab.Core;
+using HeuristicLab.Visualization.ChartControlsExtensions;
 
 namespace HeuristicLab.DataPreprocessing {
 
-  [Item("ScatterPlot", "Represents a scatter plot.")]
-  public class ScatterPlotContent : PreprocessingChartContent {
+  public abstract class ScatterPlotContent : PreprocessingChartContent {
+    public string GroupingVariable { get; set; }
 
-    public string SelectedXVariable { get; set; }
-    public string SelectedYVariable { get; set; }
-    public string SelectedColorVariable { get; set; }
-
-    public ScatterPlotContent(IFilteredPreprocessingData preprocessingData)
+    protected ScatterPlotContent(IFilteredPreprocessingData preprocessingData)
       : base(preprocessingData) {
     }
 
-    public ScatterPlotContent(ScatterPlotContent content, Cloner cloner)
+    protected ScatterPlotContent(ScatterPlotContent content, Cloner cloner)
       : base(content, cloner) {
-      this.SelectedXVariable = content.SelectedXVariable;
-      this.SelectedYVariable = content.SelectedYVariable;
-      this.SelectedColorVariable = content.SelectedColorVariable;
     }
 
-    public static new Image StaticItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ScatterPlotContent(this, cloner);
-    }
-
-    public ScatterPlot CreateScatterPlot(string variableNameX, string variableNameY, string variableNameColor = "-") {
+    public static ScatterPlot CreateScatterPlot(IFilteredPreprocessingData preprocessingData, string variableNameX, string variableNameY, string variableNameGroup = "-", LegendOrder legendOrder = LegendOrder.Alphabetically) {
       ScatterPlot scatterPlot = new ScatterPlot();
 
-      IList<double> xValues = PreprocessingData.GetValues<double>(PreprocessingData.GetColumnIndex(variableNameX));
-      IList<double> yValues = PreprocessingData.GetValues<double>(PreprocessingData.GetColumnIndex(variableNameY));
-      if (variableNameColor == null || variableNameColor == "-") {
-        List<Point2D<double>> points = new List<Point2D<double>>();
+      IList<double> xValues = preprocessingData.GetValues<double>(preprocessingData.GetColumnIndex(variableNameX));
+      IList<double> yValues = preprocessingData.GetValues<double>(preprocessingData.GetColumnIndex(variableNameY));
 
-        for (int i = 0; i < xValues.Count; i++) {
-          Point2D<double> point = new Point2D<double>(xValues[i], yValues[i]);
-          points.Add(point);
-        }
+      var points = xValues.Zip(yValues, (x, y) => new Point2D<double>(x, y)).ToList();
+      var validPoints = points.Where(p => !double.IsNaN(p.X) && !double.IsNaN(p.Y) && !double.IsInfinity(p.X) && !double.IsInfinity(p.Y)).ToList();
+      if (validPoints.Any()) {
+        try {
+          double axisMin, axisMax, axisInterval;
+          ChartUtil.CalculateOptimalAxisInterval(validPoints.Min(p => p.X), validPoints.Max(p => p.X), out axisMin, out axisMax, out axisInterval);
+          scatterPlot.VisualProperties.XAxisMinimumAuto = false;
+          scatterPlot.VisualProperties.XAxisMaximumAuto = false;
+          scatterPlot.VisualProperties.XAxisMinimumFixedValue = axisMin;
+          scatterPlot.VisualProperties.XAxisMaximumFixedValue = axisMax;
+        } catch (ArgumentOutOfRangeException) { } // error during CalculateOptimalAxisInterval 
+        try {
+          double axisMin, axisMax, axisInterval;
+          ChartUtil.CalculateOptimalAxisInterval(validPoints.Min(p => p.Y), validPoints.Max(p => p.Y), out axisMin, out axisMax, out axisInterval);
+          scatterPlot.VisualProperties.YAxisMinimumAuto = false;
+          scatterPlot.VisualProperties.YAxisMaximumAuto = false;
+          scatterPlot.VisualProperties.YAxisMinimumFixedValue = axisMin;
+          scatterPlot.VisualProperties.YAxisMaximumFixedValue = axisMax;
+        } catch (ArgumentOutOfRangeException) { } // error during CalculateOptimalAxisInterval 
+      }
 
-        ScatterPlotDataRow scdr = new ScatterPlotDataRow(variableNameX + " - " + variableNameY, "", points);
+
+      //No Grouping
+      if (string.IsNullOrEmpty(variableNameGroup) || variableNameGroup == "-") {
+        ScatterPlotDataRow scdr = new ScatterPlotDataRow(variableNameX + " - " + variableNameY, "", validPoints);
+        scdr.VisualProperties.IsVisibleInLegend = false;
         scatterPlot.Rows.Add(scdr);
+        return scatterPlot;
+      }
 
-      } else {
-        var colorValues = PreprocessingData.GetValues<double>(PreprocessingData.GetColumnIndex(variableNameColor));
-        var data = xValues.Zip(yValues, (x, y) => new { x, y }).Zip(colorValues, (v, c) => new { v.x, v.y, c }).ToList();
-        var gradients = ColorGradient.Colors;
-        int curGradient = 0;
-        int numColors = colorValues.Distinct().Count();
-        foreach (var colorValue in colorValues.Distinct()) {
-          var values = data.Where(x => x.c == colorValue);
-          var row = new ScatterPlotDataRow(
-            variableNameX + " - " + variableNameY + " (" + colorValue + ")",
-            "",
-            values.Select(v => new Point2D<double>(v.x, v.y)),
-            new ScatterPlotDataRowVisualProperties() { Color = gradients[curGradient] });
-          curGradient += gradients.Count / numColors;
-          scatterPlot.Rows.Add(row);
-        }
+      //Grouping
+      int groupVariableIndex = preprocessingData.GetColumnIndex(variableNameGroup);
+      var groupingValues = Enumerable.Empty<string>();
+
+      if (preprocessingData.VariableHasType<double>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<double>(groupVariableIndex).Select(x => x.ToString());
+      } else if (preprocessingData.VariableHasType<string>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<string>(groupVariableIndex);
+      } else if (preprocessingData.VariableHasType<DateTime>(groupVariableIndex)) {
+        groupingValues = preprocessingData.GetValues<DateTime>(groupVariableIndex).Select(x => x.ToString());
+      }
+      var groups = groupingValues.Zip(validPoints, Tuple.Create).GroupBy(t => t.Item1, t => t.Item2);
+
+      if (legendOrder == LegendOrder.Alphabetically)
+        groups = groups.OrderBy(x => x.Key, new NaturalStringComparer());
+
+      foreach (var group in groups) {
+        var scdr = new ScatterPlotDataRow {
+          Name = group.Key,
+          VisualProperties = {
+            IsVisibleInLegend = true,
+            PointSize = 6
+          }
+        };
+        scdr.Points.AddRange(group);
+        scatterPlot.Rows.Add(scdr);
       }
       return scatterPlot;
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs	(revision 15242)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/SingleScatterPlotContent.cs	(revision 15242)
@@ -0,0 +1,52 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.DataPreprocessing {
+
+  [Item("Scatter Plot", "Represents a scatter plot.")]
+  public class SingleScatterPlotContent : ScatterPlotContent {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
+    }
+
+    public string SelectedXVariable { get; set; }
+    public string SelectedYVariable { get; set; }
+
+    public SingleScatterPlotContent(IFilteredPreprocessingData preprocessingData)
+      : base(preprocessingData) {
+    }
+
+    public SingleScatterPlotContent(SingleScatterPlotContent content, Cloner cloner)
+      : base(content, cloner) {
+      this.SelectedXVariable = content.SelectedXVariable;
+      this.SelectedYVariable = content.SelectedYVariable;
+      this.GroupingVariable = content.GroupingVariable;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleScatterPlotContent(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/StatisticsContent.cs	(revision 15242)
@@ -27,21 +27,18 @@
   [Item("Statistics", "Represents the statistics grid.")]
   public class StatisticsContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
+    }
 
-    private readonly StatisticsLogic statisticsLogic;
-    public StatisticsContent(StatisticsLogic theStatisticsLogic) {
-      statisticsLogic = theStatisticsLogic;
+    public ITransactionalPreprocessingData PreprocessingData { get; private set; }
+    public StatisticsLogic StatisticsLogic { get; private set; }
+
+    public StatisticsContent(ITransactionalPreprocessingData preProcessingData, StatisticsLogic statisticsLogic) {
+      PreprocessingData = preProcessingData;
+      StatisticsLogic = statisticsLogic;
     }
 
     public StatisticsContent(StatisticsContent content, Cloner cloner)
       : base(content, cloner) {
-
-    }
-
-    public StatisticsLogic StatisticsLogic {
-      get { return statisticsLogic; }
-    }
-
-    public static new Image StaticItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.Object; }
     }
 
@@ -51,8 +48,7 @@
 
     public event DataPreprocessingChangedEventHandler Changed {
-      add { statisticsLogic.Changed += value; }
-      remove { statisticsLogic.Changed -= value; }
+      add { StatisticsLogic.Changed += value; }
+      remove { StatisticsLogic.Changed -= value; }
     }
-
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Content/TransformationContent.cs	(revision 15242)
@@ -28,4 +28,7 @@
   [Item("Transformation", "Represents the transformation grid.")]
   public class TransformationContent : Item, IViewShortcut {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
+    }
 
     public IPreprocessingData Data { get; private set; }
@@ -33,8 +36,4 @@
 
     public ICheckedItemList<ITransformation> CheckedTransformationList { get; private set; }
-
-    public static new Image StaticItemImage {
-      get { return HeuristicLab.Common.Resources.VSImageLibrary.Method; }
-    }
 
     public TransformationContent(IPreprocessingData data, FilterLogic filterLogic) {
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 15242)
@@ -271,5 +271,4 @@
 
     #region IPreprocessingData Members
-
     public bool Validate(string value, out string errorMessage, int columnIndex) {
       return originalData.Validate(value, out errorMessage, columnIndex);
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 15242)
@@ -27,5 +27,4 @@
 
 namespace HeuristicLab.DataPreprocessing {
-
   public interface IPreprocessingData : INamedItem {
     T GetCell<T>(int columnIndex, int rowIndex);
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Data/ITransactionalPreprocessingData.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Data/ITransactionalPreprocessingData.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Data/ITransactionalPreprocessingData.cs	(revision 15242)
@@ -24,5 +24,4 @@
 namespace HeuristicLab.DataPreprocessing {
   public interface ITransactionalPreprocessingData : IPreprocessingData {
-
     event DataPreprocessingChangedEventHandler Changed;
 
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 15242)
@@ -33,12 +33,8 @@
   [Item("PreprocessingData", "Represents data used for preprocessing.")]
   public abstract class PreprocessingData : NamedItem, IPreprocessingData {
-
     public IntRange TrainingPartition { get; set; }
     public IntRange TestPartition { get; set; }
 
-    protected IList<ITransformation> transformations;
-    public IList<ITransformation> Transformations {
-      get { return transformations; }
-    }
+    public IList<ITransformation> Transformations { get; protected set; }
 
     protected IList<IList> variableValues;
@@ -85,5 +81,5 @@
       TrainingPartition = (IntRange)original.TrainingPartition.Clone(cloner);
       TestPartition = (IntRange)original.TestPartition.Clone(cloner);
-      transformations = new List<ITransformation>(original.transformations.Select(cloner.Clone));
+      Transformations = new List<ITransformation>(original.Transformations.Select(cloner.Clone));
 
       InputVariables = new List<string>(original.InputVariables);
@@ -97,5 +93,5 @@
       Name = "Preprocessing Data";
 
-      transformations = new List<ITransformation>();
+      Transformations = new List<ITransformation>();
       selection = new Dictionary<int, IList<int>>();
 
@@ -166,5 +162,4 @@
 
     #region IPreprocessingData Members
-
     public abstract T GetCell<T>(int columnIndex, int rowIndex);
 
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Data/TransactionalPreprocessingData.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Data/TransactionalPreprocessingData.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Data/TransactionalPreprocessingData.cs	(revision 15242)
@@ -33,5 +33,4 @@
   [Item("PreprocessingData", "Represents data used for preprocessing.")]
   public class TransactionalPreprocessingData : PreprocessingData, ITransactionalPreprocessingData {
-
     private class Snapshot {
       public IList<IList> VariableValues { get; set; }
@@ -70,5 +69,5 @@
         TrainingPartition = new IntRange(TrainingPartition.Start, TrainingPartition.End),
         TestPartition = new IntRange(TestPartition.Start, TestPartition.End),
-        Transformations = new List<ITransformation>(transformations),
+        Transformations = new List<ITransformation>(Transformations),
         ChangedType = changedType,
         ChangedColumn = column,
@@ -83,13 +82,10 @@
 
     #region NamedItem abstract Member Implementations
-
     public override IDeepCloneable Clone(Cloner cloner) {
       return new TransactionalPreprocessingData(this, cloner);
     }
-
     #endregion
 
     #region Overridden IPreprocessingData Members
-
     public override T GetCell<T>(int columnIndex, int rowIndex) {
       return (T)variableValues[columnIndex][rowIndex];
@@ -216,5 +212,4 @@
     }
 
-
     public override void InsertRow(int rowIndex) {
       SaveSnapshot(DataPreprocessingChangedEventType.DeleteRow, -1, rowIndex);
@@ -346,5 +341,4 @@
 
     #region TransactionalPreprocessingData members
-
     public bool IsUndoAvailable {
       get { return undoHistory.Count > 0; }
@@ -358,5 +352,5 @@
         TrainingPartition = previousSnapshot.TrainingPartition;
         TestPartition = previousSnapshot.TestPartition;
-        transformations = previousSnapshot.Transformations;
+        Transformations = previousSnapshot.Transformations;
         undoHistory.Remove(previousSnapshot);
         OnChanged(previousSnapshot.ChangedType,
@@ -384,5 +378,4 @@
       OnChanged(@event, -1, -1);
     }
-
     #endregion
   }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/HeuristicLab.DataPreprocessing-3.4.csproj	(revision 15242)
@@ -18,5 +18,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -28,5 +28,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -36,5 +36,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
     <PlatformTarget>x64</PlatformTarget>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <Prefer32Bit>false</Prefer32Bit>
@@ -42,5 +42,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
     <PlatformTarget>x64</PlatformTarget>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
     <Optimize>true</Optimize>
     <Prefer32Bit>false</Prefer32Bit>
@@ -48,5 +48,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -57,5 +57,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -78,4 +78,6 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Content\MultiScatterPlotContent.cs" />
+    <Compile Include="Content\SingleScatterPlotContent.cs" />
     <Compile Include="Content\ScatterPlotContent.cs" />
     <Compile Include="Content\DataCompletenessChartContent.cs" />
@@ -84,6 +86,4 @@
     <Compile Include="Content\PreprocessingChartContent.cs" />
     <Compile Include="Data\PreprocessingData.cs" />
-    <Compile Include="Content\PreprocessingDataTable.cs" />
-    <Compile Include="Content\IViewChartShortcut.cs" />
     <Compile Include="Data\IFilteredPreprocessingData.cs" />
     <Compile Include="Content\CorrelationMatrixContent.cs" />
@@ -118,35 +118,35 @@
   <ItemGroup>
     <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
-      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project>
       <Name>HeuristicLab.Analysis-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
-      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
       <Name>HeuristicLab.Collections-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
-      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
       <Name>HeuristicLab.Common.Resources-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
-      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
       <Name>HeuristicLab.Common-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
-      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
       <Name>HeuristicLab.Core-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
-      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
       <Name>HeuristicLab.Data-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
-      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
       <Private>False</Private>
@@ -158,10 +158,10 @@
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
-      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
       <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis\3.4\HeuristicLab.Problems.DataAnalysis-3.4.csproj">
-      <Project>{df87c13e-a889-46ff-8153-66dcaa8c5674}</Project>
+      <Project>{DF87C13E-A889-46FF-8153-66DCAA8C5674}</Project>
       <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
       <Private>False</Private>
@@ -170,4 +170,9 @@
       <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
       <Name>HeuristicLab.Random-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Visualization.ChartControlsExtensions\3.3\HeuristicLab.Visualization.ChartControlsExtensions-3.3.csproj">
+      <Project>{315BDA09-3F4F-49B3-9790-B37CFC1C5750}</Project>
+      <Name>HeuristicLab.Visualization.ChartControlsExtensions-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/ComparisonFilter.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/ComparisonFilter.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Logic/Filter/ComparisonFilter.cs	(revision 15242)
@@ -30,5 +30,4 @@
   [Item("ComparisonFilter", "A filter which compares the member of the preprocessing data with the constraint data.")]
   public class ComparisonFilter : ComparisonConstraint, IFilter {
-
     public override string ItemName {
       get { return "ComparisonFilter"; }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Logic/FilterLogic.cs	(revision 15242)
@@ -27,11 +27,8 @@
 namespace HeuristicLab.DataPreprocessing {
   public class FilterLogic {
-
     public IFilteredPreprocessingData PreprocessingData { get; private set; }
 
     public bool IsFiltered {
-      get {
-        return PreprocessingData.IsFiltered;
-      }
+      get { return PreprocessingData.IsFiltered; }
     }
 
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Logic/ManipulationLogic.cs	(revision 15242)
@@ -40,6 +40,6 @@
     }
 
-    public ManipulationLogic(ITransactionalPreprocessingData _prepocessingData, SearchLogic theSearchLogic, StatisticsLogic theStatisticsLogic) {
-      preprocessingData = _prepocessingData;
+    public ManipulationLogic(ITransactionalPreprocessingData preprocessingData, SearchLogic theSearchLogic, StatisticsLogic theStatisticsLogic) {
+      this.preprocessingData = preprocessingData;
       searchLogic = theSearchLogic;
       statisticsLogic = theStatisticsLogic;
@@ -109,11 +109,4 @@
       preprocessingData.InTransaction(() => {
         foreach (var column in cells) {
-          int countValues = 0;
-          if (preprocessingData.VariableHasType<double>(column.Key)) {
-            countValues = preprocessingData.GetValues<double>(column.Key).Count();
-          } else if (preprocessingData.VariableHasType<DateTime>(column.Key)) {
-            countValues = preprocessingData.GetValues<DateTime>(column.Key).Count();
-          }
-
           IList<Tuple<int, int>> startEndings = GetStartAndEndingsForInterpolation(column);
           foreach (var tuple in startEndings) {
@@ -291,5 +284,4 @@
 
     public List<int> RowsWithMissingValuesGreater(double percent) {
-
       List<int> rows = new List<int>();
 
@@ -305,5 +297,4 @@
 
     public List<int> ColumnsWithMissingValuesGreater(double percent) {
-
       List<int> columns = new List<int>();
       for (int i = 0; i < preprocessingData.Columns; ++i) {
@@ -318,5 +309,4 @@
 
     public List<int> ColumnsWithVarianceSmaller(double variance) {
-
       List<int> columns = new List<int>();
       for (int i = 0; i < preprocessingData.Columns; ++i) {
@@ -362,5 +352,4 @@
       });
     }
-
   }
 }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Logic/StatisticsLogic.cs	(revision 15242)
@@ -27,5 +27,4 @@
 namespace HeuristicLab.DataPreprocessing {
   public class StatisticsLogic {
-
     private readonly ITransactionalPreprocessingData preprocessingData;
     private readonly SearchLogic searchLogic;
Index: /stable/HeuristicLab.DataPreprocessing/3.4/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/Plugin.cs.frame	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/Plugin.cs.frame	(revision 15242)
@@ -34,8 +34,9 @@
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Data","3.3")]
-  [PluginDependency("HeuristicLab.Optimization", "3.3")]  
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   [PluginDependency("HeuristicLab.Problems.DataAnalysis","3.4")]
   [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Visualization.ChartControlsExtensions", "3.3")]
   public class HeuristicLabDataPreprocessingPlugin : PluginBase {
   }
Index: /stable/HeuristicLab.DataPreprocessing/3.4/PreprocessingContext.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/PreprocessingContext.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/PreprocessingContext.cs	(revision 15242)
@@ -32,5 +32,4 @@
   [StorableClass]
   public class PreprocessingContext : NamedItem, IStorableContent {
-
     public string Filename { get; set; }
 
Index: /stable/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15241)
+++ /stable/HeuristicLab.DataPreprocessing/3.4/ProblemDataCreator.cs	(revision 15242)
@@ -28,14 +28,13 @@
 namespace HeuristicLab.DataPreprocessing {
   public class ProblemDataCreator {
-
     private readonly PreprocessingContext context;
 
     private Dataset ExportedDataset {
-      get {
-        return context.Data.ExportToDataset();
-      }
+      get { return context.Data.ExportToDataset(); }
     }
 
-    private IList<ITransformation> Transformations { get { return context.Data.Transformations; } }
+    private IList<ITransformation> Transformations {
+      get { return context.Data.Transformations; }
+    }
 
     public ProblemDataCreator(PreprocessingContext context) {
