Index: trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 2110)
+++ trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 2111)
@@ -43,4 +43,5 @@
     private const int SNAPSHOT_POLLING_INTERVAL_MS = 1000;
     private const int RESULT_POLLING_INTERVAL_MS = 10000;
+    private const int MAX_SNAPSHOT_RETRIES = 20;
     private Guid jobId;
     private Job job;
@@ -117,8 +118,8 @@
               HiveLogger.Debug("HiveEngine: Results-polling - Got result!");
               restoredJob = (Job)PersistenceManager.RestoreFromGZip(response.Obj.SerializedJobResultData);
-              HiveLogger.Debug("HiveEngine: Results-polling - IsSnapshotResult: " + restoredJob.Engine.Canceled);
+              HiveLogger.Debug("HiveEngine: Results-polling - IsSnapshotResult: " + (restoredJob.Progress<1.0));
             }
           }
-        } while (restoredJob == null || restoredJob.Engine.Canceled);
+        } while (restoredJob == null || (restoredJob.Progress < 1.0));
 
         job = restoredJob;
@@ -133,5 +134,5 @@
     public void RequestSnapshot() {
       IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
-
+      int retryCount = 0;
       ResponseObject<SerializedJobResult> response;
       lock (locker) {
@@ -151,10 +152,13 @@
             response = executionEngineFacade.GetLastSerializedResult(jobId, true);
             HiveLogger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
+            retryCount++;
             // loop while
             // 1. problem with communication with server
             // 2. job result not yet ready
           } while (
+            (retryCount < MAX_SNAPSHOT_RETRIES) && (
             !response.Success ||
-            response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE);
+            response.StatusMessage == ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE)
+            );
         }
       }
@@ -180,5 +184,5 @@
     public void Abort() {
       abortRequested = true;
-      RequestSnapshot();
+      // RequestSnapshot();
       IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
       executionEngineFacade.AbortJob(jobId);
@@ -195,5 +199,5 @@
 
     private HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob CreateJobObj() {
-      HeuristicLab.Hive.Contracts.BusinessObjects.Job jobObj = 
+      HeuristicLab.Hive.Contracts.BusinessObjects.Job jobObj =
         new HeuristicLab.Hive.Contracts.BusinessObjects.Job();
 
Index: trunk/sources/HeuristicLab.Hive.Engine/3.2/Job.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Engine/3.2/Job.cs	(revision 2110)
+++ trunk/sources/HeuristicLab.Hive.Engine/3.2/Job.cs	(revision 2111)
@@ -55,4 +55,6 @@
 
     void engine_Finished(object sender, EventArgs e) {
+      if (Engine.Canceled) this.progress = 0.0;
+      else this.progress = 1.0;
       if (JobStopped != null)
         JobStopped(this, new EventArgs());
@@ -69,9 +71,10 @@
     }
 
+    private double progress;
     public double Progress {
       get {
         DoubleData progress = Engine.GlobalScope.GetVariableValue<DoubleData>("Progress", false,
           false);
-        return progress == null ? 0.0 : progress.Data;
+        return progress == null ? this.progress : progress.Data;
       }
       set { throw new NotSupportedException(); }
@@ -105,5 +108,8 @@
       XmlAttribute idAttr = document.CreateAttribute("JobId");
       idAttr.Value = XmlConvert.ToString(JobId);
+      XmlAttribute progressAttr = document.CreateAttribute("Progress");
+      progressAttr.Value = XmlConvert.ToString(progress);
       node.Attributes.Append(idAttr);
+      node.Attributes.Append(progressAttr);
       node.AppendChild(PersistenceManager.Persist("Engine", Engine, document, persistedObjects));
       return node;
@@ -112,4 +118,5 @@
       base.Populate(node, restoredObjects);
       JobId = XmlConvert.ToInt64(node.Attributes["JobId"].Value);
+      progress = XmlConvert.ToDouble(node.Attributes["Progress"].Value);
       DeregisterEvents();
       engine = (SequentialEngine.SequentialEngine)PersistenceManager.Restore(node.SelectSingleNode("Engine"), restoredObjects);
