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 15995)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectResourcesView.cs	(revision 16040)
@@ -159,6 +159,8 @@
         || newIncludedResources.Contains(checkedResource)) {
         e.Cancel = true;
-      } else if (!HiveRoles.CheckAdminUserPermissions()) {
-          if (!HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).Any() || projectExclusiveResources.Contains(checkedResource)) {
+      } else if (!IsAdmin()) {
+          if (!HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id) 
+            || !HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).Any() 
+            || projectExclusiveResources.Contains(checkedResource)) {
             e.Cancel = true;
           }
@@ -367,5 +369,6 @@
           newNode.Checked = true;
           if(!HiveRoles.CheckAdminUserPermissions()) {
-            if (!HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).Any() 
+            if (!HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id) 
+              || !HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).Any() 
               || projectExclusiveResources.Contains(newResource)) {
               newNode.ForeColor = SystemColors.GrayText;
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 15995)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 16040)
@@ -111,4 +111,11 @@
       endDateTimePicker.Enabled = enabled && Content.EndDate.HasValue;
       indefiniteCheckBox.Enabled = enabled;
+
+      if (!IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id)) {
+        ownerComboBox.Enabled = false;
+        startDateTimePicker.Enabled = false;
+        endDateTimePicker.Enabled = false;
+        indefiniteCheckBox.Enabled = false;
+      } 
     }
     #endregion
@@ -198,4 +205,5 @@
     private void startDateTimePicker_ValueChanged(object sender, EventArgs e) {
       if (Content == null) return;
+ 
       if (!Content.EndDate.HasValue || startDateTimePicker.Value > Content.EndDate)
         endDateTimePicker.Value = startDateTimePicker.Value;
@@ -206,4 +214,5 @@
     private void endDateTimePicker_ValueChanged(object sender, EventArgs e) {
       if (Content == null) return;
+
       if (endDateTimePicker.Value < startDateTimePicker.Value)
         endDateTimePicker.Value = startDateTimePicker.Value;
@@ -214,4 +223,5 @@
     private void indefiniteCheckBox_CheckedChanged(object sender, EventArgs e) {
       if (Content == null) return;
+
       var newEndDate = indefiniteCheckBox.Checked ? (DateTime?)null : endDateTimePicker.Value;
       endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
@@ -233,4 +243,8 @@
     }
 
+    private bool IsAdmin() {
+      return HiveRoles.CheckAdminUserPermissions();
+    }
+
     private void ShowHiveInformationDialog() {
       if (InvokeRequired) Invoke((Action)ShowHiveInformationDialog);
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 15995)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 16040)
@@ -233,9 +233,23 @@
 
       lock (locker) {
+        // for details go to ChangeSelectedProject(..)
         if (!removeButton.Enabled) return;
         removeButton.Enabled = false;
       }
 
-      if (Content.Any(x => x.ParentProjectId == selectedProject.Id)) {
+      // double check of ChangeSelectedProject(..):
+      // if the user is no admin nor owner of a parent project
+      if (!IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(selectedProject, UserInformation.Instance.User.Id)) {
+        MessageBox.Show(
+          "Only admins and owners of parent projects are allowed to delete this project.",
+          "HeuristicLab Hive Administrator",
+          MessageBoxButtons.OK,
+          MessageBoxIcon.Error);
+        return;
+      }            
+
+
+      if (Content.Any(x => x.ParentProjectId == selectedProject.Id) 
+          || HiveAdminClient.Instance.ProjectDescendants[selectedProject.Id].Any()) {
         MessageBox.Show(
           "Only empty projects can be deleted.",
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 15995)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 16040)
@@ -831,40 +831,53 @@
           var project = projectDao.GetById(projectDto.Id);
           if (project != null) { // update existent project
+            var owner = UserManager.GetUserById(projectDto.OwnerUserId);
+            var parentProjects = projectDao.GetParentProjectsById(project.ProjectId);
+            bool parentalOwnership = RoleVerifier.IsUserInRole(owner.UserName, HiveRoles.Administrator) 
+                                      || parentProjects.Select(x => x.OwnerUserId == project.OwnerUserId).Any();
+
             var formerOwnerId = project.OwnerUserId;
+            var formerStartDate = project.StartDate;
+            var formerEndDate = project.EndDate;
             projectDto.CopyToEntity(project);
 
-            // if owner has changed...
-            if(formerOwnerId != projectDto.OwnerUserId) {
-              // OBSOLETE: former owner looses permission and project-related jobs
-              //var formerPermissionItem = project.ProjectPermissions.Where(x => x.GrantedUserId == formerOwnerId).FirstOrDefault();
-              //if (formerPermissionItem != null) {
-              //  // remove permissions
-              //  project.ProjectPermissions.Remove(formerPermissionItem);
-              //  // remove jobs if former owner is no member of a still permitted group
-              //  var ugt = GetUserGroupTree();
-              //  var permittedGuids = new HashSet<Guid>(); // User- and Group-Guids
-              //  // get all member-Guids of all still permitted groups
-              //  foreach (var item in project.ProjectPermissions) {
-              //    permittedGuids.Add(item.GrantedUserId);
-              //    if(ugt.ContainsKey(item.GrantedUserId)) {
-              //      ugt[item.GrantedUserId].ToList().ForEach(x => permittedGuids.Add(x));
-              //    }
-
-              //    // check if former owner Guid is in Member-Guids
-              //    // if yes: do nothing, if not do: 
-              //    if (!permittedGuids.Contains(formerOwnerId)) {
-              //      assignedJobResourceDao.DeleteByProjectIdAndUserIds(project.ProjectId, new List<Guid> { formerOwnerId });
-              //    }
-              //  }
-              //}
-              // Add permission for new owner if not already done
-              if(!project.ProjectPermissions
-                .Select(pp => pp.GrantedUserId)
-                .Contains(projectDto.OwnerUserId)) {
-                project.ProjectPermissions.Add(new DA.ProjectPermission {
-                  GrantedUserId = projectDto.OwnerUserId,
-                  GrantedByUserId = UserManager.CurrentUserId
-                });
+            if(parentalOwnership) {
+              // if owner has changed...
+              if (formerOwnerId != projectDto.OwnerUserId) {
+                // OBSOLETE: former owner looses permission and project-related jobs
+                //var formerPermissionItem = project.ProjectPermissions.Where(x => x.GrantedUserId == formerOwnerId).FirstOrDefault();
+                //if (formerPermissionItem != null) {
+                //  // remove permissions
+                //  project.ProjectPermissions.Remove(formerPermissionItem);
+                //  // remove jobs if former owner is no member of a still permitted group
+                //  var ugt = GetUserGroupTree();
+                //  var permittedGuids = new HashSet<Guid>(); // User- and Group-Guids
+                //  // get all member-Guids of all still permitted groups
+                //  foreach (var item in project.ProjectPermissions) {
+                //    permittedGuids.Add(item.GrantedUserId);
+                //    if(ugt.ContainsKey(item.GrantedUserId)) {
+                //      ugt[item.GrantedUserId].ToList().ForEach(x => permittedGuids.Add(x));
+                //    }
+
+                //    // check if former owner Guid is in Member-Guids
+                //    // if yes: do nothing, if not do: 
+                //    if (!permittedGuids.Contains(formerOwnerId)) {
+                //      assignedJobResourceDao.DeleteByProjectIdAndUserIds(project.ProjectId, new List<Guid> { formerOwnerId });
+                //    }
+                //  }
+                //}
+                // Add permission for new owner if not already done
+                if (!project.ProjectPermissions
+                  .Select(pp => pp.GrantedUserId)
+                  .Contains(projectDto.OwnerUserId)) {
+                  project.ProjectPermissions.Add(new DA.ProjectPermission {
+                    GrantedUserId = projectDto.OwnerUserId,
+                    GrantedByUserId = UserManager.CurrentUserId
+                  });
+                }
               }
+            } else {
+              project.OwnerUserId = formerOwnerId;
+              project.StartDate = formerStartDate;
+              project.EndDate = formerEndDate;
             }
 
@@ -1198,31 +1211,42 @@
         pm.UseTransaction(() => {
           var project = projectDao.GetById(projectId);
+
+          var owner = UserManager.GetUserById(project.OwnerUserId);
+          var parentProjects = projectDao.GetParentProjectsById(project.ProjectId);
+          bool parentalOwnership = RoleVerifier.IsUserInRole(owner.UserName, HiveRoles.Administrator)
+                                    || parentProjects.Select(x => x.OwnerUserId == project.OwnerUserId).Any();
+
           var assignedResources = project.AssignedProjectResources.Select(x => x.ResourceId).ToArray();
+          if (!parentalOwnership) resourceIds = assignedResources.ToList();
           var removedAssignments = assignedResources.Except(resourceIds);
 
-          // remove job and project assignments
-          if (reassign) {
-            assignedJobResourceDao.DeleteByProjectId(project.ProjectId);
-            project.AssignedProjectResources.Clear();
-          } else {
-            assignedJobResourceDao.DeleteByProjectIdAndResourceIds(projectId, removedAssignments);
-            foreach (var item in project.AssignedProjectResources
-              .Where(x => removedAssignments.Contains(x.ResourceId))
-              .ToList()) {
-              project.AssignedProjectResources.Remove(item);
+          // if user is admin or owner of parent project(s)
+          if(parentalOwnership) {
+            // remove job and project assignments
+            if (reassign) {
+              assignedJobResourceDao.DeleteByProjectId(project.ProjectId);
+              project.AssignedProjectResources.Clear();
+            } else {
+              assignedJobResourceDao.DeleteByProjectIdAndResourceIds(projectId, removedAssignments);
+              foreach (var item in project.AssignedProjectResources
+                .Where(x => removedAssignments.Contains(x.ResourceId))
+                .ToList()) {
+                project.AssignedProjectResources.Remove(item);
+              }
             }
-          }
-          pm.SubmitChanges();
-
-          // add project assignments
-          foreach (var id in resourceIds) {
-            if (project.AssignedProjectResources.All(x => x.ResourceId != id)) {
-              project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
-                ResourceId = id
-              });
+            pm.SubmitChanges();
+
+            // add project assignments
+            foreach (var id in resourceIds) {
+              if (project.AssignedProjectResources.All(x => x.ResourceId != id)) {
+                project.AssignedProjectResources.Add(new DA.AssignedProjectResource {
+                  ResourceId = id
+                });
+              }
             }
-          }
-          pm.SubmitChanges();
-
+            pm.SubmitChanges();
+          }
+
+          // if user is admin, project owner or owner of parent projects
           if (cascading) {
             var childProjects = projectDao.GetChildProjectsById(projectId).ToList();
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs	(revision 15995)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs	(revision 16040)
@@ -137,6 +137,6 @@
         if (RoleVerifier.IsInRole(HiveRoles.Administrator)) return;
 
-        // check if user is owner of a parent project
-        var projectBranch = projectDao.GetParentProjectsById(projectId).ToList();
+        // check if user is owner of the project or a parent project
+        var projectBranch = projectDao.GetCurrentAndParentProjectsById(projectId).ToList();
         if (!projectBranch.Select(x => x.OwnerUserId).Contains(currentUserId)
             && !RoleVerifier.IsInRole(HiveRoles.Administrator)) {
