Index: branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs
===================================================================
--- branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 8228)
+++ branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 9363)
@@ -75,4 +75,5 @@
       Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
       RegisterRunEvents(Content);
     }
@@ -85,4 +86,5 @@
       Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
       DeregisterRunEvents(Content);
     }
@@ -122,4 +124,5 @@
         this.categoricalMapping.Clear();
         UpdateDataPoints();
+        UpdateAxisLabels();
       }
     }
@@ -135,7 +138,12 @@
         this.Invoke(new EventHandler(run_Changed), sender, e);
       else if (!suppressUpdates) {
-        IRun run = (IRun)sender;
         UpdateDataPoints();
       }
+    }
+
+    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
+      else UpdateCaption();
     }
     #endregion
@@ -147,4 +155,9 @@
       UpdateComboBoxes();
       UpdateDataPoints();
+      UpdateCaption();
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Box Plots" : ViewAttribute.GetViewName(GetType());
     }
 
@@ -313,11 +326,14 @@
     }
     private double GetCategoricalValue(int dimension, string value) {
-      if (!this.categoricalMapping.ContainsKey(dimension))
+      if (!this.categoricalMapping.ContainsKey(dimension)) {
         this.categoricalMapping[dimension] = new Dictionary<object, double>();
-      if (!this.categoricalMapping[dimension].ContainsKey(value)) {
-        if (this.categoricalMapping[dimension].Values.Count == 0)
-          this.categoricalMapping[dimension][value] = 1.0;
-        else
-          this.categoricalMapping[dimension][value] = this.categoricalMapping[dimension].Values.Max() + 1.0;
+        var orderedCategories = Content.Where(r=> r.Visible).Select(r => Content.GetValue(r, dimension).ToString())
+                                .Distinct()
+                                .OrderBy(x => x, new NaturalStringComparer());
+        int count = 1;
+        foreach (var category in orderedCategories) {
+          this.categoricalMapping[dimension].Add(category, count);
+          count++;
+        }
       }
       return this.categoricalMapping[dimension][value];
Index: branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.Designer.cs
===================================================================
--- branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.Designer.cs	(revision 8228)
+++ branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.Designer.cs	(revision 9363)
@@ -46,6 +46,6 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
-      System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      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();
@@ -65,5 +65,5 @@
       this.selectButton = new System.Windows.Forms.RadioButton();
       this.radioButtonGroup = new System.Windows.Forms.GroupBox();
-      this.colorButton = new System.Windows.Forms.Button();
+      this.colorDialogButton = new System.Windows.Forms.Button();
       this.colorDialog = new System.Windows.Forms.ColorDialog();
       this.tooltip = new System.Windows.Forms.ToolTip(this.components);
@@ -72,4 +72,9 @@
       this.noRunsLabel = new System.Windows.Forms.Label();
       this.sizeTrackBar = new System.Windows.Forms.TrackBar();
+      this.getDataAsMatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.transparencyTrackBar = new System.Windows.Forms.TrackBar();
+      this.transparencyLabel = new System.Windows.Forms.Label();
+      this.colorRunsButton = new System.Windows.Forms.Button();
+      this.hideRunsButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.xTrackBar)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.yTrackBar)).BeginInit();
@@ -77,4 +82,5 @@
       this.radioButtonGroup.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.sizeTrackBar)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.transparencyTrackBar)).BeginInit();
       this.SuspendLayout();
       // 
@@ -188,17 +194,17 @@
       // 
       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)));
-      chartArea2.Name = "ChartArea1";
-      this.chart.ChartAreas.Add(chartArea2);
+            | 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.Name = "chart";
-      series2.ChartArea = "ChartArea1";
-      series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
-      series2.IsVisibleInLegend = false;
-      series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
-      series2.Name = "Bubbles";
-      series2.YValuesPerPoint = 2;
-      this.chart.Series.Add(series2);
+      series1.ChartArea = "ChartArea1";
+      series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
+      series1.IsVisibleInLegend = false;
+      series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
+      series1.Name = "Bubbles";
+      series1.YValuesPerPoint = 2;
+      this.chart.Series.Add(series1);
       this.chart.Size = new System.Drawing.Size(843, 425);
       this.chart.TabIndex = 16;
@@ -215,11 +221,11 @@
       this.openBoxPlotViewToolStripMenuItem.Text = "Open BoxPlot View";
       this.openBoxPlotViewToolStripMenuItem.Click += new System.EventHandler(this.openBoxPlotViewToolStripMenuItem_Click);
-      //
+      // 
       // hideRunToolStripMenuItem
-      //
+      // 
       this.hideRunToolStripMenuItem.Name = "hideRunToolStripMenuItem";
       this.hideRunToolStripMenuItem.Size = new System.Drawing.Size(256, 22);
       this.hideRunToolStripMenuItem.Text = "Hide Run";
-      this.hideRunToolStripMenuItem.Click += new System.EventHandler(hideRunToolStripMenuItem_Click);
+      this.hideRunToolStripMenuItem.Click += new System.EventHandler(this.hideRunToolStripMenuItem_Click);
       // 
       // zoomButton
@@ -253,23 +259,23 @@
       this.radioButtonGroup.Controls.Add(this.zoomButton);
       this.radioButtonGroup.Controls.Add(this.selectButton);
-      this.radioButtonGroup.Location = new System.Drawing.Point(3, 461);
+      this.radioButtonGroup.Location = new System.Drawing.Point(2, 461);
       this.radioButtonGroup.Name = "radioButtonGroup";
-      this.radioButtonGroup.Size = new System.Drawing.Size(135, 32);
+      this.radioButtonGroup.Size = new System.Drawing.Size(122, 32);
       this.radioButtonGroup.TabIndex = 19;
       this.radioButtonGroup.TabStop = false;
       // 
-      // colorButton
-      // 
-      this.colorButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.colorButton.Enabled = false;
-      this.colorButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.colorButton.Location = new System.Drawing.Point(144, 469);
-      this.colorButton.Name = "colorButton";
-      this.colorButton.Size = new System.Drawing.Size(64, 21);
-      this.colorButton.TabIndex = 20;
-      this.colorButton.Text = "Color";
-      this.colorButton.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
-      this.colorButton.UseVisualStyleBackColor = true;
-      this.colorButton.Click += new System.EventHandler(this.colorButton_Click);
+      // colorDialogButton
+      // 
+      this.colorDialogButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.colorDialogButton.Enabled = false;
+      this.colorDialogButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.colorDialogButton.Location = new System.Drawing.Point(130, 469);
+      this.colorDialogButton.Name = "colorDialogButton";
+      this.colorDialogButton.Size = new System.Drawing.Size(21, 21);
+      this.colorDialogButton.TabIndex = 20;
+      this.colorDialogButton.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.tooltip.SetToolTip(this.colorDialogButton, "Choose color");
+      this.colorDialogButton.UseVisualStyleBackColor = true;
+      this.colorDialogButton.Click += new System.EventHandler(this.colorDialogButton_Click);
       // 
       // colorDialog
@@ -317,24 +323,86 @@
       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.Maximum = 50;
-      this.sizeTrackBar.Minimum = 5;
+      this.sizeTrackBar.Maximum = 20;
+      this.sizeTrackBar.Minimum = -20;
       this.sizeTrackBar.Name = "sizeTrackBar";
       this.sizeTrackBar.Size = new System.Drawing.Size(64, 45);
       this.sizeTrackBar.TabIndex = 24;
-      this.sizeTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
-      this.sizeTrackBar.Value = 10;
+      this.sizeTrackBar.TickFrequency = 20;
+      this.sizeTrackBar.TickStyle = System.Windows.Forms.TickStyle.TopLeft;
       this.sizeTrackBar.ValueChanged += new System.EventHandler(this.sizeTrackBar_ValueChanged);
       // 
+      // getDataAsMatrixToolStripMenuItem
+      // 
+      this.getDataAsMatrixToolStripMenuItem.Name = "getDataAsMatrixToolStripMenuItem";
+      this.getDataAsMatrixToolStripMenuItem.Size = new System.Drawing.Size(256, 22);
+      this.getDataAsMatrixToolStripMenuItem.Text = "Get Data as Matrix";
+      this.getDataAsMatrixToolStripMenuItem.Click += new System.EventHandler(this.getDataAsMatrixToolStripMenuItem_Click);
+      // 
+      // transparencyTrackBar
+      // 
+      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.Maximum = 254;
+      this.transparencyTrackBar.Name = "transparencyTrackBar";
+      this.transparencyTrackBar.Size = new System.Drawing.Size(64, 45);
+      this.transparencyTrackBar.TabIndex = 24;
+      this.transparencyTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+      this.tooltip.SetToolTip(this.transparencyTrackBar, "Sets the transparency of the colors");
+      this.transparencyTrackBar.ValueChanged += new System.EventHandler(this.transparencyTrackBar_ValueChanged);
+      // 
+      // transparencyLabel
+      // 
+      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.Name = "transparencyLabel";
+      this.transparencyLabel.Size = new System.Drawing.Size(75, 13);
+      this.transparencyLabel.TabIndex = 12;
+      this.transparencyLabel.Text = "Transparency:";
+      // 
+      // colorRunsButton
+      // 
+      this.colorRunsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.colorRunsButton.Enabled = false;
+      this.colorRunsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.colorRunsButton.Location = new System.Drawing.Point(151, 469);
+      this.colorRunsButton.Name = "colorRunsButton";
+      this.colorRunsButton.Size = new System.Drawing.Size(43, 21);
+      this.colorRunsButton.TabIndex = 25;
+      this.colorRunsButton.Text = "Color";
+      this.colorRunsButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      this.tooltip.SetToolTip(this.colorRunsButton, "Color all selected runs");
+      this.colorRunsButton.UseVisualStyleBackColor = true;
+      this.colorRunsButton.Click += new System.EventHandler(this.colorRunsButton_Click);
+      // 
+      // hideRunsButton
+      // 
+      this.hideRunsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.hideRunsButton.Enabled = false;
+      this.hideRunsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.hideRunsButton.Location = new System.Drawing.Point(194, 469);
+      this.hideRunsButton.Name = "hideRunsButton";
+      this.hideRunsButton.Size = new System.Drawing.Size(43, 21);
+      this.hideRunsButton.TabIndex = 26;
+      this.hideRunsButton.Text = "Hide";
+      this.hideRunsButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      this.tooltip.SetToolTip(this.hideRunsButton, "Hides all selected runs");
+      this.hideRunsButton.UseVisualStyleBackColor = true;
+      this.hideRunsButton.Click += new System.EventHandler(this.hideRunsButton_Click);
+      // 
       // RunCollectionBubbleChartView
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.BackColor = System.Drawing.SystemColors.Window;
       this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.Controls.Add(this.hideRunsButton);
+      this.Controls.Add(this.colorRunsButton);
+      this.Controls.Add(this.transparencyTrackBar);
       this.Controls.Add(this.sizeTrackBar);
       this.Controls.Add(this.colorYAxisButton);
       this.Controls.Add(this.colorXAxisButton);
       this.Controls.Add(this.noRunsLabel);
-      this.Controls.Add(this.colorButton);
+      this.Controls.Add(this.colorDialogButton);
       this.Controls.Add(this.radioButtonGroup);
       this.Controls.Add(this.chart);
@@ -342,4 +410,5 @@
       this.Controls.Add(this.sizeComboBox);
       this.Controls.Add(this.yJitterLabel);
+      this.Controls.Add(this.transparencyLabel);
       this.Controls.Add(this.xJitterlabel);
       this.Controls.Add(this.xTrackBar);
@@ -357,4 +426,5 @@
       this.radioButtonGroup.PerformLayout();
       ((System.ComponentModel.ISupportInitialize)(this.sizeTrackBar)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.transparencyTrackBar)).EndInit();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -377,5 +447,5 @@
     private System.Windows.Forms.RadioButton selectButton;
     private System.Windows.Forms.GroupBox radioButtonGroup;
-    private System.Windows.Forms.Button colorButton;
+    private System.Windows.Forms.Button colorDialogButton;
     private System.Windows.Forms.ColorDialog colorDialog;
     private System.Windows.Forms.ToolTip tooltip;
@@ -386,4 +456,9 @@
     private System.Windows.Forms.Button colorYAxisButton;
     private System.Windows.Forms.TrackBar sizeTrackBar;
+    private System.Windows.Forms.ToolStripMenuItem getDataAsMatrixToolStripMenuItem;
+    private System.Windows.Forms.TrackBar transparencyTrackBar;
+    private System.Windows.Forms.Label transparencyLabel;
+    private System.Windows.Forms.Button colorRunsButton;
+    private System.Windows.Forms.Button hideRunsButton;
   }
 }
Index: branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs
===================================================================
--- branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 8228)
+++ branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 9363)
@@ -43,14 +43,18 @@
     private string sizeAxisValue;
 
-    private Dictionary<IRun, List<DataPoint>> runToDataPointMapping;
-    private Dictionary<int, Dictionary<object, double>> categoricalMapping;
-    private Dictionary<IRun, double> xJitter;
-    private Dictionary<IRun, double> yJitter;
+    private readonly Dictionary<IRun, List<DataPoint>> runToDataPointMapping = new Dictionary<IRun, List<DataPoint>>();
+    private readonly Dictionary<IRun, int> runToIndexMapping = new Dictionary<IRun, int>();
+    private readonly Dictionary<int, Dictionary<object, double>> categoricalMapping = new Dictionary<int, Dictionary<object, double>>();
+    private readonly Dictionary<IRun, double> xJitter = new Dictionary<IRun, double>();
+    private readonly Dictionary<IRun, double> yJitter = new Dictionary<IRun, double>();
+
+    private readonly HashSet<IRun> selectedRuns = new HashSet<IRun>();
+    private readonly Random random = new Random();
     private double xJitterFactor = 0.0;
     private double yJitterFactor = 0.0;
-    private Random random;
     private bool isSelecting = false;
     private bool suppressUpdates = false;
 
+
     public RunCollectionBubbleChartView() {
       InitializeComponent();
@@ -58,14 +62,9 @@
       chart.ContextMenuStrip.Items.Insert(0, hideRunToolStripMenuItem);
       chart.ContextMenuStrip.Items.Insert(1, openBoxPlotViewToolStripMenuItem);
+      chart.ContextMenuStrip.Items.Add(getDataAsMatrixToolStripMenuItem);
       chart.ContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(ContextMenuStrip_Opening);
 
-      runToDataPointMapping = new Dictionary<IRun, List<DataPoint>>();
-      categoricalMapping = new Dictionary<int, Dictionary<object, double>>();
-      xJitter = new Dictionary<IRun, double>();
-      yJitter = new Dictionary<IRun, double>();
-      random = new Random();
-
       colorDialog.Color = Color.Black;
-      colorButton.Image = this.GenerateImage(16, 16, this.colorDialog.Color);
+      colorDialogButton.Image = this.GenerateImage(16, 16, this.colorDialog.Color);
       isSelecting = false;
 
@@ -83,4 +82,7 @@
     public IStringConvertibleMatrix Matrix {
       get { return this.Content; }
+    }
+    public IEnumerable<IRun> SelectedRuns {
+      get { return selectedRuns; }
     }
 
@@ -92,4 +94,5 @@
       Content.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
       Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
       Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
       RegisterRunEvents(Content);
@@ -102,4 +105,5 @@
       Content.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_ItemsRemoved);
       Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
       Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
       DeregisterRunEvents(Content);
@@ -125,4 +129,5 @@
     }
     private void run_Changed(object sender, EventArgs e) {
+      if (suppressUpdates) return;
       if (InvokeRequired)
         this.Invoke(new EventHandler(run_Changed), sender, e);
@@ -130,30 +135,50 @@
         IRun run = (IRun)sender;
         UpdateRun(run);
+        UpdateCursorInterval();
+        chart.ChartAreas[0].RecalculateAxesScale();
+        UpdateAxisLabels();
+      }
+    }
+
+    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        this.Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
+      else {
+        suppressUpdates = Content.UpdateOfRunsInProgress;
+        if (suppressUpdates) return;
+
+        foreach (var run in Content) UpdateRun(run);
+        UpdateMarkerSizes();
+        UpdateCursorInterval();
+        chart.ChartAreas[0].RecalculateAxesScale();
+        UpdateAxisLabels();
       }
     }
 
     private void UpdateRun(IRun run) {
-      if (!suppressUpdates) {
-        if (runToDataPointMapping.ContainsKey(run)) {
-          foreach (DataPoint point in runToDataPointMapping[run]) {
-            point.Color = run.Color;
-            if (!run.Visible) {
-              this.chart.Series[0].Points.Remove(point);
-              UpdateCursorInterval();
-              chart.ChartAreas[0].RecalculateAxesScale();
-            }
+      if (runToDataPointMapping.ContainsKey(run)) {
+        foreach (DataPoint point in runToDataPointMapping[run]) {
+          if (!run.Visible) {
+            this.chart.Series[0].Points.Remove(point);
+            continue;
           }
-          if (!run.Visible) runToDataPointMapping.Remove(run);
-        } else {
-          AddDataPoint(run);
-          UpdateCursorInterval();
-          chart.ChartAreas[0].RecalculateAxesScale();
-        }
-
-        if (this.chart.Series[0].Points.Count == 0)
-          noRunsLabel.Visible = true;
-        else
-          noRunsLabel.Visible = false;
-      }
+          if (selectedRuns.Contains(run)) {
+            point.Color = Color.Red;
+            point.MarkerStyle = MarkerStyle.Cross;
+          } else {
+            point.Color = Color.FromArgb(255 - transparencyTrackBar.Value, ((IRun)point.Tag).Color);
+            point.MarkerStyle = MarkerStyle.Circle;
+          }
+
+        }
+        if (!run.Visible) runToDataPointMapping.Remove(run);
+      } else {
+        AddDataPoint(run);
+      }
+
+      if (this.chart.Series[0].Points.Count == 0)
+        noRunsLabel.Visible = true;
+      else
+        noRunsLabel.Visible = false;
     }
 
@@ -163,5 +188,19 @@
       UpdateComboBoxes();
       UpdateDataPoints();
-    }
+      UpdateCaption();
+      RebuildInverseIndex();
+    }
+
+    private void RebuildInverseIndex() {
+      if (Content != null) {
+        runToIndexMapping.Clear();
+        int i = 0;
+        foreach (var run in Content) {
+          runToIndexMapping.Add(run, i);
+          i++;
+        }
+      }
+    }
+
     private void Content_ColumnNamesChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -169,4 +208,8 @@
       else
         UpdateComboBoxes();
+    }
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Bubble Chart" : ViewAttribute.GetViewName(GetType());
     }
 
@@ -202,17 +245,15 @@
           changed = true;
         }
-        if (changed)
+        if (changed) {
           UpdateDataPoints();
-      }
-    }
-
-
-    private void Content_UpdateOfRunsInProgressChanged(object sender, EventArgs e) {
+          UpdateAxisLabels();
+        }
+      }
+    }
+
+    private void Content_AlgorithmNameChanged(object sender, EventArgs e) {
       if (InvokeRequired)
-        Invoke(new EventHandler(Content_UpdateOfRunsInProgressChanged), sender, e);
-      else {
-        suppressUpdates = Content.UpdateOfRunsInProgress;
-        if (!suppressUpdates) UpdateDataPoints();
-      }
+        Invoke(new EventHandler(Content_AlgorithmNameChanged), sender, e);
+      else UpdateCaption();
     }
 
@@ -222,5 +263,7 @@
       else {
         this.categoricalMapping.Clear();
+        RebuildInverseIndex();
         UpdateDataPoints();
+        UpdateAxisLabels();
       }
     }
@@ -230,4 +273,5 @@
       series.Points.Clear();
       runToDataPointMapping.Clear();
+      selectedRuns.Clear();
 
       chart.ChartAreas[0].AxisX.IsMarginVisible = xAxisValue != AxisDimension.Index.ToString();
@@ -246,26 +290,38 @@
         }
       }
+      xTrackBar.Value = 0;
+      yTrackBar.Value = 0;
+
+      //needed to set axis back to automatic and refresh them, otherwise their values may remain NaN
       var xAxis = chart.ChartAreas[0].AxisX;
       var yAxis = chart.ChartAreas[0].AxisY;
-      xTrackBar.Value = 0;
-      yTrackBar.Value = 0;
       SetAutomaticUpdateOfAxis(xAxis, true);
       SetAutomaticUpdateOfAxis(yAxis, true);
+      chart.Refresh();
     }
 
     private void UpdateMarkerSizes() {
-      double[] sizeValues = this.chart.Series[0].Points.Select(p => p.YValues[1]).ToArray();
+      var series = chart.Series[0];
+      if (series.Points.Count <= 0) return;
+
+      var sizeValues = series.Points.Select(p => p.YValues[1]);
       double minSizeValue = sizeValues.Min();
       double maxSizeValue = sizeValues.Max();
-
-      for (int i = 0; i < sizeValues.Length; i++) {
-        DataPoint point = this.chart.Series[0].Points[i];
-        double sizeRange = maxSizeValue - minSizeValue;
+      double sizeRange = maxSizeValue - minSizeValue;
+
+      const int smallestBubbleSize = 5;
+
+      foreach (DataPoint point in series.Points) {
+        //calculates the relative size of the data point  0 <= relativeSize <= 1
         double relativeSize = (point.YValues[1] - minSizeValue);
-
-        if (sizeRange > double.Epsilon) relativeSize /= sizeRange;
-        else relativeSize = 1;
-
-        point.MarkerSize = (int)Math.Round((sizeTrackBar.Value - sizeTrackBar.Minimum) * relativeSize + sizeTrackBar.Minimum);
+        if (sizeRange > double.Epsilon) {
+          relativeSize /= sizeRange;
+
+          //invert bubble sizes if the value of the trackbar is negative
+          if (sizeTrackBar.Value < 0) relativeSize = Math.Abs(relativeSize - 1);
+        } else relativeSize = 1;
+
+        double sizeChange = Math.Abs(sizeTrackBar.Value) * relativeSize;
+        point.MarkerSize = (int)Math.Round(sizeChange + smallestBubbleSize);
       }
     }
@@ -274,6 +330,10 @@
       var xAxis = this.chart.ChartAreas[0].AxisX;
       var yAxis = this.chart.ChartAreas[0].AxisY;
+
       SetAutomaticUpdateOfAxis(xAxis, false);
       SetAutomaticUpdateOfAxis(yAxis, false);
+
+      double xAxisRange = xAxis.Maximum - xAxis.Minimum;
+      double yAxisRange = yAxis.Maximum - yAxis.Minimum;
 
       foreach (DataPoint point in chart.Series[0].Points) {
@@ -283,13 +343,16 @@
 
         if (!xJitterFactor.IsAlmost(0.0))
-          xValue += 0.1 * GetXJitter(run) * xJitterFactor * (xAxis.Maximum - xAxis.Minimum);
+          xValue += 0.1 * GetXJitter(run) * xJitterFactor * (xAxisRange);
         if (!yJitterFactor.IsAlmost(0.0))
-          yValue += 0.1 * GetYJitter(run) * yJitterFactor * (yAxis.Maximum - yAxis.Minimum);
+          yValue += 0.1 * GetYJitter(run) * yJitterFactor * (yAxisRange);
 
         point.XValue = xValue;
         point.YValues[0] = yValue;
       }
-    }
-
+
+    }
+
+    // sets an axis to automatic or restrains it to its current values
+    // this is used that none of the set values is changed when jitter is applied, so that the chart stays the same
     private void SetAutomaticUpdateOfAxis(Axis axis, bool enabled) {
       if (enabled) {
@@ -306,5 +369,4 @@
         axis.LabelStyle.Interval = axis.LabelStyle.Interval;
       }
-
     }
 
@@ -321,5 +383,4 @@
       if (xValue.HasValue && yValue.HasValue && sizeValue.HasValue) {
         xValue = xValue.Value;
-
         yValue = yValue.Value;
 
@@ -327,8 +388,8 @@
           DataPoint point = new DataPoint(xValue.Value, new double[] { yValue.Value, sizeValue.Value });
           point.Tag = run;
-          point.Color = run.Color;
           series.Points.Add(point);
           if (!runToDataPointMapping.ContainsKey(run)) runToDataPointMapping.Add(run, new List<DataPoint>());
           runToDataPointMapping[run].Add(point);
+          UpdateRun(run);
         }
       }
@@ -368,19 +429,23 @@
     }
     private double GetCategoricalValue(int dimension, string value) {
-      if (!this.categoricalMapping.ContainsKey(dimension))
+      if (!this.categoricalMapping.ContainsKey(dimension)) {
         this.categoricalMapping[dimension] = new Dictionary<object, double>();
-      if (!this.categoricalMapping[dimension].ContainsKey(value)) {
-        if (this.categoricalMapping[dimension].Values.Count == 0)
-          this.categoricalMapping[dimension][value] = 1.0;
-        else
-          this.categoricalMapping[dimension][value] = this.categoricalMapping[dimension].Values.Max() + 1.0;
+        var orderedCategories = Content.Where(r => r.Visible).Select(r => Content.GetValue(r, dimension).ToString())
+                                    .Distinct()
+                                    .OrderBy(x => x, new NaturalStringComparer());
+        int count = 1;
+        foreach (var category in orderedCategories) {
+          this.categoricalMapping[dimension].Add(category, count);
+          count++;
+        }
       }
       return this.categoricalMapping[dimension][value];
     }
+
     private double GetValue(IRun run, AxisDimension axisDimension) {
       double value = double.NaN;
       switch (axisDimension) {
         case AxisDimension.Index: {
-            value = Content.ToList().IndexOf(run);
+            value = runToIndexMapping[run];
             break;
           }
@@ -405,18 +470,22 @@
     }
     private void UpdateCursorInterval() {
-      Series series = chart.Series[0];
-      double[] xValues = (from point in series.Points
-                          where !point.IsEmpty
-                          select point.XValue)
-                    .DefaultIfEmpty(1.0)
-                    .ToArray();
-      double[] yValues = (from point in series.Points
-                          where !point.IsEmpty
-                          select point.YValues[0])
-                    .DefaultIfEmpty(1.0)
-                    .ToArray();
-
-      double xRange = xValues.Max() - xValues.Min();
-      double yRange = yValues.Max() - yValues.Min();
+      double xMin = double.MaxValue;
+      double xMax = double.MinValue;
+      double yMin = double.MaxValue;
+      double yMax = double.MinValue;
+
+      foreach (var point in chart.Series[0].Points) {
+        if (point.IsEmpty) continue;
+        if (point.XValue < xMin) xMin = point.XValue;
+        if (point.XValue > xMax) xMax = point.XValue;
+        if (point.YValues[0] < yMin) yMin = point.YValues[0];
+        if (point.YValues[0] > yMax) yMax = point.YValues[0];
+      }
+
+      double xRange = 0.0;
+      double yRange = 0.0;
+      if (xMin != double.MaxValue && xMax != double.MinValue) xRange = xMax - xMin;
+      if (yMin != double.MaxValue && yMax != double.MinValue) yRange = yMax - yMin;
+
       if (xRange.IsAlmost(0.0)) xRange = 1.0;
       if (yRange.IsAlmost(0.0)) yRange = 1.0;
@@ -456,40 +525,44 @@
 
     private void chart_MouseUp(object sender, MouseEventArgs e) {
-      if (isSelecting) {
-        System.Windows.Forms.DataVisualization.Charting.Cursor xCursor = chart.ChartAreas[0].CursorX;
-        System.Windows.Forms.DataVisualization.Charting.Cursor yCursor = chart.ChartAreas[0].CursorY;
-
-        double minX = Math.Min(xCursor.SelectionStart, xCursor.SelectionEnd);
-        double maxX = Math.Max(xCursor.SelectionStart, xCursor.SelectionEnd);
-        double minY = Math.Min(yCursor.SelectionStart, yCursor.SelectionEnd);
-        double maxY = Math.Max(yCursor.SelectionStart, yCursor.SelectionEnd);
-
-        //check for click to select model
-        if (minX == maxX && minY == maxY) {
-          HitTestResult hitTest = chart.HitTest(e.X, e.Y);
-          if (hitTest.ChartElementType == ChartElementType.DataPoint) {
-            int pointIndex = hitTest.PointIndex;
-            IRun run = (IRun)this.chart.Series[0].Points[pointIndex].Tag;
-            run.Color = colorDialog.Color;
-          }
-        } else {
-          List<DataPoint> selectedPoints = new List<DataPoint>();
-          foreach (DataPoint p in this.chart.Series[0].Points) {
-            if (p.XValue >= minX && p.XValue < maxX &&
-              p.YValues[0] >= minY && p.YValues[0] < maxY) {
-              selectedPoints.Add(p);
-            }
-          }
-          foreach (DataPoint p in selectedPoints) {
-            IRun run = (IRun)p.Tag;
-            run.Color = colorDialog.Color;
-          }
-        }
-        this.chart.ChartAreas[0].CursorX.SelectionStart = this.chart.ChartAreas[0].CursorX.SelectionEnd;
-        this.chart.ChartAreas[0].CursorY.SelectionStart = this.chart.ChartAreas[0].CursorY.SelectionEnd;
-      }
+      if (!isSelecting) return;
+
+      System.Windows.Forms.DataVisualization.Charting.Cursor xCursor = chart.ChartAreas[0].CursorX;
+      System.Windows.Forms.DataVisualization.Charting.Cursor yCursor = chart.ChartAreas[0].CursorY;
+
+      double minX = Math.Min(xCursor.SelectionStart, xCursor.SelectionEnd);
+      double maxX = Math.Max(xCursor.SelectionStart, xCursor.SelectionEnd);
+      double minY = Math.Min(yCursor.SelectionStart, yCursor.SelectionEnd);
+      double maxY = Math.Max(yCursor.SelectionStart, yCursor.SelectionEnd);
+
+      //check for click to select a single model
+      if (minX == maxX && minY == maxY) {
+        HitTestResult hitTest = chart.HitTest(e.X, e.Y, ChartElementType.DataPoint);
+        if (hitTest.ChartElementType == ChartElementType.DataPoint) {
+          int pointIndex = hitTest.PointIndex;
+          var point = chart.Series[0].Points[pointIndex];
+          IRun run = (IRun)point.Tag;
+          point.Color = Color.Red;
+          point.MarkerStyle = MarkerStyle.Cross;
+          selectedRuns.Add(run);
+
+        } else ClearSelectedRuns();
+      } else {
+        foreach (DataPoint point in this.chart.Series[0].Points) {
+          if (point.XValue < minX || point.XValue >= maxX) continue;
+          if (point.YValues[0] < minY || point.YValues[0] >= maxY) continue;
+          point.MarkerStyle = MarkerStyle.Cross;
+          point.Color = Color.Red;
+          IRun run = (IRun)point.Tag;
+          selectedRuns.Add(run);
+        }
+      }
+
+      this.chart.ChartAreas[0].CursorX.SelectionStart = this.chart.ChartAreas[0].CursorX.SelectionEnd;
+      this.chart.ChartAreas[0].CursorY.SelectionStart = this.chart.ChartAreas[0].CursorY.SelectionEnd;
+      this.OnChanged();
     }
 
     private void chart_MouseMove(object sender, MouseEventArgs e) {
+      if (Control.MouseButtons != MouseButtons.None) return;
       HitTestResult h = this.chart.HitTest(e.X, e.Y);
       string newTooltipText = string.Empty;
@@ -615,21 +688,10 @@
     private void zoomButton_CheckedChanged(object sender, EventArgs e) {
       this.isSelecting = selectButton.Checked;
-      this.colorButton.Enabled = this.isSelecting;
+      this.colorDialogButton.Enabled = this.isSelecting;
+      this.colorRunsButton.Enabled = this.isSelecting;
+      this.hideRunsButton.Enabled = this.isSelecting;
       this.chart.ChartAreas[0].AxisX.ScaleView.Zoomable = !isSelecting;
       this.chart.ChartAreas[0].AxisY.ScaleView.Zoomable = !isSelecting;
-    }
-    private void colorButton_Click(object sender, EventArgs e) {
-      if (colorDialog.ShowDialog(this) == DialogResult.OK) {
-        this.colorButton.Image = this.GenerateImage(16, 16, this.colorDialog.Color);
-      }
-    }
-    private Image GenerateImage(int width, int height, Color fillColor) {
-      Image colorImage = new Bitmap(width, height);
-      using (Graphics gfx = Graphics.FromImage(colorImage)) {
-        using (SolidBrush brush = new SolidBrush(fillColor)) {
-          gfx.FillRectangle(brush, 0, 0, width, height);
-        }
-      }
-      return colorImage;
+      ClearSelectedRuns();
     }
 
@@ -650,5 +712,5 @@
     }
     private void hideRunToolStripMenuItem_Click(object sender, EventArgs e) {
-      var constraint = Content.Constraints.OfType<RunCollectionContentConstraint>().Where(c => c.Active).FirstOrDefault();
+      var constraint = Content.Constraints.OfType<RunCollectionContentConstraint>().FirstOrDefault(c => c.Active);
       if (constraint == null) {
         constraint = new RunCollectionContentConstraint();
@@ -657,4 +719,22 @@
       }
       constraint.ConstraintData.Add(runToHide);
+    }
+    private void hideRunsButton_Click(object sender, EventArgs e) {
+      if (!selectedRuns.Any()) return;
+      var constraint = new RunCollectionContentConstraint();
+      constraint.ConstraintData = new ItemSet<IRun>(selectedRuns);
+      Content.Constraints.Add(constraint);
+      ClearSelectedRuns();
+      constraint.Active = true;
+    }
+
+    private void ClearSelectedRuns() {
+      foreach (var run in selectedRuns) {
+        foreach (var point in runToDataPointMapping[run]) {
+          point.MarkerStyle = MarkerStyle.Circle;
+          point.Color = Color.FromArgb(255 - transparencyTrackBar.Value, run.Color);
+        }
+      }
+      selectedRuns.Clear();
     }
 
@@ -666,26 +746,98 @@
       boxplotView.Show();
     }
+
+    private void getDataAsMatrixToolStripMenuItem_Click(object sender, EventArgs e) {
+      int xCol = Matrix.ColumnNames.ToList().IndexOf(xAxisValue);
+      int yCol = Matrix.ColumnNames.ToList().IndexOf(yAxisValue);
+
+      var grouped = new Dictionary<string, List<string>>();
+      Dictionary<double, string> reverseMapping = null;
+      if (categoricalMapping.ContainsKey(xCol))
+        reverseMapping = categoricalMapping[xCol].ToDictionary(x => x.Value, y => y.Key.ToString());
+      foreach (var run in Content.Where(r => r.Visible)) {
+        var x = GetValue(run, xAxisValue);
+        object y;
+        if (categoricalMapping.ContainsKey(yCol))
+          y = Content.GetValue(run, yAxisValue);
+        else y = GetValue(run, yAxisValue);
+        if (!(x.HasValue && y != null)) continue;
+
+        var category = reverseMapping == null ? x.Value.ToString() : reverseMapping[x.Value];
+        if (!grouped.ContainsKey(category)) grouped[category] = new List<string>();
+        grouped[category].Add(y.ToString());
+      }
+
+      if (!grouped.Any()) return;
+      var matrix = new StringMatrix(grouped.Values.Max(x => x.Count), grouped.Count) {
+        ColumnNames = grouped.Keys.ToArray()
+      };
+      int i = 0;
+      foreach (var col in matrix.ColumnNames) {
+        int j = 0;
+        foreach (var y in grouped[col])
+          matrix[j++, i] = y;
+        i++;
+      }
+      matrix.SortableView = false;
+      var view = MainFormManager.MainForm.ShowContent(matrix);
+      view.ReadOnly = true;
+    }
+
+    private void transparencyTrackBar_ValueChanged(object sender, EventArgs e) {
+      foreach (var run in Content)
+        UpdateRun(run);
+    }
     #endregion
 
-    #region Automatic coloring
+    #region coloring
+    private void colorDialogButton_Click(object sender, EventArgs e) {
+      if (colorDialog.ShowDialog(this) == DialogResult.OK) {
+        this.colorDialogButton.Image = this.GenerateImage(16, 16, this.colorDialog.Color);
+      }
+    }
+    private Image GenerateImage(int width, int height, Color fillColor) {
+      Image colorImage = new Bitmap(width, height);
+      using (Graphics gfx = Graphics.FromImage(colorImage)) {
+        using (SolidBrush brush = new SolidBrush(fillColor)) {
+          gfx.FillRectangle(brush, 0, 0, width, height);
+        }
+      }
+      return colorImage;
+    }
+
+    private void colorRunsButton_Click(object sender, EventArgs e) {
+      if (!selectedRuns.Any()) return;
+      Content.UpdateOfRunsInProgress = true;
+      foreach (var run in selectedRuns)
+        run.Color = colorDialog.Color;
+
+      ClearSelectedRuns();
+      Content.UpdateOfRunsInProgress = false;
+    }
+
     private void colorXAxisButton_Click(object sender, EventArgs e) {
       ColorRuns(xAxisValue);
     }
-
     private void colorYAxisButton_Click(object sender, EventArgs e) {
       ColorRuns(yAxisValue);
     }
-
     private void ColorRuns(string axisValue) {
-      var runs = Content.Where(r => r.Visible).Select(r => new { Run = r, Value = GetValue(r, axisValue) }).Where(r => r.Value.HasValue);
+      var runs = Content.Where(r => r.Visible).Select(r => new { Run = r, Value = GetValue(r, axisValue) }).Where(r => r.Value.HasValue).ToList();
       double minValue = runs.Min(r => r.Value.Value);
       double maxValue = runs.Max(r => r.Value.Value);
       double range = maxValue - minValue;
-
-      foreach (var r in runs) {
-        int colorIndex = 0;
-        if (!range.IsAlmost(0)) colorIndex = (int)((ColorGradient.Colors.Count - 1) * (r.Value.Value - minValue) / (range));
-        r.Run.Color = ColorGradient.Colors[colorIndex];
-      }
+      // UpdateOfRunsInProgress has to be set to true, otherwise run_Changed is called all the time (also in other views)
+      Content.UpdateOfRunsInProgress = true;
+      if (range.IsAlmost(0)) {
+        Color c = ColorGradient.Colors[0];
+        runs.ForEach(r => r.Run.Color = c);
+      } else {
+        int maxColorIndex = ColorGradient.Colors.Count - 1;
+        foreach (var r in runs) {
+          int colorIndex = (int)(maxColorIndex * (r.Value - minValue) / (range));
+          r.Run.Color = ColorGradient.Colors[colorIndex];
+        }
+      }
+      Content.UpdateOfRunsInProgress = false;
     }
     #endregion
Index: branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs
===================================================================
--- branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs	(revision 8228)
+++ branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs	(revision 9363)
@@ -63,4 +63,5 @@
       Content.CollectionReset += new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
     }
     protected override void DeregisterContentEvents() {
@@ -69,4 +70,5 @@
       Content.CollectionReset -= new CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
       base.DeregisterContentEvents();
     }
@@ -93,4 +95,9 @@
       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) {
@@ -123,4 +130,5 @@
       runMapping.Clear();
 
+      UpdateCaption();
       if (Content != null) {
         UpdateDataTableComboBox();
@@ -195,4 +203,8 @@
     }
 
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Data Table" : ViewAttribute.GetViewName(GetType());
+    }
+
     private void UpdateDataRowComboBox() {
       dataRowComboBox.Items.Clear();
Index: branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs
===================================================================
--- branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs	(revision 8228)
+++ branches/OaaS/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs	(revision 9363)
@@ -55,4 +55,5 @@
         UpdateRowAttributes();
       }
+      UpdateCaption();
     }
 
@@ -64,4 +65,5 @@
       Content.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       Content.UpdateOfRunsInProgressChanged += new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged += new EventHandler(Content_AlgorithmNameChanged);
       RegisterRunEvents(Content);
     }
@@ -76,4 +78,5 @@
       Content.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IRun>(Content_CollectionReset);
       Content.UpdateOfRunsInProgressChanged -= new EventHandler(Content_UpdateOfRunsInProgressChanged);
+      Content.OptimizerNameChanged -= new EventHandler(Content_AlgorithmNameChanged);
       DeregisterRunEvents(Content);
     }
@@ -91,4 +94,9 @@
     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) {
@@ -101,4 +109,8 @@
     }
     #endregion
+
+    private void UpdateCaption() {
+      Caption = Content != null ? Content.OptimizerName + " Tabular View" : ViewAttribute.GetViewName(GetType());
+    }
 
     protected override void UpdateColumnHeaders() {
