Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.Designer.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.Designer.cs	(revision 15914)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.Designer.cs	(revision 15920)
@@ -54,5 +54,5 @@
       this.splitContainer2 = new System.Windows.Forms.SplitContainer();
       this.projectsTreeView = new System.Windows.Forms.TreeView();
-      this.resourcesTreeView = new System.Windows.Forms.TreeView();
+      this.resourcesTreeView = new HeuristicLab.Clients.Hive.Views.TreeView.NoDoubleClickTreeView();
       this.summaryGroupBox = new System.Windows.Forms.GroupBox();
       this.coresLabel = new System.Windows.Forms.Label();
@@ -246,5 +246,5 @@
     private System.Windows.Forms.SplitContainer splitContainer2;
     protected System.Windows.Forms.TreeView projectsTreeView;
-    protected System.Windows.Forms.TreeView resourcesTreeView;
+    protected HeuristicLab.Clients.Hive.Views.TreeView.NoDoubleClickTreeView resourcesTreeView;
     private System.Windows.Forms.GroupBox summaryGroupBox;
     private System.Windows.Forms.Label coresLabel;
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 15914)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 15920)
@@ -62,9 +62,4 @@
     private readonly HashSet<Resource> newIncludedResources = new HashSet<Resource>();
 
-    private IEnumerable<Resource> addedResources;
-    private IEnumerable<Resource> removedResources;
-    private IEnumerable<Resource> addedIncludes;
-    private IEnumerable<Resource> removedIncludes;
-
     private readonly Color addedAssignmentColor = Color.FromArgb(255, 87, 191, 193); // #57bfc1
     private readonly Color removedAssignmentColor = Color.FromArgb(255, 236, 159, 72); // #ec9f48
@@ -141,8 +136,10 @@
       set {
         if (selectedProject == value) return;
+
+        if ((JobId == Guid.Empty || JobId == null) 
+          && (value == null || SelectedProject == null || value.Id != SelectedProject.Id)) selectedResourceIds = null;
         lastSelectedProject = selectedProject;
         selectedProject = value;
 
-        if (JobId == Guid.Empty || JobId == null) selectedResourceIds = null;
         UpdateResourceTree();
         ExtractStatistics();
@@ -238,5 +235,4 @@
       }
       SelectedProject = node;
-      //ExtractStatistics();
     }
 
@@ -246,12 +242,16 @@
       if (node == null) {
         resourcesTreeView.SelectedNode = null;
-      }
-
-      ExtractStatistics((Resource)node?.Tag);
+        ExtractStatistics();
+      } else {
+        ExtractStatistics((Resource)node.Tag);
+      }
     }
 
     private void resourcesTreeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) {
       var checkedResource = (Resource)e.Node.Tag;
-      if (newIncludedResources.Contains(checkedResource) || checkedResource.Id == Guid.Empty) e.Cancel = true;
+      if (newIncludedResources.Contains(checkedResource) || checkedResource.Id == Guid.Empty) {
+        e.Cancel = true;
+        ExtractStatistics((Resource)resourcesTreeView.SelectedNode?.Tag);
+      }
     }
 
@@ -264,7 +264,6 @@
       }
 
-      UpdateNewResourceTree();
+      UpdateResourceTreeAfterCheck();
       ExtractStatistics();
-      //ExtractStatistics((Resource)resourcesTreeView.SelectedNode?.Tag);
       OnAssignedResourcesChanged();
     }
@@ -384,8 +383,12 @@
     }
 
-    private void UpdateNewResourceTree() {
+    private void UpdateResourceTreeAfterCheck() {
+      resourcesTreeView.BeforeCheck -= resourcesTreeView_BeforeCheck;
+      resourcesTreeView.AfterCheck -= resourcesTreeView_AfterCheck;
       UpdateNewAssignedResources();
       UpdateNewIncludedResources();
-      BuildResourceTree(availableResources);
+      SetTreeNodes(resourcesTreeView.Nodes);
+      resourcesTreeView.BeforeCheck += resourcesTreeView_BeforeCheck;
+      resourcesTreeView.AfterCheck += resourcesTreeView_AfterCheck;
     }
 
@@ -497,5 +500,4 @@
       var removedIncludes = includedResources.Except(newIncludedResources);
 
-      HashSet<TreeNode> expandedNodes = new HashSet<TreeNode>();
       TreeNode currentNode = null;
       Resource currentResource = null;
@@ -519,11 +521,4 @@
         } else {
           currentNode.Nodes.Add(newNode);
-        }
-
-        if(newAssignedResources.Select(x => x.Id).Contains(newResource.Id)
-          || assignedResources.Select(x => x.Id).Contains(newResource.Id)
-          || newIncludedResources.Select(x => x.Id).Contains(newResource.Id)
-          || includedResources.Select(x => x.Id).Contains(newResource.Id)) {
-          expandedNodes.Add(newNode);
         }
 
@@ -593,24 +588,38 @@
       }
 
-      
-      foreach (var node in expandedNodes) {
-        node.Expand();
-        var parent = node.Parent;
-        while(parent != null) {
-          parent.Expand();
-          parent = parent.Parent;
-        }
-      }
+      ExpandResourceNodesOfInterest(resourcesTreeView.Nodes);
 
       resourcesTreeView.BeforeCheck += resourcesTreeView_BeforeCheck;
       resourcesTreeView.AfterCheck += resourcesTreeView_AfterCheck;
-      //resourcesTreeView.ExpandAll();
-    }
-
-    private void ExpandSlaveGroupNodes() {
-      foreach (TreeNode n in nodeStore.Where(x => x.Tag is SlaveGroup)) {
-        TreeNode[] children = new TreeNode[n.Nodes.Count];
-        n.Nodes.CopyTo(children, 0);
-        if (children.Any(x => x.Tag is SlaveGroup)) n.Expand();
+    }
+
+    private void ExpandResourceNodesOfInterest(TreeNodeCollection nodes) {
+      foreach(TreeNode n in nodes) {
+        Resource r = (Resource)n.Tag;
+        if(n.Nodes.Count > 0) {
+          if(HiveClient.Instance.GetAvailableChildResources(r.Id).OfType<SlaveGroup>().Any()
+            || HiveClient.Instance.GetAvailableChildResources(r.Id).OfType<Slave>().Intersect(assignedResources.Union(newAssignedResources)).Any()) {
+            n.Expand();
+            ExpandResourceNodesOfInterest(n.Nodes);
+          } else {
+            n.Collapse();
+          }   
+        } else {
+          n.Collapse();
+        }
+      }
+    }
+
+    private void CollapseSlaveOnlyNodes(TreeNode tn) {
+      if (!(tn.Tag is Resource)) return;
+
+      Resource r = (Resource)tn.Tag;
+      if (HiveClient.Instance.ResourceDescendants.ContainsKey(r.Id)) {
+        if (HiveClient.Instance.GetAvailableChildResources(r.Id).OfType<SlaveGroup>().Any()) {
+          tn.Expand();
+          foreach (TreeNode n in tn.Nodes) CollapseSlaveOnlyNodes(n);
+        } else {
+          tn.Collapse();
+        }
       }
     }
@@ -619,5 +628,5 @@
       HashSet<Slave> newAssignedSlaves = new HashSet<Slave>(newAssignedResources.OfType<Slave>());
       foreach (var slaveGroup in newAssignedResources.OfType<SlaveGroup>()) {
-        foreach(var slave in HiveClient.Instance.ResourceDescendants[slaveGroup.Id].OfType<Slave>()) {
+        foreach (var slave in HiveClient.Instance.GetAvailableChildResources(slaveGroup.Id).OfType<Slave>()) {
           newAssignedSlaves.Add(slave);
         }
@@ -629,6 +638,5 @@
         var slaveGroup = resource as SlaveGroup;
         if (slaveGroup != null) {
-          selectedSlaves = new HashSet<Slave>(HiveClient.Instance.ResourceDescendants[slaveGroup.Id].OfType<Slave>());
-          //selectedSlaves.IntersectWith(newAssignedSlaves);
+          selectedSlaves = new HashSet<Slave>(HiveClient.Instance.GetAvailableChildResources(slaveGroup.Id).OfType<Slave>());
         } else {
           selectedSlaves = new HashSet<Slave>(new[] { resource as Slave });
@@ -665,4 +673,56 @@
     }
 
+    private void SetTreeNodes(TreeNodeCollection nodes) {
+      var addedAssignments = newAssignedResources.Except(assignedResources);
+      var removedAssignments = assignedResources.Except(newAssignedResources);
+      var addedIncludes = newIncludedResources.Except(includedResources);
+      var removedIncludes = includedResources.Except(newIncludedResources);
+
+      foreach (TreeNode n in nodes) {
+
+        if(n.Tag is Resource) {
+          // reset
+          var resource = (Resource)n.Tag;
+          n.Text = resource.Name;
+          n.BackColor = Color.Transparent;
+          n.ForeColor = Color.Black;
+          n.Checked = false;
+
+          // add additional info
+          if (newAssignedResources.Select(x => x.Id).Contains(resource.Id)) {
+            n.Checked = true;
+          } else if (newIncludedResources.Select(x => x.Id).Contains(resource.Id)) {
+            n.Checked = true;
+            n.ForeColor = grayTextColor;
+          }
+
+          if (includedResources.Select(x => x.Id).Contains(resource.Id) && newIncludedResources.Select(x => x.Id).Contains(resource.Id)) {
+            n.Text += INCLUDED_TAG;
+          } else if (addedIncludes.Select(x => x.Id).Contains(resource.Id)) {
+            n.BackColor = addedIncludeColor;
+            n.ForeColor = grayTextColor;
+            n.Text += ADDED_INCLUDE_TAG;
+          } else if (removedIncludes.Select(x => x.Id).Contains(resource.Id)) {
+            n.BackColor = removedIncludeColor;
+            n.Text += REMOVED_INCLUDE_TAG;
+          }
+
+          if (addedAssignments.Select(x => x.Id).Contains(resource.Id)) {
+            n.BackColor = addedAssignmentColor;
+            n.ForeColor = controlTextColor;
+            n.Text += ADDED_SELECTION_TAG;
+          } else if (removedAssignments.Select(x => x.Id).Contains(resource.Id)) {
+            n.BackColor = removedAssignmentColor;
+            n.ForeColor = controlTextColor;
+            n.Text += REMOVED_SELECTION_TAG;
+          }
+        }
+
+        if(n.Nodes.Count > 0) {
+          SetTreeNodes(n.Nodes);
+        }
+      }
+    }
+
     #endregion
 
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 15914)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 15920)
@@ -392,4 +392,5 @@
           Content.Job.ResourceIds = null;
         }
+        SetEnabledStateOfExecutableButtons();
       }
     }
@@ -509,5 +510,7 @@
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = false;
       } else {
-        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0 && (Content.ExecutionState == ExecutionState.Prepared || Content.ExecutionState == ExecutionState.Paused) && !Content.IsProgressing;
+        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0 
+          && Content.Job.ProjectId != null && Content.Job.ProjectId != Guid.Empty && Content.Job.ResourceIds != null  && Content.Job.ResourceIds.Any() 
+          && (Content.ExecutionState == ExecutionState.Prepared || Content.ExecutionState == ExecutionState.Paused) && !Content.IsProgressing;
         pauseButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started && !Content.IsProgressing;
         stopButton.Enabled = Content.IsControllable && (Content.ExecutionState == ExecutionState.Started || Content.ExecutionState == ExecutionState.Paused) && !Content.IsProgressing;
