Index: stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 9573)
+++ stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 9929)
@@ -239,9 +239,9 @@
       <DependentUpon>RunCollectionEqualityConstraintView.cs</DependentUpon>
     </Compile>
-    <Compile Include="RunCollectionViews\RunCollectionTabularView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="RunCollectionViews\RunCollectionTabularView.Designer.cs">
-      <DependentUpon>RunCollectionTabularView.cs</DependentUpon>
+    <Compile Include="RunCollectionViews\RunCollectionTableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RunCollectionViews\RunCollectionTableView.Designer.cs">
+      <DependentUpon>RunCollectionTableView.cs</DependentUpon>
     </Compile>
     <Compile Include="RunCollectionViews\RunCollectionView.cs">
@@ -257,9 +257,9 @@
       <DependentUpon>RunView.cs</DependentUpon>
     </Compile>
-    <Compile Include="RunCollectionViews\RunCollectionDataTableView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="RunCollectionViews\RunCollectionDataTableView.Designer.cs">
-      <DependentUpon>RunCollectionDataTableView.cs</DependentUpon>
+    <Compile Include="RunCollectionViews\RunCollectionChartAggregationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RunCollectionViews\RunCollectionChartAggregationView.Designer.cs">
+      <DependentUpon>RunCollectionChartAggregationView.cs</DependentUpon>
     </Compile>
     <Compile Include="UserDefinedAlgorithmView.cs">
Index: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 9573)
+++ stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBoxPlotView.cs	(revision 9929)
@@ -32,5 +32,5 @@
 
 namespace HeuristicLab.Optimization.Views {
-  [View("RunCollection BoxPlots")]
+  [View("Box Plot")]
   [Content(typeof(RunCollection), false)]
   public partial class RunCollectionBoxPlotView : AsynchronousContentView {
@@ -159,5 +159,5 @@
 
     private void UpdateCaption() {
-      Caption = Content != null ? Content.OptimizerName + " Box Plots" : ViewAttribute.GetViewName(GetType());
+      Caption = Content != null ? Content.OptimizerName + " Box Plot" : ViewAttribute.GetViewName(GetType());
     }
 
Index: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 9573)
+++ stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionBubbleChartView.cs	(revision 9929)
@@ -33,5 +33,5 @@
 
 namespace HeuristicLab.Optimization.Views {
-  [View("RunCollection BubbleChart")]
+  [View("Bubble Chart")]
   [Content(typeof(RunCollection), false)]
   public partial class RunCollectionBubbleChartView : AsynchronousContentView {
Index: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.Designer.cs	(revision 9929)
+++ stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.Designer.cs	(revision 9929)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs	(revision 9929)
+++ stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionChartAggregationView.cs	(revision 9929)
@@ -0,0 +1,231 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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("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.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 + " 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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.Designer.cs	(revision 9573)
+++ 	(revision )
@@ -1,135 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2013 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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionDataTableView.cs	(revision 9573)
+++ 	(revision )
@@ -1,231 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2013 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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.Designer.cs	(revision 9929)
+++ stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.Designer.cs	(revision 9929)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs	(revision 9929)
+++ stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTableView.cs	(revision 9929)
@@ -0,0 +1,252 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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("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.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 (suppressUpdates) return;
+      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 + " Table" : 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++;
+      }
+      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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.Designer.cs	(revision 9573)
+++ 	(revision )
@@ -1,72 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2013 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: stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/RunCollectionViews/RunCollectionTabularView.cs	(revision 9573)
+++ 	(revision )
@@ -1,252 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2013 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 (suppressUpdates) return;
-      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++;
-      }
-      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;
-      }
-    }
-  }
-}
