Index: /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 2017)
+++ /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 2018)
@@ -40,4 +40,6 @@
   /// </summary>
   public class HiveEngine : ItemBase, IEngine, IEditable {
+    private const int SNAPSHOT_POLLING_INTERVAL_MS = 1000;
+    private const int RESULT_POLLING_INTERVAL_MS = 10000;
     private Guid jobId;
     private Job job;
@@ -85,4 +87,81 @@
       ResponseObject<Contracts.BusinessObjects.Job> res = executionEngineFacade.AddJob(jobObj);
       jobId = res.Obj.Id;
+
+      StartResultPollingThread();
+    }
+
+    private void StartResultPollingThread() {
+      // start a backgroud thread to poll the final result of the job
+      Thread t = new Thread(() => {
+        IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
+        ResponseObject<JobResult> response = null;
+        do {
+          response = executionEngineFacade.GetLastResult(jobId, true);
+          if (response.Success && response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE) {
+            Thread.Sleep(RESULT_POLLING_INTERVAL_MS);
+          }
+        } while (response.Success && response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE);
+        if (response.Success) {
+          JobResult jobResult = response.Obj;
+          if (jobResult != null) {
+            job = (Job)PersistenceManager.RestoreFromGZip(jobResult.Result);
+            OnFinished();
+          }
+        } else {
+          Exception ex = new Exception(response.Obj.Exception.Message);
+          ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex); });
+        }
+      });
+      t.Start();
+    }
+
+    public void RequestSnapshot() {
+      IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
+
+      // poll until snapshot is ready
+      ResponseObject<JobResult> response;
+
+      // request snapshot
+      Response snapShotResponse = executionEngineFacade.RequestSnapshot(jobId);
+      if (snapShotResponse.StatusMessage == ApplicationConstants.RESPONSE_JOB_IS_NOT_BEEING_CALCULATED) {
+        response = executionEngineFacade.GetLastResult(jobId, false);
+      } else {
+        do {
+          response = executionEngineFacade.GetLastResult(jobId, true);
+          if (response.Success && response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE) {
+            Thread.Sleep(SNAPSHOT_POLLING_INTERVAL_MS);
+          }
+        } while (response.Success && response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE);
+      }
+      if (response.Success) {
+        JobResult jobResult = response.Obj;
+        if (jobResult != null) {
+          job = (Job)PersistenceManager.RestoreFromGZip(jobResult.Result);
+          //PluginManager.ControlManager.ShowControl(job.Engine.CreateView());
+        }
+      } else {
+        Exception ex = new Exception(response.Obj.Exception.Message);
+        ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex); });
+      }
+    }
+
+    public void ExecuteStep() {
+      throw new NotSupportedException();
+    }
+
+    public void ExecuteSteps(int steps) {
+      throw new NotSupportedException();
+    }
+
+    public void Abort() {
+      IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
+      executionEngineFacade.AbortJob(jobId);
+      OnFinished();
+    }
+
+    public void Reset() {
+      job.Engine.Reset();
+      jobId = Guid.NewGuid();
+      OnInitialized();
     }
 
@@ -131,55 +210,4 @@
     }
 
-    public void RequestSnapshot() {
-      IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
-
-      // poll until snapshot is ready
-      ResponseObject<JobResult> response;
-
-      // request snapshot
-      Response snapShotResponse = executionEngineFacade.RequestSnapshot(jobId);
-      if (snapShotResponse.StatusMessage == ApplicationConstants.RESPONSE_JOB_IS_NOT_BEEING_CALCULATED) {
-        response = executionEngineFacade.GetLastResult(jobId, false);
-      } else {
-        do {
-          response = executionEngineFacade.GetLastResult(jobId, true);
-          if (response.Success && response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE) {
-            Thread.Sleep(1000);
-          }
-        } while (response.Success && response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE);
-      }
-      if (response.Success) {
-        JobResult jobResult = response.Obj;
-        if (jobResult != null) {
-          job = (Job)PersistenceManager.RestoreFromGZip(jobResult.Result);
-          PluginManager.ControlManager.ShowControl(job.Engine.CreateView());
-        }
-      } else {
-        Exception ex = new Exception(response.Obj.Exception.Message);
-        ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex); });
-      }
-    }
-
-
-    public void ExecuteStep() {
-      throw new NotSupportedException();
-    }
-
-    public void ExecuteSteps(int steps) {
-      throw new NotSupportedException();
-    }
-
-    public void Abort() {
-      IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
-      executionEngineFacade.AbortJob(jobId);
-      OnFinished();
-    }
-
-    public void Reset() {
-      job.Engine.Reset();
-      jobId = Guid.NewGuid();
-      OnInitialized();
-    }
-
     public event EventHandler Initialized;
     /// <summary>
Index: /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.Designer.cs	(revision 2017)
+++ /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.Designer.cs	(revision 2018)
@@ -45,5 +45,4 @@
     /// </summary>
     private void InitializeComponent() {
-      this.snapshotButton = new System.Windows.Forms.Button();
       this.urlTextBox = new System.Windows.Forms.TextBox();
       this.urlLabel = new System.Windows.Forms.Label();
@@ -84,16 +83,4 @@
       this.scopeView.Size = new System.Drawing.Size(178, 422);
       // 
-      // snapshotButton
-      // 
-      this.snapshotButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.snapshotButton.Enabled = false;
-      this.snapshotButton.Location = new System.Drawing.Point(294, 457);
-      this.snapshotButton.Name = "snapshotButton";
-      this.snapshotButton.Size = new System.Drawing.Size(92, 23);
-      this.snapshotButton.TabIndex = 6;
-      this.snapshotButton.Text = "Snapshot";
-      this.snapshotButton.UseVisualStyleBackColor = true;
-      this.snapshotButton.Click += new System.EventHandler(this.snapshotButton_Click);
-      // 
       // urlTextBox
       // 
@@ -118,5 +105,4 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.snapshotButton);
       this.Controls.Add(this.urlTextBox);
       this.Controls.Add(this.urlLabel);
@@ -131,5 +117,4 @@
       this.Controls.SetChildIndex(this.urlLabel, 0);
       this.Controls.SetChildIndex(this.urlTextBox, 0);
-      this.Controls.SetChildIndex(this.snapshotButton, 0);
       this.splitContainer1.Panel1.ResumeLayout(false);
       this.splitContainer1.Panel2.ResumeLayout(false);
@@ -144,5 +129,4 @@
     #endregion
 
-    private System.Windows.Forms.Button snapshotButton;
     private System.Windows.Forms.TextBox urlTextBox;
     private System.Windows.Forms.Label urlLabel;
Index: /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.cs	(revision 2017)
+++ /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.cs	(revision 2018)
@@ -64,8 +64,23 @@
       HiveEngine = hiveEngine;
       base.executeButton.Click += new EventHandler(executeButton_Click);
+      base.abortButton.Click += new EventHandler(abortButton_Click);
+    }
+
+    void abortButton_Click(object sender, EventArgs e) {
+      BackgroundWorker worker = new BackgroundWorker();
+      worker.DoWork += (s, args) => {
+        HiveEngine.RequestSnapshot();
+      };
+      worker.RunWorkerCompleted += (s, args) => {
+        this.Cursor = Cursors.Default;
+        abortButton.Enabled = true;
+      };
+      this.Cursor = Cursors.WaitCursor;
+      abortButton.Enabled = false;
+      worker.RunWorkerAsync();
     }
 
     void executeButton_Click(object sender, EventArgs e) {
-      snapshotButton.Enabled = true;
+      abortButton.Enabled = true;
     }
 
@@ -87,13 +102,9 @@
 
     void Engine_Initialized(object sender, EventArgs e) {
-      snapshotButton.Enabled = false;
+      abortButton.Enabled = false;
     }
 
     void Engine_Finished(object sender, EventArgs e) {
-      snapshotButton.Enabled = false;
-    }
-
-    private void snapshotButton_Click(object sender, EventArgs e) {
-      HiveEngine.RequestSnapshot();
+      abortButton.Enabled = false;
     }
   }
