Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 6618)
@@ -34,4 +34,5 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmView));
       this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
       this.problemTabPage = new System.Windows.Forms.TabPage();
@@ -46,11 +47,5 @@
       this.storeAlgorithmInEachRunCheckBox = new System.Windows.Forms.CheckBox();
       this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
-      this.startButton = new System.Windows.Forms.Button();
-      this.pauseButton = new System.Windows.Forms.Button();
-      this.resetButton = new System.Windows.Forms.Button();
-      this.executionTimeLabel = new System.Windows.Forms.Label();
-      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
-      this.stopButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -61,4 +56,32 @@
       this.SuspendLayout();
       // 
+      // startButton
+      // 
+      this.startButton.Location = new System.Drawing.Point(0, 458);
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Location = new System.Drawing.Point(453, 465);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Location = new System.Drawing.Point(30, 458);
+      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+      // 
+      // stopButton
+      // 
+      this.stopButton.Location = new System.Drawing.Point(60, 458);
+      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+      // 
+      // resetButton
+      // 
+      this.resetButton.Location = new System.Drawing.Point(90, 458);
+      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
+      // 
       // nameTextBox
       // 
@@ -76,6 +99,6 @@
       this.tabControl.AllowDrop = true;
       this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.problemTabPage);
       this.tabControl.Controls.Add(this.parametersTabPage);
@@ -85,5 +108,5 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(679, 426);
+      this.tabControl.Size = new System.Drawing.Size(679, 430);
       this.tabControl.TabIndex = 3;
       // 
@@ -97,5 +120,5 @@
       this.problemTabPage.Name = "problemTabPage";
       this.problemTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.problemTabPage.Size = new System.Drawing.Size(671, 400);
+      this.problemTabPage.Size = new System.Drawing.Size(671, 404);
       this.problemTabPage.TabIndex = 0;
       this.problemTabPage.Text = "Problem";
@@ -108,6 +131,6 @@
       // 
       this.problemViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.problemViewHost.Caption = "View";
       this.problemViewHost.Content = null;
@@ -116,5 +139,5 @@
       this.problemViewHost.Name = "problemViewHost";
       this.problemViewHost.ReadOnly = false;
-      this.problemViewHost.Size = new System.Drawing.Size(659, 358);
+      this.problemViewHost.Size = new System.Drawing.Size(659, 362);
       this.problemViewHost.TabIndex = 3;
       this.problemViewHost.ViewsLabelVisible = true;
@@ -156,7 +179,8 @@
       // parameterCollectionView
       // 
+      this.parameterCollectionView.AllowEditingOfHiddenParameters = true;
       this.parameterCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.parameterCollectionView.Caption = "ParameterCollection View";
       this.parameterCollectionView.Content = null;
@@ -181,6 +205,6 @@
       // 
       this.resultsView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.resultsView.Caption = "ResultCollection View";
       this.resultsView.Content = null;
@@ -222,6 +246,6 @@
       // 
       this.runsView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.runsView.Caption = "RunCollection View";
       this.runsView.Content = null;
@@ -232,59 +256,4 @@
       this.runsView.TabIndex = 0;
       // 
-      // startButton
-      // 
-      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
-      this.startButton.Location = new System.Drawing.Point(0, 458);
-      this.startButton.Name = "startButton";
-      this.startButton.Size = new System.Drawing.Size(24, 24);
-      this.startButton.TabIndex = 4;
-      this.toolTip.SetToolTip(this.startButton, "Start/Resume Algorithm");
-      this.startButton.UseVisualStyleBackColor = true;
-      this.startButton.Click += new System.EventHandler(this.startButton_Click);
-      // 
-      // pauseButton
-      // 
-      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.pauseButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Pause;
-      this.pauseButton.Location = new System.Drawing.Point(30, 458);
-      this.pauseButton.Name = "pauseButton";
-      this.pauseButton.Size = new System.Drawing.Size(24, 24);
-      this.pauseButton.TabIndex = 5;
-      this.toolTip.SetToolTip(this.pauseButton, "Pause Algorithm");
-      this.pauseButton.UseVisualStyleBackColor = true;
-      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
-      // 
-      // resetButton
-      // 
-      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.resetButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Restart;
-      this.resetButton.Location = new System.Drawing.Point(90, 458);
-      this.resetButton.Name = "resetButton";
-      this.resetButton.Size = new System.Drawing.Size(24, 24);
-      this.resetButton.TabIndex = 7;
-      this.toolTip.SetToolTip(this.resetButton, "Reset Algorithm");
-      this.resetButton.UseVisualStyleBackColor = true;
-      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
-      // 
-      // executionTimeLabel
-      // 
-      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeLabel.AutoSize = true;
-      this.executionTimeLabel.Location = new System.Drawing.Point(453, 465);
-      this.executionTimeLabel.Name = "executionTimeLabel";
-      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
-      this.executionTimeLabel.TabIndex = 8;
-      this.executionTimeLabel.Text = "&Execution Time:";
-      // 
-      // executionTimeTextBox
-      // 
-      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
-      this.executionTimeTextBox.Name = "executionTimeTextBox";
-      this.executionTimeTextBox.ReadOnly = true;
-      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
-      this.executionTimeTextBox.TabIndex = 9;
-      // 
       // openFileDialog
       // 
@@ -294,16 +263,4 @@
       this.openFileDialog.Title = "Open Problem";
       // 
-      // stopButton
-      // 
-      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
-      this.stopButton.Location = new System.Drawing.Point(60, 458);
-      this.stopButton.Name = "stopButton";
-      this.stopButton.Size = new System.Drawing.Size(24, 24);
-      this.stopButton.TabIndex = 6;
-      this.toolTip.SetToolTip(this.stopButton, "Stop Algorithm");
-      this.stopButton.UseVisualStyleBackColor = true;
-      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-      // 
       // AlgorithmView
       // 
@@ -311,20 +268,14 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.startButton);
-      this.Controls.Add(this.pauseButton);
-      this.Controls.Add(this.executionTimeTextBox);
-      this.Controls.Add(this.executionTimeLabel);
-      this.Controls.Add(this.stopButton);
-      this.Controls.Add(this.resetButton);
       this.Name = "AlgorithmView";
       this.Size = new System.Drawing.Size(679, 482);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
-      this.Controls.SetChildIndex(this.resetButton, 0);
-      this.Controls.SetChildIndex(this.stopButton, 0);
       this.Controls.SetChildIndex(this.executionTimeLabel, 0);
       this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
       this.Controls.SetChildIndex(this.pauseButton, 0);
       this.Controls.SetChildIndex(this.startButton, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -350,13 +301,7 @@
     protected System.Windows.Forms.Button newProblemButton;
     protected System.Windows.Forms.Button openProblemButton;
-    protected System.Windows.Forms.Button startButton;
-    protected System.Windows.Forms.Button pauseButton;
-    protected System.Windows.Forms.Button resetButton;
-    protected System.Windows.Forms.Label executionTimeLabel;
-    protected System.Windows.Forms.TextBox executionTimeTextBox;
     protected System.Windows.Forms.OpenFileDialog openFileDialog;
     protected System.Windows.Forms.TabPage resultsTabPage;
     protected HeuristicLab.Optimization.Views.ResultCollectionView resultsView;
-    protected System.Windows.Forms.Button stopButton;
     protected System.Windows.Forms.TabPage runsTabPage;
     protected RunCollectionView runsView;
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 6618)
@@ -31,23 +31,16 @@
 
 namespace HeuristicLab.Optimization.Views {
-  /// <summary>
-  /// The base class for visual representations of algorithms.
-  /// </summary>
   [View("Algorithm View")]
   [Content(typeof(Algorithm), true)]
   [Content(typeof(IAlgorithm), false)]
-  public partial class AlgorithmView : NamedItemView {
+  public partial class AlgorithmView : IOptimizerView {
     private TypeSelectorDialog problemTypeSelectorDialog;
+    public AlgorithmView() {
+      InitializeComponent();
+    }
 
     public new IAlgorithm Content {
       get { return (IAlgorithm)base.Content; }
       set { base.Content = value; }
-    }
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="ItemBaseView"/>.
-    /// </summary>
-    public AlgorithmView() {
-      InitializeComponent();
     }
 
@@ -75,11 +68,4 @@
 
     protected override void DeregisterContentEvents() {
-      Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
-      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
-      Content.Prepared -= new EventHandler(Content_Prepared);
-      Content.Started -= new EventHandler(Content_Started);
-      Content.Paused -= new EventHandler(Content_Paused);
-      Content.Stopped -= new EventHandler(Content_Stopped);
       Content.ProblemChanged -= new EventHandler(Content_ProblemChanged);
       Content.StoreAlgorithmInEachRunChanged -= new EventHandler(Content_StoreAlgorithmInEachRunChanged);
@@ -88,11 +74,4 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
-      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
-      Content.Prepared += new EventHandler(Content_Prepared);
-      Content.Started += new EventHandler(Content_Started);
-      Content.Paused += new EventHandler(Content_Paused);
-      Content.Stopped += new EventHandler(Content_Stopped);
       Content.ProblemChanged += new EventHandler(Content_ProblemChanged);
       Content.StoreAlgorithmInEachRunChanged += new EventHandler(Content_StoreAlgorithmInEachRunChanged);
@@ -107,7 +86,5 @@
         runsView.Content = null;
         storeAlgorithmInEachRunCheckBox.Checked = true;
-        executionTimeTextBox.Text = "-";
       } else {
-        Locked = ReadOnly = Content.ExecutionState == ExecutionState.Started;
         parameterCollectionView.Content = Content.Parameters;
         problemViewHost.ViewType = null;
@@ -116,5 +93,4 @@
         runsView.Content = Content.Runs;
         storeAlgorithmInEachRunCheckBox.Checked = Content.StoreAlgorithmInEachRun;
-        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
       }
     }
@@ -129,6 +105,4 @@
       runsView.Enabled = Content != null;
       storeAlgorithmInEachRunCheckBox.Enabled = Content != null && !ReadOnly;
-      executionTimeTextBox.Enabled = Content != null;
-      SetEnabledStateOfExecutableButtons();
     }
 
@@ -146,4 +120,13 @@
 
     #region Content Events
+    protected override void Content_Prepared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Prepared), sender, e);
+      else {
+        base.Content_Prepared(sender, e);
+        resultsView.Content = Content.Results.AsReadOnly();
+      }
+    }
+
     protected virtual void Content_ProblemChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -154,16 +137,4 @@
       }
     }
-    protected virtual void Content_ExecutionStateChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
-      else
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-    }
-    protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
-      else
-        executionTimeTextBox.Text = Content == null ? "-" : Content.ExecutionTime.ToString();
-    }
     protected virtual void Content_StoreAlgorithmInEachRunChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -171,43 +142,4 @@
       else
         storeAlgorithmInEachRunCheckBox.Checked = Content.StoreAlgorithmInEachRun;
-    }
-    protected virtual void Content_Prepared(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Prepared), sender, e);
-      else {
-        resultsView.Content = Content.Results.AsReadOnly();
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    protected virtual void Content_Started(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Started), sender, e);
-      else {
-        ReadOnly = Locked = true;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    protected virtual void Content_Paused(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Paused), sender, e);
-      else {
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    protected virtual void Content_Stopped(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Stopped), sender, e);
-      else {
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    protected virtual void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
-      else
-        ErrorHandling.ShowErrorDialog(this, e.Value);
     }
     #endregion
@@ -264,16 +196,4 @@
       if (Content != null) Content.StoreAlgorithmInEachRun = storeAlgorithmInEachRunCheckBox.Checked;
     }
-    protected virtual void startButton_Click(object sender, EventArgs e) {
-      Content.Start();
-    }
-    protected virtual void pauseButton_Click(object sender, EventArgs e) {
-      Content.Pause();
-    }
-    protected virtual void stopButton_Click(object sender, EventArgs e) {
-      Content.Stop();
-    }
-    protected virtual void resetButton_Click(object sender, EventArgs e) {
-      Content.Prepare(false);
-    }
     protected virtual void problemTabPage_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
@@ -294,17 +214,4 @@
     }
     #endregion
-
-    #region Helpers
-    private void SetEnabledStateOfExecutableButtons() {
-      if (Content == null) {
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-      } else {
-        startButton.Enabled = (Content.ExecutionState == ExecutionState.Prepared) || (Content.ExecutionState == ExecutionState.Paused);
-        pauseButton.Enabled = Content.ExecutionState == ExecutionState.Started;
-        stopButton.Enabled = (Content.ExecutionState == ExecutionState.Started) || (Content.ExecutionState == ExecutionState.Paused);
-        resetButton.Enabled = Content.ExecutionState != ExecutionState.Started;
-      }
-    }
-    #endregion
   }
 }
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/BatchRunView.Designer.cs	(revision 6618)
@@ -34,4 +34,5 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BatchRunView));
       this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
       this.optimizerTabPage = new System.Windows.Forms.TabPage();
@@ -41,13 +42,7 @@
       this.runsTabPage = new System.Windows.Forms.TabPage();
       this.runsView = new HeuristicLab.Optimization.Views.RunCollectionView();
-      this.startButton = new System.Windows.Forms.Button();
-      this.stopButton = new System.Windows.Forms.Button();
-      this.resetButton = new System.Windows.Forms.Button();
-      this.executionTimeLabel = new System.Windows.Forms.Label();
-      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
       this.repetitionsLabel = new System.Windows.Forms.Label();
       this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
-      this.pauseButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -57,4 +52,32 @@
       this.SuspendLayout();
       // 
+      // startButton
+      // 
+      this.startButton.Location = new System.Drawing.Point(0, 459);
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Location = new System.Drawing.Point(453, 465);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Location = new System.Drawing.Point(30, 459);
+      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+      // 
+      // stopButton
+      // 
+      this.stopButton.Location = new System.Drawing.Point(60, 459);
+      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+      // 
+      // resetButton
+      // 
+      this.resetButton.Location = new System.Drawing.Point(90, 458);
+      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
+      // 
       // nameTextBox
       // 
@@ -72,6 +95,6 @@
       this.tabControl.AllowDrop = true;
       this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.optimizerTabPage);
       this.tabControl.Controls.Add(this.runsTabPage);
@@ -79,5 +102,5 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(679, 400);
+      this.tabControl.Size = new System.Drawing.Size(679, 401);
       this.tabControl.TabIndex = 5;
       // 
@@ -91,5 +114,5 @@
       this.optimizerTabPage.Name = "optimizerTabPage";
       this.optimizerTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.optimizerTabPage.Size = new System.Drawing.Size(671, 374);
+      this.optimizerTabPage.Size = new System.Drawing.Size(671, 375);
       this.optimizerTabPage.TabIndex = 1;
       this.optimizerTabPage.Text = "Optimizer";
@@ -102,6 +125,6 @@
       // 
       this.optimizerViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.optimizerViewHost.Caption = "View";
       this.optimizerViewHost.Content = null;
@@ -110,5 +133,5 @@
       this.optimizerViewHost.Name = "optimizerViewHost";
       this.optimizerViewHost.ReadOnly = false;
-      this.optimizerViewHost.Size = new System.Drawing.Size(659, 332);
+      this.optimizerViewHost.Size = new System.Drawing.Size(659, 333);
       this.optimizerViewHost.TabIndex = 3;
       this.optimizerViewHost.ViewsLabelVisible = true;
@@ -151,6 +174,6 @@
       // 
       this.runsView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.runsView.Caption = "RunCollection View";
       this.runsView.Content = null;
@@ -161,59 +184,4 @@
       this.runsView.TabIndex = 0;
       // 
-      // startButton
-      // 
-      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
-      this.startButton.Location = new System.Drawing.Point(0, 458);
-      this.startButton.Name = "startButton";
-      this.startButton.Size = new System.Drawing.Size(24, 24);
-      this.startButton.TabIndex = 6;
-      this.toolTip.SetToolTip(this.startButton, "Start/Resume Batch Run");
-      this.startButton.UseVisualStyleBackColor = true;
-      this.startButton.Click += new System.EventHandler(this.startButton_Click);
-      // 
-      // stopButton
-      // 
-      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
-      this.stopButton.Location = new System.Drawing.Point(60, 458);
-      this.stopButton.Name = "stopButton";
-      this.stopButton.Size = new System.Drawing.Size(24, 24);
-      this.stopButton.TabIndex = 8;
-      this.toolTip.SetToolTip(this.stopButton, "Stop Batch Run");
-      this.stopButton.UseVisualStyleBackColor = true;
-      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-      // 
-      // resetButton
-      // 
-      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.resetButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Restart;
-      this.resetButton.Location = new System.Drawing.Point(90, 458);
-      this.resetButton.Name = "resetButton";
-      this.resetButton.Size = new System.Drawing.Size(24, 24);
-      this.resetButton.TabIndex = 9;
-      this.toolTip.SetToolTip(this.resetButton, "Reset Batch Run");
-      this.resetButton.UseVisualStyleBackColor = true;
-      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
-      // 
-      // executionTimeLabel
-      // 
-      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeLabel.AutoSize = true;
-      this.executionTimeLabel.Location = new System.Drawing.Point(453, 465);
-      this.executionTimeLabel.Name = "executionTimeLabel";
-      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
-      this.executionTimeLabel.TabIndex = 10;
-      this.executionTimeLabel.Text = "&Execution Time:";
-      // 
-      // executionTimeTextBox
-      // 
-      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
-      this.executionTimeTextBox.Name = "executionTimeTextBox";
-      this.executionTimeTextBox.ReadOnly = true;
-      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
-      this.executionTimeTextBox.TabIndex = 11;
-      // 
       // openFileDialog
       // 
@@ -235,5 +203,5 @@
       // 
       this.repetitionsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.repetitionsNumericUpDown.Location = new System.Drawing.Point(72, 26);
       this.repetitionsNumericUpDown.Maximum = new decimal(new int[] {
@@ -259,41 +227,23 @@
       this.repetitionsNumericUpDown.Validated += new System.EventHandler(this.repetitionsNumericUpDown_Validated);
       // 
-      // pauseButton
-      // 
-      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.pauseButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Pause;
-      this.pauseButton.Location = new System.Drawing.Point(30, 458);
-      this.pauseButton.Name = "pauseButton";
-      this.pauseButton.Size = new System.Drawing.Size(24, 24);
-      this.pauseButton.TabIndex = 7;
-      this.toolTip.SetToolTip(this.pauseButton, "Pause Batch Run");
-      this.pauseButton.UseVisualStyleBackColor = true;
-      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
-      // 
       // BatchRunView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.startButton);
-      this.Controls.Add(this.executionTimeTextBox);
-      this.Controls.Add(this.executionTimeLabel);
-      this.Controls.Add(this.pauseButton);
       this.Controls.Add(this.repetitionsNumericUpDown);
       this.Controls.Add(this.repetitionsLabel);
-      this.Controls.Add(this.stopButton);
-      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.tabControl);
       this.Name = "BatchRunView";
       this.Size = new System.Drawing.Size(679, 482);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
       this.Controls.SetChildIndex(this.resetButton, 0);
       this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.pauseButton, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.repetitionsLabel, 0);
       this.Controls.SetChildIndex(this.repetitionsNumericUpDown, 0);
-      this.Controls.SetChildIndex(this.pauseButton, 0);
-      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
-      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
-      this.Controls.SetChildIndex(this.startButton, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -314,9 +264,4 @@
     private System.Windows.Forms.Button newOptimizerButton;
     private System.Windows.Forms.Button openOptimizerButton;
-    private System.Windows.Forms.Button startButton;
-    private System.Windows.Forms.Button stopButton;
-    private System.Windows.Forms.Button resetButton;
-    private System.Windows.Forms.Label executionTimeLabel;
-    private System.Windows.Forms.TextBox executionTimeTextBox;
     private System.Windows.Forms.OpenFileDialog openFileDialog;
     private System.Windows.Forms.TabPage runsTabPage;
@@ -324,5 +269,4 @@
     private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
     private RunCollectionView runsView;
-    private System.Windows.Forms.Button pauseButton;
   }
 }
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 6618)
@@ -35,5 +35,5 @@
   [View("BatchRun View")]
   [Content(typeof(BatchRun), true)]
-  public sealed partial class BatchRunView : NamedItemView {
+  public sealed partial class BatchRunView : IOptimizerView {
     private TypeSelectorDialog optimizerTypeSelectorDialog;
 
@@ -60,11 +60,4 @@
     protected override void DeregisterContentEvents() {
       Content.OptimizerChanged -= new EventHandler(Content_OptimizerChanged);
-      Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
-      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
-      Content.Prepared -= new EventHandler(Content_Prepared);
-      Content.Started -= new EventHandler(Content_Started);
-      Content.Paused -= new EventHandler(Content_Paused);
-      Content.Stopped -= new EventHandler(Content_Stopped);
       Content.RepetitionsChanged -= new EventHandler(Content_RepetitionsChanged);
       base.DeregisterContentEvents();
@@ -73,11 +66,4 @@
       base.RegisterContentEvents();
       Content.OptimizerChanged += new EventHandler(Content_OptimizerChanged);
-      Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
-      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
-      Content.Prepared += new EventHandler(Content_Prepared);
-      Content.Started += new EventHandler(Content_Started);
-      Content.Paused += new EventHandler(Content_Paused);
-      Content.Stopped += new EventHandler(Content_Stopped);
       Content.RepetitionsChanged += new EventHandler(Content_RepetitionsChanged);
     }
@@ -89,11 +75,8 @@
         optimizerViewHost.Content = null;
         runsView.Content = null;
-        executionTimeTextBox.Text = "-";
       } else {
-        Locked = ReadOnly = Content.ExecutionState == ExecutionState.Started;
         repetitionsNumericUpDown.Value = Content.Repetitions;
         optimizerViewHost.Content = Content.Optimizer;
         runsView.Content = Content.Runs;
-        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
       }
     }
@@ -105,6 +88,4 @@
       optimizerViewHost.Enabled = Content != null;
       runsView.Enabled = Content != null;
-      executionTimeTextBox.Enabled = Content != null;
-      SetEnabledStateOfExecutableButtons();
     }
 
@@ -122,54 +103,4 @@
 
     #region Content Events
-    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
-      else
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-    }
-    private void Content_Prepared(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Prepared), sender, e);
-      else {
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_Started(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Started), sender, e);
-      else {
-        ReadOnly = Locked = true;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_Paused(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Paused), sender, e);
-      else {
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_Stopped(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Stopped), sender, e);
-      else {
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
-      else
-        executionTimeTextBox.Text = Content == null ? "-" : Content.ExecutionTime.ToString();
-    }
-    private void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
-      else
-        ErrorHandling.ShowErrorDialog(this, e.Value);
-    }
     private void Content_OptimizerChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -239,16 +170,5 @@
       }
     }
-    private void startButton_Click(object sender, EventArgs e) {
-      Content.Start();
-    }
-    private void pauseButton_Click(object sender, EventArgs e) {
-      Content.Pause();
-    }
-    private void stopButton_Click(object sender, EventArgs e) {
-      Content.Stop();
-    }
-    private void resetButton_Click(object sender, EventArgs e) {
-      Content.Prepare(false);
-    }
+
     private void optimizerTabPage_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
@@ -270,16 +190,4 @@
     #endregion
 
-    #region Helpers
-    private void SetEnabledStateOfExecutableButtons() {
-      if (Content == null) {
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-      } else {
-        startButton.Enabled = (Content.ExecutionState == ExecutionState.Prepared) || (Content.ExecutionState == ExecutionState.Paused);
-        pauseButton.Enabled = Content.ExecutionState == ExecutionState.Started;
-        stopButton.Enabled = (Content.ExecutionState == ExecutionState.Started) || (Content.ExecutionState == ExecutionState.Paused);
-        resetButton.Enabled = Content.ExecutionState != ExecutionState.Started;
-      }
-    }
-    #endregion
   }
 }
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.Designer.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.Designer.cs	(revision 6618)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.Designer.cs	(revision 6618)
@@ -0,0 +1,287 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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 ExperimentTreeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+    #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.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExperimentTreeView));
+      this.optimizersGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.moveUpButton = new System.Windows.Forms.Button();
+      this.moveDownButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.treeView = new HeuristicLab.Optimization.Views.ExperimentTreeView.CustomTreeView();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.detailsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.ExpandToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.CollapseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.EditNodeLabelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.optimizersGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // optimizersGroupBox
+      // 
+      this.optimizersGroupBox.Controls.Add(this.splitContainer);
+      this.optimizersGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.optimizersGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.optimizersGroupBox.Name = "optimizersGroupBox";
+      this.optimizersGroupBox.Size = new System.Drawing.Size(627, 458);
+      this.optimizersGroupBox.TabIndex = 16;
+      this.optimizersGroupBox.TabStop = false;
+      this.optimizersGroupBox.Text = "Optimizers";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveUpButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveDownButton);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      this.splitContainer.Panel1.Controls.Add(this.treeView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(621, 439);
+      this.splitContainer.SplitterDistance = 198;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(124, 4);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 15;
+      this.toolTip.SetToolTip(this.showDetailsCheckBox, "Show/Hide Details");
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(94, 4);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 14;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // moveUpButton
+      // 
+      this.moveUpButton.Enabled = false;
+      this.moveUpButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ArrowUp;
+      this.moveUpButton.Location = new System.Drawing.Point(34, 4);
+      this.moveUpButton.Name = "moveUpButton";
+      this.moveUpButton.Size = new System.Drawing.Size(24, 24);
+      this.moveUpButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.moveUpButton, "Move Up");
+      this.moveUpButton.UseVisualStyleBackColor = true;
+      this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click);
+      // 
+      // moveDownButton
+      // 
+      this.moveDownButton.Enabled = false;
+      this.moveDownButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ArrowDown;
+      this.moveDownButton.Location = new System.Drawing.Point(64, 4);
+      this.moveDownButton.Name = "moveDownButton";
+      this.moveDownButton.Size = new System.Drawing.Size(24, 24);
+      this.moveDownButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.moveDownButton, "Move Down");
+      this.moveDownButton.UseVisualStyleBackColor = true;
+      this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(4, 4);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 11;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // optimizerTreeView
+      // 
+      this.treeView.AllowDrop = true;
+      this.treeView.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.treeView.HideSelection = false;
+      this.treeView.ImageIndex = 0;
+      this.treeView.ImageList = this.imageList;
+      this.treeView.LabelEdit = true;
+      this.treeView.Location = new System.Drawing.Point(4, 34);
+      this.treeView.Name = "optimizerTreeView";
+      this.treeView.SelectedImageIndex = 0;
+      this.treeView.Size = new System.Drawing.Size(191, 402);
+      this.treeView.TabIndex = 10;
+      this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(treeView_AfterLabelEdit);
+      this.treeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(treeView_BeforeLabelEdit);
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(treeView_AfterSelect);
+      this.treeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.optimizerTreeView_ItemDrag);
+      this.treeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeview_NodeMouseClick);
+      this.treeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseDoubleClick);
+      this.treeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.optimizerTreeView_DragDrop);
+      this.treeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.optimizerTreeView_DragEnter);
+      this.treeView.DragOver += new System.Windows.Forms.DragEventHandler(this.optimizerTreeView_DragOver);
+      this.treeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeView_KeyDown);
+      this.treeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseDown);
+      this.treeView.RightClick += new System.EventHandler(treeView_RightClick);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.detailsViewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 34);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(413, 405);
+      this.detailsGroupBox.TabIndex = 1;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // detailsViewHost
+      // 
+      this.detailsViewHost.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.detailsViewHost.Caption = "View";
+      this.detailsViewHost.Content = null;
+      this.detailsViewHost.Enabled = false;
+      this.detailsViewHost.Location = new System.Drawing.Point(6, 19);
+      this.detailsViewHost.Name = "detailsViewHost";
+      this.detailsViewHost.ReadOnly = false;
+      this.detailsViewHost.Size = new System.Drawing.Size(401, 380);
+      this.detailsViewHost.TabIndex = 0;
+      this.detailsViewHost.ViewsLabelVisible = true;
+      this.detailsViewHost.ViewType = null;
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.EditNodeLabelToolStripMenuItem,
+            this.ExpandToolStripMenuItem,
+            this.CollapseToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(120, 48);
+      // 
+      // ExpandToolStripMenuItem
+      // 
+      this.ExpandToolStripMenuItem.Name = "ExpandToolStripMenuItem";
+      this.ExpandToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
+      this.ExpandToolStripMenuItem.Text = "Expand";
+      this.ExpandToolStripMenuItem.Click += new System.EventHandler(this.ExpandToolStripMenuItem_Click);
+      // 
+      // CollapseToolStripMenuItem
+      // 
+      this.CollapseToolStripMenuItem.Name = "CollapseToolStripMenuItem";
+      this.CollapseToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
+      this.CollapseToolStripMenuItem.Text = "Collapse";
+      this.CollapseToolStripMenuItem.Click += new System.EventHandler(this.CollapseToolStripMenuItem_Click);
+      //
+      // EditNodeLabelToolStripMenuItem
+      //
+      this.EditNodeLabelToolStripMenuItem.Name = "EditNodeLabelToolStripMenuItem";
+      this.EditNodeLabelToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
+      this.EditNodeLabelToolStripMenuItem.Text = "Edit Name";
+      this.EditNodeLabelToolStripMenuItem.Click += new System.EventHandler(this.EditNodeLabelToolStripMenuItem_Click);
+
+      // 
+      // ExperimentTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.optimizersGroupBox);
+      this.Name = "ExperimentTreeView";
+      this.Size = new System.Drawing.Size(627, 458);
+      this.optimizersGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+    #endregion
+
+    private System.Windows.Forms.GroupBox optimizersGroupBox;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private HeuristicLab.Optimization.Views.ExperimentTreeView.CustomTreeView treeView;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private MainForm.WindowsForms.ViewHost detailsViewHost;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.CheckBox showDetailsCheckBox;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button moveUpButton;
+    private System.Windows.Forms.Button moveDownButton;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem ExpandToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem CollapseToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem EditNodeLabelToolStripMenuItem;
+
+  }
+}
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.cs	(revision 6618)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentTreeView.cs	(revision 6618)
@@ -0,0 +1,919 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Optimization.Views {
+  public sealed partial class ExperimentTreeView : ItemView {
+    private TypeSelectorDialog typeSelectorDialog;
+    private Dictionary<INamedItem, List<TreeNode>> treeNodeTagMapping;
+
+    public ExperimentTreeView() {
+      InitializeComponent();
+      treeNodeTagMapping = new Dictionary<INamedItem, List<TreeNode>>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region necessary code to handle dock correctly regarding the expanded nodes
+    bool[] expandendedState;
+    protected override void OnHandleCreated(EventArgs e) {
+      base.OnHandleCreated(e);
+      if (expandendedState == null) return;
+      var nodes = IterateTreeNodes().ToList();
+      for (int i = 0; i < nodes.Count; i++)
+        if (expandendedState[i]) nodes[i].Expand();
+    }
+    protected override void OnHandleDestroyed(EventArgs e) {
+      base.OnHandleDestroyed(e);
+      var nodes = IterateTreeNodes().ToList();
+      expandendedState = new bool[nodes.Count];
+      for (int i = 0; i < nodes.Count; i++)
+        expandendedState[i] = nodes[i].IsExpanded;
+    }
+    #endregion
+
+    public new Experiment Content {
+      get { return (Experiment)base.Content; }
+      set { base.Content = value; }
+    }
+
+    #region events registration
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+      Content.Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+      Content.Optimizers.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsMoved);
+      Content.Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+      Content.Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+      Content.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
+      Content.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+      Content.Optimizers.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsMoved);
+      Content.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+      Content.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+      Content.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+      foreach (var optimizer in treeNodeTagMapping.Keys)
+        DeregisterNamedItemEvents(optimizer);
+      base.DeregisterContentEvents();
+    }
+
+    private void RegisterNamedItemEvents(INamedItem namedItem) {
+      namedItem.ToStringChanged += new EventHandler(namedItem_ToStringChanged);
+      namedItem.ItemImageChanged += new EventHandler(namedItem_ItemImageChanged);
+
+      var algorithm = namedItem as IAlgorithm;
+      var batchRun = namedItem as BatchRun;
+      var experiment = namedItem as Experiment;
+
+      if (algorithm != null) {
+        algorithm.Prepared += new EventHandler(algorithm_Prepared);
+        algorithm.ProblemChanged += new EventHandler(algorithm_ProblemChanged);
+      } else if (batchRun != null) {
+        batchRun.OptimizerChanged += new EventHandler(batchRun_OptimizerChanged);
+      } else if (experiment != null) {
+        experiment.Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+        experiment.Optimizers.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsMoved);
+        experiment.Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+        experiment.Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+        experiment.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+      }
+    }
+
+    private void DeregisterNamedItemEvents(INamedItem namedItem) {
+      namedItem.ToStringChanged -= new EventHandler(namedItem_ToStringChanged);
+      namedItem.ItemImageChanged -= new EventHandler(namedItem_ItemImageChanged);
+
+      var algorithm = namedItem as IAlgorithm;
+      var batchRun = namedItem as BatchRun;
+      var experiment = namedItem as Experiment;
+
+      if (algorithm != null) {
+        algorithm.Prepared -= new EventHandler(algorithm_Prepared);
+        algorithm.ProblemChanged -= new EventHandler(algorithm_ProblemChanged);
+      } else if (batchRun != null) {
+        batchRun.OptimizerChanged -= new EventHandler(batchRun_OptimizerChanged);
+      } else if (experiment != null) {
+        experiment.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+        experiment.Optimizers.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsMoved);
+        experiment.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+        experiment.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+        experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        treeView.Nodes.Clear();
+      } else {
+        UpdateOptimizerTreeView();
+        treeView.ExpandAll();
+      }
+    }
+
+    #region content events
+    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, EventArgs>)Content_ExecutionStateChanged, sender, e);
+        return;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    private void algorithm_Prepared(object sender, EventArgs e) {
+      var algorithm = (IAlgorithm)sender;
+      foreach (TreeNode node in treeNodeTagMapping[algorithm]) {
+        TreeNode resultsNode = node.Nodes.OfType<TreeNode>().Where(x => x.Tag is ResultCollection).Single();
+        if (detailsViewHost.Content == resultsNode.Tag)
+          detailsViewHost.Content = algorithm.Results;
+        resultsNode.Tag = algorithm.Results;
+      }
+    }
+
+    private void algorithm_ProblemChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, EventArgs>)algorithm_ProblemChanged, sender, e);
+        return;
+      }
+
+      var algorithm = (IAlgorithm)sender;
+      foreach (TreeNode node in treeNodeTagMapping[algorithm]) {
+        foreach (TreeNode childNode in node.Nodes.OfType<TreeNode>().ToList()) {
+          DisposeTreeNode(childNode);
+          childNode.Remove();
+        }
+        List<TreeNode> nodes;
+        foreach (TreeNode childNode in CreateAlgorithmChildNodes(algorithm)) {
+          node.Nodes.Add(childNode);
+          NamedItem namedItem = childNode.Tag as NamedItem;
+          if (namedItem != null) {
+            if (!treeNodeTagMapping.TryGetValue(namedItem, out nodes)) {
+              nodes = new List<TreeNode>();
+              treeNodeTagMapping.Add(namedItem, nodes);
+              RegisterNamedItemEvents(namedItem);
+            }
+            nodes.Add(childNode);
+          }
+        }
+
+        node.Expand();
+      }
+
+      RebuildImageList();
+      UpdateDetailsViewHost();
+    }
+
+    private void batchRun_OptimizerChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, EventArgs>)batchRun_OptimizerChanged, sender, e);
+        return;
+      }
+      var batchRun = (BatchRun)sender;
+      foreach (TreeNode node in treeNodeTagMapping[batchRun]) {
+        foreach (TreeNode childNode in node.Nodes.OfType<TreeNode>().ToList()) {
+          DisposeTreeNode(childNode);
+          childNode.Remove();
+        }
+
+        if (batchRun.Optimizer != null) {
+          UpdateChildTreeNodes(node.Nodes, batchRun);
+          node.Expand();
+        }
+      }
+      RebuildImageList();
+      UpdateDetailsViewHost();
+    }
+
+    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>>>)Optimizers_ItemsAdded, sender, e);
+        return;
+      }
+
+      var optimizerList = (OptimizerList)sender;
+      IEnumerable<TreeNodeCollection> parentNodes;
+      if (optimizerList == Content.Optimizers) parentNodes = new List<TreeNodeCollection>() { treeView.Nodes };
+      else {
+        Experiment experiment = treeNodeTagMapping.Keys.OfType<Experiment>().Where(exp => exp.Optimizers == optimizerList).First();
+        parentNodes = treeNodeTagMapping[experiment].Select(node => node.Nodes);
+      }
+
+      foreach (TreeNodeCollection parentNode in parentNodes) {
+        foreach (var childOptimizer in e.Items) {
+          TreeNode childNode = CreateTreeNode(childOptimizer.Value);
+          UpdateChildTreeNodes(childNode.Nodes, childOptimizer.Value);
+          parentNode.Insert(childOptimizer.Index, childNode);
+          childNode.ExpandAll();
+          if (childNode.Parent != null) childNode.Parent.ExpandAll();
+        }
+      }
+      RebuildImageList();
+    }
+    private void Optimizers_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>>>)Optimizers_ItemsMoved, sender, e);
+        return;
+      }
+
+      var optimizerList = (OptimizerList)sender;
+      IEnumerable<TreeNodeCollection> parentNodes;
+      if (optimizerList == Content.Optimizers) parentNodes = new List<TreeNodeCollection>() { treeView.Nodes };
+      else {
+        Experiment experiment = treeNodeTagMapping.Keys.OfType<Experiment>().Where(exp => exp.Optimizers == optimizerList).First();
+        parentNodes = treeNodeTagMapping[experiment].Select(node => node.Nodes);
+      }
+
+      foreach (TreeNodeCollection parentNode in parentNodes) {
+        var backup = parentNode.OfType<TreeNode>().ToList();
+        foreach (var indexedItem in e.Items) {
+          var node = backup.Where(n => n.Tag == indexedItem.Value).First();
+          node.Remove();
+          parentNode.Insert(indexedItem.Index, node);
+        }
+      }
+    }
+    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>>>)Optimizers_ItemsRemoved, sender, e);
+        return;
+      }
+
+      var optimizerList = (OptimizerList)sender;
+      IEnumerable<TreeNodeCollection> parentNodes;
+      if (optimizerList == Content.Optimizers) parentNodes = new List<TreeNodeCollection>() { treeView.Nodes };
+      else {
+        Experiment experiment = treeNodeTagMapping.Keys.OfType<Experiment>().Where(exp => exp.Optimizers == optimizerList).First();
+        parentNodes = treeNodeTagMapping[experiment].Select(node => node.Nodes);
+      }
+
+      foreach (TreeNodeCollection parentNode in parentNodes) {
+        foreach (var childOptimizer in e.Items) {
+          TreeNode childNode = parentNode[childOptimizer.Index];
+          DisposeTreeNode(childNode);
+          childNode.Remove();
+        }
+      }
+      RebuildImageList();
+      UpdateDetailsViewHost();
+    }
+    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>>>)Optimizers_ItemsReplaced, sender, e);
+        return;
+      }
+
+      var optimizerList = (OptimizerList)sender;
+      IEnumerable<TreeNodeCollection> parentNodes;
+      if (optimizerList == Content.Optimizers) parentNodes = new List<TreeNodeCollection>() { treeView.Nodes };
+      else {
+        Experiment experiment = treeNodeTagMapping.Keys.OfType<Experiment>().Where(exp => exp.Optimizers == optimizerList).First();
+        parentNodes = treeNodeTagMapping[experiment].Select(node => node.Nodes);
+      }
+
+      foreach (TreeNodeCollection parentNode in parentNodes) {
+        foreach (var childOptimizer in e.OldItems) {
+          TreeNode childNode = parentNode.Cast<TreeNode>().Where(n => n.Tag == childOptimizer.Value && n.Index == childOptimizer.Index).First();
+          DisposeTreeNode(childNode);
+          childNode.Remove();
+        }
+        foreach (var childOptimizer in e.Items) {
+          TreeNode childNode = CreateTreeNode(childOptimizer.Value);
+          UpdateChildTreeNodes(childNode.Nodes, childOptimizer.Value);
+          parentNode.Insert(childOptimizer.Index, childNode);
+        }
+      }
+      RebuildImageList();
+      UpdateDetailsViewHost();
+    }
+    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>>>)Optimizers_CollectionReset, sender, e);
+        return;
+      }
+
+      var optimizerList = (OptimizerList)sender;
+      IEnumerable<TreeNodeCollection> parentNodes;
+      if (optimizerList == Content.Optimizers) parentNodes = new List<TreeNodeCollection>() { treeView.Nodes };
+      else {
+        Experiment experiment = treeNodeTagMapping.Keys.OfType<Experiment>().Where(exp => exp.Optimizers == optimizerList).First();
+        parentNodes = treeNodeTagMapping[experiment].Select(node => node.Nodes);
+      }
+
+      foreach (TreeNodeCollection parentNode in parentNodes) {
+        foreach (var childOptimizer in e.OldItems) {
+          TreeNode childNode = parentNode.Cast<TreeNode>().Where(n => n.Tag == childOptimizer.Value && n.Index == childOptimizer.Index).First();
+          DisposeTreeNode(childNode);
+          childNode.Remove();
+        }
+        foreach (var childOptimizer in e.Items) {
+          TreeNode childNode = CreateTreeNode(childOptimizer.Value);
+          UpdateChildTreeNodes(childNode.Nodes, childOptimizer.Value);
+          parentNode.Insert(childOptimizer.Index, childNode);
+        }
+      }
+      RebuildImageList();
+      UpdateDetailsViewHost();
+    }
+
+    private void namedItem_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, EventArgs>)namedItem_ToStringChanged, sender, e);
+        return;
+      }
+      var namedItem = (INamedItem)sender;
+      foreach (TreeNode node in treeNodeTagMapping[namedItem])
+        node.Text = namedItem.ToString();
+    }
+
+    private void namedItem_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke((Action<object, EventArgs>)namedItem_ItemImageChanged, sender, e);
+        return;
+      }
+      INamedItem namedItem = (INamedItem)sender;
+      foreach (TreeNode node in treeNodeTagMapping[namedItem]) {
+        treeView.ImageList.Images[node.ImageIndex] = namedItem.ItemImage;
+        node.ImageIndex = node.ImageIndex;
+      }
+      SetEnabledStateOfControls();
+    }
+    #endregion
+
+    protected override void PropagateStateChanges(Control control, Type type, System.Reflection.PropertyInfo propertyInfo) {
+      return;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      IOptimizer optimizer = null;
+      IAlgorithm algorithm = null;
+      BatchRun batchRun = null;
+      Experiment experiment = null;
+
+      IOptimizer parentOptimizer = null;
+      Experiment parentExperiment = null;
+
+      if (treeView.SelectedNode != null) {
+        optimizer = treeView.SelectedNode.Tag as IOptimizer;
+        algorithm = optimizer as IAlgorithm;
+        batchRun = optimizer as BatchRun;
+        experiment = optimizer as Experiment;
+
+        if (treeView.SelectedNode.Parent != null) parentOptimizer = treeView.SelectedNode.Parent.Tag as IOptimizer;
+        else parentOptimizer = Content;
+
+        parentExperiment = parentOptimizer as Experiment;
+      }
+
+      treeView.Enabled = Content != null;
+      if (parentOptimizer != null) {
+        detailsViewHost.ReadOnly = parentOptimizer.ExecutionState == ExecutionState.Started;
+        detailsViewHost.Locked = parentOptimizer.ExecutionState == ExecutionState.Started;
+      }
+
+      addButton.Enabled = Content != null && !Locked && !ReadOnly &&
+        (treeView.SelectedNode == null || experiment != null || batchRun != null || algorithm != null);
+      moveUpButton.Enabled = Content != null && !Locked && !ReadOnly &&
+        treeView.SelectedNode != null && treeView.SelectedNode.PrevNode != null && parentExperiment != null;
+      moveDownButton.Enabled = Content != null && !Locked && !ReadOnly &&
+        treeView.SelectedNode != null && treeView.SelectedNode.NextNode != null && parentExperiment != null;
+      removeButton.Enabled = Content != null && !Locked && !ReadOnly && optimizer != null;
+    }
+
+    private void UpdateOptimizerTreeView() {
+      treeView.Nodes.Clear();
+      UpdateChildTreeNodes(treeView.Nodes, Content);
+      RebuildImageList();
+    }
+
+    private void UpdateChildTreeNodes(TreeNodeCollection collection, IOptimizer optimizer) {
+      var batchRun = optimizer as BatchRun;
+      var experiment = optimizer as Experiment;
+
+      if (batchRun != null && batchRun.Optimizer != null) UpdateChildTreeNodes(collection, new List<IOptimizer>() { batchRun.Optimizer });
+      else if (experiment != null) UpdateChildTreeNodes(collection, experiment.Optimizers);
+    }
+    private void UpdateChildTreeNodes(TreeNodeCollection collection, IEnumerable<IOptimizer> optimizers) {
+      foreach (IOptimizer optimizer in optimizers) {
+        var node = CreateTreeNode(optimizer);
+        collection.Add(node);
+        UpdateChildTreeNodes(node.Nodes, optimizer);
+      }
+    }
+
+
+    #region drag & drop
+    private void optimizerTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (Locked) return;
+
+      TreeNode selectedNode = (TreeNode)e.Item;
+      var item = (IItem)selectedNode.Tag;
+      if (item == null) return;
+
+      DataObject data = new DataObject();
+      data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, item);
+      validDragOperation = true;
+
+      if (ReadOnly || !(item is IOptimizer)) {
+        DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+      } else {
+        DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+        if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+          var optimizer = (IOptimizer)item;
+          if (selectedNode.Parent == null) Content.Optimizers.Remove(optimizer);
+          else {
+            var parentOptimizer = (IOptimizer)selectedNode.Parent.Tag;
+            var parentBatchRun = parentOptimizer as BatchRun;
+            var parentExperiment = parentOptimizer as Experiment;
+            if (parentBatchRun != null) parentBatchRun.Optimizer = null;
+            else if (parentExperiment != null) parentExperiment.Optimizers.Remove(optimizer);
+            else throw new NotSupportedException("Handling for specific type not implemented" + parentOptimizer.GetType());
+          }
+        }
+      }
+    }
+
+    private bool validDragOperation = false;
+    private void optimizerTreeView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (!ReadOnly) {
+        var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+        if (data is IOptimizer) validDragOperation = true;
+        else if (data is IProblem) validDragOperation = true;
+        else if (data is IEnumerable) {
+          IEnumerable items = (IEnumerable)data;
+          validDragOperation = true;
+          foreach (object item in items)
+            validDragOperation = validDragOperation && (item is IOptimizer);
+        }
+      }
+    }
+    private void optimizerTreeView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!validDragOperation) return;
+      Point coordinates = treeView.PointToClient(new Point(e.X, e.Y));
+      TreeNode node = treeView.GetNodeAt(coordinates);
+      Experiment experiment = null;
+      BatchRun batchRun = null;
+      Algorithm algorithm = null;
+
+      if (node == null) experiment = Content;
+      else {
+        experiment = node.Tag as Experiment;
+        batchRun = node.Tag as BatchRun;
+        algorithm = node.Tag as Algorithm;
+      }
+
+      if (batchRun == null && experiment == null && algorithm == null) return;
+
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+
+      if (algorithm != null) {
+        var problem = data as IProblem;
+        if (problem == null) return;
+        if (!algorithm.ProblemType.IsAssignableFrom(problem.GetType())) return;
+      } else if (batchRun != null) {
+        var optimizer = data as IOptimizer;
+        if (optimizer == null) return;
+        if (batchRun == optimizer) return;
+        if (optimizer.NestedOptimizers.Contains(batchRun)) return;
+      } //do not allow recursive nesting of contents
+      else if (experiment != null) {
+        var optimizer = data as IOptimizer;
+        IEnumerable<IOptimizer> optimizers = null;
+        var enumerable = data as IEnumerable;
+        if (enumerable != null) optimizers = enumerable.Cast<IOptimizer>();
+        if (experiment == optimizer) return;
+        if (optimizer != null && optimizer.NestedOptimizers.Contains(experiment)) return;
+        if (optimizers != null && optimizers.Any(x => x.NestedOptimizers.Contains(experiment))) return;
+      }
+
+      if ((e.KeyState & 32) == 32 && e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;  // ALT key
+      else if ((e.KeyState & 4) == 4 && e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;  // SHIFT key
+      else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+      else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+      else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+    }
+
+    private void optimizerTreeView_DragDrop(object sender, DragEventArgs e) {
+      Point coordinates = treeView.PointToClient(new Point(e.X, e.Y));
+      TreeNode node = treeView.GetNodeAt(coordinates);
+      Algorithm algorithm = null;
+      BatchRun batchRun = null;
+      Experiment experiment = null;
+
+      if (node == null) experiment = Content;
+      else {
+        algorithm = node.Tag as Algorithm;
+        batchRun = node.Tag as BatchRun;
+        experiment = node.Tag as Experiment;
+      }
+
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+      if (data is IProblem) {
+        var problem = (IProblem)data;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) problem = (IProblem)problem.Clone();
+        algorithm.Problem = problem;
+      } else if (data is IOptimizer) {
+        IOptimizer optimizer = (IOptimizer)data;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) optimizer = (IOptimizer)optimizer.Clone();
+        if (batchRun != null) batchRun.Optimizer = optimizer;
+        else if (experiment != null) experiment.Optimizers.Add(optimizer);
+        else throw new NotSupportedException("Handling for specific type not implemented" + node.Tag.GetType());
+      } else if (data is IEnumerable) {
+        IEnumerable<IOptimizer> optimizers = ((IEnumerable)data).Cast<IOptimizer>();
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+          Cloner cloner = new Cloner();
+          optimizers = optimizers.Select(o => cloner.Clone(o));
+        }
+        if (experiment != null) experiment.Optimizers.AddRange(optimizers);
+        else throw new NotSupportedException("Handling for specific type not implemented" + node.Tag.GetType());
+      }
+    }
+    #endregion
+
+    #region control events
+    private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
+      if (rightClickOccured) return;
+      if (e.X < e.Node.Bounds.Left || e.X > e.Node.Bounds.Right) return;
+      e.Node.Toggle();
+      IContent optimizer = (IContent)e.Node.Tag;
+      MainFormManager.MainForm.ShowContent(optimizer);
+    }
+    private void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
+      if (e.X < e.Node.Bounds.Left || e.X > e.Node.Bounds.Right) return;
+      treeView.SelectedNode = e.Node;
+      detailsViewHost.Content = (IContent)e.Node.Tag;
+      SetEnabledStateOfControls();
+    }
+    private void treeView_MouseDown(object sender, MouseEventArgs e) {
+      // enables deselection of treeNodes
+      if (e.Button != MouseButtons.Right) rightClickOccured = false;
+      if (treeView.SelectedNode == null) return;
+      Point coordinates = new Point(e.X, e.Y);
+      TreeNode node = treeView.GetNodeAt(coordinates);
+      if (node == null || coordinates.X < node.Bounds.Left || coordinates.X > node.Bounds.Right) {
+        treeView.SelectedNode = null;
+        detailsViewHost.Content = null;
+        SetEnabledStateOfControls();
+      }
+    }
+
+
+    private void treeView_KeyDown(object sender, KeyEventArgs e) {
+      if (Locked || ReadOnly) return;
+      if (treeView.SelectedNode == null) return;
+      if (!(treeView.SelectedNode.Tag is INamedItem)) return;
+
+      var treeNode = treeView.SelectedNode;
+      var namedItem = (NamedItem)treeNode.Tag;
+      var optimizer = namedItem as IOptimizer;
+
+      if (e.KeyCode == Keys.F2 && !treeNode.IsEditing) {
+        treeNode.BeginEdit();
+        return;
+      }
+
+      if (e.KeyCode == Keys.Delete && optimizer != null) {
+        if (treeNode.Parent == null)
+          Content.Optimizers.Remove(optimizer);
+        else {
+          var batchRun = treeNode.Parent.Tag as BatchRun;
+          var experiment = treeNode.Parent.Tag as Experiment;
+          if (batchRun != null) batchRun.Optimizer = null;
+          else if (experiment != null) experiment.Optimizers.Remove(optimizer);
+          else throw new NotSupportedException("Handling for specific type not implemented" + treeView.SelectedNode.Tag.GetType());
+        }
+        SetEnabledStateOfControls();
+        UpdateDetailsViewHost();
+        RebuildImageList();
+      }
+    }
+
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (e.Action == TreeViewAction.ByKeyboard) {
+        UpdateDetailsViewHost();
+        //NOTE: necessary because algorithm view steals the focus
+        treeView.Focus();
+      }
+    }
+
+    private bool rightClickOccured = true;
+    private TreeNode toolStripMenuNode = null;
+    private void treeView_RightClick(object sender, EventArgs e) {
+      rightClickOccured = true;
+      Point coordinates = treeView.PointToClient(Cursor.Position);
+      toolStripMenuNode = treeView.GetNodeAt(coordinates);
+
+      if (toolStripMenuNode != null && coordinates.X >= toolStripMenuNode.Bounds.Left && coordinates.X <= toolStripMenuNode.Bounds.Right) {
+        treeView.SelectedNode = toolStripMenuNode;
+        detailsViewHost.Content = (IContent)toolStripMenuNode.Tag;
+        SetEnabledStateOfControls();
+
+        ExpandToolStripMenuItem.Enabled = !toolStripMenuNode.IsExpanded && toolStripMenuNode.Nodes.Count > 0;
+        ExpandToolStripMenuItem.Visible = !toolStripMenuNode.IsExpanded && toolStripMenuNode.Nodes.Count > 0;
+        CollapseToolStripMenuItem.Enabled = toolStripMenuNode.IsExpanded;
+        CollapseToolStripMenuItem.Visible = toolStripMenuNode.IsExpanded;
+        EditNodeLabelToolStripMenuItem.Enabled = !Locked && !ReadOnly && toolStripMenuNode.Tag != null && toolStripMenuNode.Tag is INamedItem && ((INamedItem)toolStripMenuNode.Tag).CanChangeName;
+        EditNodeLabelToolStripMenuItem.Visible = !Locked && !ReadOnly && toolStripMenuNode.Tag != null && toolStripMenuNode.Tag is INamedItem && ((INamedItem)toolStripMenuNode.Tag).CanChangeName;
+        if (contextMenuStrip.Items.Cast<ToolStripMenuItem>().Any(item => item.Enabled))
+          contextMenuStrip.Show(Cursor.Position);
+      }
+    }
+
+    private void treeView_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) {
+      if (Locked) e.CancelEdit = true;
+      if (ReadOnly) e.CancelEdit = true;
+      if (e.Node.Tag == null) e.CancelEdit = true;
+      var namedItem = e.Node.Tag as INamedItem;
+      if (namedItem == null) e.CancelEdit = true;
+      else if (!namedItem.CanChangeName) e.CancelEdit = true;
+    }
+    private void treeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
+      if (e.Label == null) return;
+      e.Node.EndEdit(false);
+      var namedItem = (INamedItem)e.Node.Tag;
+      namedItem.Name = e.Label;
+    }
+
+    private void ExpandToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (toolStripMenuNode != null) toolStripMenuNode.ExpandAll();
+    }
+    private void CollapseToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (toolStripMenuNode != null) toolStripMenuNode.Collapse();
+    }
+    private void EditNodeLabelToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (toolStripMenuNode != null) {
+        if (!toolStripMenuNode.IsEditing) toolStripMenuNode.BeginEdit();
+      }
+    }
+
+    private void addButton_Click(object sender, System.EventArgs e) {
+      if (typeSelectorDialog == null) typeSelectorDialog = new TypeSelectorDialog();
+
+      IAlgorithm algorithm = null;
+      if (treeView.SelectedNode != null && (treeView.SelectedNode.Tag is IAlgorithm))
+        algorithm = (IAlgorithm)treeView.SelectedNode.Tag;
+
+      if (algorithm == null) {
+        typeSelectorDialog.Caption = "Select Optimizer";
+        typeSelectorDialog.TypeSelector.Caption = "Available Optimizers";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IOptimizer), false, true);
+      } else {
+        typeSelectorDialog.Caption = "Select Problem";
+        typeSelectorDialog.TypeSelector.Caption = "Available Problems";
+        typeSelectorDialog.TypeSelector.Configure(algorithm.ProblemType, false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (algorithm == null) {
+            IOptimizer optimizer = (IOptimizer)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+            if (treeView.SelectedNode == null) Content.Optimizers.Add(optimizer);
+            else {
+              var batchRun = treeView.SelectedNode.Tag as BatchRun;
+              var experiment = treeView.SelectedNode.Tag as Experiment;
+              if (batchRun != null) batchRun.Optimizer = optimizer;
+              else if (experiment != null) experiment.Optimizers.Add(optimizer);
+              else throw new NotSupportedException("Handling for specific type not implemented" + treeView.SelectedNode.Tag.GetType());
+            }
+          } else {
+            IProblem problem = (IProblem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+            algorithm.Problem = problem;
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+
+    private void moveUpButton_Click(object sender, EventArgs e) {
+      var optimizer = (IOptimizer)treeView.SelectedNode.Tag;
+      Experiment experiment = null;
+      if (treeView.SelectedNode.Parent == null) experiment = Content;
+      else experiment = (Experiment)treeView.SelectedNode.Parent.Tag;
+
+      var selectedNode = treeView.SelectedNode;
+      int index = treeView.SelectedNode.Index;
+      experiment.Optimizers.Reverse(index - 1, 2);
+      treeView.SelectedNode = selectedNode;
+      SetEnabledStateOfControls();
+    }
+    private void moveDownButton_Click(object sender, EventArgs e) {
+      var optimizer = (IOptimizer)treeView.SelectedNode.Tag;
+      Experiment experiment = null;
+      if (treeView.SelectedNode.Parent == null) experiment = Content;
+      else experiment = (Experiment)treeView.SelectedNode.Parent.Tag;
+
+      var selectedNode = treeView.SelectedNode;
+      int index = treeView.SelectedNode.Index;
+      experiment.Optimizers.Reverse(index, 2);
+      treeView.SelectedNode = selectedNode;
+      SetEnabledStateOfControls();
+    }
+
+    private void removeButton_Click(object sender, EventArgs e) {
+      var treeNode = treeView.SelectedNode;
+      var optimizer = treeNode.Tag as IOptimizer;
+
+      if (treeNode.Parent == null)
+        Content.Optimizers.Remove(optimizer);
+      else {
+        var batchRun = treeNode.Parent.Tag as BatchRun;
+        var experiment = treeNode.Parent.Tag as Experiment;
+        if (batchRun != null) batchRun.Optimizer = null;
+        else if (experiment != null) experiment.Optimizers.Remove(optimizer);
+        else throw new NotSupportedException("Handling for specific type not implemented" + treeView.SelectedNode.Tag.GetType());
+      }
+      SetEnabledStateOfControls();
+      UpdateDetailsViewHost();
+      RebuildImageList();
+    }
+
+    private void showDetailsCheckBox_CheckedChanged(object sender, System.EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = treeView.SelectedNode != null;
+        detailsViewHost.Content = treeView.SelectedNode != null ? (IContent)treeView.SelectedNode.Tag : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        detailsViewHost.Content = null;
+      }
+    }
+    #endregion
+
+    #region helpers
+    private void UpdateDetailsViewHost() {
+      if (treeView.SelectedNode != null)
+        detailsViewHost.Content = (IContent)treeView.SelectedNode.Tag;
+      else
+        detailsViewHost.Content = null;
+    }
+
+    private TreeNode CreateTreeNode(IOptimizer optimizer) {
+      TreeNode node = new TreeNode(optimizer.ToString());
+      node.Tag = optimizer;
+
+      var algorithm = optimizer as IAlgorithm;
+      if (algorithm != null) {
+        foreach (TreeNode childNode in CreateAlgorithmChildNodes(algorithm))
+          node.Nodes.Add(childNode);
+      }
+
+      List<TreeNode> nodes;
+      if (!treeNodeTagMapping.TryGetValue(optimizer, out nodes)) {
+        nodes = new List<TreeNode>();
+        treeNodeTagMapping.Add(optimizer, nodes);
+        RegisterNamedItemEvents(optimizer);
+      }
+      nodes.Add(node);
+
+      foreach (TreeNode childNode in node.Nodes) {
+        NamedItem namedItem = childNode.Tag as NamedItem;
+        if (namedItem != null) {
+          if (!treeNodeTagMapping.TryGetValue(namedItem, out nodes)) {
+            nodes = new List<TreeNode>();
+            treeNodeTagMapping.Add(namedItem, nodes);
+            RegisterNamedItemEvents(namedItem);
+          }
+          nodes.Add(childNode);
+        }
+      }
+      return node;
+    }
+
+    private IEnumerable<TreeNode> CreateAlgorithmChildNodes(IAlgorithm algorithm) {
+      TreeNode problemNode;
+      if (algorithm.Problem != null) {
+        problemNode = new TreeNode(algorithm.Problem.Name);
+        problemNode.Tag = algorithm.Problem;
+      } else {
+        problemNode = new TreeNode("No Problem");
+        problemNode.Tag = null;
+      }
+      TreeNode parametersNode = new TreeNode("Parameters");
+      parametersNode.Tag = algorithm.Parameters;
+      TreeNode resultsNode = new TreeNode("Results");
+      resultsNode.Tag = algorithm.Results;
+
+      yield return problemNode;
+      yield return parametersNode;
+      yield return resultsNode;
+    }
+
+    private void DisposeTreeNode(TreeNode node) {
+      var namedItem = node.Tag as INamedItem;
+      if (namedItem == null) return;
+
+      List<TreeNode> nodes;
+      if (!treeNodeTagMapping.TryGetValue(namedItem, out nodes))
+        throw new ArgumentException();
+      nodes.Remove(node);
+      if (nodes.Count == 0) {
+        treeNodeTagMapping.Remove(namedItem);
+        DeregisterNamedItemEvents(namedItem);
+      }
+    }
+
+    private IEnumerable<TreeNode> IterateTreeNodes(TreeNode node = null) {
+      TreeNodeCollection nodes;
+      if (node == null)
+        nodes = treeView.Nodes;
+      else {
+        nodes = node.Nodes;
+        yield return node;
+      }
+
+      foreach (var childNode in nodes.OfType<TreeNode>())
+        foreach (var n in IterateTreeNodes(childNode))
+          yield return n;
+    }
+
+    private void RebuildImageList() {
+      if (InvokeRequired) {
+        Invoke((Action)RebuildImageList);
+        return;
+      }
+
+      treeView.BeginUpdate();
+
+      treeView.ImageList.Images.Clear();
+      var topLevelNodes = treeView.Nodes.OfType<TreeNode>().ToArray();
+      var nodes = IterateTreeNodes().ToList();
+      var selectedNode = treeView.SelectedNode;
+      treeView.Nodes.Clear();
+
+      foreach (TreeNode treeNode in nodes) {
+        var item = (IItem)treeNode.Tag;
+        treeView.ImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
+        treeNode.ImageIndex = treeView.ImageList.Images.Count - 1;
+        treeNode.SelectedImageIndex = treeNode.ImageIndex;
+      }
+      treeView.Nodes.AddRange(topLevelNodes);
+      treeView.SelectedNode = selectedNode;
+      treeView.EndUpdate();
+    }
+    #endregion
+
+
+    public sealed class CustomTreeView : System.Windows.Forms.TreeView {
+      protected override void WndProc(ref System.Windows.Forms.Message m) {
+        const int WM_RBUTTONDOWN = 0x204;
+        if (m.Msg == WM_RBUTTONDOWN) {
+          //Raise your custom event right click event to prevent node highlighting
+          OnRightClick();
+          return;
+        }
+        base.WndProc(ref m);
+      }
+
+      public event EventHandler RightClick;
+      private void OnRightClick() {
+        var handler = RightClick;
+        if (handler != null) RightClick(this, EventArgs.Empty);
+      }
+    }
+  }
+}
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentView.Designer.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentView.Designer.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentView.Designer.cs	(revision 6618)
@@ -47,13 +47,7 @@
       this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
       this.optimizersTabPage = new System.Windows.Forms.TabPage();
-      this.optimizerListView = new HeuristicLab.Optimization.Views.OptimizerListView();
       this.runsTabPage = new System.Windows.Forms.TabPage();
       this.runsViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.startButton = new System.Windows.Forms.Button();
-      this.stopButton = new System.Windows.Forms.Button();
-      this.resetButton = new System.Windows.Forms.Button();
-      this.executionTimeLabel = new System.Windows.Forms.Label();
-      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
-      this.pauseButton = new System.Windows.Forms.Button();
+      this.experimentTreeView = new HeuristicLab.Optimization.Views.ExperimentTreeView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -61,4 +55,32 @@
       this.runsTabPage.SuspendLayout();
       this.SuspendLayout();
+      // 
+      // startButton
+      // 
+      this.startButton.Location = new System.Drawing.Point(0, 458);
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 461);
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Location = new System.Drawing.Point(453, 464);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Location = new System.Drawing.Point(30, 458);
+      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+      // 
+      // stopButton
+      // 
+      this.stopButton.Location = new System.Drawing.Point(60, 458);
+      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+      // 
+      // resetButton
+      // 
+      this.resetButton.Location = new System.Drawing.Point(90, 458);
+      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
       // 
       // nameTextBox
@@ -76,7 +98,7 @@
       // 
       this.tabControl.AllowDrop = true;
-      this.tabControl.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.tabControl.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.tabControl.Controls.Add(this.optimizersTabPage);
       this.tabControl.Controls.Add(this.runsTabPage);
@@ -84,30 +106,17 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(679, 426);
+      this.tabControl.Size = new System.Drawing.Size(679, 427);
       this.tabControl.TabIndex = 3;
       // 
       // optimizersTabPage
       // 
-      this.optimizersTabPage.Controls.Add(this.optimizerListView);
+      this.optimizersTabPage.Controls.Add(this.experimentTreeView);
       this.optimizersTabPage.Location = new System.Drawing.Point(4, 22);
       this.optimizersTabPage.Name = "optimizersTabPage";
       this.optimizersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.optimizersTabPage.Size = new System.Drawing.Size(671, 400);
+      this.optimizersTabPage.Size = new System.Drawing.Size(671, 401);
       this.optimizersTabPage.TabIndex = 1;
       this.optimizersTabPage.Text = "Optimizers";
       this.optimizersTabPage.UseVisualStyleBackColor = true;
-      // 
-      // optimizerListView
-      // 
-      this.optimizerListView.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.optimizerListView.Caption = "OptimizerList View";
-      this.optimizerListView.Content = null;
-      this.optimizerListView.Location = new System.Drawing.Point(6, 6);
-      this.optimizerListView.Name = "optimizerListView";
-      this.optimizerListView.ReadOnly = false;
-      this.optimizerListView.Size = new System.Drawing.Size(659, 388);
-      this.optimizerListView.TabIndex = 0;
       // 
       // runsTabPage
@@ -117,5 +126,5 @@
       this.runsTabPage.Name = "runsTabPage";
       this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.runsTabPage.Size = new System.Drawing.Size(671, 400);
+      this.runsTabPage.Size = new System.Drawing.Size(671, 401);
       this.runsTabPage.TabIndex = 2;
       this.runsTabPage.Text = "Runs";
@@ -124,7 +133,7 @@
       // runsViewHost
       // 
-      this.runsViewHost.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.runsViewHost.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.runsViewHost.Caption = "View";
       this.runsViewHost.Content = null;
@@ -133,75 +142,19 @@
       this.runsViewHost.Name = "runsViewHost";
       this.runsViewHost.ReadOnly = false;
-      this.runsViewHost.Size = new System.Drawing.Size(663, 388);
+      this.runsViewHost.Size = new System.Drawing.Size(657, 389);
       this.runsViewHost.TabIndex = 0;
       this.runsViewHost.ViewsLabelVisible = true;
       this.runsViewHost.ViewType = null;
       // 
-      // startButton
+      // experimentTreeView
       // 
-      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
-      this.startButton.Location = new System.Drawing.Point(0, 458);
-      this.startButton.Name = "startButton";
-      this.startButton.Size = new System.Drawing.Size(24, 24);
-      this.startButton.TabIndex = 4;
-      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
-      this.startButton.UseVisualStyleBackColor = true;
-      this.startButton.Click += new System.EventHandler(this.startButton_Click);
-      // 
-      // stopButton
-      // 
-      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
-      this.stopButton.Location = new System.Drawing.Point(60, 458);
-      this.stopButton.Name = "stopButton";
-      this.stopButton.Size = new System.Drawing.Size(24, 24);
-      this.stopButton.TabIndex = 6;
-      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
-      this.stopButton.UseVisualStyleBackColor = true;
-      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-      // 
-      // resetButton
-      // 
-      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.resetButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Restart;
-      this.resetButton.Location = new System.Drawing.Point(90, 458);
-      this.resetButton.Name = "resetButton";
-      this.resetButton.Size = new System.Drawing.Size(24, 24);
-      this.resetButton.TabIndex = 7;
-      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
-      this.resetButton.UseVisualStyleBackColor = true;
-      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
-      // 
-      // executionTimeLabel
-      // 
-      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeLabel.AutoSize = true;
-      this.executionTimeLabel.Location = new System.Drawing.Point(453, 465);
-      this.executionTimeLabel.Name = "executionTimeLabel";
-      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
-      this.executionTimeLabel.TabIndex = 8;
-      this.executionTimeLabel.Text = "&Execution Time:";
-      // 
-      // executionTimeTextBox
-      // 
-      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.executionTimeTextBox.Location = new System.Drawing.Point(542, 462);
-      this.executionTimeTextBox.Name = "executionTimeTextBox";
-      this.executionTimeTextBox.ReadOnly = true;
-      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
-      this.executionTimeTextBox.TabIndex = 9;
-      // 
-      // pauseButton
-      // 
-      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.pauseButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Pause;
-      this.pauseButton.Location = new System.Drawing.Point(30, 458);
-      this.pauseButton.Name = "pauseButton";
-      this.pauseButton.Size = new System.Drawing.Size(24, 24);
-      this.pauseButton.TabIndex = 5;
-      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
-      this.pauseButton.UseVisualStyleBackColor = true;
-      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      this.experimentTreeView.Caption = "Experiment View";
+      this.experimentTreeView.Content = null;
+      this.experimentTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.experimentTreeView.Location = new System.Drawing.Point(3, 3);
+      this.experimentTreeView.Name = "experimentTreeView";
+      this.experimentTreeView.ReadOnly = false;
+      this.experimentTreeView.Size = new System.Drawing.Size(665, 395);
+      this.experimentTreeView.TabIndex = 0;
       // 
       // ExperimentView
@@ -210,20 +163,14 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Controls.Add(this.tabControl);
-      this.Controls.Add(this.startButton);
-      this.Controls.Add(this.executionTimeTextBox);
-      this.Controls.Add(this.executionTimeLabel);
-      this.Controls.Add(this.pauseButton);
-      this.Controls.Add(this.stopButton);
-      this.Controls.Add(this.resetButton);
       this.Name = "ExperimentView";
       this.Size = new System.Drawing.Size(679, 482);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.resetButton, 0);
       this.Controls.SetChildIndex(this.stopButton, 0);
       this.Controls.SetChildIndex(this.pauseButton, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
       this.Controls.SetChildIndex(this.executionTimeLabel, 0);
       this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
       this.Controls.SetChildIndex(this.startButton, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -240,13 +187,7 @@
     private HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl;
     private System.Windows.Forms.TabPage optimizersTabPage;
-    private System.Windows.Forms.Button startButton;
-    private System.Windows.Forms.Button stopButton;
-    private System.Windows.Forms.Button resetButton;
-    private System.Windows.Forms.Label executionTimeLabel;
-    private System.Windows.Forms.TextBox executionTimeTextBox;
-    private System.Windows.Forms.Button pauseButton;
-    private OptimizerListView optimizerListView;
     private System.Windows.Forms.TabPage runsTabPage;
     private HeuristicLab.MainForm.WindowsForms.ViewHost runsViewHost;
+    private ExperimentTreeView experimentTreeView;
 
   }
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentView.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ExperimentView.cs	(revision 6618)
@@ -20,20 +20,17 @@
 #endregion
 
-using System;
 using System.Linq;
 using System.Windows.Forms;
-using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
-using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Optimization.Views {
-  /// <summary>
-  /// The base class for visual representations of items.
-  /// </summary>
   [View("Experiment View")]
   [Content(typeof(Experiment), true)]
-  public sealed partial class ExperimentView : NamedItemView {
+  public sealed partial class ExperimentView : IOptimizerView {
+    public ExperimentView() {
+      InitializeComponent();
+    }
+
     public new Experiment Content {
       get { return (Experiment)base.Content; }
@@ -41,43 +38,12 @@
     }
 
-    /// <summary>
-    /// Initializes a new instance of <see cref="ItemBaseView"/>.
-    /// </summary>
-    public ExperimentView() {
-      InitializeComponent();
-    }
-
-    protected override void DeregisterContentEvents() {
-      Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
-      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
-      Content.Prepared -= new EventHandler(Content_Prepared);
-      Content.Started -= new EventHandler(Content_Started);
-      Content.Paused -= new EventHandler(Content_Paused);
-      Content.Stopped -= new EventHandler(Content_Stopped);
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
-      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
-      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
-      Content.Prepared += new EventHandler(Content_Prepared);
-      Content.Started += new EventHandler(Content_Started);
-      Content.Paused += new EventHandler(Content_Paused);
-      Content.Stopped += new EventHandler(Content_Stopped);
-    }
-
     protected override void OnContentChanged() {
       base.OnContentChanged();
       if (Content == null) {
-        optimizerListView.Content = null;
+        experimentTreeView.Content = null;
         runsViewHost.Content = null;
-        executionTimeTextBox.Text = "-";
       } else {
-        Locked = ReadOnly = Content.ExecutionState == ExecutionState.Started;
-        optimizerListView.Content = Content.Optimizers;
+        experimentTreeView.Content = Content;
         runsViewHost.Content = Content.Runs;
-        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
       }
     }
@@ -85,8 +51,6 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      optimizerListView.Enabled = Content != null;
+      experimentTreeView.Enabled = Content != null;
       runsViewHost.Enabled = Content != null;
-      executionTimeTextBox.Enabled = Content != null;
-      SetEnabledStateOfExecutableButtons();
     }
 
@@ -102,89 +66,4 @@
       base.OnClosed(e);
     }
-
-    #region Content Events
-    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
-      else
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-    }
-    private void Content_Prepared(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Prepared), sender, e);
-      else {
-        nameTextBox.Enabled = infoLabel.Enabled = true;
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_Started(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Started), sender, e);
-      else {
-        nameTextBox.Enabled = infoLabel.Enabled = false;
-        ReadOnly = Locked = true;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_Paused(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Paused), sender, e);
-      else {
-        nameTextBox.Enabled = infoLabel.Enabled = true;
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_Stopped(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Stopped), sender, e);
-      else {
-        nameTextBox.Enabled = infoLabel.Enabled = true;
-        ReadOnly = Locked = false;
-        SetEnabledStateOfExecutableButtons();
-      }
-    }
-    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
-      else
-        executionTimeTextBox.Text = Content == null ? "-" : Content.ExecutionTime.ToString();
-    }
-    private void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
-      else
-        ErrorHandling.ShowErrorDialog(this, e.Value);
-    }
-    #endregion
-
-    #region Control events
-    private void startButton_Click(object sender, EventArgs e) {
-      Content.Start();
-    }
-    private void pauseButton_Click(object sender, EventArgs e) {
-      Content.Pause();
-    }
-    private void stopButton_Click(object sender, EventArgs e) {
-      Content.Stop();
-    }
-    private void resetButton_Click(object sender, EventArgs e) {
-      Content.Prepare(false);
-    }
-    #endregion
-
-    #region Helpers
-    private void SetEnabledStateOfExecutableButtons() {
-      if (Content == null) {
-        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
-      } else {
-        startButton.Enabled = (Content.ExecutionState == ExecutionState.Prepared) || (Content.ExecutionState == ExecutionState.Paused);
-        pauseButton.Enabled = Content.ExecutionState == ExecutionState.Started;
-        stopButton.Enabled = (Content.ExecutionState == ExecutionState.Started) || (Content.ExecutionState == ExecutionState.Paused);
-        resetButton.Enabled = Content.ExecutionState != ExecutionState.Started;
-      }
-    }
-    #endregion
   }
 }
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 6618)
@@ -69,5 +69,6 @@
     <OutputPath>bin\x86\Release\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>bin\x86\Release\HeuristicLab.Optimization.Views-3.3.XML</DocumentationFile>
+    <DocumentationFile>
+    </DocumentationFile>
     <Optimize>true</Optimize>
     <DebugType>pdbonly</DebugType>
@@ -127,4 +128,16 @@
       <DependentUpon>BatchRunView.cs</DependentUpon>
     </Compile>
+    <Compile Include="ExperimentTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExperimentTreeView.Designer.cs">
+      <DependentUpon>ExperimentTreeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IOptimizerView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IOptimizerView.Designer.cs">
+      <DependentUpon>IOptimizerView.cs</DependentUpon>
+    </Compile>
     <Compile Include="ResultValueView.cs">
       <SubType>UserControl</SubType>
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame	(revision 6618)
@@ -26,5 +26,5 @@
   /// Plugin class for HeuristicLab.Optimization.Views plugin.
   /// </summary>
-  [Plugin("HeuristicLab.Optimization.Views", "3.3.4.$WCREV$")]
+  [Plugin("HeuristicLab.Optimization.Views", "3.3.5.$WCREV$")]
   [PluginFile("HeuristicLab.Optimization.Views-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/IOptimizerView.Designer.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/IOptimizerView.Designer.cs	(revision 6618)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/IOptimizerView.Designer.cs	(revision 6618)
@@ -0,0 +1,171 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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 IOptimizerView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IOptimizerView));
+      this.startButton = new System.Windows.Forms.Button();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(349, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(413, 3);
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.startButton.Location = new System.Drawing.Point(0, 205);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(24, 24);
+      this.startButton.TabIndex = 10;
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(295, 209);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
+      this.executionTimeTextBox.TabIndex = 15;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(206, 212);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 14;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Pause;
+      this.pauseButton.Location = new System.Drawing.Point(30, 205);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 11;
+      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.stopButton.Location = new System.Drawing.Point(60, 205);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Restart;
+      this.resetButton.Location = new System.Drawing.Point(90, 205);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(24, 24);
+      this.resetButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // IOptimizerView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.pauseButton);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.resetButton);
+      this.Name = "IOptimizerView";
+      this.Size = new System.Drawing.Size(432, 229);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.pauseButton, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button startButton;
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected System.Windows.Forms.Button pauseButton;
+    protected System.Windows.Forms.Button stopButton;
+    protected System.Windows.Forms.Button resetButton;
+
+  }
+}
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/IOptimizerView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/IOptimizerView.cs	(revision 6618)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/IOptimizerView.cs	(revision 6618)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("IOptimizer View")]
+  [Content(typeof(IOptimizer), false)]
+  public partial class IOptimizerView : NamedItemView {
+    public IOptimizerView() {
+      InitializeComponent();
+    }
+
+    public new IOptimizer Content {
+      get { return (IOptimizer)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
+      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
+      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      Content.Prepared -= new EventHandler(Content_Prepared);
+      Content.Started -= new EventHandler(Content_Started);
+      Content.Paused -= new EventHandler(Content_Paused);
+      Content.Stopped -= new EventHandler(Content_Stopped);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
+      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+      Content.Prepared += new EventHandler(Content_Prepared);
+      Content.Started += new EventHandler(Content_Started);
+      Content.Paused += new EventHandler(Content_Paused);
+      Content.Stopped += new EventHandler(Content_Stopped);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        executionTimeTextBox.Text = "-";
+      } else {
+        Locked = ReadOnly = Content.ExecutionState == ExecutionState.Started;
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      executionTimeTextBox.Enabled = Content != null;
+      SetEnabledStateOfExecutableButtons();
+    }
+
+    #region Content Events
+    protected virtual void Content_ExecutionStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
+      else
+        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
+    }
+    protected virtual void Content_Prepared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Prepared), sender, e);
+      else {
+        nameTextBox.Enabled = infoLabel.Enabled = true;
+        ReadOnly = Locked = false;
+        SetEnabledStateOfExecutableButtons();
+      }
+    }
+    protected virtual void Content_Started(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Started), sender, e);
+      else {
+        nameTextBox.Enabled = infoLabel.Enabled = false;
+        ReadOnly = Locked = true;
+        SetEnabledStateOfExecutableButtons();
+      }
+    }
+    protected virtual void Content_Paused(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Paused), sender, e);
+      else {
+        nameTextBox.Enabled = infoLabel.Enabled = true;
+        ReadOnly = Locked = false;
+        SetEnabledStateOfExecutableButtons();
+      }
+    }
+    protected virtual void Content_Stopped(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Stopped), sender, e);
+      else {
+        nameTextBox.Enabled = infoLabel.Enabled = true;
+        ReadOnly = Locked = false;
+        SetEnabledStateOfExecutableButtons();
+      }
+    }
+    protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+      else
+        executionTimeTextBox.Text = Content == null ? "-" : Content.ExecutionTime.ToString();
+    }
+    protected virtual void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
+      else
+        ErrorHandling.ShowErrorDialog(this, e.Value);
+    }
+    #endregion
+
+    #region Control events
+    protected virtual void startButton_Click(object sender, EventArgs e) {
+      Content.Start();
+    }
+    protected virtual void pauseButton_Click(object sender, EventArgs e) {
+      Content.Pause();
+    }
+    protected virtual void stopButton_Click(object sender, EventArgs e) {
+      Content.Stop();
+    }
+    protected virtual void resetButton_Click(object sender, EventArgs e) {
+      Content.Prepare(false);
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void SetEnabledStateOfExecutableButtons() {
+      if (Content == null) {
+        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
+      } else {
+        startButton.Enabled = (Content.ExecutionState == ExecutionState.Prepared) || (Content.ExecutionState == ExecutionState.Paused);
+        pauseButton.Enabled = Content.ExecutionState == ExecutionState.Started;
+        stopButton.Enabled = (Content.ExecutionState == ExecutionState.Started) || (Content.ExecutionState == ExecutionState.Paused);
+        resetButton.Enabled = Content.ExecutionState != ExecutionState.Started;
+      }
+    }
+    #endregion
+  }
+}
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/Properties/AssemblyInfo.frame
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/Properties/AssemblyInfo.frame	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/Properties/AssemblyInfo.frame	(revision 6618)
@@ -54,3 +54,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.4.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.5.$WCREV$")]
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/ResultCollectionView.cs	(revision 6618)
@@ -34,7 +34,5 @@
       set { /*not needed because results are always readonly */}
     }
-    /// <summary>
-    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
-    /// </summary>
+
     public ResultCollectionView() {
       InitializeComponent();
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.Designer.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.Designer.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.Designer.cs	(revision 6618)
@@ -274,5 +274,5 @@
       this.colorXAxisButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.colorXAxisButton.Enabled = false;
-      this.colorXAxisButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.DisplayInColor;
+      this.colorXAxisButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.DisplayInColorVertical;
       this.colorXAxisButton.Location = new System.Drawing.Point(719, 469);
       this.colorXAxisButton.Name = "colorXAxisButton";
Index: branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs
===================================================================
--- branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 6284)
+++ branches/GP.Grammar.Editor/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 6618)
@@ -27,4 +27,5 @@
 using System.Windows.Forms;
 using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
@@ -314,6 +315,10 @@
         } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
           IEnumerable<IRun> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<IRun>();
+          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+            Cloner cloner = new Cloner();
+            items = items.Select(x => cloner.Clone(x));
+          }
           foreach (IRun item in items)
-            Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (IRun)item.Clone() : item);
+            Content.Add(item);
         }
       }
