Index: trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/HiveAdministratorView.Designer.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/HiveAdministratorView.Designer.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/HiveAdministratorView.Designer.cs	(revision 16202)
@@ -29,12 +29,12 @@
       this.components = new System.ComponentModel.Container();
       this.tabAdmin = new System.Windows.Forms.TabControl();
-      this.tabSlaves = new System.Windows.Forms.TabPage();
+      this.tabResources = new System.Windows.Forms.TabPage();
       this.resourcesView = new HeuristicLab.Clients.Hive.Administrator.Views.ResourcesView();
-      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.tabProjects = new System.Windows.Forms.TabPage();
       this.imageListUsers = new System.Windows.Forms.ImageList(this.components);
       this.projectsView = new HeuristicLab.Clients.Hive.Administrator.Views.ProjectsView();
       this.tabAdmin.SuspendLayout();
-      this.tabSlaves.SuspendLayout();
-      this.tabPage1.SuspendLayout();
+      this.tabResources.SuspendLayout();
+      this.tabProjects.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -44,6 +44,6 @@
             | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.tabAdmin.Controls.Add(this.tabSlaves);
-      this.tabAdmin.Controls.Add(this.tabPage1);
+      this.tabAdmin.Controls.Add(this.tabResources);
+      this.tabAdmin.Controls.Add(this.tabProjects);
       this.tabAdmin.Location = new System.Drawing.Point(3, 0);
       this.tabAdmin.Name = "tabAdmin";
@@ -52,14 +52,14 @@
       this.tabAdmin.TabIndex = 0;
       // 
-      // tabSlaves
+      // tabResources
       // 
-      this.tabSlaves.Controls.Add(this.resourcesView);
-      this.tabSlaves.Location = new System.Drawing.Point(4, 22);
-      this.tabSlaves.Name = "tabSlaves";
-      this.tabSlaves.Padding = new System.Windows.Forms.Padding(3);
-      this.tabSlaves.Size = new System.Drawing.Size(734, 520);
-      this.tabSlaves.TabIndex = 3;
-      this.tabSlaves.Text = "Slaves";
-      this.tabSlaves.UseVisualStyleBackColor = true;
+      this.tabResources.Controls.Add(this.resourcesView);
+      this.tabResources.Location = new System.Drawing.Point(4, 22);
+      this.tabResources.Name = "tabResources";
+      this.tabResources.Padding = new System.Windows.Forms.Padding(3);
+      this.tabResources.Size = new System.Drawing.Size(734, 520);
+      this.tabResources.TabIndex = 3;
+      this.tabResources.Text = "Resources";
+      this.tabResources.UseVisualStyleBackColor = true;
       // 
       // resourcesView
@@ -76,13 +76,13 @@
       this.resourcesView.TabIndex = 0;
       // 
-      // tabPage1
+      // tabProjects
       // 
-      this.tabPage1.Controls.Add(this.projectsView);
-      this.tabPage1.Location = new System.Drawing.Point(4, 22);
-      this.tabPage1.Name = "tabPage1";
-      this.tabPage1.Size = new System.Drawing.Size(734, 520);
-      this.tabPage1.TabIndex = 4;
-      this.tabPage1.Text = "Projects";
-      this.tabPage1.UseVisualStyleBackColor = true;
+      this.tabProjects.Controls.Add(this.projectsView);
+      this.tabProjects.Location = new System.Drawing.Point(4, 22);
+      this.tabProjects.Name = "tabProjects";
+      this.tabProjects.Size = new System.Drawing.Size(734, 520);
+      this.tabProjects.TabIndex = 4;
+      this.tabProjects.Text = "Projects";
+      this.tabProjects.UseVisualStyleBackColor = true;
       // 
       // imageListUsers
@@ -112,6 +112,6 @@
       this.Size = new System.Drawing.Size(745, 546);
       this.tabAdmin.ResumeLayout(false);
-      this.tabSlaves.ResumeLayout(false);
-      this.tabPage1.ResumeLayout(false);
+      this.tabResources.ResumeLayout(false);
+      this.tabProjects.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -122,6 +122,6 @@
     private System.ComponentModel.IContainer components;
     private System.Windows.Forms.ImageList imageListUsers;
-    private System.Windows.Forms.TabPage tabSlaves;
-    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.TabPage tabResources;
+    private System.Windows.Forms.TabPage tabProjects;
     private ProjectsView projectsView;
   }
Index: trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 16202)
@@ -86,8 +86,7 @@
         UpdateAssignedResources();
         UpdateIncludedResources();
-        var top = BuildResourceTree();
-        detailsViewHost.Content = top;
-        detailsViewHost.Locked = true;
-      }
+        detailsViewHost.Content = BuildResourceTree();
+      }
+      SetEnabledStateOfControls();
     }
 
@@ -99,4 +98,8 @@
       saveButton.Enabled = enabled;
       treeView.Enabled = enabled;
+
+      if (detailsViewHost != null) {
+        detailsViewHost.Locked = true;
+      }
     }
     #endregion
Index: trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 16202)
@@ -118,4 +118,5 @@
         endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
       }
+      SetEnabledStateOfControls();
       RegisterControlEvents();
     }
@@ -141,5 +142,5 @@
         }
 
-        if (!IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id)) {
+        if (Content.Id != Guid.Empty && !IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id)) {
           ownerComboBox.Enabled = false;
           startDateTimePicker.Enabled = false;
Index: trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 16202)
@@ -43,4 +43,5 @@
     private const string NOT_STORED_TAG = "*"; // " [not stored]";
     private const string CHANGES_NOT_STORED_TAG = "*"; // " [changes not stored]";
+    private const string INACTIVE_TAG = " [inactive]"; 
 
     private readonly Color selectedBackColor = Color.DodgerBlue;
@@ -476,8 +477,15 @@
       if (HiveAdminClient.Instance.DisabledParentProjects.Select(x => x.Id).Contains(p.Id)) {
         n.ForeColor = grayTextColor;
-      } else if (p.Id == Guid.Empty) {
-        n.Text += NOT_STORED_TAG;
-      } else if (p.Modified) {
-        n.Text += CHANGES_NOT_STORED_TAG;
+      } else {
+        if (p.Id == Guid.Empty) {
+          n.Text += NOT_STORED_TAG;
+        } else if (p.Modified) {
+          n.Text += CHANGES_NOT_STORED_TAG;
+        }
+
+        if (!IsActive(p)) {
+          n.ForeColor = grayTextColor;
+          n.Text += INACTIVE_TAG;
+        }
       }
     }
@@ -536,4 +544,10 @@
     }
 
+    private bool IsActive(Project project) {
+      return DateTime.Now >= project.StartDate
+             && (project.EndDate == null
+                 || DateTime.Now < project.EndDate.Value);
+    }
+
     private bool IsAuthorized(Project project) {
       return project != null && UserInformation.Instance.UserExists;
Index: trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 16202)
@@ -263,24 +263,22 @@
       var node = resourcesTreeView.GetNodeAt(new Point(e.X, e.Y));
 
-      if (node == null || node == additionalNode) {
+      if (node == null && e.Button == MouseButtons.Left) {
         resourcesTreeView.SelectedNode = null;
         ExtractStatistics();
-      } else {
-        var r = (Resource)node.Tag;
-        if (!HiveClient.Instance.DisabledParentResources.Contains(r)) {
-          ExtractStatistics((Resource)node.Tag);
-        } else {
-          resourcesTreeView.SelectedNode = null;
-          ExtractStatistics();
-        } 
       }
     }
 
     private void resourcesTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e) {
-      if(e.Node == null || e.Node == additionalNode) {
+      if(e.Node == null) {
+        e.Cancel = true;
+        resourcesTreeView.SelectedNode = null;
+        ExtractStatistics();
+      } else if (e.Node == additionalNode) {
         e.Cancel = true;
       } else {
         var r = (Resource)e.Node.Tag;
-        if(r == null || HiveClient.Instance.DisabledParentResources.Contains(r)) {
+        if(r != null && !HiveClient.Instance.DisabledParentResources.Contains(r)) {
+          ExtractStatistics(r);
+        } else {
           e.Cancel = true;
         }
@@ -299,9 +297,4 @@
           || newIncludedResources.Contains(checkedResource)) {
           e.Cancel = true;
-
-          var selectedNode = resourcesTreeView.SelectedNode;
-          var selectedResource = (Resource)(selectedNode != null ? selectedNode.Tag : null);
-
-          ExtractStatistics(selectedResource);
         }
       }
@@ -317,5 +310,6 @@
 
       UpdateResourceTreeAfterCheck();
-      ExtractStatistics();
+      if(resourcesTreeView.SelectedNode == null)
+        ExtractStatistics();
       OnAssignedResourcesChanged();
     }
@@ -548,5 +542,6 @@
       resourcesTreeView.AfterCheck -= resourcesTreeView_AfterCheck;
 
-      var disabledParentResources = HiveClient.Instance.DisabledParentResources;
+      //var disabledParentResources = HiveClient.Instance.DisabledParentResources;
+      var disabledParentResources = HiveClient.Instance.GetDisabledResourceAncestors(resources);
       var mainResources = new HashSet<Resource>(resources.OfType<SlaveGroup>().Where(x => x.ParentResourceId == null));
       //var parentedMainResources = new HashSet<Resource>(resources.OfType<SlaveGroup>()
Index: trunk/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive/3.3/HiveAdminClient.cs	(revision 16202)
@@ -26,4 +26,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Clients.Access;
 
 namespace HeuristicLab.Clients.Hive {
@@ -438,4 +439,13 @@
     }
 
+    public IEnumerable<Resource> GetDisabledResourceAncestors(IEnumerable<Resource> availableResources) {
+      var missingParentIds = availableResources
+        .Where(x => x.ParentResourceId.HasValue)
+        .SelectMany(x => resourceAncestors[x.Id]).Distinct()
+        .Where(x => !availableResources.Select(y => y.Id).Contains(x));
+
+      return resources.OfType<SlaveGroup>().Union(disabledParentResources).Where(x => missingParentIds.Contains(x.Id));
+    }
+
     public bool CheckAccessToAdminAreaGranted() {
       if(projects != null) {
@@ -478,5 +488,11 @@
 
       if(projectAncestors.ContainsKey(pro.Id)) {
-        return GetAvailableProjectAncestors(pro.Id).Where(x => x.OwnerUserId == userId).Any();
+        return GetAvailableProjectAncestors(pro.Id).Any(x => x.OwnerUserId == userId);
+      }
+
+      if (pro.ParentProjectId != null && pro.ParentProjectId != Guid.Empty) {
+        var parent = projects.FirstOrDefault(x => x.Id == pro.ParentProjectId.Value);
+        if (parent != null)
+          return parent.OwnerUserId == userId || GetAvailableProjectAncestors(parent.Id).Any(x => x.OwnerUserId == userId);
       }
 
@@ -491,7 +507,13 @@
       // ... or the new parent is not stored yet
       // ... or there is not parental change
-      if (child == null 
-        || (parent != null && parent.Id == Guid.Empty)
-        || (parent != null && parent.Id == child.ParentProjectId)) {
+      if (child == null
+          || (parent != null && parent.Id == Guid.Empty)
+          || (parent != null && parent.Id == child.ParentProjectId)) {
+        changePossible = false;
+      } else if (parent == null && !IsAdmin()) {
+        // ... if parent is null, but user is no admin (only admins are allowed to create root projects)
+        changePossible = false;
+      } else if (parent != null && (!IsAdmin() && parent.OwnerUserId != UserInformation.Instance.User.Id && !CheckOwnershipOfParentProject(parent, UserInformation.Instance.User.Id))) {
+        // ... if the user is no admin nor owner of the new parent or grand..grandparents
         changePossible = false;
       } else if(parent != null && projectDescendants.ContainsKey(child.Id)) {
@@ -525,4 +547,8 @@
       return changePossible;
     }
+
+    private bool IsAdmin() {
+      return HiveRoles.CheckAdminUserPermissions();
+    }
     #endregion
   }
Index: trunk/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- trunk/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 16187)
+++ trunk/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 16202)
@@ -324,4 +324,13 @@
       return resources.Where(x => assignedProjectResources.Select(y => y.ResourceId).Contains(x.Id));
     }
+
+    public IEnumerable<Resource> GetDisabledResourceAncestors(IEnumerable<Resource> availableResources) {
+      var missingParentIds = availableResources
+        .Where(x => x.ParentResourceId.HasValue)
+        .SelectMany(x => resourceAncestors[x.Id]).Distinct()
+        .Where(x => !availableResources.Select(y => y.Id).Contains(x));
+
+      return resources.OfType<SlaveGroup>().Union(disabledParentResources).Where(x => missingParentIds.Contains(x.Id));
+    }
     #endregion
 
