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 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 15913)
@@ -43,4 +43,7 @@
     public const string additionalSlavesGroupDescription = "Contains additional slaves which are either ungrouped or the parenting slave group is not assigned to the selected project.";
 
+    private const string CURRENT_SELECTION_TAG = " [current selection]";
+    private const string NEW_SELECTION_TAG = " [new selection]";
+    private const string CHANGED_SELECTION_TAG = " [changed selection]";
 
     private readonly HashSet<TreeNode> mainTreeNodes = new HashSet<TreeNode>();
@@ -54,9 +57,4 @@
     private readonly HashSet<Resource> newIncludedResources = new HashSet<Resource>();
 
-    private readonly Dictionary<Guid, HashSet<Project>> projectAncestors = new Dictionary<Guid, HashSet<Project>>();
-    private readonly Dictionary<Guid, HashSet<Project>> projectDescendants = new Dictionary<Guid, HashSet<Project>>();
-    private readonly Dictionary<Guid, HashSet<Resource>> resourceAncestors = new Dictionary<Guid, HashSet<Resource>>();
-    private readonly Dictionary<Guid, HashSet<Resource>> resourceDescendants = new Dictionary<Guid, HashSet<Resource>>();
-
     private IEnumerable<Resource> addedResources;
     private IEnumerable<Resource> removedResources;
@@ -68,5 +66,6 @@
     private readonly Color addedIncludeColor = Color.FromArgb(25, 169, 221, 221); // #a9dddd
     private readonly Color removedIncludeColor = Color.FromArgb(25, 249, 210, 145); // #f9d291
-    private readonly Color selectedColor = Color.FromArgb(255, 240, 194, 59); // #f0c23b
+    private readonly Color selectedBackColor = Color.DodgerBlue;
+    private readonly Color selectedForeColor = Color.White;
 
     private string currentSearchString;
@@ -173,8 +172,5 @@
       base.OnContentChanged();
 
-      if (Content != null) {       
-        UpdateProjectGenealogy();
-        UpdateResourceGenealogy();
-        
+      if (Content != null) {               
         if (SelectedProjectId.HasValue && SelectedProjectId.Value != Guid.Empty) {
           SelectedProject = GetSelectedProjectById(SelectedProjectId.Value);
@@ -218,13 +214,14 @@
         projectsTreeView.SelectedNode = null;
       } else {
-        ReColorTreeNodes(projectsTreeView.Nodes, selectedColor, Color.Transparent, true);
-        e.Node.BackColor = selectedColor;
+        ResetTreeNodes(projectsTreeView.Nodes);
+        e.Node.BackColor = selectedBackColor;
+        e.Node.ForeColor = selectedForeColor;
         
         if(node.Id == projectId) {
-          e.Node.Text += " [current selection]";
+          e.Node.Text += CURRENT_SELECTION_TAG;
         } else if(projectId == null || projectId == Guid.Empty) {
-          e.Node.Text += " [new selection]";
+          e.Node.Text += NEW_SELECTION_TAG;
         } else {
-          e.Node.Text += " [changed selection]";
+          e.Node.Text += CHANGED_SELECTION_TAG;
         }
 
@@ -270,88 +267,4 @@
 
     #region Helpers
-
-
-    #region old
-    private void UpdateMainTree() {
-      mainTreeNodes.Clear();
-
-      foreach (Project g in Content.OrderBy(x => x.Name)) {
-        if (g.ParentProjectId == null) {
-          TreeNode tn = new TreeNode();
-          tn.ImageIndex = greenFlagImageIndex;
-          tn.SelectedImageIndex = tn.ImageIndex;
-
-          tn.Tag = g;
-          tn.Text = g.Name;
-          tn.Checked = assignedResources.Any(x => x.Id == g.Id);
-
-          BuildMainTree(tn);
-          mainTreeNodes.Add(tn);
-        }
-      }
-      UpdateFilteredTree();
-    }
-
-    private void BuildMainTree(TreeNode tn) {
-      foreach (Project r in Content.Where(s => s.ParentProjectId != null && s.ParentProjectId == ((Project)tn.Tag).Id).OrderBy(x => x.Name)) {
-        TreeNode stn = new TreeNode(r.Name);
-        stn.ImageIndex = redFlagImageIndex;
-        stn.SelectedImageIndex = stn.ImageIndex;
-        stn.Tag = r;
-        stn.Checked = assignedResources.Any(x => x.Id == r.Id);
-        tn.Nodes.Add(stn);
-        mainTreeNodes.Add(stn);
-
-        BuildMainTree(stn);
-      }
-    }
-
-    private void UpdateFilteredTree() {
-      filteredTreeNodes.Clear();
-      foreach (TreeNode n in mainTreeNodes) {
-        n.BackColor = SystemColors.Window;
-        if (currentSearchString == null || ((Project)n.Tag).Name.ToLower().Contains(currentSearchString)) {
-          n.BackColor = string.IsNullOrEmpty(currentSearchString) ? SystemColors.Window : Color.LightBlue;
-          filteredTreeNodes.Add(n);
-          TraverseParentNodes(n);
-        }
-      }
-      UpdateProjectsTree();
-    }
-
-    private void UpdateProjectsTree() {
-      projectsTreeView.Nodes.Clear();
-      nodeStore.Clear();
-
-      foreach (TreeNode node in filteredTreeNodes) {
-        var clone = nodeStore.SingleOrDefault(x => ((Project)x.Tag).Id == ((Project)node.Tag).Id);
-        if (clone == null) {
-          clone = (TreeNode)node.Clone();
-          nodeStore.Add(clone);
-          clone.Nodes.Clear();
-        }
-        foreach (TreeNode child in node.Nodes)
-          if (filteredTreeNodes.Any(x => ((Project)x.Tag).Id == ((Project)child.Tag).Id)) {
-            var childClone = nodeStore.SingleOrDefault(x => ((Project)x.Tag).Id == ((Project)child.Tag).Id);
-            if (childClone == null) {
-              childClone = (TreeNode)child.Clone();
-              nodeStore.Add(childClone);
-              childClone.Nodes.Clear();
-            }
-            clone.Nodes.Add(childClone);
-          }
-      }
-      projectsTreeView.Nodes.AddRange(nodeStore.Where(x => ((Project)x.Tag).ParentProjectId == null).ToArray());
-      if (string.IsNullOrEmpty(currentSearchString)) ExpandSlaveGroupNodes();
-      else projectsTreeView.ExpandAll();
-    }
-
-    private void TraverseParentNodes(TreeNode node) {
-      if (node != null) {
-        for (TreeNode parent = node.Parent; parent != null; parent = parent.Parent)
-          filteredTreeNodes.Add(parent);
-      }
-    }
-    #endregion
 
     private Project GetSelectedProjectById(Guid projectId) {
@@ -368,5 +281,5 @@
           if(project.Name.ToLower().Contains(currentSearchString.ToLower())) {
             filteredProjects.Add(project);
-            filteredProjects.UnionWith(projectAncestors[project.Id]);
+            filteredProjects.UnionWith(Content.Where(p => HiveClient.Instance.ProjectAncestors[project.Id].Contains(p.Id)));
           }
         }
@@ -379,11 +292,15 @@
       if (!projects.Any()) return;
 
-      // select all top level projects (withouth parent, or without parent within current project collection)
+      // select all top level projects (withouth parent, or without any ancestor within current project collection)
       var mainProjects = new HashSet<Project>(projects.Where(x => x.ParentProjectId == null));
       var parentedMainProjects = new HashSet<Project>(projects
         .Where(x => x.ParentProjectId.HasValue
-        && !projects.Select(y => y.Id).Contains(x.ParentProjectId.Value)));
+        && !projects.Select(y => y.Id).Contains(x.ParentProjectId.Value)
+        && !projects.SelectMany(y => HiveClient.Instance.ProjectAncestors[y.Id]).Contains(x.ParentProjectId.Value)));
       mainProjects.UnionWith(parentedMainProjects);
       var subProbjects = new HashSet<Project>(projects.Except(mainProjects));
+      foreach(var p in subProbjects) {
+        p.ParentProjectId = HiveClient.Instance.ProjectAncestors[p.Id].Where(x => projects.Select(y => y.Id).Contains(x)).FirstOrDefault();
+      }
 
       var stack = new Stack<Project>(mainProjects.OrderByDescending(x => x.Name));
@@ -412,11 +329,12 @@
 
         if (SelectedProject != null && SelectedProject.Id.Equals(newProject.Id)) {
-          newNode.BackColor = selectedColor;
+          newNode.BackColor = selectedBackColor;
+          newNode.ForeColor = selectedForeColor;
           if(SelectedProject.Id == projectId) {
-            newNode.Text += " [current selection]";
+            newNode.Text += CURRENT_SELECTION_TAG;
           } else if (projectId == null || projectId == Guid.Empty) {
-            newNode.Text += " [new selection]";
+            newNode.Text += NEW_SELECTION_TAG;
           } else {
-            newNode.Text += " [changed selection]";
+            newNode.Text += CHANGED_SELECTION_TAG;
           }
         }
@@ -439,30 +357,4 @@
       projectsTreeView.ExpandAll();
     }
-
-    private void UpdateProjectGenealogy() {
-      projectAncestors.Clear();
-      projectDescendants.Clear();
-      var projects = Content;
-
-      foreach (var p in projects) {
-        projectAncestors.Add(p.Id, new HashSet<Project>());
-        projectDescendants.Add(p.Id, new HashSet<Project>());
-      }
-
-      foreach (var p in projects) {
-        var parentProjectId = p.ParentProjectId;
-        while (parentProjectId != null) {
-          var parent = projects.SingleOrDefault(x => x.Id == parentProjectId);
-          if (parent != null) {
-            projectAncestors[p.Id].Add(parent);
-            projectDescendants[parent.Id].Add(p);
-            parentProjectId = parent.ParentProjectId;
-          } else {
-            parentProjectId = null;
-          }
-        }
-      }
-    }
-
 
     private static IEnumerable<Resource> GetAssignedResourcesForProject(Guid projectId) {
@@ -495,5 +387,5 @@
         foreach (var resource in assignedProjectResources) {
           availableResources.Add(resource);
-          foreach(var descendant in resourceDescendants[resource.Id]) {
+          foreach(var descendant in HiveClient.Instance.Resources.Where(x => HiveClient.Instance.ResourceDescendants[resource.Id].Contains(x.Id))) {
             availableResources.Add(descendant);
           }
@@ -544,5 +436,5 @@
     private void UpdateNewAssignedResources() {
       for(int i = newAssignedResources.Count-1; i>=0; i--) {
-        if(newAssignedResources.Intersect(resourceAncestors[newAssignedResources.ElementAt(i).Id]).Any()) {
+        if(newAssignedResources.Intersect(HiveClient.Instance.GetAvailableParentResources(newAssignedResources.ElementAt(i).Id)).Any()) {
           newAssignedResources.Remove(newAssignedResources.ElementAt(i));
         }
@@ -556,5 +448,5 @@
       if (JobId != Guid.Empty) {
         foreach (var item in assignedResources) {
-          foreach (var descendant in resourceDescendants[item.Id]) {
+          foreach (var descendant in HiveClient.Instance.GetAvailableChildResources(item.Id)) {
             includedResources.Add(descendant);
           }
@@ -563,5 +455,5 @@
 
       foreach (var item in newAssignedResources) {
-        foreach (var descendant in resourceDescendants[item.Id]) {
+        foreach (var descendant in HiveClient.Instance.GetAvailableChildResources(item.Id)) {
           newIncludedResources.Add(descendant);
         }
@@ -572,31 +464,6 @@
       newIncludedResources.Clear();
       foreach (var item in newAssignedResources) {
-        foreach (var descendant in resourceDescendants[item.Id]) {
+        foreach (var descendant in HiveClient.Instance.GetAvailableChildResources(item.Id)) {
           newIncludedResources.Add(descendant);
-        }
-      }
-    }
-
-    private void UpdateResourceGenealogy() {
-      resourceAncestors.Clear();
-      resourceDescendants.Clear();
-      var resources = HiveClient.Instance.Resources;
-
-      foreach (var r in resources) {
-        resourceAncestors.Add(r.Id, new HashSet<Resource>());
-        resourceDescendants.Add(r.Id, new HashSet<Resource>());
-      }
-
-      foreach (var r in resources) {
-        var parentResourceId = r.ParentResourceId;
-        while (parentResourceId != null) {
-          var parent = resources.SingleOrDefault(x => x.Id == parentResourceId);
-          if (parent != null) {
-            resourceAncestors[r.Id].Add(parent);
-            resourceDescendants[parent.Id].Add(r);
-            parentResourceId = parent.ParentResourceId;
-          } else {
-            parentResourceId = null;
-          }
         }
       }
@@ -743,5 +610,5 @@
       HashSet<Slave> newAssignedSlaves = new HashSet<Slave>(newAssignedResources.OfType<Slave>());
       foreach (var slaveGroup in newAssignedResources.OfType<SlaveGroup>()) {
-        foreach(var slave in resourceDescendants[slaveGroup.Id].OfType<Slave>()) {
+        foreach(var slave in HiveClient.Instance.ResourceDescendants[slaveGroup.Id].OfType<Slave>()) {
           newAssignedSlaves.Add(slave);
         }
@@ -753,5 +620,5 @@
         var slaveGroup = resource as SlaveGroup;
         if (slaveGroup != null) {
-          selectedSlaves = new HashSet<Slave>(resourceDescendants[slaveGroup.Id].OfType<Slave>());
+          selectedSlaves = new HashSet<Slave>(HiveClient.Instance.ResourceDescendants[slaveGroup.Id].OfType<Slave>());
           //selectedSlaves.IntersectWith(newAssignedSlaves);
         } else {
@@ -771,12 +638,18 @@
     }
 
-    private void ReColorTreeNodes(TreeNodeCollection nodes, Color c1, Color c2, bool resetText) {
+    private void StyleTreeNode(TreeNode n, string name) {
+      n.Text = name;
+      n.BackColor = Color.Transparent;
+      n.ForeColor = Color.Black;
+    }
+
+    private void ResetTreeNodes(TreeNodeCollection nodes) {
       foreach (TreeNode n in nodes) {
-        if (n.BackColor.Equals(c1)) {
-          n.BackColor = c2;
-          if(resetText) n.Text = ((Project)n.Tag).Name;
-        }
+        string name = "";
+        if (n.Tag is Project) name = ((Project)n.Tag).Name;
+        else if (n.Tag is Resource) name = ((Resource)n.Tag).Name;
+        StyleTreeNode(n, name);
         if (n.Nodes.Count > 0) {
-          ReColorTreeNodes(n.Nodes, c1, c2, resetText);
+          ResetTreeNodes(n.Nodes);
         }
       }
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs	(revision 15913)
@@ -161,6 +161,5 @@
       hiveResourceSelector.SelectedProjectId = selectedProjectId;
       hiveResourceSelector.SelectedResourceIds = selectedResourceIds;
-      var projectList = new ItemList<Project>(HiveServiceLocator.Instance.CallHiveService(s => s.GetProjects()));
-      hiveResourceSelector.Content = projectList;
+      hiveResourceSelector.Content = HiveClient.Instance.Projects;
     }
 
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 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 15913)
@@ -482,19 +482,4 @@
     }
 
-    //private void updateButton_Click(object sender, EventArgs e) {
-    //  var task = System.Threading.Tasks.Task.Factory.StartNew(UpdateJobAsync, Content);
-    //  task.ContinueWith((t) => {
-    //    Content.Progress.Finish();
-    //    MessageBox.Show("An error occured updating the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
-    //    Content.Log.LogException(t.Exception);
-    //  }, TaskContinuationOptions.OnlyOnFaulted);
-    //}
-
-    //private void UpdateJobAsync(object job) {
-    //  Content.Progress.Start("Updating job...");
-    //  HiveClient.UpdateJob((RefreshableJob)job);
-    //  Content.Progress.Finish();
-    //}
-
     private void UnloadButton_Click(object sender, EventArgs e) {
       Content.Unload();
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.cs	(revision 15913)
@@ -211,4 +211,9 @@
       }
     }
+
+    private void coresNeededComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (int.TryParse(coresNeededComboBox.SelectedItem.ToString(), out int cores))
+        Content.Task.CoresNeeded = cores;
+    }
   }
 }
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.designer.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.designer.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Views/3.3/HiveTasks/HiveTaskView.designer.cs	(revision 15913)
@@ -292,9 +292,14 @@
             "2",
             "3",
-            "4"});
+            "4",
+            "6",
+            "8",
+            "10",
+            "12"});
       this.coresNeededComboBox.Location = new System.Drawing.Point(134, 13);
       this.coresNeededComboBox.Name = "coresNeededComboBox";
       this.coresNeededComboBox.Size = new System.Drawing.Size(134, 21);
       this.coresNeededComboBox.TabIndex = 41;
+      this.coresNeededComboBox.SelectedIndexChanged += new System.EventHandler(this.coresNeededComboBox_SelectedIndexChanged);
       // 
       // memoryNeededLabel
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 15913)
@@ -67,4 +67,24 @@
     }
 
+    private Dictionary<Guid, HashSet<Guid>> projectAncestors;
+    public Dictionary<Guid, HashSet<Guid>> ProjectAncestors {
+      get { return projectAncestors; }
+    }
+
+    private Dictionary<Guid, HashSet<Guid>> projectDescendants;
+    public Dictionary<Guid, HashSet<Guid>> ProjectDescendants {
+      get { return projectDescendants; }
+    }
+
+    private Dictionary<Guid, HashSet<Guid>> resourceAncestors;
+    public Dictionary<Guid, HashSet<Guid>> ResourceAncestors {
+      get { return resourceAncestors; }
+    }
+
+    private Dictionary<Guid, HashSet<Guid>> resourceDescendants;
+    public Dictionary<Guid, HashSet<Guid>> ResourceDescendants {
+      get { return resourceDescendants; }
+    }
+
 
     private List<Plugin> onlinePlugins;
@@ -107,4 +127,9 @@
         resources = new ItemList<Resource>();
         jobs = new HiveItemCollection<RefreshableJob>();
+
+        projectAncestors = new Dictionary<Guid, HashSet<Guid>>();
+        projectDescendants = new Dictionary<Guid, HashSet<Guid>>();
+        resourceAncestors = new Dictionary<Guid, HashSet<Guid>>();
+        resourceDescendants = new Dictionary<Guid, HashSet<Guid>>();
 
         HiveServiceLocator.Instance.CallHiveService(service => {
@@ -114,4 +139,7 @@
           service.GetJobs().ForEach(p => jobs.Add(new RefreshableJob(p)));
         });
+
+        UpdateResourceGenealogy();
+        UpdateProjectGenealogy();
       }
       catch {
@@ -133,4 +161,9 @@
         resources = new ItemList<Resource>();
 
+        projectAncestors = new Dictionary<Guid, HashSet<Guid>>();
+        projectDescendants = new Dictionary<Guid, HashSet<Guid>>();
+        resourceAncestors = new Dictionary<Guid, HashSet<Guid>>();
+        resourceDescendants = new Dictionary<Guid, HashSet<Guid>>();
+
         HiveServiceLocator.Instance.CallHiveService(service => {
           service.GetProjects().ForEach(p => projects.Add(p));
@@ -138,4 +171,7 @@
           service.GetSlaves().ForEach(s => resources.Add(s));
         });
+
+        UpdateResourceGenealogy();
+        UpdateProjectGenealogy();
       } catch {
         projects = null;
@@ -162,5 +198,61 @@
       }, null);
     }
-    
+
+    private void UpdateResourceGenealogy() {
+      resourceAncestors.Clear();
+      resourceDescendants.Clear();
+
+      // fetch resource ancestor set
+      HiveServiceLocator.Instance.CallHiveService(service => {
+        var ra = service.GetResourceGenealogy();
+        ra.Keys.ToList().ForEach(k => resourceAncestors.Add(k, new HashSet<Guid>()));
+        resourceAncestors.Keys.ToList().ForEach(k => resourceAncestors[k].UnionWith(ra[k]));
+      });
+
+      // build resource descendant set
+      resourceAncestors.Keys.ToList().ForEach(k => resourceDescendants.Add(k, new HashSet<Guid>()));
+      foreach (var ra in resourceAncestors) {
+        foreach(var ancestor in ra.Value) {
+          resourceDescendants[ancestor].Add(ra.Key);
+        }
+      }
+    }
+
+    private void UpdateProjectGenealogy() {
+      projectAncestors.Clear();
+      projectDescendants.Clear();
+
+      // fetch project ancestor list
+      HiveServiceLocator.Instance.CallHiveService(service => {
+        var pa = service.GetProjectGenealogy();
+        pa.Keys.ToList().ForEach(k => projectAncestors.Add(k, new HashSet<Guid>()));
+        projectAncestors.Keys.ToList().ForEach(k => projectAncestors[k].UnionWith(pa[k]));
+      });
+
+      // build project descendant list
+      projectAncestors.Keys.ToList().ForEach(k => projectDescendants.Add(k, new HashSet<Guid>()));
+      foreach(var pa in projectAncestors) {
+        foreach(var ancestor in pa.Value) {
+          projectDescendants[ancestor].Add(pa.Key);
+        }
+      }
+    }
+
+    public IEnumerable<Project> GetAvailableParentProjects(Guid id) {
+      return projects.Where(x => projectAncestors[id].Contains(x.Id));
+    }
+
+    public IEnumerable<Project> GetAvailableChildProjects(Guid id) {
+      return projects.Where(x => projectDescendants[id].Contains(x.Id));
+    }
+
+    public IEnumerable<Resource> GetAvailableParentResources(Guid id) {
+      return resources.Where(x => resourceAncestors[id].Contains(x.Id));
+    }
+
+    public IEnumerable<Resource> GetAvailableChildResources(Guid id) {
+      return resources.Where(x => resourceDescendants[id].Contains(x.Id));
+    }
+
     #endregion
 
@@ -446,77 +538,4 @@
       }
     }
-
-
-    /// <summary>
-    /// Uploads the given task and all its child-jobs while setting the proper parentJobId values for the childs
-    /// </summary>
-    /// <param name="parentHiveTask">shall be null if its the root task</param>
-    //private void UploadTaskWithChildren_Old(IProgress progress, HiveTask hiveTask, HiveTask parentHiveTask, IEnumerable<Guid> groups, int[] taskCount, int totalJobCount, Guid configPluginId, Guid jobId, ILog log, CancellationToken cancellationToken) {
-    //  taskUploadSemaphore.WaitOne();
-    //  bool semaphoreReleased = false;
-    //  try {
-    //    cancellationToken.ThrowIfCancellationRequested();
-    //    lock (jobCountLocker) {
-    //      taskCount[0]++;
-    //    }
-    //    TaskData taskData;
-    //    List<IPluginDescription> plugins;
-
-    //    if (hiveTask.ItemTask.ComputeInParallel) {
-    //      hiveTask.Task.IsParentTask = true;
-    //      hiveTask.Task.FinishWhenChildJobsFinished = true;
-    //      taskData = hiveTask.GetAsTaskData(true, out plugins);
-    //    } else {
-    //      hiveTask.Task.IsParentTask = false;
-    //      hiveTask.Task.FinishWhenChildJobsFinished = false;
-    //      taskData = hiveTask.GetAsTaskData(false, out plugins);
-    //    }
-    //    cancellationToken.ThrowIfCancellationRequested();
-
-    //    TryAndRepeat(() => {
-    //      if (!cancellationToken.IsCancellationRequested) {
-    //        lock (pluginLocker) {
-    //          HiveServiceLocator.Instance.CallHiveService((s) => hiveTask.Task.PluginsNeededIds = PluginUtil.GetPluginDependencies(s, this.onlinePlugins, this.alreadyUploadedPlugins, plugins));
-    //        }
-    //      }
-    //    }, Settings.Default.MaxRepeatServiceCalls, "Failed to upload plugins");
-    //    cancellationToken.ThrowIfCancellationRequested();
-    //    hiveTask.Task.PluginsNeededIds.Add(configPluginId);
-    //    hiveTask.Task.JobId = jobId;
-
-    //    log.LogMessage(string.Format("Uploading task ({0} kb, {1} objects)", taskData.Data.Count() / 1024, hiveTask.ItemTask.GetObjectGraphObjects().Count()));
-    //    TryAndRepeat(() => {
-    //      if (!cancellationToken.IsCancellationRequested) {
-    //        if (parentHiveTask != null) {
-    //          hiveTask.Task.Id = HiveServiceLocator.Instance.CallHiveService((s) => s.AddChildTask(parentHiveTask.Task.Id, hiveTask.Task, taskData));
-    //        } else {
-    //          hiveTask.Task.Id = HiveServiceLocator.Instance.CallHiveService((s) => s.AddTask(hiveTask.Task, taskData, groups.ToList()));
-    //        }
-    //      }
-    //    }, Settings.Default.MaxRepeatServiceCalls, "Failed to add task", log);
-    //    cancellationToken.ThrowIfCancellationRequested();
-
-    //    lock (jobCountLocker) {
-    //      progress.ProgressValue = (double)taskCount[0] / totalJobCount;
-    //      progress.Status = string.Format("Uploaded task ({0} of {1})", taskCount[0], totalJobCount);
-    //    }
-
-    //    var tasks = new List<TS.Task>();
-    //    foreach (HiveTask child in hiveTask.ChildHiveTasks) {
-    //      var task = TS.Task.Factory.StartNew((tuple) => {
-    //        var arguments = (Tuple<HiveTask, HiveTask>)tuple;
-    //        UploadTaskWithChildren_Old(progress, arguments.Item1, arguments.Item2, groups, taskCount, totalJobCount, configPluginId, jobId, log, cancellationToken);
-    //      }, new Tuple<HiveTask, HiveTask>(child, hiveTask));
-    //      task.ContinueWith((x) => log.LogException(x.Exception), TaskContinuationOptions.OnlyOnFaulted);
-    //      tasks.Add(task);
-    //    }
-    //    taskUploadSemaphore.Release(); semaphoreReleased = true; // the semaphore has to be release before waitall!
-    //    TS.Task.WaitAll(tasks.ToArray());
-    //  }
-    //  finally {
-    //    if (!semaphoreReleased) taskUploadSemaphore.Release();
-    //  }
-    //}
-    
     #endregion
 
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15913)
@@ -2449,4 +2449,7 @@
         System.Collections.Generic.List<HeuristicLab.Clients.Hive.Project> GetProjectsForAdministration();
         
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetProjectGenealogy", ReplyAction="http://tempuri.org/IHiveService/GetProjectGenealogyResponse")]
+        System.Collections.Generic.Dictionary<System.Guid, System.Collections.Generic.List<System.Guid>> GetProjectGenealogy();
+        
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/SaveProjectPermissions", ReplyAction="http://tempuri.org/IHiveService/SaveProjectPermissionsResponse")]
         void SaveProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool reassign, bool cascading, bool reassignCascading);
@@ -2490,4 +2493,7 @@
         System.Collections.Generic.List<HeuristicLab.Clients.Hive.SlaveGroup> GetSlaveGroupsForAdministration();
         
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetResourceGenealogy", ReplyAction="http://tempuri.org/IHiveService/GetResourceGenealogyResponse")]
+        System.Collections.Generic.Dictionary<System.Guid, System.Collections.Generic.List<System.Guid>> GetResourceGenealogy();
+        
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/UpdateSlave", ReplyAction="http://tempuri.org/IHiveService/UpdateSlaveResponse")]
         void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave);
@@ -2754,4 +2760,9 @@
         }
         
+        public System.Collections.Generic.Dictionary<System.Guid, System.Collections.Generic.List<System.Guid>> GetProjectGenealogy()
+        {
+            return base.Channel.GetProjectGenealogy();
+        }
+        
         public void SaveProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool reassign, bool cascading, bool reassignCascading)
         {
@@ -2819,4 +2830,9 @@
         }
         
+        public System.Collections.Generic.Dictionary<System.Guid, System.Collections.Generic.List<System.Guid>> GetResourceGenealogy()
+        {
+            return base.Channel.GetResourceGenealogy();
+        }
+        
         public void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave)
         {
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 15913)
@@ -795,4 +795,25 @@
       }
     }
+
+    public IDictionary<Guid, HashSet<Guid>> GetProjectGenealogy() {
+      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
+      var pm = PersistenceManager;
+      using(new PerformanceLogger("GetProjectGenealogy")) {
+        var projectDao = pm.ProjectDao;
+        var projectAncestors = new Dictionary<Guid, HashSet<Guid>>();
+        return pm.UseTransaction(() => {
+          var projects = projectDao.GetAll().ToList();
+          projects.ForEach(p => projectAncestors.Add(p.ProjectId, new HashSet<Guid>()));
+          foreach (var p in projects) {
+            var parentProject = p.ParentProject;
+            while(parentProject != null) {
+              projectAncestors[p.ProjectId].Add(parentProject.ProjectId);
+              parentProject = parentProject.ParentProject;
+            }
+          }
+          return projectAncestors;
+        });
+      }
+    }
     #endregion
 
@@ -1245,4 +1266,26 @@
     }
 
+    public IDictionary<Guid, HashSet<Guid>> GetResourceGenealogy() {
+      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
+      var pm = PersistenceManager;
+      using (new PerformanceLogger("GetResourceGenealogy")) {
+        var resourceDao = pm.ResourceDao;
+        var resourceAncestors = new Dictionary<Guid, HashSet<Guid>>();
+        return pm.UseTransaction(() => {
+          var resources = resourceDao.GetAll().ToList();
+          resources.ForEach(r => resourceAncestors.Add(r.ResourceId, new HashSet<Guid>()));
+          
+          foreach(var r in resources) {
+            var parentResource = r.ParentResource;
+            while(parentResource != null) {
+              resourceAncestors[r.ResourceId].Add(parentResource.ResourceId);
+              parentResource = parentResource.ParentResource;
+            }
+          }
+          return resourceAncestors;
+        });
+      }
+    }
+
     public void UpdateSlave(DT.Slave slaveDto) {
       RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/ServiceContracts/IHiveService.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/ServiceContracts/IHiveService.cs	(revision 15908)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/ServiceContracts/IHiveService.cs	(revision 15913)
@@ -154,4 +154,7 @@
     [OperationContract]
     IEnumerable<Project> GetProjectsForAdministration();
+
+    [OperationContract]
+    IDictionary<Guid, HashSet<Guid>> GetProjectGenealogy();
     #endregion
 
@@ -211,4 +214,7 @@
     [OperationContract]
     IEnumerable<SlaveGroup> GetSlaveGroupsForAdministration();
+
+    [OperationContract]
+    IDictionary<Guid, HashSet<Guid>> GetResourceGenealogy();
 
     [OperationContract]
