Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 14974)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingChartView.cs	(revision 14975)
@@ -39,5 +39,5 @@
     protected Dictionary<string, DataTableControl> dataTableControls;
 
-    protected static readonly Color[] Colors = {
+    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),
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 14974)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingCheckedVariablesView.Designer.cs	(revision 14975)
@@ -94,5 +94,5 @@
       this.uncheckAllButton.Name = "uncheckAllButton";
       this.uncheckAllButton.Size = new System.Drawing.Size(24, 24);
-      this.uncheckAllButton.TabIndex = 7;
+      this.uncheckAllButton.TabIndex = 9;
       this.toolTip.SetToolTip(this.uncheckAllButton, "None");
       this.uncheckAllButton.UseVisualStyleBackColor = true;
@@ -116,5 +116,5 @@
       this.checkInputsTargetButton.Name = "checkInputsTargetButton";
       this.checkInputsTargetButton.Size = new System.Drawing.Size(24, 24);
-      this.checkInputsTargetButton.TabIndex = 7;
+      this.checkInputsTargetButton.TabIndex = 8;
       this.toolTip.SetToolTip(this.checkInputsTargetButton, "Inputs & Target");
       this.checkInputsTargetButton.UseVisualStyleBackColor = true;
@@ -134,5 +134,5 @@
       this.variablesListView.Name = "variablesListView";
       this.variablesListView.Size = new System.Drawing.Size(168, 348);
-      this.variablesListView.TabIndex = 6;
+      this.variablesListView.TabIndex = 12;
       this.variablesListView.UseCompatibleStateImageBehavior = false;
       this.variablesListView.View = System.Windows.Forms.View.Details;
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 14974)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.Designer.cs	(revision 14975)
@@ -58,4 +58,6 @@
       this.widthLabel = new System.Windows.Forms.Label();
       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();
@@ -64,5 +66,10 @@
       this.label4 = new System.Windows.Forms.Label();
       this.groupingOptionsBox = new System.Windows.Forms.GroupBox();
+      this.aggregationLabel = new System.Windows.Forms.Label();
+      this.aggregationComboBox = new System.Windows.Forms.ComboBox();
       this.groupingComboBox = new System.Windows.Forms.ComboBox();
+      this.label1 = 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();
@@ -76,7 +83,10 @@
       ((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();
+      ((System.ComponentModel.ISupportInitialize)(this.pointOpacityNumericUpDown)).BeginInit();
+      this.pointsGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -87,4 +97,5 @@
       // 
       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);
@@ -201,7 +212,7 @@
       this.sizeGroupBox.Controls.Add(this.lockAspectCheckBox);
       this.sizeGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
-      this.sizeGroupBox.Location = new System.Drawing.Point(0, 179);
+      this.sizeGroupBox.Location = new System.Drawing.Point(0, 78);
       this.sizeGroupBox.Name = "sizeGroupBox";
-      this.sizeGroupBox.Size = new System.Drawing.Size(180, 95);
+      this.sizeGroupBox.Size = new System.Drawing.Size(180, 94);
       this.sizeGroupBox.TabIndex = 5;
       this.sizeGroupBox.TabStop = false;
@@ -210,5 +221,5 @@
       // heightNumericUpDown
       // 
-      this.heightNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      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[] {
@@ -235,5 +246,5 @@
       // widthNumericUpDown
       // 
-      this.widthNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      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[] {
@@ -288,4 +299,38 @@
       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
       // 
@@ -295,7 +340,7 @@
       this.regressionGroupBox.Controls.Add(this.label4);
       this.regressionGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
-      this.regressionGroupBox.Location = new System.Drawing.Point(0, 324);
+      this.regressionGroupBox.Location = new System.Drawing.Point(0, 322);
       this.regressionGroupBox.Name = "regressionGroupBox";
-      this.regressionGroupBox.Size = new System.Drawing.Size(180, 79);
+      this.regressionGroupBox.Size = new System.Drawing.Size(180, 81);
       this.regressionGroupBox.TabIndex = 3;
       this.regressionGroupBox.TabStop = false;
@@ -304,5 +349,5 @@
       // regressionTypeComboBox
       // 
-      this.regressionTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      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;
@@ -316,5 +361,5 @@
       // polynomialRegressionOrderNumericUpDown
       // 
-      this.polynomialRegressionOrderNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      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);
@@ -360,16 +405,40 @@
       // groupingOptionsBox
       // 
+      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, 274);
+      this.groupingOptionsBox.Location = new System.Drawing.Point(0, 241);
       this.groupingOptionsBox.Name = "groupingOptionsBox";
-      this.groupingOptionsBox.Size = new System.Drawing.Size(180, 50);
+      this.groupingOptionsBox.Size = new System.Drawing.Size(180, 81);
       this.groupingOptionsBox.TabIndex = 8;
       this.groupingOptionsBox.TabStop = false;
-      this.groupingOptionsBox.Text = "Grouping Variable";
+      this.groupingOptionsBox.Text = "Grouping";
+      // 
+      // aggregationLabel
+      // 
+      this.aggregationLabel.AutoSize = true;
+      this.aggregationLabel.Location = new System.Drawing.Point(6, 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)
+      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;
@@ -380,4 +449,53 @@
       this.groupingComboBox.TabIndex = 1;
       this.groupingComboBox.SelectedIndexChanged += new System.EventHandler(this.groupingComboBox_SelectedIndexChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(6, 43);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(46, 13);
+      this.label1.TabIndex = 7;
+      this.label1.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.label1);
+      this.pointsGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom;
+      this.pointsGroupBox.Location = new System.Drawing.Point(0, 172);
+      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
@@ -401,8 +519,13 @@
       ((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();
+      ((System.ComponentModel.ISupportInitialize)(this.pointOpacityNumericUpDown)).EndInit();
+      this.pointsGroupBox.ResumeLayout(false);
+      this.pointsGroupBox.PerformLayout();
       this.ResumeLayout(false);
 
@@ -431,4 +554,11 @@
     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 label1;
   }
 }
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 14974)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 14975)
@@ -31,4 +31,5 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
+using AggregationType = HeuristicLab.Analysis.DataRowVisualProperties.DataRowHistogramAggregation;
 using RegressionType = HeuristicLab.Analysis.ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType;
 
@@ -50,4 +51,7 @@
       regressionTypeComboBox.SelectedItem = RegressionType.None;
 
+      aggregationComboBox.DataSource = Enum.GetValues(typeof(AggregationType));
+      aggregationComboBox.SelectedItem = AggregationType.Overlapping;
+
       #region Initialize Scrollbars
       columnHeaderScrollPanel.HorizontalScroll.Enabled = true;
@@ -85,4 +89,19 @@
         groupingComboBox.SelectedItem = Content.GroupingVariable;
 
+        // uncheck variables that max 20 vars are selected initially
+        var list = Content.VariableItemList;
+        int numChecked = list.CheckedItems.Count();
+        if (numChecked > 20) {
+          string message = string.Format("Displaying {0} variables ({1} charts) can cause HeuristicLab to become instable. " +
+                                         "Should the number of initially checked variables be reduced to 20?",
+            numChecked, numChecked * numChecked);
+          if (MessageBox.Show(this, message, "Reduce befor continue?", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) {
+            suppressCheckedChangedUpdate = true;
+            foreach (var var in list.CheckedItems.Reverse().Take(numChecked - 20)) {
+              Content.VariableItemList.SetItemCheckedState(var.Value, false);
+            }
+            suppressCheckedChangedUpdate = false;
+          }
+        }
         GenerateCharts(true);
       }
@@ -93,19 +112,147 @@
       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);
-      if (suppressCheckedChangedUpdate)
-        return;
-      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++) {
+        //tlp.Controls.Remove(tlp.GetControlFromPosition(idx, 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++) {
+        //tlp.Controls.Remove(tlp.GetControlFromPosition(c, idx));
+        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();
@@ -226,38 +373,4 @@
       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[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);
-      }
-
-      if (IsVariableChecked(name)) {
-        RemoveChartFromTable(name);
-      }
-    }
-    protected override void UpdateVariable(string name) {
-      base.UpdateVariable(name);
-      RemoveVariable(name);
-      AddVariable(name);
-    }
-    protected override void ResetAllVariables() {
-      GenerateCharts(true);
     }
     #endregion
@@ -295,8 +408,12 @@
       if (!bodyCache.ContainsKey(key)) {
         if (rowVariable == colVariable) { // use historgram if x and y variable are equal
-          var dataTable = HistogramContent.CreateHistogram(Content.PreprocessingData, rowVariable, (string)groupingComboBox.SelectedItem, DataRowVisualProperties.DataRowHistogramAggregation.Overlapping);
+          var dataTable = HistogramContent.CreateHistogram(
+            Content.PreprocessingData,
+            rowVariable,
+            (string)groupingComboBox.SelectedItem,
+            (AggregationType)aggregationComboBox.SelectedItem);
+          dataTable.VisualProperties.Title = string.Empty;
           foreach (var dataRow in dataTable.Rows)
-            dataRow.VisualProperties.IsVisibleInLegend = false;
-
+            dataRow.VisualProperties.IsVisibleInLegend = groupingComboBox.SelectedIndex > 0;
           var pcv = new DataTableControl {
             Name = key.ToString(),
@@ -309,9 +426,17 @@
           bodyCache.Add(key, pcv);
         } else { //scatter plot
-          var scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData, colVariable, rowVariable, (string)groupingComboBox.SelectedItem);
+          var scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData,
+            colVariable,
+            rowVariable,
+            (string)groupingComboBox.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 = 3;
+            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 = true;
             row.VisualProperties.IsRegressionVisibleInLegend = false;
             row.VisualProperties.RegressionType = regressionType;
@@ -342,6 +467,4 @@
       if (suppressCheckedChangedUpdate) return;
 
-      var variables = GetCheckedVariables();
-
       // Clear old layouts and cache
       foreach (var tableLayoutPanel in new[] { columnHeaderTableLayoutPanel, rowHeaderTableLayoutPanel, bodyTableLayoutPanel }) {
@@ -362,4 +485,6 @@
       }
 
+      var variables = Content.VariableItemList.Select(x => x.Value).ToList();
+
       // Set row and column count
       columnHeaderTableLayoutPanel.ColumnCount = variables.Count;
@@ -370,8 +495,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));
       }
 
@@ -384,22 +510,21 @@
 
     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();
@@ -429,5 +554,5 @@
       DataTableControl pcv = (DataTableControl)sender;
       HistogramContent histoContent = new HistogramContent(Content.PreprocessingData);  // create new content     
-      //ToDo: histoContent.VariableItemList = Content.CreateVariableItemList();
+                                                                                        //ToDo: histoContent.VariableItemList = Content.CreateVariableItemList();
       var dataTable = pcv.Content;
 
@@ -501,6 +626,8 @@
       }
       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();
@@ -516,10 +643,37 @@
       }
       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 scatterPlotControl = control.Value as ScatterPlotControl;
+        if (scatterPlotControl != null) {
+          foreach (var row in scatterPlotControl.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 scatterPlotControl = control.Value as ScatterPlotControl;
+        if (scatterPlotControl != null) {
+          foreach (var row in scatterPlotControl.Content.Rows) {
+            var color = row.VisualProperties.Color;
+            if (color.IsEmpty)
+              color = PreprocessingChartView.Colors.First();
+            row.VisualProperties.Color = Color.FromArgb((int)(opacity * 255), color);
+          }
+        }
+      }
     }
     #endregion
@@ -540,6 +694,11 @@
       int order = (int)polynomialRegressionOrderNumericUpDown.Value;
 
-      foreach (var control in bodyCache.Values) {
-        var scatterPlotControl = control as ScatterPlotControl;
+      foreach (var control in bodyCache.ToList()) {
+        // hidden chart => reset cache
+        if (!bodyTableLayoutPanel.Controls.Contains(control.Value)) {
+          bodyCache.Remove(control.Key);
+        }
+
+        var scatterPlotControl = control.Value as ScatterPlotControl;
         if (scatterPlotControl != null) {
           foreach (var row in scatterPlotControl.Content.Rows) {
@@ -553,7 +712,27 @@
     #endregion
 
+    #region Grouping
     private void groupingComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      aggregationComboBox.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 histogramControl = control.Value as DataTableControl;
+        if (histogramControl != null) {
+          foreach (var row in histogramControl.Content.Rows) {
+            row.VisualProperties.Aggregation = aggregation;
+          }
+        }
+      }
+    }
+    #endregion
   }
 }
