Index: /trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs	(revision 8870)
+++ /trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs	(revision 8871)
@@ -334,13 +334,13 @@
     private void RegisterJobEvents() {
       if (task != null)
-        task.PropertyChanged += new PropertyChangedEventHandler(job_PropertyChanged);
+        task.PropertyChanged += new PropertyChangedEventHandler(task_PropertyChanged);
     }
 
     private void DeregisterJobEvents() {
       if (task != null)
-        task.PropertyChanged += new PropertyChangedEventHandler(job_PropertyChanged);
-    }
-
-    private void job_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+        task.PropertyChanged += new PropertyChangedEventHandler(task_PropertyChanged);
+    }
+
+    private void task_PropertyChanged(object sender, PropertyChangedEventArgs e) {
       if (e.PropertyName == "State") {
         IsFinishedTaskDownloaded = false;
Index: /trunk/sources/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs	(revision 8870)
+++ /trunk/sources/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs	(revision 8871)
@@ -34,5 +34,6 @@
     private JobResultPoller jobResultPoller;
     private ConcurrentTaskDownloader<ItemTask> jobDownloader;
-    private static object locker = new object();
+    private object locker = new object();
+    private object downloadFinishedLocker = new object();
 
     public bool IsProgressing { get; set; }
@@ -258,4 +259,5 @@
       }
     }
+
     private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightTask>> e) {
       foreach (LightweightTask lightweightTask in e.Value) {
@@ -273,28 +275,26 @@
             hiveTask.IsDownloading = true;
             jobDownloader.DownloadTaskData(hiveTask.Task, (localJob, itemJob) => {
-              log.LogMessage(string.Format("Finished downloading task {0}", localJob.Id));
-              HiveTask localHiveTask = GetHiveTaskById(localJob.Id);
-
-              if (itemJob == null) {
-                localHiveTask.IsDownloading = false;
-              }
-
-              if (itemJob == null) {
-                // something bad happened to this task. bad task, BAAAD task!
-              } else {
-                // if the task is paused, download but don't integrate into parent optimizer (to avoid Prepare)
-
-                if (localJob.State == TaskState.Paused) {
-                  localHiveTask.ItemTask = itemJob;
+              lock (downloadFinishedLocker) {
+                log.LogMessage(string.Format("Finished downloading task {0}", localJob.Id));
+                HiveTask localHiveTask = GetHiveTaskById(localJob.Id);
+
+                if (itemJob == null) {
+                  // something bad happened to this task. bad task, BAAAD task!
+                  localHiveTask.IsDownloading = false;
                 } else {
-                  if (localJob.ParentTaskId.HasValue) {
-                    HiveTask parentHiveTask = GetHiveTaskById(localJob.ParentTaskId.Value);
-                    parentHiveTask.IntegrateChild(itemJob, localJob.Id);
+                  // if the task is paused, download but don't integrate into parent optimizer (to avoid Prepare) 
+                  if (localJob.State == TaskState.Paused) {
+                    localHiveTask.ItemTask = itemJob;
                   } else {
-                    localHiveTask.ItemTask = itemJob;
+                    if (localJob.ParentTaskId.HasValue) {
+                      HiveTask parentHiveTask = GetHiveTaskById(localJob.ParentTaskId.Value);
+                      parentHiveTask.IntegrateChild(itemJob, localJob.Id);
+                    } else {
+                      localHiveTask.ItemTask = itemJob;
+                    }
                   }
+                  localHiveTask.IsDownloading = false;
+                  localHiveTask.Task.LastTaskDataUpdate = lightweightTask.LastTaskDataUpdate;
                 }
-                localHiveTask.IsDownloading = false;
-                localHiveTask.Task.LastTaskDataUpdate = localJob.LastTaskDataUpdate;
               }
             });
@@ -334,5 +334,5 @@
                                                    || j.Task.State == TaskState.Aborted
                                                    || j.Task.State == TaskState.Failed)
-                                                   && j.IsFinishedTaskDownloaded);
+                                                   && !j.IsDownloading);
     }
 
