Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 8331)
@@ -31,4 +31,5 @@
   [Content(typeof(OptimizerHiveTask), true)]
   public partial class OptimizerHiveTaskView : HiveTaskView {
+    private Progress progress;
     private ProgressView progressView;
 
@@ -44,4 +45,8 @@
     public OptimizerHiveTaskView() {
       InitializeComponent();
+      progress = new Progress() {
+        CanBeCanceled = false,
+        ProgressState = ProgressState.Finished
+      };
     }
 
@@ -57,8 +62,14 @@
       base.RegisterContentEvents();
       Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
+      progressView = new ProgressView(this, progress);
     }
 
     protected override void DeregisterContentEvents() {
       Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
+      if (progressView != null) {
+        progressView.Content = null;
+        progressView.Dispose();
+        progressView = null;
+      }
       base.DeregisterContentEvents();
     }
@@ -74,5 +85,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeTaskAsync);
       task.ContinueWith((t) => {
-        FinishProgressView();
+        progress.Finish();
         ErrorHandling.ShowErrorDialog(this, "An error occured while resuming the task.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -82,5 +93,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(PauseTaskAsync);
       task.ContinueWith((t) => {
-        FinishProgressView();
+        progress.Finish();
         ErrorHandling.ShowErrorDialog(this, "An error occured while pausing the task.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -90,5 +101,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(StopTaskAsync);
       task.ContinueWith((t) => {
-        FinishProgressView();
+        progress.Finish();
         ErrorHandling.ShowErrorDialog(this, "An error occured while stopping the task.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -97,49 +108,22 @@
 
     private void PauseTaskAsync() {
-      IProgress prog = new Progress();
-      prog.Status = "Pausing task. Please be patient for the command to take effect.";
-      SetProgressView(prog);
+      progress.Status = "Pausing task. Please be patient for the command to take effect.";
+      progress.ProgressState = ProgressState.Started;
       Content.Pause();
-      FinishProgressView();
+      progress.Finish();
     }
 
     private void StopTaskAsync() {
-      IProgress prog = new Progress();
-      prog.Status = "Stopping task. Please be patient for the command to take effect.";
-      SetProgressView(prog);
+      progress.Status = "Stopping task. Please be patient for the command to take effect.";
+      progress.ProgressState = ProgressState.Started;
       Content.Stop();
-      FinishProgressView();
+      progress.Finish();
     }
 
     private void ResumeTaskAsync() {
-      IProgress prog = new Progress();
-      prog.Status = "Resuming task. Please be patient for the command to take effect.";
-      SetProgressView(prog);
+      progress.Status = "Resuming task. Please be patient for the command to take effect.";
+      progress.ProgressState = ProgressState.Started;
       Content.Restart();
-      FinishProgressView();
-    }
-
-    private void SetProgressView(IProgress progress) {
-      if (InvokeRequired) {
-        Invoke(new Action<IProgress>(SetProgressView), progress);
-      } else {
-        if (progressView == null) {
-          progressView = new ProgressView(this, progress);
-        } else {
-          progressView.Progress = progress;
-        }
-      }
-    }
-
-    private void FinishProgressView() {
-      if (InvokeRequired) {
-        Invoke(new Action(FinishProgressView));
-      } else {
-        if (progressView != null) {
-          progressView.Finish();
-          progressView = null;
-          SetEnabledStateOfControls();
-        }
-      }
+      progress.Finish();
     }
 
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/Plugin.cs.frame
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/Plugin.cs.frame	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/Plugin.cs.frame	(revision 8331)
@@ -27,5 +27,5 @@
 
 namespace HeuristicLab.Clients.Hive.Views {
-  [Plugin("HeuristicLab.Clients.Hive.Views", "3.3.6.$WCREV$")]
+  [Plugin("HeuristicLab.Clients.Hive.Views", "3.3.7.$WCREV$")]
   [PluginFile("HeuristicLab.Clients.Hive.Views-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Clients.Hive", "3.3")]
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8331)
@@ -55,3 +55,3 @@
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.7.$WCREV$")]
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/StateLog/StateLogGanttChartListView.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/StateLog/StateLogGanttChartListView.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/StateLog/StateLogGanttChartListView.cs	(revision 8331)
@@ -21,6 +21,9 @@
 
 using System;
+using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
@@ -31,4 +34,6 @@
   [Content(typeof(StateLogListList), true)]
   public sealed partial class StateLogGanttChartListView : ItemView {
+    private IList<LegendItem> invisibleLegendItems;
+
     public new StateLogListList Content {
       get { return (StateLogListList)base.Content; }
@@ -38,8 +43,12 @@
     public StateLogGanttChartListView() {
       InitializeComponent();
+      invisibleLegendItems = new List<LegendItem>();
     }
 
     protected override void DeregisterContentEvents() {
       // Deregister your event handlers here
+      ganttChart.chart.MouseMove -= new System.Windows.Forms.MouseEventHandler(chart_MouseDown);
+      ganttChart.chart.MouseDown -= new System.Windows.Forms.MouseEventHandler(chart_MouseDown);
+      ganttChart.chart.CustomizeLegend -= new EventHandler<CustomizeLegendEventArgs>(chart_CustomizeLegend);
       base.DeregisterContentEvents();
     }
@@ -48,4 +57,7 @@
       base.RegisterContentEvents();
       // Register your event handlers here
+      ganttChart.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(chart_MouseMove);
+      ganttChart.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(chart_MouseDown);
+      ganttChart.chart.CustomizeLegend += new EventHandler<CustomizeLegendEventArgs>(chart_CustomizeLegend);
     }
 
@@ -75,8 +87,8 @@
           for (int i = Content.Count - 1; i >= 0; i--) {
             for (int j = 0; j < Content[i].Count - 1; j++) {
-              if (Content[i][j].State != TaskState.Offline)
+              if (Content[i][j].State != TaskState.Offline && invisibleLegendItems.All(x => x.Name != Content[i][j].State.ToString()))
                 AddData(ganttChart, i.ToString(), Content[i][j], Content[i][j + 1], upperLimit);
             }
-            if (Content[i].Count > 0) {
+            if (Content[i].Count > 0 && invisibleLegendItems.All(x => x.Name != Content[i][Content[i].Count - 1].State.ToString())) {
               AddData(ganttChart, i.ToString(), Content[i][Content[i].Count - 1], null, upperLimit);
             }
@@ -113,4 +125,36 @@
       base.SetEnabledStateOfControls();
     }
+
+    #region Events
+    void chart_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
+      HitTestResult result = ganttChart.chart.HitTest(e.X, e.Y);
+      if (result.ChartElementType == ChartElementType.LegendItem)
+        Cursor = Cursors.Hand;
+      else
+        Cursor = Cursors.Default;
+    }
+
+    private void chart_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
+      HitTestResult result = ganttChart.chart.HitTest(e.X, e.Y);
+      if (result.ChartElementType == ChartElementType.LegendItem)
+        ToggleLegendItemVisibility(result.Object as LegendItem);
+      ganttChart.Reset();
+      OnContentChanged();
+    }
+
+    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
+      foreach (var item in e.LegendItems)
+        foreach (var cell in item.Cells)
+          cell.ForeColor = invisibleLegendItems.Any(x => x.Name == item.Name) ? Color.Gray : Color.Black;
+    }
+    #endregion
+
+    #region Helpers
+    private void ToggleLegendItemVisibility(LegendItem legendItem) {
+      var item = invisibleLegendItems.FirstOrDefault(x => x.Name == legendItem.Name);
+      if (item != null) invisibleLegendItems.Remove(item);
+      else invisibleLegendItems.Add(legendItem);
+    }
+    #endregion
   }
 }
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/TreeView/HiveTaskItemTreeView.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/TreeView/HiveTaskItemTreeView.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/TreeView/HiveTaskItemTreeView.cs	(revision 8331)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
 using System.Windows.Forms;
@@ -42,35 +41,5 @@
     }
 
-    #region Register Content Events
-    protected override void DeregisterContentEvents() {
-      // TODO: Deregister your event handlers on the Content here
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      // TODO: Register your event handlers on the Content here
-    }
-    #endregion
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        // TODO: Put code here when content is null
-      } else {
-        // TODO: Put code here when content has been changed and is not null
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      // TODO: Put code here to enable or disable controls based on whether the Content is/not null or the view is ReadOnly
-    }
-
-    #region Event Handlers
-    // TODO: Put event handlers here
-    #endregion
-
-    #region Child Control Events
-    protected override void addButton_Click(object sender, EventArgs e) {
+    protected override void AddItem() {
       IOptimizer optimizer = CreateItem<IOptimizer>();
       if (optimizer != null) {
@@ -88,21 +57,15 @@
     }
 
-    protected override void removeButton_Click(object sender, EventArgs e) {
-      base.removeButton_Click(sender, e);
-
-      if (treeView.SelectedNode != null) {
-        var selectedItem = (HiveTask)treeView.SelectedNode.Tag;
-        var parentItem = GetParentItem(selectedItem);
-        if (parentItem == null) {
-          Content.Remove((HiveTask)treeView.SelectedNode.Tag);
-        } else {
-          var experiment = parentItem.ItemTask.Item as Experiment;
-          if (experiment != null) {
-            experiment.Optimizers.Remove(((OptimizerTask)selectedItem.ItemTask).Item);
-          }
+    protected override void RemoveItem(HiveTask item) {
+      var parentItem = GetParentItem(item);
+      if (parentItem == null) {
+        Content.Remove(item);
+      } else {
+        var experiment = parentItem.ItemTask.Item as Experiment;
+        if (experiment != null) {
+          experiment.Optimizers.Remove(((OptimizerTask)item.ItemTask).Item);
         }
       }
     }
-    #endregion
 
     protected override ICollection<IItemTreeNodeAction<HiveTask>> GetTreeNodeItemActions(HiveTask selectedItem) {
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/TreeView/ItemTreeView.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/TreeView/ItemTreeView.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Clients.Hive.Views/3.3/TreeView/ItemTreeView.cs	(revision 8331)
@@ -36,5 +36,5 @@
   [View("ItemTree View")]
   [Content(typeof(ItemCollection<>), IsDefaultView = false)]
-  public partial class ItemTreeView<T> : ItemView where T : class, IItemTree<T> {
+  public abstract partial class ItemTreeView<T> : ItemView where T : class, IItemTree<T> {
     public new ItemCollection<T> Content {
       get { return (ItemCollection<T>)base.Content; }
@@ -360,14 +360,17 @@
 
     protected virtual void addButton_Click(object sender, EventArgs e) {
-      T item = CreateItem<T>();
-      if (item != null)
-        Content.Add(item);
+      AddItem();
     }
 
     protected virtual void removeButton_Click(object sender, EventArgs e) {
       if (treeView.SelectedNode != null) {
+        RemoveItem(treeView.SelectedNode.Tag as T);
         detailsViewHost.Content = null;
       }
     }
+
+    protected abstract void AddItem();
+
+    protected abstract void RemoveItem(T item);
 
     protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
