Index: /stable/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs
===================================================================
--- /stable/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs	(revision 9933)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
@@ -34,27 +33,6 @@
     }
 
-    private ProgressView progressView;
-    private Progress progress;
-
     public ClientView() {
       InitializeComponent();
-      progress = new Progress() {
-        CanBeCanceled = false,
-        ProgressState = ProgressState.Finished
-      };
-    }
-
-    protected override void DeregisterContentEvents() {
-      if (progressView != null) {
-        progressView.Content = null;
-        progressView.Dispose();
-        progressView = null;
-      }
-      base.DeregisterContentEvents();
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      progressView = new ProgressView(this, progress);
     }
 
@@ -98,18 +76,10 @@
 
     public void StartProgressView() {
-      if (InvokeRequired) {
-        Invoke(new Action(StartProgressView));
-      } else {
-        progress.Status = "Downloading client information. Please be patient.";
-        progress.ProgressState = ProgressState.Started;
-      }
+      var message = "Downloading client information. Please be patient.";
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
     }
 
     public void FinishProgressView() {
-      if (InvokeRequired) {
-        Invoke(new Action(FinishProgressView));
-      } else {
-        progress.Finish();
-      }
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
     }
   }
Index: /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 9933)
@@ -42,7 +42,5 @@
     private ISet<TreeNode> filteredTreeNodes;
     private ISet<TreeNode> nodeStore;
-    private Progress progress;
-    private ProgressView progressView;
-
+    
     private ISet<Resource> selectedResources;
     public ISet<Resource> SelectedResources {
@@ -64,30 +62,12 @@
       imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.MonitorLarge);
       imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.NetworkCenterLarge);
-      progress = new Progress() {
-        CanBeCanceled = false,
-        ProgressState = ProgressState.Finished
-      };
-    }
-
-    protected override void DeregisterContentEvents() {
-      if (progressView != null) {
-        progressView.Content = null;
-        progressView.Dispose();
-        progressView = null;
-      }
-      base.DeregisterContentEvents();
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      progressView = new ProgressView(this, progress);
-    }
-
+    }
+  
     public void StartProgressView() {
       if (InvokeRequired) {
         Invoke(new Action(StartProgressView));
       } else {
-        progress.Status = "Downloading resources. Please be patient.";
-        progress.ProgressState = ProgressState.Started;
+        var message = "Downloading resources. Please be patient.";
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
       }
     }
@@ -97,5 +77,5 @@
         Invoke(new Action(FinishProgressView));
       } else {
-        progress.Finish();
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
       }
     }
Index: /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobListView.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobListView.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobListView.cs	(revision 9933)
@@ -34,7 +34,4 @@
   [Content(typeof(ItemCollection<RefreshableJob>), false)]
   public partial class RefreshableHiveJobListView : HeuristicLab.Core.Views.ItemCollectionView<RefreshableJob> {
-    private Progress progress;
-    private ProgressView progressView;
-
     public RefreshableHiveJobListView() {
       InitializeComponent();
@@ -49,10 +46,4 @@
 
       this.itemsListView.ListViewItemSorter = new ListViewItemDateComparer(0, SortOrder.Ascending);
-
-      progress = new Progress() {
-        CanBeCanceled = false,
-        ProgressState = ProgressState.Finished
-      };
-      progressView = new ProgressView(this, progress);
     }
 
@@ -118,5 +109,5 @@
 
         task.ContinueWith((t) => {
-          progress.Finish();
+          MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
           ErrorHandling.ShowErrorDialog("An error occured while deleting the job. ", t.Exception);
         }, TaskContinuationOptions.OnlyOnFaulted);
@@ -129,11 +120,9 @@
 
     private void DeleteHiveJobsAsync(object items) {
-      progress.Status = "Deleting job...";
-      progress.ProgressState = ProgressState.Started;
-      progress.ProgressValue = 0.0;
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Deleting job...");
       foreach (RefreshableJob item in (List<RefreshableJob>)items) {
         Content.Remove(item);
       }
-      progress.Finish();
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
     }
 
@@ -227,6 +216,4 @@
       if (disposing) {
         if (components != null) components.Dispose();
-        progressView.Content = null;
-        progressView.Dispose();
       }
       base.Dispose(disposing);
Index: /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 9933)
@@ -42,6 +42,4 @@
   [Content(typeof(RefreshableJob), true)]
   public partial class RefreshableHiveJobView : HeuristicLab.Core.Views.ItemView {
-    private Progress progress;
-    private ProgressView progressView;
     private HiveResourceSelectorDialog hiveResourceSelectorDialog;
     private bool SuppressEvents { get; set; }
@@ -58,8 +56,4 @@
     public RefreshableHiveJobView() {
       InitializeComponent();
-      progress = new Progress() {
-        CanBeCanceled = false,
-        ProgressState = ProgressState.Finished
-      };
     }
 
@@ -72,5 +66,4 @@
       Content.ExceptionOccured += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
       Content.StateLogListChanged += new EventHandler(Content_StateLogListChanged);
-      Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
       Content.HiveTasksChanged += new EventHandler(Content_HiveTasksChanged);
       Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
@@ -78,5 +71,5 @@
       Content.Loaded += new EventHandler(Content_Loaded);
       Content.TaskReceived += new EventHandler(Content_TaskReceived);
-      progressView = new ProgressView(this, progress);
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, Content.Progress);
     }
 
@@ -88,5 +81,4 @@
       Content.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
       Content.StateLogListChanged -= new EventHandler(Content_StateLogListChanged);
-      Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
       Content.HiveTasksChanged -= new EventHandler(Content_HiveTasksChanged);
       Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
@@ -94,9 +86,5 @@
       Content.Loaded -= new EventHandler(Content_Loaded);
       Content.TaskReceived -= new EventHandler(Content_TaskReceived);
-      if (progressView != null) {
-        progressView.Content = null;
-        progressView.Dispose();
-        progressView = null;
-      }
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this, false);
       DeregisterHiveExperimentEvents();
       DeregisterHiveTasksEvents();
@@ -159,5 +147,4 @@
       Content_HiveExperimentChanged(this, EventArgs.Empty);
       Content_HiveTasksChanged(this, EventArgs.Empty);
-      Content_IsProgressingChanged(this, EventArgs.Empty);
       Content_StateLogListChanged(this, EventArgs.Empty);
       HiveExperiment_PropertyChanged(this, new PropertyChangedEventArgs("Id"));
@@ -260,38 +247,5 @@
         SetEnabledStateOfControls();
     }
-    private void Content_Prepared(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Prepared), sender, e);
-      else {
-        nameTextBox.Enabled = true;
-        Locked = false;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_Started(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Started), sender, e);
-      else {
-        nameTextBox.Enabled = false;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_Paused(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Paused), sender, e);
-      else {
-        nameTextBox.Enabled = true;
-        SetEnabledStateOfControls();
-      }
-    }
-    private void Content_Stopped(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_Stopped), sender, e);
-      else {
-        nameTextBox.Enabled = true;
-        Locked = false;
-        SetEnabledStateOfControls();
-      }
-    }
+
     private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
       if (InvokeRequired)
@@ -336,5 +290,4 @@
       if (Content != null && Content.Job != null) {
         RegisterHiveExperimentEvents();
-        Content_IsProgressingChanged(sender, e);
       }
     }
@@ -410,5 +363,5 @@
         var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeJobAsync, Content);
         task.ContinueWith((t) => {
-          progress.Finish();
+          Content.Progress.Finish();
           MessageBox.Show("An error occured resuming the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
           Content.Log.LogException(t.Exception);
@@ -422,5 +375,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(PauseJobAsync, Content);
       task.ContinueWith((t) => {
-        progress.Finish();
+        Content.Progress.Finish();
         MessageBox.Show("An error occured pausing the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
         Content.Log.LogException(t.Exception);
@@ -431,5 +384,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(StopJobAsync, Content);
       task.ContinueWith((t) => {
-        progress.Finish();
+        Content.Progress.Finish();
         MessageBox.Show("An error occured stopping the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
         Content.Log.LogException(t.Exception);
@@ -439,22 +392,19 @@
 
     private void PauseJobAsync(object job) {
-      progress.Status = "Pausing job...";
-      progress.ProgressState = ProgressState.Started;
+      Content.Progress.Start("Pausing job...");
       HiveClient.PauseJob((RefreshableJob)job);
-      progress.Finish();
+      Content.Progress.Finish();
     }
 
     private void StopJobAsync(object job) {
-      progress.Status = "Stopping job...";
-      progress.ProgressState = ProgressState.Started;
+      Content.Progress.Start("Stopping job...");
       HiveClient.StopJob((RefreshableJob)job);
-      progress.Finish();
+      Content.Progress.Finish();
     }
 
     private void ResumeJobAsync(object job) {
-      progress.Status = "Resuming job...";
-      progress.ProgressState = ProgressState.Started;
+      Content.Progress.Start("Resuming job...");
       HiveClient.ResumeJob((RefreshableJob)job);
-      progress.Finish();
+      Content.Progress.Finish();
     }
 
@@ -507,18 +457,4 @@
         stopButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started && !Content.IsProgressing;
         resetButton.Enabled = false;
-      }
-    }
-    #endregion
-
-    #region Progress reporting
-    private void Content_IsProgressingChanged(object sender, EventArgs e) {
-      if (this.InvokeRequired) {
-        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
-      } else {
-        if (Content != null && Content.Progress != null && Content.IsProgressing) {
-          progressView.Content = Content.Progress;
-        } else if (Content != null) {
-          progressView.Content = progress;
-        }
       }
     }
Index: /stable/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 9933)
@@ -31,7 +31,4 @@
   [Content(typeof(OptimizerHiveTask), true)]
   public partial class OptimizerHiveTaskView : HiveTaskView {
-    private Progress progress;
-    private ProgressView progressView;
-
     public new OptimizerHiveTask Content {
       get { return (OptimizerHiveTask)base.Content; }
@@ -45,8 +42,4 @@
     public OptimizerHiveTaskView() {
       InitializeComponent();
-      progress = new Progress() {
-        CanBeCanceled = false,
-        ProgressState = ProgressState.Finished
-      };
     }
 
@@ -60,18 +53,15 @@
       }
     }
+
     #region Content Events
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
       Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
-      progressView = new ProgressView(this, progress);
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, Content.Progress);
     }
 
     protected override void DeregisterContentEvents() {
       Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
-      if (progressView != null) {
-        progressView.Content = null;
-        progressView.Dispose();
-        progressView = null;
-      }
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this, false);
       base.DeregisterContentEvents();
     }
@@ -80,5 +70,4 @@
       SetEnabledStateOfControls();
     }
-
     #endregion
 
@@ -87,5 +76,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeTaskAsync);
       task.ContinueWith((t) => {
-        progress.Finish();
+        Content.Progress.Finish();
         ErrorHandling.ShowErrorDialog(this, "An error occured while resuming the task.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -95,5 +84,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(PauseTaskAsync);
       task.ContinueWith((t) => {
-        progress.Finish();
+        Content.Progress.Finish();
         ErrorHandling.ShowErrorDialog(this, "An error occured while pausing the task.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -103,5 +92,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(StopTaskAsync);
       task.ContinueWith((t) => {
-        progress.Finish();
+        Content.Progress.Finish();
         ErrorHandling.ShowErrorDialog(this, "An error occured while stopping the task.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -110,22 +99,19 @@
 
     private void PauseTaskAsync() {
-      progress.Status = "Pausing task. Please be patient for the command to take effect.";
-      progress.ProgressState = ProgressState.Started;
+      Content.Progress.Start("Pausing task. Please be patient for the command to take effect.");
       Content.Pause();
-      progress.Finish();
+      Content.Progress.Finish();
     }
 
     private void StopTaskAsync() {
-      progress.Status = "Stopping task. Please be patient for the command to take effect.";
-      progress.ProgressState = ProgressState.Started;
+      Content.Progress.Start("Stopping task. Please be patient for the command to take effect.");
       Content.Stop();
-      progress.Finish();
+      Content.Progress.Finish();
     }
 
     private void ResumeTaskAsync() {
-      progress.Status = "Resuming task. Please be patient for the command to take effect.";
-      progress.ProgressState = ProgressState.Started;
+      Content.Progress.Start("Resuming task. Please be patient for the command to take effect.");
       Content.Restart();
-      progress.Finish();
+      Content.Progress.Finish();
     }
 
Index: /stable/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 9933)
@@ -265,5 +265,5 @@
       try {
         refreshableJob.IsProgressing = true;
-        refreshableJob.Progress = new Progress("Connecting to server...");
+        refreshableJob.Progress.Start("Connecting to server...");
         IEnumerable<string> resourceNames = ToResourceNameList(refreshableJob.Job.ResourceNames);
         var resourceIds = new List<Guid>();
@@ -424,5 +424,4 @@
       var hiveExperiment = refreshableJob.Job;
       refreshableJob.IsProgressing = true;
-      refreshableJob.Progress = new Progress();
       TaskDownloader downloader = null;
 
@@ -431,7 +430,6 @@
         IEnumerable<LightweightTask> allTasks;
 
-        refreshableJob.Progress.Status = "Connecting to Server...";
         // fetch all task objects to create the full tree of tree of HiveTask objects
-        refreshableJob.Progress.Status = "Downloading list of tasks...";
+        refreshableJob.Progress.Start("Downloading list of tasks...");
         allTasks = HiveServiceLocator.Instance.CallHiveService(s => s.GetLightweightJobTasksWithoutStateLog(hiveExperiment.Id));
         totalJobCount = allTasks.Count();
Index: /stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs	(revision 9933)
@@ -26,4 +26,5 @@
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
+using HeuristicLab.MainForm;
 using HeuristicLab.Optimization;
 using HeuristicLab.PluginInfrastructure;
@@ -31,6 +32,10 @@
 namespace HeuristicLab.Clients.Hive {
   public class OptimizerHiveTask : HiveTask<OptimizerTask> {
+    public Progress Progress { get; private set; }
+
     #region Constructors and Cloning
-    public OptimizerHiveTask() { }
+    public OptimizerHiveTask() {
+      Progress = new Progress();
+    }
     public OptimizerHiveTask(IOptimizer optimizer)
       : this() {
@@ -43,4 +48,5 @@
     protected OptimizerHiveTask(OptimizerHiveTask original, Cloner cloner)
       : base(original, cloner) {
+      Progress = new Progress();
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /stable/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs	(revision 9933)
@@ -178,4 +178,5 @@
     #region Constructors and Cloning
     public RefreshableJob() {
+      this.progress = new Progress();
       this.refreshAutomatically = false;
       this.Job = new Job();
@@ -186,4 +187,5 @@
     }
     public RefreshableJob(Job hiveJob) {
+      this.progress = new Progress();
       this.refreshAutomatically = true;
       this.Job = hiveJob;
Index: /stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBExperimentUploadView.cs
===================================================================
--- /stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBExperimentUploadView.cs	(revision 9932)
+++ /stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBExperimentUploadView.cs	(revision 9933)
@@ -54,13 +54,7 @@
     Algorithm selectedAlgorithm = null;
     Problem selectedProblem = null;
-    private ProgressView progressView;
-    private Progress progress;
 
     public OKBExperimentUploadView() {
       InitializeComponent();
-      progress = new Progress() {
-        CanBeCanceled = false,
-        ProgressState = ProgressState.Finished
-      };
     }
 
@@ -96,5 +90,4 @@
       RunCreationClient.Instance.Refreshing += new EventHandler(RunCreationClient_Refreshing);
       RunCreationClient.Instance.Refreshed += new EventHandler(RunCreationClient_Refreshed);
-      progressView = new ProgressView(this, progress);
     }
 
@@ -102,9 +95,5 @@
       RunCreationClient.Instance.Refreshing -= new EventHandler(RunCreationClient_Refreshing);
       RunCreationClient.Instance.Refreshed -= new EventHandler(RunCreationClient_Refreshed);
-      if (progressView != null) {
-        progressView.Content = null;
-        progressView.Dispose();
-        progressView = null;
-      }
+
       base.DeregisterContentEvents();
     }
@@ -198,6 +187,6 @@
         Invoke(new EventHandler(RunCreationClient_Refreshing), sender, e);
       } else {
-        progress.Status = "Refreshing algorithms and problems...";
-        progress.ProgressState = ProgressState.Started;
+        var message = "Refreshing algorithms and problems...";
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
       }
     }
@@ -207,5 +196,5 @@
         Invoke(new EventHandler(RunCreationClient_Refreshed), sender, e);
       } else {
-        progress.Finish();
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
         SetEnabledStateOfControls();
       }
@@ -215,5 +204,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(UploadAsync);
       task.ContinueWith((t) => {
-        progress.Finish();
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
         PluginInfrastructure.ErrorHandling.ShowErrorDialog("An exception occured while uploading the runs to the OKB.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -221,7 +210,6 @@
 
     private void UploadAsync() {
-      progress.Status = "Uploading runs to OKB...";
-      progress.ProgressValue = 0;
-      progress.ProgressState = ProgressState.Started;
+      var message = "Uploading runs to OKB...";
+      IProgress progress = MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
       double count = dataGridView.Rows.Count;
       int i = 0;
@@ -238,5 +226,5 @@
         progress.ProgressValue = ((double)i) / count;
       }
-      progress.Finish();
+      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
       ClearRuns();
     }
Index: /stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs
===================================================================
--- /stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs	(revision 9932)
+++ /stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs	(revision 9933)
@@ -21,92 +21,80 @@
 
 using System;
-using System.ComponentModel;
 using System.Windows.Forms;
 
 namespace HeuristicLab.MainForm.WindowsForms {
-  [View("ProgressView")]
-  [Content(typeof(IProgress), true)]
-  public partial class ProgressView : AsynchronousContentView {
-    private const int DefaultCancelTimeoutMs = 3000;
-    private ContentView parentView;
+  internal sealed partial class ProgressView : UserControl {
+    private const int defaultControlHeight = 88;
+    private const int collapsedControlHeight = 55;
 
-    [Category("Custom"), Description("The time that the process is allowed to exit.")]
-    [DefaultValue(DefaultCancelTimeoutMs)]
-    public int CancelTimeoutMs { get; set; }
-    private bool ShouldSerializeCancelTimeoutMs() { return CancelTimeoutMs != DefaultCancelTimeoutMs; }
-
-    public new IProgress Content {
-      get { return (IProgress)base.Content; }
-      set { base.Content = value; }
+    private readonly Control control;
+    public Control Control {
+      get { return control; }
     }
 
-    public ProgressView() {
-      InitializeComponent();
-    }
-    public ProgressView(IProgress progress)
-      : this() {
-      Content = progress;
-    }
-    public ProgressView(ContentView parentView)
-      : this() {
-      if (parentView == null) throw new ArgumentNullException("parentView", "The parent view is null.");
-      this.parentView = parentView;
-    }
-    public ProgressView(ContentView parentView, IProgress progress)
-      : this(parentView) {
-      Content = progress;
+    private readonly IProgress content;
+    public IProgress Content {
+      get { return content; }
     }
 
-    protected override void RegisterContentEvents() {
-      Content.StatusChanged += new EventHandler(progress_StatusChanged);
-      Content.ProgressValueChanged += new EventHandler(progress_ProgressValueChanged);
-      Content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged);
-      Content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged);
-      base.RegisterContentEvents();
+    public ProgressView(Control control, IProgress content)
+      : base() {
+      if (control == null) throw new ArgumentNullException("control", "The control is null.");
+      if (content == null) throw new ArgumentNullException("content", "The passed progress is null.");
+      InitializeComponent();
+
+      this.control = control;
+      this.content = content;
+      if (content.ProgressState == ProgressState.Started)
+        ShowProgress();
+      RegisterContentEvents();
     }
 
-    protected override void DeregisterContentEvents() {
-      base.DeregisterContentEvents();
-      Content.StatusChanged -= new EventHandler(progress_StatusChanged);
-      Content.ProgressValueChanged -= new EventHandler(progress_ProgressValueChanged);
-      Content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged);
-      Content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged);
+    /// <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) {
+      DeregisterContentEvents();
+      HideProgress();
+
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
     }
 
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        HideProgress();
-      } else {
-        if (Content.ProgressState == ProgressState.Started)
-          ShowProgress();
-      }
+    private void RegisterContentEvents() {
+      content.StatusChanged += new EventHandler(progress_StatusChanged);
+      content.ProgressValueChanged += new EventHandler(progress_ProgressValueChanged);
+      content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged);
+      content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged);
     }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      cancelButton.Visible = Content != null && Content.CanBeCanceled;
-      cancelButton.Enabled = Content != null && Content.CanBeCanceled && !ReadOnly;
+    private void DeregisterContentEvents() {
+      content.StatusChanged -= new EventHandler(progress_StatusChanged);
+      content.ProgressValueChanged -= new EventHandler(progress_ProgressValueChanged);
+      content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged);
+      content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged);
     }
 
     private void ShowProgress() {
-      if (InvokeRequired) Invoke((Action)ShowProgress);
-      else {
-        if (parentView != null) {
-          this.Left = (parentView.ClientRectangle.Width / 2) - (this.Width / 2);
-          this.Top = (parentView.ClientRectangle.Height / 2) - (this.Height / 2);
-          this.Anchor = AnchorStyles.None;
+      if (Control.InvokeRequired) {
+        Control.Invoke((Action)ShowProgress);
+        return;
+      }
+      int height = Content.CanBeCanceled ? Height : collapsedControlHeight;
 
-          LockBackground();
+      Left = (Control.ClientRectangle.Width / 2) - (Width / 2);
+      Top = (Control.ClientRectangle.Height / 2) - (height / 2);
+      Anchor = AnchorStyles.None;
 
-          if (!parentView.Controls.Contains(this))
-            parentView.Controls.Add(this);
+      control.Enabled = false;
+      Parent = Control.Parent;
+      BringToFront();
 
-          BringToFront();
-        }
-        UpdateProgressValue();
-        UpdateProgressStatus();
-        Visible = true;
-      }
+      UpdateProgressValue();
+      UpdateProgressStatus();
+      UpdateCancelButton();
+      Visible = true;
     }
 
@@ -114,10 +102,6 @@
       if (InvokeRequired) Invoke((Action)HideProgress);
       else {
-        if (parentView != null) {
-          if (parentView.Controls.Contains(this))
-            parentView.Controls.Remove(this);
-
-          UnlockBackground();
-        }
+        control.Enabled = true;
+        Parent = null;
         Visible = false;
       }
@@ -133,33 +117,24 @@
 
     private void Content_ProgressStateChanged(object sender, EventArgs e) {
-      if (Content.ProgressState == ProgressState.Finished
-        || Content.ProgressState == ProgressState.Canceled)
-        HideProgress();
-      if (Content.ProgressState == ProgressState.Started)
-        ShowProgress();
+      switch (content.ProgressState) {
+        case ProgressState.Finished: HideProgress(); break;
+        case ProgressState.Canceled: HideProgress(); break;
+        case ProgressState.Started: ShowProgress(); break;
+        default: throw new NotSupportedException("The progress state " + content.ProgressState + " is not supported by the ProgressView.");
+      }
     }
 
     private void Content_CanBeCanceledChanged(object sender, EventArgs e) {
-      SetEnabledStateOfControls();
+      UpdateCancelButton();
     }
 
-    private void LockBackground() {
-      if (InvokeRequired) {
-        Invoke((Action)LockBackground);
-      } else {
-        parentView.Locked = true;
-        parentView.ReadOnly = true;
-        Locked = false;
-        ReadOnly = false;
-      }
-    }
+    private void UpdateCancelButton() {
+      cancelButton.Visible = content != null && content.CanBeCanceled;
+      cancelButton.Enabled = content != null && content.CanBeCanceled;
 
-    private void UnlockBackground() {
-      if (InvokeRequired) Invoke((Action)UnlockBackground);
-      else {
-        parentView.Locked = false;
-        parentView.ReadOnly = false;
-        Locked = true;
-        ReadOnly = true;
+      if (content != null && content.CanBeCanceled) {
+        Height = defaultControlHeight;
+      } else if (content != null && !content.CanBeCanceled) {
+        Height = collapsedControlHeight;
       }
     }
@@ -168,12 +143,10 @@
       if (InvokeRequired) Invoke((Action)UpdateProgressValue);
       else {
-        if (Content != null) {
-          double progressValue = Content.ProgressValue;
+        if (content != null) {
+          double progressValue = content.ProgressValue;
           if (progressValue <= 0.0 || progressValue > 1.0) {
-            if (progressBar.Style != ProgressBarStyle.Marquee)
-              progressBar.Style = ProgressBarStyle.Marquee;
+            progressBar.Style = ProgressBarStyle.Marquee;
           } else {
-            if (progressBar.Style != ProgressBarStyle.Blocks)
-              progressBar.Style = ProgressBarStyle.Blocks;
+            progressBar.Style = ProgressBarStyle.Blocks;
             progressBar.Value = (int)Math.Round(progressBar.Minimum + progressValue * (progressBar.Maximum - progressBar.Minimum));
           }
@@ -184,24 +157,10 @@
     private void UpdateProgressStatus() {
       if (InvokeRequired) Invoke((Action)UpdateProgressStatus);
-      else if (Content != null)
-        statusLabel.Text = Content.Status;
+      else if (content != null)
+        statusLabel.Text = content.Status;
     }
 
     private void cancelButton_Click(object sender, EventArgs e) {
-      if (Content != null) {
-        try {
-          Content.Cancel(CancelTimeoutMs);
-          ReadOnly = true;
-          cancelButtonTimer.Interval = CancelTimeoutMs;
-          cancelButtonTimer.Start();
-        } catch (NotSupportedException nse) {
-          PluginInfrastructure.ErrorHandling.ShowErrorDialog(nse);
-        }
-      }
-    }
-
-    private void cancelButtonTimer_Tick(object sender, EventArgs e) {
-      cancelButtonTimer.Stop();
-      if (Visible) ReadOnly = false;
+      content.Cancel();
     }
   }
Index: /stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs
===================================================================
--- /stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs	(revision 9932)
+++ /stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs	(revision 9933)
@@ -27,15 +27,5 @@
     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
 
@@ -45,10 +35,8 @@
     /// </summary>
     private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
       this.progressBar = new System.Windows.Forms.ProgressBar();
       this.statusLabel = new System.Windows.Forms.Label();
       this.cancelButton = new System.Windows.Forms.Button();
       this.panel = new System.Windows.Forms.Panel();
-      this.cancelButtonTimer = new System.Windows.Forms.Timer(this.components);
       this.panel.SuspendLayout();
       this.SuspendLayout();
@@ -56,6 +44,6 @@
       // progressBar
       // 
-      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.progressBar.Location = new System.Drawing.Point(3, 3);
       this.progressBar.Name = "progressBar";
@@ -66,6 +54,6 @@
       // statusLabel
       // 
-      this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.statusLabel.Location = new System.Drawing.Point(3, 33);
       this.statusLabel.Name = "statusLabel";
@@ -86,6 +74,7 @@
       // panel
       // 
-      this.panel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel.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.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
       this.panel.Controls.Add(this.progressBar);
@@ -96,8 +85,4 @@
       this.panel.Size = new System.Drawing.Size(360, 88);
       this.panel.TabIndex = 3;
-      // 
-      // cancelButtonTimer
-      // 
-      this.cancelButtonTimer.Tick += new System.EventHandler(this.cancelButtonTimer_Tick);
       // 
       // ProgressView
@@ -118,5 +103,4 @@
     private System.Windows.Forms.Button cancelButton;
     private System.Windows.Forms.Panel panel;
-    private System.Windows.Forms.Timer cancelButtonTimer;
   }
 }
Index: /stable/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs
===================================================================
--- /stable/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs	(revision 9932)
+++ /stable/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs	(revision 9933)
@@ -345,4 +345,108 @@
     #endregion
 
+    #region progress views
+    private readonly Dictionary<IContent, IProgress> contentProgressLookup = new Dictionary<IContent, IProgress>();
+    private readonly Dictionary<Control, IProgress> viewProgressLookup = new Dictionary<Control, IProgress>();
+    private readonly List<ProgressView> progressViews = new List<ProgressView>();
+
+    /// <summary>
+    /// Adds a <see cref="ProgressView"/> to the <see cref="ContentView"/>s showing the specified content.
+    /// </summary>
+    public IProgress AddOperationProgressToContent(IContent content, string progressMessage, bool addToObjectGraphObjects = true) {
+      if (InvokeRequired) {
+        IProgress result = (IProgress)Invoke((Func<IContent, string, bool, IProgress>)AddOperationProgressToContent, content, progressMessage, addToObjectGraphObjects);
+        return result;
+      }
+      if (contentProgressLookup.ContainsKey(content))
+        throw new ArgumentException("A progress is already registered for the specified content.", "content");
+
+      var contentViews = views.Keys.OfType<ContentView>();
+      if (!contentViews.Any(v => v.Content == content))
+        throw new ArgumentException("The content is not displayed in a top-level view", "content");
+
+      if (addToObjectGraphObjects) {
+        var containedObjects = content.GetObjectGraphObjects();
+        contentViews = contentViews.Where(v => containedObjects.Contains(v.Content));
+      } else
+        contentViews = contentViews.Where(v => v.Content == content);
+
+      var progress = new Progress(progressMessage, ProgressState.Started);
+      foreach (var contentView in contentViews) {
+        progressViews.Add(new ProgressView(contentView, progress));
+      }
+
+      contentProgressLookup[content] = progress;
+      return progress;
+    }
+
+    /// <summary>
+    /// Adds a <see cref="ProgressView"/> to the specified view.
+    /// </summary>
+    public IProgress AddOperationProgressToView(Control control, string progressMessage) {
+      var progress = new Progress(progressMessage, ProgressState.Started);
+      AddOperationProgressToView(control, progress);
+      return progress;
+    }
+
+    public void AddOperationProgressToView(Control control, IProgress progress) {
+      if (InvokeRequired) {
+        Invoke((Action<Control, IProgress>)AddOperationProgressToView, control, progress);
+        return;
+      }
+      if (control == null) throw new ArgumentNullException("control", "The view must not be null.");
+      if (progress == null) throw new ArgumentNullException("progress", "The progress must not be null.");
+
+      IProgress oldProgress;
+      if (viewProgressLookup.TryGetValue(control, out oldProgress)) {
+        foreach (var progressView in progressViews.Where(v => v.Content == oldProgress).ToList()) {
+          progressView.Dispose();
+          progressViews.Remove(progressView);
+        }
+        viewProgressLookup.Remove(control);
+      }
+
+      progressViews.Add(new ProgressView(control, progress));
+      viewProgressLookup[control] = progress;
+    }
+
+    /// <summary>
+    /// Removes an existing <see cref="ProgressView"/> from the <see cref="ContentView"/>s showing the specified content.
+    /// </summary>
+    public void RemoveOperationProgressFromContent(IContent content, bool finishProgress = true) {
+      if (InvokeRequired) {
+        Invoke((Action<IContent, bool>)RemoveOperationProgressFromContent, content, finishProgress);
+        return;
+      }
+
+      IProgress progress;
+      if (!contentProgressLookup.TryGetValue(content, out progress))
+        throw new ArgumentException("No progress is registered for the specified content.", "content");
+
+      if (finishProgress) progress.Finish();
+      foreach (var progressView in progressViews.Where(v => v.Content == progress).ToList()) {
+        progressView.Dispose();
+        progressViews.Remove(progressView);
+      }
+      contentProgressLookup.Remove(content);
+
+    }
+
+    /// <summary>
+    /// Removes an existing <see cref="ProgressView"/> from the specified view.
+    /// </summary>
+    public void RemoveOperationProgressFromView(Control control, bool finishProgress = true) {
+      IProgress progress;
+      if (!viewProgressLookup.TryGetValue(control, out progress))
+        throw new ArgumentException("No progress is registered for the specified control.", "control");
+
+      if (finishProgress) progress.Finish();
+      foreach (var progressView in progressViews.Where(v => v.Content == progress).ToList()) {
+        progressView.Dispose();
+        progressViews.Remove(progressView);
+      }
+      viewProgressLookup.Remove(control);
+    }
+    #endregion
+
     #region create menu and toolbar
     private void CreateGUI() {
Index: /stable/HeuristicLab.MainForm/3.3/Interfaces/IProgress.cs
===================================================================
--- /stable/HeuristicLab.MainForm/3.3/Interfaces/IProgress.cs	(revision 9932)
+++ /stable/HeuristicLab.MainForm/3.3/Interfaces/IProgress.cs	(revision 9933)
@@ -28,14 +28,14 @@
   public interface IProgress : IContent {
     /// <summary>
-    /// Gets the currently associated status text with the progress.
+    /// Gets or sets the currently associated status text with the progress.
     /// </summary>
-    string Status { get; }
+    string Status { get; set; }
     /// <summary>
-    /// Gets the currently associated progress value in the range (0;1].
+    /// Gets or sets the currently associated progress value in the range (0;1].
     ///  Values outside this range are permitted and need to be handled in some feasible manner.
     /// </summary>
-    double ProgressValue { get; }
+    double ProgressValue { get; set; }
     /// <summary>
-    /// Gets the current state of the progress. Every progress starts in state
+    /// Gets or sets the current state of the progress. Every progress starts in state
     /// Started and then becomes either Canceled or Finished.
     /// If it is reused it may be Started again.
@@ -54,6 +54,16 @@
     /// </summary>
     /// <exception cref="NotSupportedException">Thrown when cancellation is not supported.</exception>
-    /// <param name="timeoutMs">The operation is given a certain timeout to cancel. If the operation doesn't cancel in this time it will be forcibly closed.</param>
-    void Cancel(int timeoutMs);
+    void Cancel();
+    /// <summary>
+    /// Sets the ProgressValue to 1 and the ProgressState to Finished.
+    /// </summary>
+    void Finish();
+
+    /// <summary>
+    /// Starts or restarts a Progress. 
+    /// </summary>
+    void Start();
+
+    void Start(string status);
 
     /// <summary>
@@ -74,7 +84,7 @@
     event EventHandler CanBeCanceledChanged;
     /// <summary>
-    /// A cancelation is requested with a certain timeout (in ms) in which it should occur gracefully. If the timeout is surpassed, it should be forcibly canceled.
+    /// A cancelation is requested.
     /// </summary>
-    event EventHandler<EventArgs<int>> CancelRequested;
+    event EventHandler CancelRequested;
   }
 }
Index: /stable/HeuristicLab.MainForm/3.3/Progress.cs
===================================================================
--- /stable/HeuristicLab.MainForm/3.3/Progress.cs	(revision 9932)
+++ /stable/HeuristicLab.MainForm/3.3/Progress.cs	(revision 9933)
@@ -21,5 +21,4 @@
 
 using System;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.MainForm {
@@ -50,5 +49,5 @@
     public ProgressState ProgressState {
       get { return progressState; }
-      set {
+      private set {
         if (progressState != value) {
           progressState = value;
@@ -70,5 +69,6 @@
 
     public Progress() {
-      progressState = ProgressState.Started;
+      progressState = ProgressState.Finished;
+      canBeCanceled = false;
     }
     public Progress(string status)
@@ -76,20 +76,28 @@
       this.status = status;
     }
-    public Progress(string status, double progressValue)
-      : this(status) {
-      this.progressValue = progressValue;
+    public Progress(string status, ProgressState state)
+      : this() {
+      this.status = status;
+      this.progressState = state;
     }
 
-    public void Cancel(int timeoutMs) {
+    public void Cancel() {
       if (canBeCanceled)
-        OnCancelRequested(timeoutMs);
+        OnCancelRequested();
     }
 
-    /// <summary>
-    /// Sets the ProgressValue to 1 and the ProgressState to Finished.
-    /// </summary>
     public void Finish() {
       if (ProgressValue != 1.0) ProgressValue = 1.0;
       ProgressState = ProgressState.Finished;
+    }
+
+    public void Start() {
+      ProgressValue = 0.0;
+      ProgressState = ProgressState.Started;
+    }
+
+    public void Start(string status) {
+      Start();
+      Status = status;
     }
 
@@ -98,7 +106,5 @@
     private void OnStatusChanged() {
       var handler = StatusChanged;
-      try {
-        if (handler != null) handler(this, EventArgs.Empty);
-      } catch { }
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -106,7 +112,5 @@
     private void OnProgressChanged() {
       var handler = ProgressValueChanged;
-      try {
-        if (handler != null) handler(this, EventArgs.Empty);
-      } catch { }
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -114,7 +118,5 @@
     private void OnProgressStateChanged() {
       var handler = ProgressStateChanged;
-      try {
-        if (handler != null) handler(this, EventArgs.Empty);
-      } catch { }
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -122,16 +124,12 @@
     private void OnCanBeCanceledChanged() {
       var handler = CanBeCanceledChanged;
-      try {
-        if (handler != null) handler(this, EventArgs.Empty);
-      } catch { }
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
-    public event EventHandler<EventArgs<int>> CancelRequested;
-    private void OnCancelRequested(int timeoutMs) {
+    public event EventHandler CancelRequested;
+    private void OnCancelRequested() {
       var handler = CancelRequested;
-      try {
-        if (handler == null) throw new NotSupportedException("Cancel request was ignored.");
-        else handler(this, new EventArgs<int>(timeoutMs));
-      } catch { }
+      if (handler != null) throw new NotSupportedException("Cancel request was ignored.");
+      else handler(this, EventArgs.Empty);
     }
     #endregion
Index: /stable/HeuristicLab.Optimizer/3.3/FileManager.cs
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/FileManager.cs	(revision 9932)
+++ /stable/HeuristicLab.Optimizer/3.3/FileManager.cs	(revision 9933)
@@ -22,5 +22,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
+using System.IO;
 using System.Windows.Forms;
 using HeuristicLab.Common;
@@ -98,6 +98,6 @@
           SaveAs(view);
         else {
-          ((MainForm.WindowsForms.MainForm)MainFormManager.MainForm).SetAppStartingCursor();
-          SetEnabledStateOfContentViews(content, false);
+          MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().SetAppStartingCursor();
+          SetSaveOperationProgressInContentViews(content, true);
           ContentManager.SaveAsync(content, content.Filename, true, SavingCompleted);
         }
@@ -123,6 +123,6 @@
 
         if (saveFileDialog.ShowDialog() == DialogResult.OK) {
-          ((MainForm.WindowsForms.MainForm)MainFormManager.MainForm).SetAppStartingCursor();
-          SetEnabledStateOfContentViews(content, false);
+          MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().SetAppStartingCursor();
+          SetSaveOperationProgressInContentViews(content, true, saveFileDialog.FileName);
           if (saveFileDialog.FilterIndex == 1) {
             ContentManager.SaveAsync(content, saveFileDialog.FileName, false, SavingCompleted);
@@ -135,5 +135,4 @@
     private static void SavingCompleted(IStorableContent content, Exception error) {
       try {
-        SetEnabledStateOfContentViews(content, true);
         if (error != null) throw error;
         MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().UpdateTitle();
@@ -143,15 +142,18 @@
       }
       finally {
-        ((MainForm.WindowsForms.MainForm)MainFormManager.MainForm).ResetAppStartingCursor();
+        SetSaveOperationProgressInContentViews(content, false);
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().ResetAppStartingCursor();
       }
     }
 
-    private static void SetEnabledStateOfContentViews(IStorableContent content, bool enabled) {
+    private static void SetSaveOperationProgressInContentViews(IStorableContent content, bool showProgress, string fileName = null) {
       HeuristicLab.MainForm.WindowsForms.MainForm mainForm = MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>();
       #region Mono Compatibility
       // removed the InvokeRequired check because of Mono
       mainForm.Invoke((Action)delegate {
-        var views = MainFormManager.MainForm.Views.OfType<IContentView>().Where(v => v.Content == content).ToList();
-        views.ForEach(v => v.Enabled = enabled);
+        if (showProgress) {
+          mainForm.AddOperationProgressToContent(content, string.Format("Saving to file \"{0}\"...", Path.GetFileName(fileName ?? content.Filename)));
+        } else
+          mainForm.RemoveOperationProgressFromContent(content);
       });
       #endregion
Index: /stable/HeuristicLab.Optimizer/3.3/StartPage.Designer.cs
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/StartPage.Designer.cs	(revision 9932)
+++ /stable/HeuristicLab.Optimizer/3.3/StartPage.Designer.cs	(revision 9933)
@@ -50,14 +50,11 @@
       this.titleLabel = new System.Windows.Forms.Label();
       this.samplesGroupBox = new System.Windows.Forms.GroupBox();
-      this.loadingPanel = new System.Windows.Forms.Panel();
-      this.loadingProgressBar = new System.Windows.Forms.ProgressBar();
-      this.loadingLabel = new System.Windows.Forms.Label();
       this.samplesListView = new System.Windows.Forms.ListView();
-      this.nameColumnHeader = new System.Windows.Forms.ColumnHeader();
-      this.descriptionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
       this.imageList = new System.Windows.Forms.ImageList(this.components);
       this.splitContainer = new System.Windows.Forms.SplitContainer();
       this.samplesGroupBox.SuspendLayout();
-      this.loadingPanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
@@ -80,7 +77,7 @@
       // firstStepsRichTextBox
       // 
-      this.firstStepsRichTextBox.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.firstStepsRichTextBox.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.firstStepsRichTextBox.BackColor = System.Drawing.SystemColors.Control;
       this.firstStepsRichTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
@@ -96,6 +93,6 @@
       // titleLabel
       // 
-      this.titleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.titleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.titleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
       this.titleLabel.Location = new System.Drawing.Point(-1, 0);
@@ -108,8 +105,7 @@
       // samplesGroupBox
       // 
-      this.samplesGroupBox.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.samplesGroupBox.Controls.Add(this.loadingPanel);
+      this.samplesGroupBox.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.samplesGroupBox.Controls.Add(this.samplesListView);
       this.samplesGroupBox.Location = new System.Drawing.Point(0, 3);
@@ -119,35 +115,4 @@
       this.samplesGroupBox.TabStop = false;
       this.samplesGroupBox.Text = "Samples";
-      // 
-      // loadingPanel
-      // 
-      this.loadingPanel.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.loadingPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
-      this.loadingPanel.Controls.Add(this.loadingProgressBar);
-      this.loadingPanel.Controls.Add(this.loadingLabel);
-      this.loadingPanel.Enabled = false;
-      this.loadingPanel.Location = new System.Drawing.Point(189, 89);
-      this.loadingPanel.Name = "loadingPanel";
-      this.loadingPanel.Size = new System.Drawing.Size(350, 62);
-      this.loadingPanel.TabIndex = 1;
-      // 
-      // loadingProgressBar
-      // 
-      this.loadingProgressBar.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.loadingProgressBar.Location = new System.Drawing.Point(101, 19);
-      this.loadingProgressBar.Name = "loadingProgressBar";
-      this.loadingProgressBar.Size = new System.Drawing.Size(229, 23);
-      this.loadingProgressBar.Step = 1;
-      this.loadingProgressBar.TabIndex = 1;
-      // 
-      // loadingLabel
-      // 
-      this.loadingLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.loadingLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.loadingLabel.Location = new System.Drawing.Point(12, 19);
-      this.loadingLabel.Name = "loadingLabel";
-      this.loadingLabel.Size = new System.Drawing.Size(83, 23);
-      this.loadingLabel.TabIndex = 0;
-      this.loadingLabel.Text = "Loading ...";
       // 
       // samplesListView
@@ -168,6 +133,6 @@
       this.samplesListView.UseCompatibleStateImageBehavior = false;
       this.samplesListView.View = System.Windows.Forms.View.Details;
+      this.samplesListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.samplesListView_ItemDrag);
       this.samplesListView.DoubleClick += new System.EventHandler(this.samplesListView_DoubleClick);
-      this.samplesListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.samplesListView_ItemDrag);
       // 
       // nameColumnHeader
@@ -189,7 +154,7 @@
       // splitContainer
       // 
-      this.splitContainer.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.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 0);
       this.splitContainer.Name = "splitContainer";
@@ -210,5 +175,4 @@
       // StartPage
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.splitContainer);
@@ -217,7 +181,7 @@
       this.Size = new System.Drawing.Size(728, 640);
       this.samplesGroupBox.ResumeLayout(false);
-      this.loadingPanel.ResumeLayout(false);
       this.splitContainer.Panel1.ResumeLayout(false);
       this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
       this.ResumeLayout(false);
@@ -236,7 +200,4 @@
     private System.Windows.Forms.ImageList imageList;
     private System.Windows.Forms.ColumnHeader descriptionColumnHeader;
-    private System.Windows.Forms.Panel loadingPanel;
-    private System.Windows.Forms.ProgressBar loadingProgressBar;
-    private System.Windows.Forms.Label loadingLabel;
     private System.Windows.Forms.SplitContainer splitContainer;
   }
Index: /stable/HeuristicLab.Optimizer/3.3/StartPage.cs
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 9932)
+++ /stable/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 9933)
@@ -34,4 +34,6 @@
   [View("Start Page")]
   public partial class StartPage : HeuristicLab.MainForm.WindowsForms.View {
+    private IProgress progress;
+
     public StartPage() {
       InitializeComponent();
@@ -67,4 +69,5 @@
 
     private void LoadSamples(object state) {
+      progress = MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(samplesListView, "Loading...");
       Assembly assembly = Assembly.GetExecutingAssembly();
       var samples = assembly.GetManifestResourceNames().Where(x => x.EndsWith(".hl"));
@@ -77,14 +80,16 @@
             WriteStreamToTempFile(stream, path);
             INamedItem item = XmlParser.Deserialize<INamedItem>(path);
-            OnSampleLoaded(item, loadingProgressBar.Maximum / count);
+            OnSampleLoaded(item, 1.0 / count);
           }
         }
-        catch (Exception) { }
+        catch (Exception) {
+          MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(samplesListView);
+        }
       }
       OnAllSamplesLoaded();
     }
-    private void OnSampleLoaded(INamedItem sample, int progress) {
+    private void OnSampleLoaded(INamedItem sample, double progress) {
       if (InvokeRequired)
-        Invoke(new Action<INamedItem, int>(OnSampleLoaded), sample, progress);
+        Invoke(new Action<INamedItem, double>(OnSampleLoaded), sample, progress);
       else {
         ListViewItem item = new ListViewItem(new string[] { sample.Name, sample.Description });
@@ -94,5 +99,5 @@
         item.Tag = sample;
         samplesListView.Items.Add(item);
-        loadingProgressBar.Value += progress;
+        this.progress.ProgressValue += progress;
       }
     }
@@ -106,5 +111,5 @@
             samplesListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
         }
-        loadingPanel.Visible = false;
+        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(samplesListView);
       }
     }
Index: /stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/MenuItems/ShrinkDataAnalysisRunsMenuItem.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/MenuItems/ShrinkDataAnalysisRunsMenuItem.cs	(revision 9932)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/MenuItems/ShrinkDataAnalysisRunsMenuItem.cs	(revision 9933)
@@ -76,7 +76,6 @@
     public override void Execute() {
       IContentView activeView = (IContentView)MainFormManager.MainForm.ActiveView;
-      Progress progress = new Progress("Removing duplicate datasets.");
       var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
-      mainForm.AddOperationProgressToContent(activeView.Content, progress);
+      mainForm.AddOperationProgressToContent(activeView.Content, "Removing duplicate datasets.");
 
       Action<IContentView> action = (view) => {
