Index: branches/UnloadJobs/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveJobManagerView.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveJobManagerView.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveJobManagerView.cs	(revision 9173)
@@ -55,5 +55,4 @@
       Content.Refreshed += new EventHandler(Content_Refreshed);
       Content.HiveJobsChanged += new EventHandler(Content_HiveJobsChanged);
-
     }
 
@@ -131,4 +130,5 @@
           Content.Jobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<RefreshableJob>(HiveExperiments_ItemsRemoved);
           Content.ClearHiveClient();
+          Content = null;
         }
       }
@@ -143,4 +143,5 @@
     private void Content_HiveJobsChanged(object sender, EventArgs e) {
       if (Content.Jobs != null) {
+        Content.Jobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<RefreshableJob>(HiveExperiments_ItemsRemoved);
         Content.Jobs.ItemsRemoved += new CollectionItemsChangedEventHandler<RefreshableJob>(HiveExperiments_ItemsRemoved);
       }
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 9173)
@@ -100,4 +100,6 @@
         progressView = null;
       }
+      DeregisterHiveExperimentEvents();
+      DeregisterHiveTasksEvents();
       base.DeregisterContentEvents();
     }
@@ -111,10 +113,10 @@
     }
 
-    private void RegisterHiveJobEvents() {
+    private void RegisterHiveTasksEvents() {
       Content.HiveTasks.ItemsAdded += new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsAdded);
       Content.HiveTasks.ItemsRemoved += new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsRemoved);
       Content.HiveTasks.CollectionReset += new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_CollectionReset);
     }
-    private void DeregisterHiveJobEvents() {
+    private void DeregisterHiveTasksEvents() {
       Content.HiveTasks.ItemsAdded -= new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsAdded);
       Content.HiveTasks.ItemsRemoved -= new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsRemoved);
@@ -131,9 +133,12 @@
           resourceNamesTextBox.Text = string.Empty;
           isPrivilegedCheckBox.Checked = false;
-          logView.Content = null;
           refreshAutomaticallyCheckBox.Checked = false;
           lock (runCollectionViewLocker) {
             runCollectionViewHost.Content = null;
           }
+          logView.Content = null;
+          jobsTreeView.Content = null;
+          hiveExperimentPermissionListView.Content = null;
+          stateLogViewHost.Content = null;
         } else {
           nameTextBox.Text = Content.Job.Name;
@@ -286,5 +291,5 @@
         if (Content != null && Content.HiveTasks != null) {
           jobsTreeView.Content = Content.HiveTasks;
-          RegisterHiveJobEvents();
+          RegisterHiveTasksEvents();
         } else {
           jobsTreeView.Content = null;
@@ -435,10 +440,10 @@
 
     private void nameTextBox_Validated(object sender, EventArgs e) {
-      if (!SuppressEvents && Content.Job.Name != nameTextBox.Text)
+      if (!SuppressEvents && Content.Job != null && Content.Job.Name != nameTextBox.Text)
         Content.Job.Name = nameTextBox.Text;
     }
 
     private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
-      if (!SuppressEvents && Content.Job.ResourceNames != resourceNamesTextBox.Text)
+      if (!SuppressEvents && Content.Job != null && Content.Job.ResourceNames != resourceNamesTextBox.Text)
         Content.Job.ResourceNames = resourceNamesTextBox.Text;
     }
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive.Views/3.3/TreeView/HiveTaskItemTreeView.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive.Views/3.3/TreeView/HiveTaskItemTreeView.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive.Views/3.3/TreeView/HiveTaskItemTreeView.cs	(revision 9173)
@@ -35,4 +35,13 @@
       get { return (ItemCollection<HiveTask>)base.Content; }
       set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      if (Content == null) {
+        foreach (var t in Content) {
+          t.Dispose();
+        }
+      }
+      base.OnContentChanged();
     }
 
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 9173)
@@ -46,6 +46,6 @@
 
     #region Properties
-    private ItemCollection<RefreshableJob> jobs;
-    public ItemCollection<RefreshableJob> Jobs {
+    private HiveItemCollection<RefreshableJob> jobs;
+    public HiveItemCollection<RefreshableJob> Jobs {
       get { return jobs; }
       set {
@@ -87,11 +87,13 @@
 
     public void ClearHiveClient() {
+      Jobs.ClearWithoutHiveDeletion();
       foreach (var j in Jobs) {
         if (j.RefreshAutomatically) {
           j.RefreshAutomatically = false; // stop result polling
-          j.Dispose();
-        }
+        }
+        j.Dispose();
       }
       Jobs = null;
+
       if (onlinePlugins != null)
         onlinePlugins.Clear();
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveTasks/HiveTask.cs	(revision 9173)
@@ -36,5 +36,5 @@
   [Item("Hive Task", "Represents a hive task.")]
   [StorableClass]
-  public class HiveTask : NamedItem, IItemTree<HiveTask> {
+  public class HiveTask : NamedItem, IItemTree<HiveTask>, IDisposable {
     protected static object locker = new object();
     protected ReaderWriterLockSlim childHiveTasksLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
@@ -67,7 +67,7 @@
       set {
         if (task != value) {
-          DeregisterJobEvents();
+          DeregisterTaskEvents();
           task = value;
-          RegisterJobEvents();
+          RegisterTaskEvents();
           IsFinishedTaskDownloaded = false;
           OnTaskChanged();
@@ -93,5 +93,5 @@
           itemTaskLock.EnterWriteLock();
           try {
-            DergisterItemTaskEvents();
+            DeregisterItemTaskEvents();
             itemTask = value;
             RegisterItemTaskEvents();
@@ -177,5 +177,5 @@
       this.childHiveTasks = new ItemList<HiveTask>();
       syncTasksWithOptimizers = true;
-      RegisterChildHiveJobEvents();
+      RegisterChildHiveTasksEvents();
     }
 
@@ -198,5 +198,5 @@
       this.childHiveTasks = new ItemList<HiveTask>();
       this.syncTasksWithOptimizers = true;
-      RegisterChildHiveJobEvents();
+      RegisterChildHiveTasksEvents();
     }
 
@@ -226,5 +226,5 @@
       }
     }
-    protected virtual void DergisterItemTaskEvents() {
+    protected virtual void DeregisterItemTaskEvents() {
       if (ItemTask != null) {
         ItemTask.ComputeInParallelChanged -= new EventHandler(ItemJob_ComputeInParallelChanged);
@@ -233,10 +233,10 @@
     }
 
-    protected virtual void RegisterChildHiveJobEvents() {
+    protected virtual void RegisterChildHiveTasksEvents() {
       this.childHiveTasks.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsAdded);
       this.childHiveTasks.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsRemoved);
       this.childHiveTasks.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnCollectionReset);
     }
-    protected virtual void DeregisterChildHiveJobEvents() {
+    protected virtual void DeregisterChildHiveTasksEvents() {
       this.childHiveTasks.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsAdded);
       this.childHiveTasks.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<HiveTask>>(OnItemsRemoved);
@@ -342,10 +342,10 @@
     }
 
-    private void RegisterJobEvents() {
+    private void RegisterTaskEvents() {
       if (task != null)
         task.PropertyChanged += new PropertyChangedEventHandler(task_PropertyChanged);
     }
 
-    private void DeregisterJobEvents() {
+    private void DeregisterTaskEvents() {
       if (task != null)
         task.PropertyChanged += new PropertyChangedEventHandler(task_PropertyChanged);
@@ -526,4 +526,12 @@
       this.ItemTask.Item = null;
     }
+
+    public void Dispose() {
+      DeregisterChildHiveTasksEvents();
+      DeregisterTaskEvents();
+      DeregisterItemTaskEvents();
+      childHiveTasksLock.Dispose();
+      itemTaskLock.Dispose();
+    }
   }
 
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/HiveTasks/OptimizerHiveTask.cs	(revision 9173)
@@ -107,6 +107,6 @@
       }
     }
-    protected override void DergisterItemTaskEvents() {
-      base.DergisterItemTaskEvents();
+    protected override void DeregisterItemTaskEvents() {
+      base.DeregisterItemTaskEvents();
       if (ItemTask != null) {
         if (ItemTask.Item is Optimization.Experiment) {
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/RefreshableJob.cs	(revision 9173)
@@ -562,5 +562,8 @@
 
     public Guid Id {
-      get { return job.Id; }
+      get {
+        if (job == null) return Guid.Empty;
+        return job.Id;
+      }
       set { job.Id = value; }
     }
@@ -614,17 +617,24 @@
         jobDownloader = null;
       }
+      if (jobResultPoller != null) {
+        DeregisterResultPollingEvents();
+        jobResultPoller = null;
+      }
+      if (hiveTasks != null) {
+        DisposeTasks();
+      }
       if (job != null) {
         DeregisterJobEvents();
         job = null;
       }
-      if (hiveTasks != null) {
-        DeregisterHiveTasksEvents();
-        hiveTasks.Clear(); // this should remove the item_StateLogChanged event handlers
-        hiveTasks = null;
-      }
-      if (jobResultPoller != null) {
-        DeregisterResultPollingEvents();
-        jobResultPoller = null;
-      }
+    }
+
+    private void DisposeTasks() {
+      DeregisterHiveTasksEvents();
+      foreach (var task in hiveTasks) {
+        task.Dispose();
+      }
+      hiveTasks.Clear(); // this should remove the item_StateLogChanged event handlers
+      hiveTasks = null;
     }
     #endregion
Index: branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveItemCollection.cs
===================================================================
--- branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveItemCollection.cs	(revision 9170)
+++ branches/UnloadJobs/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveItemCollection.cs	(revision 9173)
@@ -52,4 +52,14 @@
     }
 
+    public void ClearWithoutHiveDeletion() {
+      if (list.Count > 0) {
+        T[] items = list.ToArray();
+        list.Clear();
+        OnPropertyChanged("Count");
+        //don't call OnCollectionReset directly as it would delete the job
+        base.OnCollectionReset(list, items);
+      }
+    }
+
     private void RemoveItems(IEnumerable<T> items, out IEnumerable<T> successful, out IEnumerable<T> unsuccessful, out Exception exception) {
       List<T> removed = new List<T>();
