Index: /trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/HistogramControl.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/HistogramControl.Designer.cs	(revision 11607)
+++ /trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/HistogramControl.Designer.cs	(revision 11608)
@@ -45,5 +45,7 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
       System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
       this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
@@ -58,11 +60,16 @@
       // 
       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)));
       chartArea1.Name = "ChartArea1";
       this.chart.ChartAreas.Add(chartArea1);
+      legend1.Alignment = System.Drawing.StringAlignment.Center;
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.Name = "Default";
+      this.chart.Legends.Add(legend1);
       this.chart.Location = new System.Drawing.Point(0, 27);
       this.chart.Name = "chart";
       series1.ChartArea = "ChartArea1";
+      series1.Legend = "Default";
       series1.Name = "Series1";
       this.chart.Series.Add(series1);
@@ -116,5 +123,4 @@
       // HistogramControl
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.exactCheckBox);
Index: /trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/HistogramControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/HistogramControl.cs	(revision 11607)
+++ /trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/HistogramControl.cs	(revision 11608)
@@ -29,7 +29,7 @@
 namespace HeuristicLab.Visualization.ChartControlsExtensions {
   public partial class HistogramControl : UserControl {
-    private static readonly string SeriesName = "Histogram";
-
-    private List<double> points;
+    protected static readonly string SeriesName = "Histogram";
+
+    protected Dictionary<string, List<double>> points;
     public int NumberOfBins {
       get { return (int)binsNumericUpDown.Value; }
@@ -64,15 +64,55 @@
     public HistogramControl() {
       InitializeComponent();
-      points = new List<double>();
+      points = new Dictionary<string, List<double>>();
       InitializeChart();
     }
 
+    protected void InitNewRow(string name) {
+      if (!points.ContainsKey(name)) {
+        points.Add(name, new List<double>());
+      }
+    }
+
+    protected void InitSeries(string name) {
+      if (!chart.Series.Any(x => x.Name == name)) {
+        Series s = chart.Series.Add(name);
+        s.ChartType = SeriesChartType.Column;
+        s.BorderColor = Color.Black;
+        s.BorderWidth = 1;
+        s.BorderDashStyle = ChartDashStyle.Solid;
+      }
+    }
+
     public void AddPoint(double point) {
-      points.Add(point);
+      InitNewRow(SeriesName);
+      InitSeries(SeriesName);
+      points[SeriesName].Add(point);
       UpdateHistogram();
     }
 
     public void AddPoints(IEnumerable<double> points) {
-      this.points.AddRange(points);
+      InitNewRow(SeriesName);
+      InitSeries(SeriesName);
+      this.points[SeriesName].AddRange(points);
+      UpdateHistogram();
+    }
+
+    public void AddPoint(string name, double point, bool replace = false) {
+      InitNewRow(name);
+      InitSeries(name);
+      if (replace) {
+        points[name].Clear();
+      }
+      points[name].Add(point);
+      UpdateHistogram();
+    }
+
+    public void AddPoints(string name, IEnumerable<double> points, bool replace = false) {
+      InitNewRow(name);
+      InitSeries(name);
+      if (replace) {
+        this.points[name].Clear();
+      }
+      this.points[name].AddRange(points);
       UpdateHistogram();
     }
@@ -83,56 +123,63 @@
     }
 
-    private void InitializeChart() {
+    protected void InitializeChart() {
       chart.Series.Clear();
-      Series s = chart.Series.Add(SeriesName);
-      s.ChartType = SeriesChartType.Column;
-      s.BorderColor = Color.Black;
-      s.BorderWidth = 1;
-      s.BorderDashStyle = ChartDashStyle.Solid;
-    }
-
-    private void UpdateHistogram() {
+    }
+
+    protected void UpdateHistogram() {
       if (InvokeRequired) {
         Invoke((Action)UpdateHistogram, null);
         return;
       }
-      Series histogramSeries = chart.Series[SeriesName];
-      histogramSeries.Points.Clear();
-
-      if (!points.Any()) return;
+
+      double overallMin = double.MaxValue;
+      double overallMax = double.MinValue;
       int bins = (int)binsNumericUpDown.Value;
 
-      double minValue = points.Min();
-      double maxValue = points.Max();
-      double intervalWidth = (maxValue - minValue) / bins;
-      if (intervalWidth <= 0) return;
-
-      if (!exactCheckBox.Checked) {
-        intervalWidth = HumanRoundRange(intervalWidth);
-        minValue = Math.Floor(minValue / intervalWidth) * intervalWidth;
-        maxValue = Math.Ceiling(maxValue / intervalWidth) * intervalWidth;
-      }
-
-      double current = minValue, intervalCenter = intervalWidth / 2.0;
-      int count = 0;
-      foreach (double v in points.OrderBy(x => x)) {
-        while (v > current + intervalWidth) {
-          histogramSeries.Points.AddXY(current + intervalCenter, count);
-          current += intervalWidth;
-          count = 0;
+      chart.Series.Clear();
+
+      foreach (var point in points) {
+        if (!point.Value.Any()) continue;
+
+        Series histogramSeries = new Series(point.Key);
+        chart.Series.Add(histogramSeries);
+
+        double minValue = point.Value.Min();
+        double maxValue = point.Value.Max();
+        double intervalWidth = (maxValue - minValue) / bins;
+        if (intervalWidth <= 0) continue;
+
+        if (!exactCheckBox.Checked) {
+          intervalWidth = HumanRoundRange(intervalWidth);
+          minValue = Math.Floor(minValue / intervalWidth) * intervalWidth;
+          maxValue = Math.Ceiling(maxValue / intervalWidth) * intervalWidth;
         }
-        count++;
-      }
-      histogramSeries.Points.AddXY(current + intervalCenter, count);
-
-      histogramSeries["PointWidth"] = "1";
-
-      ChartArea chartArea = chart.ChartAreas[histogramSeries.ChartArea];
+
+        double current = minValue, intervalCenter = intervalWidth / 2.0;
+        int count = 0;
+        foreach (double v in point.Value.OrderBy(x => x)) {
+          while (v > current + intervalWidth) {
+            histogramSeries.Points.AddXY(current + intervalCenter, count);
+            current += intervalWidth;
+            count = 0;
+          }
+          count++;
+        }
+        histogramSeries.Points.AddXY(current + intervalCenter, count);
+        histogramSeries["PointWidth"] = "1";
+
+        overallMax = Math.Max(overallMax, maxValue);
+        overallMin = Math.Min(overallMin, minValue);
+      }
+
+      ChartArea chartArea = chart.ChartAreas[0];
       chartArea.AxisY.Title = "Frequency";
-      chartArea.AxisX.Minimum = minValue;
-      chartArea.AxisX.Maximum = maxValue;
-
-      double axisInterval = intervalWidth;
-      while ((maxValue - minValue) / axisInterval > 10.0) {
+      chartArea.AxisX.Minimum = overallMin;
+      chartArea.AxisX.Maximum = overallMax;
+
+      double overallIntervalWidth = (overallMax - overallMin) / bins;
+
+      double axisInterval = overallIntervalWidth;
+      while ((overallMax - overallMin) / axisInterval > 10.0) {
         axisInterval *= 2.0;
       }
@@ -140,5 +187,5 @@
     }
 
-    private double HumanRoundRange(double range) {
+    protected double HumanRoundRange(double range) {
       double base10 = Math.Pow(10.0, Math.Floor(Math.Log10(range)));
       double rounding = range / base10;
