Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs	(revision 16040)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs	(revision 16043)
@@ -153,5 +153,5 @@
       this.startDateTimePicker.Size = new System.Drawing.Size(200, 20);
       this.startDateTimePicker.TabIndex = 9;
-      this.startDateTimePicker.ValueChanged += new System.EventHandler(this.startDateTimePicker_ValueChanged);
+      this.startDateTimePicker.ValueChanged += new System.EventHandler(this.startDateTimePicker_ValueChanged);      
       // 
       // startLabel
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 16040)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 16043)
@@ -67,6 +67,27 @@
     }
 
+    protected void RegisterControlEvents() {
+      nameTextBox.TextChanged += nameTextBox_TextChanged;
+      nameTextBox.Validating += nameTextBox_Validating;
+      descriptionTextBox.TextChanged += descriptionTextBox_TextChanged;
+      ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
+      startDateTimePicker.ValueChanged += startDateTimePicker_ValueChanged;
+      endDateTimePicker.ValueChanged += endDateTimePicker_ValueChanged;
+      indefiniteCheckBox.CheckedChanged += indefiniteCheckBox_CheckedChanged;
+    }
+
+    protected void DeregisterControlEvents() {
+      nameTextBox.TextChanged -= nameTextBox_TextChanged;
+      nameTextBox.Validating -= nameTextBox_Validating;
+      descriptionTextBox.TextChanged -= descriptionTextBox_TextChanged;
+      ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
+      startDateTimePicker.ValueChanged -= startDateTimePicker_ValueChanged;
+      endDateTimePicker.ValueChanged -= endDateTimePicker_ValueChanged;
+      indefiniteCheckBox.CheckedChanged -= indefiniteCheckBox_CheckedChanged;
+    }
+
     protected override void OnContentChanged() {
       base.OnContentChanged();
+      DeregisterControlEvents();
       if (Content == null) {
         idTextBox.Clear();
@@ -98,4 +119,5 @@
         endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
       }
+      RegisterControlEvents();
     }
 
@@ -112,10 +134,17 @@
       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;
-      } 
+      if(Content != null) {
+        var parentProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).LastOrDefault();
+        if (parentProject == null || parentProject.EndDate.HasValue) {
+          indefiniteCheckBox.Enabled = false;
+        }
+
+        if (!IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id)) {
+          ownerComboBox.Enabled = false;
+          startDateTimePicker.Enabled = false;
+          endDateTimePicker.Enabled = false;
+          indefiniteCheckBox.Enabled = false;
+        }
+      }
     }
     #endregion
@@ -187,11 +216,17 @@
 
     private void nameTextBox_TextChanged(object sender, EventArgs e) {
-      if (Content != null && Content.Name != nameTextBox.Text)
+      if (Content != null && Content.Name != nameTextBox.Text) {
+        DeregisterContentEvents();
         Content.Name = nameTextBox.Text;
+        RegisterContentEvents();
+      }        
     }
 
     private void descriptionTextBox_TextChanged(object sender, EventArgs e) {
-      if (Content != null && Content.Description != descriptionTextBox.Text)
+      if (Content != null && Content.Description != descriptionTextBox.Text) {
+        DeregisterContentEvents();
         Content.Description = descriptionTextBox.Text;
+        RegisterContentEvents();
+      }        
     }
 
@@ -199,24 +234,60 @@
       var selectedItem = (LightweightUser)ownerComboBox.SelectedItem;
       var selectedOwnerUserId = selectedItem != null ? selectedItem.Id : Guid.Empty;
-      if (Content != null && Content.OwnerUserId != selectedOwnerUserId)
+      if (Content != null && Content.OwnerUserId != selectedOwnerUserId) {
+        DeregisterContentEvents();
         Content.OwnerUserId = selectedOwnerUserId;
+        RegisterContentEvents();
+      }        
     }
 
     private void startDateTimePicker_ValueChanged(object sender, EventArgs e) {
       if (Content == null) return;
- 
+      startDateTimePicker.ValueChanged -= startDateTimePicker_ValueChanged;
+
+      if (!IsAdmin()) {
+        var parentProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).LastOrDefault();
+        if (parentProject != null) {
+          if(startDateTimePicker.Value < parentProject.StartDate)
+            startDateTimePicker.Value = parentProject.StartDate;
+        } else {
+          startDateTimePicker.Value = Content.StartDate;
+        }
+      }
+
       if (!Content.EndDate.HasValue || startDateTimePicker.Value > Content.EndDate)
         endDateTimePicker.Value = startDateTimePicker.Value;
-      if (Content.StartDate != startDateTimePicker.Value)
+      if (Content.StartDate != startDateTimePicker.Value) {
+        DeregisterContentEvents();
         Content.StartDate = startDateTimePicker.Value;
+        RegisterContentEvents();
+      }        
+
+      startDateTimePicker.ValueChanged += startDateTimePicker_ValueChanged;
     }
 
     private void endDateTimePicker_ValueChanged(object sender, EventArgs e) {
       if (Content == null) return;
+      endDateTimePicker.ValueChanged -= endDateTimePicker_ValueChanged;
+
+      if (!IsAdmin()) {
+        var parentProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).LastOrDefault();
+        if (parentProject != null) {
+          if (parentProject.EndDate.HasValue && endDateTimePicker.Value > parentProject.EndDate.Value) {
+            endDateTimePicker.Value = parentProject.EndDate.Value;
+          }
+        } else if(Content.EndDate.HasValue) {
+          endDateTimePicker.Value = Content.EndDate.Value;
+        }
+      }
 
       if (endDateTimePicker.Value < startDateTimePicker.Value)
         endDateTimePicker.Value = startDateTimePicker.Value;
-      if (Content.EndDate != endDateTimePicker.Value)
+      if (Content.EndDate != endDateTimePicker.Value) {
+        DeregisterContentEvents();
         Content.EndDate = endDateTimePicker.Value;
+        RegisterContentEvents();
+      }        
+
+      endDateTimePicker.ValueChanged += endDateTimePicker_ValueChanged;
     }
 
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 16040)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 16043)
@@ -197,8 +197,7 @@
     }
 
-    private void addButton_Click(object sender, EventArgs e) {
-      Guid? parentProjectId = null;
-
-      if(selectedProject == null && !IsAdmin()) {
+    private void addButton_Click(object sender, EventArgs e) {      
+
+      if (selectedProject == null && !IsAdmin()) {
         MessageBox.Show(
           "You are not allowed to add a root project - please select a parent project.",
@@ -218,10 +217,12 @@
       }
 
-      if (selectedProject != null) parentProjectId = selectedProject.Id;
       var project = new Project {
         Name = "New Project",
-        OwnerUserId = UserInformation.Instance.User.Id,
-        ParentProjectId = parentProjectId
+        OwnerUserId = UserInformation.Instance.User.Id,        
       };
+      if(selectedProject != null) {
+        project.ParentProjectId = selectedProject.Id;
+        project.EndDate = selectedProject.EndDate;
+      }
 
       SelectedProject = project;
@@ -508,5 +509,8 @@
 
       bool addEnabled = !locked;
-      if (!IsAdmin() && project == null) addEnabled = false;
+      if(addEnabled) {
+        var now = DateTime.Now;
+        if (now < project.StartDate || now > project.EndDate) addEnabled = false;
+      }
 
       bool saveEnabled = project != null;
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 16040)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 16043)
@@ -770,5 +770,6 @@
       // check if current (non-admin) user is owner of one of projectDto's-parents
       // note: non-admin users are not allowed to administer root projects (i.e. projects without parental entry)
-      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
+      bool isAdmin = RoleVerifier.IsInRole(HiveRoles.Administrator);
+      if (!isAdmin) {
         if(projectDto != null && projectDto.ParentProjectId.HasValue) {
           AuthorizationManager.AuthorizeForProjectAdministration(projectDto.ParentProjectId.Value, false);
@@ -792,4 +793,21 @@
         return pm.UseTransaction(() => {
           var project = projectDao.Save(projectDto.ToEntity());
+
+          var parentProjects = projectDao.GetParentProjectsById(project.ProjectId);
+          bool isParent = parentProjects.Select(x => x.OwnerUserId == UserManager.CurrentUserId).Any();
+
+          // if user is no admin, but owner of a parent project
+          // check start/end date time boundaries of parent projects before updating child project
+          if (!isAdmin) {
+            var parentProject = parentProjects.Where(x => x.ProjectId == project.ParentProjectId).FirstOrDefault();
+            if (parentProject != null) {
+              if (project.StartDate < parentProject.StartDate) project.StartDate = parentProject.StartDate;
+              if ((parentProject.EndDate.HasValue && project.EndDate.HasValue && project.EndDate > parentProject.EndDate)
+              || (parentProject.EndDate.HasValue && !project.EndDate.HasValue))
+                project.EndDate = parentProject.EndDate;
+            }
+          }
+
+
           project.ProjectPermissions.Clear();
           project.ProjectPermissions.Add(new DA.ProjectPermission {
@@ -808,7 +826,8 @@
       // check if current (non-admin) user is owner of the project or the projectDto's-parents
       // note: non-admin users are not allowed to administer root projects (i.e. projects without parental entry)
-      if (!RoleVerifier.IsInRole(HiveRoles.Administrator)) {
+      bool isAdmin = RoleVerifier.IsInRole(HiveRoles.Administrator);      
+      if (!isAdmin) {
         if (projectDto != null && projectDto.ParentProjectId.HasValue) {
-          AuthorizationManager.AuthorizeForProjectAdministration(projectDto.Id, false);
+          AuthorizationManager.AuthorizeForProjectAdministration(projectDto.Id, false);          
         } else {
           throw new SecurityException(NOT_AUTHORIZED_USERPROJECT);
@@ -830,9 +849,7 @@
         pm.UseTransaction(() => {
           var project = projectDao.GetById(projectDto.Id);
-          if (project != null) { // update existent project
-            var owner = UserManager.GetUserById(projectDto.OwnerUserId);
+          if (project != null) { // (1) update existent project
             var parentProjects = projectDao.GetParentProjectsById(project.ProjectId);
-            bool parentalOwnership = RoleVerifier.IsUserInRole(owner.UserName, HiveRoles.Administrator) 
-                                      || parentProjects.Select(x => x.OwnerUserId == project.OwnerUserId).Any();
+            bool isParent = parentProjects.Select(x => x.OwnerUserId == UserManager.CurrentUserId).Any();
 
             var formerOwnerId = project.OwnerUserId;
@@ -841,29 +858,20 @@
             projectDto.CopyToEntity(project);
 
-            if(parentalOwnership) {
+            // if user is no admin, but owner of parent project(s)
+            // check start/end date time boundaries of parent projects before updating child project
+            if (!isAdmin && isParent) {
+              var parentProject = parentProjects.Where(x => x.ProjectId == project.ParentProjectId).FirstOrDefault();
+              if (parentProject != null) {
+                if (project.StartDate < parentProject.StartDate) project.StartDate = formerStartDate;
+                if ((parentProject.EndDate.HasValue && project.EndDate.HasValue && project.EndDate > parentProject.EndDate)
+                || (parentProject.EndDate.HasValue && !project.EndDate.HasValue))
+                  project.EndDate = formerEndDate;
+              }
+            }
+
+            // if user is admin or owner of parent project(s)
+            if (isAdmin || isParent) {
               // 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
@@ -876,5 +884,5 @@
                 }
               }
-            } else {
+            } else { // if user is only owner of current project, but no admin and no owner of parent project(s)
               project.OwnerUserId = formerOwnerId;
               project.StartDate = formerStartDate;
@@ -882,6 +890,22 @@
             }
 
-          } else { // save new project
+          } else { // (2) save new project
             var newProject = projectDao.Save(projectDto.ToEntity());
+
+            var parentProjects = projectDao.GetParentProjectsById(project.ProjectId);
+            bool isParent = parentProjects.Select(x => x.OwnerUserId == UserManager.CurrentUserId).Any();
+
+            // if user is no admin, but owner of a parent project
+            // check start/end date time boundaries of parent projects before updating child project
+            if (!isAdmin) {
+              var parentProject = parentProjects.Where(x => x.ProjectId == project.ParentProjectId).FirstOrDefault();
+              if (parentProject != null) {
+                if (project.StartDate < parentProject.StartDate) project.StartDate = parentProject.StartDate;
+                if ((parentProject.EndDate.HasValue && project.EndDate.HasValue && project.EndDate > parentProject.EndDate)
+                || (parentProject.EndDate.HasValue && !project.EndDate.HasValue))
+                  project.EndDate = parentProject.EndDate;
+              }
+            }
+
             newProject.ProjectPermissions.Clear();
             newProject.ProjectPermissions.Add(new DA.ProjectPermission {
@@ -890,4 +914,5 @@
             });
           }
+
           pm.SubmitChanges();
         });
@@ -1204,4 +1229,5 @@
       if (projectId == null || resourceIds == null) return;
       AuthorizationManager.AuthorizeForProjectResourceAdministration(projectId, resourceIds);
+      bool isAdmin = RoleVerifier.IsInRole(HiveRoles.Administrator);
       var pm = PersistenceManager;
       using (new PerformanceLogger("SaveProjectResourceAssignments")) {
@@ -1211,16 +1237,14 @@
         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();
+          bool isParent = parentProjects.Select(x => x.OwnerUserId == UserManager.CurrentUserId).Any();
 
           var assignedResources = project.AssignedProjectResources.Select(x => x.ResourceId).ToArray();
-          if (!parentalOwnership) resourceIds = assignedResources.ToList();
+          if (!isParent) resourceIds = assignedResources.ToList();
           var removedAssignments = assignedResources.Except(resourceIds);
 
           // if user is admin or owner of parent project(s)
-          if(parentalOwnership) {
+          if(isAdmin || isParent) {
             // remove job and project assignments
             if (reassign) {
Index: branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs	(revision 16040)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Services.Hive/3.3/Manager/AuthorizationManager.cs	(revision 16043)
@@ -117,5 +117,5 @@
     }
 
-    // authorize if user is admin, or owner of a parent project, for which the resources are assigned to
+    // authorize if user is admin, or owner of a project or parent project, for which the resources are assigned to
     public void AuthorizeForProjectResourceAdministration(Guid projectId, IEnumerable<Guid> resourceIds) {
       if (projectId == null || projectId == Guid.Empty) return;
