Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.Designer.cs	(revision 9438)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.Designer.cs	(revision 12118)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -61,4 +61,5 @@
       this.tooltip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
@@ -71,5 +72,5 @@
       this.xAxisLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.xAxisLabel.AutoSize = true;
-      this.xAxisLabel.Location = new System.Drawing.Point(298, 256);
+      this.xAxisLabel.Location = new System.Drawing.Point(363, 345);
       this.xAxisLabel.Name = "xAxisLabel";
       this.xAxisLabel.Size = new System.Drawing.Size(15, 13);
@@ -83,7 +84,7 @@
       this.xAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.xAxisComboBox.FormattingEnabled = true;
-      this.xAxisComboBox.Location = new System.Drawing.Point(319, 253);
+      this.xAxisComboBox.Location = new System.Drawing.Point(384, 342);
       this.xAxisComboBox.Name = "xAxisComboBox";
-      this.xAxisComboBox.Size = new System.Drawing.Size(221, 21);
+      this.xAxisComboBox.Size = new System.Drawing.Size(600, 21);
       this.xAxisComboBox.TabIndex = 11;
       this.xAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.AxisComboBox_SelectedIndexChanged);
@@ -105,5 +106,5 @@
       this.yAxisComboBox.Location = new System.Drawing.Point(24, 3);
       this.yAxisComboBox.Name = "yAxisComboBox";
-      this.yAxisComboBox.Size = new System.Drawing.Size(221, 21);
+      this.yAxisComboBox.Size = new System.Drawing.Size(600, 21);
       this.yAxisComboBox.TabIndex = 9;
       this.yAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.AxisComboBox_SelectedIndexChanged);
@@ -111,10 +112,10 @@
       // chart
       // 
-      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)));
+      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)));
       chartArea1.Name = "ChartArea1";
       this.chart.ChartAreas.Add(chartArea1);
-      this.chart.Location = new System.Drawing.Point(6, 30);
+      this.chart.Location = new System.Drawing.Point(-1, 30);
       this.chart.Name = "chart";
       series1.ChartArea = "ChartArea1";
@@ -125,5 +126,5 @@
       series1.YValuesPerPoint = 6;
       this.chart.Series.Add(series1);
-      this.chart.Size = new System.Drawing.Size(534, 217);
+      this.chart.Size = new System.Drawing.Size(989, 306);
       this.chart.TabIndex = 17;
       this.chart.Text = "chart";
@@ -135,5 +136,5 @@
       this.noRunsLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.noRunsLabel.AutoSize = true;
-      this.noRunsLabel.Location = new System.Drawing.Point(212, 122);
+      this.noRunsLabel.Location = new System.Drawing.Point(434, 167);
       this.noRunsLabel.Name = "noRunsLabel";
       this.noRunsLabel.Size = new System.Drawing.Size(138, 13);
@@ -161,6 +162,6 @@
       // 
       this.splitContainer.Panel2.Controls.Add(this.statisticsGroupBox);
-      this.splitContainer.Size = new System.Drawing.Size(543, 416);
-      this.splitContainer.SplitterDistance = 277;
+      this.splitContainer.Size = new System.Drawing.Size(987, 550);
+      this.splitContainer.SplitterDistance = 366;
       this.splitContainer.TabIndex = 23;
       // 
@@ -172,5 +173,5 @@
       this.showStatisticsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
       this.showStatisticsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
-      this.showStatisticsCheckBox.Location = new System.Drawing.Point(6, 245);
+      this.showStatisticsCheckBox.Location = new System.Drawing.Point(3, 339);
       this.showStatisticsCheckBox.Name = "showStatisticsCheckBox";
       this.showStatisticsCheckBox.Size = new System.Drawing.Size(24, 24);
@@ -182,11 +183,11 @@
       // statisticsGroupBox
       // 
-      this.statisticsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.statisticsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.statisticsGroupBox.Controls.Add(this.statisticsMatrixView);
       this.statisticsGroupBox.Location = new System.Drawing.Point(3, 3);
       this.statisticsGroupBox.Name = "statisticsGroupBox";
-      this.statisticsGroupBox.Size = new System.Drawing.Size(534, 129);
+      this.statisticsGroupBox.Size = new System.Drawing.Size(981, 174);
       this.statisticsGroupBox.TabIndex = 1;
       this.statisticsGroupBox.TabStop = false;
@@ -203,10 +204,9 @@
       this.statisticsMatrixView.ShowRowsAndColumnsTextBox = false;
       this.statisticsMatrixView.ShowStatisticalInformation = false;
-      this.statisticsMatrixView.Size = new System.Drawing.Size(528, 110);
+      this.statisticsMatrixView.Size = new System.Drawing.Size(975, 155);
       this.statisticsMatrixView.TabIndex = 0;
       // 
       // RunCollectionBoxPlotView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.BackColor = System.Drawing.SystemColors.Window;
@@ -214,9 +214,10 @@
       this.Controls.Add(this.splitContainer);
       this.Name = "RunCollectionBoxPlotView";
-      this.Size = new System.Drawing.Size(543, 416);
+      this.Size = new System.Drawing.Size(987, 550);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
       this.splitContainer.Panel1.ResumeLayout(false);
       this.splitContainer.Panel1.PerformLayout();
       this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
       this.statisticsGroupBox.ResumeLayout(false);
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 9438)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 12118)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using System.Windows.Forms;
@@ -32,5 +33,5 @@
 
 namespace HeuristicLab.Optimization.Views {
-  [View("RunCollection BoxPlots")]
+  [View("Box Plot")]
   [Content(typeof(RunCollection), false)]
   public partial class RunCollectionBoxPlotView : AsynchronousContentView {
@@ -92,9 +93,9 @@
     protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed += new EventHandler(run_Changed);
+        run.PropertyChanged += run_PropertyChanged;
     }
     protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed -= new EventHandler(run_Changed);
+        run.PropertyChanged -= run_PropertyChanged;
     }
 
@@ -121,6 +122,5 @@
       if (InvokeRequired)
         Invoke(new EventHandler(Content_Reset), sender, e);
-      else {
-        this.categoricalMapping.Clear();
+      else if (!suppressUpdates) {
         UpdateDataPoints();
         UpdateAxisLabels();
@@ -134,9 +134,10 @@
       }
     }
-    private void run_Changed(object sender, EventArgs e) {
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (InvokeRequired)
-        this.Invoke(new EventHandler(run_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
       else if (!suppressUpdates) {
-        UpdateDataPoints();
+        if (e.PropertyName == "Visible")
+          UpdateDataPoints();
       }
     }
@@ -159,5 +160,5 @@
 
     private void UpdateCaption() {
-      Caption = Content != null ? Content.OptimizerName + " Box Plots" : ViewAttribute.GetViewName(GetType());
+      Caption = Content != null ? Content.OptimizerName + " Box Plot" : ViewAttribute.GetViewName(GetType());
     }
 
@@ -189,4 +190,5 @@
 
     private void UpdateDataPoints() {
+      this.categoricalMapping.Clear();
       this.chart.Series.Clear();
       this.seriesCache.Clear();
@@ -216,5 +218,5 @@
         if (datapoint != null) {
           IRun run = (IRun)datapoint.Tag;
-          string selectedAxis = (string)xAxisComboBox.SelectedItem;
+          string selectedAxis = xAxisValue;
           IItem value = null;
 
@@ -234,5 +236,5 @@
       }
       matrix.ColumnNames = columnNames;
-      matrix.RowNames = new string[] { "Count", "Minimum", "Maximum", "Average", "Median", "Standard Deviation", "Variance", "25th Percentile", "75th Percentile" };
+      matrix.RowNames = new string[] { "Count", "Minimum", "Maximum", "Median", "Average", "Standard Deviation", "Variance", "25th Percentile", "75th Percentile" };
 
       for (int i = 0; i < seriesCache.Count; i++) {
@@ -242,6 +244,6 @@
         matrix[1, i] = seriesValues.Min();
         matrix[2, i] = seriesValues.Max();
-        matrix[3, i] = seriesValues.Average();
-        matrix[4, i] = seriesValues.Median();
+        matrix[3, i] = seriesValues.Median();
+        matrix[4, i] = seriesValues.Average();
         matrix[5, i] = seriesValues.StandardDeviation();
         matrix[6, i] = seriesValues.Variance();
@@ -325,5 +327,5 @@
       }
     }
-    private double GetCategoricalValue(int dimension, string value) {
+    private double? GetCategoricalValue(int dimension, string value) {
       if (!this.categoricalMapping.ContainsKey(dimension)) {
         this.categoricalMapping[dimension] = new Dictionary<object, double>();
@@ -336,8 +338,9 @@
         }
       }
+      if (!this.categoricalMapping[dimension].ContainsKey(value)) return null;
       return this.categoricalMapping[dimension][value];
     }
-    private double GetValue(IRun run, AxisDimension axisDimension) {
-      double value = double.NaN;
+    private double? GetValue(IRun run, AxisDimension axisDimension) {
+      double? value = double.NaN;
       switch (axisDimension) {
         case AxisDimension.Color: {
@@ -373,10 +376,13 @@
       Axis yAxis = this.chart.ChartAreas[BoxPlotChartAreaName].AxisY;
       int axisDimensionCount = Enum.GetNames(typeof(AxisDimension)).Count();
-      SetCustomAxisLabels(xAxis, xAxisComboBox.SelectedIndex - axisDimensionCount);
-      SetCustomAxisLabels(yAxis, yAxisComboBox.SelectedIndex - axisDimensionCount);
-      if (xAxisComboBox.SelectedItem != null)
-        xAxis.Title = xAxisComboBox.SelectedItem.ToString();
-      if (yAxisComboBox.SelectedItem != null)
-        yAxis.Title = yAxisComboBox.SelectedItem.ToString();
+      //mkommend: combobox.SelectedIndex could not be used as this changes during hovering over possible values
+      var xSAxisSelectedIndex = xAxisValue == null ? 0 : xAxisComboBox.Items.IndexOf(xAxisValue);
+      var ySAxisSelectedIndex = yAxisValue == null ? 0 : xAxisComboBox.Items.IndexOf(yAxisValue);
+      SetCustomAxisLabels(xAxis, xSAxisSelectedIndex - axisDimensionCount);
+      SetCustomAxisLabels(yAxis, ySAxisSelectedIndex - axisDimensionCount);
+      if (xAxisValue != null)
+        xAxis.Title = xAxisValue;
+      if (yAxisValue != null)
+        yAxis.Title = yAxisValue;
     }
 
@@ -447,4 +453,11 @@
     }
 
+    public void SetXAxis(string axisName) {
+      xAxisComboBox.SelectedItem = axisName;
+    }
+
+    public void SetYAxis(string axisName) {
+      yAxisComboBox.SelectedItem = axisName;
+    }
   }
 }
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.Designer.cs	(revision 9438)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.Designer.cs	(revision 12118)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -48,4 +48,5 @@
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RunCollectionBubbleChartView));
       this.yJitterLabel = new System.Windows.Forms.Label();
       this.xJitterlabel = new System.Windows.Forms.Label();
@@ -71,4 +72,5 @@
       this.transparencyTrackBar = new System.Windows.Forms.TrackBar();
       this.hideRunsButton = new System.Windows.Forms.Button();
+      this.colorDialogButton = new System.Windows.Forms.Button();
       this.noRunsLabel = new System.Windows.Forms.Label();
       this.sizeTrackBar = new System.Windows.Forms.TrackBar();
@@ -77,5 +79,4 @@
       this.unhideAllRunToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.colorResetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-      this.colorDialogButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.xTrackBar)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.yTrackBar)).BeginInit();
@@ -89,5 +90,5 @@
       // 
       this.yJitterLabel.AutoSize = true;
-      this.yJitterLabel.Location = new System.Drawing.Point(278, 6);
+      this.yJitterLabel.Location = new System.Drawing.Point(457, 6);
       this.yJitterLabel.Name = "yJitterLabel";
       this.yJitterLabel.Size = new System.Drawing.Size(32, 13);
@@ -99,5 +100,5 @@
       this.xJitterlabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.xJitterlabel.AutoSize = true;
-      this.xJitterlabel.Location = new System.Drawing.Point(749, 472);
+      this.xJitterlabel.Location = new System.Drawing.Point(893, 719);
       this.xJitterlabel.Name = "xJitterlabel";
       this.xJitterlabel.Size = new System.Drawing.Size(32, 13);
@@ -109,5 +110,5 @@
       this.xTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.xTrackBar.Enabled = false;
-      this.xTrackBar.Location = new System.Drawing.Point(787, 469);
+      this.xTrackBar.Location = new System.Drawing.Point(919, 715);
       this.xTrackBar.Maximum = 100;
       this.xTrackBar.Name = "xTrackBar";
@@ -121,5 +122,5 @@
       this.xAxisLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.xAxisLabel.AutoSize = true;
-      this.xAxisLabel.Location = new System.Drawing.Point(471, 472);
+      this.xAxisLabel.Location = new System.Drawing.Point(439, 719);
       this.xAxisLabel.Name = "xAxisLabel";
       this.xAxisLabel.Size = new System.Drawing.Size(15, 13);
@@ -132,8 +133,9 @@
       this.xAxisComboBox.BackColor = System.Drawing.SystemColors.ControlLightLight;
       this.xAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.xAxisComboBox.DropDownWidth = 500;
       this.xAxisComboBox.FormattingEnabled = true;
-      this.xAxisComboBox.Location = new System.Drawing.Point(492, 469);
+      this.xAxisComboBox.Location = new System.Drawing.Point(460, 715);
       this.xAxisComboBox.Name = "xAxisComboBox";
-      this.xAxisComboBox.Size = new System.Drawing.Size(221, 21);
+      this.xAxisComboBox.Size = new System.Drawing.Size(400, 21);
       this.xAxisComboBox.TabIndex = 7;
       this.xAxisComboBox.SelectedValueChanged += new System.EventHandler(this.AxisComboBox_SelectedValueChanged);
@@ -152,8 +154,9 @@
       this.yAxisComboBox.BackColor = System.Drawing.SystemColors.ControlLightLight;
       this.yAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.yAxisComboBox.DropDownWidth = 800;
       this.yAxisComboBox.FormattingEnabled = true;
       this.yAxisComboBox.Location = new System.Drawing.Point(24, 3);
       this.yAxisComboBox.Name = "yAxisComboBox";
-      this.yAxisComboBox.Size = new System.Drawing.Size(221, 21);
+      this.yAxisComboBox.Size = new System.Drawing.Size(400, 21);
       this.yAxisComboBox.TabIndex = 5;
       this.yAxisComboBox.SelectedValueChanged += new System.EventHandler(this.AxisComboBox_SelectedValueChanged);
@@ -162,5 +165,5 @@
       // 
       this.yTrackBar.Enabled = false;
-      this.yTrackBar.Location = new System.Drawing.Point(312, 3);
+      this.yTrackBar.Location = new System.Drawing.Point(483, 3);
       this.yTrackBar.Maximum = 100;
       this.yTrackBar.Name = "yTrackBar";
@@ -175,8 +178,9 @@
       this.sizeComboBox.BackColor = System.Drawing.SystemColors.ControlLightLight;
       this.sizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.sizeComboBox.DropDownWidth = 400;
       this.sizeComboBox.FormattingEnabled = true;
-      this.sizeComboBox.Location = new System.Drawing.Point(560, 4);
+      this.sizeComboBox.Location = new System.Drawing.Point(613, 3);
       this.sizeComboBox.Name = "sizeComboBox";
-      this.sizeComboBox.Size = new System.Drawing.Size(221, 21);
+      this.sizeComboBox.Size = new System.Drawing.Size(300, 21);
       this.sizeComboBox.TabIndex = 14;
       this.sizeComboBox.SelectedValueChanged += new System.EventHandler(this.AxisComboBox_SelectedValueChanged);
@@ -186,5 +190,5 @@
       this.sizeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
       this.sizeLabel.AutoSize = true;
-      this.sizeLabel.Location = new System.Drawing.Point(489, 7);
+      this.sizeLabel.Location = new System.Drawing.Point(541, 6);
       this.sizeLabel.Name = "sizeLabel";
       this.sizeLabel.Size = new System.Drawing.Size(66, 13);
@@ -194,10 +198,10 @@
       // chart
       // 
-      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      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)));
       chartArea1.Name = "ChartArea1";
       this.chart.ChartAreas.Add(chartArea1);
-      this.chart.Location = new System.Drawing.Point(6, 30);
+      this.chart.Location = new System.Drawing.Point(-1, 30);
       this.chart.Name = "chart";
       series1.ChartArea = "ChartArea1";
@@ -208,5 +212,5 @@
       series1.YValuesPerPoint = 2;
       this.chart.Series.Add(series1);
-      this.chart.Size = new System.Drawing.Size(843, 425);
+      this.chart.Size = new System.Drawing.Size(988, 681);
       this.chart.TabIndex = 16;
       this.chart.Text = "chart";
@@ -235,5 +239,5 @@
       this.zoomButton.AutoSize = true;
       this.zoomButton.Checked = true;
-      this.zoomButton.Location = new System.Drawing.Point(6, 10);
+      this.zoomButton.Location = new System.Drawing.Point(6, 11);
       this.zoomButton.Name = "zoomButton";
       this.zoomButton.Size = new System.Drawing.Size(52, 17);
@@ -248,5 +252,5 @@
       this.selectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.selectButton.AutoSize = true;
-      this.selectButton.Location = new System.Drawing.Point(64, 9);
+      this.selectButton.Location = new System.Drawing.Point(61, 11);
       this.selectButton.Name = "selectButton";
       this.selectButton.Size = new System.Drawing.Size(55, 17);
@@ -260,5 +264,5 @@
       this.radioButtonGroup.Controls.Add(this.zoomButton);
       this.radioButtonGroup.Controls.Add(this.selectButton);
-      this.radioButtonGroup.Location = new System.Drawing.Point(2, 461);
+      this.radioButtonGroup.Location = new System.Drawing.Point(3, 704);
       this.radioButtonGroup.Name = "radioButtonGroup";
       this.radioButtonGroup.Size = new System.Drawing.Size(122, 32);
@@ -271,5 +275,5 @@
       this.colorRunsButton.Enabled = false;
       this.colorRunsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.colorRunsButton.Location = new System.Drawing.Point(130, 469);
+      this.colorRunsButton.Location = new System.Drawing.Point(131, 713);
       this.colorRunsButton.Name = "colorRunsButton";
       this.colorRunsButton.Size = new System.Drawing.Size(21, 21);
@@ -289,5 +293,5 @@
       this.colorXAxisButton.Enabled = false;
       this.colorXAxisButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.DisplayInColorVertical;
-      this.colorXAxisButton.Location = new System.Drawing.Point(719, 469);
+      this.colorXAxisButton.Location = new System.Drawing.Point(866, 715);
       this.colorXAxisButton.Name = "colorXAxisButton";
       this.colorXAxisButton.Size = new System.Drawing.Size(21, 21);
@@ -301,5 +305,5 @@
       this.colorYAxisButton.Enabled = false;
       this.colorYAxisButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.DisplayInColor;
-      this.colorYAxisButton.Location = new System.Drawing.Point(251, 3);
+      this.colorYAxisButton.Location = new System.Drawing.Point(430, 3);
       this.colorYAxisButton.Name = "colorYAxisButton";
       this.colorYAxisButton.Size = new System.Drawing.Size(21, 21);
@@ -313,5 +317,5 @@
       this.transparencyTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.transparencyTrackBar.LargeChange = 16;
-      this.transparencyTrackBar.Location = new System.Drawing.Point(359, 470);
+      this.transparencyTrackBar.Location = new System.Drawing.Point(302, 715);
       this.transparencyTrackBar.Maximum = 254;
       this.transparencyTrackBar.Name = "transparencyTrackBar";
@@ -327,5 +331,5 @@
       this.hideRunsButton.Enabled = false;
       this.hideRunsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.hideRunsButton.Location = new System.Drawing.Point(177, 469);
+      this.hideRunsButton.Location = new System.Drawing.Point(172, 713);
       this.hideRunsButton.Name = "hideRunsButton";
       this.hideRunsButton.Size = new System.Drawing.Size(43, 21);
@@ -336,9 +340,25 @@
       this.hideRunsButton.Click += new System.EventHandler(this.hideRunsButton_Click);
       // 
+      // colorDialogButton
+      // 
+      this.colorDialogButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.colorDialogButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.colorDialogButton.Enabled = false;
+      this.colorDialogButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.colorDialogButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.colorDialogButton.Location = new System.Drawing.Point(152, 713);
+      this.colorDialogButton.Name = "colorDialogButton";
+      this.colorDialogButton.Size = new System.Drawing.Size(14, 21);
+      this.colorDialogButton.TabIndex = 25;
+      this.colorDialogButton.Text = "v";
+      this.tooltip.SetToolTip(this.colorDialogButton, "Choose color");
+      this.colorDialogButton.UseVisualStyleBackColor = true;
+      this.colorDialogButton.Click += new System.EventHandler(this.colorDialogButton_Click);
+      // 
       // noRunsLabel
       // 
       this.noRunsLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.noRunsLabel.AutoSize = true;
-      this.noRunsLabel.Location = new System.Drawing.Point(366, 228);
+      this.noRunsLabel.Location = new System.Drawing.Point(432, 350);
       this.noRunsLabel.Name = "noRunsLabel";
       this.noRunsLabel.Size = new System.Drawing.Size(138, 13);
@@ -349,5 +369,5 @@
       // 
       this.sizeTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.sizeTrackBar.Location = new System.Drawing.Point(787, 3);
+      this.sizeTrackBar.Location = new System.Drawing.Point(919, 3);
       this.sizeTrackBar.Maximum = 20;
       this.sizeTrackBar.Minimum = -20;
@@ -370,5 +390,5 @@
       this.transparencyLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.transparencyLabel.AutoSize = true;
-      this.transparencyLabel.Location = new System.Drawing.Point(278, 475);
+      this.transparencyLabel.Location = new System.Drawing.Point(233, 717);
       this.transparencyLabel.Name = "transparencyLabel";
       this.transparencyLabel.Size = new System.Drawing.Size(75, 13);
@@ -390,20 +410,4 @@
       this.colorResetToolStripMenuItem.Click += new System.EventHandler(this.colorResetToolStripMenuItem_Click);
       // 
-      // colorDialogButton
-      // 
-      this.colorDialogButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.colorDialogButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
-      this.colorDialogButton.Enabled = false;
-      this.colorDialogButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.colorDialogButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.colorDialogButton.Location = new System.Drawing.Point(150, 469);
-      this.colorDialogButton.Name = "colorDialogButton";
-      this.colorDialogButton.Size = new System.Drawing.Size(14, 21);
-      this.colorDialogButton.TabIndex = 25;
-      this.colorDialogButton.Text = "v";
-      this.tooltip.SetToolTip(this.colorDialogButton, "Choose color");
-      this.colorDialogButton.UseVisualStyleBackColor = true;
-      this.colorDialogButton.Click += new System.EventHandler(this.colorDialogButton_Click);
-      // 
       // RunCollectionBubbleChartView
       // 
@@ -412,5 +416,4 @@
       this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
       this.Controls.Add(this.hideRunsButton);
-      this.Controls.Add(this.transparencyTrackBar);
       this.Controls.Add(this.sizeTrackBar);
       this.Controls.Add(this.colorYAxisButton);
@@ -419,6 +422,4 @@
       this.Controls.Add(this.colorRunsButton);
       this.Controls.Add(this.radioButtonGroup);
-      this.Controls.Add(this.sizeLabel);
-      this.Controls.Add(this.sizeComboBox);
       this.Controls.Add(this.yJitterLabel);
       this.Controls.Add(this.transparencyLabel);
@@ -432,6 +433,9 @@
       this.Controls.Add(this.colorDialogButton);
       this.Controls.Add(this.chart);
+      this.Controls.Add(this.transparencyTrackBar);
+      this.Controls.Add(this.sizeLabel);
+      this.Controls.Add(this.sizeComboBox);
       this.Name = "RunCollectionBubbleChartView";
-      this.Size = new System.Drawing.Size(854, 496);
+      this.Size = new System.Drawing.Size(986, 741);
       ((System.ComponentModel.ISupportInitialize)(this.xTrackBar)).EndInit();
       ((System.ComponentModel.ISupportInitialize)(this.yTrackBar)).EndInit();
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 9438)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 12118)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.Linq;
@@ -33,5 +34,5 @@
 
 namespace HeuristicLab.Optimization.Views {
-  [View("RunCollection BubbleChart")]
+  [View("Bubble Chart")]
   [Content(typeof(RunCollection), false)]
   public partial class RunCollectionBubbleChartView : AsynchronousContentView {
@@ -56,7 +57,5 @@
     private bool suppressUpdates = false;
 
-    private const double transperencyExponent = 2.5;
-
-    private RunCollectionContentConstraint visibilityConstraint = new RunCollectionContentConstraint() { Active = true };
+    private readonly RunCollectionContentConstraint visibilityConstraint = new RunCollectionContentConstraint() { Active = true };
 
     public RunCollectionBubbleChartView() {
@@ -118,9 +117,9 @@
     protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed += new EventHandler(run_Changed);
+        run.PropertyChanged += run_PropertyChanged;
     }
     protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
-        run.Changed -= new EventHandler(run_Changed);
+        run.PropertyChanged -= run_PropertyChanged;
     }
 
@@ -135,14 +134,16 @@
       RegisterRunEvents(e.Items);
     }
-    private void run_Changed(object sender, EventArgs e) {
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (suppressUpdates) return;
       if (InvokeRequired)
-        this.Invoke(new EventHandler(run_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
       else {
-        IRun run = (IRun)sender;
-        UpdateRun(run);
-        UpdateCursorInterval();
-        chart.ChartAreas[0].RecalculateAxesScale();
-        UpdateAxisLabels();
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible") {
+          IRun run = (IRun)sender;
+          UpdateRun(run);
+          UpdateCursorInterval();
+          chart.ChartAreas[0].RecalculateAxesScale();
+          UpdateAxisLabels();
+        }
       }
     }
@@ -155,8 +156,5 @@
         if (suppressUpdates) return;
 
-        foreach (var run in Content) UpdateRun(run);
-        UpdateMarkerSizes();
-        UpdateCursorInterval();
-        chart.ChartAreas[0].RecalculateAxesScale();
+        UpdateDataPoints();
         UpdateAxisLabels();
       }
@@ -192,9 +190,7 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      this.categoricalMapping.Clear();
       UpdateComboBoxes();
       UpdateDataPoints();
       UpdateCaption();
-      RebuildInverseIndex();
     }
 
@@ -266,9 +262,8 @@
 
     private void Content_Reset(object sender, EventArgs e) {
+      if (suppressUpdates) return;
       if (InvokeRequired)
         Invoke(new EventHandler(Content_Reset), sender, e);
       else {
-        this.categoricalMapping.Clear();
-        RebuildInverseIndex();
         UpdateDataPoints();
         UpdateAxisLabels();
@@ -280,5 +275,7 @@
       series.Points.Clear();
       runToDataPointMapping.Clear();
+      categoricalMapping.Clear();
       selectedRuns.Clear();
+      RebuildInverseIndex();
 
       chart.ChartAreas[0].AxisX.IsMarginVisible = xAxisValue != AxisDimension.Index.ToString();
@@ -440,5 +437,5 @@
       }
     }
-    private double GetCategoricalValue(int dimension, string value) {
+    private double? GetCategoricalValue(int dimension, string value) {
       if (!this.categoricalMapping.ContainsKey(dimension)) {
         this.categoricalMapping[dimension] = new Dictionary<object, double>();
@@ -451,4 +448,5 @@
         }
       }
+      if (!this.categoricalMapping[dimension].ContainsKey(value)) return null;
       return this.categoricalMapping[dimension][value];
     }
@@ -557,7 +555,13 @@
           var point = chart.Series[0].Points[pointIndex];
           IRun run = (IRun)point.Tag;
-          point.Color = Color.Red;
-          point.MarkerStyle = MarkerStyle.Cross;
-          selectedRuns.Add(run);
+          if (selectedRuns.Contains(run)) {
+            point.MarkerStyle = MarkerStyle.Circle;
+            point.Color = Color.FromArgb(255 - LogTransform(transparencyTrackBar.Value), run.Color);
+            selectedRuns.Remove(run);
+          } else {
+            point.Color = Color.Red;
+            point.MarkerStyle = MarkerStyle.Cross;
+            selectedRuns.Add(run);
+          }
         }
       } else {
@@ -663,10 +667,13 @@
       Axis yAxis = this.chart.ChartAreas[0].AxisY;
       int axisDimensionCount = Enum.GetNames(typeof(AxisDimension)).Count();
-      SetCustomAxisLabels(xAxis, xAxisComboBox.SelectedIndex - axisDimensionCount);
-      SetCustomAxisLabels(yAxis, yAxisComboBox.SelectedIndex - axisDimensionCount);
-      if (xAxisComboBox.SelectedItem != null)
-        xAxis.Title = xAxisComboBox.SelectedItem.ToString();
-      if (yAxisComboBox.SelectedItem != null)
-        yAxis.Title = yAxisComboBox.SelectedItem.ToString();
+      //mkommend: combobox.SelectedIndex could not be used as this changes during hovering over possible values
+      var xSAxisSelectedIndex = xAxisValue == null ? 0 : xAxisComboBox.Items.IndexOf(xAxisValue);
+      var ySAxisSelectedIndex = yAxisValue == null ? 0 : xAxisComboBox.Items.IndexOf(yAxisValue);
+      SetCustomAxisLabels(xAxis, xSAxisSelectedIndex - axisDimensionCount);
+      SetCustomAxisLabels(yAxis, ySAxisSelectedIndex - axisDimensionCount);
+      if (xAxisValue != null)
+        xAxis.Title = xAxisValue;
+      if (yAxisValue != null)
+        yAxis.Title = yAxisValue;
     }
 
@@ -710,17 +717,6 @@
     }
 
-    private IRun runToHide = null;
     private void ContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e) {
-      var pos = Control.MousePosition;
-      var chartPos = chart.PointToClient(pos);
-
-      HitTestResult h = this.chart.HitTest(chartPos.X, chartPos.Y, ChartElementType.DataPoint);
-      if (h.ChartElementType == ChartElementType.DataPoint) {
-        runToHide = (IRun)((DataPoint)h.Object).Tag;
-        hideRunsToolStripMenuItem.Visible = true;
-      } else {
-        runToHide = null;
-        hideRunsToolStripMenuItem.Visible = false;
-      }
+      hideRunsToolStripMenuItem.Visible = selectedRuns.Any();
     }
 
@@ -730,10 +726,12 @@
     }
     private void hideRunsToolStripMenuItem_Click(object sender, EventArgs e) {
-      HideRuns(selectedRuns);
+      //ToList is necessary to prevent lazy evaluation
+      HideRuns(selectedRuns.ToList());
       //could not use ClearSelectedRuns as the runs are not visible anymore
       selectedRuns.Clear();
     }
     private void hideRunsButton_Click(object sender, EventArgs e) {
-      HideRuns(selectedRuns);
+      //ToList is necessary to prevent lazy evaluation
+      HideRuns(selectedRuns.ToList());
       //could not use ClearSelectedRuns as the runs are not visible anymore
       selectedRuns.Clear();
@@ -743,5 +741,5 @@
       visibilityConstraint.Active = false;
       if (!Content.Constraints.Contains(visibilityConstraint)) Content.Constraints.Add(visibilityConstraint);
-      foreach (var run in selectedRuns) {
+      foreach (var run in runs) {
         visibilityConstraint.ConstraintData.Add(run);
       }
@@ -764,5 +762,5 @@
       double max = transparencyTrackBar.Maximum;
       double r = (x - min) / (max - min);  // r \in [0..1]
-      double l = Math.Log(r + 1) / Math.Log(2.0); // l \in [0..1]
+      double l = Math.Max(Math.Min((1.0 - Math.Pow(0.05, r)) / 0.95, 1), 0); // l \in [0..1]
       return (int)Math.Round(255.0 * l);
     }
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.Designer.cs	(revision 12118)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.Designer.cs	(revision 12118)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.Optimization.Views {
+  partial class RunCollectionChartAggregationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataTableComboBox = new System.Windows.Forms.ComboBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.label2 = new System.Windows.Forms.Label();
+      this.dataRowComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // dataTableComboBox
+      // 
+      this.dataTableComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTableComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.dataTableComboBox.FormattingEnabled = true;
+      this.dataTableComboBox.Location = new System.Drawing.Point(69, 3);
+      this.dataTableComboBox.Name = "dataTableComboBox";
+      this.dataTableComboBox.Size = new System.Drawing.Size(455, 21);
+      this.dataTableComboBox.TabIndex = 0;
+      this.dataTableComboBox.SelectedIndexChanged += new System.EventHandler(this.dataTableComboBox_SelectedIndexChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(60, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "DataTable:";
+      // 
+      // viewHost
+      // 
+      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(4, 57);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(520, 314);
+      this.viewHost.TabIndex = 2;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 33);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(55, 13);
+      this.label2.TabIndex = 3;
+      this.label2.Text = "DataRow:";
+      // 
+      // dataRowComboBox
+      // 
+      this.dataRowComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataRowComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.dataRowComboBox.FormattingEnabled = true;
+      this.dataRowComboBox.Location = new System.Drawing.Point(69, 30);
+      this.dataRowComboBox.Name = "dataRowComboBox";
+      this.dataRowComboBox.Size = new System.Drawing.Size(455, 21);
+      this.dataRowComboBox.TabIndex = 4;
+      this.dataRowComboBox.SelectedIndexChanged += new System.EventHandler(this.dataRowComboBox_SelectedIndexChanged);
+      // 
+      // RunCollectionChartAggregationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.dataRowComboBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.viewHost);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.dataTableComboBox);
+      this.Name = "RunCollectionChartAggregationView";
+      this.Size = new System.Drawing.Size(527, 374);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ComboBox dataTableComboBox;
+    private System.Windows.Forms.Label label1;
+    private MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.ComboBox dataRowComboBox;
+  }
+}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs	(revision 12118)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs	(revision 12118)
@@ -0,0 +1,237 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Analysis;
+using HeuristicLab.Collections;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("Chart Aggregation")]
+  [Content(typeof(RunCollection), false)]
+  public partial class RunCollectionChartAggregationView : ItemView {
+    private const string AllDataRows = "All DataRows";
+
+    public new RunCollection Content {
+      get { return (RunCollection)base.Content; }
+      set { base.Content = value; }
+    }
+
+    private int rowNumber = 0;
+    private bool suppressUpdates;
+    private readonly Dictionary<IRun, IEnumerable<DataRow>> runMapping;
+    private readonly DataTable combinedDataTable;
+    public DataTable CombinedDataTable {
+      get { return combinedDataTable; }
+    }
+
+    public RunCollectionChartAggregationView() {
+      InitializeComponent();
+      runMapping = new Dictionary<IRun, IEnumerable<DataRow>>();
+      combinedDataTable = new DataTable("Combined DataTable", "A data table containing data rows from multiple runs.");
+      viewHost.Content = combinedDataTable;
+      suppressUpdates = false;
+    }
+
+    #region Content events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
+    }
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
+      base.DeregisterContentEvents();
+    }
+
+    private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded), sender, e);
+        return;
+      }
+      AddRuns(e.Items);
+    }
+    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved), sender, e);
+        return;
+      }
+      RemoveRuns(e.Items);
+    }
+    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
+      if (InvokeRequired) {
+        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset), sender, e);
+        return;
+      }
+      RemoveRuns(e.OldItems);
+      AddRuns(e.Items);
+    }
+    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
+      else UpdateCaption();
+    }
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
+        return;
+      }
+      suppressUpdates = Content.UpdateOfRunsInProgress;
+      if (!suppressUpdates) UpdateRuns(Content);
+    }
+
+    private void RegisterRunEvents(IRun run) {
+      run.PropertyChanged += run_PropertyChanged;
+    }
+    private void DeregisterRunEvents(IRun run) {
+      run.PropertyChanged -= run_PropertyChanged;
+    }
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (suppressUpdates) return;
+      if (InvokeRequired) {
+        Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
+      } else {
+        var run = (IRun)sender;
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible")
+          UpdateRuns(new IRun[] { run });
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      dataTableComboBox.Items.Clear();
+      dataRowComboBox.Items.Clear();
+      combinedDataTable.Rows.Clear();
+      runMapping.Clear();
+
+      UpdateCaption();
+      if (Content != null) {
+        UpdateDataTableComboBox();
+      }
+    }
+
+    private void RebuildCombinedDataTable() {
+      RemoveRuns(Content);
+      rowNumber = 0;
+      AddRuns(Content);
+    }
+
+    private void AddRuns(IEnumerable<IRun> runs) {
+      foreach (var run in runs) {
+        runMapping[run] = ExtractDataRowsFromRun(run).ToList();
+        RegisterRunEvents(run);
+      }
+      var dataRows = runs.Where(r => r.Visible && runMapping.ContainsKey(r)).SelectMany(r => runMapping[r]);
+      combinedDataTable.Rows.AddRange(dataRows);
+    }
+
+    private void RemoveRuns(IEnumerable<IRun> runs) {
+      var dataRows = runs.Where(r => runMapping.ContainsKey(r)).SelectMany(r => runMapping[r]).ToList();
+      foreach (var run in runs) {
+        if (!runMapping.ContainsKey(run)) continue;
+        runMapping.Remove(run);
+        DeregisterRunEvents(run);
+      }
+      combinedDataTable.Rows.RemoveRange(dataRows);
+    }
+
+    private void UpdateRuns(IEnumerable<IRun> runs) {
+      if (suppressUpdates) return;
+      foreach (var run in runs) {
+        //update color
+        foreach (var dataRow in runMapping[run]) {
+          dataRow.VisualProperties.Color = run.Color;
+        }
+        //update visibility - remove and add all rows to keep the same order as before
+        combinedDataTable.Rows.Clear();
+        combinedDataTable.Rows.AddRange(runMapping.Where(mapping => mapping.Key.Visible).SelectMany(mapping => mapping.Value));
+      }
+    }
+
+    private IEnumerable<DataRow> ExtractDataRowsFromRun(IRun run) {
+      var resultName = (string)dataTableComboBox.SelectedItem;
+      var rowName = (string)dataRowComboBox.SelectedItem;
+      if (!run.Results.ContainsKey(resultName)) yield break;
+
+      var dataTable = (DataTable)run.Results[resultName];
+      foreach (var dataRow in dataTable.Rows) {
+        if (dataRow.Name != rowName && rowName != AllDataRows) continue;
+        rowNumber++;
+        var clonedRow = (DataRow)dataRow.Clone();
+        //row names must be unique -> add incremented number to the row name
+        clonedRow.Name = run.Name + "." + dataRow.Name + rowNumber;
+        clonedRow.VisualProperties.DisplayName = run.Name + "." + dataRow.Name;
+        clonedRow.VisualProperties.Color = run.Color;
+        yield return clonedRow;
+      }
+    }
+
+    private void UpdateDataTableComboBox() {
+      dataTableComboBox.Items.Clear();
+      var dataTables = (from run in Content
+                        from result in run.Results
+                        where result.Value is DataTable
+                        select result.Key).Distinct().ToArray();
+
+      dataTableComboBox.Items.AddRange(dataTables);
+      if (dataTableComboBox.Items.Count > 0) dataTableComboBox.SelectedItem = dataTableComboBox.Items[0];
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Chart Aggregation" : ViewAttribute.GetViewName(GetType());
+    }
+
+    private void UpdateDataRowComboBox() {
+      dataRowComboBox.Items.Clear();
+      var resultName = (string)dataTableComboBox.SelectedItem;
+      var dataTables = from run in Content
+                       where run.Results.ContainsKey(resultName)
+                       select run.Results[resultName] as DataTable;
+      var rowNames = (from dataTable in dataTables
+                      from row in dataTable.Rows
+                      select row.Name).Distinct().ToArray();
+
+      dataRowComboBox.Items.AddRange(rowNames);
+      dataRowComboBox.Items.Add(AllDataRows);
+      if (dataRowComboBox.Items.Count > 0) dataRowComboBox.SelectedItem = dataRowComboBox.Items[0];
+    }
+
+    private void dataTableComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
+      UpdateDataRowComboBox();
+    }
+    private void dataRowComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
+      RebuildCombinedDataTable();
+    }
+  }
+}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.Designer.cs	(revision 9438)
+++ 	(revision )
@@ -1,135 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-namespace HeuristicLab.Optimization.Views {
-  partial class RunCollectionDataTableView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.dataTableComboBox = new System.Windows.Forms.ComboBox();
-      this.label1 = new System.Windows.Forms.Label();
-      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.label2 = new System.Windows.Forms.Label();
-      this.dataRowComboBox = new System.Windows.Forms.ComboBox();
-      this.SuspendLayout();
-      // 
-      // dataTableComboBox
-      // 
-      this.dataTableComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.dataTableComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.dataTableComboBox.FormattingEnabled = true;
-      this.dataTableComboBox.Location = new System.Drawing.Point(69, 3);
-      this.dataTableComboBox.Name = "dataTableComboBox";
-      this.dataTableComboBox.Size = new System.Drawing.Size(455, 21);
-      this.dataTableComboBox.TabIndex = 0;
-      this.dataTableComboBox.SelectedIndexChanged += new System.EventHandler(this.dataTableComboBox_SelectedIndexChanged);
-      // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 6);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(60, 13);
-      this.label1.TabIndex = 1;
-      this.label1.Text = "DataTable:";
-      // 
-      // viewHost
-      // 
-      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.viewHost.Caption = "View";
-      this.viewHost.Content = null;
-      this.viewHost.Enabled = false;
-      this.viewHost.Location = new System.Drawing.Point(4, 57);
-      this.viewHost.Name = "viewHost";
-      this.viewHost.ReadOnly = false;
-      this.viewHost.Size = new System.Drawing.Size(520, 314);
-      this.viewHost.TabIndex = 2;
-      this.viewHost.ViewsLabelVisible = true;
-      this.viewHost.ViewType = null;
-      // 
-      // label2
-      // 
-      this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(3, 33);
-      this.label2.Name = "label2";
-      this.label2.Size = new System.Drawing.Size(55, 13);
-      this.label2.TabIndex = 3;
-      this.label2.Text = "DataRow:";
-      // 
-      // dataRowComboBox
-      // 
-      this.dataRowComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.dataRowComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.dataRowComboBox.FormattingEnabled = true;
-      this.dataRowComboBox.Location = new System.Drawing.Point(69, 30);
-      this.dataRowComboBox.Name = "dataRowComboBox";
-      this.dataRowComboBox.Size = new System.Drawing.Size(455, 21);
-      this.dataRowComboBox.TabIndex = 4;
-      this.dataRowComboBox.SelectedIndexChanged += new System.EventHandler(this.dataRowComboBox_SelectedIndexChanged);
-      // 
-      // RunCollectionDataTableView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.dataRowComboBox);
-      this.Controls.Add(this.label2);
-      this.Controls.Add(this.viewHost);
-      this.Controls.Add(this.label1);
-      this.Controls.Add(this.dataTableComboBox);
-      this.Name = "RunCollectionDataTableView";
-      this.Size = new System.Drawing.Size(527, 374);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.ComboBox dataTableComboBox;
-    private System.Windows.Forms.Label label1;
-    private MainForm.WindowsForms.ViewHost viewHost;
-    private System.Windows.Forms.Label label2;
-    private System.Windows.Forms.ComboBox dataRowComboBox;
-  }
-}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs	(revision 9438)
+++ 	(revision )
@@ -1,231 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Windows.Forms;
-using HeuristicLab.Analysis;
-using HeuristicLab.Collections;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Optimization.Views {
-  [View("RunCollection DataTableView")]
-  [Content(typeof(RunCollection), false)]
-  public partial class RunCollectionDataTableView : ItemView {
-    private const string AllDataRows = "All DataRows";
-
-    public new RunCollection Content {
-      get { return (RunCollection)base.Content; }
-      set { base.Content = value; }
-    }
-
-    private int rowNumber = 0;
-    private bool suppressUpdates;
-    private readonly Dictionary<IRun, IEnumerable<DataRow>> runMapping;
-    private readonly DataTable combinedDataTable;
-    public DataTable CombinedDataTable {
-      get { return combinedDataTable; }
-    }
-
-    public RunCollectionDataTableView() {
-      InitializeComponent();
-      runMapping = new Dictionary<IRun, IEnumerable<DataRow>>();
-      combinedDataTable = new DataTable("Combined DataTable", "A data table containing data rows from multiple runs.");
-      viewHost.Content = combinedDataTable;
-      suppressUpdates = false;
-    }
-
-    #region Content events
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
-      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
-      Content.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
-      Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
-      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
-    }
-    protected override void DeregisterContentEvents() {
-      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
-      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
-      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
-      Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
-      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
-      base.DeregisterContentEvents();
-    }
-
-    private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
-      if (InvokeRequired) {
-        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded), sender, e);
-        return;
-      }
-      AddRuns(e.Items);
-    }
-    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
-      if (InvokeRequired) {
-        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved), sender, e);
-        return;
-      }
-      RemoveRuns(e.Items);
-    }
-    private void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
-      if (InvokeRequired) {
-        Invoke(new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset), sender, e);
-        return;
-      }
-      RemoveRuns(e.OldItems);
-      AddRuns(e.Items);
-    }
-    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
-      else UpdateCaption();
-    }
-    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
-      if (InvokeRequired) {
-        Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
-        return;
-      }
-      suppressUpdates = Content.UpdateOfRunsInProgress;
-      if (!suppressUpdates) UpdateRuns(Content);
-    }
-
-    private void RegisterRunEvents(IRun run) {
-      run.Changed += new System.EventHandler(run_Changed);
-    }
-    private void DeregisterRunEvents(IRun run) {
-      run.Changed -= new System.EventHandler(run_Changed);
-    }
-    private void run_Changed(object sender, EventArgs e) {
-      if (suppressUpdates) return;
-      var run = (IRun)sender;
-      UpdateRuns(new IRun[] { run });
-    }
-    #endregion
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      dataTableComboBox.Items.Clear();
-      dataRowComboBox.Items.Clear();
-      combinedDataTable.Rows.Clear();
-      runMapping.Clear();
-
-      UpdateCaption();
-      if (Content != null) {
-        UpdateDataTableComboBox();
-      }
-    }
-
-    private void RebuildCombinedDataTable() {
-      RemoveRuns(Content);
-      rowNumber = 0;
-      AddRuns(Content);
-    }
-
-    private void AddRuns(IEnumerable<IRun> runs) {
-      foreach (var run in runs) {
-        runMapping[run] = ExtractDataRowsFromRun(run).ToList();
-        RegisterRunEvents(run);
-      }
-      var dataRows = runs.Where(r => r.Visible && runMapping.ContainsKey(r)).SelectMany(r => runMapping[r]);
-      combinedDataTable.Rows.AddRange(dataRows);
-    }
-
-    private void RemoveRuns(IEnumerable<IRun> runs) {
-      var dataRows = runs.Where(r => runMapping.ContainsKey(r)).SelectMany(r => runMapping[r]).ToList();
-      foreach (var run in runs) {
-        if (!runMapping.ContainsKey(run)) continue;
-        runMapping.Remove(run);
-        DeregisterRunEvents(run);
-      }
-      combinedDataTable.Rows.RemoveRange(dataRows);
-    }
-
-    private void UpdateRuns(IEnumerable<IRun> runs) {
-      if (suppressUpdates) return;
-      foreach (var run in runs) {
-        //update color
-        foreach (var dataRow in runMapping[run]) {
-          dataRow.VisualProperties.Color = run.Color;
-        }
-        //update visibility - remove and add all rows to keep the same order as before
-        combinedDataTable.Rows.Clear();
-        combinedDataTable.Rows.AddRange(runMapping.Where(mapping => mapping.Key.Visible).SelectMany(mapping => mapping.Value));
-      }
-    }
-
-    private IEnumerable<DataRow> ExtractDataRowsFromRun(IRun run) {
-      var resultName = (string)dataTableComboBox.SelectedItem;
-      var rowName = (string)dataRowComboBox.SelectedItem;
-      if (!run.Results.ContainsKey(resultName)) yield break;
-
-      var dataTable = (DataTable)run.Results[resultName];
-      foreach (var dataRow in dataTable.Rows) {
-        if (dataRow.Name != rowName && rowName != AllDataRows) continue;
-        rowNumber++;
-        var clonedRow = (DataRow)dataRow.Clone();
-        //row names must be unique -> add incremented number to the row name
-        clonedRow.Name = run.Name + "." + dataRow.Name + rowNumber;
-        clonedRow.VisualProperties.DisplayName = run.Name + "." + dataRow.Name;
-        clonedRow.VisualProperties.Color = run.Color;
-        yield return clonedRow;
-      }
-    }
-
-    private void UpdateDataTableComboBox() {
-      dataTableComboBox.Items.Clear();
-      var dataTables = (from run in Content
-                        from result in run.Results
-                        where result.Value is DataTable
-                        select result.Key).Distinct().ToArray();
-
-      dataTableComboBox.Items.AddRange(dataTables);
-      if (dataTableComboBox.Items.Count > 0) dataTableComboBox.SelectedItem = dataTableComboBox.Items[0];
-    }
-
-    private void UpdateCaption() {
-      Caption = Content != null ? Content.OptimizerName + " Data Table" : ViewAttribute.GetViewName(GetType());
-    }
-
-    private void UpdateDataRowComboBox() {
-      dataRowComboBox.Items.Clear();
-      var resultName = (string)dataTableComboBox.SelectedItem;
-      var dataTables = from run in Content
-                       where run.Results.ContainsKey(resultName)
-                       select run.Results[resultName] as DataTable;
-      var rowNames = (from dataTable in dataTables
-                      from row in dataTable.Rows
-                      select row.Name).Distinct().ToArray();
-
-      dataRowComboBox.Items.AddRange(rowNames);
-      dataRowComboBox.Items.Add(AllDataRows);
-      if (dataRowComboBox.Items.Count > 0) dataRowComboBox.SelectedItem = dataRowComboBox.Items[0];
-    }
-
-    private void dataTableComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
-      UpdateDataRowComboBox();
-    }
-    private void dataRowComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
-      RebuildCombinedDataTable();
-    }
-  }
-}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.Designer.cs	(revision 12118)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.Designer.cs	(revision 12118)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization.Views {
+  partial class RunCollectionTableView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // rowsTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.rowsTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.rowsTextBox, 2);
+      // 
+      // RunCollectionTableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Name = "RunCollectionTableView";
+      this.ShowStatisticalInformation = true;
+      this.Controls.SetChildIndex(this.rowsLabel, 0);
+      this.Controls.SetChildIndex(this.columnsLabel, 0);
+      this.Controls.SetChildIndex(this.rowsTextBox, 0);
+      this.Controls.SetChildIndex(this.columnsTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+  }
+}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs	(revision 12118)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs	(revision 12118)
@@ -0,0 +1,262 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("Table")]
+  [Content(typeof(RunCollection), false)]
+  public sealed partial class RunCollectionTableView : StringConvertibleMatrixView {
+    private int[] runToRowMapping;
+    private bool suppressUpdates = false;
+    public RunCollectionTableView() {
+      InitializeComponent();
+      dataGridView.RowHeaderMouseDoubleClick += new DataGridViewCellMouseEventHandler(dataGridView_RowHeaderMouseDoubleClick);
+    }
+
+    public override bool ReadOnly {
+      get { return true; }
+      set { /*not needed because results are always readonly */}
+    }
+
+    public new RunCollection Content {
+      get { return (RunCollection)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        runToRowMapping = Enumerable.Range(0, Content.Count).ToArray();
+        UpdateRowAttributes();
+      }
+      UpdateCaption();
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
+      RegisterRunEvents(Content);
+    }
+    private void RegisterRunEvents(IEnumerable<IRun> runs) {
+      foreach (IRun run in runs)
+        run.PropertyChanged += run_PropertyChanged;
+    }
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
+      Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
+      DeregisterRunEvents(Content);
+    }
+    private void DeregisterRunEvents(IEnumerable<IRun> runs) {
+      foreach (IRun run in runs)
+        run.PropertyChanged -= run_PropertyChanged;
+    }
+    private void Content_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      DeregisterRunEvents(e.OldItems);
+      RegisterRunEvents(e.Items);
+    }
+    private void Content_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      DeregisterRunEvents(e.Items);
+    }
+    private void Content_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
+      RegisterRunEvents(e.Items);
+    }
+    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
+      else UpdateCaption();
+    }
+    private void run_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (suppressUpdates) return;
+      if (InvokeRequired)
+        this.Invoke((Action<object, PropertyChangedEventArgs>)run_PropertyChanged, sender, e);
+      else {
+        IRun run = (IRun)sender;
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible")
+          UpdateRun(run);
+      }
+    }
+    #endregion
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Table" : ViewAttribute.GetViewName(GetType());
+    }
+
+    protected override void UpdateData() {
+      if (suppressUpdates) return;
+      base.UpdateData();
+    }
+
+    protected override void UpdateColumnHeaders() {
+      HashSet<string> visibleColumnNames = new HashSet<string>(dataGridView.Columns.OfType<DataGridViewColumn>()
+       .Where(c => c.Visible && !string.IsNullOrEmpty(c.HeaderText)).Select(c => c.HeaderText));
+
+      for (int i = 0; i < dataGridView.ColumnCount; i++) {
+        if (i < base.Content.ColumnNames.Count())
+          dataGridView.Columns[i].HeaderText = base.Content.ColumnNames.ElementAt(i);
+        else
+          dataGridView.Columns[i].HeaderText = "Column " + (i + 1);
+        dataGridView.Columns[i].Visible = visibleColumnNames.Count == 0 || visibleColumnNames.Contains(dataGridView.Columns[i].HeaderText);
+      }
+    }
+
+    private void UpdateRun(IRun run) {
+      foreach (int runIndex in GetIndexOfRun(run)) {
+        int rowIndex = runToRowMapping[runIndex];
+        this.dataGridView.Rows[rowIndex].Visible = run.Visible;
+        this.dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor = run.Color;
+      }
+      this.UpdateRowHeaders();
+    }
+
+
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
+      else {
+        suppressUpdates = Content.UpdateOfRunsInProgress;
+        if (!suppressUpdates) {
+          UpdateRowAttributes();
+          UpdateData();
+        }
+      }
+    }
+
+    private IEnumerable<int> GetIndexOfRun(IRun run) {
+      int i = 0;
+      foreach (IRun actualRun in Content) {
+        if (actualRun == run)
+          yield return i;
+        i++;
+      }
+    }
+
+    private void dataGridView_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (e.RowIndex >= 0) {
+        IRun run = Content.ElementAt(runToRowMapping.ToList().IndexOf(e.RowIndex));
+        IContentView view = MainFormManager.MainForm.ShowContent(run);
+        if (view != null) {
+          view.ReadOnly = this.ReadOnly;
+          view.Locked = this.Locked;
+        }
+      }
+    }
+
+    protected override void ClearSorting() {
+      base.ClearSorting();
+      runToRowMapping = Enumerable.Range(0, Content.Count).ToArray();
+      UpdateRowAttributes();
+    }
+
+    protected override int[] Sort(IEnumerable<KeyValuePair<int, SortOrder>> sortedColumns) {
+      int[] newSortedIndex = Enumerable.Range(0, Content.Count).ToArray();
+      RunCollectionRowComparer rowComparer = new RunCollectionRowComparer();
+      if (sortedColumns.Count() != 0) {
+        rowComparer.SortedIndices = sortedColumns;
+        rowComparer.Matrix = Content;
+        Array.Sort(newSortedIndex, rowComparer);
+      }
+
+      runToRowMapping = new int[newSortedIndex.Length];
+      int i = 0;
+      foreach (int runIndex in newSortedIndex) {
+        runToRowMapping[runIndex] = i;
+        i++;
+      }
+      UpdateRowAttributes();
+      return newSortedIndex;
+    }
+
+    private void UpdateRowAttributes() {
+      int runIndex = 0;
+      foreach (IRun run in Content) {
+        int rowIndex = this.runToRowMapping[runIndex];
+        this.dataGridView.Rows[rowIndex].Visible = run.Visible;
+        this.dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor = run.Color;
+        runIndex++;
+      }
+      rowsTextBox.Text = dataGridView.Rows.GetRowCount(DataGridViewElementStates.Visible).ToString();
+      UpdateRowHeaders();
+    }
+
+    public class RunCollectionRowComparer : IComparer<int> {
+      public RunCollectionRowComparer() {
+      }
+
+      private List<KeyValuePair<int, SortOrder>> sortedIndices;
+      public IEnumerable<KeyValuePair<int, SortOrder>> SortedIndices {
+        get { return this.sortedIndices; }
+        set { sortedIndices = new List<KeyValuePair<int, SortOrder>>(value); }
+      }
+      private RunCollection matrix;
+      public RunCollection Matrix {
+        get { return this.matrix; }
+        set { this.matrix = value; }
+      }
+
+      public int Compare(int x, int y) {
+        int result = 0;
+        IItem value1, value2;
+        IComparable comparable1, comparable2;
+
+        if (matrix == null)
+          throw new InvalidOperationException("Could not sort IStringConvertibleMatrix if the matrix member is null.");
+        if (sortedIndices == null)
+          return 0;
+
+        foreach (KeyValuePair<int, SortOrder> pair in sortedIndices.Where(p => p.Value != SortOrder.None)) {
+          value1 = matrix.GetValue(x, pair.Key);
+          value2 = matrix.GetValue(y, pair.Key);
+          comparable1 = value1 as IComparable;
+          comparable2 = value2 as IComparable;
+          if (comparable1 != null)
+            result = comparable1.CompareTo(comparable2);
+          else {
+            string string1 = value1 != null ? value1.ToString() : string.Empty;
+            string string2 = value2 != null ? value2.ToString() : string.Empty;
+            result = string1.CompareTo(string2);
+          }
+          if (pair.Value == SortOrder.Descending)
+            result *= -1;
+          if (result != 0)
+            return result;
+        }
+        return result;
+      }
+    }
+  }
+}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.Designer.cs	(revision 9438)
+++ 	(revision )
@@ -1,72 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.Optimization.Views {
-  partial class RunCollectionTabularView {
-    /// <summary>
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary>
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Windows Form Designer generated code
-
-    /// <summary>
-    /// Required method for Designer support - do not modify
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // rowsTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.rowsTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.rowsTextBox, 2);
-      // 
-      // RunCollectionTabularView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.Name = "RunCollectionTabularView";
-      this.ShowStatisticalInformation = true;
-      this.Controls.SetChildIndex(this.rowsLabel, 0);
-      this.Controls.SetChildIndex(this.columnsLabel, 0);
-      this.Controls.SetChildIndex(this.rowsTextBox, 0);
-      this.Controls.SetChildIndex(this.columnsTextBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-  }
-}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs	(revision 9438)
+++ 	(revision )
@@ -1,250 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Windows.Forms;
-using HeuristicLab.Core;
-using HeuristicLab.Data.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Optimization.Views {
-  [View("RunCollection Tabular View")]
-  [Content(typeof(RunCollection), false)]
-  public sealed partial class RunCollectionTabularView : StringConvertibleMatrixView {
-    private int[] runToRowMapping;
-    private bool suppressUpdates = false;
-    public RunCollectionTabularView() {
-      InitializeComponent();
-      dataGridView.RowHeaderMouseDoubleClick += new DataGridViewCellMouseEventHandler(dataGridView_RowHeaderMouseDoubleClick);
-    }
-
-    public override bool ReadOnly {
-      get { return true; }
-      set { /*not needed because results are always readonly */}
-    }
-
-    public new RunCollection Content {
-      get { return (RunCollection)base.Content; }
-      set { base.Content = value; }
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content != null) {
-        runToRowMapping = Enumerable.Range(0, Content.Count).ToArray();
-        UpdateRowAttributes();
-      }
-      UpdateCaption();
-    }
-
-    #region events
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
-      Content.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
-      Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
-      Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
-      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
-      RegisterRunEvents(Content);
-    }
-    private void RegisterRunEvents(IEnumerable<IRun> runs) {
-      foreach (IRun run in runs)
-        run.Changed += new EventHandler(run_Changed);
-    }
-    protected override void DeregisterContentEvents() {
-      base.DeregisterContentEvents();
-      Content.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsAdded);
-      Content.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
-      Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
-      Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
-      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
-      DeregisterRunEvents(Content);
-    }
-    private void DeregisterRunEvents(IEnumerable<IRun> runs) {
-      foreach (IRun run in runs)
-        run.Changed -= new EventHandler(run_Changed);
-    }
-    private void Content_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
-      DeregisterRunEvents(e.OldItems);
-      RegisterRunEvents(e.Items);
-    }
-    private void Content_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
-      DeregisterRunEvents(e.Items);
-    }
-    private void Content_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
-      RegisterRunEvents(e.Items);
-    }
-    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
-      else UpdateCaption();
-    }
-    private void run_Changed(object sender, EventArgs e) {
-      if (InvokeRequired)
-        this.Invoke(new EventHandler(run_Changed), sender, e);
-      else {
-        IRun run = (IRun)sender;
-        UpdateRun(run);
-      }
-    }
-    #endregion
-
-    private void UpdateCaption() {
-      Caption = Content != null ? Content.OptimizerName + " Tabular View" : ViewAttribute.GetViewName(GetType());
-    }
-
-    protected override void UpdateColumnHeaders() {
-      HashSet<string> visibleColumnNames = new HashSet<string>(dataGridView.Columns.OfType<DataGridViewColumn>()
-       .Where(c => c.Visible && !string.IsNullOrEmpty(c.HeaderText)).Select(c => c.HeaderText));
-
-      for (int i = 0; i < dataGridView.ColumnCount; i++) {
-        if (i < base.Content.ColumnNames.Count())
-          dataGridView.Columns[i].HeaderText = base.Content.ColumnNames.ElementAt(i);
-        else
-          dataGridView.Columns[i].HeaderText = "Column " + (i + 1);
-        dataGridView.Columns[i].Visible = visibleColumnNames.Count == 0 || visibleColumnNames.Contains(dataGridView.Columns[i].HeaderText);
-      }
-    }
-
-    private void UpdateRun(IRun run) {
-      foreach (int runIndex in GetIndexOfRun(run)) {
-        int rowIndex = runToRowMapping[runIndex];
-        this.dataGridView.Rows[rowIndex].Visible = run.Visible;
-        this.dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor = run.Color;
-      }
-      this.UpdateRowHeaders();
-    }
-
-
-    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
-      else {
-        suppressUpdates = Content.UpdateOfRunsInProgress;
-        if (!suppressUpdates) UpdateRowAttributes();
-      }
-    }
-
-    private IEnumerable<int> GetIndexOfRun(IRun run) {
-      int i = 0;
-      foreach (IRun actualRun in Content) {
-        if (actualRun == run)
-          yield return i;
-        i++;
-      }
-    }
-
-    private void dataGridView_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {
-      if (e.RowIndex >= 0) {
-        IRun run = Content.ElementAt(runToRowMapping.ToList().IndexOf(e.RowIndex));
-        IContentView view = MainFormManager.MainForm.ShowContent(run);
-        if (view != null) {
-          view.ReadOnly = this.ReadOnly;
-          view.Locked = this.Locked;
-        }
-      }
-    }
-
-    protected override void ClearSorting() {
-      base.ClearSorting();
-      runToRowMapping = Enumerable.Range(0, Content.Count).ToArray();
-      UpdateRowAttributes();
-    }
-
-    protected override int[] Sort(IEnumerable<KeyValuePair<int, SortOrder>> sortedColumns) {
-      int[] newSortedIndex = Enumerable.Range(0, Content.Count).ToArray();
-      RunCollectionRowComparer rowComparer = new RunCollectionRowComparer();
-      if (sortedColumns.Count() != 0) {
-        rowComparer.SortedIndices = sortedColumns;
-        rowComparer.Matrix = Content;
-        Array.Sort(newSortedIndex, rowComparer);
-      }
-
-      runToRowMapping = new int[newSortedIndex.Length];
-      int i = 0;
-      foreach (int runIndex in newSortedIndex) {
-        runToRowMapping[runIndex] = i;
-        i++;
-      }
-      UpdateRowAttributes();
-      return newSortedIndex;
-    }
-
-    private void UpdateRowAttributes() {
-      int runIndex = 0;
-      foreach (IRun run in Content) {
-        int rowIndex = this.runToRowMapping[runIndex];
-        this.dataGridView.Rows[rowIndex].Visible = run.Visible;
-        this.dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor = run.Color;
-        runIndex++;
-      }
-      UpdateRowHeaders();
-    }
-
-    public class RunCollectionRowComparer : IComparer<int> {
-      public RunCollectionRowComparer() {
-      }
-
-      private List<KeyValuePair<int, SortOrder>> sortedIndices;
-      public IEnumerable<KeyValuePair<int, SortOrder>> SortedIndices {
-        get { return this.sortedIndices; }
-        set { sortedIndices = new List<KeyValuePair<int, SortOrder>>(value); }
-      }
-      private RunCollection matrix;
-      public RunCollection Matrix {
-        get { return this.matrix; }
-        set { this.matrix = value; }
-      }
-
-      public int Compare(int x, int y) {
-        int result = 0;
-        IItem value1, value2;
-        IComparable comparable1, comparable2;
-
-        if (matrix == null)
-          throw new InvalidOperationException("Could not sort IStringConvertibleMatrix if the matrix member is null.");
-        if (sortedIndices == null)
-          return 0;
-
-        foreach (KeyValuePair<int, SortOrder> pair in sortedIndices.Where(p => p.Value != SortOrder.None)) {
-          value1 = matrix.GetValue(x, pair.Key);
-          value2 = matrix.GetValue(y, pair.Key);
-          comparable1 = value1 as IComparable;
-          comparable2 = value2 as IComparable;
-          if (comparable1 != null)
-            result = comparable1.CompareTo(comparable2);
-          else {
-            string string1 = value1 != null ? value1.ToString() : string.Empty;
-            string string2 = value2 != null ? value2.ToString() : string.Empty;
-            result = string1.CompareTo(string2);
-          }
-          if (pair.Value == SortOrder.Descending)
-            result *= -1;
-          if (result != 0)
-            return result;
-        }
-        return result;
-      }
-    }
-  }
-}
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.Designer.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.Designer.cs	(revision 9438)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.Designer.cs	(revision 12118)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs
===================================================================
--- branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs	(revision 9438)
+++ branches/TimeLimitRunOptimizer/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionView.cs	(revision 12118)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -23,4 +23,5 @@
 using System.Collections;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.Linq;
@@ -79,10 +80,10 @@
       item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
       item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
-      item.Changed -= new EventHandler(Item_Changed);
+      item.PropertyChanged -= Item_PropertyChanged;
     }
     private void RegisterItemEvents(IRun item) {
       item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
       item.ToStringChanged += new EventHandler(Item_ToStringChanged);
-      item.Changed += new EventHandler(Item_Changed);
+      item.PropertyChanged += Item_PropertyChanged;
     }
 
@@ -255,6 +256,10 @@
       if (e.KeyCode == Keys.Delete) {
         if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
-          foreach (ListViewItem item in itemsListView.SelectedItems)
-            Content.Remove((IRun)item.Tag);
+          if (RunCollection != null) {
+            RunCollection.RemoveRange(itemsListView.SelectedItems.Cast<ListViewItem>().Select(i => (IRun)i.Tag));
+          } else {
+            foreach (ListViewItem item in itemsListView.SelectedItems)
+              Content.Remove((IRun)item.Tag);
+          }
         }
       }
@@ -350,6 +355,10 @@
     private void removeButton_Click(object sender, EventArgs e) {
       if (itemsListView.SelectedItems.Count > 0) {
-        foreach (ListViewItem item in itemsListView.SelectedItems)
-          Content.Remove((IRun)item.Tag);
+        if (RunCollection != null) {
+          RunCollection.RemoveRange(itemsListView.SelectedItems.Cast<ListViewItem>().Select(i => (IRun)i.Tag));
+        } else {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content.Remove((IRun)item.Tag);
+        }
         itemsListView.SelectedItems.Clear();
       }
@@ -453,10 +462,11 @@
       }
     }
-    private void Item_Changed(object sender, EventArgs e) {
+    private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (InvokeRequired)
-        this.Invoke(new EventHandler(Item_Changed), sender, e);
+        this.Invoke((Action<object, PropertyChangedEventArgs>)Item_PropertyChanged, sender, e);
       else {
         IRun run = (IRun)sender;
-        UpdateRun(run);
+        if (e.PropertyName == "Color" || e.PropertyName == "Visible")
+          UpdateRun(run);
       }
     }
