Index: /stable/HeuristicLab.Analysis.Views/3.3/DataRowVisualPropertiesControl.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataRowVisualPropertiesControl.Designer.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataRowVisualPropertiesControl.Designer.cs	(revision 15097)
@@ -49,21 +49,21 @@
       this.colorButton = new System.Windows.Forms.Button();
       this.startIndexZeroCheckBox = new System.Windows.Forms.CheckBox();
-      this.binsNumericUpDown = new System.Windows.Forms.NumericUpDown();
       this.label1 = new System.Windows.Forms.Label();
       this.label2 = new System.Windows.Forms.Label();
-      this.label3 = new System.Windows.Forms.Label();
       this.commonGroupBox = new System.Windows.Forms.GroupBox();
+      this.clearColorButton = new System.Windows.Forms.Button();
+      this.isVisibleInLegendCheckBox = new System.Windows.Forms.CheckBox();
+      this.label10 = new System.Windows.Forms.Label();
       this.displayNameTextBox = new System.Windows.Forms.TextBox();
       this.axisGroupBox = new System.Windows.Forms.GroupBox();
+      this.panel2 = new System.Windows.Forms.Panel();
       this.yAxisSecondaryRadioButton = new System.Windows.Forms.RadioButton();
+      this.yAxisPrimaryRadioButton = new System.Windows.Forms.RadioButton();
+      this.panel1 = new System.Windows.Forms.Panel();
       this.xAxisPrimaryRadioButton = new System.Windows.Forms.RadioButton();
-      this.yAxisPrimaryRadioButton = new System.Windows.Forms.RadioButton();
+      this.xAxisSecondaryRadioButton = new System.Windows.Forms.RadioButton();
       this.label5 = new System.Windows.Forms.Label();
-      this.xAxisSecondaryRadioButton = new System.Windows.Forms.RadioButton();
       this.label6 = new System.Windows.Forms.Label();
       this.label9 = new System.Windows.Forms.Label();
-      this.histoGramGroupBox = new System.Windows.Forms.GroupBox();
-      this.binsExactRadioButton = new System.Windows.Forms.RadioButton();
-      this.binsApproximatelyRadioButton = new System.Windows.Forms.RadioButton();
       this.lineChartGroupBox = new System.Windows.Forms.GroupBox();
       this.lineWidthNumericUpDown = new System.Windows.Forms.NumericUpDown();
@@ -72,14 +72,10 @@
       this.lineStyleComboBox = new System.Windows.Forms.ComboBox();
       this.label8 = new System.Windows.Forms.Label();
-      this.panel1 = new System.Windows.Forms.Panel();
-      this.panel2 = new System.Windows.Forms.Panel();
-      ((System.ComponentModel.ISupportInitialize)(this.binsNumericUpDown)).BeginInit();
       this.commonGroupBox.SuspendLayout();
       this.axisGroupBox.SuspendLayout();
-      this.histoGramGroupBox.SuspendLayout();
+      this.panel2.SuspendLayout();
+      this.panel1.SuspendLayout();
       this.lineChartGroupBox.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.lineWidthNumericUpDown)).BeginInit();
-      this.panel1.SuspendLayout();
-      this.panel2.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -90,7 +86,7 @@
       this.chartTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.chartTypeComboBox.FormattingEnabled = true;
-      this.chartTypeComboBox.Location = new System.Drawing.Point(57, 45);
+      this.chartTypeComboBox.Location = new System.Drawing.Point(102, 45);
       this.chartTypeComboBox.Name = "chartTypeComboBox";
-      this.chartTypeComboBox.Size = new System.Drawing.Size(264, 21);
+      this.chartTypeComboBox.Size = new System.Drawing.Size(219, 21);
       this.chartTypeComboBox.TabIndex = 3;
       this.chartTypeComboBox.SelectedValueChanged += new System.EventHandler(this.chartTypeComboBox_SelectedValueChanged);
@@ -103,5 +99,5 @@
       // 
       this.colorButton.BackColor = System.Drawing.SystemColors.Control;
-      this.colorButton.Location = new System.Drawing.Point(56, 72);
+      this.colorButton.Location = new System.Drawing.Point(102, 72);
       this.colorButton.Name = "colorButton";
       this.colorButton.Size = new System.Drawing.Size(23, 23);
@@ -121,24 +117,4 @@
       this.startIndexZeroCheckBox.CheckedChanged += new System.EventHandler(this.startIndexZeroCheckBox_CheckedChanged);
       // 
-      // binsNumericUpDown
-      // 
-      this.binsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.binsNumericUpDown.Location = new System.Drawing.Point(57, 19);
-      this.binsNumericUpDown.Minimum = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-      this.binsNumericUpDown.Name = "binsNumericUpDown";
-      this.binsNumericUpDown.Size = new System.Drawing.Size(97, 20);
-      this.binsNumericUpDown.TabIndex = 1;
-      this.binsNumericUpDown.Value = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-      this.binsNumericUpDown.ValueChanged += new System.EventHandler(this.binsNumericUpDown_ValueChanged);
-      // 
       // label1
       // 
@@ -159,17 +135,11 @@
       this.label2.Text = "&Color:";
       // 
-      // label3
-      // 
-      this.label3.AutoSize = true;
-      this.label3.Location = new System.Drawing.Point(6, 21);
-      this.label3.Name = "label3";
-      this.label3.Size = new System.Drawing.Size(30, 13);
-      this.label3.TabIndex = 0;
-      this.label3.Text = "&Bins:";
-      // 
       // commonGroupBox
       // 
       this.commonGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
+      this.commonGroupBox.Controls.Add(this.clearColorButton);
+      this.commonGroupBox.Controls.Add(this.isVisibleInLegendCheckBox);
+      this.commonGroupBox.Controls.Add(this.label10);
       this.commonGroupBox.Controls.Add(this.displayNameTextBox);
       this.commonGroupBox.Controls.Add(this.axisGroupBox);
@@ -181,16 +151,52 @@
       this.commonGroupBox.Location = new System.Drawing.Point(0, 0);
       this.commonGroupBox.Name = "commonGroupBox";
-      this.commonGroupBox.Size = new System.Drawing.Size(327, 174);
+      this.commonGroupBox.Size = new System.Drawing.Size(327, 199);
       this.commonGroupBox.TabIndex = 0;
       this.commonGroupBox.TabStop = false;
       this.commonGroupBox.Text = "Common";
       // 
+      // clearColorButton
+      // 
+      this.clearColorButton.BackColor = System.Drawing.SystemColors.ActiveCaption;
+      this.clearColorButton.Cursor = System.Windows.Forms.Cursors.Default;
+      this.clearColorButton.FlatAppearance.BorderSize = 0;
+      this.clearColorButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.clearColorButton.ForeColor = System.Drawing.Color.Transparent;
+      this.clearColorButton.Location = new System.Drawing.Point(128, 76);
+      this.clearColorButton.Margin = new System.Windows.Forms.Padding(0);
+      this.clearColorButton.Name = "clearColorButton";
+      this.clearColorButton.Size = new System.Drawing.Size(15, 16);
+      this.clearColorButton.TabIndex = 10;
+      this.clearColorButton.TabStop = false;
+      this.clearColorButton.UseVisualStyleBackColor = false;
+      this.clearColorButton.Click += new System.EventHandler(this.clearColorButton_Click);
+      // 
+      // isVisibleInLegendCheckBox
+      // 
+      this.isVisibleInLegendCheckBox.AutoSize = true;
+      this.isVisibleInLegendCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.isVisibleInLegendCheckBox.Location = new System.Drawing.Point(102, 104);
+      this.isVisibleInLegendCheckBox.Name = "isVisibleInLegendCheckBox";
+      this.isVisibleInLegendCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.isVisibleInLegendCheckBox.TabIndex = 8;
+      this.isVisibleInLegendCheckBox.UseVisualStyleBackColor = true;
+      this.isVisibleInLegendCheckBox.CheckedChanged += new System.EventHandler(this.isVisibleInLegendCheckBox_CheckedChanged);
+      // 
+      // label10
+      // 
+      this.label10.AutoSize = true;
+      this.label10.Location = new System.Drawing.Point(6, 104);
+      this.label10.Name = "label10";
+      this.label10.Size = new System.Drawing.Size(90, 13);
+      this.label10.TabIndex = 7;
+      this.label10.Text = "&Visible in Legend:";
+      // 
       // displayNameTextBox
       // 
       this.displayNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.displayNameTextBox.Location = new System.Drawing.Point(57, 19);
+      this.displayNameTextBox.Location = new System.Drawing.Point(102, 19);
       this.displayNameTextBox.Name = "displayNameTextBox";
-      this.displayNameTextBox.Size = new System.Drawing.Size(264, 20);
+      this.displayNameTextBox.Size = new System.Drawing.Size(219, 20);
       this.displayNameTextBox.TabIndex = 1;
       this.displayNameTextBox.Validated += new System.EventHandler(this.displayNameTextBox_Validated);
@@ -205,5 +211,5 @@
       this.axisGroupBox.Controls.Add(this.label5);
       this.axisGroupBox.Controls.Add(this.label6);
-      this.axisGroupBox.Location = new System.Drawing.Point(6, 101);
+      this.axisGroupBox.Location = new System.Drawing.Point(6, 126);
       this.axisGroupBox.Name = "axisGroupBox";
       this.axisGroupBox.Size = new System.Drawing.Size(315, 67);
@@ -211,4 +217,15 @@
       this.axisGroupBox.TabStop = false;
       this.axisGroupBox.Text = "Axes";
+      // 
+      // panel2
+      // 
+      this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel2.Controls.Add(this.yAxisSecondaryRadioButton);
+      this.panel2.Controls.Add(this.yAxisPrimaryRadioButton);
+      this.panel2.Location = new System.Drawing.Point(51, 42);
+      this.panel2.Name = "panel2";
+      this.panel2.Size = new System.Drawing.Size(258, 17);
+      this.panel2.TabIndex = 7;
       // 
       // yAxisSecondaryRadioButton
@@ -224,4 +241,27 @@
       this.yAxisSecondaryRadioButton.CheckedChanged += new System.EventHandler(this.yAxisRadioButton_CheckedChanged);
       // 
+      // yAxisPrimaryRadioButton
+      // 
+      this.yAxisPrimaryRadioButton.AutoSize = true;
+      this.yAxisPrimaryRadioButton.Location = new System.Drawing.Point(0, 0);
+      this.yAxisPrimaryRadioButton.Name = "yAxisPrimaryRadioButton";
+      this.yAxisPrimaryRadioButton.Size = new System.Drawing.Size(59, 17);
+      this.yAxisPrimaryRadioButton.TabIndex = 4;
+      this.yAxisPrimaryRadioButton.TabStop = true;
+      this.yAxisPrimaryRadioButton.Text = "&Primary";
+      this.yAxisPrimaryRadioButton.UseVisualStyleBackColor = true;
+      this.yAxisPrimaryRadioButton.CheckedChanged += new System.EventHandler(this.yAxisRadioButton_CheckedChanged);
+      // 
+      // panel1
+      // 
+      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel1.Controls.Add(this.xAxisPrimaryRadioButton);
+      this.panel1.Controls.Add(this.xAxisSecondaryRadioButton);
+      this.panel1.Location = new System.Drawing.Point(51, 19);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(258, 17);
+      this.panel1.TabIndex = 6;
+      // 
       // xAxisPrimaryRadioButton
       // 
@@ -236,25 +276,4 @@
       this.xAxisPrimaryRadioButton.CheckedChanged += new System.EventHandler(this.xAxisRadioButton_CheckedChanged);
       // 
-      // yAxisPrimaryRadioButton
-      // 
-      this.yAxisPrimaryRadioButton.AutoSize = true;
-      this.yAxisPrimaryRadioButton.Location = new System.Drawing.Point(0, 0);
-      this.yAxisPrimaryRadioButton.Name = "yAxisPrimaryRadioButton";
-      this.yAxisPrimaryRadioButton.Size = new System.Drawing.Size(59, 17);
-      this.yAxisPrimaryRadioButton.TabIndex = 4;
-      this.yAxisPrimaryRadioButton.TabStop = true;
-      this.yAxisPrimaryRadioButton.Text = "&Primary";
-      this.yAxisPrimaryRadioButton.UseVisualStyleBackColor = true;
-      this.yAxisPrimaryRadioButton.CheckedChanged += new System.EventHandler(this.yAxisRadioButton_CheckedChanged);
-      // 
-      // label5
-      // 
-      this.label5.AutoSize = true;
-      this.label5.Location = new System.Drawing.Point(6, 44);
-      this.label5.Name = "label5";
-      this.label5.Size = new System.Drawing.Size(39, 13);
-      this.label5.TabIndex = 3;
-      this.label5.Text = "&Y-Axis:";
-      // 
       // xAxisSecondaryRadioButton
       // 
@@ -269,4 +288,13 @@
       this.xAxisSecondaryRadioButton.CheckedChanged += new System.EventHandler(this.xAxisRadioButton_CheckedChanged);
       // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(6, 44);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(39, 13);
+      this.label5.TabIndex = 3;
+      this.label5.Text = "&Y-Axis:";
+      // 
       // label6
       // 
@@ -287,45 +315,4 @@
       this.label9.Text = "&Name:";
       // 
-      // histoGramGroupBox
-      // 
-      this.histoGramGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.histoGramGroupBox.Controls.Add(this.binsExactRadioButton);
-      this.histoGramGroupBox.Controls.Add(this.binsApproximatelyRadioButton);
-      this.histoGramGroupBox.Controls.Add(this.binsNumericUpDown);
-      this.histoGramGroupBox.Controls.Add(this.label3);
-      this.histoGramGroupBox.Location = new System.Drawing.Point(0, 280);
-      this.histoGramGroupBox.Name = "histoGramGroupBox";
-      this.histoGramGroupBox.Size = new System.Drawing.Size(327, 47);
-      this.histoGramGroupBox.TabIndex = 2;
-      this.histoGramGroupBox.TabStop = false;
-      this.histoGramGroupBox.Text = "Histogram Properties";
-      // 
-      // binsExactRadioButton
-      // 
-      this.binsExactRadioButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.binsExactRadioButton.AutoSize = true;
-      this.binsExactRadioButton.Location = new System.Drawing.Point(269, 19);
-      this.binsExactRadioButton.Name = "binsExactRadioButton";
-      this.binsExactRadioButton.Size = new System.Drawing.Size(52, 17);
-      this.binsExactRadioButton.TabIndex = 3;
-      this.binsExactRadioButton.TabStop = true;
-      this.binsExactRadioButton.Text = "&Exact";
-      this.binsExactRadioButton.UseVisualStyleBackColor = true;
-      this.binsExactRadioButton.CheckedChanged += new System.EventHandler(this.binNumberRadioButton_CheckedChanged);
-      // 
-      // binsApproximatelyRadioButton
-      // 
-      this.binsApproximatelyRadioButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.binsApproximatelyRadioButton.AutoSize = true;
-      this.binsApproximatelyRadioButton.Location = new System.Drawing.Point(173, 19);
-      this.binsApproximatelyRadioButton.Name = "binsApproximatelyRadioButton";
-      this.binsApproximatelyRadioButton.Size = new System.Drawing.Size(90, 17);
-      this.binsApproximatelyRadioButton.TabIndex = 2;
-      this.binsApproximatelyRadioButton.TabStop = true;
-      this.binsApproximatelyRadioButton.Text = "&Approximately";
-      this.binsApproximatelyRadioButton.UseVisualStyleBackColor = true;
-      this.binsApproximatelyRadioButton.CheckedChanged += new System.EventHandler(this.binNumberRadioButton_CheckedChanged);
-      // 
       // lineChartGroupBox
       // 
@@ -338,5 +325,5 @@
       this.lineChartGroupBox.Controls.Add(this.lineStyleComboBox);
       this.lineChartGroupBox.Controls.Add(this.label8);
-      this.lineChartGroupBox.Location = new System.Drawing.Point(0, 180);
+      this.lineChartGroupBox.Location = new System.Drawing.Point(0, 205);
       this.lineChartGroupBox.Name = "lineChartGroupBox";
       this.lineChartGroupBox.Size = new System.Drawing.Size(327, 94);
@@ -404,49 +391,22 @@
       this.label8.Text = "&Style:";
       // 
-      // panel1
-      // 
-      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.panel1.Controls.Add(this.xAxisPrimaryRadioButton);
-      this.panel1.Controls.Add(this.xAxisSecondaryRadioButton);
-      this.panel1.Location = new System.Drawing.Point(51, 19);
-      this.panel1.Name = "panel1";
-      this.panel1.Size = new System.Drawing.Size(258, 17);
-      this.panel1.TabIndex = 6;
-      // 
-      // panel2
-      // 
-      this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.panel2.Controls.Add(this.yAxisSecondaryRadioButton);
-      this.panel2.Controls.Add(this.yAxisPrimaryRadioButton);
-      this.panel2.Location = new System.Drawing.Point(51, 42);
-      this.panel2.Name = "panel2";
-      this.panel2.Size = new System.Drawing.Size(258, 17);
-      this.panel2.TabIndex = 7;
-      // 
       // DataRowVisualPropertiesControl
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.lineChartGroupBox);
-      this.Controls.Add(this.histoGramGroupBox);
       this.Controls.Add(this.commonGroupBox);
       this.Name = "DataRowVisualPropertiesControl";
-      this.Size = new System.Drawing.Size(327, 331);
-      ((System.ComponentModel.ISupportInitialize)(this.binsNumericUpDown)).EndInit();
+      this.Size = new System.Drawing.Size(327, 300);
       this.commonGroupBox.ResumeLayout(false);
       this.commonGroupBox.PerformLayout();
       this.axisGroupBox.ResumeLayout(false);
       this.axisGroupBox.PerformLayout();
-      this.histoGramGroupBox.ResumeLayout(false);
-      this.histoGramGroupBox.PerformLayout();
+      this.panel2.ResumeLayout(false);
+      this.panel2.PerformLayout();
+      this.panel1.ResumeLayout(false);
+      this.panel1.PerformLayout();
       this.lineChartGroupBox.ResumeLayout(false);
       this.lineChartGroupBox.PerformLayout();
       ((System.ComponentModel.ISupportInitialize)(this.lineWidthNumericUpDown)).EndInit();
-      this.panel1.ResumeLayout(false);
-      this.panel1.PerformLayout();
-      this.panel2.ResumeLayout(false);
-      this.panel2.PerformLayout();
       this.ResumeLayout(false);
 
@@ -459,10 +419,7 @@
     private System.Windows.Forms.Button colorButton;
     private System.Windows.Forms.CheckBox startIndexZeroCheckBox;
-    private System.Windows.Forms.NumericUpDown binsNumericUpDown;
     private System.Windows.Forms.Label label1;
     private System.Windows.Forms.Label label2;
-    private System.Windows.Forms.Label label3;
     private System.Windows.Forms.GroupBox commonGroupBox;
-    private System.Windows.Forms.GroupBox histoGramGroupBox;
     private System.Windows.Forms.RadioButton xAxisSecondaryRadioButton;
     private System.Windows.Forms.RadioButton yAxisSecondaryRadioButton;
@@ -474,6 +431,4 @@
     private System.Windows.Forms.Label label4;
     private System.Windows.Forms.Label label7;
-    private System.Windows.Forms.RadioButton binsExactRadioButton;
-    private System.Windows.Forms.RadioButton binsApproximatelyRadioButton;
     private System.Windows.Forms.ComboBox lineStyleComboBox;
     private System.Windows.Forms.Label label8;
@@ -484,4 +439,7 @@
     private System.Windows.Forms.Panel panel2;
     private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.Label label10;
+    private System.Windows.Forms.CheckBox isVisibleInLegendCheckBox;
+    private System.Windows.Forms.Button clearColorButton;
   }
 }
Index: /stable/HeuristicLab.Analysis.Views/3.3/DataRowVisualPropertiesControl.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataRowVisualPropertiesControl.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataRowVisualPropertiesControl.cs	(revision 15097)
@@ -23,4 +23,5 @@
 using System.Drawing;
 using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
@@ -45,4 +46,6 @@
       chartTypeComboBox.DataSource = Enum.GetValues(typeof(DataRowVisualProperties.DataRowChartType));
       lineStyleComboBox.DataSource = Enum.GetValues(typeof(DataRowVisualProperties.DataRowLineStyle));
+      clearColorButton.BackColor = Color.Transparent;
+      clearColorButton.BackgroundImage = VSImageLibrary.Delete;
       SetEnabledStateOfControls();
     }
@@ -62,7 +65,4 @@
           startIndexZeroCheckBox.Checked = false;
           lineWidthNumericUpDown.Value = 1;
-          binsNumericUpDown.Value = 1;
-          binsApproximatelyRadioButton.Checked = false;
-          binsExactRadioButton.Checked = false;
           displayNameTextBox.Text = String.Empty;
         } else {
@@ -86,12 +86,6 @@
             lineWidthNumericUpDown.Value = lineWidthNumericUpDown.Maximum;
           else lineWidthNumericUpDown.Value = Content.LineWidth;
-          if (Content.Bins < binsNumericUpDown.Minimum)
-            binsNumericUpDown.Value = binsNumericUpDown.Minimum;
-          else if (Content.Bins > binsNumericUpDown.Maximum)
-            binsNumericUpDown.Value = binsNumericUpDown.Maximum;
-          else binsNumericUpDown.Value = Content.Bins;
-          binsApproximatelyRadioButton.Checked = !Content.ExactBins;
-          binsExactRadioButton.Checked = Content.ExactBins;
           displayNameTextBox.Text = Content.DisplayName;
+          isVisibleInLegendCheckBox.Checked = Content.IsVisibleInLegend;
         }
       } finally { SuppressEvents = false; }
@@ -101,6 +95,7 @@
     protected virtual void SetEnabledStateOfControls() {
       commonGroupBox.Enabled = Content != null;
+      clearColorButton.Visible = Content != null && !Content.Color.IsEmpty;
       lineChartGroupBox.Enabled = Content != null && Content.ChartType == DataRowVisualProperties.DataRowChartType.Line;
-      histoGramGroupBox.Enabled = Content != null && Content.ChartType == DataRowVisualProperties.DataRowChartType.Histogram;
+      isVisibleInLegendCheckBox.Enabled = Content != null;
     }
 
@@ -126,4 +121,17 @@
         colorButton.BackColor = Content.Color;
         colorButton.Text = String.Empty;
+        clearColorButton.Visible = true;
+      }
+    }
+
+    private void clearColorButton_Click(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        SuppressEvents = true;
+        try {
+          Content.Color = Color.Empty;
+          colorButton.BackColor = SystemColors.Control;
+          colorButton.Text = "?";
+          clearColorButton.Visible = false;
+        } finally { SuppressEvents = false; }
       }
     }
@@ -165,19 +173,4 @@
     }
 
-    private void binsNumericUpDown_ValueChanged(object sender, EventArgs e) {
-      if (!SuppressEvents && Content != null) {
-        Content.Bins = (int)binsNumericUpDown.Value;
-      }
-    }
-
-    private void binNumberRadioButton_CheckedChanged(object sender, EventArgs e) {
-      if (!SuppressEvents && Content != null) {
-        SuppressEvents = true;
-        try {
-          Content.ExactBins = binsExactRadioButton.Checked;
-        } finally { SuppressEvents = false; }
-      }
-    }
-
     private void displayNameTextBox_Validated(object sender, EventArgs e) {
       if (!SuppressEvents && Content != null) {
@@ -188,4 +181,10 @@
       }
     }
+
+    private void isVisibleInLegendCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        Content.IsVisibleInLegend = isVisibleInLegendCheckBox.Checked;
+      }
+    }
     #endregion
   }
Index: /stable/HeuristicLab.Analysis.Views/3.3/DataTableView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataTableView.Designer.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataTableView.Designer.cs	(revision 15097)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
@@ -50,4 +51,5 @@
       System.Windows.Forms.DataVisualization.Charting.Title title1 = new System.Windows.Forms.DataVisualization.Charting.Title();
       this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.configureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
@@ -60,7 +62,7 @@
       this.nameTextBox.Location = new System.Drawing.Point(55, 0);
       this.nameTextBox.Size = new System.Drawing.Size(279, 20);
-      // 
+      //
       // infoLabel
-      // 
+      //
       this.infoLabel.Location = new System.Drawing.Point(340, 3);
       // 
@@ -68,6 +70,6 @@
       // 
       this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.chart.BorderlineColor = System.Drawing.Color.Black;
       this.chart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
@@ -81,4 +83,5 @@
       legend1.Alignment = System.Drawing.StringAlignment.Center;
       legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.LegendItemOrder = System.Windows.Forms.DataVisualization.Charting.LegendItemOrder.ReversedSeriesOrder;
       legend1.Name = "Default";
       this.chart.Legends.Add(legend1);
@@ -100,15 +103,21 @@
       this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
       // 
+      // configureToolStripMenuItem
+      // 
+      this.configureToolStripMenuItem.Name = "configureToolStripMenuItem";
+      this.configureToolStripMenuItem.Size = new System.Drawing.Size(256, 22);
+      this.configureToolStripMenuItem.Text = "Configure Chart...";
+      this.configureToolStripMenuItem.Click += new System.EventHandler(this.configureToolStripMenuItem_Click);
+      // 
       // DataTableView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.chart);
       this.Name = "DataTableView";
       this.Size = new System.Drawing.Size(359, 274);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.chart, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
@@ -121,5 +130,5 @@
 
     protected HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
-
+    private System.Windows.Forms.ToolStripMenuItem configureToolStripMenuItem;
   }
 }
Index: /stable/HeuristicLab.Analysis.Views/3.3/DataTableView.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataTableView.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataTableView.cs	(revision 15097)
@@ -20,7 +20,4 @@
 #endregion
 
-using HeuristicLab.Collections;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
 using System;
 using System.Collections.Generic;
@@ -29,4 +26,7 @@
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Analysis.Views {
@@ -36,8 +36,19 @@
     protected List<Series> invisibleSeries;
     protected Dictionary<IObservableList<double>, DataRow> valuesRowsTable;
+    protected bool showChartOnly = false;
 
     public new DataTable Content {
       get { return (DataTable)base.Content; }
       set { base.Content = value; }
+    }
+
+    public bool ShowChartOnly {
+      get { return showChartOnly; }
+      set {
+        if (showChartOnly != value) {
+          showChartOnly = value;
+          UpdateControlsVisibility();
+        }
+      }
     }
 
@@ -48,4 +59,5 @@
       chart.CustomizeAllChartAreas();
       chart.ChartAreas[0].CursorX.Interval = 1;
+      chart.ContextMenuStrip.Items.Add(configureToolStripMenuItem);
     }
 
@@ -59,8 +71,6 @@
       Content.Rows.ItemsReplaced -= new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsReplaced);
       Content.Rows.CollectionReset -= new CollectionItemsChangedEventHandler<DataRow>(Rows_CollectionReset);
-      base.DeregisterContentEvents();
     }
     protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
       Content.VisualPropertiesChanged += new EventHandler(Content_VisualPropertiesChanged);
       Content.Rows.ItemsAdded += new CollectionItemsChangedEventHandler<DataRow>(Rows_ItemsAdded);
@@ -102,4 +112,5 @@
       if (Content != null) {
         chart.Titles[0].Text = Content.Name;
+        chart.Titles[0].Visible = !string.IsNullOrEmpty(Content.Name);
         AddDataRows(Content.Rows);
         ConfigureChartArea(chart.ChartAreas[0]);
@@ -120,8 +131,23 @@
       } else MessageBox.Show("Nothing to configure.");
     }
+
+    protected void UpdateControlsVisibility() {
+      if (InvokeRequired)
+        Invoke(new Action(UpdateControlsVisibility));
+      else {
+        foreach (Control c in Controls) {
+          if (c == chart) continue;
+          c.Visible = !showChartOnly;
+        }
+        chart.Dock = showChartOnly ? DockStyle.Fill : DockStyle.None;
+      }
+    }
+
     protected virtual void AddDataRows(IEnumerable<DataRow> rows) {
       foreach (var row in rows) {
         RegisterDataRowEvents(row);
-        var series = new Series(row.Name);
+        var series = new Series(row.Name) {
+          Tag = row
+        };
         if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
         else series.LegendText = row.Name;
@@ -133,4 +159,5 @@
       RecalculateAxesScale(chart.ChartAreas[0]);
       UpdateYCursorInterval();
+      UpdateHistogramTransparency();
     }
 
@@ -179,5 +206,8 @@
           break;
         case DataRowVisualProperties.DataRowChartType.Histogram:
-          series.ChartType = SeriesChartType.Column;
+          bool stacked = Content.VisualProperties.HistogramAggregation == DataTableVisualProperties.DataTableHistogramAggregation.Stacked;
+          series.ChartType = stacked ? SeriesChartType.StackedColumn : SeriesChartType.Column;
+          bool sideBySide = Content.VisualProperties.HistogramAggregation == DataTableVisualProperties.DataTableHistogramAggregation.SideBySide;
+          series.SetCustomProperty("DrawSideBySide", sideBySide ? "True" : "False");
           series.SetCustomProperty("PointWidth", "1");
           if (!series.Color.IsEmpty && series.Color.GetBrightness() < 0.25)
@@ -215,4 +245,5 @@
       if (!Content.VisualProperties.TitleColor.IsEmpty) chart.Titles[0].ForeColor = Content.VisualProperties.TitleColor;
       chart.Titles[0].Text = Content.VisualProperties.Title;
+      chart.Titles[0].Visible = !string.IsNullOrEmpty(Content.VisualProperties.Title);
 
       if (Content.VisualProperties.AxisTitleFont != null) area.AxisX.TitleFont = Content.VisualProperties.AxisTitleFont;
@@ -279,4 +310,27 @@
     }
 
+    protected void UpdateHistogramTransparency() {
+      if (Content.Rows.Any(r => RequiresTransparency(r) && r.VisualProperties.Color.IsEmpty)) {
+        foreach (var series in chart.Series) // sync colors before applying palette colors
+          series.Color = ((DataRow)series.Tag).VisualProperties.Color;
+        chart.ApplyPaletteColors();
+      }
+
+      var numTransparent = Content.Rows.Count(RequiresTransparency);
+      if (numTransparent <= 1) return;
+      foreach (var series in chart.Series) {
+        var row = (DataRow)series.Tag;
+        if (!RequiresTransparency(row))
+          continue;
+        var baseColor = row.VisualProperties.Color;
+        if (baseColor.IsEmpty) baseColor = series.Color;
+        series.Color = Color.FromArgb(180, baseColor);
+      }
+    }
+    private bool RequiresTransparency(DataRow row) {
+      return row.VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Histogram
+             && Content.VisualProperties.HistogramAggregation == DataTableVisualProperties.DataTableHistogramAggregation.Overlapping;
+    }
+
     #region Event Handlers
     #region Content Event Handlers
@@ -285,5 +339,5 @@
         Invoke(new EventHandler(Content_NameChanged), sender, e);
       else {
-        chart.Titles[0].Text = Content.Name;
+        Content.VisualProperties.Title = Content.Name;
         base.Content_NameChanged(sender, e);
       }
@@ -295,4 +349,9 @@
         ConfigureChartArea(chart.ChartAreas[0]);
         RecalculateAxesScale(chart.ChartAreas[0]); // axes min/max could have changed
+
+        chart.Update(); // side-by-side and stacked histograms are not always correctly displayed without an update
+        // (chart update is required before the series are updated, otherwise the widths of the bars are updated incorrectly)
+        foreach (var row in Content.Rows.Where(r => r.VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Histogram))
+          Row_VisualPropertiesChanged(row, EventArgs.Empty); // Histogram properties could have changed
       }
     }
@@ -339,6 +398,9 @@
         series.Points.Clear();
         ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-        RecalculateAxesScale(chart.ChartAreas[0]);
+        if (!invisibleSeries.Contains(series)) {
+          FillSeriesWithRowValues(series, row);
+          RecalculateAxesScale(chart.ChartAreas[0]);
+          UpdateHistogramTransparency();
+        }
       }
     }
@@ -451,4 +513,7 @@
     }
     #endregion
+    private void configureToolStripMenuItem_Click(object sender, EventArgs e) {
+      ShowConfiguration();
+    }
     #endregion
 
@@ -502,5 +567,18 @@
       switch (row.VisualProperties.ChartType) {
         case DataRowVisualProperties.DataRowChartType.Histogram:
-          CalculateHistogram(series, row);
+          // when a single histogram is updated, all histograms must be updated. otherwise the value ranges may not be equal.
+          var histograms = Content.Rows
+            .Where(r => r.VisualProperties.ChartType == DataRowVisualProperties.DataRowChartType.Histogram)
+            .ToList();
+          CalculateHistogram(series, row, histograms);
+          foreach (var h in from r in histograms
+                            where r != row
+                            let s = chart.Series.FindByName(r.Name)
+                            where s != null
+                            where !invisibleSeries.Contains(s)
+                            select new { row = r, series = s }) {
+            h.series.Points.Clear();
+            CalculateHistogram(h.series, h.row, histograms);
+          }
           break;
         default: {
@@ -526,12 +604,15 @@
     }
 
-    protected virtual void CalculateHistogram(Series series, DataRow row) {
+    protected virtual void CalculateHistogram(Series series, DataRow row, IEnumerable<DataRow> histogramRows) {
       series.Points.Clear();
       if (!row.Values.Any()) return;
-      int bins = row.VisualProperties.Bins;
-
-      double minValue = row.Values.Min();
-      double maxValue = row.Values.Max();
-      double intervalWidth = (maxValue - minValue) / bins;
+
+      var validValues = histogramRows.SelectMany(r => r.Values).Where(x => !IsInvalidValue(x)).ToList();
+      if (!validValues.Any()) return;
+
+      int bins = Content.VisualProperties.HistogramBins;
+      decimal minValue = (decimal)validValues.Min();
+      decimal maxValue = (decimal)validValues.Max();
+      decimal intervalWidth = (maxValue - minValue) / bins;
       if (intervalWidth < 0) return;
       if (intervalWidth == 0) {
@@ -540,21 +621,21 @@
       }
 
-      if (!row.VisualProperties.ExactBins) {
-        intervalWidth = HumanRoundRange(intervalWidth);
+      if (!Content.VisualProperties.HistogramExactBins) {
+        intervalWidth = (decimal)HumanRoundRange((double)intervalWidth);
         minValue = Math.Floor(minValue / intervalWidth) * intervalWidth;
         maxValue = Math.Ceiling(maxValue / intervalWidth) * intervalWidth;
       }
 
-      double intervalCenter = intervalWidth / 2;
-
-      double min = 0.0, max = 0.0;
+      decimal intervalCenter = intervalWidth / 2;
+
+      decimal min = 0.0m, max = 0.0m;
       if (!Double.IsNaN(Content.VisualProperties.XAxisMinimumFixedValue) && !Content.VisualProperties.XAxisMinimumAuto)
-        min = Content.VisualProperties.XAxisMinimumFixedValue;
+        min = (decimal)Content.VisualProperties.XAxisMinimumFixedValue;
       else min = minValue;
       if (!Double.IsNaN(Content.VisualProperties.XAxisMaximumFixedValue) && !Content.VisualProperties.XAxisMaximumAuto)
-        max = Content.VisualProperties.XAxisMaximumFixedValue;
+        max = (decimal)Content.VisualProperties.XAxisMaximumFixedValue;
       else max = maxValue + intervalWidth;
 
-      double axisInterval = intervalWidth / row.VisualProperties.ScaleFactor;
+      double axisInterval = (double)intervalWidth / row.VisualProperties.ScaleFactor;
 
       var area = chart.ChartAreas[0];
@@ -564,5 +645,5 @@
 
       // get the range or intervals which define the grouping of the frequency values
-      var doubleRange = DoubleRange(min, max, intervalWidth).Skip(1).ToList();
+      var range = Range(min, max, intervalWidth).Skip(1).ToList();
 
       // aggregate the row values by unique key and frequency value
@@ -573,14 +654,15 @@
                               select new Tuple<double, double>(g.First(), g.Count())).ToList();
 
-      // shift the chart to the left so the bars are placed on the intervals
-      if (valueFrequencies.First().Item1 < doubleRange.First())
-        series.Points.Add(new DataPoint(min - intervalWidth, 0));
+      // ensure that each column is displayed completely on the chart by adding two dummy datapoints on the upper and lower range
+      series.Points.Add(new DataPoint((double)(min - intervalWidth), 0));
+      series.Points.Add(new DataPoint((double)(max + intervalWidth), 0));
 
       // add data points
       int j = 0;
-      foreach (var d in doubleRange) {
+      int overallCount = row.Values.Count(x => !IsInvalidValue(x));
+      foreach (var d in range) {
         double sum = 0.0;
         // sum the frequency values that fall within the same interval
-        while (j < valueFrequencies.Count && valueFrequencies[j].Item1 < d) {
+        while (j < valueFrequencies.Count && (decimal)valueFrequencies[j].Item1 < d) {
           sum += valueFrequencies[j].Item2;
           ++j;
@@ -592,8 +674,8 @@
                               ? "Y"
                               : Content.VisualProperties.YAxisTitle;
-        series.Points.Add(new DataPoint(d - intervalCenter, sum) {
+        series.Points.Add(new DataPoint((double)(d - intervalCenter), sum) {
           ToolTip =
-            xAxisTitle + ": [" + (d - intervalWidth) + "-" + d + ")" + Environment.NewLine +
-            yAxisTitle + ": " + sum
+            string.Format("{0}: [{1} - {2})", xAxisTitle, (d - intervalWidth), d) + Environment.NewLine +
+            string.Format("{0}: {1} ({2:F2}%)", yAxisTitle, sum, sum / overallCount * 100)
         });
       }
@@ -601,6 +683,6 @@
 
     #region Helpers
-    public static IEnumerable<double> DoubleRange(double min, double max, double step) {
-      double i;
+    public static IEnumerable<decimal> Range(decimal min, decimal max, decimal step) {
+      decimal i;
       for (i = min; i <= max; i += step)
         yield return i;
Index: /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesControl.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesControl.Designer.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesControl.Designer.cs	(revision 15097)
@@ -105,4 +105,12 @@
       this.label7 = new System.Windows.Forms.Label();
       this.label8 = new System.Windows.Forms.Label();
+      this.histogramTabPage = new System.Windows.Forms.TabPage();
+      this.histogramGroupBox = new System.Windows.Forms.GroupBox();
+      this.histogramBinsExactRadioButton = new System.Windows.Forms.RadioButton();
+      this.histogramBinsApproximatelyRadioButton = new System.Windows.Forms.RadioButton();
+      this.histogramBinsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.label16 = new System.Windows.Forms.Label();
+      this.label17 = new System.Windows.Forms.Label();
+      this.histogramAggregationComboBox = new System.Windows.Forms.ComboBox();
       this.titleTextBox = new System.Windows.Forms.TextBox();
       this.label15 = new System.Windows.Forms.Label();
@@ -131,4 +139,7 @@
       this.panel6.SuspendLayout();
       this.panel5.SuspendLayout();
+      this.histogramTabPage.SuspendLayout();
+      this.histogramGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.histogramBinsNumericUpDown)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
@@ -489,4 +500,5 @@
       this.axisTabControl.Controls.Add(this.xAxisTabPage);
       this.axisTabControl.Controls.Add(this.yAxisTabPage);
+      this.axisTabControl.Controls.Add(this.histogramTabPage);
       this.axisTabControl.Location = new System.Drawing.Point(0, 84);
       this.axisTabControl.Name = "axisTabControl";
@@ -791,4 +803,107 @@
       this.label8.TabIndex = 2;
       this.label8.Text = "&Minimum:";
+      // 
+      // histogramTabPage
+      // 
+      this.histogramTabPage.Controls.Add(this.histogramGroupBox);
+      this.histogramTabPage.Location = new System.Drawing.Point(4, 22);
+      this.histogramTabPage.Name = "histogramTabPage";
+      this.histogramTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.histogramTabPage.Size = new System.Drawing.Size(447, 263);
+      this.histogramTabPage.TabIndex = 2;
+      this.histogramTabPage.Text = "Histogram";
+      this.histogramTabPage.UseVisualStyleBackColor = true;
+      // 
+      // histogramGroupBox
+      // 
+      this.histogramGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.histogramGroupBox.Controls.Add(this.histogramBinsExactRadioButton);
+      this.histogramGroupBox.Controls.Add(this.histogramBinsApproximatelyRadioButton);
+      this.histogramGroupBox.Controls.Add(this.histogramBinsNumericUpDown);
+      this.histogramGroupBox.Controls.Add(this.label16);
+      this.histogramGroupBox.Controls.Add(this.label17);
+      this.histogramGroupBox.Controls.Add(this.histogramAggregationComboBox);
+      this.histogramGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.histogramGroupBox.Name = "histogramGroupBox";
+      this.histogramGroupBox.Size = new System.Drawing.Size(441, 75);
+      this.histogramGroupBox.TabIndex = 2;
+      this.histogramGroupBox.TabStop = false;
+      this.histogramGroupBox.Text = "Histogram Properties";
+      // 
+      // histogramBinsExactRadioButton
+      // 
+      this.histogramBinsExactRadioButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.histogramBinsExactRadioButton.AutoSize = true;
+      this.histogramBinsExactRadioButton.Location = new System.Drawing.Point(383, 19);
+      this.histogramBinsExactRadioButton.Name = "histogramBinsExactRadioButton";
+      this.histogramBinsExactRadioButton.Size = new System.Drawing.Size(52, 17);
+      this.histogramBinsExactRadioButton.TabIndex = 3;
+      this.histogramBinsExactRadioButton.TabStop = true;
+      this.histogramBinsExactRadioButton.Text = "&Exact";
+      this.histogramBinsExactRadioButton.UseVisualStyleBackColor = true;
+      this.histogramBinsExactRadioButton.CheckedChanged += new System.EventHandler(this.histogramBinsExactRadioButton_CheckedChanged);
+      // 
+      // histogramBinsApproximatelyRadioButton
+      // 
+      this.histogramBinsApproximatelyRadioButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.histogramBinsApproximatelyRadioButton.AutoSize = true;
+      this.histogramBinsApproximatelyRadioButton.Location = new System.Drawing.Point(287, 19);
+      this.histogramBinsApproximatelyRadioButton.Name = "histogramBinsApproximatelyRadioButton";
+      this.histogramBinsApproximatelyRadioButton.Size = new System.Drawing.Size(90, 17);
+      this.histogramBinsApproximatelyRadioButton.TabIndex = 2;
+      this.histogramBinsApproximatelyRadioButton.TabStop = true;
+      this.histogramBinsApproximatelyRadioButton.Text = "&Approximately";
+      this.histogramBinsApproximatelyRadioButton.UseVisualStyleBackColor = true;
+      // 
+      // histogramBinsNumericUpDown
+      // 
+      this.histogramBinsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.histogramBinsNumericUpDown.Location = new System.Drawing.Point(82, 19);
+      this.histogramBinsNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.histogramBinsNumericUpDown.Name = "histogramBinsNumericUpDown";
+      this.histogramBinsNumericUpDown.Size = new System.Drawing.Size(186, 20);
+      this.histogramBinsNumericUpDown.TabIndex = 1;
+      this.histogramBinsNumericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.histogramBinsNumericUpDown.ValueChanged += new System.EventHandler(this.histogramBinsNumericUpDown_ValueChanged);
+      // 
+      // label16
+      // 
+      this.label16.AutoSize = true;
+      this.label16.Location = new System.Drawing.Point(6, 49);
+      this.label16.Name = "label16";
+      this.label16.Size = new System.Drawing.Size(67, 13);
+      this.label16.TabIndex = 0;
+      this.label16.Text = "Aggregation:";
+      // 
+      // label17
+      // 
+      this.label17.AutoSize = true;
+      this.label17.Location = new System.Drawing.Point(6, 21);
+      this.label17.Name = "label17";
+      this.label17.Size = new System.Drawing.Size(30, 13);
+      this.label17.TabIndex = 0;
+      this.label17.Text = "&Bins:";
+      // 
+      // histogramAggregationComboBox
+      // 
+      this.histogramAggregationComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.histogramAggregationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.histogramAggregationComboBox.FormattingEnabled = true;
+      this.histogramAggregationComboBox.Location = new System.Drawing.Point(82, 45);
+      this.histogramAggregationComboBox.Name = "histogramAggregationComboBox";
+      this.histogramAggregationComboBox.Size = new System.Drawing.Size(353, 21);
+      this.histogramAggregationComboBox.TabIndex = 3;
+      this.histogramAggregationComboBox.SelectedValueChanged += new System.EventHandler(this.histogramAggregationComboBox_SelectedValueChanged);
       // 
       // titleTextBox
@@ -927,4 +1042,8 @@
       this.panel5.ResumeLayout(false);
       this.panel5.PerformLayout();
+      this.histogramTabPage.ResumeLayout(false);
+      this.histogramGroupBox.ResumeLayout(false);
+      this.histogramGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.histogramBinsNumericUpDown)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
@@ -1005,4 +1124,12 @@
     private System.Windows.Forms.CheckBox yAxisSecondaryLogScaleCheckBox;
     private System.Windows.Forms.CheckBox yAxisPrimaryLogScaleCheckBox;
+    private System.Windows.Forms.TabPage histogramTabPage;
+    private System.Windows.Forms.GroupBox histogramGroupBox;
+    private System.Windows.Forms.RadioButton histogramBinsExactRadioButton;
+    private System.Windows.Forms.RadioButton histogramBinsApproximatelyRadioButton;
+    private System.Windows.Forms.NumericUpDown histogramBinsNumericUpDown;
+    private System.Windows.Forms.Label label16;
+    private System.Windows.Forms.Label label17;
+    private System.Windows.Forms.ComboBox histogramAggregationComboBox;
   }
 }
Index: /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesControl.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesControl.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesControl.cs	(revision 15097)
@@ -20,8 +20,9 @@
 #endregion
 
+using System;
+using System.Drawing;
+using System.Windows.Forms;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
-using System.Drawing;
-using System.Windows.Forms;
 
 namespace HeuristicLab.Analysis.Views {
@@ -58,4 +59,5 @@
       errorProvider.SetIconPadding(yAxisSecondaryMinimumFixedTextBox, 2);
       errorProvider.SetIconPadding(yAxisSecondaryMaximumFixedTextBox, 2);
+      histogramAggregationComboBox.DataSource = Enum.GetValues(typeof(DataTableVisualProperties.DataTableHistogramAggregation));
     }
 
@@ -101,4 +103,9 @@
           yAxisSecondaryMaximumFixedTextBox.Text = string.Empty;
           yAxisSecondaryLogScaleCheckBox.Checked = false;
+
+          histogramBinsNumericUpDown.Value = 1;
+          histogramBinsApproximatelyRadioButton.Checked = false;
+          histogramBinsExactRadioButton.Checked = false;
+          histogramAggregationComboBox.SelectedIndex = -1;
         } else {
           titleFontLabel.Text = "( " + FormatFont(Content.TitleFont) + " )";
@@ -139,4 +146,13 @@
           yAxisSecondaryMaximumFixedTextBox.Text = Content.SecondYAxisMaximumFixedValue.ToString();
           yAxisSecondaryLogScaleCheckBox.Checked = Content.SecondYAxisLogScale;
+
+          if (Content.HistogramBins < histogramBinsNumericUpDown.Minimum)
+            histogramBinsNumericUpDown.Value = histogramBinsNumericUpDown.Minimum;
+          else if (Content.HistogramBins > histogramBinsNumericUpDown.Maximum)
+            histogramBinsNumericUpDown.Value = histogramBinsNumericUpDown.Maximum;
+          else histogramBinsNumericUpDown.Value = Content.HistogramBins;
+          histogramBinsApproximatelyRadioButton.Checked = !Content.HistogramExactBins;
+          histogramBinsExactRadioButton.Checked = Content.HistogramExactBins;
+          histogramAggregationComboBox.SelectedItem = Content.HistogramAggregation;
         }
       } finally { SuppressEvents = false; }
@@ -483,4 +499,28 @@
       }
     }
+
+    private void histogramBinsNumericUpDown_ValueChanged(object sender, System.EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        Content.HistogramBins = (int)histogramBinsNumericUpDown.Value;
+      }
+    }
+
+    private void histogramBinsExactRadioButton_CheckedChanged(object sender, System.EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        SuppressEvents = true;
+        try {
+          Content.HistogramExactBins = histogramBinsExactRadioButton.Checked;
+        } finally { SuppressEvents = false; }
+      }
+    }
+
+    private void histogramAggregationComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        SuppressEvents = true;
+        try {
+          Content.HistogramAggregation = (DataTableVisualProperties.DataTableHistogramAggregation)histogramAggregationComboBox.SelectedValue;
+        } finally { SuppressEvents = false; }
+      }
+    }
     #endregion
 
Index: /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesDialog.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesDialog.Designer.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/DataTableVisualPropertiesDialog.Designer.cs	(revision 15097)
@@ -69,5 +69,5 @@
       this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.okButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.okButton.Location = new System.Drawing.Point(325, 425);
+      this.okButton.Location = new System.Drawing.Point(325, 454);
       this.okButton.Name = "okButton";
       this.okButton.Size = new System.Drawing.Size(75, 23);
@@ -81,5 +81,5 @@
       this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-      this.cancelButton.Location = new System.Drawing.Point(406, 425);
+      this.cancelButton.Location = new System.Drawing.Point(406, 454);
       this.cancelButton.Name = "cancelButton";
       this.cancelButton.Size = new System.Drawing.Size(75, 23);
@@ -99,5 +99,5 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(469, 407);
+      this.tabControl.Size = new System.Drawing.Size(469, 436);
       this.tabControl.TabIndex = 2;
       // 
@@ -108,5 +108,5 @@
       this.seriesTabPage.Name = "seriesTabPage";
       this.seriesTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.seriesTabPage.Size = new System.Drawing.Size(461, 381);
+      this.seriesTabPage.Size = new System.Drawing.Size(461, 410);
       this.seriesTabPage.TabIndex = 0;
       this.seriesTabPage.Text = "Series";
@@ -133,5 +133,5 @@
       this.splitContainer.Panel2.Controls.Add(this.dataRowVisualPropertiesControl);
       this.splitContainer.Panel2MinSize = 50;
-      this.splitContainer.Size = new System.Drawing.Size(461, 381);
+      this.splitContainer.Size = new System.Drawing.Size(461, 410);
       this.splitContainer.SplitterDistance = 125;
       this.splitContainer.TabIndex = 0;
@@ -169,5 +169,5 @@
       this.seriesListView.Name = "seriesListView";
       this.seriesListView.ShowGroups = false;
-      this.seriesListView.Size = new System.Drawing.Size(119, 346);
+      this.seriesListView.Size = new System.Drawing.Size(119, 375);
       this.seriesListView.TabIndex = 2;
       this.seriesListView.UseCompatibleStateImageBehavior = false;
@@ -183,5 +183,5 @@
       this.dataRowVisualPropertiesControl.Location = new System.Drawing.Point(3, 26);
       this.dataRowVisualPropertiesControl.Name = "dataRowVisualPropertiesControl";
-      this.dataRowVisualPropertiesControl.Size = new System.Drawing.Size(326, 352);
+      this.dataRowVisualPropertiesControl.Size = new System.Drawing.Size(326, 381);
       this.dataRowVisualPropertiesControl.TabIndex = 0;
       // 
@@ -213,5 +213,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.CancelButton = this.cancelButton;
-      this.ClientSize = new System.Drawing.Size(493, 460);
+      this.ClientSize = new System.Drawing.Size(493, 489);
       this.Controls.Add(this.tabControl);
       this.Controls.Add(this.cancelButton);
Index: /stable/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 15097)
@@ -105,4 +105,8 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\ALGLIB-3.7.0.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -122,4 +126,16 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="DataTableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DataTableView.Designer.cs">
+      <DependentUpon>DataTableView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScatterPlotView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScatterPlotView.Designer.cs">
+      <DependentUpon>ScatterPlotView.cs</DependentUpon>
+    </Compile>
     <Compile Include="ScatterPlotVisualPropertiesDialog.cs">
       <SubType>Form</SubType>
@@ -140,10 +156,4 @@
       <DependentUpon>ScatterPlotDataRowVisualPropertiesControl.cs</DependentUpon>
     </Compile>
-    <Compile Include="ScatterPlotView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ScatterPlotView.Designer.cs">
-      <DependentUpon>ScatterPlotView.cs</DependentUpon>
-    </Compile>
     <Compile Include="ScatterPlotHistoryView.cs">
       <SubType>UserControl</SubType>
@@ -209,10 +219,4 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="DataTableView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="DataTableView.Designer.cs">
-      <DependentUpon>DataTableView.cs</DependentUpon>
-    </Compile>
     <Compile Include="HistogramControl.cs">
       <SubType>UserControl</SubType>
Index: /stable/HeuristicLab.Analysis.Views/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/Plugin.cs.frame	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/Plugin.cs.frame	(revision 15097)
@@ -28,4 +28,5 @@
   [Plugin("HeuristicLab.Analysis.Views", "3.3.14.$WCREV$")]
   [PluginFile("HeuristicLab.Analysis.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.7.0")]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
Index: /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotDataRowVisualPropertiesControl.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotDataRowVisualPropertiesControl.Designer.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotDataRowVisualPropertiesControl.Designer.cs	(revision 15097)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       this.pointStyleComboBox = new System.Windows.Forms.ComboBox();
       this.colorDialog = new System.Windows.Forms.ColorDialog();
@@ -56,5 +57,16 @@
       this.label9 = new System.Windows.Forms.Label();
       this.label7 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.regressionTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.regressionGroupBox = new System.Windows.Forms.GroupBox();
+      this.isRegressionVisibleInLegendCheckBox = new System.Windows.Forms.CheckBox();
+      this.polynomialRegressionOrderNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.orderLabel = new System.Windows.Forms.Label();
+      this.regressionLegendTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.clearColorButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.pointSizeNumericUpDown)).BeginInit();
+      this.regressionGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).BeginInit();
       this.SuspendLayout();
       // 
@@ -171,7 +183,121 @@
       this.label7.Text = "&Visible in Legend:";
       // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(6, 22);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(34, 13);
+      this.label4.TabIndex = 7;
+      this.label4.Text = "Type:";
+      // 
+      // regressionTypeComboBox
+      // 
+      this.regressionTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.regressionTypeComboBox.FormattingEnabled = true;
+      this.regressionTypeComboBox.Location = new System.Drawing.Point(93, 19);
+      this.regressionTypeComboBox.Name = "regressionTypeComboBox";
+      this.regressionTypeComboBox.Size = new System.Drawing.Size(147, 21);
+      this.regressionTypeComboBox.TabIndex = 8;
+      this.regressionTypeComboBox.SelectedValueChanged += new System.EventHandler(this.regressionTypeComboBox_SelectedValueChanged);
+      // 
+      // regressionGroupBox
+      // 
+      this.regressionGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionGroupBox.Controls.Add(this.isRegressionVisibleInLegendCheckBox);
+      this.regressionGroupBox.Controls.Add(this.regressionTypeComboBox);
+      this.regressionGroupBox.Controls.Add(this.polynomialRegressionOrderNumericUpDown);
+      this.regressionGroupBox.Controls.Add(this.orderLabel);
+      this.regressionGroupBox.Controls.Add(this.regressionLegendTextBox);
+      this.regressionGroupBox.Controls.Add(this.label4);
+      this.regressionGroupBox.Location = new System.Drawing.Point(3, 136);
+      this.regressionGroupBox.Name = "regressionGroupBox";
+      this.regressionGroupBox.Size = new System.Drawing.Size(336, 74);
+      this.regressionGroupBox.TabIndex = 9;
+      this.regressionGroupBox.TabStop = false;
+      this.regressionGroupBox.Text = "&Regression";
+      // 
+      // isRegressionVisibleInLegendCheckBox
+      // 
+      this.isRegressionVisibleInLegendCheckBox.AutoSize = true;
+      this.isRegressionVisibleInLegendCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.isRegressionVisibleInLegendCheckBox.Location = new System.Drawing.Point(6, 48);
+      this.isRegressionVisibleInLegendCheckBox.Name = "isRegressionVisibleInLegendCheckBox";
+      this.isRegressionVisibleInLegendCheckBox.Size = new System.Drawing.Size(68, 17);
+      this.isRegressionVisibleInLegendCheckBox.TabIndex = 13;
+      this.isRegressionVisibleInLegendCheckBox.Text = "Legend: ";
+      this.isRegressionVisibleInLegendCheckBox.UseVisualStyleBackColor = true;
+      this.isRegressionVisibleInLegendCheckBox.CheckedChanged += new System.EventHandler(this.isRegressionVisibleInLegendCheckBox_CheckedChanged);
+      // 
+      // polynomialRegressionOrderNumericUpDown
+      // 
+      this.polynomialRegressionOrderNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.polynomialRegressionOrderNumericUpDown.Location = new System.Drawing.Point(285, 20);
+      this.polynomialRegressionOrderNumericUpDown.Margin = new System.Windows.Forms.Padding(9, 3, 3, 3);
+      this.polynomialRegressionOrderNumericUpDown.Maximum = new decimal(new int[] {
+            6,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Minimum = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.Name = "polynomialRegressionOrderNumericUpDown";
+      this.polynomialRegressionOrderNumericUpDown.Size = new System.Drawing.Size(45, 20);
+      this.polynomialRegressionOrderNumericUpDown.TabIndex = 11;
+      this.toolTip.SetToolTip(this.polynomialRegressionOrderNumericUpDown, "Order only available for Polynomial");
+      this.polynomialRegressionOrderNumericUpDown.Value = new decimal(new int[] {
+            2,
+            0,
+            0,
+            0});
+      this.polynomialRegressionOrderNumericUpDown.ValueChanged += new System.EventHandler(this.polynomialRegressionOrderNumericUpDown_ValueChanged);
+      // 
+      // orderLabel
+      // 
+      this.orderLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.orderLabel.AutoSize = true;
+      this.orderLabel.Location = new System.Drawing.Point(246, 22);
+      this.orderLabel.Name = "orderLabel";
+      this.orderLabel.Size = new System.Drawing.Size(36, 13);
+      this.orderLabel.TabIndex = 12;
+      this.orderLabel.Text = "Order:";
+      // 
+      // regressionLegendTextBox
+      // 
+      this.regressionLegendTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.regressionLegendTextBox.Location = new System.Drawing.Point(93, 46);
+      this.regressionLegendTextBox.Name = "regressionLegendTextBox";
+      this.regressionLegendTextBox.Size = new System.Drawing.Size(237, 20);
+      this.regressionLegendTextBox.TabIndex = 10;
+      this.regressionLegendTextBox.Validated += new System.EventHandler(this.regressionLegendTextBox_Validated);
+      // 
+      // clearColorButton
+      // 
+      this.clearColorButton.BackColor = System.Drawing.SystemColors.ActiveCaption;
+      this.clearColorButton.Cursor = System.Windows.Forms.Cursors.Default;
+      this.clearColorButton.FlatAppearance.BorderSize = 0;
+      this.clearColorButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.clearColorButton.ForeColor = System.Drawing.Color.Transparent;
+      this.clearColorButton.Location = new System.Drawing.Point(125, 65);
+      this.clearColorButton.Margin = new System.Windows.Forms.Padding(0);
+      this.clearColorButton.Name = "clearColorButton";
+      this.clearColorButton.Size = new System.Drawing.Size(15, 16);
+      this.clearColorButton.TabIndex = 11;
+      this.clearColorButton.TabStop = false;
+      this.clearColorButton.UseVisualStyleBackColor = false;
+      this.clearColorButton.Click += new System.EventHandler(this.clearColorButton_Click);
+      // 
       // ScatterPlotDataRowVisualPropertiesControl
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.clearColorButton);
+      this.Controls.Add(this.regressionGroupBox);
       this.Controls.Add(this.pointSizeNumericUpDown);
       this.Controls.Add(this.isVisibleInLegendCheckBox);
@@ -185,6 +311,9 @@
       this.Controls.Add(this.colorButton);
       this.Name = "ScatterPlotDataRowVisualPropertiesControl";
-      this.Size = new System.Drawing.Size(342, 135);
+      this.Size = new System.Drawing.Size(342, 215);
       ((System.ComponentModel.ISupportInitialize)(this.pointSizeNumericUpDown)).EndInit();
+      this.regressionGroupBox.ResumeLayout(false);
+      this.regressionGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.polynomialRegressionOrderNumericUpDown)).EndInit();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -205,4 +334,13 @@
     private System.Windows.Forms.Label label9;
     private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.ComboBox regressionTypeComboBox;
+    private System.Windows.Forms.GroupBox regressionGroupBox;
+    private System.Windows.Forms.TextBox regressionLegendTextBox;
+    private System.Windows.Forms.NumericUpDown polynomialRegressionOrderNumericUpDown;
+    private System.Windows.Forms.Label orderLabel;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.CheckBox isRegressionVisibleInLegendCheckBox;
+    private System.Windows.Forms.Button clearColorButton;
   }
 }
Index: /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotDataRowVisualPropertiesControl.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotDataRowVisualPropertiesControl.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotDataRowVisualPropertiesControl.cs	(revision 15097)
@@ -23,4 +23,5 @@
 using System.Drawing;
 using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
@@ -44,4 +45,7 @@
       InitializeComponent();
       pointStyleComboBox.DataSource = Enum.GetValues(typeof(ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle));
+      regressionTypeComboBox.DataSource = Enum.GetValues(typeof(ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType));
+      clearColorButton.BackColor = Color.Transparent;
+      clearColorButton.BackgroundImage = VSImageLibrary.Delete;
       SetEnabledStateOfControls();
     }
@@ -57,4 +61,8 @@
           pointSizeNumericUpDown.Value = 1;
           displayNameTextBox.Text = String.Empty;
+          regressionTypeComboBox.SelectedIndex = -1;
+          polynomialRegressionOrderNumericUpDown.Value = 2;
+          isRegressionVisibleInLegendCheckBox.Checked = false;
+          regressionLegendTextBox.Text = string.Empty;
         } else {
           displayNameTextBox.Text = Content.DisplayName;
@@ -69,4 +77,8 @@
           pointSizeNumericUpDown.Value = Content.PointSize;
           isVisibleInLegendCheckBox.Checked = Content.IsVisibleInLegend;
+          regressionTypeComboBox.SelectedItem = Content.RegressionType;
+          polynomialRegressionOrderNumericUpDown.Value = Content.PolynomialRegressionOrder;
+          isRegressionVisibleInLegendCheckBox.Checked = Content.IsRegressionVisibleInLegend;
+          regressionLegendTextBox.Text = content.RegressionDisplayName;
         }
       }
@@ -78,8 +90,13 @@
       pointStyleComboBox.Enabled = Content != null;
       colorButton.Enabled = Content != null;
-      colorButton.Enabled = Content != null;
+      clearColorButton.Visible = Content != null && !Content.Color.IsEmpty;
       isVisibleInLegendCheckBox.Enabled = Content != null;
       pointSizeNumericUpDown.Enabled = Content != null;
       displayNameTextBox.Enabled = Content != null;
+      regressionTypeComboBox.Enabled = Content != null;
+      polynomialRegressionOrderNumericUpDown.Enabled = Content != null && Content.RegressionType == ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Polynomial;
+      orderLabel.Enabled = polynomialRegressionOrderNumericUpDown.Enabled;
+      isRegressionVisibleInLegendCheckBox.Enabled = Content != null && Content.RegressionType != ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.None;
+      regressionLegendTextBox.Enabled = Content != null && Content.RegressionType != ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.None;
     }
 
@@ -87,5 +104,5 @@
     private void pointStyleComboBox_SelectedValueChanged(object sender, EventArgs e) {
       if (!SuppressEvents && Content != null) {
-        ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle selected = (ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle)pointStyleComboBox.SelectedValue;
+        var selected = (ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle)pointStyleComboBox.SelectedValue;
         Content.PointStyle = selected;
       }
@@ -97,4 +114,14 @@
         colorButton.BackColor = Content.Color;
         colorButton.Text = String.Empty;
+        clearColorButton.Visible = true;
+      }
+    }
+
+    private void clearColorButton_Click(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        Content.Color = Color.Empty;
+        colorButton.BackColor = SystemColors.Control;
+        colorButton.Text = "?";
+        clearColorButton.Visible = false;
       }
     }
@@ -121,4 +148,30 @@
       }
     }
+
+    private void regressionTypeComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        var selected = (ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType)regressionTypeComboBox.SelectedValue;
+        Content.RegressionType = selected;
+        SetEnabledStateOfControls();
+      }
+    }
+
+    private void polynomialRegressionOrderNumericUpDown_ValueChanged(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        Content.PolynomialRegressionOrder = (int)polynomialRegressionOrderNumericUpDown.Value;
+      }
+    }
+
+    private void isRegressionVisibleInLegendCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        Content.IsRegressionVisibleInLegend = isRegressionVisibleInLegendCheckBox.Checked;
+      }
+    }
+
+    private void regressionLegendTextBox_Validated(object sender, EventArgs e) {
+      if (!SuppressEvents && Content != null) {
+        Content.RegressionDisplayName = regressionLegendTextBox.Text;
+      }
+    }
     #endregion
   }
Index: /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotView.Designer.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotView.Designer.cs	(revision 15097)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
@@ -50,4 +51,5 @@
       System.Windows.Forms.DataVisualization.Charting.Title title1 = new System.Windows.Forms.DataVisualization.Charting.Title();
       this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      this.configureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
@@ -68,6 +70,6 @@
       // 
       this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.chart.BorderlineColor = System.Drawing.Color.Black;
       this.chart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
@@ -97,18 +99,25 @@
       this.chart.Titles.Add(title1);
       this.chart.CustomizeLegend += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.CustomizeLegendEventArgs>(this.chart_CustomizeLegend);
+      this.chart.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDoubleClick);
       this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
       this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
       // 
+      // configureToolStripMenuItem
+      // 
+      this.configureToolStripMenuItem.Name = "configureToolStripMenuItem";
+      this.configureToolStripMenuItem.Size = new System.Drawing.Size(256, 22);
+      this.configureToolStripMenuItem.Text = "Configure Chart...";
+      this.configureToolStripMenuItem.Click += new System.EventHandler(this.configureToolStripMenuItem_Click);
+      // 
       // ScatterPlotView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.chart);
       this.Name = "ScatterPlotView";
       this.Size = new System.Drawing.Size(359, 274);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.chart, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
@@ -117,9 +126,8 @@
 
     }
-
     #endregion
 
     protected HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
-
+    private System.Windows.Forms.ToolStripMenuItem configureToolStripMenuItem;
   }
 }
Index: /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotView.cs
===================================================================
--- /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotView.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis.Views/3.3/ScatterPlotView.cs	(revision 15097)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using System.Text;
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
@@ -37,4 +38,5 @@
     protected List<Series> invisibleSeries;
     protected Dictionary<IObservableList<Point2D<double>>, ScatterPlotDataRow> pointsRowsTable;
+    protected Dictionary<Series, Series> seriesToRegressionSeriesTable;
     private double xMin, xMax, yMin, yMax;
 
@@ -44,10 +46,25 @@
     }
 
+    public bool ShowName {
+      get { return nameTextBox.Visible; }
+      set {
+        if (nameTextBox.Visible != value) {
+          foreach (Control c in Controls) {
+            if (c == chart) continue;
+            c.Visible = value;
+          }
+          chart.Dock = value ? DockStyle.None : DockStyle.Fill;
+        }
+      }
+    }
+
     public ScatterPlotView() {
       InitializeComponent();
       pointsRowsTable = new Dictionary<IObservableList<Point2D<double>>, ScatterPlotDataRow>();
+      seriesToRegressionSeriesTable = new Dictionary<Series, Series>();
       invisibleSeries = new List<Series>();
       chart.CustomizeAllChartAreas();
       chart.ChartAreas[0].CursorX.Interval = 1;
+      chart.ContextMenuStrip.Items.Add(configureToolStripMenuItem);
     }
 
@@ -61,8 +78,6 @@
       Content.Rows.ItemsReplaced -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced);
       Content.Rows.CollectionReset -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset);
-      base.DeregisterContentEvents();
     }
     protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
       Content.VisualPropertiesChanged += new EventHandler(Content_VisualPropertiesChanged);
       Content.Rows.ItemsAdded += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded);
@@ -101,4 +116,5 @@
       if (Content != null) {
         chart.Titles[0].Text = Content.Name;
+        chart.Titles[0].Visible = !string.IsNullOrEmpty(Content.Name);
         AddScatterPlotDataRows(Content.Rows);
         ConfigureChartArea(chart.ChartAreas[0]);
@@ -124,10 +140,24 @@
       foreach (var row in rows) {
         RegisterScatterPlotDataRowEvents(row);
-        Series series = new Series(row.Name);
+        Series series = new Series(row.Name) { Tag = row };
+
         if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
         else series.LegendText = row.Name;
-        ConfigureSeries(series, row);
+
+        var regressionSeries = new Series(row.Name + "_Regression") {
+          Tag = row,
+          ChartType = SeriesChartType.Line,
+          BorderDashStyle = ChartDashStyle.Dot,
+          IsVisibleInLegend = false,
+          Color = Color.Transparent // to avoid auto color assignment via color palette 
+        };
+
+        seriesToRegressionSeriesTable.Add(series, regressionSeries);
+        ConfigureSeries(series, regressionSeries, row);
         FillSeriesWithRowValues(series, row);
+
         chart.Series.Add(series);
+        chart.Series.Add(regressionSeries);
+        FillRegressionSeries(regressionSeries, row);
       }
       ConfigureChartArea(chart.ChartAreas[0]);
@@ -135,4 +165,5 @@
       RecalculateAxesScale(chart.ChartAreas[0]);
       UpdateYCursorInterval();
+      UpdateRegressionSeriesColors();
     }
 
@@ -144,4 +175,6 @@
         if (invisibleSeries.Contains(series))
           invisibleSeries.Remove(series);
+        chart.Series.Remove(seriesToRegressionSeriesTable[series]);
+        seriesToRegressionSeriesTable.Remove(series);
       }
       RecalculateMinMaxPointValues();
@@ -149,5 +182,5 @@
     }
 
-    private void ConfigureSeries(Series series, ScatterPlotDataRow row) {
+    private void ConfigureSeries(Series series, Series regressionSeries, ScatterPlotDataRow row) {
       series.BorderWidth = 1;
       series.BorderDashStyle = ChartDashStyle.Solid;
@@ -177,4 +210,11 @@
         xAxisTitle + " = " + "#VALX," + Environment.NewLine +
         yAxisTitle + " = " + "#VAL";
+
+      regressionSeries.BorderWidth = Math.Max(1, row.VisualProperties.PointSize / 2);
+      regressionSeries.IsVisibleInLegend = row.VisualProperties.IsRegressionVisibleInLegend &&
+        row.VisualProperties.RegressionType != ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.None;
+      regressionSeries.LegendText = string.IsNullOrEmpty(row.VisualProperties.RegressionDisplayName)
+        ? string.Format("{0}({1})", row.VisualProperties.RegressionType, row.Name)
+        : row.VisualProperties.RegressionDisplayName;
     }
 
@@ -183,4 +223,5 @@
       if (!Content.VisualProperties.TitleColor.IsEmpty) chart.Titles[0].ForeColor = Content.VisualProperties.TitleColor;
       chart.Titles[0].Text = Content.VisualProperties.Title;
+      chart.Titles[0].Visible = !string.IsNullOrEmpty(Content.VisualProperties.Title);
 
       if (Content.VisualProperties.AxisTitleFont != null) area.AxisX.TitleFont = Content.VisualProperties.AxisTitleFont;
@@ -247,4 +288,13 @@
     }
 
+    protected void UpdateRegressionSeriesColors() {
+      chart.ApplyPaletteColors();
+      foreach (var row in Content.Rows) {
+        var series = chart.Series[row.Name];
+        var regressionSeries = seriesToRegressionSeriesTable[series];
+        regressionSeries.Color = series.Color;
+      }
+    }
+
     #region Event Handlers
     #region Content Event Handlers
@@ -253,5 +303,5 @@
         Invoke(new EventHandler(Content_NameChanged), sender, e);
       else {
-        chart.Titles[0].Text = Content.Name;
+        Content.VisualProperties.Title = Content.Name;
         base.Content_NameChanged(sender, e);
       }
@@ -305,9 +355,13 @@
         ScatterPlotDataRow row = (ScatterPlotDataRow)sender;
         Series series = chart.Series[row.Name];
+        Series regressionSeries = seriesToRegressionSeriesTable[series];
         series.Points.Clear();
-        ConfigureSeries(series, row);
+        regressionSeries.Points.Clear();
+        ConfigureSeries(series, regressionSeries, row);
         FillSeriesWithRowValues(series, row);
+        FillRegressionSeries(regressionSeries, row);
         RecalculateMinMaxPointValues();
         RecalculateAxesScale(chart.ChartAreas[0]);
+        UpdateRegressionSeriesColors();
       }
     }
@@ -330,7 +384,10 @@
         if (row != null) {
           Series rowSeries = chart.Series[row.Name];
+          Series regressionSeries = seriesToRegressionSeriesTable[rowSeries];
           if (!invisibleSeries.Contains(rowSeries)) {
             rowSeries.Points.Clear();
+            regressionSeries.Points.Clear();
             FillSeriesWithRowValues(rowSeries, row);
+            FillRegressionSeries(regressionSeries, row);
             RecalculateMinMaxPointValues();
             RecalculateAxesScale(chart.ChartAreas[0]);
@@ -348,7 +405,10 @@
         if (row != null) {
           Series rowSeries = chart.Series[row.Name];
+          Series regressionSeries = seriesToRegressionSeriesTable[rowSeries];
           if (!invisibleSeries.Contains(rowSeries)) {
             rowSeries.Points.Clear();
+            regressionSeries.Points.Clear();
             FillSeriesWithRowValues(rowSeries, row);
+            FillRegressionSeries(regressionSeries, row);
             RecalculateMinMaxPointValues();
             RecalculateAxesScale(chart.ChartAreas[0]);
@@ -366,7 +426,10 @@
         if (row != null) {
           Series rowSeries = chart.Series[row.Name];
+          Series regressionSeries = seriesToRegressionSeriesTable[rowSeries];
           if (!invisibleSeries.Contains(rowSeries)) {
             rowSeries.Points.Clear();
+            regressionSeries.Points.Clear();
             FillSeriesWithRowValues(rowSeries, row);
+            FillRegressionSeries(regressionSeries, row);
             RecalculateMinMaxPointValues();
             RecalculateAxesScale(chart.ChartAreas[0]);
@@ -384,7 +447,10 @@
         if (row != null) {
           Series rowSeries = chart.Series[row.Name];
+          Series regressionSeries = seriesToRegressionSeriesTable[rowSeries];
           if (!invisibleSeries.Contains(rowSeries)) {
             rowSeries.Points.Clear();
+            regressionSeries.Points.Clear();
             FillSeriesWithRowValues(rowSeries, row);
+            FillRegressionSeries(regressionSeries, row);
             RecalculateMinMaxPointValues();
             RecalculateAxesScale(chart.ChartAreas[0]);
@@ -395,7 +461,25 @@
     }
     #endregion
+    private void configureToolStripMenuItem_Click(object sender, System.EventArgs e) {
+      ShowConfiguration();
+    }
     #endregion
 
     #region Chart Event Handlers
+    private void chart_MouseDoubleClick(object sender, MouseEventArgs e) {
+      HitTestResult result = chart.HitTest(e.X, e.Y, ChartElementType.DataPoint);
+      if (result.ChartElementType != ChartElementType.DataPoint) return;
+
+      var series = result.Series;
+      var dataPoint = series.Points[result.PointIndex];
+      var tag = dataPoint.Tag;
+      var content = tag as IContent;
+
+      if (tag == null) return;
+      if (content == null) return;
+
+      MainFormManager.MainForm.ShowContent(content);
+    }
+
     private void chart_MouseDown(object sender, MouseEventArgs e) {
       HitTestResult result = chart.HitTest(e.X, e.Y);
@@ -432,9 +516,9 @@
         invisibleSeries.Remove(series);
         if (Content != null) {
-
-          var row = (from r in Content.Rows
-                     where r.Name == series.Name
-                     select r).Single();
-          FillSeriesWithRowValues(series, row);
+          var row = (ScatterPlotDataRow)series.Tag;
+          if (seriesToRegressionSeriesTable.ContainsKey(series))
+            FillSeriesWithRowValues(series, row);
+          else
+            FillRegressionSeries(series, row);
           RecalculateMinMaxPointValues();
           this.chart.Legends[series.Legend].ForeColor = Color.Black;
@@ -460,4 +544,5 @@
 
     private void FillSeriesWithRowValues(Series series, ScatterPlotDataRow row) {
+      bool zerosOnly = true;
       for (int i = 0; i < row.Points.Count; i++) {
         var value = row.Points[i];
@@ -469,6 +554,41 @@
           point.YValues = new double[] { value.Y };
         }
+        point.Tag = value.Tag;
         series.Points.Add(point);
-      }
+        if (value.X != 0.0f)
+          zerosOnly = false;
+      }
+      if (zerosOnly) // if all x-values are zero, the x-values are interpreted as 1, 2, 3, ...
+        series.Points.Add(new DataPoint(1, 1) { IsEmpty = true });
+      double correlation = Correlation(row.Points);
+      series.LegendToolTip = string.Format("Correlation (R²) = {0:G4}", correlation * correlation);
+    }
+
+    private void FillRegressionSeries(Series regressionSeries, ScatterPlotDataRow row) {
+      if (row.VisualProperties.RegressionType == ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.None
+        || invisibleSeries.Contains(regressionSeries))
+        return;
+
+      double[] coefficients;
+      if (!Fitting(row, out coefficients)) {
+        regressionSeries.LegendToolTip = "Could not calculate regression.";
+        return;
+      }
+
+      // Fill regrssion series
+      double min = row.Points.Min(p => p.X), max = row.Points.Max(p => p.X);
+      double range = max - min, delta = range / Math.Max(row.Points.Count - 1, 50);
+      if (range > double.Epsilon) {
+        for (double x = min; x <= max; x += delta) {
+          regressionSeries.Points.AddXY(x, Estimate(x, row, coefficients));
+        }
+      }
+
+      // Correlation
+      var data = row.Points.Select(p => new Point2D<double>(p.Y, Estimate(p.X, row, coefficients)));
+      double correlation = Correlation(data.ToList());
+      regressionSeries.LegendToolTip = GetStringFormula(row, coefficients) + Environment.NewLine +
+                                       string.Format("Correlation (R²) = {0:G4}", correlation * correlation);
+      regressionSeries.ToolTip = GetStringFormula(row, coefficients);
     }
 
@@ -503,4 +623,205 @@
     }
     #endregion
+
+    #region Correlation and Fitting Helper
+    protected static double Correlation(IList<Point2D<double>> values) {
+      // sums of x, y, x squared etc.
+      double sx = 0.0;
+      double sy = 0.0;
+      double sxx = 0.0;
+      double syy = 0.0;
+      double sxy = 0.0;
+
+      int n = 0;
+      for (int i = 0; i < values.Count; i++) {
+        double x = values[i].X;
+        double y = values[i].Y;
+        if (IsInvalidValue(x) || IsInvalidValue(y))
+          continue;
+
+        sx += x;
+        sy += y;
+        sxx += x * x;
+        syy += y * y;
+        sxy += x * y;
+        n++;
+      }
+
+      // covariation
+      double cov = sxy / n - sx * sy / n / n;
+      // standard error of x
+      double sigmaX = Math.Sqrt(sxx / n - sx * sx / n / n);
+      // standard error of y
+      double sigmaY = Math.Sqrt(syy / n - sy * sy / n / n);
+
+      // correlation
+      return cov / sigmaX / sigmaY;
+    }
+
+    protected static bool Fitting(ScatterPlotDataRow row, out double[] coefficients) {
+      if (!IsValidRegressionData(row)) {
+        coefficients = new double[0];
+        return false;
+      }
+
+      var xs = row.Points.Select(p => p.X).ToList();
+      var ys = row.Points.Select(p => p.Y).ToList();
+
+      // Input transformations
+      double[,] matrix;
+      int nRows;
+      switch (row.VisualProperties.RegressionType) {
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Linear:
+          matrix = CreateMatrix(out nRows, ys, xs);
+          break;
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Polynomial:
+          var xss = Enumerable.Range(1, row.VisualProperties.PolynomialRegressionOrder)
+            .Select(o => xs.Select(x => Math.Pow(x, o)).ToList())
+            .Reverse(); // higher order first
+          matrix = CreateMatrix(out nRows, ys, xss.ToArray());
+          break;
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Exponential:
+          matrix = CreateMatrix(out nRows, ys.Select(y => Math.Log(y)).ToList(), xs);
+          break;
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Power:
+          matrix = CreateMatrix(out nRows, ys.Select(y => Math.Log(y)).ToList(), xs.Select(x => Math.Log(x)).ToList());
+          break;
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Logarithmic:
+          matrix = CreateMatrix(out nRows, ys, xs.Select(x => Math.Log(x)).ToList());
+          break;
+        default:
+          throw new ArgumentException("Unknown RegressionType: " + row.VisualProperties.RegressionType);
+      }
+
+      // Linear fitting
+      bool success = LinearFitting(matrix, nRows, out coefficients);
+      if (!success) return false;
+
+      // Output transformation
+      switch (row.VisualProperties.RegressionType) {
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Exponential:
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Power:
+          coefficients[1] = Math.Exp(coefficients[1]);
+          break;
+      }
+
+      return true;
+    }
+    protected static bool IsValidRegressionData(ScatterPlotDataRow row) {
+      // No invalid values allowed
+      for (int i = 0; i < row.Points.Count; i++) {
+        if (IsInvalidValue(row.Points[i].X) || IsInvalidValue(row.Points[i].Y))
+          return false;
+      }
+      // Exp, Power and Log Regression do not work with negative values
+      switch (row.VisualProperties.RegressionType) {
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Exponential:
+          for (int i = 0; i < row.Points.Count; i++) {
+            if (row.Points[i].Y <= 0)
+              return false;
+          }
+          break;
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Power:
+          for (int i = 0; i < row.Points.Count; i++) {
+            if (row.Points[i].X <= 0 || row.Points[i].Y <= 0)
+              return false;
+          }
+          break;
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Logarithmic:
+          for (int i = 0; i < row.Points.Count; i++) {
+            if (row.Points[i].X <= 0)
+              return false;
+          }
+          break;
+      }
+      return true;
+    }
+    protected static double[,] CreateMatrix(out int nRows, IList<double> ys, params IList<double>[] xss) {
+      var matrix = new double[ys.Count, xss.Length + 1];
+      int rowIdx = 0;
+      for (int i = 0; i < ys.Count; i++) {
+        if (IsInvalidValue(ys[i]) || xss.Any(xs => IsInvalidValue(xs[i])))
+          continue;
+        for (int j = 0; j < xss.Length; j++) {
+          matrix[rowIdx, j] = xss[j][i];
+        }
+        matrix[rowIdx, xss.Length] = ys[i];
+        rowIdx++;
+      }
+      nRows = rowIdx;
+      return matrix;
+    }
+
+    protected static bool LinearFitting(double[,] xsy, int nRows, out double[] coefficients) {
+      int nFeatures = xsy.GetLength(1) - 1;
+
+      alglib.linearmodel lm;
+      alglib.lrreport ar;
+      int retVal;
+      alglib.lrbuild(xsy, nRows, nFeatures, out retVal, out lm, out ar);
+      if (retVal != 1) {
+        coefficients = new double[0];
+        return false;
+      }
+
+      alglib.lrunpack(lm, out coefficients, out nFeatures);
+      return true;
+    }
+
+    protected static double Estimate(double x, ScatterPlotDataRow row, double[] coefficients) {
+      switch (row.VisualProperties.RegressionType) {
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Linear:
+          return coefficients[0] * x + coefficients[1];
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Polynomial:
+          return coefficients
+            .Reverse() // to match index and order
+            .Select((c, o) => c * Math.Pow(x, o))
+            .Sum();
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Exponential:
+          return coefficients[1] * Math.Exp(coefficients[0] * x);
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Power:
+          return coefficients[1] * Math.Pow(x, coefficients[0]);
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Logarithmic:
+          return coefficients[0] * Math.Log(x) + coefficients[1];
+        default:
+          throw new ArgumentException("Unknown RegressionType: " + row.VisualProperties.RegressionType);
+      }
+    }
+
+    protected static string GetStringFormula(ScatterPlotDataRow row, double[] coefficients) {
+      switch (row.VisualProperties.RegressionType) {
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Linear:
+          return string.Format("{0:G4} x {1} {2:G4}", coefficients[0], Sign(coefficients[1]), Math.Abs(coefficients[1]));
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Polynomial:
+          var sb = new StringBuilder();
+          sb.AppendFormat("{0:G4}{1}", coefficients[0], PolyFactor(coefficients.Length - 1));
+          foreach (var x in coefficients
+            .Reverse() // match index and order
+            .Select((c, o) => new { c, o })
+            .Reverse() // higher order first
+            .Skip(1)) // highest order poly already added
+            sb.AppendFormat(" {0} {1:G4}{2}", Sign(x.c), Math.Abs(x.c), PolyFactor(x.o));
+          return sb.ToString();
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Exponential:
+          return string.Format("{0:G4} e^({1:G4} x)", coefficients[1], coefficients[0]);
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Power:
+          return string.Format("{0:G4} x^({1:G4})", coefficients[1], coefficients[0]);
+        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType.Logarithmic:
+          return string.Format("{0:G4} ln(x) {1} {2:G4}", coefficients[0], Sign(coefficients[1]), Math.Abs(coefficients[1]));
+        default:
+          throw new ArgumentException("Unknown RegressionType: " + row.VisualProperties.RegressionType);
+      }
+    }
+    private static string Sign(double value) {
+      return value >= 0 ? "+" : "-";
+    }
+    private static string PolyFactor(int order) {
+      if (order == 0) return "";
+      if (order == 1) return " x";
+      if (order == 2) return " x²";
+      if (order == 3) return " x³";
+      return " x^" + order;
+    }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataRowVisualProperties.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataRowVisualProperties.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataRowVisualProperties.cs	(revision 15097)
@@ -123,24 +123,5 @@
       }
     }
-    private int bins;
-    public int Bins {
-      get { return bins; }
-      set {
-        if (bins != value) {
-          bins = value;
-          OnPropertyChanged("Bins");
-        }
-      }
-    }
-    private bool exactBins;
-    public bool ExactBins {
-      get { return exactBins; }
-      set {
-        if (exactBins != value) {
-          exactBins = value;
-          OnPropertyChanged("ExactBins");
-        }
-      }
-    }
+
     private double scaleFactor;
     public double ScaleFactor {
@@ -215,14 +196,4 @@
       set { lineWidth = value; }
     }
-    [Storable(Name = "Bins")]
-    private int StorableBins {
-      get { return bins; }
-      set { bins = value; }
-    }
-    [Storable(Name = "ExactBins")]
-    private bool StorableExactBins {
-      get { return exactBins; }
-      set { exactBins = value; }
-    }
     [Storable(Name = "ScaleFactor")]
     private double StorableScaleFactor {
@@ -240,4 +211,23 @@
       set { displayName = value; }
     }
+    #endregion
+
+    #region Histogram Properties - Backwards Compatability
+    internal enum DataRowHistogramAggregation {
+      Overlapping,
+      SideBySide,
+      Stacked
+    }
+
+    internal int? Bins { get; private set; }
+    internal bool? ExactBins { get; private set; }
+    internal DataRowHistogramAggregation? Aggregation { get; private set; }
+
+    [Storable(Name = "Bins", AllowOneWay = true)]
+    private int StorableBins { set { Bins = value; } }
+    [Storable(Name = "ExactBins", AllowOneWay = true)]
+    private bool StorableExactBins { set { ExactBins = value; } }
+    [Storable(Name = "Aggregation", AllowOneWay = true)]
+    private DataRowHistogramAggregation StorableAggregation { set { Aggregation = value; } }
     #endregion
 
@@ -253,6 +243,4 @@
       this.startIndexZero = original.startIndexZero;
       this.lineWidth = original.lineWidth;
-      this.bins = original.bins;
-      this.exactBins = original.exactBins;
       this.scaleFactor = original.scaleFactor;
       this.displayName = original.displayName;
@@ -267,6 +255,4 @@
       startIndexZero = false;
       lineWidth = 1;
-      bins = 10;
-      exactBins = false;
       scaleFactor = 1.0;
       displayName = String.Empty;
@@ -294,11 +280,8 @@
       if (secondXAxis == default(bool)
         && lineStyle == default(DataRowLineStyle)
-        && lineWidth == default(int) && bins == default(int) && exactBins == default(bool)
         && displayName == default(string)) {
         secondXAxis = false;
         lineStyle = DataRowLineStyle.Solid;
         lineWidth = 1;
-        bins = 10;
-        exactBins = false;
         displayName = String.Empty;
       }
Index: /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 15097)
@@ -112,4 +112,19 @@
       if (VisualProperties == null) VisualProperties = new DataTableVisualProperties(name);
       if (VisualProperties.Title == null) VisualProperties.Title = name;
+
+      #region Backwards Compatability Histogram Visual Properties 
+      var rowProperties = Rows.Select(r => r.VisualProperties).ToList();
+      if (rowProperties.Any(r => r.Bins.HasValue))
+        VisualProperties.HistogramBins = rowProperties.Where(r => r.Bins.HasValue).Max(r => r.Bins.Value);
+      if (rowProperties.Any(r => r.ExactBins.HasValue))
+        VisualProperties.HistogramExactBins = rowProperties.Where(r => r.ExactBins.HasValue).Any(r => r.ExactBins.Value);
+      if (rowProperties.Any(r => r.Aggregation.HasValue)) {
+        var maxOccurrence = rowProperties
+          .Where(r => r.Aggregation.HasValue).Select(r => r.Aggregation.Value)
+          .GroupBy(x => x).OrderByDescending(x => x.Count())
+          .First().Key;
+        VisualProperties.HistogramAggregation = (DataTableVisualProperties.DataTableHistogramAggregation)maxOccurrence;
+      }
+      #endregion
     }
     #endregion
Index: /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTableVisualProperties.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTableVisualProperties.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTableVisualProperties.cs	(revision 15097)
@@ -20,8 +20,9 @@
 #endregion
 
+using System;
+using System.ComponentModel;
+using System.Drawing;
 using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.ComponentModel;
-using System.Drawing;
 
 namespace HeuristicLab.Analysis {
@@ -31,4 +32,13 @@
   [StorableClass]
   public class DataTableVisualProperties : DeepCloneable, INotifyPropertyChanged {
+
+    #region Histogram Aggregation
+    public enum DataTableHistogramAggregation {
+      Overlapping,
+      SideBySide,
+      Stacked
+    }
+    #endregion
+
     private Font titleFont;
     public Font TitleFont {
@@ -352,4 +362,37 @@
         secondYAxisLogScale = value;
         OnPropertyChanged("SecondYAxisLogScale");
+      }
+    }
+
+    private int histogramBins;
+    public int HistogramBins {
+      get { return histogramBins; }
+      set {
+        if (histogramBins != value) {
+          histogramBins = value;
+          OnPropertyChanged("HistogramBins");
+        }
+      }
+    }
+
+    private bool histogramExactBins;
+    public bool HistogramExactBins {
+      get { return histogramExactBins; }
+      set {
+        if (histogramExactBins != value) {
+          histogramExactBins = value;
+          OnPropertyChanged("HistogramExactBins");
+        }
+      }
+    }
+
+    private DataTableHistogramAggregation histogramAggregation;
+    public DataTableHistogramAggregation HistogramAggregation {
+      get { return histogramAggregation; }
+      set {
+        if (histogramAggregation != value) {
+          histogramAggregation = value;
+          OnPropertyChanged("HistogramAggregation");
+        }
       }
     }
@@ -500,4 +543,19 @@
       get { return secondYAxisLogScale; }
       set { secondYAxisLogScale = value; }
+    }
+    [Storable(Name = "HistogramBins", DefaultValue = 10)]
+    private int StorableHistogramBins {
+      get { return histogramBins; }
+      set { histogramBins = value; }
+    }
+    [Storable(Name = "HistogramExactBins", DefaultValue = false)]
+    private bool StorableHistogramExactBins {
+      get { return histogramExactBins; }
+      set { histogramExactBins = value; }
+    }
+    [Storable(Name = "HistogramAggregation", DefaultValue = DataTableHistogramAggregation.Overlapping)]
+    private DataTableHistogramAggregation StorableHistogramAggregation {
+      get { return histogramAggregation; }
+      set { histogramAggregation = value; }
     }
     #endregion
@@ -536,4 +594,7 @@
       this.yAxisLogScale = original.yAxisLogScale;
       this.secondYAxisLogScale = original.secondYAxisLogScale;
+      this.histogramBins = original.histogramBins;
+      this.histogramExactBins = original.histogramExactBins;
+      this.histogramAggregation = original.histogramAggregation;
     }
     public DataTableVisualProperties() {
@@ -565,4 +626,7 @@
       this.yAxisLogScale = false;
       this.secondYAxisLogScale = false;
+      histogramBins = 10;
+      histogramExactBins = false;
+      histogramAggregation = DataTableHistogramAggregation.Overlapping;
     }
     public DataTableVisualProperties(string title)
Index: /stable/HeuristicLab.Analysis/3.3/DataVisualization/ScatterPlotDataRowVisualProperties.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/DataVisualization/ScatterPlotDataRowVisualProperties.cs	(revision 15096)
+++ /stable/HeuristicLab.Analysis/3.3/DataVisualization/ScatterPlotDataRowVisualProperties.cs	(revision 15097)
@@ -45,4 +45,14 @@
     }
     #endregion
+    #region
+    public enum ScatterPlotDataRowRegressionType {
+      None,
+      Linear,
+      Polynomial,
+      Exponential,
+      Logarithmic,
+      Power
+    }
+    #endregion
 
     private Color color;
@@ -101,4 +111,49 @@
       }
     }
+    private ScatterPlotDataRowRegressionType regressionType;
+    public ScatterPlotDataRowRegressionType RegressionType {
+      get { return regressionType; }
+      set {
+        if (regressionType != value) {
+          regressionType = value;
+          OnPropertyChanged("RegressionType");
+        }
+      }
+    }
+    private int polynomialRegressionOrder;
+    public int PolynomialRegressionOrder {
+      get { return polynomialRegressionOrder; }
+      set {
+        if (polynomialRegressionOrder != value) {
+          polynomialRegressionOrder = value;
+          OnPropertyChanged("PolynomialRegressionOrder");
+        }
+      }
+    }
+    private bool isRegressionVisibleInLegend;
+    public bool IsRegressionVisibleInLegend {
+      get { return isRegressionVisibleInLegend; }
+      set {
+        if (isRegressionVisibleInLegend != value) {
+          isRegressionVisibleInLegend = value;
+          OnPropertyChanged("IsRegressionVisibleInLegend");
+        }
+      }
+    }
+    private string regressionDisplayName;
+    public string RegressionDisplayName {
+      get { return regressionDisplayName ?? string.Empty; }
+      set {
+        if (regressionDisplayName != value) {
+          if (value == null && regressionDisplayName != string.Empty) {
+            regressionDisplayName = string.Empty;
+            OnPropertyChanged("RegressionDisplayName");
+          } else if (value != null) {
+            regressionDisplayName = value;
+            OnPropertyChanged("RegressionDisplayName");
+          }
+        }
+      }
+    }
 
     #region Persistence Properties
@@ -127,4 +182,24 @@
       get { return displayName; }
       set { displayName = value; }
+    }
+    [Storable(Name = "RegressionType")]
+    private ScatterPlotDataRowRegressionType StorableRegressionType {
+      get { return regressionType; }
+      set { regressionType = value; }
+    }
+    [Storable(Name = "PolynomialRegressionOrder", DefaultValue = 2)]
+    private int StorablePolynomialRegressionOrder {
+      get { return polynomialRegressionOrder; }
+      set { polynomialRegressionOrder = value; }
+    }
+    [Storable(Name = "IsRegressionVisibleInLegend", DefaultValue = true)]
+    private bool StorableIsRegressionVisibleInLegend {
+      get { return isRegressionVisibleInLegend; }
+      set { isRegressionVisibleInLegend = value; }
+    }
+    [Storable(Name = "RegressionDisplayName")]
+    private string StorableRegressionDisplayName {
+      get { return regressionDisplayName; }
+      set { regressionDisplayName = value; }
     }
     #endregion
@@ -139,4 +214,8 @@
       this.displayName = original.displayName;
       this.isVisibleInLegend = original.isVisibleInLegend;
+      this.regressionType = original.regressionType;
+      this.polynomialRegressionOrder = original.polynomialRegressionOrder;
+      this.isRegressionVisibleInLegend = original.isRegressionVisibleInLegend;
+      this.regressionDisplayName = original.regressionDisplayName;
     }
     public ScatterPlotDataRowVisualProperties() {
@@ -146,4 +225,8 @@
       displayName = String.Empty;
       isVisibleInLegend = true;
+      regressionType = ScatterPlotDataRowRegressionType.None;
+      polynomialRegressionOrder = 2;
+      isRegressionVisibleInLegend = true;
+      regressionDisplayName = string.Empty;
     }
     public ScatterPlotDataRowVisualProperties(string displayName)
Index: /stable/HeuristicLab.Common/3.3/Point2D.cs
===================================================================
--- /stable/HeuristicLab.Common/3.3/Point2D.cs	(revision 15096)
+++ /stable/HeuristicLab.Common/3.3/Point2D.cs	(revision 15097)
@@ -26,5 +26,5 @@
 namespace HeuristicLab.Common {
   [Serializable]
-  public struct Point2D<T> where T : struct {
+  public struct Point2D<T> where T : struct, IEquatable<T> {
     public static readonly Point2D<T> Empty = new Point2D<T>();
 
@@ -38,4 +38,9 @@
     }
 
+    private object tag;
+    public object Tag {
+      get { return tag; }
+    }
+
     [Browsable(false)]
     public bool IsEmpty {
@@ -43,11 +48,12 @@
     }
 
-    public Point2D(T x, T y) {
+    public Point2D(T x, T y, object tag = null) {
       this.x = x;
       this.y = y;
+      this.tag = tag;
     }
 
     public static bool operator ==(Point2D<T> left, Point2D<T> right) {
-      return left.x.Equals(right.x) && left.y.Equals(right.y);
+      return left.x.Equals(right.x) && left.y.Equals(right.y) && left.tag == right.tag;
     }
     public static bool operator !=(Point2D<T> left, Point2D<T> right) {
@@ -59,5 +65,6 @@
         return false;
       Point2D<T> point = (Point2D<T>)obj;
-      return x.Equals(point.x) && y.Equals(point.y) && GetType().Equals(point.GetType());
+      return GetType() == point.GetType() && x.Equals(point.x) && y.Equals(point.y) &&
+             ((tag != null && tag.Equals(point.tag)) || tag == point.tag);
     }
     public override int GetHashCode() {
Index: /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs
===================================================================
--- /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs	(revision 15096)
+++ /stable/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingDataTableView.cs	(revision 15097)
@@ -716,5 +716,5 @@
     private void AddPointsToHistogramSeries(Series series, DataRow row, List<double> values) {
       if (!row.Values.Any()) return;
-      int bins = row.VisualProperties.Bins;
+      int bins = Content.VisualProperties.HistogramBins;
 
       double minValue = GetMinimum(row.Values);
@@ -728,5 +728,5 @@
 
 
-      if (!row.VisualProperties.ExactBins) {
+      if (!Content.VisualProperties.HistogramExactBins) {
         intervalWidth = HumanRoundRange(intervalWidth);
         minValue = Math.Floor(minValue / intervalWidth) * intervalWidth;
Index: /stable/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs
===================================================================
--- /stable/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs	(revision 15096)
+++ /stable/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs	(revision 15097)
@@ -185,10 +185,10 @@
 
         treeLengthsTableRow.VisualProperties.ChartType = DataRowVisualProperties.DataRowChartType.Histogram;
-        treeLengthsTableRow.VisualProperties.ExactBins = false;
+        treeLengthsTable.VisualProperties.HistogramExactBins = false;
 
         int range = maxLength - minLength;
         if (range == 0) range = 1;
         // the following trick should result in an integer intervalWidth of 1,2,4,...
-        treeLengthsTableRow.VisualProperties.Bins = range;
+        treeLengthsTable.VisualProperties.HistogramBins = range;
 
         if (maxLength <= 25) // [0,25]
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveTrainingBestSolutionAnalyzer.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveTrainingBestSolutionAnalyzer.cs	(revision 15096)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveTrainingBestSolutionAnalyzer.cs	(revision 15097)
@@ -144,5 +144,5 @@
 
       qualityToTreeSize.Rows.Clear();
-      var trainingRow = new ScatterPlotDataRow("Training NMSE", "", sizeParetoFront.Select(x => new Point2D<double>(x.Model.SymbolicExpressionTree.Length, x.TrainingNormalizedMeanSquaredError)));
+      var trainingRow = new ScatterPlotDataRow("Training NMSE", "", sizeParetoFront.Select(x => new Point2D<double>(x.Model.SymbolicExpressionTree.Length, x.TrainingNormalizedMeanSquaredError, x)));
       trainingRow.VisualProperties.PointSize = 8;
       qualityToTreeSize.Rows.Add(trainingRow);
@@ -150,5 +150,5 @@
       if (AnalyzeTestError) {
         var testRow = new ScatterPlotDataRow("Test NMSE", "",
-          sizeParetoFront.Select(x => new Point2D<double>(x.Model.SymbolicExpressionTree.Length, x.TestNormalizedMeanSquaredError)));
+          sizeParetoFront.Select(x => new Point2D<double>(x.Model.SymbolicExpressionTree.Length, x.TestNormalizedMeanSquaredError, x)));
         testRow.VisualProperties.PointSize = 8;
         qualityToTreeSize.Rows.Add(testRow);
