Index: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataRowVisualProperties.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataRowVisualProperties.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataRowVisualProperties.cs	(revision 15282)
@@ -52,11 +52,4 @@
     }
     #endregion
-    #region Histogram Aggregation
-    public enum DataRowHistogramAggregation {
-      Overlapping,
-      SideBySide,
-      Stacked
-    }
-    #endregion
 
     private DataRowChartType chartType;
@@ -130,34 +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 DataRowHistogramAggregation aggregation;
-    public DataRowHistogramAggregation Aggregation {
-      get { return aggregation; }
-      set {
-        if (aggregation != value) {
-          aggregation = value;
-          OnPropertyChanged("Aggregation");
-        }
-      }
-    }
+
     private double scaleFactor;
     public double ScaleFactor {
@@ -232,19 +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 = "Aggregation", DefaultValue = DataRowHistogramAggregation.Overlapping)]
-    private DataRowHistogramAggregation StorableAggregation {
-      get { return aggregation; }
-      set { aggregation = value; }
-    }
     [Storable(Name = "ScaleFactor")]
     private double StorableScaleFactor {
@@ -262,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
 
@@ -275,7 +243,4 @@
       this.startIndexZero = original.startIndexZero;
       this.lineWidth = original.lineWidth;
-      this.bins = original.bins;
-      this.exactBins = original.exactBins;
-      this.aggregation = original.aggregation;
       this.scaleFactor = original.scaleFactor;
       this.displayName = original.displayName;
@@ -290,7 +255,4 @@
       startIndexZero = false;
       lineWidth = 1;
-      bins = 10;
-      exactBins = false;
-      aggregation = DataRowHistogramAggregation.Overlapping;
       scaleFactor = 1.0;
       displayName = String.Empty;
@@ -318,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: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 15282)
@@ -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: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataTableVisualProperties.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataTableVisualProperties.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/DataTableVisualProperties.cs	(revision 15282)
@@ -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: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/IndexedDataRow.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/IndexedDataRow.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/IndexedDataRow.cs	(revision 15282)
@@ -30,5 +30,5 @@
 
 namespace HeuristicLab.Analysis {
-  [Item("IndexedDataRow", "A data row that contains time series.")]
+  [Item("IndexedDataRow", "A data row that contains a series of points.")]
   [StorableClass]
   public class IndexedDataRow<T> : NamedItem {
@@ -105,4 +105,8 @@
       OnVisualPropertiesChanged();
     }
+    protected override void OnNameChanged() {
+      base.OnNameChanged();
+      VisualProperties.DisplayName = Name;
+    }
   }
 }
Index: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/IndexedDataTable.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/IndexedDataTable.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/DataVisualization/IndexedDataTable.cs	(revision 15282)
@@ -107,5 +107,5 @@
     public event EventHandler VisualPropertiesChanged;
     protected virtual void OnVisualPropertiesChanged() {
-      EventHandler handler = VisualPropertiesChanged;
+      var handler = VisualPropertiesChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
@@ -115,11 +115,12 @@
     }
 
-    protected virtual void RegisterRowsEvents() {
-      rows.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(rows_ItemsAdded);
-      rows.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(rows_ItemsRemoved);
-      rows.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(rows_ItemsReplaced);
-      rows.CollectionReset += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(rows_CollectionReset);
-    }
-    private void rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
+    private void RegisterRowsEvents() {
+      rows.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(RowsOnItemsAdded);
+      rows.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(RowsOnItemsRemoved);
+      rows.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(RowsOnItemsReplaced);
+      rows.CollectionReset += new CollectionItemsChangedEventHandler<IndexedDataRow<T>>(RowsOnCollectionReset);
+      foreach (var row in Rows) RegisterRowEvents(row);
+    }
+    protected virtual void RowsOnItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
       foreach (var row in e.Items)
         this.RegisterRowEvents(row);
@@ -129,5 +130,5 @@
       this.OnReset();
     }
-    private void rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
+    protected virtual void RowsOnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
       foreach (var row in e.Items)
         this.DeregisterRowEvents(row);
@@ -137,5 +138,5 @@
       this.OnReset();
     }
-    private void rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
+    protected virtual void RowsOnItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
       foreach (var row in e.OldItems)
         this.DeregisterRowEvents(row);
@@ -147,5 +148,5 @@
       this.OnReset();
     }
-    private void rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
+    protected virtual void RowsOnCollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedDataRow<T>> e) {
       foreach (var row in e.OldItems)
         this.DeregisterRowEvents(row);
@@ -159,32 +160,32 @@
     }
 
-    protected virtual void RegisterRowEvents(IndexedDataRow<T> row) {
-      row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsAdded);
-      row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsMoved);
-      row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsRemoved);
-      row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsReplaced);
-      row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_CollectionReset);
-    }
-    protected virtual void DeregisterRowEvents(IndexedDataRow<T> row) {
-      row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsAdded);
-      row.Values.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsMoved);
-      row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsRemoved);
-      row.Values.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_ItemsReplaced);
-      row.Values.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(Values_CollectionReset);
-    }
-
-    private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
-      this.OnReset();
-    }
-    private void Values_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
-      this.OnReset();
-    }
-    private void Values_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
-      this.OnReset();
-    }
-    private void Values_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
-      this.OnReset();
-    }
-    private void Values_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
+    private void RegisterRowEvents(IndexedDataRow<T> row) {
+      row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsAdded);
+      row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsMoved);
+      row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsRemoved);
+      row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsReplaced);
+      row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnCollectionReset);
+    }
+    private void DeregisterRowEvents(IndexedDataRow<T> row) {
+      row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsAdded);
+      row.Values.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsMoved);
+      row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsRemoved);
+      row.Values.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnItemsReplaced);
+      row.Values.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<T, double>>>(ValuesOnCollectionReset);
+    }
+
+    protected virtual void ValuesOnItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
+      this.OnReset();
+    }
+    protected virtual void ValuesOnItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
+      this.OnReset();
+    }
+    protected virtual void ValuesOnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
+      this.OnReset();
+    }
+    protected virtual void ValuesOnItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
+      this.OnReset();
+    }
+    protected virtual void ValuesOnCollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<T, double>>> e) {
       this.OnReset();
     }
Index: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/ExpectedRuntimeHelper.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/ExpectedRuntimeHelper.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/ExpectedRuntimeHelper.cs	(revision 15282)
@@ -46,7 +46,7 @@
 
   public struct ErtCalculationResult {
-    public int SuccessfulRuns;
-    public int TotalRuns;
-    public double ExpectedRuntime;
+    public readonly int SuccessfulRuns;
+    public readonly int TotalRuns;
+    public readonly double ExpectedRuntime;
 
     public ErtCalculationResult(int successful, int total, double ert) {
@@ -57,6 +57,5 @@
 
     public override string ToString() {
-      return SuccessfulRuns == 0 ? "\u221e" // infinity symbol
-                                 : ExpectedRuntime.ToString("##,0.0", CultureInfo.CurrentCulture.NumberFormat);
+      return ExpectedRuntime.ToString("##,0.0", CultureInfo.CurrentCulture.NumberFormat);
     }
   }
Index: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityPerClockAnalyzer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityPerClockAnalyzer.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityPerClockAnalyzer.cs	(revision 15282)
@@ -91,6 +91,6 @@
 
       if (values.Count == 0) {
-        values.Add(newEntry);
-        values.Add(Tuple.Create(runtimeSoFar, bestQuality)); // duplicate entry that will be replaced
+        values.Add(newEntry); // record the first data
+        values.Add(Tuple.Create(runtimeSoFar, bestQuality)); // last entry records max number of evaluations
         return base.Apply();
       }
@@ -98,6 +98,6 @@
       var improvement = values.Last().Item2 != bestQuality;
       if (improvement) {
-        values[values.Count - 1] = newEntry;
-        values.Add(Tuple.Create(runtimeSoFar, bestQuality)); // duplicate entry that will be replaced
+        values[values.Count - 1] = newEntry; // record the improvement
+        values.Add(Tuple.Create(runtimeSoFar, bestQuality)); // last entry records max number of evaluations
       } else {
         values[values.Count - 1] = Tuple.Create(runtimeSoFar, bestQuality);
Index: branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityPerEvaluationsAnalyzer.cs
===================================================================
--- branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityPerEvaluationsAnalyzer.cs	(revision 14776)
+++ branches/PerformanceComparison/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityPerEvaluationsAnalyzer.cs	(revision 15282)
@@ -88,21 +88,23 @@
       if (evalMoves != null) evaluations += evalMoves.Value * MoveCostPerSolutionParameter.ActualValue.Value;
 
-      var dataTable = QualityPerEvaluationsParameter.ActualValue;
-      var values = dataTable.Rows["First-hit Graph"].Values;
-      if (evaluations == 0 || values.Count > 0 && evaluations < values.Last().Item1) evaluations = 1;
-      var newEntry = Tuple.Create(evaluations, bestQuality);
+      if (evaluations > 0) {
+        var dataTable = QualityPerEvaluationsParameter.ActualValue;
+        var values = dataTable.Rows["First-hit Graph"].Values;
 
-      if (values.Count == 0) {
-        values.Add(newEntry);
-        values.Add(Tuple.Create(evaluations, bestQuality)); // duplicate entry that will be replaced
-        return base.Apply();
-      }
+        var newEntry = Tuple.Create(evaluations, bestQuality);
 
-      var improvement = values.Last().Item2 != bestQuality;
-      if (improvement) {
-        values[values.Count - 1] = newEntry;
-        values.Add(Tuple.Create(evaluations, bestQuality)); // duplicate entry that will be replaced
-      } else {
-        values[values.Count - 1] = Tuple.Create(evaluations, bestQuality);
+        if (values.Count == 0) {
+          values.Add(newEntry); // record the first data
+          values.Add(Tuple.Create(evaluations, bestQuality)); // last entry records max number of evaluations
+          return base.Apply();
+        }
+
+        var improvement = values.Last().Item2 != bestQuality;
+        if (improvement) {
+          values[values.Count - 1] = newEntry; // record the improvement
+          values.Add(Tuple.Create(evaluations, bestQuality)); // last entry records max number of evaluations
+        } else {
+          values[values.Count - 1] = Tuple.Create(evaluations, bestQuality); // the last entry is updated
+        }
       }
       return base.Apply();
