Index: /trunk/sources/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 7155)
+++ /trunk/sources/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 7156)
@@ -32,4 +32,5 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.PluginInfrastructure;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Clients.Hive.JobManager.Views {
@@ -316,6 +317,5 @@
         SetEnabledStateOfControls();
       }
-    }
-
+    } 
 
     private void UpdateStateLogList() {
@@ -336,15 +336,58 @@
       if (nameTextBox.Text.Trim() == string.Empty) {
         MessageBox.Show("Please enter a name for the job before uploading it!", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Information);
+      } else if (Content.ExecutionState == ExecutionState.Paused) {             
+        var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeJobAsync, Content);
+        task.ContinueWith((t) => {
+          FinishProgressView();
+          MessageBox.Show("An error occured resuming the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
+          Content.Log.LogException(t.Exception);
+        }, TaskContinuationOptions.OnlyOnFaulted);
       } else {
         HiveClient.StartJob((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex), Content, new CancellationToken());
       }
     }
+
     private void pauseButton_Click(object sender, EventArgs e) {
-      HiveClient.PauseJob(Content);
-    }
+      var task = System.Threading.Tasks.Task.Factory.StartNew(PauseJobAsync, Content);
+      task.ContinueWith((t) => {        
+        FinishProgressView();
+        MessageBox.Show("An error occured pausing the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        Content.Log.LogException(t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
+    }         
+
     private void stopButton_Click(object sender, EventArgs e) {
-      HiveClient.StopJob(Content);
+      var task = System.Threading.Tasks.Task.Factory.StartNew(StopJobAsync, Content);
+      task.ContinueWith((t) => {
+        FinishProgressView();
+        MessageBox.Show("An error occured stopping the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        Content.Log.LogException(t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
     }
     private void resetButton_Click(object sender, EventArgs e) { }
+
+    private void PauseJobAsync(object job) {
+      IProgress prog = new Progress();
+      prog.Status = "Pausing job...";
+      SetProgressView(prog);
+      HiveClient.PauseJob((RefreshableJob)job);
+      FinishProgressView();
+    }
+
+    private void StopJobAsync(object job) {
+      IProgress prog = new Progress();
+      prog.Status = "Stopping job...";
+      SetProgressView(prog);
+      HiveClient.StopJob((RefreshableJob)job);
+      FinishProgressView();
+    }
+
+    private void ResumeJobAsync(object job) {
+      IProgress prog = new Progress();
+      prog.Status = "Resuming job...";
+      SetProgressView(prog);
+      HiveClient.ResumeJob((RefreshableJob)job);
+      FinishProgressView();
+    }
 
     private void nameTextBox_Validated(object sender, EventArgs e) {
@@ -385,6 +428,4 @@
       }
     }
-
-
     #endregion
 
@@ -394,5 +435,5 @@
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
       } else {
-        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0 && Content.ExecutionState == ExecutionState.Prepared;
+        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0 && (Content.ExecutionState == ExecutionState.Prepared || Content.ExecutionState == ExecutionState.Paused);
         pauseButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started;
         stopButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started;
@@ -416,15 +457,36 @@
 
     private void SetProgressView() {
-      if (progressView == null) {
-        progressView = new ProgressView(this, Content.Progress);
-      }
-      progressView.Progress = Content.Progress;
+      if (InvokeRequired) {
+        Invoke(new Action(SetProgressView));
+      } else {
+        if (progressView == null) {
+          progressView = new ProgressView(this, Content.Progress);
+        } else {
+          progressView.Progress = Content.Progress;
+        }
+      }
+    }
+
+    private void SetProgressView(IProgress progress) {
+      if (InvokeRequired) {
+        Invoke(new Action<IProgress>(SetProgressView), progress);
+      } else {
+        if (progressView == null) {
+          progressView = new ProgressView(this, progress);
+        } else {
+          progressView.Progress = progress;
+        }
+      }
     }
 
     private void FinishProgressView() {
-      if (progressView != null) {
-        progressView.Finish();
-        progressView = null;
-        SetEnabledStateOfControls();
+      if (InvokeRequired) {
+        Invoke(new Action(FinishProgressView));
+      } else {
+        if (progressView != null) {
+          progressView.Finish();
+          progressView = null;
+          SetEnabledStateOfControls();
+        }
       }
     }
Index: /trunk/sources/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 7155)
+++ /trunk/sources/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/OptimizerHiveTaskView.cs	(revision 7156)
@@ -23,4 +23,6 @@
 using System.Windows.Forms;
 using HeuristicLab.MainForm;
+using System.Threading.Tasks;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.Hive.Views {
@@ -28,4 +30,6 @@
   [Content(typeof(OptimizerHiveTask), true)]
   public partial class OptimizerHiveTaskView : HiveTaskView {
+    private ProgressView progressView;
+
     public new OptimizerHiveTask Content {
       get { return (OptimizerHiveTask)base.Content; }
@@ -67,15 +71,75 @@
     #region Child Control Events
     private void restartButton_Click(object sender, EventArgs e) {
-      Content.Restart();
+      var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeTaskAsync);
+      task.ContinueWith((t) => {
+        FinishProgressView();
+        ErrorHandling.ShowErrorDialog(this, "An error occured while resuming the task.", t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted); 
     }
 
     private void pauseButton_Click(object sender, EventArgs e) {
-      Content.Pause();
+      var task = System.Threading.Tasks.Task.Factory.StartNew(PauseTaskAsync);
+      task.ContinueWith((t) => {
+        FinishProgressView();
+        ErrorHandling.ShowErrorDialog(this, "An error occured while pausing the task.", t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
     }
 
     private void stopButton_Click(object sender, EventArgs e) {
-      Content.Stop();
+      var task = System.Threading.Tasks.Task.Factory.StartNew(StopTaskAsync);
+      task.ContinueWith((t) => {
+        FinishProgressView();
+        ErrorHandling.ShowErrorDialog(this, "An error occured while stopping the task.", t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
     }
     #endregion
+
+    private void PauseTaskAsync() {
+      IProgress prog = new Progress();
+      prog.Status = "Pausing task. Please be patient for the command to take effect.";
+      SetProgressView(prog);
+      Content.Pause();
+      FinishProgressView();
+    }
+
+    private void StopTaskAsync() {
+      IProgress prog = new Progress();
+      prog.Status = "Stopping task. Please be patient for the command to take effect.";
+      SetProgressView(prog);
+      Content.Stop();
+      FinishProgressView();
+    }
+
+    private void ResumeTaskAsync() {
+      IProgress prog = new Progress();
+      prog.Status = "Resuming task. Please be patient for the command to take effect.";
+      SetProgressView(prog);
+      Content.Restart();
+      FinishProgressView();
+    }
+
+    private void SetProgressView(IProgress progress) {
+      if (InvokeRequired) {
+        Invoke(new Action<IProgress>(SetProgressView), progress);
+      } else {
+        if (progressView == null) {
+          progressView = new ProgressView(this, progress);
+        } else {
+          progressView.Progress = progress;
+        }
+      }
+    }
+
+    private void FinishProgressView() {
+      if (InvokeRequired) {
+        Invoke(new Action(FinishProgressView));
+      } else {
+        if (progressView != null) {
+          progressView.Finish();
+          progressView = null;
+          SetEnabledStateOfControls();
+        }
+      }
+    }
 
     protected override void SetEnabledStateOfControls() {
Index: /trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 7155)
+++ /trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 7156)
@@ -236,5 +236,16 @@
         }
       });
-      // execution state does not need to be set. it will be set to Stopped, when all jobs have been downloaded
+      refreshableJob.ExecutionState = ExecutionState.Stopped;
+    }
+
+    public static void ResumeJob(RefreshableJob refreshableJob) {
+      HiveServiceLocator.Instance.CallHiveService(service => {
+        foreach (HiveTask task in refreshableJob.GetAllHiveTasks()) {
+          if (task.Task.State == TaskState.Paused) {            
+            service.RestartTask(task.Task.Id);            
+          }
+        }
+      });
+      refreshableJob.ExecutionState = ExecutionState.Started;
     }
 
