Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 14401)
@@ -98,4 +98,10 @@
   <ItemGroup>
     <Compile Include="DataPreprocessingMenuItem.cs" />
+    <Compile Include="PreprocessingChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PreprocessingChartView.Designer.cs">
+      <DependentUpon>PreprocessingChartView.cs</DependentUpon>
+    </Compile>
     <Compile Include="PreprocessingFeatureCorrelationView.cs">
       <SubType>UserControl</SubType>
@@ -202,9 +208,9 @@
     </Compile>
     <Compile Include="Plugin.cs" />
-    <Compile Include="PreprocessingChartView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="PreprocessingChartView.Designer.cs">
-      <DependentUpon>PreprocessingChartView.cs</DependentUpon>
+    <Compile Include="PreprocessingCheckedVariablesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PreprocessingCheckedVariablesView.Designer.cs">
+      <DependentUpon>PreprocessingCheckedVariablesView.cs</DependentUpon>
     </Compile>
     <Compile Include="PreprocessingCheckedItemListView.cs">
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.Designer.cs	(revision 14401)
@@ -45,28 +45,19 @@
     /// </summary>
     private void InitializeComponent() {
+      this.dataTableView = new HeuristicLab.DataPreprocessing.Views.PreprocessingDataTableView();
       this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
-      this.dataTableView = new HeuristicLab.DataPreprocessing.Views.PreprocessingDataTableView();
-      this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.checkedItemList = new HeuristicLab.DataPreprocessing.Views.PreprocessingCheckedItemListView();
-      this.tableLayoutPanel.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
       this.splitContainer.SuspendLayout();
+      this.tableLayoutPanel.SuspendLayout();
       this.SuspendLayout();
       // 
-      // tableLayoutPanel
+      // splitContainer
       // 
-      this.tableLayoutPanel.ColumnCount = 1;
-      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
-      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";
-      this.tableLayoutPanel.RowCount = 1;
-      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
-      this.tableLayoutPanel.Size = new System.Drawing.Size(559, 403);
-      this.tableLayoutPanel.TabIndex = 6;
-      this.tableLayoutPanel.Layout += new System.Windows.Forms.LayoutEventHandler(this.tableLayoutPanel_Layout);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.tableLayoutPanel);
       // 
       // dataTableView
@@ -81,36 +72,25 @@
       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 = "";
       // 
-      // splitContainer
+      // tableLayoutPanel
       // 
-      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.splitContainer.Location = new System.Drawing.Point(0, 0);
-      this.splitContainer.Name = "splitContainer";
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.checkedItemList);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.tableLayoutPanel);
-      this.splitContainer.Size = new System.Drawing.Size(654, 403);
-      this.splitContainer.SplitterDistance = 91;
-      this.splitContainer.TabIndex = 7;
-      // 
-      // checkedItemList
-      // 
-      this.checkedItemList.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.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.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";
+      this.tableLayoutPanel.RowCount = 1;
+      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.TabIndex = 0;
+      this.tableLayoutPanel.Layout += new System.Windows.Forms.LayoutEventHandler(this.tableLayoutPanel_Layout);
       // 
       // PreprocessingChartView
@@ -118,12 +98,10 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.splitContainer);
       this.Name = "PreprocessingChartView";
-      this.Size = new System.Drawing.Size(654, 403);
-      this.tableLayoutPanel.ResumeLayout(false);
       this.splitContainer.Panel1.ResumeLayout(false);
       this.splitContainer.Panel2.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
+      this.tableLayoutPanel.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -132,8 +110,6 @@
     #endregion
 
-    private PreprocessingCheckedItemListView checkedItemList;
     private DataPreprocessing.Views.PreprocessingDataTableView dataTableView;
     private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
-    protected System.Windows.Forms.SplitContainer splitContainer;
   }
 }
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 14401)
@@ -26,5 +26,4 @@
 using HeuristicLab.Analysis;
 using HeuristicLab.Collections;
-using HeuristicLab.Core.Views;
 using HeuristicLab.Data;
 using HeuristicLab.MainForm;
@@ -33,10 +32,10 @@
   [View("Preprocessing Chart View")]
   [Content(typeof(PreprocessingChartContent), false)]
-  public partial class PreprocessingChartView : ItemView {
-
-    private PreprocessingDataTable dataTable;
-    private List<PreprocessingDataTable> dataTablePerVariable;
-    private List<DataRow> dataRows;
-    private List<DataRow> selectedDataRows;
+  public partial class PreprocessingChartView : PreprocessingCheckedVariablesView {
+
+    protected PreprocessingDataTable dataTable;
+    protected List<PreprocessingDataTable> dataTablePerVariable;
+    protected List<DataRow> dataRows;
+    protected List<DataRow> selectedDataRows;
 
     protected DataRowVisualProperties.DataRowChartType chartType;
@@ -46,4 +45,5 @@
     private const int FIXED_CHART_SIZE = 300;
     private const int MAX_TABLE_AUTO_SIZE_ROWS = 3;
+
 
     public IEnumerable<double> Classification { get; set; }
@@ -56,13 +56,45 @@
     }
 
-    //Variable selection changed
-    //Add or remove data row
-    private void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
-      tableLayoutPanel.SuspendLayout();
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        InitData();
+        GenerateChart();
+      }
+    }
+
+    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 checkedItem in Content.VariableItemList.CheckedItems) {
+        string variableName = Content.VariableItemList[checkedItem.Index].Value;
+        PreprocessingDataTable d = new PreprocessingDataTable(variableName);
+        DataRow row = GetDataRow(variableName);
+
+        if (row != null) {
+          //add row to data table
+          dataTable.Rows.Add(row);
+
+          //add row to data table per variable
+          d.Rows.Add(row);
+          dataTablePerVariable.Add(d);
+        }
+      }
+
+      UpdateSelection();
+    }
+
+    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;
 
         // not checked -> remove
-        if (!VariableIsChecked(variableName)) {
+        if (!IsVariableChecked(variableName)) {
           dataTableView.SetRowEnabled(variableName, false);
           dataTable.SelectedRows.Remove(variableName);
@@ -75,5 +107,5 @@
           PreprocessingDataTable pdt = new PreprocessingDataTable(variableName);
           pdt.Rows.Add(row);
-          // dataTablePerVariable does not contain unchecked variables => reduce insert position by number of unchecked variables to correct the index
+          // 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);
@@ -90,80 +122,4 @@
       if (Content != null && !Content.AllInOneMode)
         GenerateChart();
-      tableLayoutPanel.ResumeLayout(true);
-    }
-
-    private bool VariableIsChecked(string name) {
-      return Content.VariableItemList.CheckedItems.Any(x => x.Value.Value == name);
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.PreprocessingData.Changed += PreprocessingData_Changed;
-      Content.PreprocessingData.SelectionChanged += PreprocessingData_SelctionChanged;
-
-    }
-
-    protected override void DeregisterContentEvents() {
-      base.DeregisterContentEvents();
-      Content.PreprocessingData.Changed -= PreprocessingData_Changed;
-      Content.PreprocessingData.SelectionChanged -= PreprocessingData_SelctionChanged;
-    }
-
-    public new PreprocessingChartContent Content {
-      get { return (PreprocessingChartContent)base.Content; }
-      set { base.Content = value; }
-    }
-
-    private void InitData() {
-      if (Content.VariableItemList == null) {
-        Content.VariableItemList = Content.CreateVariableItemList();
-      } else {
-        var checkedNames = Content.VariableItemList.CheckedItems.Select(x => x.Value.Value);
-        Content.VariableItemList = Content.CreateVariableItemList(checkedNames);
-      }
-      checkedItemList.Content = Content.VariableItemList;
-
-      //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 checkedItem in Content.VariableItemList.CheckedItems) {
-        string variableName = Content.VariableItemList[checkedItem.Index].Value;
-        PreprocessingDataTable d = new PreprocessingDataTable(variableName);
-        DataRow row = GetDataRow(variableName);
-
-        if (row != null) {
-          //add row to data table
-          dataTable.Rows.Add(row);
-
-          //add row to data table per variable
-          d.Rows.Add(row);
-          dataTablePerVariable.Add(d);
-        }
-      }
-
-      UpdateSelection();
-    }
-
-    private void UpdateSelection() {
-
-      //update data table selection
-      selectedDataRows = Content.CreateAllSelectedDataRows(chartType);
-      dataTable.SelectedRows.Clear();
-      foreach (var selectedRow in selectedDataRows) {
-        if (VariableIsChecked(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);
-      }
-
     }
 
@@ -175,5 +131,4 @@
       return null;
     }
-
     private DataRow GetDataRow(string variableName) {
       foreach (DataRow row in dataRows) {
@@ -184,54 +139,7 @@
     }
 
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content != null) {
-        InitData();
-        Content.VariableItemList.CheckedItemsChanged += CheckedItemsChanged;
-        GenerateChart();
-      }
-    }
-
-    // TODO : handle also other changed events
-    void PreprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e) {
-      switch (e.Type) {
-        case DataPreprocessingChangedEventType.DeleteColumn:
-          RemoveVariable(Content.PreprocessingData.GetVariableName(e.Column));
-          break;
-        case DataPreprocessingChangedEventType.AddColumn:
-          AddVariable(Content.PreprocessingData.GetVariableName(e.Column));
-          break;
-        case DataPreprocessingChangedEventType.ChangeColumn:
-        case DataPreprocessingChangedEventType.ChangeItem:
-          UpdateDataForVariable(Content.PreprocessingData.GetVariableName(e.Column));
-          break;
-        case DataPreprocessingChangedEventType.DeleteRow:
-        case DataPreprocessingChangedEventType.AddRow:
-        case DataPreprocessingChangedEventType.Any:
-        default:
-          //TODO: test with transform
-          InitData();
-          GenerateChart();
-          break;
-      }
-    }
-
-    private void PreprocessingData_SelctionChanged(object sender, EventArgs e) {
-      UpdateSelection();
-    }
-
-    private void UpdateDataForVariable(string variableName) {
-      DataRow newRow = Content.CreateDataRow(variableName, chartType);
-      dataTable.Rows.Remove(variableName);
-      dataTable.Rows.Add(newRow);
-      DataTable dt = dataTablePerVariable.Find(x => x.Rows.Find(y => y.Name == variableName) != null);
-      if (dt != null) {
-        dt.Rows.Remove(variableName);
-        dt.Rows.Add(newRow);
-      }
-    }
-
-    // add variable to data table and item list
-    private void AddVariable(string name) {
+    #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);
@@ -239,5 +147,5 @@
       d.Rows.Add(row);
       dataTablePerVariable.Add(d);
-      Content.VariableItemList.Add(new StringValue(name));
+
       if (!Content.AllInOneMode)
         GenerateChart();
@@ -245,23 +153,30 @@
 
     // remove variable from data table and item list
-    private void RemoveVariable(string name) {
+    protected override void RemoveVariable(string name) {
+      base.RemoveVariable(name);
       dataTable.Rows.Remove(name);
       dataTablePerVariable.Remove(dataTablePerVariable.Find(x => (x.Name == name)));
 
-      StringValue stringValue = FindVariableItemList(name);
-      if (stringValue != null)
-        Content.VariableItemList.Remove(stringValue);
       if (!Content.AllInOneMode)
         GenerateChart();
     }
 
-    private StringValue FindVariableItemList(string name) {
-      foreach (StringValue stringValue in Content.VariableItemList) {
-        if (stringValue.Value == name)
-          return stringValue;
-      }
-      return null;
-    }
-
+    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);
+      }
+    }
+    protected override void ResetAllVariables() {
+      InitData();
+    }
+    #endregion
+
+    #region Generate Charts
     protected void GenerateChart() {
       ClearTableLayout();
@@ -270,15 +185,4 @@
       } else
         GenerateMultiChartLayout();
-    }
-
-    private void ClearTableLayout() {
-      //Clear out the existing controls
-      tableLayoutPanel.Controls.Clear();
-
-      //Clear out the existing row and column styles
-      tableLayoutPanel.ColumnStyles.Clear();
-      tableLayoutPanel.RowStyles.Clear();
-      tableLayoutPanel.AutoScroll = false;
-      tableLayoutPanel.AutoScroll = true;
     }
 
@@ -291,27 +195,4 @@
       dataTableView.Content = dataTable;
     }
-
-    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 GenerateMultiChartLayout() {
@@ -352,4 +233,24 @@
       }
     }
+    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) {
@@ -370,4 +271,14 @@
     }
 
+    protected void ClearTableLayout() {
+      //Clear out the existing controls
+      tableLayoutPanel.Controls.Clear();
+
+      //Clear out the existing row and column styles
+      tableLayoutPanel.ColumnStyles.Clear();
+      tableLayoutPanel.RowStyles.Clear();
+      tableLayoutPanel.AutoScroll = false;
+      tableLayoutPanel.AutoScroll = true;
+    }
     //Remove horizontal scroll bar if visible
     private void tableLayoutPanel_Layout(object sender, LayoutEventArgs e) {
@@ -381,7 +292,30 @@
       }
     }
-
+    #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
   }
 }
-
-
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 14401)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 14401)
@@ -0,0 +1,152 @@
+﻿#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 PreprocessingCheckedVariablesView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.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();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variablesListcontextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.checkedItemList);
+      this.splitContainer.Size = new System.Drawing.Size(654, 403);
+      this.splitContainer.SplitterDistance = 91;
+      this.splitContainer.TabIndex = 7;
+      // 
+      // checkedItemList
+      // 
+      this.checkedItemList.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;
+      // 
+      // variablesListcontextMenuStrip
+      // 
+      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);
+      // 
+      // checkInputsTargetToolStripMenuItem
+      // 
+      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);
+      // 
+      // checkOnlyInputsTargetToolStripMenuItem
+      // 
+      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);
+      // 
+      // checkAllToolStripMenuItem
+      // 
+      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);
+      // 
+      // PreprocessingCheckedVariablesView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "PreprocessingCheckedVariablesView";
+      this.Size = new System.Drawing.Size(654, 403);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.variablesListcontextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #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;
+  }
+}
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs	(revision 14401)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.cs	(revision 14401)
@@ -0,0 +1,159 @@
+﻿#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 HeuristicLab.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.DataPreprocessing.Views {
+  [View("Preprocessing Checked Variables View")]
+  [Content(typeof(PreprocessingChartContent), false)]
+  public abstract partial class PreprocessingCheckedVariablesView : ItemView {
+
+    public new PreprocessingChartContent Content {
+      get { return (PreprocessingChartContent)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected PreprocessingCheckedVariablesView() {
+      InitializeComponent();
+    }
+
+    protected bool IsVariableChecked(string name) {
+      return Content.VariableItemList.CheckedItems.Any(x => x.Value.Value == name);
+    }
+    protected IList<string> GetCheckedVariables() {
+      return checkedItemList.Content.CheckedItems.Select(i => i.Value.Value).ToList();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) return;
+
+      if (Content.VariableItemList == null) {
+        Content.VariableItemList = Content.CreateVariableItemList();
+      } else {
+        var checkedNames = Content.VariableItemList.CheckedItems.Select(x => x.Value.Value);
+        Content.VariableItemList = Content.CreateVariableItemList(checkedNames);
+      }
+      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);
+        listViewItem.ForeColor = Color.LightGray;
+      }
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PreprocessingData.Changed += PreprocessingData_Changed;
+      Content.PreprocessingData.SelectionChanged += PreprocessingData_SelctionChanged;
+    }
+    protected override void DeregisterContentEvents() {
+      Content.PreprocessingData.Changed -= PreprocessingData_Changed;
+      Content.PreprocessingData.SelectionChanged -= PreprocessingData_SelctionChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected virtual void CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> checkedItems) {
+    }
+
+    private void PreprocessingData_Changed(object sender, DataPreprocessingChangedEventArgs e) {
+      switch (e.Type) {
+        case DataPreprocessingChangedEventType.DeleteColumn:
+          RemoveVariable(Content.PreprocessingData.GetVariableName(e.Column));
+          break;
+        case DataPreprocessingChangedEventType.AddColumn:
+          AddVariable(Content.PreprocessingData.GetVariableName(e.Column));
+          break;
+        case DataPreprocessingChangedEventType.ChangeColumn:
+        case DataPreprocessingChangedEventType.ChangeItem:
+          UpdateVariable(Content.PreprocessingData.GetVariableName(e.Column));
+          break;
+        default:
+          ResetAllVariables();
+          break;
+      }
+    }
+
+    protected virtual void AddVariable(string name) {
+      Content.VariableItemList.Add(new StringValue(name));
+      if (!Content.PreprocessingData.InputVariables.Contains(name) && Content.PreprocessingData.TargetVariable != name) {
+        var listViewItem = checkedItemList.ItemsListView.FindItemWithText(name);
+        listViewItem.ForeColor = Color.LightGray;
+      }
+    }
+    protected virtual void RemoveVariable(string name) {
+      var stringValue = Content.VariableItemList.SingleOrDefault(n => n.Value == name);
+      if (stringValue != null)
+        Content.VariableItemList.Remove(stringValue);
+    }
+    protected virtual void UpdateVariable(string name) {
+    }
+    protected virtual void ResetAllVariables() {
+    }
+
+    protected virtual void PreprocessingData_SelctionChanged(object sender, EventArgs e) {
+    }
+
+    #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 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: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs	(revision 14401)
@@ -43,4 +43,18 @@
       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; }
     }
 
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs	(revision 14401)
@@ -44,4 +44,18 @@
       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; }
     }
 
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 14401)
@@ -45,31 +45,229 @@
     /// </summary>
     private void InitializeComponent() {
-      this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.frameTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.columnHeaderScrollPanel = new System.Windows.Forms.Panel();
+      this.columnHeaderTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.rowHeaderScrollPanel = new System.Windows.Forms.Panel();
+      this.rowHeaderTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.bodyScrollPanel = new System.Windows.Forms.Panel();
+      this.bodyTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+      this.sizeGroupBox = new System.Windows.Forms.GroupBox();
+      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();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.frameTableLayoutPanel.SuspendLayout();
+      this.columnHeaderScrollPanel.SuspendLayout();
+      this.rowHeaderScrollPanel.SuspendLayout();
+      this.bodyScrollPanel.SuspendLayout();
+      this.sizeGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.heightTrackBar)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.widthTrackBar)).BeginInit();
       this.SuspendLayout();
       // 
-      // tableLayoutPanel
-      // 
-      this.tableLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      // checkedItemList
+      // 
+      this.checkedItemList.Size = new System.Drawing.Size(113, 369);
+      // 
+      // splitContainer
+      // 
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.sizeGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.frameTableLayoutPanel);
+      this.splitContainer.Size = new System.Drawing.Size(863, 520);
+      this.splitContainer.SplitterDistance = 120;
+      // 
+      // frameTableLayoutPanel
+      // 
+      this.frameTableLayoutPanel.ColumnCount = 2;
+      this.frameTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 40F));
+      this.frameTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.frameTableLayoutPanel.Controls.Add(this.columnHeaderScrollPanel, 1, 0);
+      this.frameTableLayoutPanel.Controls.Add(this.rowHeaderScrollPanel, 0, 1);
+      this.frameTableLayoutPanel.Controls.Add(this.bodyScrollPanel, 1, 1);
+      this.frameTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.frameTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.frameTableLayoutPanel.Name = "frameTableLayoutPanel";
+      this.frameTableLayoutPanel.RowCount = 2;
+      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.TabIndex = 0;
+      // 
+      // columnHeaderScrollPanel
+      // 
+      this.columnHeaderScrollPanel.Controls.Add(this.columnHeaderTableLayoutPanel);
+      this.columnHeaderScrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.columnHeaderScrollPanel.Location = new System.Drawing.Point(40, 0);
+      this.columnHeaderScrollPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.columnHeaderScrollPanel.Name = "columnHeaderScrollPanel";
+      this.columnHeaderScrollPanel.Size = new System.Drawing.Size(699, 40);
+      this.columnHeaderScrollPanel.TabIndex = 3;
+      // 
+      // columnHeaderTableLayoutPanel
+      // 
+      this.columnHeaderTableLayoutPanel.AutoSize = true;
+      this.columnHeaderTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.columnHeaderTableLayoutPanel.ColumnCount = 2;
+      this.columnHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Left;
+      this.columnHeaderTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.columnHeaderTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.columnHeaderTableLayoutPanel.Name = "columnHeaderTableLayoutPanel";
+      this.columnHeaderTableLayoutPanel.RowCount = 1;
+      this.columnHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.columnHeaderTableLayoutPanel.Size = new System.Drawing.Size(0, 40);
+      this.columnHeaderTableLayoutPanel.TabIndex = 1;
+      // 
+      // rowHeaderScrollPanel
+      // 
+      this.rowHeaderScrollPanel.Controls.Add(this.rowHeaderTableLayoutPanel);
+      this.rowHeaderScrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.rowHeaderScrollPanel.Location = new System.Drawing.Point(0, 40);
+      this.rowHeaderScrollPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.rowHeaderScrollPanel.Name = "rowHeaderScrollPanel";
+      this.rowHeaderScrollPanel.Size = new System.Drawing.Size(40, 480);
+      this.rowHeaderScrollPanel.TabIndex = 4;
+      // 
+      // rowHeaderTableLayoutPanel
+      // 
+      this.rowHeaderTableLayoutPanel.AutoSize = true;
+      this.rowHeaderTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.rowHeaderTableLayoutPanel.ColumnCount = 1;
+      this.rowHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Top;
+      this.rowHeaderTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.rowHeaderTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.rowHeaderTableLayoutPanel.Name = "rowHeaderTableLayoutPanel";
+      this.rowHeaderTableLayoutPanel.RowCount = 2;
+      this.rowHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.rowHeaderTableLayoutPanel.Size = new System.Drawing.Size(40, 0);
+      this.rowHeaderTableLayoutPanel.TabIndex = 2;
+      // 
+      // bodyScrollPanel
+      // 
+      this.bodyScrollPanel.AutoScroll = true;
+      this.bodyScrollPanel.Controls.Add(this.bodyTableLayoutPanel);
+      this.bodyScrollPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.bodyScrollPanel.Location = new System.Drawing.Point(40, 40);
+      this.bodyScrollPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.bodyScrollPanel.Name = "bodyScrollPanel";
+      this.bodyScrollPanel.Size = new System.Drawing.Size(699, 480);
+      this.bodyScrollPanel.TabIndex = 5;
+      this.bodyScrollPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.bodyScrollPanel_Scroll);
+      // 
+      // bodyTableLayoutPanel
+      // 
+      this.bodyTableLayoutPanel.AutoSize = true;
+      this.bodyTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.bodyTableLayoutPanel.ColumnCount = 2;
+      this.bodyTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+      this.bodyTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);
+      this.bodyTableLayoutPanel.Name = "bodyTableLayoutPanel";
+      this.bodyTableLayoutPanel.RowCount = 2;
+      this.bodyTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.bodyTableLayoutPanel.Size = new System.Drawing.Size(0, 0);
+      this.bodyTableLayoutPanel.TabIndex = 0;
+      // 
+      // sizeGroupBox
+      // 
+      this.sizeGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.tableLayoutPanel.AutoScroll = true;
-      this.tableLayoutPanel.ColumnCount = 1;
-      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
-      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
-      this.tableLayoutPanel.Location = new System.Drawing.Point(3, 3);
-      this.tableLayoutPanel.Name = "tableLayoutPanel";
-      this.tableLayoutPanel.RowCount = 1;
-      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
-      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 514F));
-      this.tableLayoutPanel.Size = new System.Drawing.Size(860, 514);
-      this.tableLayoutPanel.TabIndex = 1;
-      // 
-      // MultiScatterPlotView
+      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.Name = "sizeGroupBox";
+      this.sizeGroupBox.Size = new System.Drawing.Size(113, 124);
+      this.sizeGroupBox.TabIndex = 5;
+      this.sizeGroupBox.TabStop = false;
+      this.sizeGroupBox.Text = "Chart Size";
+      // 
+      // heightLabel
+      // 
+      this.heightLabel.AutoSize = true;
+      this.heightLabel.Location = new System.Drawing.Point(6, 64);
+      this.heightLabel.Name = "heightLabel";
+      this.heightLabel.Size = new System.Drawing.Size(41, 13);
+      this.heightLabel.TabIndex = 2;
+      this.heightLabel.Text = "Height:";
+      // 
+      // widthLabel
+      // 
+      this.widthLabel.AutoSize = true;
+      this.widthLabel.Location = new System.Drawing.Point(6, 16);
+      this.widthLabel.Name = "widthLabel";
+      this.widthLabel.Size = new System.Drawing.Size(38, 13);
+      this.widthLabel.TabIndex = 1;
+      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);
+      // 
+      // ScatterPlotMultiView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tableLayoutPanel);
-      this.Name = "MultiScatterPlotView";
-      this.Size = new System.Drawing.Size(863, 517);
+      this.Name = "ScatterPlotMultiView";
+      this.Size = new System.Drawing.Size(863, 520);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.frameTableLayoutPanel.ResumeLayout(false);
+      this.columnHeaderScrollPanel.ResumeLayout(false);
+      this.columnHeaderScrollPanel.PerformLayout();
+      this.rowHeaderScrollPanel.ResumeLayout(false);
+      this.rowHeaderScrollPanel.PerformLayout();
+      this.bodyScrollPanel.ResumeLayout(false);
+      this.bodyScrollPanel.PerformLayout();
+      this.sizeGroupBox.ResumeLayout(false);
+      this.sizeGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.heightTrackBar)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.widthTrackBar)).EndInit();
       this.ResumeLayout(false);
 
@@ -78,6 +276,16 @@
     #endregion
 
-    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
-
+    private System.Windows.Forms.TableLayoutPanel frameTableLayoutPanel;
+    private System.Windows.Forms.TableLayoutPanel columnHeaderTableLayoutPanel;
+    private System.Windows.Forms.TableLayoutPanel rowHeaderTableLayoutPanel;
+    private System.Windows.Forms.TableLayoutPanel bodyTableLayoutPanel;
+    private System.Windows.Forms.Panel columnHeaderScrollPanel;
+    private System.Windows.Forms.Panel rowHeaderScrollPanel;
+    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;
   }
 }
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 14401)
@@ -5,21 +5,45 @@
 using System.Windows.Forms;
 using HeuristicLab.Analysis;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
 using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
 
 namespace HeuristicLab.DataPreprocessing.Views {
   [View("Scatter Plot Multi View")]
   [Content(typeof(ScatterPlotContent), false)]
-  public partial class ScatterPlotMultiView : ItemView {
-
-    private const int HEADER_WIDTH = 50;
-    private const int HEADER_HEIGHT = 50;
-    private const int MAX_AUTO_SIZE_ELEMENTS = 6;
-    private const int FIXED_CHART_WIDTH = 250;
-    private const int FIXED_CHART_HEIGHT = 150;
+  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;
 
     public ScatterPlotMultiView() {
       InitializeComponent();
+
+      #region Initialize Scrollbars
+      columnHeaderScrollPanel.HorizontalScroll.Enabled = true;
+      columnHeaderScrollPanel.VerticalScroll.Enabled = false;
+      columnHeaderScrollPanel.HorizontalScroll.Visible = false;
+      columnHeaderScrollPanel.VerticalScroll.Visible = false;
+
+      rowHeaderScrollPanel.HorizontalScroll.Enabled = false;
+      rowHeaderScrollPanel.VerticalScroll.Enabled = true;
+      rowHeaderScrollPanel.HorizontalScroll.Visible = false;
+      rowHeaderScrollPanel.VerticalScroll.Visible = false;
+
+      bodyScrollPanel.HorizontalScroll.Enabled = true;
+      bodyScrollPanel.VerticalScroll.Enabled = true;
+      bodyScrollPanel.HorizontalScroll.Visible = true;
+      bodyScrollPanel.VerticalScroll.Visible = true;
+      bodyScrollPanel.AutoScroll = true;
+      #endregion
+
+      columnHeaderCache = new Dictionary<string, Label>();
+      rowHeaderCache = new Dictionary<string, Label>();
+      bodyCache = new Dictionary<Tuple<string, string>, ItemView>();
+
+      bodyScrollPanel.MouseWheel += bodyScrollPanel_MouseWheel;
     }
 
@@ -32,94 +56,290 @@
       base.OnContentChanged();
       if (Content != null) {
-        GenerateMultiLayout();
-      }
-    }
-
-    //Add header elements to the table layout panel
-    private void addHeaderToTableLayoutPanels() {
-
-      List<string> variables = Content.PreprocessingData.GetDoubleVariableNames().ToList();
-
-      for (int i = 1; i < variables.Count + 1; i++) {
-        // Use buttons for header elements
-        Button xButton = new Button();
-        xButton.Enabled = false;
-        xButton.BackColor = Color.Gainsboro;
-        xButton.Text = variables[i - 1];
-        xButton.Dock = DockStyle.Fill;
-        tableLayoutPanel.Controls.Add(xButton, 0, i);
-        Button yButton = new Button();
-        yButton.Enabled = false;
-        yButton.BackColor = Color.Gainsboro;
-        yButton.Text = variables[i - 1];
-        yButton.Dock = DockStyle.Fill;
-        tableLayoutPanel.Controls.Add(yButton, i, 0);
-      }
-    }
-
-    private void GenerateMultiLayout() {
-      List<string> variables = Content.PreprocessingData.GetDoubleVariableNames().ToList();
-
-      tableLayoutPanel.Controls.Clear();
-      //Clear out the existing row and column styles
-      tableLayoutPanel.ColumnStyles.Clear();
-      tableLayoutPanel.RowStyles.Clear();
-
-      //Set row and column count
-      tableLayoutPanel.ColumnCount = variables.Count + 1;
-      tableLayoutPanel.RowCount = variables.Count + 1;
-
-      tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, HEADER_WIDTH));
-      tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, HEADER_HEIGHT));
-      // set column and row layout
-      for (int x = 0; x < variables.Count; x++) {
-        // auto size
-        if (variables.Count <= MAX_AUTO_SIZE_ELEMENTS) {
-          tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, (tableLayoutPanel.Width - HEADER_WIDTH) / variables.Count));
-          tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, (tableLayoutPanel.Height - HEADER_HEIGHT) / variables.Count));
-        }
-        // fixed size
-        else {
-          tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, FIXED_CHART_WIDTH));
-          tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, FIXED_CHART_HEIGHT));
-        }
-      }
-
-      addHeaderToTableLayoutPanels();
-      addChartsToTableLayoutPanel();
-
-    }
-
-    private void addChartsToTableLayoutPanel() {
-
-      List<string> variables = Content.PreprocessingData.GetDoubleVariableNames().ToList();
-
-      //set scatter plots and histograms
-      for (int x = 1; x < variables.Count + 1; x++) {
-
-        for (int y = 1; y < variables.Count + 1; y++) {
-          // use historgram if x and y variable are equal
-          if (x == y) {
-            PreprocessingDataTable dataTable = new PreprocessingDataTable();
-            DataRow dataRow = Content.CreateDataRow(variables[x - 1], DataRowVisualProperties.DataRowChartType.Histogram);
-            dataTable.Rows.Add(dataRow);
-            PreprocessingDataTableView pcv = new PreprocessingDataTableView();
-            pcv.ChartDoubleClick += HistogramDoubleClick;
-            pcv.Content = dataTable;
-            tableLayoutPanel.Controls.Add(pcv, y, x);
+        GenerateCharts();
+      }
+    }
+
+    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);
+        else
+          RemoveChartFromTable(variable);
+      }
+    }
+
+    #region Add and remove charts
+    private void AddChartToTable(string variable) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // find index to insert 
+      var variables = checkedItemList.Content.Select(v => v.Value).ToList();
+      int idx = variables              // all variables
+        .TakeWhile(t => t != variable) // ... until the variable that was checked
+        .Count(IsVariableChecked);     // ... how many checked variables
+
+      // add column header
+      var colH = columnHeaderTableLayoutPanel;
+      AddColumnHelper(colH, idx, _ => GetColumnHeader(variable));
+
+      // add row header
+      var rowH = rowHeaderTableLayoutPanel;
+      AddRowHelper(rowH, idx, _ => GetRowHeader(variable));
+
+      // add body
+      var body = bodyTableLayoutPanel;
+      var vars = GetCheckedVariables();
+      var varsMinus = vars.Except(new[] { variable }).ToList();
+      AddColumnHelper(body, idx, r => GetBody(variable, varsMinus[r])); // exclude "variable" because the row for it does not exist yet
+      AddRowHelper(body, idx, c => GetBody(vars[c], variable));
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void AddColumnHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      // add column
+      tlp.ColumnCount++;
+      tlp.ColumnStyles.Insert(idx, new ColumnStyle(SizeType.Absolute, GetColumnWidth()));
+      // shift right
+      for (int c = tlp.ColumnCount; c >  idx - 1; c--) {
+        for (int r = 0; r < tlp.RowCount; r++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetColumn(control, c + 1);
           }
-          //scatter plot
-          else {
-            ScatterPlot scatterPlot = Content.CreateScatterPlot(variables[x - 1], variables[y - 1]);
-            PreprocessingScatterPlotView pspv = new PreprocessingScatterPlotView();
-            pspv.ChartDoubleClick += ScatterPlotDoubleClick;
-            pspv.Content = scatterPlot;
-            pspv.Dock = DockStyle.Fill;
-            tableLayoutPanel.Controls.Add(pspv, x, y);
+        }
+      }
+      // add controls
+      for (int r = 0; r < tlp.RowCount; r++) {
+        if (tlp.GetControlFromPosition(idx, r) == null)
+          tlp.Controls.Add(creatorFunc(r), idx, r);
+      }
+
+    }
+    private void AddRowHelper(TableLayoutPanel tlp, int idx, Func<int, Control> creatorFunc) {
+      // add row
+      tlp.RowCount++;
+      tlp.RowStyles.Insert(idx, new RowStyle(SizeType.Absolute, GetRowHeight()));
+      // shift right
+      for (int r = tlp.RowCount; r > idx - 1; r--) {
+        for (int c = 0; c < tlp.ColumnCount; c++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetRow(control, r + 1);
           }
         }
       }
-    }
-
+      // add controls
+      for (int c = 0; c < tlp.ColumnCount; c++)
+        if (tlp.GetControlFromPosition(c, idx) == null)
+          tlp.Controls.Add(creatorFunc(c), c, idx);
+    }
+
+    private void RemoveChartFromTable(string variable) {
+      frameTableLayoutPanel.SuspendLayout();
+
+      // remove column header
+      var colH = columnHeaderTableLayoutPanel;
+      int colIdx = colH.GetColumn(colH.Controls[variable]);
+      RemoveColumnHelper(colH, colIdx);
+
+      // remove row header
+      var rowH = rowHeaderTableLayoutPanel;
+      int rowIdx = rowH.GetRow(rowH.Controls[variable]);
+      RemoveRowHelper(rowH, rowIdx);
+
+      // remove from body
+      var body = bodyTableLayoutPanel;
+      RemoveColumnHelper(body, colIdx);
+      RemoveRowHelper(body, rowIdx);
+
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+    private void RemoveColumnHelper(TableLayoutPanel tlp, int idx) {
+      // remove controls
+      for (int r = 0; r < tlp.RowCount; r++)
+        tlp.Controls.Remove(tlp.GetControlFromPosition(idx, r));
+      // shift left
+      for (int c = idx + 1; c < tlp.ColumnCount; c++) {
+        for (int r = 0; r < tlp.RowCount; r++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetColumn(control, c - 1);
+          }
+        }
+      }
+      // delete column
+      tlp.ColumnStyles.RemoveAt(tlp.ColumnCount - 1);
+      tlp.ColumnCount--;
+    }
+    private void RemoveRowHelper(TableLayoutPanel tlp, int idx) {
+      // remove controls
+      for (int c = 0; c < tlp.ColumnCount; c++)
+        tlp.Controls.Remove(tlp.GetControlFromPosition(c, idx));
+      // shift left
+      for (int r = idx + 1; r < tlp.RowCount; r++) {
+        for (int c = 0; c < tlp.ColumnCount; c++) {
+          var control = tlp.GetControlFromPosition(c, r);
+          if (control != null) {
+            tlp.SetRow(control, r - 1);
+          }
+        }
+      }
+      // delete rows
+      tlp.RowStyles.RemoveAt(tlp.RowCount - 1);
+      tlp.RowCount--;
+    }
+    #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 
+    private Label GetColumnHeader(string variable) {
+      if (!columnHeaderCache.ContainsKey(variable)) {
+        columnHeaderCache.Add(variable, new Label() {
+          Text = variable,
+          TextAlign = ContentAlignment.MiddleCenter,
+          Name = variable,
+          Height = columnHeaderTableLayoutPanel.Height,
+          Dock = DockStyle.Fill,
+          Margin = new Padding(3)
+        });
+      }
+      return columnHeaderCache[variable];
+    }
+    private Label GetRowHeader(string variable) {
+      if (!rowHeaderCache.ContainsKey(variable)) {
+        rowHeaderCache.Add(variable, new Label() {
+          Text = variable,
+          TextAlign = ContentAlignment.MiddleCenter,
+          Name = variable,
+          Width = rowHeaderTableLayoutPanel.Width,
+          Dock = DockStyle.Fill,
+          Margin = new Padding(3)
+        });
+      }
+      return rowHeaderCache[variable];
+    }
+    private ItemView 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 {
+            Name = key.ToString(),
+            Content = dataTable,
+            Dock = DockStyle.Fill,
+            ShowLegend = false,
+            XAxisFormat = "G3"
+          };
+          pcv.ChartDoubleClick += HistogramDoubleClick;
+          bodyCache.Add(key, pcv);
+        } else { //scatter plot
+          ScatterPlot scatterPlot = Content.CreateScatterPlot(colVariable, rowVariable);
+          PreprocessingScatterPlotView pspv = new PreprocessingScatterPlotView {
+            Name = key.ToString(),
+            Content = scatterPlot,
+            Dock = DockStyle.Fill,
+            ShowLegend = false,
+            XAxisFormat = "G3"
+          };
+          pspv.ChartDoubleClick += ScatterPlotDoubleClick;
+          bodyCache.Add(key, pspv);
+        }
+      }
+      return bodyCache[key];
+    }
+    #endregion
+
+    #region Generate Charts
+    private void GenerateCharts() {
+      var variables = GetCheckedVariables();
+
+      // Clear old layouts and cache
+      foreach (var tableLayoutPanel in new[] { columnHeaderTableLayoutPanel, rowHeaderTableLayoutPanel, bodyTableLayoutPanel }) {
+        tableLayoutPanel.Controls.Clear();
+        tableLayoutPanel.ColumnStyles.Clear();
+        tableLayoutPanel.RowStyles.Clear();
+      }
+      columnHeaderCache.Clear();
+      rowHeaderCache.Clear();
+      bodyCache.Clear();
+
+      // Set row and column count
+      columnHeaderTableLayoutPanel.ColumnCount = variables.Count;
+      rowHeaderTableLayoutPanel.RowCount = variables.Count;
+      bodyTableLayoutPanel.ColumnCount = variables.Count;
+      bodyTableLayoutPanel.RowCount = variables.Count;
+
+      // 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()));
+      }
+
+      frameTableLayoutPanel.SuspendLayout();
+      AddHeaderToTableLayoutPanels();
+      AddChartsToTableLayoutPanel();
+      UpdateHeaderMargin();
+      frameTableLayoutPanel.ResumeLayout(true);
+    }
+
+    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++;
+      }
+    }
+    private void AddChartsToTableLayoutPanel() {
+      int c = 0;
+      foreach (var colVar in GetCheckedVariables()) {
+        if (!IsVariableChecked(colVar)) continue;
+        int r = 0;
+        foreach (var rowVar in GetCheckedVariables()) {
+          if (!IsVariableChecked(rowVar)) continue;
+          bodyTableLayoutPanel.Controls.Add(GetBody(colVar, rowVar), c, r);
+          r++;
+        }
+        c++;
+      }
+    }
+
+    #endregion
+
+    #region DoubleClick Events
     //Open scatter plot in new tab with new content when double clicked
     private void ScatterPlotDoubleClick(object sender, EventArgs e) {
@@ -127,13 +347,6 @@
       ScatterPlotContent scatterContent = new ScatterPlotContent(Content, new Cloner());  // create new content
       ScatterPlot scatterPlot = pspv.Content;
-      setVariablesInContentFromScatterPlot(scatterContent, scatterPlot);
-
-      MainFormManager.MainForm.ShowContent(scatterContent, typeof(ScatterPlotSingleView));  // open in new tab
-    }
-
-    //Extract variable names from scatter plot and set them in content
-    private void setVariablesInContentFromScatterPlot(ScatterPlotContent scatterContent, ScatterPlot scatterPlot) {
-
-      // only one data row should be in scatter plot
+
+      //Extract variable names from scatter plot and set them in content
       if (scatterPlot.Rows.Count == 1) {
         string[] variables = scatterPlot.Rows.ElementAt(0).Name.Split(new string[] { " - " }, StringSplitOptions.None); // extract variable names from string
@@ -141,22 +354,6 @@
         scatterContent.SelectedYVariable = variables[1];
       }
-    }
-
-    //Set variable item list from with variable from data table
-    private void setVariableItemListFromDataTable(HistogramContent histoContent, PreprocessingDataTable dataTable) {
-
-      // only one data row should be in data table 
-      if (dataTable.Rows.Count == 1) {
-        string variableName = dataTable.Rows.ElementAt(0).Name;
-
-        // set only variable name checked
-        foreach (var checkedItem in histoContent.VariableItemList) {
-          if (checkedItem.Value == variableName)
-            histoContent.VariableItemList.SetItemCheckedState(checkedItem, true);
-          else
-            histoContent.VariableItemList.SetItemCheckedState(checkedItem, false);
-
-        }
-      }
+
+      MainFormManager.MainForm.ShowContent(scatterContent, typeof(ScatterPlotSingleView));  // open in new tab
     }
 
@@ -167,12 +364,73 @@
       histoContent.VariableItemList = Content.CreateVariableItemList();
       PreprocessingDataTable dataTable = pcv.Content;
-      setVariableItemListFromDataTable(histoContent, dataTable);
-
+
+      //Set variable item list from with variable from data table
+      if (dataTable.Rows.Count == 1) { // only one data row should be in data table 
+        string variableName = dataTable.Rows.ElementAt(0).Name;
+
+        // set only variable name checked
+        foreach (var checkedItem in histoContent.VariableItemList) {
+          histoContent.VariableItemList.SetItemCheckedState(checkedItem, checkedItem.Value == variableName);
+        }
+      }
       MainFormManager.MainForm.ShowContent(histoContent, typeof(HistogramView));  // open in new tab
     }
-
-
+    #endregion
+
+    #region Scrolling
+    private void bodyScrollPanel_Scroll(object sender, ScrollEventArgs e) {
+      SyncScroll();
+
+      UpdateHeaderMargin();
+    }
+    private void bodyScrollPanel_MouseWheel(object sender, MouseEventArgs e) {
+      // Scrolling with the mouse wheel is not captured in the Scoll event
+      SyncScroll();
+    }
+    private void SyncScroll() {
+      frameTableLayoutPanel.SuspendRepaint();
+
+      columnHeaderScrollPanel.HorizontalScroll.Minimum = bodyScrollPanel.HorizontalScroll.Minimum;
+      columnHeaderScrollPanel.HorizontalScroll.Maximum = bodyScrollPanel.HorizontalScroll.Maximum;
+      rowHeaderScrollPanel.VerticalScroll.Minimum = bodyScrollPanel.VerticalScroll.Minimum;
+      rowHeaderScrollPanel.VerticalScroll.Maximum = bodyScrollPanel.VerticalScroll.Maximum;
+
+      columnHeaderScrollPanel.HorizontalScroll.Value = Math.Max(bodyScrollPanel.HorizontalScroll.Value, 1);
+      rowHeaderScrollPanel.VerticalScroll.Value = Math.Max(bodyScrollPanel.VerticalScroll.Value, 1);
+      // minimum 1 is nececary  because of two factors:
+      // - setting the Value-property of Horizontal/VerticalScroll updates the internal state but the Value-property stays 0
+      // - setting the same number of the Value-property has no effect
+      // since the Value-property is always 0, setting it to 0 would have no effect; so it is set to 1 instead
+
+      frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    // add a margin to the header table layouts if the scollbar is visible to account for the width/height of the scrollbar
+    private void UpdateHeaderMargin() {
+      columnHeaderScrollPanel.Margin = new Padding(0, 0, bodyScrollPanel.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0, 0);
+      rowHeaderScrollPanel.Margin = new Padding(0, 0, 0, bodyScrollPanel.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0);
+    }
+    #endregion
+
+    #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) {
+      frameTableLayoutPanel.SuspendRepaint();
+      for (int i = 0; i < columnHeaderTableLayoutPanel.ColumnCount; i++) {
+        columnHeaderTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
+        bodyTableLayoutPanel.ColumnStyles[i].Width = GetColumnWidth();
+      }
+      frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    private void heightTrackBar_ValueChanged(object sender, EventArgs e) {
+      frameTableLayoutPanel.SuspendRepaint();
+
+      for (int i = 0; i < rowHeaderTableLayoutPanel.RowCount; i++) {
+        rowHeaderTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
+        bodyTableLayoutPanel.RowStyles[i].Height = GetRowHeight();
+      }
+      frameTableLayoutPanel.ResumeRepaint(true);
+    }
+    #endregion
   }
-
-
 }
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/FilteredPreprocessingData.cs	(revision 14401)
@@ -47,4 +47,7 @@
       get { return ActiveData.VariableNames; }
     }
+
+    public IList<string> InputVariables { get { return ActiveData.InputVariables; } }
+    public string TargetVariable { get { return ActiveData.TargetVariable; } } // optional
 
     public IDictionary<int, IList<int>> Selection {
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/IPreprocessingData.cs	(revision 14401)
@@ -65,4 +65,7 @@
     bool VariableHasType<T>(int columnIndex);
 
+    IList<string> InputVariables { get; }
+    string TargetVariable { get; } // optional
+
     int Columns { get; }
     int Rows { get; }
Index: branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs
===================================================================
--- branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 14399)
+++ branches/symbreg-factors-2650/HeuristicLab.DataPreprocessing/3.4/Data/PreprocessingData.cs	(revision 14401)
@@ -59,4 +59,7 @@
     }
 
+    public IList<string> InputVariables { get; private set; }
+    public string TargetVariable { get; private set; } // optional
+
     public int Columns {
       get { return variableNames.Count; }
@@ -82,5 +85,8 @@
       TrainingPartition = (IntRange)original.TrainingPartition.Clone(cloner);
       TestPartition = (IntRange)original.TestPartition.Clone(cloner);
-      transformations = new List<ITransformation>();
+      transformations = new List<ITransformation>(original.transformations.Select(cloner.Clone));
+
+      InputVariables = new List<string>(original.InputVariables);
+      TargetVariable = original.TargetVariable;
 
       RegisterEventHandler();
@@ -102,4 +108,8 @@
       Dataset dataset = (Dataset)problemData.Dataset;
       variableNames = new List<string>(problemData.Dataset.VariableNames);
+      InputVariables = new List<string>(problemData.AllowedInputVariables);
+      TargetVariable = (problemData is IRegressionProblemData) ? ((IRegressionProblemData)problemData).TargetVariable
+        : (problemData is IClassificationProblemData) ? ((IClassificationProblemData)problemData).TargetVariable
+        : null;
 
       int columnIndex = 0;
