Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.Designer.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.Designer.cs	(revision 15576)
@@ -85,5 +85,5 @@
       this.idTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.idTextBox.Enabled = false;
+      this.idTextBox.ReadOnly = true;
       this.idTextBox.Location = new System.Drawing.Point(79, 29);
       this.idTextBox.Name = "idTextBox";
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.cs	(revision 15576)
@@ -71,5 +71,10 @@
       base.SetEnabledStateOfControls();
       bool enabled = Content != null && !Locked;
-      groupNameTextBox.ReadOnly = enabled;
+      groupNameTextBox.ReadOnly = !enabled;
+      idTextBox.ReadOnly = !enabled;
+      storeButton.Enabled = enabled;
+      refreshableLightweightUserView.Enabled = enabled;
+      //refreshableLightweightUserView.Locked = !enabled;
+      //refreshableLightweightUserView.ReadOnly = !enabled;
     }
 
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.cs	(revision 15576)
@@ -66,7 +66,7 @@
       bool enabled = Content != null && !Locked;
       
-      userNameTextBox.ReadOnly = enabled;
-      fullNameTextBox.ReadOnly = enabled;
-      emailTextBox.ReadOnly = enabled;
+      userNameTextBox.ReadOnly = !enabled;
+      fullNameTextBox.ReadOnly = !enabled;
+      emailTextBox.ReadOnly = !enabled;
 
       if (Content == null) {
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.cs	(revision 15576)
@@ -65,4 +65,15 @@
     }
 
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      bool enabled = Content != null && !Locked;
+      //userNameTextBox.ReadOnly = !enabled;
+      fullNameTextBox.ReadOnly = !enabled;
+      emailTextBox.ReadOnly = !enabled;
+      //rolesListView.Enabled = enabled;
+      //groupsListView.Enabled = enabled;
+      changePasswordButton.Enabled = enabled;
+    }
+
     private void changePasswordButton_Click(object sender, System.EventArgs e) {
       using (ChangePasswordDialog dialog = new ChangePasswordDialog()) {
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj	(revision 15576)
@@ -284,4 +284,9 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Views\ProjectView.resx">
+      <DependentUpon>ProjectView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectPermissionsView.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectPermissionsView.Designer.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectPermissionsView.Designer.cs	(revision 15576)
@@ -108,5 +108,5 @@
       this.permissionsGroupBox.TabIndex = 0;
       this.permissionsGroupBox.TabStop = false;
-      this.permissionsGroupBox.Text = "Permissions (Assigned + Inherited)";
+      this.permissionsGroupBox.Text = "Permissions (Assigned + Included)";
       // 
       // treeView
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectPermissionsView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectPermissionsView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectPermissionsView.cs	(revision 15576)
@@ -39,4 +39,13 @@
     private readonly HashSet<UserGroupBase> assignedPermissions = new HashSet<UserGroupBase>();
     private readonly HashSet<UserGroupBase> inheritedPermissions = new HashSet<UserGroupBase>();
+    private readonly HashSet<UserGroupBase> newAssignedPermissions = new HashSet<UserGroupBase>();
+    private readonly HashSet<UserGroupBase> newInheritedPermissions = new HashSet<UserGroupBase>();
+    private readonly Dictionary<Guid, HashSet<UserGroupBase>> userGroupAncestors = new Dictionary<Guid, HashSet<UserGroupBase>>();
+    private readonly Dictionary<Guid, HashSet<UserGroupBase>> userGroupDescendants = new Dictionary<Guid, HashSet<UserGroupBase>>();
+
+    private readonly Color addedAssignmentColor = Color.FromArgb(255, 87, 191, 193); // #57bfc1
+    private readonly Color removedAssignmentColor = Color.FromArgb(255, 236, 159, 72); // #ec9f48
+    private readonly Color addedIncludeColor = Color.FromArgb(25, 169, 221, 221); // #a9dddd
+    private readonly Color removedIncludeColor = Color.FromArgb(25, 249, 210, 145); // #f9d291
 
     public new Project Content {
@@ -58,13 +67,11 @@
         assignedPermissions.Clear();
         inheritedPermissions.Clear();
+        newAssignedPermissions.Clear();
+        newInheritedPermissions.Clear();
         treeView.Nodes.Clear();
         detailsViewHost.Content = null;
       } else {
-        UpdateAssignedPermissions();
-        UpdateInheritedPermissions();
-        var top = BuildPermissionsList(AccessClient.Instance.UsersAndGroups);
-        detailsViewHost.Content = top;
+        UpdatePermissionList();
         detailsViewHost.ActiveView.Locked = true;
-        
       }
     }
@@ -77,4 +84,43 @@
 
     private void refreshButton_Click(object sender, EventArgs e) {
+      UpdatePermissionList();
+    }
+
+    private async void inheritButton_Click(object sender, EventArgs e) {
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => SetGrantedProjectPermissions(Content.Id, newAssignedPermissions.Select(x => x.Id), false, true, true));
+      UpdatePermissionList();
+    }
+
+    private async void saveButton_Click(object sender, EventArgs e) {
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => SetGrantedProjectPermissions(Content.Id, newAssignedPermissions.Select(x => x.Id), false, false, false));
+      UpdatePermissionList();
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      var selectedPermission = (UserGroupBase)e.Node.Tag;
+      detailsViewHost.Content = selectedPermission;
+    }
+
+    private void treeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) {
+      var checkedPermission = (UserGroupBase)e.Node.Tag;
+      if (e.Node.Parent == null || newInheritedPermissions.Contains(checkedPermission) || checkedPermission.Id == Guid.Empty) e.Cancel = true;
+    }
+
+    private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
+      var checkedPermission = (UserGroupBase)e.Node.Tag;
+      if (e.Node.Checked)
+        newAssignedPermissions.Add(checkedPermission);
+      else
+        newAssignedPermissions.Remove(checkedPermission);
+
+      UpdateNewPermissionList();
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdatePermissionList() {
+      UpdateUserGroupGenealogy();
       UpdateAssignedPermissions();
       UpdateInheritedPermissions();
@@ -83,37 +129,76 @@
     }
 
-    private void inheritButton_Click(object sender, EventArgs e) {
-      SetGrantedProjectPermissions(Content.Id, Enumerable.Empty<Guid>());
-      UpdateAssignedPermissions();
-      UpdateInheritedPermissions();
+    private void UpdateNewPermissionList() {
+      UpdateNewAssignedPermissions();
+      UpdateNewInheritedPermissions();
       var top = BuildPermissionsList(AccessClient.Instance.UsersAndGroups);
       detailsViewHost.Content = top;
     }
 
-    private async void saveButton_Click(object sender, EventArgs e) {
-      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
-        action: () => SetGrantedProjectPermissions(Content.Id, assignedPermissions.Select(x => x.Id)));
-    }
-
-    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
-      var selectedPermission = (UserGroupBase)e.Node.Tag;
-      detailsViewHost.Content = selectedPermission;
-    }
-
-    private void treeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) {
-      var checkedPermission = (UserGroupBase)e.Node.Tag;
-      if (e.Node.Parent == null || inheritedPermissions.Contains(checkedPermission) || checkedPermission.Id == Guid.Empty) e.Cancel = true;
-    }
-
-    private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
-      var checkedPermission = (UserGroupBase)e.Node.Tag;
-      if (e.Node.Checked)
-        assignedPermissions.Add(checkedPermission);
-      else
-        assignedPermissions.Remove(checkedPermission);
-    }
-    #endregion
-
-    #region Helpers
+    private void UpdateAssignedPermissions() {
+      assignedPermissions.Clear();
+      newAssignedPermissions.Clear();
+      var grantedPermissions = GetGrantedPermissionsForProject(Content.Id);
+      foreach (var r in grantedPermissions) {
+        assignedPermissions.Add(r);
+        newAssignedPermissions.Add(r);
+      }
+    }
+
+    private void UpdateNewAssignedPermissions() {
+      for(int i = newAssignedPermissions.Count-1; i >= 0; i--) {
+        if(newAssignedPermissions.Intersect(userGroupAncestors[newAssignedPermissions.ElementAt(i).Id]).Any()) {
+          newAssignedPermissions.Remove(newAssignedPermissions.ElementAt(i));
+        }
+      }
+    }
+
+    private void UpdateInheritedPermissions() {
+      inheritedPermissions.Clear();
+      newInheritedPermissions.Clear();
+      foreach(var item in assignedPermissions) {
+        if(userGroupDescendants.ContainsKey(item.Id)) {
+          foreach(var descendant in userGroupDescendants[item.Id]) {
+            inheritedPermissions.Add(descendant);
+            newInheritedPermissions.Add(descendant);
+          }
+        }
+      }
+    }
+
+    private void UpdateNewInheritedPermissions() {
+      newInheritedPermissions.Clear();
+      foreach(var item in newAssignedPermissions) {
+        if(userGroupDescendants.ContainsKey(item.Id)) {
+          foreach(var descendant in userGroupDescendants[item.Id]) {
+            newInheritedPermissions.Add(descendant);
+          }
+        }
+      }
+    }
+
+    private void UpdateUserGroupGenealogy() {
+      userGroupAncestors.Clear();
+      userGroupDescendants.Clear();
+
+      var usersAndGroups = AccessClient.Instance.UsersAndGroups;
+      foreach (var ug in usersAndGroups) {
+        userGroupAncestors.Add(ug.Id, new HashSet<UserGroupBase>());
+        userGroupDescendants.Add(ug.Id, new HashSet<UserGroupBase>());
+      }
+
+      var userGroupTree = HiveServiceLocator.Instance.CallHiveService(s => s.GetUserGroupTree());
+      foreach(var branch in userGroupTree) {
+        var parent = usersAndGroups.Where(x => x.Id == branch.Key).SingleOrDefault();
+        if(parent != null) {
+          var userGroupsToAdd = usersAndGroups.Where(x => userGroupTree[parent.Id].Contains(x.Id));
+          foreach (var node in userGroupsToAdd) {
+            userGroupDescendants[parent.Id].Add(node);
+            userGroupAncestors[node.Id].Add(parent);
+          }
+        }
+      }
+    }
+
     private static IEnumerable<UserGroupBase> GetGrantedPermissionsForProject(Guid projectId) {
       var projectPermissions = HiveServiceLocator.Instance.CallHiveService(s => s.GetProjectPermissions(projectId));
@@ -122,26 +207,9 @@
     }
 
-    private static void SetGrantedProjectPermissions(Guid projectId, IEnumerable<Guid> userIds) {
+    private static void SetGrantedProjectPermissions(Guid projectId, IEnumerable<Guid> userIds, bool reassign, bool cascading, bool reassignCascading) {
+      if (projectId == null || userIds == null) return;
       HiveServiceLocator.Instance.CallHiveService(s => {
-        var currentlyAssignedPermissions = s.GetProjectPermissions(projectId);
-        s.RevokeProjectPermissions(projectId, currentlyAssignedPermissions.Select(x => x.GrantedUserId).ToList());
-        s.GrantProjectPermissions(projectId, userIds.ToList());
+        s.SaveProjectPermissions(projectId, userIds.ToList(), reassign, cascading, reassignCascading);
       });
-    }
-
-    private void UpdateAssignedPermissions() {
-      assignedPermissions.Clear();
-      foreach (var r in GetGrantedPermissionsForProject(Content.Id))
-        assignedPermissions.Add(r);
-    }
-
-    private void UpdateInheritedPermissions() {
-      inheritedPermissions.Clear();
-      var parentProject = HiveAdminClient.Instance.Projects.SingleOrDefault(x => x.Id == Content.ParentProjectId);
-      while (parentProject != null) {
-        foreach (var r in GetGrantedPermissionsForProject(parentProject.Id))
-          inheritedPermissions.Add(r);
-        parentProject = HiveAdminClient.Instance.Projects.SingleOrDefault(x => x.Id == parentProject.ParentProjectId);
-      }
     }
 
@@ -164,12 +232,5 @@
         node.ImageIndex = userGroupImageIndex;
         node.SelectedImageIndex = node.ImageIndex;
-
-        if (inheritedPermissions.Contains(group)) {
-          node.Checked = true;
-          node.Text += " (Inherited)";
-          node.ForeColor = SystemColors.GrayText;
-        } else if (assignedPermissions.Contains(group))
-          node.Checked = true;
-
+        BuildNode(group, node);
         groupsNode.Nodes.Add(node);
         if (first == null) first = group;
@@ -183,12 +244,5 @@
         node.ImageIndex = userImageIndex;
         node.SelectedImageIndex = node.ImageIndex;
-
-        if (inheritedPermissions.Contains(user)) {
-          node.Checked = true;
-          node.Text += " (Inherited)";
-          node.ForeColor = SystemColors.GrayText;
-        } else if (assignedPermissions.Contains(user))
-          node.Checked = true;
-
+        BuildNode(user, node);
         usersNode.Nodes.Add(node);
         if (first == null) first = user;
@@ -203,4 +257,42 @@
       return first;
     }
+
+    private void BuildNode(UserGroupBase ug, TreeNode node) {
+      var addedPermissions = newAssignedPermissions.Except(assignedPermissions);
+      var removedPermissions = assignedPermissions.Except(newAssignedPermissions);
+      var addedIncludes = newInheritedPermissions.Except(inheritedPermissions);
+      var removedIncludes = inheritedPermissions.Except(newInheritedPermissions);
+
+      if (newAssignedPermissions.Contains(ug)) {
+        node.Checked = true;
+      } else if (newInheritedPermissions.Contains(ug)) {
+        node.Checked = true;
+        node.ForeColor = SystemColors.GrayText;
+      }
+
+      if (inheritedPermissions.Contains(ug) && newInheritedPermissions.Contains(ug)) {
+        node.Text += " [included]";
+      } else if (addedIncludes.Contains(ug)) {
+        node.BackColor = addedIncludeColor;
+        node.ForeColor = SystemColors.GrayText;
+        node.Text += " [added include]";
+      } else if (removedIncludes.Contains(ug)) {
+        node.BackColor = removedIncludeColor;
+        node.ForeColor = SystemColors.GrayText;
+        node.Text += " [removed include]";
+      }
+
+      if (addedPermissions.Contains(ug)) {
+        node.BackColor = addedAssignmentColor;
+        node.ForeColor = SystemColors.ControlText;
+        node.Text += " [added assignment]";
+      } else if (removedPermissions.Contains(ug)) {
+        node.BackColor = removedAssignmentColor;
+        node.ForeColor = SystemColors.ControlText;
+        node.Text += " [removed assignment]";
+      }
+
+    }
+
     #endregion
   }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.Designer.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.Designer.cs	(revision 15576)
@@ -102,5 +102,5 @@
       this.resourcesGroupBox.TabIndex = 0;
       this.resourcesGroupBox.TabStop = false;
-      this.resourcesGroupBox.Text = "Resources (Assigned + Inherited)";
+      this.resourcesGroupBox.Text = "Resources (Assigned + Included)";
       // 
       // treeView
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 15576)
@@ -97,11 +97,10 @@
     }
 
-    private void inheritButton_Click(object sender, EventArgs e) {
-      return;
-      SetAssignedProjectResources(Content.Id, Enumerable.Empty<Guid>());
-      UpdateAssignedResources();
-      UpdateResourceGenealogy();
-      var top = BuildResourceTree(HiveAdminClient.Instance.Resources);
-      detailsViewHost.Content = top;
+    private async void inheritButton_Click(object sender, EventArgs e) {
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => {
+          SetAssignedProjectResources(Content.Id, newAssignedResources.Select(x => x.Id), false, true);
+        });
+      UpdateResourceTree();
     }
 
@@ -109,5 +108,5 @@
       await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
         action: () => {
-          SetAssignedProjectResources(Content.Id, newAssignedResources.Select(x => x.Id));
+          SetAssignedProjectResources(Content.Id, newAssignedResources.Select(x => x.Id), false, false);
         });
       UpdateResourceTree();
@@ -132,18 +131,9 @@
       }
 
-      UpdateNewAssignedResources();
-      UpdateNewInheritedResources();
-      var top = BuildResourceTree(HiveAdminClient.Instance.Resources);
-      detailsViewHost.Content = top;
+      UpdateNewResourceTree();
     }
     #endregion
 
     #region Helpers
-
-    //private void DisableResourceTree(TreeNode node) {
-    //  foreach(var n in node.Nodes) {
-
-    //  }
-    //}
 
     private void UpdateResourceTree() {
@@ -154,4 +144,11 @@
     }
 
+    private void UpdateNewResourceTree() {
+      UpdateNewAssignedResources();
+      UpdateNewInheritedResources();
+      var top = BuildResourceTree(HiveAdminClient.Instance.Resources);
+      detailsViewHost.Content = top;
+    }
+
     private static IEnumerable<Resource> GetAssignedResourcesForProject(Guid projectId) {
       var assignedProjectResources = HiveServiceLocator.Instance.CallHiveService(s => s.GetAssignedResourcesForProject(projectId));
@@ -159,9 +156,8 @@
     }
 
-    private void SetAssignedProjectResources(Guid projectId, IEnumerable<Guid> resourceIds) {
+    private void SetAssignedProjectResources(Guid projectId, IEnumerable<Guid> resourceIds, bool reassign, bool cascading) {
+      if (projectId == null || resourceIds == null) return;
       HiveServiceLocator.Instance.CallHiveService(s => {
-        var currentlyAssignedResources = s.GetAssignedResourcesForProject(projectId);
-        s.UnassignProjectResources(projectId, currentlyAssignedResources.Select(x => x.ResourceId).ToList());
-        s.AssignProjectResources(projectId, resourceIds.ToList());
+       s.SaveProjectResourceAssignments(projectId, resourceIds.ToList(), reassign, cascading, true);
       });
     }
@@ -295,8 +291,8 @@
           newNode.BackColor = addedIncludeColor;
           newNode.ForeColor = SystemColors.GrayText;
-          newNode.Text += " [+included]";
+          newNode.Text += " [added include]";
         } else if (removedIncludes.Contains(newResource)) {
           newNode.BackColor = removedIncludeColor;
-          newNode.Text += " [-included]";
+          newNode.Text += " [removed include]";
         }
 
@@ -304,9 +300,9 @@
           newNode.BackColor = addedAssignmentColor;
           newNode.ForeColor = SystemColors.ControlText;
-          newNode.Text += " [added]";
+          newNode.Text += " [added assignment]";
         } else if (removedAssignments.Contains(newResource)) {
           newNode.BackColor = removedAssignmentColor;
           newNode.ForeColor = SystemColors.ControlText;
-          newNode.Text += " [removed]";
+          newNode.Text += " [removed assignment]";
         }
 
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs	(revision 15576)
@@ -24,4 +24,7 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProjectView));
+      this.idLabel = new System.Windows.Forms.Label();
+      this.idTextBox = new System.Windows.Forms.TextBox();
       this.nameLabel = new System.Windows.Forms.Label();
       this.nameTextBox = new System.Windows.Forms.TextBox();
@@ -40,11 +43,30 @@
       this.SuspendLayout();
       // 
+      // idLabel
+      // 
+      this.idLabel.AutoSize = true;
+      this.idLabel.Location = new System.Drawing.Point(3, 11);
+      this.idLabel.Name = "idLabel";
+      this.idLabel.Size = new System.Drawing.Size(19, 13);
+      this.idLabel.TabIndex = 0;
+      this.idLabel.Text = "Id:";
+      // 
+      // idTextBox
+      // 
+      this.idTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.idTextBox.Location = new System.Drawing.Point(72, 8);
+      this.idTextBox.Name = "idTextBox";
+      this.idTextBox.ReadOnly = true;
+      this.idTextBox.Size = new System.Drawing.Size(464, 20);
+      this.idTextBox.TabIndex = 1;
+      // 
       // nameLabel
       // 
       this.nameLabel.AutoSize = true;
-      this.nameLabel.Location = new System.Drawing.Point(3, 11);
+      this.nameLabel.Location = new System.Drawing.Point(3, 37);
       this.nameLabel.Name = "nameLabel";
       this.nameLabel.Size = new System.Drawing.Size(38, 13);
-      this.nameLabel.TabIndex = 0;
+      this.nameLabel.TabIndex = 2;
       this.nameLabel.Text = "Name:";
       // 
@@ -53,8 +75,8 @@
       this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Location = new System.Drawing.Point(72, 8);
+      this.nameTextBox.Location = new System.Drawing.Point(72, 34);
       this.nameTextBox.Name = "nameTextBox";
       this.nameTextBox.Size = new System.Drawing.Size(464, 20);
-      this.nameTextBox.TabIndex = 1;
+      this.nameTextBox.TabIndex = 3;
       this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
       this.nameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.nameTextBox_Validating);
@@ -63,8 +85,8 @@
       // 
       this.descriptionLabel.AutoSize = true;
-      this.descriptionLabel.Location = new System.Drawing.Point(3, 37);
+      this.descriptionLabel.Location = new System.Drawing.Point(3, 63);
       this.descriptionLabel.Name = "descriptionLabel";
       this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
-      this.descriptionLabel.TabIndex = 2;
+      this.descriptionLabel.TabIndex = 4;
       this.descriptionLabel.Text = "Description:";
       // 
@@ -73,9 +95,9 @@
       this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.descriptionTextBox.Location = new System.Drawing.Point(72, 34);
+      this.descriptionTextBox.Location = new System.Drawing.Point(72, 60);
       this.descriptionTextBox.Multiline = true;
       this.descriptionTextBox.Name = "descriptionTextBox";
       this.descriptionTextBox.Size = new System.Drawing.Size(464, 98);
-      this.descriptionTextBox.TabIndex = 3;
+      this.descriptionTextBox.TabIndex = 5;
       this.descriptionTextBox.TextChanged += new System.EventHandler(this.descriptionTextBox_TextChanged);
       // 
@@ -86,8 +108,8 @@
       this.ownerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.ownerComboBox.FormattingEnabled = true;
-      this.ownerComboBox.Location = new System.Drawing.Point(102, 138);
+      this.ownerComboBox.Location = new System.Drawing.Point(102, 164);
       this.ownerComboBox.Name = "ownerComboBox";
       this.ownerComboBox.Size = new System.Drawing.Size(434, 21);
-      this.ownerComboBox.TabIndex = 5;
+      this.ownerComboBox.TabIndex = 6;
       this.ownerComboBox.SelectedIndexChanged += new System.EventHandler(this.ownerComboBox_SelectedIndexChanged);
       // 
@@ -95,8 +117,8 @@
       // 
       this.ownerLabel.AutoSize = true;
-      this.ownerLabel.Location = new System.Drawing.Point(3, 141);
+      this.ownerLabel.Location = new System.Drawing.Point(3, 167);
       this.ownerLabel.Name = "ownerLabel";
       this.ownerLabel.Size = new System.Drawing.Size(41, 13);
-      this.ownerLabel.TabIndex = 4;
+      this.ownerLabel.TabIndex = 7;
       this.ownerLabel.Text = "Owner:";
       // 
@@ -104,8 +126,8 @@
       // 
       this.createdLabel.AutoSize = true;
-      this.createdLabel.Location = new System.Drawing.Point(3, 171);
+      this.createdLabel.Location = new System.Drawing.Point(3, 197);
       this.createdLabel.Name = "createdLabel";
       this.createdLabel.Size = new System.Drawing.Size(47, 13);
-      this.createdLabel.TabIndex = 6;
+      this.createdLabel.TabIndex = 8;
       this.createdLabel.Text = "Created:";
       // 
@@ -115,5 +137,5 @@
       this.startDateTimePicker.Enabled = false;
       this.startDateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
-      this.startDateTimePicker.Location = new System.Drawing.Point(72, 190);
+      this.startDateTimePicker.Location = new System.Drawing.Point(72, 216);
       this.startDateTimePicker.Name = "startDateTimePicker";
       this.startDateTimePicker.Size = new System.Drawing.Size(200, 20);
@@ -124,8 +146,8 @@
       // 
       this.startLabel.AutoSize = true;
-      this.startLabel.Location = new System.Drawing.Point(3, 197);
+      this.startLabel.Location = new System.Drawing.Point(3, 223);
       this.startLabel.Name = "startLabel";
       this.startLabel.Size = new System.Drawing.Size(32, 13);
-      this.startLabel.TabIndex = 8;
+      this.startLabel.TabIndex = 10;
       this.startLabel.Text = "Start:";
       // 
@@ -135,5 +157,5 @@
       this.endDateTimePicker.Enabled = false;
       this.endDateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
-      this.endDateTimePicker.Location = new System.Drawing.Point(72, 217);
+      this.endDateTimePicker.Location = new System.Drawing.Point(72, 243);
       this.endDateTimePicker.Name = "endDateTimePicker";
       this.endDateTimePicker.Size = new System.Drawing.Size(200, 20);
@@ -144,5 +166,5 @@
       // 
       this.endLabel.AutoSize = true;
-      this.endLabel.Location = new System.Drawing.Point(3, 223);
+      this.endLabel.Location = new System.Drawing.Point(3, 249);
       this.endLabel.Name = "endLabel";
       this.endLabel.Size = new System.Drawing.Size(29, 13);
@@ -153,8 +175,8 @@
       // 
       this.indefiniteCheckBox.AutoSize = true;
-      this.indefiniteCheckBox.Location = new System.Drawing.Point(278, 219);
+      this.indefiniteCheckBox.Location = new System.Drawing.Point(278, 245);
       this.indefiniteCheckBox.Name = "indefiniteCheckBox";
       this.indefiniteCheckBox.Size = new System.Drawing.Size(69, 17);
-      this.indefiniteCheckBox.TabIndex = 12;
+      this.indefiniteCheckBox.TabIndex = 13;
       this.indefiniteCheckBox.Text = "Indefinite";
       this.indefiniteCheckBox.UseVisualStyleBackColor = true;
@@ -163,14 +185,14 @@
       // createdTextBox
       // 
-      this.createdTextBox.Location = new System.Drawing.Point(72, 164);
+      this.createdTextBox.Location = new System.Drawing.Point(72, 190);
       this.createdTextBox.Name = "createdTextBox";
       this.createdTextBox.ReadOnly = true;
       this.createdTextBox.Size = new System.Drawing.Size(200, 20);
-      this.createdTextBox.TabIndex = 7;
+      this.createdTextBox.TabIndex = 14;
       // 
       // refreshButton
       // 
-      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshButton.Location = new System.Drawing.Point(72, 136);
+      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
+      this.refreshButton.Location = new System.Drawing.Point(72, 162);
       this.refreshButton.Name = "refreshButton";
       this.refreshButton.Size = new System.Drawing.Size(24, 24);
@@ -197,6 +219,8 @@
       this.Controls.Add(this.nameTextBox);
       this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.idTextBox);
+      this.Controls.Add(this.idLabel);
       this.Name = "ProjectView";
-      this.Size = new System.Drawing.Size(539, 246);
+      this.Size = new System.Drawing.Size(539, 271);
       this.Load += new System.EventHandler(this.ProjectView_Load);
       this.ResumeLayout(false);
@@ -207,4 +231,6 @@
     #endregion
 
+    private System.Windows.Forms.Label idLabel;
+    protected System.Windows.Forms.TextBox idTextBox;
     private System.Windows.Forms.Label nameLabel;
     private System.Windows.Forms.TextBox nameTextBox;
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 15576)
@@ -67,4 +67,5 @@
       base.OnContentChanged();
       if (Content == null) {
+        idTextBox.Clear();
         nameTextBox.Clear();
         descriptionTextBox.Clear();
@@ -75,4 +76,5 @@
         indefiniteCheckBox.Checked = false;
       } else {
+        idTextBox.Text = Content.Id.ToString();
         nameTextBox.Text = Content.Name;
         descriptionTextBox.Text = Content.Description;
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourceView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourceView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourceView.cs	(revision 15576)
@@ -59,7 +59,7 @@
       base.SetEnabledStateOfControls();
       bool enabled = Content != null && !Locked;
-      nameTextBox.Enabled = enabled;
-      descriptionTextBox.Enabled = enabled;
-      heartbeatIntervalNumericUpDown.Enabled = enabled;
+      nameTextBox.ReadOnly = !enabled;
+      descriptionTextBox.ReadOnly = !enabled;
+      heartbeatIntervalNumericUpDown.ReadOnly = !enabled;
       publicCheckBox.Enabled = enabled;
     }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 15576)
@@ -344,6 +344,6 @@
         }
         newNode.SelectedImageIndex = newNode.ImageIndex;
-        if (newResource.OwnerUserId == UserInformation.Instance.User.Id)
-          newNode.BackColor = ownedResourceColor;
+        //if (newResource.OwnerUserId == UserInformation.Instance.User.Id)
+        //  newNode.BackColor = ownedResourceColor;
       }
 
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs	(revision 15576)
@@ -88,5 +88,5 @@
           service.GetSlaveGroups().ForEach(g => resources.Add(g));
           service.GetSlaves().ForEach(s => resources.Add(s));
-          service.GetProjects().ForEach(p => projects.Add(p));
+          service.GetProjectsForAdministration().ForEach(p => projects.Add(p));
         });
       }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15575)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15576)
@@ -74,4 +74,5 @@
         
         public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
     }
     
@@ -2358,18 +2359,27 @@
         System.Collections.Generic.List<HeuristicLab.Clients.Hive.Project> GetProjects();
         
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetProjectsForAdministration", ReplyAction="http://tempuri.org/IHiveService/GetProjectsForAdministrationResponse")]
+        System.Collections.Generic.List<HeuristicLab.Clients.Hive.Project> GetProjectsForAdministration();
+        
+        [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);
+        
         [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);
+        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);
+        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);
         
+        [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);
+        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);
+        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")]
@@ -2435,4 +2445,7 @@
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetUserIdByUsername", ReplyAction="http://tempuri.org/IHiveService/GetUserIdByUsernameResponse")]
         System.Guid GetUserIdByUsername(string username);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetUserGroupTree", ReplyAction="http://tempuri.org/IHiveService/GetUserGroupTreeResponse")]
+        System.Collections.Generic.Dictionary<System.Guid, System.Collections.Generic.List<System.Guid>> GetUserGroupTree();
         
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetUserPriorities", ReplyAction="http://tempuri.org/IHiveService/GetUserPrioritiesResponse")]
@@ -2639,12 +2652,22 @@
         }
         
-        public void GrantProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds)
-        {
-            base.Channel.GrantProjectPermissions(projectId, grantedUserIds);
-        }
-        
-        public void RevokeProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds)
-        {
-            base.Channel.RevokeProjectPermissions(projectId, grantedUserIds);
+        public System.Collections.Generic.List<HeuristicLab.Clients.Hive.Project> GetProjectsForAdministration()
+        {
+            return base.Channel.GetProjectsForAdministration();
+        }
+        
+        public void SaveProjectPermissions(System.Guid projectId, System.Collections.Generic.List<System.Guid> grantedUserIds, bool reassign, bool cascading, bool reassignCascading)
+        {
+            base.Channel.SaveProjectPermissions(projectId, grantedUserIds, reassign, cascading, reassignCascading);
+        }
+        
+        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);
         }
         
@@ -2654,12 +2677,17 @@
         }
         
-        public void AssignProjectResources(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds)
-        {
-            base.Channel.AssignProjectResources(projectId, resourceIds);
-        }
-        
-        public void UnassignProjectResources(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds)
-        {
-            base.Channel.UnassignProjectResources(projectId, resourceIds);
+        public void SaveProjectResourceAssignments(System.Guid projectId, System.Collections.Generic.List<System.Guid> resourceIds, bool reassign, bool cascading, bool reassignCascading)
+        {
+            base.Channel.SaveProjectResourceAssignments(projectId, resourceIds, reassign, cascading, reassignCascading);
+        }
+        
+        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);
         }
         
@@ -2769,4 +2797,9 @@
         }
         
+        public System.Collections.Generic.Dictionary<System.Guid, System.Collections.Generic.List<System.Guid>> GetUserGroupTree()
+        {
+            return base.Channel.GetUserGroupTree();
+        }
+        
         public System.Collections.Generic.List<HeuristicLab.Clients.Hive.UserPriority> GetUserPriorities()
         {
