Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj	(revision 15956)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj	(revision 15966)
@@ -132,4 +132,10 @@
     </Compile>
     <Compile Include="MenuItems\AdministratorMenuItem.cs" />
+    <Compile Include="Views\ProjectJobsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\ProjectJobsView.Designer.cs">
+      <DependentUpon>ProjectJobsView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Views\ProjectPermissionsView.cs">
       <SubType>UserControl</SubType>
@@ -248,4 +254,8 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data.Views\3.3\HeuristicLab.Data.Views-3.3.csproj">
+      <Project>{72104A0B-90E7-42F3-9ABE-9BBBADD4B943}</Project>
+      <Name>HeuristicLab.Data.Views-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
       <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
@@ -283,4 +293,9 @@
       <Private>False</Private>
     </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Views\ProjectJobsView.resx">
+      <DependentUpon>ProjectJobsView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.Designer.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.Designer.cs	(revision 15966)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.Designer.cs	(revision 15966)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using HeuristicLab.Data.Views;
+using System;
+
+namespace HeuristicLab.Clients.Hive.Administrator.Views {
+  partial class ProjectJobsView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProjectJobsView));
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.matrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
+      this.refreshButton.Location = new System.Drawing.Point(3, 3);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh data");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Image = ((System.Drawing.Image)(resources.GetObject("removeButton.Image")));
+      this.removeButton.Location = new System.Drawing.Point(33, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.removeButton, "Delete job(s)");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // matrixView
+      // 
+      this.matrixView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.matrixView.Caption = "StringConvertibleMatrix View";
+      this.matrixView.Content = null;
+      this.matrixView.Location = new System.Drawing.Point(3, 33);
+      this.matrixView.Name = "matrixView";
+      this.matrixView.ReadOnly = false;
+      this.matrixView.ShowRowsAndColumnsTextBox = false;
+      this.matrixView.ShowStatisticalInformation = false;
+      this.matrixView.Size = new System.Drawing.Size(504, 349);
+      this.matrixView.TabIndex = 3;
+      // 
+      // ProjectJobsView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.matrixView);
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.removeButton);
+      this.Name = "ProjectJobsView";
+      this.Size = new System.Drawing.Size(510, 385);
+      this.Load += new System.EventHandler(this.ProjectJobsView_Load);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button removeButton;
+    private StringConvertibleMatrixView matrixView;
+  }
+}
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.cs	(revision 15966)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectJobsView.cs	(revision 15966)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data.Views;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Clients.Hive.Administrator.Views {
+  [View("ProjectView")]
+  [Content(typeof(Project), IsDefaultView = false)]
+  public partial class ProjectJobsView : ItemView {
+    private const string JOB_ID = "Id";
+    private const string JOB_NAME = "Name";
+    private const string JOB_OWNER = "Owner";
+    private const string JOB_DATECREATED = "Date Created";
+    private const string JOB_STATE = "State";
+    private const string JOB_DESCRIPTION = "Description";
+
+    public new Project Content {
+      get { return (Project)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProjectJobsView() /*: base()*/ {
+      InitializeComponent();
+    }
+
+    #region Overrides
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateJobs();
+    }
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      bool enabled = Content != null && !Locked && !ReadOnly;
+
+      refreshButton.Enabled = enabled;
+      removeButton.Enabled = enabled;
+      matrixView.Enabled = enabled;
+    }
+    #endregion Overrides
+
+    #region Event Handlers
+    private void ProjectJobsView_Load(object sender, EventArgs e) {
+      
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      HiveAdminClient.Instance.Refresh();
+      // Update list/matrix
+    }
+
+    private async void removeButton_Click(object sender, EventArgs e) {
+      // remove selected job(s)
+    }
+
+    #endregion Event Handlers
+
+    #region Helpers
+    private StringMatrix CreateValueMatrix() {
+      var jobs = HiveAdminClient.Instance.Jobs[Content.Id];
+      string[,] values = new string[jobs.Count, 7];
+
+      for(int i = 0; i < jobs.Count; i++) {
+        var job = jobs.ElementAt(i);
+        values[i, 0] = job.Id.ToString();
+        values[i, 1] = job.Name;
+        values[i, 2] = job.OwnerUserId.ToString();
+        values[i, 3] = job.OwnerUsername;
+        values[i, 4] = job.DateCreated.ToString();
+        values[i, 5] = job.State.ToString();
+        values[i, 6] = job.Description;
+      }
+
+      var matrix = new StringMatrix(values);
+      matrix.ColumnNames = new string[] { JOB_ID, JOB_NAME, JOB_OWNER, JOB_OWNER, JOB_DATECREATED, JOB_STATE, JOB_DESCRIPTION };
+      matrix.SortableView = true;
+      return matrix;
+    }
+
+    private void UpdateJobs() {
+      if (InvokeRequired) Invoke((Action)UpdateJobs);
+      else {
+        StringMatrix matrix = null;
+        if(Content != null) {
+          matrix = CreateValueMatrix();
+        } else {
+          refreshButton.Enabled = false;
+          removeButton.Enabled = false;
+        }
+        matrixView.Content = matrix;
+        matrixView.DataGridView.AutoResizeColumns();
+        //foreach(DataGridViewColumn col in matrixView.DataGridView.Columns) {
+        //  col.Width = -2;
+        //}
+      }
+    }
+    #endregion Helpers
+  }
+}
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 15956)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 15966)
@@ -28,4 +28,5 @@
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
+using System.Drawing;
 
 namespace HeuristicLab.Clients.Hive.Administrator.Views {
@@ -35,7 +36,9 @@
     private readonly object locker = new object();
 
+    private Guid persistedOwnerUserId;
+
     public new Project Content {
       get { return (Project)base.Content; }
-      set { base.Content = value; }
+      set { base.Content = value; persistedOwnerUserId = Content != null ? Content.OwnerUserId : Guid.Empty; }
     }
 
@@ -82,9 +85,9 @@
         createdTextBox.Text = Content.DateCreated.ToString("ddd, dd.MM.yyyy, HH:mm:ss");
         startDateTimePicker.Value = Content.StartDate;
-        if (indefiniteCheckBox.Checked = !Content.EndDate.HasValue) {
-          endDateTimePicker.Value = startDateTimePicker.Value;
-        } else {
-          endDateTimePicker.Value = Content.EndDate.Value;
-        }
+
+        indefiniteCheckBox.Checked = !Content.EndDate.HasValue;
+        if(!indefiniteCheckBox.Checked) endDateTimePicker.Value = Content.EndDate.Value;
+        else endDateTimePicker.Value = Content.StartDate;
+        endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
       }
     }
@@ -148,5 +151,5 @@
           ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
           ownerComboBox.DataSource = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>().ToList();
-          ownerComboBox.SelectedItem = AccessClient.Instance.UsersAndGroups.FirstOrDefault(x => x.Id == Content.OwnerUserId);
+          ownerComboBox.SelectedItem = AccessClient.Instance.UsersAndGroups.FirstOrDefault(x => x.Id == persistedOwnerUserId);
           ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
           refreshButton.Enabled = true;
@@ -201,6 +204,11 @@
       if (Content == null) return;
       var newEndDate = indefiniteCheckBox.Checked ? (DateTime?)null : Content.StartDate;
-      if (Content.EndDate != newEndDate)
+      endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
+      if (Content.EndDate != newEndDate) {
+        DeregisterContentEvents();
         Content.EndDate = newEndDate;
+        endDateTimePicker.Value = newEndDate.HasValue ? newEndDate.Value : Content.StartDate;
+        RegisterContentEvents();
+      }
     }
     #endregion
Index: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.Designer.cs
===================================================================
--- branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.Designer.cs	(revision 15956)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.Designer.cs	(revision 15966)
@@ -39,4 +39,6 @@
       this.resourcesTabPage = new System.Windows.Forms.TabPage();
       this.projectResourcesView = new HeuristicLab.Clients.Hive.Administrator.Views.ProjectResourcesView();
+      this.jobsTabPage = new System.Windows.Forms.TabPage();
+      this.projectJobsView = new HeuristicLab.Clients.Hive.Administrator.Views.ProjectJobsView();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
@@ -48,4 +50,5 @@
       this.permissionsTabPage.SuspendLayout();
       this.resourcesTabPage.SuspendLayout();
+      this.jobsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -152,4 +155,5 @@
       this.tabControl.Controls.Add(this.permissionsTabPage);
       this.tabControl.Controls.Add(this.resourcesTabPage);
+      this.tabControl.Controls.Add(this.jobsTabPage);
       this.tabControl.Location = new System.Drawing.Point(3, 3);
       this.tabControl.Name = "tabControl";
@@ -225,4 +229,26 @@
       this.projectResourcesView.Size = new System.Drawing.Size(571, 509);
       this.projectResourcesView.TabIndex = 0;
+      //
+      // jobsTabPage
+      //
+      this.jobsTabPage.Controls.Add(this.projectJobsView);
+      this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.jobsTabPage.Name = "jobsTabPage";
+      this.jobsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.jobsTabPage.Size = new System.Drawing.Size(577, 515);
+      this.jobsTabPage.TabIndex = 3;
+      this.jobsTabPage.Text = "Jobs";
+      this.jobsTabPage.UseVisualStyleBackColor = true;
+      //
+      // projectJobsView
+      //
+      this.projectJobsView.Caption = "ProjectView";
+      this.projectJobsView.Content = null;
+      this.projectJobsView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.projectJobsView.Location = new System.Drawing.Point(3, 3);
+      this.projectJobsView.Name = "projectJobsView";
+      this.projectJobsView.ReadOnly = false;
+      this.projectJobsView.Size = new System.Drawing.Size(571, 509);
+      this.projectJobsView.TabIndex = 0;
       // 
       // ProjectsView
@@ -242,4 +268,5 @@
       this.permissionsTabPage.ResumeLayout(false);
       this.resourcesTabPage.ResumeLayout(false);
+      this.jobsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -260,6 +287,8 @@
     private System.Windows.Forms.ImageList imageList;
     private System.Windows.Forms.TabPage resourcesTabPage;
+    private System.Windows.Forms.TabPage jobsTabPage;
     private ProjectResourcesView projectResourcesView;
     private ProjectPermissionsView projectPermissionsView;
+    private ProjectJobsView projectJobsView;
     private System.Windows.Forms.ToolTip toolTip;
   }
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 15956)
+++ branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 15966)
@@ -100,4 +100,5 @@
         projectPermissionsView.Content = null;
         projectResourcesView.Content = null;
+        projectJobsView.Content = null;
       } else {
         BuildProjectTree(Content);
@@ -115,4 +116,5 @@
       projectPermissionsView.Enabled = enabled;
       projectResourcesView.Enabled = enabled;
+      projectJobsView.Enabled = enabled;
     }
     #endregion
@@ -228,4 +230,15 @@
         MessageBox.Show(
           "Only empty projects can be deleted.",
+          "HeuristicLab Hive Administrator",
+          MessageBoxButtons.OK,
+          MessageBoxIcon.Error);
+        return;
+      }
+
+      if (HiveAdminClient.Instance.Jobs.ContainsKey(selectedProject.Id) 
+        && HiveAdminClient.Instance.Jobs[selectedProject.Id] != null 
+        && HiveAdminClient.Instance.Jobs[selectedProject.Id].Any()) {
+        MessageBox.Show(
+          "There are " + HiveAdminClient.Instance.Jobs[selectedProject.Id].Count + " jobs using this project and/or child-projects. It is necessary to delete them before the project.",
           "HeuristicLab Hive Administrator",
           MessageBoxButtons.OK,
@@ -442,4 +455,5 @@
       projectPermissionsView.Content = project;
       projectResourcesView.Content = project;
+      projectJobsView.Content = project;
 
       bool projectIsNew = project != null && project.Id == Guid.Empty;
@@ -454,4 +468,5 @@
       projectPermissionsView.Locked = locked;
       projectResourcesView.Locked = locked;
+      projectJobsView.Locked = locked;
       selectedProject = project;
     }
