Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 15813)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 15819)
@@ -37,11 +37,17 @@
     private const int slaveImageIndex = 0;
     private const int slaveGroupImageIndex = 1;
-    public const string ungroupedGroupName = "UNGROUPED";
-    public const string ungroupedGroupDescription = "Contains slaves that are not assigned to any group.";
+    public const string UNGROUPED_GROUP_NAME = "UNGROUPED";
+    public const string UNGROUPED_GROUP_DESCRIPTION = "Contains slaves that are not assigned to any group.";
+    public const string IMMUTABLE_TAG = " [assigned, immutable]";
+    public const string INCLUDED_TAG = " [included]";
+    public const string ADDED_ASSIGNMENT_TAG = " [added assignment]";
+    public const string REMOVED_ASSIGNMENT_TAG = " [removed assignment]";
+    public const string ADDED_INCLUDE_TAG = " [added include]";
+    public const string REMOVED_INCLUDE_TAG = " [removed include]";
 
     private readonly HashSet<Resource> assignedResources = new HashSet<Resource>();
     private readonly HashSet<Resource> newAssignedResources = new HashSet<Resource>();
-    private readonly HashSet<Resource> inheritedResources = new HashSet<Resource>();
-    private readonly HashSet<Resource> newInheritedResources = new HashSet<Resource>();
+    private readonly HashSet<Resource> includedResources = new HashSet<Resource>();
+    private readonly HashSet<Resource> newIncludedResources = new HashSet<Resource>();
 
     private readonly Dictionary<Guid, HashSet<Project>> projectAncestors = new Dictionary<Guid, HashSet<Project>>();
@@ -54,4 +60,7 @@
     private readonly Color addedIncludeColor = Color.FromArgb(25, 169, 221, 221); // #a9dddd
     private readonly Color removedIncludeColor = Color.FromArgb(25, 249, 210, 145); // #f9d291
+
+    private HashSet<Resource> projectExclusiveResources = new HashSet<Resource>();
+    private TreeNode ungroupedGroupNode;
 
     public new Project Content {
@@ -73,5 +82,5 @@
         assignedResources.Clear();
         newAssignedResources.Clear();
-        inheritedResources.Clear();
+        includedResources.Clear();
         resourceAncestors.Clear();
         treeView.Nodes.Clear();
@@ -132,8 +141,8 @@
     private void treeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) {
       var checkedResource = (Resource)e.Node.Tag;
-      if (newInheritedResources.Contains(checkedResource) || checkedResource.Id == Guid.Empty) {
+      if (newIncludedResources.Contains(checkedResource) || checkedResource.Id == Guid.Empty || e.Node == ungroupedGroupNode) {
         e.Cancel = true;
       } else if (!HiveRoles.CheckAdminUserPermissions()) {
-          if (!projectAncestors[Content.Id].Any()) {
+          if (!projectAncestors[Content.Id].Any() || projectExclusiveResources.Contains(checkedResource)) {
             e.Cancel = true;
           }
@@ -164,13 +173,71 @@
     private void UpdateNewResourceTree() {
       UpdateNewAssignedResources();
-      UpdateNewInheritedResources();
+      UpdateNewIncludedResources();
       var top = BuildResourceTree(HiveAdminClient.Instance.Resources);
       detailsViewHost.Content = top;
     }
 
-    private static IEnumerable<Resource> GetAssignedResourcesForProject(Guid projectId) {
+    private IEnumerable<Resource> GetAvailableResourcesForProjectAdministration(Guid projectId) {
+      projectExclusiveResources.Clear();
       if (projectId == Guid.Empty) return Enumerable.Empty<Resource>();
-      var assignedProjectResources = HiveServiceLocator.Instance.CallHiveService(s => s.GetAssignedResourcesForProjectAdministration(projectId));
-      return HiveAdminClient.Instance.Resources.Where(x => assignedProjectResources.Select(y => y.ResourceId).Contains(x.Id));
+      var resources = HiveAdminClient.Instance.Resources.Where(x => x.Id != Guid.Empty);
+      if (!resources.Any()) return resources;
+      if (IsAdmin()) return resources;
+
+      // get project specific assigned resources
+      var projectResources = resources.Where(x => 
+        HiveAdminClient.Instance.ProjectResourceAssignments
+          .Where(a => a.ProjectId == projectId)
+          .Select(a => a.ResourceId)
+        .Contains(x.Id));
+
+      // look up for assignments of ancestor projects
+      var projectIds = new HashSet<Guid>();
+      if(projectAncestors.ContainsKey(projectId)) {
+        projectAncestors[projectId].ToList().ForEach(x => projectIds.Add(x.Id));
+      }
+      var ancestorProjectResources = resources.Where(x => 
+        HiveAdminClient.Instance.ProjectResourceAssignments
+          .Where(a => projectIds.Contains(a.ProjectId))
+          .Select(a => a.ResourceId)
+        .Contains(x.Id));
+
+      // look down for included resources of ancestor projects
+      HashSet<Resource> availableResources = new HashSet<Resource>(ancestorProjectResources);
+      foreach (var r in ancestorProjectResources) {
+        if(resourceDescendants.ContainsKey(r.Id)) {
+          foreach(var d in resourceDescendants[r.Id]) {
+            availableResources.Add(d);
+          }
+        }
+      }
+
+      // determine resources, which are exclusively assigned to the currently selected project
+      projectResources
+        .Except(availableResources)
+        .ToList()
+        .ForEach(x => projectExclusiveResources.Add(x));
+
+      // look down for included resources of currently selected project
+      if (projectExclusiveResources.Any()) {
+        foreach (var r in projectExclusiveResources.ToArray()) {
+          if (resourceDescendants.ContainsKey(r.Id)) {
+            foreach (var d in resourceDescendants[r.Id]) {
+              projectExclusiveResources.Add(d);
+            }
+          }
+        }
+      }
+
+      return availableResources.Union(projectExclusiveResources);
+    }
+
+    private IEnumerable<Resource> GetAssignedResourcesForProject(Guid projectId) {
+      if (projectId == Guid.Empty) return Enumerable.Empty<Resource>();
+      return HiveAdminClient.Instance.Resources.Where(x =>
+        HiveAdminClient.Instance.ProjectResourceAssignments
+          .Where(a => a.ProjectId == projectId)
+          .Select(a => a.ResourceId)
+        .Contains(x.Id));
     }
 
@@ -199,56 +266,13 @@
     }
 
-    private void UpdateNewInheritedResources() {
-      newInheritedResources.Clear();
+    private void UpdateNewIncludedResources() {
+      newIncludedResources.Clear();
       foreach (var a in newAssignedResources) {
         if (resourceDescendants.ContainsKey(a.Id)) {
           foreach (var r in resourceDescendants[a.Id]) {
-            newInheritedResources.Add(r);
-          }
-        }
-      }
-    }
-
-    private void UpdateResourceGenealogy() {
-      resourceAncestors.Clear();
-      resourceDescendants.Clear();
-      var resources = HiveAdminClient.Instance.Resources;
-
-      foreach(var r in resources.Where(x => x.Id != Guid.Empty)) {
-        resourceAncestors.Add(r.Id, new HashSet<Resource>());
-        resourceDescendants.Add(r.Id, new HashSet<Resource>());
-      }
-
-      foreach(var r in resources.Where(x => x.Id != Guid.Empty)) { 
-        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;
-          }
-        }
-      }
-
-      inheritedResources.Clear();
-      newInheritedResources.Clear();
-      foreach(var a in assignedResources) {
-        if (resourceDescendants.ContainsKey(a.Id)) {
-          foreach(var r in resourceDescendants[a.Id]) {
-            inheritedResources.Add(r);
-            newInheritedResources.Add(r);
-          }
-        }
-      }
-
-      //foreach(var r in resources) {
-      //  if (resourceAncestors.ContainsKey(r.Id)
-      //    && resourceAncestors[r.Id].Intersect(assignedResources.Select(x => x.Id)).Any()) {
-      //    inheritedResources.Add(r);
-      //  }
-      //}
+            newIncludedResources.Add(r);
+          }
+        }
+      }
     }
 
@@ -260,5 +284,6 @@
       treeView.AfterCheck -= treeView_AfterCheck;
 
-      resources = resources.Where(x => x.Id != Guid.Empty);
+      resources = GetAvailableResourcesForProjectAdministration(Content.Id);
+
       var mainResources = new HashSet<Resource>(resources.OfType<SlaveGroup>().Where(x => x.ParentResourceId == null));
       var parentedMainResources = new HashSet<Resource>(resources.OfType<SlaveGroup>()
@@ -273,14 +298,8 @@
       Resource currentResource = null;
 
-
       var addedAssignments = newAssignedResources.Except(assignedResources);
       var removedAssignments = assignedResources.Except(newAssignedResources);
-      var addedIncludes = newInheritedResources.Except(inheritedResources);
-      var removedIncludes = inheritedResources.Except(newInheritedResources);
-
-      //var assignmentDiff = new HashSet<Resource>(newAssignedResources);
-      //assignmentDiff.SymmetricExceptWith(assignedResources);
-      //var inheritanceDiff = new HashSet<Resource>(newInheritedResources);
-      //inheritanceDiff.SymmetricExceptWith(inheritedResources);
+      var addedIncludes = newIncludedResources.Except(includedResources);
+      var removedIncludes = includedResources.Except(newIncludedResources);
 
       while (stack.Any()) {
@@ -306,24 +325,24 @@
           newNode.Checked = true;
           if(!HiveRoles.CheckAdminUserPermissions()) {
-            if(!projectAncestors[Content.Id].Any()) {
+            if(!projectAncestors[Content.Id].Any() || projectExclusiveResources.Contains(newResource)) {
               newNode.ForeColor = SystemColors.GrayText;
-              newNode.Text += " [immutable]";
+              newNode.Text += IMMUTABLE_TAG;
             }
           }
 
-        } else if (newInheritedResources.Contains(newResource)) {
+        } else if (newIncludedResources.Contains(newResource)) {
           newNode.Checked = true;
           newNode.ForeColor = SystemColors.GrayText;
         }
 
-          if (inheritedResources.Contains(newResource) && newInheritedResources.Contains(newResource)) {
-          newNode.Text += " [included]";
+          if (includedResources.Contains(newResource) && newIncludedResources.Contains(newResource)) {
+          newNode.Text += INCLUDED_TAG;
         } else if (addedIncludes.Contains(newResource)) {
           newNode.BackColor = addedIncludeColor;
           newNode.ForeColor = SystemColors.GrayText;
-          newNode.Text += " [added include]";
+          newNode.Text += ADDED_INCLUDE_TAG;
         } else if (removedIncludes.Contains(newResource)) {
           newNode.BackColor = removedIncludeColor;
-          newNode.Text += " [removed include]";
+          newNode.Text += REMOVED_INCLUDE_TAG;
         }
 
@@ -331,9 +350,9 @@
           newNode.BackColor = addedAssignmentColor;
           newNode.ForeColor = SystemColors.ControlText;
-          newNode.Text += " [added assignment]";
+          newNode.Text += ADDED_ASSIGNMENT_TAG;
         } else if (removedAssignments.Contains(newResource)) {
           newNode.BackColor = removedAssignmentColor;
           newNode.ForeColor = SystemColors.ControlText;
-          newNode.Text += " [removed assignment]";
+          newNode.Text += REMOVED_ASSIGNMENT_TAG;
         }
 
@@ -354,15 +373,13 @@
         }
         newNode.SelectedImageIndex = newNode.ImageIndex;
-        //if (newResource.OwnerUserId == UserInformation.Instance.User.Id)
-        //  newNode.BackColor = ownedResourceColor;
       }
 
       var ungroupedSlaves = subResources.OfType<Slave>().OrderBy(x => x.Name);
       if(ungroupedSlaves.Any()) {
-        var ungroupedNode = new TreeNode(ungroupedGroupName) {
+        ungroupedGroupNode = new TreeNode(UNGROUPED_GROUP_NAME) {
           ForeColor = SystemColors.GrayText,
           Tag = new SlaveGroup() {
-            Name = ungroupedGroupName,
-            Description = ungroupedGroupDescription
+            Name = UNGROUPED_GROUP_NAME,
+            Description = UNGROUPED_GROUP_DESCRIPTION
           }
         };
@@ -370,7 +387,9 @@
         foreach (var slave in ungroupedSlaves) {
           var slaveNode = new TreeNode(slave.Name) { Tag = slave };
-          ungroupedNode.Nodes.Add(slaveNode);
-        }
-        treeView.Nodes.Add(ungroupedNode);
+          ungroupedGroupNode.Nodes.Add(slaveNode);
+        }
+        treeView.Nodes.Add(ungroupedGroupNode);
+      } else {
+        ungroupedGroupNode?.Nodes.Clear();
       }
 
@@ -407,4 +426,44 @@
     }
 
+    private void UpdateResourceGenealogy() {
+      resourceAncestors.Clear();
+      resourceDescendants.Clear();
+      var resources = HiveAdminClient.Instance.Resources;
+
+      foreach (var r in resources.Where(x => x.Id != Guid.Empty)) {
+        resourceAncestors.Add(r.Id, new HashSet<Resource>());
+        resourceDescendants.Add(r.Id, new HashSet<Resource>());
+      }
+
+      foreach (var r in resources.Where(x => x.Id != Guid.Empty)) {
+        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;
+          }
+        }
+      }
+
+      includedResources.Clear();
+      newIncludedResources.Clear();
+      foreach (var a in assignedResources) {
+        if (resourceDescendants.ContainsKey(a.Id)) {
+          foreach (var r in resourceDescendants[a.Id]) {
+            includedResources.Add(r);
+            newIncludedResources.Add(r);
+          }
+        }
+      }
+    }
+
+    private bool IsAdmin() {
+      return HiveRoles.CheckAdminUserPermissions();
+    }
+
     #endregion
   }
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 15813)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 15819)
@@ -298,5 +298,5 @@
     private void treeSlaveGroup_MouseDown(object sender, MouseEventArgs e) {
       var node = treeView.GetNodeAt(e.Location);
-      if(node != null && node != ungroupedGroupNode /*!node.Text.StartsWith(UNGROUPED_GROUP_NAME)*/) ChangeSelectedResourceNode(node);
+      if(node != null && node != ungroupedGroupNode) ChangeSelectedResourceNode(node);
     }
 
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs	(revision 15813)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs	(revision 15819)
@@ -65,4 +65,9 @@
     }
 
+    private IItemList<AssignedProjectResource> projectResourceAssignments;
+    public IItemList<AssignedProjectResource> ProjectResourceAssignments {
+      get { return projectResourceAssignments; }
+    }
+
     private Dictionary<Guid, HashSet<Project>> projectAncestors;
     public Dictionary<Guid, HashSet<Project>> ProjectAncestors {
@@ -110,4 +115,5 @@
         resources = new ItemList<Resource>();
         projects = new ItemList<Project>();
+        projectResourceAssignments = new ItemList<AssignedProjectResource>();
 
         projectAncestors = new Dictionary<Guid, HashSet<Project>>();
@@ -120,4 +126,8 @@
           service.GetSlavesForAdministration().ForEach(s => resources.Add(s));
           service.GetProjectsForAdministration().ForEach(p => projects.Add(p));
+          var projectIds = projects.Select(p => p.Id).ToList();
+          if(projectIds.Any())
+            service.GetAssignedResourcesForProjectsAdministration(projectIds)
+            .ForEach(a => projectResourceAssignments.Add(a));
         });
 
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15813)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15819)
@@ -2452,10 +2452,4 @@
         void SaveProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool reassign, bool cascading, bool reassignCascading);
         
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GrantProjectPermissions", ReplyAction="http://tempuri.org/IHiveService/GrantProjectPermissionsResponse")]
-        void GrantProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool cascading);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/RevokeProjectPermissions", ReplyAction="http://tempuri.org/IHiveService/RevokeProjectPermissionsResponse")]
-        void RevokeProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool cascading);
-        
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetProjectPermissions", ReplyAction="http://tempuri.org/IHiveService/GetProjectPermissionsResponse")]
         System.Collections.Generic.List<HeuristicLab.Clients.Hive.ProjectPermission> GetProjectPermissions(System.Guid projectId);
@@ -2463,10 +2457,4 @@
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/SaveProjectResourceAssignments", ReplyAction="http://tempuri.org/IHiveService/SaveProjectResourceAssignmentsResponse")]
         void SaveProjectResourceAssignments(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds, bool reassign, bool cascading, bool reassignCascading);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AssignProjectResources", ReplyAction="http://tempuri.org/IHiveService/AssignProjectResourcesResponse")]
-        void AssignProjectResources(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds, bool cascading);
-        
-        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/UnassignProjectResources", ReplyAction="http://tempuri.org/IHiveService/UnassignProjectResourcesResponse")]
-        void UnassignProjectResources(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds, bool cascading);
         
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetAssignedResourcesForProject", ReplyAction="http://tempuri.org/IHiveService/GetAssignedResourcesForProjectResponse")]
@@ -2477,4 +2465,8 @@
         System.Collections.Generic.List<HeuristicLab.Clients.Hive.AssignedProjectResource> GetAssignedResourcesForProjectAdministration(System.Guid projectId);
         
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetAssignedResourcesForProjectsAdministration", ReplyAction="http://tempuri.org/IHiveService/GetAssignedResourcesForProjectsAdministrationResp" +
+            "onse")]
+        System.Collections.Generic.List<HeuristicLab.Clients.Hive.AssignedProjectResource> GetAssignedResourcesForProjectsAdministration(System.Collections.Generic.List<System.Guid> projectIds);
+        
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddSlave", ReplyAction="http://tempuri.org/IHiveService/AddSlaveResponse")]
         System.Guid AddSlave(HeuristicLab.Clients.Hive.Slave slave);
@@ -2767,14 +2759,4 @@
         }
         
-        public void GrantProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool cascading)
-        {
-            base.Channel.GrantProjectPermissions(projectId, grantedUserIds, cascading);
-        }
-        
-        public void RevokeProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool cascading)
-        {
-            base.Channel.RevokeProjectPermissions(projectId, grantedUserIds, cascading);
-        }
-        
         public System.Collections.Generic.List<HeuristicLab.Clients.Hive.ProjectPermission> GetProjectPermissions(System.Guid projectId)
         {
@@ -2787,14 +2769,4 @@
         }
         
-        public void AssignProjectResources(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds, bool cascading)
-        {
-            base.Channel.AssignProjectResources(projectId, resourceIds, cascading);
-        }
-        
-        public void UnassignProjectResources(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds, bool cascading)
-        {
-            base.Channel.UnassignProjectResources(projectId, resourceIds, cascading);
-        }
-        
         public System.Collections.Generic.List<HeuristicLab.Clients.Hive.AssignedProjectResource> GetAssignedResourcesForProject(System.Guid projectId)
         {
@@ -2807,4 +2779,9 @@
         }
         
+        public System.Collections.Generic.List<HeuristicLab.Clients.Hive.AssignedProjectResource> GetAssignedResourcesForProjectsAdministration(System.Collections.Generic.List<System.Guid> projectIds)
+        {
+            return base.Channel.GetAssignedResourcesForProjectsAdministration(projectIds);
+        }
+        
         public System.Guid AddSlave(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 15813)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 15819)
@@ -1053,4 +1053,23 @@
     }
 
+    public IEnumerable<DT.AssignedProjectResource> GetAssignedResourcesForProjectsAdministration(IEnumerable<Guid> projectIds) {
+      RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
+      foreach(var id in projectIds)
+        AuthorizationManager.AuthorizeForProjectAdministration(id, false);
+
+      var pm = PersistenceManager;
+      using (new PerformanceLogger("GetAssignedResourcesForProject")) {
+        var assignedProjectResourceDao = pm.AssignedProjectResourceDao;
+        var assignments = new List<DT.AssignedProjectResource>();
+        pm.UseTransaction(() => {
+          foreach (var id in projectIds) {
+            assignments.AddRange(assignedProjectResourceDao.GetByProjectId(id)
+              .Select(x => x.ToDto()));
+          }
+        });
+        return assignments.Distinct();
+      }
+    }
+
     #endregion
 
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/ServiceContracts/IHiveService.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/ServiceContracts/IHiveService.cs	(revision 15813)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/ServiceContracts/IHiveService.cs	(revision 15819)
@@ -185,4 +185,7 @@
     [OperationContract]
     IEnumerable<AssignedProjectResource> GetAssignedResourcesForProjectAdministration(Guid projectId);
+
+    [OperationContract]
+    IEnumerable<AssignedProjectResource> GetAssignedResourcesForProjectsAdministration(IEnumerable<Guid> projectIds);
     #endregion
 
