Index: /trunk/HeuristicLab.Algorithms.Benchmarks/3.3/BenchmarkAlgorithm.cs
===================================================================
--- /trunk/HeuristicLab.Algorithms.Benchmarks/3.3/BenchmarkAlgorithm.cs	(revision 16429)
+++ /trunk/HeuristicLab.Algorithms.Benchmarks/3.3/BenchmarkAlgorithm.cs	(revision 16430)
@@ -39,6 +39,8 @@
   [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 130)]
   [StorableClass]
-  public sealed class BenchmarkAlgorithm : IAlgorithm {
+  public sealed class BenchmarkAlgorithm : IAlgorithm, IStorableContent {
     private CancellationTokenSource cancellationTokenSource;
+
+    public string Filename { get; set; }
 
     public string ItemName {
Index: /trunk/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs
===================================================================
--- /trunk/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Analysis.Statistics.Views/3.3/ChartAnalysisView.cs	(revision 16430)
@@ -173,5 +173,5 @@
 
     private void addLineToChart_Click(object sender, EventArgs e) {
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Adding fitted lines to charts...");
+      Progress.Show(this, "Adding fitted lines to charts...", ProgressMode.Indeterminate);
 
       string resultName = (string)dataTableComboBox.SelectedItem;
@@ -181,10 +181,10 @@
 
       task.ContinueWith((t) => {
-        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         ErrorHandling.ShowErrorDialog("An error occured while adding lines to charts. ", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
 
       task.ContinueWith((t) => {
-        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
       }, TaskContinuationOptions.OnlyOnRanToCompletion);
     }
@@ -273,10 +273,10 @@
       var task = Task.Factory.StartNew(() => {
         sem.Wait();
-        progress = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Calculating values...");
+        progress = Progress.Show(this, "Calculating values...");
         RebuildDataTable(resultName, rowName);
       });
 
       task.ContinueWith((t) => {
-        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         ErrorHandling.ShowErrorDialog("An error occured while calculating values. ", t.Exception);
         sem.Release();
@@ -284,5 +284,5 @@
 
       task.ContinueWith((t) => {
-        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         sem.Release();
       }, TaskContinuationOptions.OnlyOnRanToCompletion);
Index: /trunk/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs
===================================================================
--- /trunk/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Analysis.Statistics.Views/3.3/StatisticalTestsView.cs	(revision 16430)
@@ -356,6 +356,5 @@
 
       if (data != null && data.All(x => x != null)) {
-        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>()
-          .AddOperationProgressToView(this, "Calculating...");
+        Progress.Show(this, "Calculating...", ProgressMode.Indeterminate);
 
         string curItem = (string)groupCompComboBox.SelectedItem;
@@ -369,5 +368,5 @@
       CalculatePairwiseTest(groupName);
 
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      Progress.Hide(this);
     }
 
@@ -377,5 +376,5 @@
         return;
 
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(pairwiseTestGroupBox, "Calculating...");
+      Progress.ShowOnControl(pairwiseTestGroupBox, "Calculating...", ProgressMode.Indeterminate);
       Task.Factory.StartNew(() => CalculatePairwiseAsync(groupName));
     }
@@ -384,5 +383,5 @@
       CalculatePairwiseTest(groupName);
 
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(pairwiseTestGroupBox);
+      Progress.HideFromControl(pairwiseTestGroupBox);
     }
 
Index: /trunk/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs	(revision 16430)
@@ -77,9 +77,9 @@
     public void StartProgressView() {
       var message = "Downloading client information. Please be patient.";
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
+      Progress.Show(this, message, ProgressMode.Indeterminate);
     }
 
     public void FinishProgressView() {
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      Progress.Hide(this);
     }
   }
Index: /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.cs	(revision 16430)
@@ -75,5 +75,5 @@
       progress = new Progress();
 
-      removeButton.Enabled = false;      
+      removeButton.Enabled = false;
     }
 
@@ -81,10 +81,10 @@
       base.RegisterContentEvents();
       matrixView.DataGridView.SelectionChanged += DataGridView_SelectionChanged;
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, progress);
+      MainForm.Progress.Show(this, progress);
     }
 
     protected override void DeregisterContentEvents() {
       matrixView.DataGridView.SelectionChanged -= DataGridView_SelectionChanged;
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this, false);
+      MainForm.Progress.Hide(this, false);
       base.DeregisterContentEvents();
     }
@@ -114,5 +114,5 @@
         var jobs = GetSelectedJobs().ToList();
         if (jobs.Any()) {
-                    
+
           startButton.Enabled = jobs.All(x =>
             !x.IsProgressing && HiveAdminClient.Instance.Tasks.ContainsKey(x.Id) && HiveAdminClient.Instance.Tasks[x.Id].Count > 0
@@ -135,14 +135,14 @@
     #region Event Handlers
     private void ProjectJobsView_Load(object sender, EventArgs e) {
-      
+
     }
 
     private void refreshButton_Click(object sender, EventArgs e) {
-      progress.Start("Refreshing jobs...");
+      progress.Start("Refreshing jobs...", ProgressMode.Indeterminate);
       SetEnabledStateOfControls();
       var task = System.Threading.Tasks.Task.Factory.StartNew(RefreshJobsAsync);
 
       task.ContinueWith((t) => {
-        progress.Finish();        
+        progress.Finish();
         SetEnabledStateOfControls();
       });
@@ -160,5 +160,5 @@
 
         if (result == DialogResult.Yes) {
-          progress.Start("Removing job(s)...");
+          progress.Start("Removing job(s)...", ProgressMode.Indeterminate);
           SetEnabledStateOfControls();
           var task = System.Threading.Tasks.Task.Factory.StartNew(RemoveJobsAsync, jobs);
@@ -191,10 +191,10 @@
 
         if (result == DialogResult.Yes) {
-          progress.Start("Resuming job(s)...");
+          progress.Start("Resuming job(s)...", ProgressMode.Indeterminate);
           SetEnabledStateOfControls();
           var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeJobsAsync, jobs);
 
           task.ContinueWith((t) => {
-            RefreshJobs();            
+            RefreshJobs();
             progress.Finish();
             SetEnabledStateOfControls();
@@ -227,5 +227,5 @@
 
           task.ContinueWith((t) => {
-            RefreshJobs();            
+            RefreshJobs();
             progress.Finish();
             SetEnabledStateOfControls();
@@ -253,5 +253,5 @@
 
         if (result == DialogResult.Yes) {
-          progress.Start("Stopping job(s)...");
+          progress.Start("Stopping job(s)...", ProgressMode.Indeterminate);
           SetEnabledStateOfControls();
           var task = System.Threading.Tasks.Task.Factory.StartNew(StopJobsAsync, jobs);
@@ -267,5 +267,5 @@
             progress.Finish();
             SetEnabledStateOfControls();
-            MessageBox.Show("An error occured stopping the job(s).", "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);            
+            MessageBox.Show("An error occured stopping the job(s).", "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }, TaskContinuationOptions.OnlyOnFaulted);
         }
@@ -284,10 +284,10 @@
     private IEnumerable<RefreshableJob> GetSelectedJobs() {
       if (Content == null || matrixView.DataGridView.SelectedRows == null || matrixView.DataGridView.SelectedRows.Count == 0)
-        return Enumerable.Empty<RefreshableJob>() ;
+        return Enumerable.Empty<RefreshableJob>();
 
       var jobs = new List<RefreshableJob>();
       foreach (DataGridViewRow r in matrixView.DataGridView.SelectedRows) {
         if (((string)r.Cells[0].Value) == JobState.Online.ToString()) {
-          jobs.Add(HiveAdminClient.Instance.Jobs[Content.Id].FirstOrDefault(x => x.Id == Guid.Parse((string) r.Cells[11].Value)));
+          jobs.Add(HiveAdminClient.Instance.Jobs[Content.Id].FirstOrDefault(x => x.Id == Guid.Parse((string)r.Cells[11].Value)));
         }
       }
@@ -310,6 +310,6 @@
       string[,] values = new string[jobs.Count, 13];
 
-      for(int i = 0; i < jobs.Count; i++) {
-        var job = jobs.ElementAt(i);        
+      for (int i = 0; i < jobs.Count; i++) {
+        var job = jobs.ElementAt(i);
         values[i, 0] = job.Job.State.ToString();
         values[i, 1] = job.ExecutionState.ToString();
@@ -322,9 +322,9 @@
         values[i, 8] = job.Job.CalculatingCount.ToString();
         values[i, 9] = job.Job.FinishedCount.ToString();
-        values[i, 10] = job.Job.Description;        
+        values[i, 10] = job.Job.Description;
         values[i, 11] = job.Job.Id.ToString();
         values[i, 12] = job.Job.OwnerUserId.ToString();
       }
-      
+
       var matrix = new StringMatrix(values);
       matrix.ColumnNames = new string[] { JOB_STATE, JOB_EXECUTIONSTATE, JOB_EXECUTIONTIME, JOB_DATECREATED, JOB_OWNER, JOB_NAME, JOB_TASKCOUNT, JOB_WAITINGTASKCOUNT, JOB_CALCULATINGTASKCOUNT, JOB_FINISHEDTASKCOUNT, JOB_DESCRIPTION, JOB_ID, JOB_OWNERID };
@@ -332,12 +332,12 @@
       return matrix;
     }
-    
+
     private void UpdateJobs() {
       if (InvokeRequired) Invoke((Action)UpdateJobs);
       else {
-        if(Content != null && Content.Id != null && Content.Id != Guid.Empty) {
+        if (Content != null && Content.Id != null && Content.Id != Guid.Empty) {
           var matrix = CreateValueMatrix();
           matrixView.Content = matrix;
-          if(matrix != null) {
+          if (matrix != null) {
             foreach (DataGridViewRow row in matrixView.DataGridView.Rows) {
               string val = ((string)row.Cells[0].Value);
@@ -355,5 +355,5 @@
             matrixView.DataGridView.Columns[1].MinimumWidth = 108;
           }
-        } 
+        }
       }
     }
@@ -367,5 +367,5 @@
       var jobList = (IEnumerable<RefreshableJob>)jobs;
       foreach (var job in jobList) {
-        progress.Status = "Resuming job \"" + job.Job.Name + "\"...";
+        progress.Message = "Resuming job \"" + job.Job.Name + "\"...";
         HiveAdminClient.ResumeJob(job);
       }
@@ -375,5 +375,5 @@
       var jobList = (IEnumerable<RefreshableJob>)jobs;
       foreach (var job in jobList) {
-        progress.Status = "Pausing job \"" + job.Job.Name + "\"...";
+        progress.Message = "Pausing job \"" + job.Job.Name + "\"...";
         HiveAdminClient.PauseJob(job);
       }
@@ -381,7 +381,7 @@
 
     private void StopJobsAsync(object jobs) {
-      var jobList = (IEnumerable<RefreshableJob>) jobs;
-      foreach (var job in jobList) {        
-        progress.Status = "Stopping job \"" + job.Job.Name + "\"...";
+      var jobList = (IEnumerable<RefreshableJob>)jobs;
+      foreach (var job in jobList) {
+        progress.Message = "Stopping job \"" + job.Job.Name + "\"...";
         HiveAdminClient.StopJob(job);
       }
@@ -390,7 +390,7 @@
     private void RemoveJobsAsync(object jobs) {
       var jobList = (IEnumerable<RefreshableJob>)jobs;
-      progress.Start();
+      progress.Start("", ProgressMode.Indeterminate);
       foreach (var job in jobList) {
-        progress.Status = "Removing job \"" + job.Job.Name + "\"...";
+        progress.Message = "Removing job \"" + job.Job.Name + "\"...";
         HiveAdminClient.RemoveJob(job);
       }
Index: /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 16430)
@@ -126,5 +126,5 @@
       bool enabled = Content != null && !Locked && !ReadOnly;
       nameTextBox.Enabled = enabled;
-      descriptionTextBox.Enabled = enabled;      
+      descriptionTextBox.Enabled = enabled;
       ownerComboBox.Enabled = enabled;
       createdTextBox.Enabled = enabled;
@@ -160,6 +160,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshing, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        Progress.Show(this, "Refreshing ...", ProgressMode.Indeterminate);
         SetEnabledStateOfControls();
       }
@@ -169,6 +168,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshed, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         SetEnabledStateOfControls();
       }
Index: /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 16430)
@@ -43,5 +43,5 @@
     private const string NOT_STORED_TAG = "*"; // " [not stored]";
     private const string CHANGES_NOT_STORED_TAG = "*"; // " [changes not stored]";
-    private const string INACTIVE_TAG = " [inactive]"; 
+    private const string INACTIVE_TAG = " [inactive]";
 
     private readonly Color selectedBackColor = Color.DodgerBlue;
@@ -111,9 +111,9 @@
 
     protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();      
-
-      bool locked = Content == null || Locked || ReadOnly;      
+      base.SetEnabledStateOfControls();
+
+      bool locked = Content == null || Locked || ReadOnly;
       bool parentOwner = selectedProject != null && HiveAdminClient.Instance.CheckOwnershipOfParentProject(selectedProject, UserInformation.Instance.User.Id);
-      bool selectedProjectDisabled = selectedProject == null 
+      bool selectedProjectDisabled = selectedProject == null
                                      || selectedProject != null && selectedProject.Id == Guid.Empty;
 
@@ -183,6 +183,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveAdminClient_Instance_Refreshing, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        Progress.Show(this, "Refreshing ...", ProgressMode.Indeterminate);
         SetEnabledStateOfControls();
       }
@@ -192,6 +191,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveAdminClient_Instance_Refreshed, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         SetEnabledStateOfControls();
       }
@@ -201,6 +199,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshing, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        Progress.Show(this, "Refreshing ...", ProgressMode.Indeterminate);
         SetEnabledStateOfControls();
       }
@@ -210,6 +207,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshed, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         SetEnabledStateOfControls();
       }
@@ -234,5 +230,5 @@
     }
 
-    private void addButton_Click(object sender, EventArgs e) {      
+    private void addButton_Click(object sender, EventArgs e) {
 
       if (selectedProject == null && !IsAdmin()) {
@@ -244,5 +240,5 @@
         return;
       }
-      
+
       if (selectedProject != null && selectedProject.Id == Guid.Empty) {
         MessageBox.Show(
@@ -256,7 +252,7 @@
       var project = new Project {
         Name = "New Project",
-        OwnerUserId = UserInformation.Instance.User.Id,        
+        OwnerUserId = UserInformation.Instance.User.Id,
       };
-      if(selectedProject != null) {
+      if (selectedProject != null) {
         project.ParentProjectId = selectedProject.Id;
         project.EndDate = selectedProject.EndDate;
@@ -285,5 +281,5 @@
         await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
           action: () => {
-            RemoveProject(selectedProject);  
+            RemoveProject(selectedProject);
           });
       }
@@ -304,5 +300,5 @@
           foreach (var project in projectsToSave)
             project.Store();
-          
+
           UpdateProjects();
         },
@@ -316,5 +312,5 @@
       if (node == null) return;
       var p = (Project)node.Tag;
-      if(!HiveAdminClient.Instance.DisabledParentProjects.Contains(p)) ChangeSelectedProjectNode(node);
+      if (!HiveAdminClient.Instance.DisabledParentProjects.Contains(p)) ChangeSelectedProjectNode(node);
     }
 
@@ -357,5 +353,5 @@
       if (targetNode == null) {
         treeView.Nodes.Add(sourceNode);
-      } else if(targetProject.Id != Guid.Empty) {
+      } else if (targetProject.Id != Guid.Empty) {
         targetNode.Nodes.Add(sourceNode);
         sourceProject.ParentProjectId = targetProject.Id;
@@ -422,5 +418,5 @@
         var newNode = new TreeNode(newProject.Name) { Tag = newProject };
         StyleTreeNode(newNode, newProject);
-      
+
         if (selectedProject == null && !disabledParentProjects.Contains(newProject)) {
           SelectedProject = newProject;
@@ -533,7 +529,7 @@
         if (project.Id != Guid.Empty) {
           SelectedProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(project.Id).LastOrDefault();
-          HiveAdminClient.Delete(project);          
+          HiveAdminClient.Delete(project);
           UpdateProjects();
-        } else {          
+        } else {
           SelectedProject = Content.FirstOrDefault(x => x.Id == project.ParentProjectId);
           Content.Remove(project);
Index: /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 16430)
@@ -185,6 +185,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveAdminClient_Instance_Refreshing, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        Progress.Show(this, "Refreshing ...", ProgressMode.Indeterminate);
         SetEnabledStateOfControls();
       }
@@ -194,6 +193,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveAdminClient_Instance_Refreshed, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         SetEnabledStateOfControls();
       }
@@ -203,6 +201,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshing, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        Progress.Show(this, "Refreshing ...", ProgressMode.Indeterminate);
         SetEnabledStateOfControls();
       }
@@ -212,6 +209,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshed, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         SetEnabledStateOfControls();
       }
@@ -247,5 +243,5 @@
     }
 
-    private async void btnRemoveGroup_Click(object sender, EventArgs e) {      
+    private async void btnRemoveGroup_Click(object sender, EventArgs e) {
       var nodes = GetCheckedNodes(treeView.Nodes).ToList();
       var checkedResources = nodes.Select(x => x.Tag).OfType<Resource>().ToList();
@@ -574,5 +570,5 @@
           foreach (var nr in newResources) Content.Remove(nr);
 
-          HiveAdminClient.Delete(resource);          
+          HiveAdminClient.Delete(resource);
           UpdateResources();
         } else {
@@ -588,10 +584,10 @@
       if (resources == null || !resources.Any()) return;
 
-      var ids = resources.Select(x => x.Id).ToList();      
+      var ids = resources.Select(x => x.Id).ToList();
       try {
         bool update = false;
-        foreach (var r in resources) {          
-          if (r.Id != Guid.Empty)  {
-            if(r.Id == SelectedResource.Id)
+        foreach (var r in resources) {
+          if (r.Id != Guid.Empty) {
+            if (r.Id == SelectedResource.Id)
               SelectedResource = HiveAdminClient.Instance.GetAvailableResourceAncestors(r.Id).LastOrDefault();
 
@@ -751,5 +747,5 @@
 
       foreach (var r in resources) {
-        if(!resourceDescendants.ContainsKey(r.Id))
+        if (!resourceDescendants.ContainsKey(r.Id))
           resourceDescendants.Add(r.Id, new HashSet<Resource>());
       }
Index: /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/MenuItems/RunInHiveMenuItem.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/MenuItems/RunInHiveMenuItem.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/MenuItems/RunInHiveMenuItem.cs	(revision 16430)
@@ -99,5 +99,5 @@
           rJob.Job.ResourceIds = hiveResourceSelectorDialog.SelectedResources.Select(x => x.Id).ToList();
 
-          progress = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToContent(this.content, "Uploading to Hive...");
+          progress = Progress.Show(this.content, "Uploading to Hive...", ProgressMode.Indeterminate);
           rJob.Progress = progress;
           progress.ProgressStateChanged += progress_ProgressStateChanged;
@@ -110,5 +110,5 @@
     private void progress_ProgressStateChanged(object sender, EventArgs e) {
       if (progress.ProgressState != ProgressState.Started) {
-        MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromContent(content);
+        Progress.Hide(content);
         progress.ProgressStateChanged -= progress_ProgressStateChanged;
       }
@@ -116,5 +116,5 @@
 
     private void HandleEx(Exception ex) {
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromContent(content);
+      Progress.Hide(content);
       progress.ProgressStateChanged -= progress_ProgressStateChanged;
       ErrorHandling.ShowErrorDialog("Error uploading tasks", ex);
Index: /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs	(revision 16430)
@@ -96,6 +96,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveClient_Instance_Refreshing, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        Progress.ShowOnControl(this, "Refreshing", ProgressMode.Indeterminate);
         refreshButton.Enabled = false;
       }
@@ -105,6 +104,5 @@
       if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveClient_Instance_Refreshed, sender, e);
       else {
-        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-        mainForm.RemoveOperationProgressFromView(this);
+        Progress.HideFromControl(this);
         refreshButton.Enabled = true;
       }
@@ -140,7 +138,7 @@
       okButton.Enabled = hiveResourceSelector.AssignedResources.Any();
 
-      if(!hiveResourceSelector.AssignedResources.Any()) {
+      if (!hiveResourceSelector.AssignedResources.Any()) {
         errorProvider.SetError(okButton, "Note: currently no resources are assigned");
-      } else if(hiveResourceSelector.AssignedCores == 0) {
+      } else if (hiveResourceSelector.AssignedCores == 0) {
         errorProvider.SetError(okButton, "Note: currently no resources with cores are assigned");
       } else {
Index: /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobListView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobListView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobListView.cs	(revision 16430)
@@ -47,5 +47,5 @@
       this.itemsListView.FullRowSelect = true;
 
-      this.itemsListView.ListViewItemSorter = new ListViewItemComparer(new int[] { 2, 0 }, new SortOrder[] { SortOrder.Ascending, SortOrder.Ascending });      
+      this.itemsListView.ListViewItemSorter = new ListViewItemComparer(new int[] { 2, 0 }, new SortOrder[] { SortOrder.Ascending, SortOrder.Ascending });
 
       foreach (ColumnHeader c in this.itemsListView.Columns) {
@@ -53,5 +53,5 @@
         int w = c.Width;
         c.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
-        if(w > c.Width) {
+        if (w > c.Width) {
           c.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
         }
@@ -120,5 +120,5 @@
 
         task.ContinueWith((t) => {
-          MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+          Progress.Hide(this);
           ErrorHandling.ShowErrorDialog("An error occured while deleting the job. ", t.Exception);
         }, TaskContinuationOptions.OnlyOnFaulted);
@@ -131,9 +131,9 @@
 
     private void DeleteHiveJobsAsync(object items) {
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Deleting job...");
+      Progress.Show(this, "Deleting job...", ProgressMode.Indeterminate);
       foreach (RefreshableJob item in (List<RefreshableJob>)items) {
         Content.Remove(item);
       }
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      Progress.Hide(this);
     }
 
@@ -197,5 +197,5 @@
       listViewItem.SubItems.Insert(1, new ListViewItem.ListViewSubItem(listViewItem, item.Job.Name));
       listViewItem.SubItems.Insert(2, new ListViewItem.ListViewSubItem(listViewItem, HiveClient.Instance.GetProjectAncestry(item.Job.ProjectId)));
-      
+
       listViewItem.Group = GetListViewGroup(item.Job.OwnerUsername);
       return listViewItem;
Index: /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 16430)
@@ -75,5 +75,5 @@
       Content.Loaded += new EventHandler(Content_Loaded);
       Content.TaskReceived += new EventHandler(Content_TaskReceived);
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, Content.Progress);
+      Progress.Show(this, Content.Progress);
     }
 
@@ -90,5 +90,5 @@
       Content.Loaded -= new EventHandler(Content_Loaded);
       Content.TaskReceived -= new EventHandler(Content_TaskReceived);
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this, false);
+      Progress.Hide(this, false);
       DeregisterHiveExperimentEvents();
       DeregisterHiveTasksEvents();
@@ -133,6 +133,6 @@
           stateLogViewHost.Content = null;
         } else {
-          if(Content.Job != null 
-            && Content.Job.Id != Guid.Empty 
+          if (Content.Job != null
+            && Content.Job.Id != Guid.Empty
             && !originalJobProjectAssignment.ContainsKey(Content.Job.Id)) {
             originalJobProjectAssignment.Add(Content.Job.Id, Content.Job.ProjectId);
@@ -159,5 +159,5 @@
                 projectNameTextBox.Text = HiveClient.Instance.GetProjectAncestry(Content.Job.ProjectId);
                 projectNameTextBox.Text += "   (" + (cores.HasValue ? cores.Value.ToString() : "0") + " cores)";
-              }                
+              }
             }
           } else if (Content.Job != null && Content.Job.ProjectId != Guid.Empty) {
@@ -167,5 +167,5 @@
             }
 
-            if(hiveResourceSelectorDialog == null)
+            if (hiveResourceSelectorDialog == null)
               hiveResourceSelectorDialog = new HiveResourceSelectorDialog(Content.Job.Id, Content.Job.ProjectId);
 
@@ -203,5 +203,5 @@
           executionTimeTextBox.Text = Content.ExecutionTime.ToString();
           refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
-          
+
           logView.Content = Content.Log;
           lock (runCollectionViewLocker) {
@@ -408,5 +408,5 @@
       if (hiveResourceSelectorDialog == null) {
         hiveResourceSelectorDialog = new HiveResourceSelectorDialog(Content.Job.Id, Content.Job.ProjectId);
-      } else if(hiveResourceSelectorDialog.JobId != Content.Job.Id) {
+      } else if (hiveResourceSelectorDialog.JobId != Content.Job.Id) {
         hiveResourceSelectorDialog.JobId = Content.Job.Id;
         hiveResourceSelectorDialog.SelectedProjectId = Content.Job.ProjectId;
@@ -418,5 +418,5 @@
           hiveResourceSelectorDialog.ProjectId = Guid.Empty;
         }
-      } else if(hiveResourceSelectorDialog.JobId == Guid.Empty && Content.Job.Id == Guid.Empty) {
+      } else if (hiveResourceSelectorDialog.JobId == Guid.Empty && Content.Job.Id == Guid.Empty) {
         hiveResourceSelectorDialog.JobId = Content.Job.Id;
         hiveResourceSelectorDialog.ProjectId = Guid.Empty;
@@ -430,5 +430,5 @@
       if (hiveResourceSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         selectedProject = hiveResourceSelectorDialog.SelectedProject;
-        if(selectedProject != null) {       
+        if (selectedProject != null) {
           Content.Job.ProjectId = selectedProject.Id;
           Content.Job.ResourceIds = hiveResourceSelectorDialog.SelectedResources.Select(x => x.Id).ToList();
@@ -493,5 +493,5 @@
 
     private void PauseJobAsync(object job) {
-      Content.Progress.Start("Pausing job...");
+      Content.Progress.Start("Pausing job...", ProgressMode.Indeterminate);
       HiveClient.PauseJob((RefreshableJob)job);
       Content.Progress.Finish();
@@ -499,5 +499,5 @@
 
     private void StopJobAsync(object job) {
-      Content.Progress.Start("Stopping job...");
+      Content.Progress.Start("Stopping job...", ProgressMode.Indeterminate);
       HiveClient.StopJob((RefreshableJob)job);
       Content.Progress.Finish();
@@ -505,5 +505,5 @@
 
     private void ResumeJobAsync(object job) {
-      Content.Progress.Start("Resuming job...");
+      Content.Progress.Start("Resuming job...", ProgressMode.Indeterminate);
       HiveClient.ResumeJob((RefreshableJob)job);
       Content.Progress.Finish();
@@ -582,6 +582,6 @@
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = false;
       } else {
-        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0 
-          && Content.Job.ProjectId != Guid.Empty && Content.Job.ResourceIds != null  && Content.Job.ResourceIds.Any() 
+        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0
+          && Content.Job.ProjectId != Guid.Empty && Content.Job.ResourceIds != null && Content.Job.ResourceIds.Any()
           && (Content.ExecutionState == ExecutionState.Prepared || Content.ExecutionState == ExecutionState.Paused) && !Content.IsProgressing;
         pauseButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started && !Content.IsProgressing;
@@ -589,5 +589,5 @@
       }
     }
-   
+
     private Project GetProject(Guid projectId) {
       return HiveServiceLocator.Instance.CallHiveService(s => s.GetProject(projectId));
@@ -595,5 +595,5 @@
 
     private void UpdateSelectorDialog() {
-      if(hiveResourceSelectorDialog != null) {
+      if (hiveResourceSelectorDialog != null) {
         hiveResourceSelectorDialog = null;
         //hiveResourceSelectorDialog.JobId = Content.Job.Id;
Index: /trunk/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 16430)
@@ -46,5 +46,5 @@
     protected override void Job_ItemChanged(object sender, EventArgs e) {
       if (Content != null && Content.Task != null && Content.ItemTask.Item != null) {
-        Content.ExecuteReadActionOnItemTask(new Action(delegate() {
+        Content.ExecuteReadActionOnItemTask(new Action(delegate () {
           runCollectionViewHost.Content = Content.ItemTask.Item.Runs;
         }));
@@ -58,10 +58,10 @@
       base.RegisterContentEvents();
       Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, Content.Progress);
+      Progress.Show(this, Content.Progress);
     }
 
     protected override void DeregisterContentEvents() {
       Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this, false);
+      Progress.Hide(this, false);
       base.DeregisterContentEvents();
     }
@@ -99,5 +99,5 @@
 
     private void PauseTaskAsync() {
-      Content.Progress.Start("Pausing task. Please be patient for the command to take effect.");
+      Content.Progress.Start("Pausing task. Please be patient for the command to take effect.", ProgressMode.Indeterminate);
       Content.Pause();
       Content.Progress.Finish();
@@ -105,5 +105,5 @@
 
     private void StopTaskAsync() {
-      Content.Progress.Start("Stopping task. Please be patient for the command to take effect.");
+      Content.Progress.Start("Stopping task. Please be patient for the command to take effect.", ProgressMode.Indeterminate);
       Content.Stop();
       Content.Progress.Finish();
@@ -111,5 +111,5 @@
 
     private void ResumeTaskAsync() {
-      Content.Progress.Start("Resuming task. Please be patient for the command to take effect.");
+      Content.Progress.Start("Resuming task. Please be patient for the command to take effect.", ProgressMode.Indeterminate);
       Content.Restart();
       Content.Progress.Finish();
Index: /trunk/HeuristicLab.Clients.Hive/3.3/HeuristicLab.Clients.Hive-3.3.csproj
===================================================================
--- /trunk/HeuristicLab.Clients.Hive/3.3/HeuristicLab.Clients.Hive-3.3.csproj	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive/3.3/HeuristicLab.Clients.Hive-3.3.csproj	(revision 16430)
@@ -236,4 +236,9 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
       <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
Index: /trunk/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- /trunk/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 16430)
@@ -167,12 +167,10 @@
         RefreshDisabledParentProjects();
         RefreshDisabledParentResources();
-      }
-      catch {
+      } catch {
         jobs = null;
         projects = null;
         resources = null;
         throw;
-      }
-      finally {
+      } finally {
         OnRefreshed();
       }
@@ -215,14 +213,13 @@
 
     public void RefreshAsync(Action<Exception> exceptionCallback) {
-      var call = new Func<Exception>(delegate() {
+      var call = new Func<Exception>(delegate () {
         try {
           Refresh();
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
           return ex;
         }
         return null;
       });
-      call.BeginInvoke(delegate(IAsyncResult result) {
+      call.BeginInvoke(delegate (IAsyncResult result) {
         Exception ex = call.EndInvoke(result);
         if (ex != null) exceptionCallback(ex);
@@ -244,5 +241,5 @@
       resourceAncestors.Keys.ToList().ForEach(k => resourceDescendants.Add(k, new HashSet<Guid>()));
       foreach (var ra in resourceAncestors) {
-        foreach(var ancestor in ra.Value) {
+        foreach (var ancestor in ra.Value) {
           resourceDescendants[ancestor].Add(ra.Key);
         }
@@ -263,6 +260,6 @@
       // build project descendant list
       projectAncestors.Keys.ToList().ForEach(k => projectDescendants.Add(k, new HashSet<Guid>()));
-      foreach(var pa in projectAncestors) {
-        foreach(var ancestor in pa.Value) {
+      foreach (var pa in projectAncestors) {
+        foreach (var ancestor in pa.Value) {
           projectDescendants[ancestor].Add(pa.Key);
         }
@@ -362,14 +359,13 @@
     }
     public static void StoreAsync(Action<Exception> exceptionCallback, IHiveItem item, CancellationToken cancellationToken) {
-      var call = new Func<Exception>(delegate() {
+      var call = new Func<Exception>(delegate () {
         try {
           Store(item, cancellationToken);
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
           return ex;
         }
         return null;
       });
-      call.BeginInvoke(delegate(IAsyncResult result) {
+      call.BeginInvoke(delegate (IAsyncResult result) {
         Exception ex = call.EndInvoke(result);
         if (ex != null) exceptionCallback(ex);
@@ -460,5 +456,5 @@
     public static void UpdateJob(Action<Exception> exceptionCallback, RefreshableJob refreshableJob, CancellationToken cancellationToken) {
       refreshableJob.IsProgressing = true;
-      refreshableJob.Progress.Status = "Saving Job...";
+      refreshableJob.Progress.Message = "Saving Job...";
       HiveClient.StoreAsync(
         new Action<Exception>((Exception ex) => {
@@ -473,5 +469,5 @@
 
       try {
-        refreshableJob.Progress.Start("Saving Job...");
+        refreshableJob.Progress.Start("Saving Job...", ProgressMode.Indeterminate);
         HiveClient.StoreAsync(new Action<Exception>((Exception ex) => {
           throw new Exception("Update failed.", ex);
@@ -492,5 +488,5 @@
       try {
         refreshableJob.IsProgressing = true;
-        refreshableJob.Progress.Start("Connecting to server...");
+        refreshableJob.Progress.Start("Connecting to server...", ProgressMode.Indeterminate);
 
         foreach (OptimizerHiveTask hiveJob in refreshableJob.HiveTasks.OfType<OptimizerHiveTask>()) {
@@ -499,5 +495,5 @@
 
         // upload Job
-        refreshableJob.Progress.Status = "Uploading Job...";
+        refreshableJob.Progress.Message = "Uploading Job...";
         refreshableJob.Job.Id = HiveServiceLocator.Instance.CallHiveService((s) => s.AddJob(refreshableJob.Job, refreshableJob.Job.ResourceIds));
         refreshableJob.Job = HiveServiceLocator.Instance.CallHiveService((s) => s.GetJob(refreshableJob.Job.Id)); // update owner and permissions
@@ -509,5 +505,5 @@
 
         // upload plugins
-        refreshableJob.Progress.Status = "Uploading plugins...";
+        refreshableJob.Progress.Message = "Uploading plugins...";
         this.OnlinePlugins = HiveServiceLocator.Instance.CallHiveService((s) => s.GetPlugins());
         this.AlreadyUploadedPlugins = new List<Plugin>();
@@ -517,5 +513,7 @@
 
         // upload tasks
-        refreshableJob.Progress.Status = "Uploading tasks...";
+        refreshableJob.Progress.Message = "Uploading tasks...";
+        refreshableJob.Progress.ProgressMode = ProgressMode.Determinate;
+        refreshableJob.Progress.ProgressValue = 0;
 
         var tasks = new List<TS.Task>();
@@ -528,6 +526,5 @@
         }
         TS.Task.WaitAll(tasks.ToArray());
-      }
-      finally {
+      } finally {
         refreshableJob.Job.Modified = false;
         refreshableJob.IsProgressing = false;
@@ -615,5 +612,5 @@
         lock (jobCountLocker) {
           progress.ProgressValue = (double)taskCount[0] / totalJobCount;
-          progress.Status = string.Format("Uploaded task ({0} of {1})", taskCount[0], totalJobCount);
+          progress.Message = string.Format("Uploaded task ({0} of {1})", taskCount[0], totalJobCount);
         }
 
@@ -646,9 +643,11 @@
 
         // fetch all task objects to create the full tree of tree of HiveTask objects
-        refreshableJob.Progress.Start("Downloading list of tasks...");
+        refreshableJob.Progress.Start("Downloading list of tasks...", ProgressMode.Indeterminate);
         allTasks = HiveServiceLocator.Instance.CallHiveService(s => s.GetLightweightJobTasksWithoutStateLog(hiveExperiment.Id));
         totalJobCount = allTasks.Count();
 
-        refreshableJob.Progress.Status = "Downloading tasks...";
+        refreshableJob.Progress.Message = "Downloading tasks...";
+        refreshableJob.Progress.ProgressMode = ProgressMode.Determinate;
+        refreshableJob.Progress.ProgressValue = 0.0;
         downloader = new TaskDownloader(allTasks.Select(x => x.Id));
         downloader.StartAsync();
@@ -656,5 +655,5 @@
         while (!downloader.IsFinished) {
           refreshableJob.Progress.ProgressValue = downloader.FinishedCount / (double)totalJobCount;
-          refreshableJob.Progress.Status = string.Format("Downloading/deserializing tasks... ({0}/{1} finished)", downloader.FinishedCount, totalJobCount);
+          refreshableJob.Progress.Message = string.Format("Downloading/deserializing tasks... ({0}/{1} finished)", downloader.FinishedCount, totalJobCount);
           Thread.Sleep(500);
 
@@ -666,5 +665,7 @@
         var parents = allHiveTasks.Values.Where(x => !x.Task.ParentTaskId.HasValue);
 
-        refreshableJob.Progress.Status = "Downloading/deserializing complete. Displaying tasks...";
+        refreshableJob.Progress.Message = "Downloading/deserializing complete. Displaying tasks...";
+        refreshableJob.Progress.ProgressMode = ProgressMode.Indeterminate;
+
         // build child-task tree
         foreach (HiveTask hiveTask in parents) {
@@ -677,10 +678,9 @@
         } else if (refreshableJob.IsPaused()) {
           refreshableJob.ExecutionState = Core.ExecutionState.Paused;
-        } else { 
+        } else {
           refreshableJob.ExecutionState = Core.ExecutionState.Started;
         }
         refreshableJob.OnLoaded();
-      }
-      finally {
+      } finally {
         refreshableJob.IsProgressing = false;
         refreshableJob.Progress.Finish();
@@ -719,6 +719,5 @@
       try {
         return PersistenceUtil.Deserialize<ItemTask>(taskData.Data);
-      }
-      catch {
+      } catch {
         return null;
       }
@@ -731,6 +730,5 @@
     public static void TryAndRepeat(Action action, int repetitions, string errorMessage, ILog log = null) {
       while (true) {
-        try { action(); return; }
-        catch (Exception e) {
+        try { action(); return; } catch (Exception e) {
           if (repetitions == 0) throw new HiveException(errorMessage, e);
           if (log != null) log.LogMessage(string.Format("{0}: {1} - will try again!", errorMessage, e.ToString()));
Index: /trunk/HeuristicLab.Clients.Hive/3.3/Plugin.cs.frame
===================================================================
--- /trunk/HeuristicLab.Clients.Hive/3.3/Plugin.cs.frame	(revision 16429)
+++ /trunk/HeuristicLab.Clients.Hive/3.3/Plugin.cs.frame	(revision 16430)
@@ -37,4 +37,5 @@
   [PluginDependency("HeuristicLab.Hive", "3.3")]  
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: /trunk/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBExperimentUploadView.cs
===================================================================
--- /trunk/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBExperimentUploadView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBExperimentUploadView.cs	(revision 16430)
@@ -188,5 +188,5 @@
       if (InvokeRequired) { Invoke((Action<object, EventArgs>)RunCreationClient_Refreshing, sender, e); return; }
       var message = "Refreshing algorithms and problems...";
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
+      Progress.Show(this, message, ProgressMode.Indeterminate);
       refreshing = true;
       SetEnabledStateOfControls();
@@ -195,5 +195,5 @@
     private void RunCreationClient_Refreshed(object sender, EventArgs e) {
       if (InvokeRequired) { Invoke((Action<object, EventArgs>)RunCreationClient_Refreshed, sender, e); return; }
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      Progress.Hide(this);
       refreshing = false;
       SetEnabledStateOfControls();
@@ -203,5 +203,5 @@
       var task = System.Threading.Tasks.Task.Factory.StartNew(UploadAsync);
       task.ContinueWith((t) => {
-        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
         PluginInfrastructure.ErrorHandling.ShowErrorDialog("An exception occured while uploading the runs to the OKB.", t.Exception);
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -210,5 +210,5 @@
     private void UploadAsync() {
       var message = "Uploading runs to OKB...";
-      IProgress progress = MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
+      IProgress progress = Progress.Show(this, message);
       double count = dataGridView.Rows.Count;
       int i = 0;
@@ -226,5 +226,5 @@
         progress.ProgressValue = ((double)i) / count;
       }
-      MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+      Progress.Hide(this);
       ClearRuns();
     }
Index: /trunk/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs
===================================================================
--- /trunk/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 16429)
+++ /trunk/HeuristicLab.DataPreprocessing.Views/3.4/DataPreprocessingView.cs	(revision 16430)
@@ -165,11 +165,8 @@
         await Task.Run(() => {
           TProblemData instance;
-          var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
           // lock active view and show progress bar
-          var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
 
           try {
-            var progress = mainForm.AddOperationProgressToContent(activeView.Content, "Loading problem instance.");
-
+            var progress = Progress.Show(Content, "Loading problem instance.");
             instanceProvider.ProgressChanged += (o, args) => { progress.ProgressValue = args.ProgressPercentage / 100.0; };
 
@@ -177,5 +174,5 @@
           } catch (IOException ex) {
             MessageBox.Show(string.Format("There was an error parsing the file: {0}", Environment.NewLine + ex.Message), "Error while parsing", MessageBoxButtons.OK, MessageBoxIcon.Error);
-            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            Progress.Hide(Content);
             return;
           }
@@ -185,5 +182,5 @@
             MessageBox.Show(string.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(importDialog.Path), Environment.NewLine + ex.Message), "Cannot load instance");
           } finally {
-            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            Progress.Hide(Content);
           }
         });
@@ -222,11 +219,9 @@
           var storable = itemCreator() as IStorableContent;
           if (storable != null) {
-            var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
-            var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
             try {
-              mainForm.AddOperationProgressToContent(activeView.Content, "Exporting data.");
+              Progress.Show(Content, "Exporting data.", ProgressMode.Indeterminate);
               ContentManager.Save(storable, saveFileDialog.FileName, compressed);
             } finally {
-              mainForm.RemoveOperationProgressFromContent(activeView.Content);
+              Progress.Hide(Content);
             }
           }
@@ -244,9 +239,7 @@
       if (saveFileDialog.ShowDialog() == DialogResult.OK) {
         Task.Run(() => {
-          var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
-          var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
           try {
             var problemData = Content.CreateNewProblemData();
-            mainForm.AddOperationProgressToContent(activeView.Content, "Exporting data.");
+            Progress.Show(Content, "Exporting data.", ProgressMode.Indeterminate);
             if (problemData is TimeSeriesPrognosisProblemData)
               Export(new TimeSeriesPrognosisCSVInstanceProvider(), problemData, saveFileDialog.FileName);
@@ -256,5 +249,5 @@
               Export(new ClassificationCSVInstanceProvider(), problemData, saveFileDialog.FileName);
           } finally {
-            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            Progress.Hide(Content);
           }
         });
Index: /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs
===================================================================
--- /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs	(revision 16429)
+++ /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs	(revision 16430)
@@ -25,7 +25,4 @@
 namespace HeuristicLab.MainForm.WindowsForms {
   internal sealed partial class ProgressView : UserControl {
-    private const int defaultControlHeight = 88;
-    private const int collapsedControlHeight = 55;
-
     private readonly Control control;
     public Control Control {
@@ -40,19 +37,16 @@
     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.");
+      if (control == null) throw new ArgumentNullException("control");
+      if (content == null) throw new ArgumentNullException("content");
       InitializeComponent();
 
       this.control = control;
       this.content = content;
-      if (content.ProgressState == ProgressState.Started)
+
+      if (content.ProgressState != ProgressState.Finished)
         ShowProgress();
       RegisterContentEvents();
     }
 
-    /// <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();
@@ -66,14 +60,41 @@
 
     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);
+      Content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged);
+      Content.MessageChanged += new EventHandler(Content_MessageChanged);
+      Content.ProgressBarModeChanged += new EventHandler(Content_ProgressBarModeChanged);
+      Content.ProgressValueChanged += new EventHandler(Content_ProgressValueChanged);
+      Content.CanBeStoppedChanged += new EventHandler(Content_CanBeStoppedChanged);
+      Content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged);
     }
     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);
+      Content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged);
+      Content.MessageChanged -= new EventHandler(Content_MessageChanged);
+      Content.ProgressBarModeChanged -= new EventHandler(Content_ProgressBarModeChanged);
+      Content.ProgressValueChanged -= new EventHandler(Content_ProgressValueChanged);
+      Content.CanBeStoppedChanged -= new EventHandler(Content_CanBeStoppedChanged);
+      Content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged);
+    }
+
+    private void Content_ProgressStateChanged(object sender, EventArgs e) {
+      UpdateProgressState();
+      UpdateButtonsState();
+    }
+
+    private void Content_MessageChanged(object sender, EventArgs e) {
+      UpdateProgressMessage();
+    }
+
+    private void Content_ProgressBarModeChanged(object sender, EventArgs e) {
+      UpdateProgressValue();
+    }
+    private void Content_ProgressValueChanged(object sender, EventArgs e) {
+      UpdateProgressValue();
+    }
+
+    private void Content_CanBeStoppedChanged(object sender, EventArgs e) {
+      UpdateButtonsState();
+    }
+    private void Content_CanBeCanceledChanged(object sender, EventArgs e) {
+      UpdateButtonsState();
     }
 
@@ -83,94 +104,91 @@
         return;
       }
-      int height = Content.CanBeCanceled ? Height : collapsedControlHeight;
+      if (Parent != null) return;
 
       Left = (Control.ClientRectangle.Width / 2) - (Width / 2);
-      Top = (Control.ClientRectangle.Height / 2) - (height / 2);
+      Top = (Control.ClientRectangle.Height / 2) - (Height / 2);
       Anchor = AnchorStyles.None;
 
-      control.Enabled = false;
+      UpdateProgressMessage();
+      UpdateProgressValue();
+      UpdateButtonsState();
+
+      Control.Enabled = false;
       Parent = Control.Parent;
       BringToFront();
-
-      UpdateProgressValue();
-      UpdateProgressStatus();
-      UpdateCancelButton();
       Visible = true;
     }
 
     private void HideProgress() {
-      if (InvokeRequired) Invoke((Action)HideProgress);
-      else {
-        control.Enabled = true;
-        Parent = null;
-        Visible = false;
+      if (Control.InvokeRequired) {
+        Control.Invoke((Action)HideProgress);
+        return;
+      }
+      if (Parent == null) return;
+
+      Visible = false;
+      Control.Enabled = true;
+      Parent = null;
+    }
+
+    private void UpdateProgressState() {
+      if (Control.InvokeRequired) {
+        Control.Invoke((Action)UpdateProgressState);
+        return;
+      }
+
+      if (Content.ProgressState != ProgressState.Finished)
+        ShowProgress();
+      else
+        HideProgress();
+    }
+
+    private void UpdateProgressMessage() {
+      if (Control.InvokeRequired) {
+        Control.Invoke((Action)UpdateProgressMessage);
+        return;
+      }
+
+      messageLabel.Text = content.Message;
+    }
+
+    private void UpdateProgressValue() {
+      if (InvokeRequired) {
+        Invoke((Action)UpdateProgressValue);
+        return;
+      }
+
+      switch (Content.ProgressMode) {
+        case ProgressMode.Determinate:
+          progressBar.Style = ProgressBarStyle.Continuous;
+          progressBar.Value = (int)Math.Round(progressBar.Minimum + content.ProgressValue * (progressBar.Maximum - progressBar.Minimum));
+          break;
+        case ProgressMode.Indeterminate:
+          progressBar.Style = ProgressBarStyle.Marquee;
+          progressBar.Value = 0;
+          break;
+        default:
+          throw new NotImplementedException($"Invalid Progress Mode: {content.ProgressMode}");
       }
     }
 
-    private void progress_StatusChanged(object sender, EventArgs e) {
-      UpdateProgressStatus();
+    private void UpdateButtonsState() {
+      if (Control.InvokeRequired) {
+        Control.Invoke((Action)UpdateButtonsState);
+        return;
+      }
+
+      stopButton.Visible = Content.CanBeStopped;
+      stopButton.Enabled = Content.CanBeStopped && content.ProgressState == ProgressState.Started;
+
+      cancelButton.Visible = Content.CanBeCanceled;
+      cancelButton.Enabled = Content.CanBeCanceled && content.ProgressState == ProgressState.Started;
     }
 
-    private void progress_ProgressValueChanged(object sender, EventArgs e) {
-      UpdateProgressValue();
+    private void stopButton_Click(object sender, EventArgs e) {
+      Content.Stop();
     }
-
-    private void Content_ProgressStateChanged(object sender, EventArgs e) {
-      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) {
-      UpdateCancelButton();
-    }
-
-    private void UpdateCancelButton() {
-      cancelButton.Visible = content != null && content.CanBeCanceled;
-      cancelButton.Enabled = content != null && content.CanBeCanceled;
-
-      if (content != null && content.CanBeCanceled) {
-        Height = defaultControlHeight;
-      } else if (content != null && !content.CanBeCanceled) {
-        Height = collapsedControlHeight;
-      }
-    }
-
-    private void UpdateProgressValue() {
-      // prevent problems with object disposal and invoke as suggested by http://stackoverflow.com/a/18647091
-      if (!IsHandleCreated) return;
-      if (InvokeRequired) {
-        try {
-          Invoke((Action)UpdateProgressValue);
-        }
-        catch (InvalidOperationException) {
-          // swallow ObjectDisposedException 
-          // which might occur if the invoke call is executed after or while the control is disposing
-        }
-      } else {
-        if (content != null) {
-          double progressValue = content.ProgressValue;
-          if (progressValue <= 0.0 || progressValue > 1.0) {
-            progressBar.Style = ProgressBarStyle.Marquee;
-          } else {
-            progressBar.Style = ProgressBarStyle.Blocks;
-            progressBar.Value =
-              (int)Math.Round(progressBar.Minimum + progressValue * (progressBar.Maximum - progressBar.Minimum));
-          }
-        }
-      }
-    }
-
-    private void UpdateProgressStatus() {
-      if (InvokeRequired) Invoke((Action)UpdateProgressStatus);
-      else if (content != null)
-        statusLabel.Text = content.Status;
-    }
-
     private void cancelButton_Click(object sender, EventArgs e) {
-      content.Cancel();
+      Content.Cancel();
     }
   }
Index: /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs
===================================================================
--- /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs	(revision 16429)
+++ /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs	(revision 16430)
@@ -27,5 +27,5 @@
     private System.ComponentModel.IContainer components = null;
 
-   
+
     #region Component Designer generated code
 
@@ -36,7 +36,10 @@
     private void InitializeComponent() {
       this.progressBar = new System.Windows.Forms.ProgressBar();
-      this.statusLabel = new System.Windows.Forms.Label();
+      this.messageLabel = new System.Windows.Forms.Label();
+      this.borderPanel = new System.Windows.Forms.Panel();
+      this.panel = new System.Windows.Forms.Panel();
+      this.stopButton = new System.Windows.Forms.Button();
       this.cancelButton = new System.Windows.Forms.Button();
-      this.panel = new System.Windows.Forms.Panel();
+      this.borderPanel.SuspendLayout();
       this.panel.SuspendLayout();
       this.SuspendLayout();
@@ -48,21 +51,58 @@
       this.progressBar.Location = new System.Drawing.Point(3, 3);
       this.progressBar.Name = "progressBar";
-      this.progressBar.Size = new System.Drawing.Size(352, 23);
+      this.progressBar.Size = new System.Drawing.Size(366, 23);
       this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
       this.progressBar.TabIndex = 0;
       // 
-      // statusLabel
+      // messageLabel
       // 
-      this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+      this.messageLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.messageLabel.Location = new System.Drawing.Point(0, 0);
+      this.messageLabel.Name = "messageLabel";
+      this.messageLabel.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0);
+      this.messageLabel.Size = new System.Drawing.Size(217, 23);
+      this.messageLabel.TabIndex = 1;
+      this.messageLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // borderPanel
+      // 
+      this.borderPanel.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.statusLabel.Location = new System.Drawing.Point(3, 33);
-      this.statusLabel.Name = "statusLabel";
-      this.statusLabel.Size = new System.Drawing.Size(352, 17);
-      this.statusLabel.TabIndex = 1;
+      this.borderPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.borderPanel.Controls.Add(this.panel);
+      this.borderPanel.Controls.Add(this.progressBar);
+      this.borderPanel.Location = new System.Drawing.Point(0, 0);
+      this.borderPanel.Name = "borderPanel";
+      this.borderPanel.Size = new System.Drawing.Size(374, 62);
+      this.borderPanel.TabIndex = 3;
+      // 
+      // 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.Controls.Add(this.messageLabel);
+      this.panel.Controls.Add(this.stopButton);
+      this.panel.Controls.Add(this.cancelButton);
+      this.panel.Location = new System.Drawing.Point(3, 32);
+      this.panel.Name = "panel";
+      this.panel.Size = new System.Drawing.Size(367, 23);
+      this.panel.TabIndex = 4;
+      // 
+      // stopButton
+      // 
+      this.stopButton.Dock = System.Windows.Forms.DockStyle.Right;
+      this.stopButton.Location = new System.Drawing.Point(217, 0);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(75, 23);
+      this.stopButton.TabIndex = 3;
+      this.stopButton.Text = "Stop";
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
       // 
       // cancelButton
       // 
-      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.cancelButton.Location = new System.Drawing.Point(280, 53);
+      this.cancelButton.Dock = System.Windows.Forms.DockStyle.Right;
+      this.cancelButton.Location = new System.Drawing.Point(292, 0);
       this.cancelButton.Name = "cancelButton";
       this.cancelButton.Size = new System.Drawing.Size(75, 23);
@@ -72,24 +112,11 @@
       this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
       // 
-      // panel
-      // 
-      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);
-      this.panel.Controls.Add(this.cancelButton);
-      this.panel.Controls.Add(this.statusLabel);
-      this.panel.Location = new System.Drawing.Point(0, 0);
-      this.panel.Name = "panel";
-      this.panel.Size = new System.Drawing.Size(360, 88);
-      this.panel.TabIndex = 3;
-      // 
       // ProgressView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.panel);
+      this.Controls.Add(this.borderPanel);
       this.Name = "ProgressView";
-      this.Size = new System.Drawing.Size(360, 88);
+      this.Size = new System.Drawing.Size(374, 62);
+      this.borderPanel.ResumeLayout(false);
       this.panel.ResumeLayout(false);
       this.ResumeLayout(false);
@@ -100,7 +127,9 @@
 
     private System.Windows.Forms.ProgressBar progressBar;
-    private System.Windows.Forms.Label statusLabel;
+    private System.Windows.Forms.Label messageLabel;
+    private System.Windows.Forms.Panel borderPanel;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Panel panel;
     private System.Windows.Forms.Button cancelButton;
-    private System.Windows.Forms.Panel panel;
   }
 }
Index: /trunk/HeuristicLab.MainForm.WindowsForms/3.3/HeuristicLab.MainForm.WindowsForms-3.3.csproj
===================================================================
--- /trunk/HeuristicLab.MainForm.WindowsForms/3.3/HeuristicLab.MainForm.WindowsForms-3.3.csproj	(revision 16429)
+++ /trunk/HeuristicLab.MainForm.WindowsForms/3.3/HeuristicLab.MainForm.WindowsForms-3.3.csproj	(revision 16430)
@@ -151,4 +151,5 @@
     </Compile>
     <Compile Include="Plugin.cs" />
+    <Compile Include="Progress.cs" />
     <Compile Include="Views\AsynchronousContentView.cs">
       <SubType>UserControl</SubType>
Index: /trunk/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs
===================================================================
--- /trunk/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs	(revision 16429)
+++ /trunk/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs	(revision 16430)
@@ -61,5 +61,5 @@
       set {
         if (InvokeRequired) {
-          Action<string> action = delegate(string s) { this.Title = s; };
+          Action<string> action = delegate (string s) { this.Title = s; };
           Invoke(action, value);
         } else
@@ -72,5 +72,5 @@
       set {
         if (InvokeRequired) {
-          Action<Cursor> action = delegate(Cursor c) { this.Cursor = c; };
+          Action<Cursor> action = delegate (Cursor c) { this.Cursor = c; };
           Invoke(action, value);
         } else
@@ -95,5 +95,5 @@
         if (this.activeView != value) {
           if (InvokeRequired) {
-            Action<IView> action = delegate(IView activeView) { this.ActiveView = activeView; };
+            Action<IView> action = delegate (IView activeView) { this.ActiveView = activeView; };
             Invoke(action, value);
           } else {
@@ -230,5 +230,5 @@
     }
 
-    public IContentView ShowContent<T>(T content, bool reuseExistingView, IEqualityComparer<T> comparer = null) where T : class,IContent {
+    public IContentView ShowContent<T>(T content, bool reuseExistingView, IEqualityComparer<T> comparer = null) where T : class, IContent {
       if (content == null) throw new ArgumentNullException("Content cannot be null.");
       if (!reuseExistingView) return ShowContent(content);
@@ -353,8 +353,8 @@
     /// 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) {
+    internal void AddProgressToContent(IContent content, IProgress progress, bool addToObjectGraphObjects) {
       if (InvokeRequired) {
-        IProgress result = (IProgress)Invoke((Func<IContent, string, bool, IProgress>)AddOperationProgressToContent, content, progressMessage, addToObjectGraphObjects);
-        return result;
+        Invoke((Action<IContent, IProgress, bool>)AddProgressToContent, content, progress, addToObjectGraphObjects);
+        return;
       }
       if (contentProgressLookup.ContainsKey(content))
@@ -371,5 +371,4 @@
         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));
@@ -377,5 +376,4 @@
 
       contentProgressLookup[content] = progress;
-      return progress;
     }
 
@@ -383,13 +381,7 @@
     /// 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) {
+    internal void AddProgressToControl(Control control, IProgress progress) {
       if (InvokeRequired) {
-        Invoke((Action<Control, IProgress>)AddOperationProgressToView, control, progress);
+        Invoke((Action<Control, IProgress>)AddProgressToControl, control, progress);
         return;
       }
@@ -413,7 +405,7 @@
     /// 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) {
+    internal void RemoveProgressFromContent(IContent content, bool finishProgress) {
       if (InvokeRequired) {
-        Invoke((Action<IContent, bool>)RemoveOperationProgressFromContent, content, finishProgress);
+        Invoke((Action<IContent, bool>)RemoveProgressFromContent, content, finishProgress);
         return;
       }
@@ -429,5 +421,4 @@
       }
       contentProgressLookup.Remove(content);
-
     }
 
@@ -435,7 +426,7 @@
     /// Removes an existing <see cref="ProgressView"/> from the specified view.
     /// </summary>
-    public void RemoveOperationProgressFromView(Control control, bool finishProgress = true) {
+    internal void RemoveProgressFromControl(Control control, bool finishProgress) {
       if (InvokeRequired) {
-        Invoke((Action<Control, bool>)RemoveOperationProgressFromView, control, finishProgress);
+        Invoke((Action<Control, bool>)RemoveProgressFromControl, control, finishProgress);
         return;
       }
@@ -560,6 +551,5 @@
       try {
         ((IActionUserInterfaceItem)item.Tag).Execute();
-      }
-      catch (Exception ex) {
+      } catch (Exception ex) {
         ErrorHandling.ShowErrorDialog((Control)MainFormManager.MainForm, ex);
       }
Index: /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Progress.cs
===================================================================
--- /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Progress.cs	(revision 16430)
+++ /trunk/HeuristicLab.MainForm.WindowsForms/3.3/Progress.cs	(revision 16430)
@@ -0,0 +1,266 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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;
+
+namespace HeuristicLab.MainForm {
+  public class Progress : IProgress {
+    private ProgressState progressState;
+    public ProgressState ProgressState {
+      get { return progressState; }
+      private set {
+        if (progressState != value) {
+          progressState = value;
+          OnProgressStateChanged();
+        }
+      }
+    }
+
+    private string message;
+    public string Message {
+      get { return message; }
+      set {
+        if (message != value) {
+          message = value;
+          OnMessageChanged();
+        }
+      }
+    }
+
+    private ProgressMode progressMode;
+    public ProgressMode ProgressMode {
+      get { return progressMode; }
+      set {
+        if (progressMode != value) {
+          progressMode = value;
+          OnProgressBarModeChanged();
+        }
+      }
+    }
+
+    private double progressValue;
+    public double ProgressValue {
+      get { return progressValue; }
+      set {
+        if (progressMode == ProgressMode.Indeterminate)
+          throw new InvalidOperationException("Cannot set ProgressValue while ProgressBar is in Indeterminate-Mode");
+        if (progressValue != value) {
+          progressValue = Math.Max(Math.Min(value, 1.0), 0.0);
+          OnProgressChanged();
+        }
+      }
+    }
+
+    private bool canBeStopped;
+    public bool CanBeStopped {
+      get { return canBeStopped; }
+      set {
+        if (canBeStopped != value) {
+          canBeStopped = value;
+          OnCanBeStoppedChanged();
+        }
+      }
+    }
+
+    private bool canBeCanceled;
+    public bool CanBeCanceled {
+      get { return canBeCanceled; }
+      set {
+        if (canBeCanceled != value) {
+          canBeCanceled = value;
+          OnCanBeCanceledChanged();
+        }
+      }
+    }
+
+    public Progress() {
+      progressState = ProgressState.Finished;
+      canBeStopped = false;
+      canBeCanceled = false;
+      progressMode = ProgressMode.Indeterminate;
+      progressValue = 0.0;
+    }
+
+    public void Start(string message, ProgressMode mode = ProgressMode.Determinate) {
+      ProgressState = ProgressState.Started;
+      ProgressMode = mode;
+      if (mode == ProgressMode.Determinate)
+        ProgressValue = 0.0;
+      Message = message;
+    }
+
+    public void Finish() {
+      if (ProgressMode == ProgressMode.Determinate && ProgressValue != 1.0)
+        ProgressValue = 1.0;
+      ProgressState = ProgressState.Finished;
+    }
+
+    public void Stop() {
+      if (canBeStopped) {
+        ProgressState = ProgressState.StopRequested;
+        OnStopRequested();
+      } else throw new NotSupportedException("This progress cannot be stopped.");
+    }
+    public void Cancel() {
+      if (canBeCanceled) {
+        ProgressState = ProgressState.CancelRequested;
+        OnCancelRequested();
+      } else throw new NotSupportedException("This progress cannot be canceled.");
+    }
+
+    #region Show and Hide Progress
+    /// <summary>
+    /// Shows a started Progress on all Views of the specified content.
+    /// </summary>
+    public static IProgress Show(IContent content, string progressMessage, ProgressMode mode = ProgressMode.Determinate, Action stopRequestHandler = null, Action cancelRequestHandler = null, bool addToObjectGraphObjects = true) {
+      var progress = CreateAndStartProgress(progressMessage, mode, stopRequestHandler, cancelRequestHandler);
+      Show(content, progress, addToObjectGraphObjects);
+      return progress;
+    }
+
+    /// <summary>
+    /// Shows a started Progress on the specified view.
+    /// </summary>
+    public static IProgress Show(IView view, string progressMessage, ProgressMode mode = ProgressMode.Determinate, Action stopRequestHandler = null, Action cancelRequestHandler = null) {
+      var progress = CreateAndStartProgress(progressMessage, mode, stopRequestHandler, cancelRequestHandler);
+      Show(view, progress);
+      return progress;
+    }
+    /// <summary>
+    /// Shows a started Progress on the specified control.
+    /// </summary>
+    /// <remarks>For backwards compatibility. Use Progress.Show(IView, ...) if possible.</remarks>
+    public static IProgress ShowOnControl(Control control, string progressMessage, ProgressMode mode = ProgressMode.Determinate, Action stopRequestHandler = null, Action cancelRequestHandler = null) {
+      var progress = CreateAndStartProgress(progressMessage, mode, stopRequestHandler, cancelRequestHandler);
+      ShowOnControl(control, progress);
+      return progress;
+    }
+
+    private static IProgress CreateAndStartProgress(string progressMessage, ProgressMode mode, Action stopRequestHandler, Action cancelRequestHandler) {
+      var progress = new Progress();
+      if (stopRequestHandler != null) {
+        progress.CanBeStopped = true;
+        progress.StopRequested += (s, a) => stopRequestHandler();
+      }
+      if (cancelRequestHandler != null) {
+        progress.CanBeCanceled = true;
+        progress.CancelRequested += (s, a) => cancelRequestHandler();
+      }
+      progress.Start(progressMessage, mode);
+      return progress;
+    }
+
+    /// <summary>
+    /// Shows an existing progress on all Views of the specified content.
+    /// </summary>
+    public static IProgress Show(IContent content, IProgress progress, bool addToObjectGraphObjects = true) {
+      MainFormManager.GetMainForm<WindowsForms.MainForm>().AddProgressToContent(content, progress, addToObjectGraphObjects);
+      return progress;
+    }
+    /// <summary>
+    /// Shows an existing progress on the specified View.
+    /// </summary>
+    public static IProgress Show(IView view, IProgress progress) {
+      return ShowOnControl((Control)view, progress);
+    }
+    /// <summary>
+    /// Shows an existing progress on the specified control.
+    /// </summary>
+    /// <remarks>For backwards compatibility. Use Progress.Show(IView, ...) if possible.</remarks>
+    public static IProgress ShowOnControl(Control control, IProgress progress) {
+      MainFormManager.GetMainForm<WindowsForms.MainForm>().AddProgressToControl(control, progress);
+      return progress;
+    }
+
+    /// <summary>
+    /// Hides the Progress from all Views of the specified content.
+    /// </summary>
+    public static void Hide(IContent content, bool finishProgress = true) {
+      MainFormManager.GetMainForm<WindowsForms.MainForm>().RemoveProgressFromContent(content, finishProgress);
+    }
+    /// <summary>
+    /// Hides the Progress from the specified view.
+    /// </summary>
+    public static void Hide(IView view, bool finishProgress = true) {
+      HideFromControl((Control)view, finishProgress);
+    }
+    /// <summary>
+    /// Hides the Progress from the specified control.
+    /// </summary>
+    /// <remarks>For backwards compatibility. Use Progress.Hide(IView) if possible.</remarks>
+    public static void HideFromControl(Control control, bool finishProgress = true) {
+      MainFormManager.GetMainForm<WindowsForms.MainForm>().RemoveProgressFromControl(control, finishProgress);
+    }
+    #endregion
+
+    #region Event Handler
+    public event EventHandler ProgressStateChanged;
+    private void OnProgressStateChanged() {
+      var handler = ProgressStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler MessageChanged;
+    private void OnMessageChanged() {
+      var handler = MessageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProgressBarModeChanged;
+    private void OnProgressBarModeChanged() {
+      var handler = ProgressBarModeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProgressValueChanged;
+    private void OnProgressChanged() {
+      var handler = ProgressValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler CanBeStoppedChanged;
+    private void OnCanBeStoppedChanged() {
+      var handler = CanBeStoppedChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler CanBeCanceledChanged;
+    private void OnCanBeCanceledChanged() {
+      var handler = CanBeCanceledChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler StopRequested;
+    private void OnStopRequested() {
+      var handler = StopRequested;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler CancelRequested;
+    private void OnCancelRequested() {
+      var handler = CancelRequested;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+  }
+}
Index: /trunk/HeuristicLab.MainForm/3.3/HeuristicLab.MainForm-3.3.csproj
===================================================================
--- /trunk/HeuristicLab.MainForm/3.3/HeuristicLab.MainForm-3.3.csproj	(revision 16429)
+++ /trunk/HeuristicLab.MainForm/3.3/HeuristicLab.MainForm-3.3.csproj	(revision 16430)
@@ -124,5 +124,4 @@
     <Compile Include="Interfaces\IProgress.cs" />
     <Compile Include="Plugin.cs" />
-    <Compile Include="Progress.cs" />
     <Compile Include="ViewAttribute.cs" />
     <Compile Include="Interfaces\IContentView.cs" />
Index: /trunk/HeuristicLab.MainForm/3.3/Interfaces/IProgress.cs
===================================================================
--- /trunk/HeuristicLab.MainForm/3.3/Interfaces/IProgress.cs	(revision 16429)
+++ /trunk/HeuristicLab.MainForm/3.3/Interfaces/IProgress.cs	(revision 16430)
@@ -24,66 +24,35 @@
 
 namespace HeuristicLab.MainForm {
-  public enum ProgressState { Started = 1, Canceled = 2, Finished = 3 };
+  public enum ProgressState { Started, Finished, StopRequested, CancelRequested }
+  public enum ProgressMode { Determinate, Indeterminate }
 
   public interface IProgress : IContent {
+    ProgressState ProgressState { get; }
+
+    string Message { get; set; }
+
+    ProgressMode ProgressMode { get; set; }
     /// <summary>
-    /// Gets or sets the currently associated status text with the progress.
+    /// Gets or sets the currently associated progress value in the range [0;1] (values outside the range are truncated).
+    /// Changing the ProgressValue when <c>ProgressMode</c> is <c>Indeterminate</c> raises an Exception.
     /// </summary>
-    string Status { get; set; }
-    /// <summary>
-    /// 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>
+    /// <exception cref="InvalidOperationException">Setting the ProgressValue-property while in the Indeterminate state is invalid.</exception>
     double ProgressValue { get; set; }
-    /// <summary>
-    /// 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.
-    /// </summary>
-    ProgressState ProgressState { get; }
-    /// <summary>
-    /// Returns whether the operation can be canceled or not.
-    /// This can change during the course of the progress.
-    /// </summary>
-    bool CanBeCanceled { get; }
 
-    /// <summary>
-    /// Requests the operation behind the process to cancel.
-    /// Check the !ProgressState property when the cancellation succeeded.
-    /// The corresponding event will also notify of a success.
-    /// </summary>
-    /// <exception cref="NotSupportedException">Thrown when cancellation is not supported.</exception>
+    bool CanBeStopped { get; set; }
+    bool CanBeCanceled { get; set; }
+
+    void Start(string message, ProgressMode mode = ProgressMode.Determinate);
+    void Finish();
+    void Stop();
     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>
-    /// The status text changed.
-    /// </summary>
-    event EventHandler StatusChanged;
-    /// <summary>
-    /// The value of the progress changed. This is the (0;1] progress value from starting to finish. Values outside this range are permitted and need to be handled in some feasible manner.
-    /// </summary>
+    event EventHandler ProgressStateChanged;
+    event EventHandler MessageChanged;
+    event EventHandler ProgressBarModeChanged;
     event EventHandler ProgressValueChanged;
-    /// <summary>
-    /// The state of the progress changed. The handler is supposed to query the ProgressState property.
-    /// </summary>
-    event EventHandler ProgressStateChanged;
-    /// <summary>
-    /// The progress' ability to cancel changed.
-    /// </summary>
+    event EventHandler CanBeStoppedChanged;
     event EventHandler CanBeCanceledChanged;
-    /// <summary>
-    /// A cancelation is requested.
-    /// </summary>
+    event EventHandler StopRequested;
     event EventHandler CancelRequested;
   }
Index: unk/HeuristicLab.MainForm/3.3/Progress.cs
===================================================================
--- /trunk/HeuristicLab.MainForm/3.3/Progress.cs	(revision 16429)
+++ 	(revision )
@@ -1,137 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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;
-
-namespace HeuristicLab.MainForm {
-  public class Progress : IProgress {
-    private string status;
-    public string Status {
-      get { return status; }
-      set {
-        if (status != value) {
-          status = value;
-          OnStatusChanged();
-        }
-      }
-    }
-
-    private double progressValue;
-    public double ProgressValue {
-      get { return progressValue; }
-      set {
-        if (progressValue != value) {
-          progressValue = value;
-          OnProgressChanged();
-        }
-      }
-    }
-
-    private ProgressState progressState;
-    public ProgressState ProgressState {
-      get { return progressState; }
-      private set {
-        if (progressState != value) {
-          progressState = value;
-          OnProgressStateChanged();
-        }
-      }
-    }
-
-    private bool canBeCanceled;
-    public bool CanBeCanceled {
-      get { return canBeCanceled; }
-      set {
-        if (canBeCanceled != value) {
-          canBeCanceled = value;
-          OnCanBeCanceledChanged();
-        }
-      }
-    }
-
-    public Progress() {
-      progressState = ProgressState.Finished;
-      canBeCanceled = false;
-    }
-    public Progress(string status)
-      : this() {
-      this.status = status;
-    }
-    public Progress(string status, ProgressState state)
-      : this() {
-      this.status = status;
-      this.progressState = state;
-    }
-
-    public void Cancel() {
-      if (canBeCanceled)
-        OnCancelRequested();
-    }
-
-    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;
-    }
-
-    #region Event Handler
-    public event EventHandler StatusChanged;
-    private void OnStatusChanged() {
-      var handler = StatusChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler ProgressValueChanged;
-    private void OnProgressChanged() {
-      var handler = ProgressValueChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler ProgressStateChanged;
-    private void OnProgressStateChanged() {
-      var handler = ProgressStateChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler CanBeCanceledChanged;
-    private void OnCanBeCanceledChanged() {
-      var handler = CanBeCanceledChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler CancelRequested;
-    private void OnCancelRequested() {
-      var handler = CancelRequested;
-      if (handler != null) throw new NotSupportedException("Cancel request was ignored.");
-      else handler(this, EventArgs.Empty);
-    }
-    #endregion
-  }
-}
Index: /trunk/HeuristicLab.Optimizer/3.3/FileManager.cs
===================================================================
--- /trunk/HeuristicLab.Optimizer/3.3/FileManager.cs	(revision 16429)
+++ /trunk/HeuristicLab.Optimizer/3.3/FileManager.cs	(revision 16430)
@@ -78,9 +78,7 @@
         if (view == null)
           ErrorHandling.ShowErrorDialog("There is no view for the loaded item. It cannot be displayed.", new InvalidOperationException("No View Available"));
-      }
-      catch (Exception ex) {
+      } catch (Exception ex) {
         ErrorHandling.ShowErrorDialog((Control)MainFormManager.MainForm, "Cannot open file.", ex);
-      }
-      finally {
+      } finally {
         ((MainForm.WindowsForms.MainForm)MainFormManager.MainForm).ResetAppStartingCursor();
       }
@@ -145,9 +143,7 @@
         if (error != null) throw error;
         MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().UpdateTitle();
-      }
-      catch (Exception ex) {
+      } catch (Exception ex) {
         ErrorHandling.ShowErrorDialog((Control)MainFormManager.MainForm, "Cannot save file.", ex);
-      }
-      finally {
+      } finally {
         SetSaveOperationProgressInContentViews(content, false);
         MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().ResetAppStartingCursor();
@@ -161,7 +157,7 @@
       mainForm.Invoke((Action)delegate {
         if (showProgress) {
-          mainForm.AddOperationProgressToContent(content, string.Format("Saving to file \"{0}\"...", Path.GetFileName(fileName ?? content.Filename)));
+          Progress.Show(content, string.Format("Saving to file \"{0}\"...", Path.GetFileName(fileName ?? content.Filename)));
         } else
-          mainForm.RemoveOperationProgressFromContent(content);
+          Progress.Hide(content);
       });
       #endregion
Index: /trunk/HeuristicLab.Optimizer/3.3/StartPage.cs
===================================================================
--- /trunk/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 16429)
+++ /trunk/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 16430)
@@ -88,5 +88,5 @@
 
     private void LoadSamples(object state) {
-      progress = MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(samplesListView, "Loading...");
+      progress = Progress.ShowOnControl(samplesListView, "Loading...");
       try {
         var assembly = Assembly.GetExecutingAssembly();
@@ -112,5 +112,5 @@
         OnAllSamplesLoaded();
       } finally {
-        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(samplesListView);
+        Progress.HideFromControl(samplesListView);
       }
     }
@@ -138,5 +138,5 @@
         };
       groupLookup[standardProblemsGroup] = standardProblems;
-      var dataAnalysisProblems = new List<string> { "ALPSGP_SymReg", "SGP_SymbClass", "SGP_SymbReg","OSGP_SymReg", "OSGP_TimeSeries", "GE_SymbReg", "GPR" };
+      var dataAnalysisProblems = new List<string> { "ALPSGP_SymReg", "SGP_SymbClass", "SGP_SymbReg", "OSGP_SymReg", "OSGP_TimeSeries", "GE_SymbReg", "GPR" };
       groupLookup[dataAnalysisGroup] = dataAnalysisProblems;
       var scripts = new List<string> { "GA_QAP_Script", "GUI_Automation_Script", "OSGA_Rastrigin_Script",
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicClassificationSolutionView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicClassificationSolutionView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicClassificationSolutionView.cs	(revision 16430)
@@ -60,7 +60,7 @@
         var name = exportFileDialog.FileName;
         using (BackgroundWorker bg = new BackgroundWorker()) {
-          MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Exportion solution to " + name + ".");
+          Progress.Show(this, "Exportion solution to " + name + ".", ProgressMode.Indeterminate);
           bg.DoWork += (o, a) => exporter.Export(Content, name);
-          bg.RunWorkerCompleted += (o, a) => MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+          bg.RunWorkerCompleted += (o, a) => Progress.Hide(this);
           bg.RunWorkerAsync();
         }
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicDiscriminantFunctionClassificationSolutionView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicDiscriminantFunctionClassificationSolutionView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/SymbolicDiscriminantFunctionClassificationSolutionView.cs	(revision 16430)
@@ -59,7 +59,7 @@
         var name = exportFileDialog.FileName;
         using (BackgroundWorker bg = new BackgroundWorker()) {
-          MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Exportion solution to " + name + ".");
+          Progress.Show(this, "Exportion solution to " + name + ".", ProgressMode.Indeterminate);
           bg.DoWork += (o, a) => exporter.Export(Content, name);
-          bg.RunWorkerCompleted += (o, a) => MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+          bg.RunWorkerCompleted += (o, a) => Progress.Hide(this);
           bg.RunWorkerAsync();
         }
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicRegressionSolutionView.cs	(revision 16430)
@@ -61,7 +61,7 @@
         var name = exportFileDialog.FileName;
         using (BackgroundWorker bg = new BackgroundWorker()) {
-          MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, "Exporting solution to " + name + ".");
+          Progress.Show(this, "Exporting solution to " + name + ".", ProgressMode.Indeterminate);
           bg.DoWork += (o, a) => exporter.Export(Content, name);
-          bg.RunWorkerCompleted += (o, a) => MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
+          bg.RunWorkerCompleted += (o, a) => Progress.Hide(this);
           bg.RunWorkerAsync();
         }
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs	(revision 16430)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
@@ -40,5 +41,6 @@
     private readonly ISymbolicDataAnalysisSolutionImpactValuesCalculator impactCalculator;
 
-    private readonly IProgress progress = new Progress();
+    private readonly Progress progress = new Progress();
+    private CancellationTokenSource cancellationTokenSource;
 
     private enum TreeState { Valid, Invalid }
@@ -152,5 +154,6 @@
       Content.ProblemDataChanged += Content_Changed;
       treeChart.Repainted += treeChart_Repainted;
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(grpSimplify, progress);
+      Progress.ShowOnControl(grpSimplify, progress);
+      progress.StopRequested += progress_StopRequested;
     }
     protected override void DeregisterContentEvents() {
@@ -159,5 +162,6 @@
       Content.ProblemDataChanged -= Content_Changed;
       treeChart.Repainted -= treeChart_Repainted;
-      MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(grpSimplify, false);
+      Progress.HideFromControl(grpSimplify, false);
+      progress.StopRequested -= progress_StopRequested;
     }
 
@@ -178,4 +182,8 @@
     }
 
+    private void progress_StopRequested(object sender, EventArgs e) {
+      cancellationTokenSource.Cancel();
+    }
+
     private async void UpdateView() {
       if (Content == null || Content.Model == null || Content.ProblemData == null) return;
@@ -184,6 +192,10 @@
 
       progress.Start("Calculate Impact and Replacement Values ...");
+      progress.CanBeStopped = true;
+      cancellationTokenSource = new CancellationTokenSource();
       var impactAndReplacementValues = await Task.Run(() => CalculateImpactAndReplacementValues(tree));
-      await Task.Delay(500); // wait for progressbar to finish animation
+      try {
+        await Task.Delay(500, cancellationTokenSource.Token); // wait for progressbar to finish animation
+      } catch (OperationCanceledException) { }
       var replacementValues = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item2);
       foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
@@ -192,4 +204,5 @@
       nodeImpacts = impactAndReplacementValues.ToDictionary(x => x.Key, x => x.Value.Item1);
       progress.Finish();
+      progress.CanBeStopped = false;
       PaintNodeImpacts();
     }
@@ -198,4 +211,5 @@
       var impactAndReplacementValues = new Dictionary<ISymbolicExpressionTreeNode, Tuple<double, double>>();
       foreach (var node in tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix()) {
+        if (progress.ProgressState == ProgressState.StopRequested) continue;
         double impactValue, replacementValue, newQualityForImpactsCalculation;
         impactCalculator.CalculateImpactAndReplacementValues(Content.Model, node, Content.ProblemData, Content.ProblemData.TrainingIndices, out impactValue, out replacementValue, out newQualityForImpactsCalculation);
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Classification/ClassificationSolutionVariableImpactsView.cs	(revision 16430)
@@ -120,5 +120,4 @@
 
       //Prepare arguments
-      var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
       var replMethod = (ClassificationSolutionVariableImpactsCalculator.ReplacementMethodEnum)replacementComboBox.Items[replacementComboBox.SelectedIndex];
       var factorReplMethod = (ClassificationSolutionVariableImpactsCalculator.FactorReplacementMethodEnum)factorVarReplComboBox.Items[factorVarReplComboBox.SelectedIndex];
@@ -126,7 +125,5 @@
 
       variableImpactsArrayView.Caption = Content.Name + " Variable Impacts";
-      progress = mainForm.AddOperationProgressToView(this, "Calculating variable impacts for " + Content.Name);
-      progress.ProgressValue = 0;
-
+      progress = Progress.Show(this, "Calculating variable impacts for " + Content.Name);
       cancellationToken = new CancellationTokenSource();
 
@@ -146,7 +143,6 @@
         rawVariableImpacts.AddRange(impacts);
         UpdateOrdering();
-      }
-      finally {
-        ((MainForm.WindowsForms.MainForm)MainFormManager.MainForm).RemoveOperationProgressFromView(this);
+      } finally {
+        Progress.Hide(this);
       }
     }
@@ -175,5 +171,5 @@
         if (cancellationToken.Token.IsCancellationRequested) { return null; }
         progress.ProgressValue = (double)++i / count;
-        progress.Status = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);
+        progress.Message = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);
 
         double impact = 0;
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/MenuItems/ShrinkDataAnalysisRunsMenuItem.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/MenuItems/ShrinkDataAnalysisRunsMenuItem.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/MenuItems/ShrinkDataAnalysisRunsMenuItem.cs	(revision 16430)
@@ -72,6 +72,6 @@
     public override void Execute() {
       IContentView activeView = (IContentView)MainFormManager.MainForm.ActiveView;
-      var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
-      mainForm.AddOperationProgressToContent(activeView.Content, "Removing duplicate datasets.");
+      var content = activeView.Content;
+      Progress.Show(content, "Removing duplicate datasets.", ProgressMode.Indeterminate);
 
       Action<IContentView> action = (view) => DatasetUtil.RemoveDuplicateDatasets(view.Content);
@@ -79,5 +79,5 @@
       action.BeginInvoke(activeView, delegate (IAsyncResult result) {
         action.EndInvoke(result);
-        mainForm.RemoveOperationProgressFromContent(activeView.Content);
+        Progress.Hide(content);
       }, null);
     }
Index: /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionVariableImpactsView.cs	(revision 16430)
@@ -111,6 +111,4 @@
 
     private async void UpdateVariableImpact() {
-      IProgress progress;
-
       //Check if the selection is valid
       if (Content == null) { return; }
@@ -120,5 +118,4 @@
 
       //Prepare arguments
-      var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
       var replMethod = (RegressionSolutionVariableImpactsCalculator.ReplacementMethodEnum)replacementComboBox.Items[replacementComboBox.SelectedIndex];
       var factorReplMethod = (RegressionSolutionVariableImpactsCalculator.FactorReplacementMethodEnum)factorVarReplComboBox.Items[factorVarReplComboBox.SelectedIndex];
@@ -126,7 +123,5 @@
 
       variableImpactsArrayView.Caption = Content.Name + " Variable Impacts";
-      progress = mainForm.AddOperationProgressToView(this, "Calculating variable impacts for " + Content.Name);
-      progress.ProgressValue = 0;
-
+      var progress = Progress.Show(this, "Calculating variable impacts for " + Content.Name);
       cancellationToken = new CancellationTokenSource();
 
@@ -148,5 +143,5 @@
       }
       finally {
-        ((MainForm.WindowsForms.MainForm)MainFormManager.MainForm).RemoveOperationProgressFromView(this);
+        Progress.Hide(this);
       }
     }
@@ -175,5 +170,5 @@
         if (cancellationToken.Token.IsCancellationRequested) { return null; }
         progress.ProgressValue = (double)++i / count;
-        progress.Status = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);
+        progress.Message = string.Format("Calculating impact for variable {0} ({1} of {2})", variableName, i, count);
 
         double impact = 0;
Index: /trunk/HeuristicLab.Problems.Instances.DataAnalysis.Views/3.3/RegressionInstanceProviderView.cs
===================================================================
--- /trunk/HeuristicLab.Problems.Instances.DataAnalysis.Views/3.3/RegressionInstanceProviderView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.Instances.DataAnalysis.Views/3.3/RegressionInstanceProviderView.cs	(revision 16430)
@@ -46,22 +46,18 @@
 
         Task.Factory.StartNew(() => {
-          var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
+          var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
+          var content = activeView.Content;
           // lock active view and show progress bar
-          IContentView activeView = (IContentView)MainFormManager.MainForm.ActiveView;
+          try {
+            var progress = Progress.Show(content, "Loading problem instance.");
 
-          try {
-            var progress = mainForm.AddOperationProgressToContent(activeView.Content,
-              "Loading problem instance.");
+            Content.ProgressChanged += (o, args) => { progress.ProgressValue = args.ProgressPercentage / 100.0; };
 
-            Content.ProgressChanged +=
-              (o, args) => { progress.ProgressValue = args.ProgressPercentage / 100.0; };
-
-            instance = Content.ImportData(importTypeDialog.Path, importTypeDialog.ImportType,
-              importTypeDialog.CSVFormat);
+            instance = Content.ImportData(importTypeDialog.Path, importTypeDialog.ImportType, importTypeDialog.CSVFormat);
           } catch (Exception ex) {
             ErrorWhileParsing(ex);
             return;
           } finally {
-            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            Progress.Hide(content);
           }
 
Index: /trunk/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.cs
===================================================================
--- /trunk/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.cs	(revision 16429)
+++ /trunk/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.cs	(revision 16430)
@@ -121,7 +121,7 @@
 
         IContentView activeView = (IContentView)MainFormManager.MainForm.ActiveView;
-        var mainForm = (MainForm.WindowsForms.MainForm)MainFormManager.MainForm;
+        var content = activeView.Content;
         // lock active view and show progress bar
-        mainForm.AddOperationProgressToContent(activeView.Content, "Loading problem instance.");
+        Progress.Show(content, "Loading problem instance.", ProgressMode.Indeterminate);
 
         Task.Factory.StartNew(() => {
@@ -131,5 +131,5 @@
           } catch (Exception ex) {
             ErrorHandling.ShowErrorDialog(String.Format("Could not load the problem instance {0}", descriptor.Name), ex);
-            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            Progress.Hide(content);
             return;
           }
@@ -139,5 +139,5 @@
             ErrorHandling.ShowErrorDialog(String.Format("This problem does not support loading the instance {0}", descriptor.Name), ex);
           } finally {
-            mainForm.RemoveOperationProgressFromContent(activeView.Content);
+            Progress.Hide(content);
           }
         });
Index: /trunk/HeuristicLab.Scripting.Views/3.3/ScriptView.cs
===================================================================
--- /trunk/HeuristicLab.Scripting.Views/3.3/ScriptView.cs	(revision 16429)
+++ /trunk/HeuristicLab.Scripting.Views/3.3/ScriptView.cs	(revision 16430)
@@ -178,6 +178,5 @@
 
     private void AddProgressView(string progressMessage) {
-      var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-      mainForm.AddOperationProgressToView(this, progressMessage);
+      Progress.Show(this, progressMessage, ProgressMode.Indeterminate);
       progressViewCreated = true;
     }
@@ -185,6 +184,5 @@
     private void RemoveProgressView() {
       if (!progressViewCreated) return;
-      var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
-      mainForm.RemoveOperationProgressFromView(this);
+      Progress.Hide(this);
       progressViewCreated = false;
     }
