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 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.Designer.cs	(revision 15412)
@@ -85,5 +85,5 @@
       this.ownerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.ownerComboBox.FormattingEnabled = true;
-      this.ownerComboBox.Location = new System.Drawing.Point(72, 138);
+      this.ownerComboBox.Location = new System.Drawing.Point(102, 138);
       this.ownerComboBox.Name = "ownerComboBox";
       this.ownerComboBox.Size = new System.Drawing.Size(434, 21);
@@ -170,7 +170,6 @@
       // refreshButton
       // 
-      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
       this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshButton.Location = new System.Drawing.Point(512, 136);
+      this.refreshButton.Location = new System.Drawing.Point(72, 136);
       this.refreshButton.Name = "refreshButton";
       this.refreshButton.Size = new System.Drawing.Size(24, 24);
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs	(revision 15412)
@@ -25,7 +25,7 @@
 using System.Windows.Forms;
 using HeuristicLab.Clients.Access;
+using HeuristicLab.Clients.Hive.Views;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
-using Tasks = System.Threading.Tasks;
 
 namespace HeuristicLab.Clients.Hive.Administrator.Views {
@@ -48,4 +48,5 @@
     }
 
+    #region Overrides
     protected override void OnClosing(FormClosingEventArgs e) {
       AccessClient.Instance.Refreshed -= AccessClient_Instance_Refreshed;
@@ -62,8 +63,4 @@
       Content.PropertyChanged -= Content_PropertyChanged;
       base.DeregisterContentEvents();
-    }
-
-    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
-      OnContentChanged();
     }
 
@@ -73,5 +70,4 @@
         nameTextBox.Clear();
         descriptionTextBox.Clear();
-        ownerComboBox.DataSource = null;
         ownerComboBox.SelectedItem = null;
         createdTextBox.Clear();
@@ -82,5 +78,4 @@
         nameTextBox.Text = Content.Name;
         descriptionTextBox.Text = Content.Description;
-        ownerComboBox.DataSource = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>().ToList();
         ownerComboBox.SelectedItem = AccessClient.Instance.UsersAndGroups.FirstOrDefault(x => x.Id == Content.OwnerUserId);
         createdTextBox.Text = Content.DateCreated.ToString("ddd, dd.MM.yyyy, HH:mm:ss");
@@ -99,4 +94,5 @@
       nameTextBox.Enabled = enabled;
       descriptionTextBox.Enabled = enabled;
+      refreshButton.Enabled = enabled;
       ownerComboBox.Enabled = enabled;
       createdTextBox.Enabled = enabled;
@@ -104,4 +100,10 @@
       endDateTimePicker.Enabled = enabled && Content.EndDate.HasValue;
       indefiniteCheckBox.Enabled = enabled;
+    }
+    #endregion
+
+    #region Event Handlers
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      OnContentChanged();
     }
 
@@ -125,13 +127,11 @@
 
     private async void ProjectView_Load(object sender, EventArgs e) {
-      lock (locker) {
-        if (updatingUsers) return;
-        updatingUsers = true;
-      }
-      try {
-        await Tasks.Task.Run(() => UpdateUsers());
-      } finally {
-        updatingUsers = false;
-      }
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => UpdateUsers(),
+        finallyCallback: () => {
+          ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
+          ownerComboBox.DataSource = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>().ToList();
+          ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
+        });
     }
 
@@ -141,18 +141,14 @@
         updatingUsers = true;
       }
-      try {
-        await Tasks.Task.Run(() => UpdateUsers());
-      } finally {
-        updatingUsers = false;
-      }
-    }
-
-    private void UpdateUsers() {
-      ownerComboBox.DataSource = null;
-      AccessClient.Instance.Refresh();
-      if (Content != null) {
-        ownerComboBox.DataSource = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>().ToList();
-        ownerComboBox.SelectedItem = AccessClient.Instance.UsersAndGroups.FirstOrDefault(x => x.Id == Content.OwnerUserId);
-      }
+
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => UpdateUsers(),
+        finallyCallback: () => {
+          ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
+          ownerComboBox.DataSource = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>().ToList();
+          ownerComboBox.SelectedItem = AccessClient.Instance.UsersAndGroups.FirstOrDefault(x => x.Id == Content.OwnerUserId);
+          ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
+          updatingUsers = false;
+        });
     }
 
@@ -192,4 +188,24 @@
       Content.EndDate = indefiniteCheckBox.Checked ? (DateTime?)null : Content.StartDate;
     }
+    #endregion
+
+    #region Helpers
+    private void UpdateUsers() {
+      try {
+        AccessClient.Instance.Refresh();
+      } catch (AnonymousUserException) {
+        ShowHiveInformationDialog();
+      }
+    }
+
+    private void ShowHiveInformationDialog() {
+      if (InvokeRequired) Invoke((Action)ShowHiveInformationDialog);
+      else {
+        using (HiveInformationDialog dialog = new HiveInformationDialog()) {
+          dialog.ShowDialog(this);
+        }
+      }
+    }
+    #endregion
   }
 }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs	(revision 15412)
@@ -104,6 +104,6 @@
       removeButton.Enabled = enabled;
       saveProjectButton.Enabled = enabled;
-      savePermissionsButton.Enabled = enabled && permissionsView.FetchSelectedUsers != null;
-      permissionsView.Enabled = enabled && permissionsView.FetchSelectedUsers != null;
+      savePermissionsButton.Enabled = enabled && permissionsView.Content != null && permissionsView.FetchSelectedUsers != null;
+      permissionsView.Enabled = enabled && permissionsView.Content != null && permissionsView.FetchSelectedUsers != null;
     }
     #endregion
@@ -111,13 +111,22 @@
     #region Event Handlers
     private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Project>> e) {
-      OnContentChanged();
+      if (InvokeRequired) Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<Project>>>)Content_ItemsAdded, sender, e);
+      else {
+        OnContentChanged();
+      }
     }
 
     private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Project>> e) {
-      OnContentChanged();
+      if (InvokeRequired) Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<Project>>>)Content_ItemsRemoved, sender, e);
+      else {
+        OnContentChanged();
+      }
     }
 
     private void ProjectViewContent_PropertyChanged(object sender, PropertyChangedEventArgs e) {
-      OnContentChanged();
+      if (InvokeRequired) Invoke((Action<object, PropertyChangedEventArgs>)ProjectViewContent_PropertyChanged, sender, e);
+      else {
+        OnContentChanged();
+      }
     }
 
@@ -159,12 +168,7 @@
 
     private async void ProjectsView_Load(object sender, EventArgs e) {
-      lock (locker) {
-        if (updatingProjects) return;
-        updatingProjects = true;
-      }
-
       await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
         action: () => UpdateProjects(),
-        finallyCallback: () => updatingProjects = false);
+        finallyCallback: () => Content = HiveAdminClient.Instance.Projects);
     }
 
@@ -177,5 +181,8 @@
       await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
         action: () => UpdateProjects(),
-        finallyCallback: () => updatingProjects = false);
+        finallyCallback: () => {
+          Content = HiveAdminClient.Instance.Projects;
+          updatingProjects = false;
+        });
     }
 
@@ -194,7 +201,30 @@
       }
 
-      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
-        action: () => RemoveProject(),
-        finallyCallback: () => removingProjects = false);
+      var selectedNode = projectsTreeView.SelectedNode;
+      if (selectedNode == null || selectedNode.Tag == null) return;
+
+      var project = (Project)selectedNode.Tag;
+      var result = MessageBox.Show(
+        "Do you really want to delete " + project.Name + "?",
+        "HeuristicLab Hive Administrator",
+        MessageBoxButtons.YesNo,
+        MessageBoxIcon.Question);
+
+      if (result == DialogResult.Yes) {
+        if (Content.Any(x => x.ParentProjectId == project.Id)) {
+          MessageBox.Show(
+            "Only empty projects can be deleted.",
+            "HeuristicLab Hive Administrator",
+            MessageBoxButtons.OK,
+            MessageBoxIcon.Error);
+        } else {
+          await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+            action: () => RemoveProject(project),
+            finallyCallback: () => {
+              Content.Remove(project);
+              removingProjects = false;
+            });
+        }
+      }
     }
 
@@ -222,8 +252,24 @@
       projectView.Content = selectedProject;
 
-      selectedProject.PropertyChanged += ProjectViewContent_PropertyChanged;
-
-      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
-        action: () => UpdatePermissions());
+      if (selectedProject != null)
+        selectedProject.PropertyChanged += ProjectViewContent_PropertyChanged;
+
+      if (IsAuthorized(selectedProject)) {
+        if (!tabControl.TabPages.Contains(permissionsTabPage))
+          tabControl.TabPages.Add(permissionsTabPage);
+
+        permissionsView.FetchSelectedUsers = () =>
+          HiveServiceLocator.Instance.CallHiveService(s => s.GetProjectPermissions(selectedProject.Id))
+                                     .Select(x => x.GrantedUserId)
+                                     .ToList();
+
+        if (tabControl.SelectedIndex == 1 && permissionsView.Content != null && permissionsView.FetchSelectedUsers != null)
+          await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+            action: () => UpdatePermissions());
+      } else {
+        if (tabControl.TabPages.Contains(permissionsTabPage))
+          tabControl.TabPages.Remove(permissionsTabPage);
+        permissionsView.FetchSelectedUsers = null;
+      }
     }
 
@@ -273,8 +319,8 @@
     }
 
-    private void tabControl_SelectedIndexChanged(object sender, EventArgs e) {
-      if (tabControl.SelectedIndex == 1) {
-        UpdatePermissions();
-      }
+    private async void tabControl_SelectedIndexChanged(object sender, EventArgs e) {
+      if (tabControl.SelectedIndex == 1 && permissionsView.Content != null && permissionsView.FetchSelectedUsers != null)
+        await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+          action: () => UpdatePermissions());
     }
 
@@ -341,60 +387,23 @@
     private void UpdateProjects() {
       try {
-
+        HiveAdminClient.Instance.Refresh();
       } catch (AnonymousUserException) {
         ShowHiveInformationDialog();
       }
-      HiveAdminClient.Instance.Refresh();
-      Content = HiveAdminClient.Instance.Projects;
-    }
-
-    private void RemoveProject() {
-      var selectedNode = projectsTreeView.SelectedNode;
-      if (selectedNode == null || selectedNode.Tag == null) return;
-
-      var project = (Project)selectedNode.Tag;
-      var result = MessageBox.Show(
-        "Do you really want to delete " + project.Name + "?",
-        "HeuristicLab Hive Administrator",
-        MessageBoxButtons.YesNo,
-        MessageBoxIcon.Question);
-
-      if (result == DialogResult.Yes) {
-        if (Content.Any(x => x.ParentProjectId == project.Id)) {
-          MessageBox.Show(
-            "Only empty projects can be deleted.",
-            "HeuristicLab Hive Administrator",
-            MessageBoxButtons.OK,
-            MessageBoxIcon.Error);
-        } else {
-          Content.Remove(project);
-          HiveAdminClient.Delete(project);
-        }
+    }
+
+    private void RemoveProject(Project project) {
+      try {
+        HiveAdminClient.Delete(project);
+      } catch (AnonymousUserException) {
+        ShowHiveInformationDialog();
       }
     }
 
     private void UpdatePermissions() {
-      var selectedNode = projectsTreeView.SelectedNode;
-      var project = (Project)selectedNode?.Tag;
-
-      if (IsAuthorized(project)) {
-        permissionsView.FetchSelectedUsers = () =>
-          HiveServiceLocator.Instance.CallHiveService(s => s.GetProjectPermissions(project.Id))
-                                            .Select(x => x.GrantedUserId)
-                                            .ToList();
-
-        savePermissionsButton.Enabled = true;
-
-        if (!tabControl.TabPages.Contains(permissionsTabPage))
-          tabControl.TabPages.Add(permissionsTabPage);
-
-        if (tabControl.SelectedIndex == 1 && permissionsView.Content != null && permissionsView.FetchSelectedUsers != null)
-          permissionsView.ManualRefresh();
-      } else {
-        permissionsView.FetchSelectedUsers = null;
-        savePermissionsButton.Enabled = false;
-
-        if (tabControl.TabPages.Contains(permissionsTabPage))
-          tabControl.TabPages.Remove(permissionsTabPage);
+      try {
+        permissionsView.ManualRefresh();
+      } catch (AnonymousUserException) {
+        ShowHiveInformationDialog();
       }
     }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.Designer.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.Designer.cs	(revision 15412)
@@ -53,5 +53,4 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourcesView));
       this.imageListSlaveGroups = new System.Windows.Forms.ImageList(this.components);
       this.splitSlaves = new System.Windows.Forms.SplitContainer();
@@ -63,8 +62,8 @@
       this.tabSlaveGroup = new System.Windows.Forms.TabControl();
       this.tabDetails = new System.Windows.Forms.TabPage();
+      this.tabSchedule = new System.Windows.Forms.TabPage();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       this.slaveView = new HeuristicLab.Clients.Hive.Administrator.Views.SlaveView();
-      this.tabSchedule = new System.Windows.Forms.TabPage();
       this.scheduleView = new HeuristicLab.Clients.Hive.Administrator.Views.ScheduleView();
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.splitSlaves)).BeginInit();
       this.splitSlaves.Panel1.SuspendLayout();
@@ -194,17 +193,4 @@
       this.tabDetails.UseVisualStyleBackColor = true;
       // 
-      // slaveView
-      // 
-      this.slaveView.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.slaveView.Caption = "SlaveView";
-      this.slaveView.Content = null;
-      this.slaveView.Location = new System.Drawing.Point(6, 6);
-      this.slaveView.Name = "slaveView";
-      this.slaveView.ReadOnly = false;
-      this.slaveView.Size = new System.Drawing.Size(565, 503);
-      this.slaveView.TabIndex = 0;
-      // 
       // tabSchedule
       // 
@@ -217,4 +203,17 @@
       this.tabSchedule.Text = "Schedule";
       this.tabSchedule.UseVisualStyleBackColor = true;
+      // 
+      // slaveView
+      // 
+      this.slaveView.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.slaveView.Caption = "SlaveView";
+      this.slaveView.Content = null;
+      this.slaveView.Location = new System.Drawing.Point(6, 6);
+      this.slaveView.Name = "slaveView";
+      this.slaveView.ReadOnly = false;
+      this.slaveView.Size = new System.Drawing.Size(565, 503);
+      this.slaveView.TabIndex = 0;
       // 
       // scheduleView
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 15412)
@@ -27,4 +27,5 @@
 using HeuristicLab.Clients.Access;
 using HeuristicLab.Clients.Hive.Views;
+using HeuristicLab.Collections;
 using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
@@ -144,16 +145,25 @@
 
     #region Event Handlers
-    private void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Resource>> e) {
-      OnContentChanged();
-    }
-
-    private void Content_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Resource>> e) {
-      OnContentChanged();
+    private void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Resource>> e) {
+      if (InvokeRequired) Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<Resource>>>)Content_ItemsAdded, sender, e);
+      else {
+        OnContentChanged();
+      }
+    }
+
+    private void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Resource>> e) {
+      if (InvokeRequired) Invoke((Action<object, CollectionItemsChangedEventArgs<IndexedItem<Resource>>>)Content_ItemsRemoved, sender, e);
+      else {
+        OnContentChanged();
+      }
     }
 
     private void SlaveViewContent_PropertyChanged(object sender, PropertyChangedEventArgs e) {
-      OnContentChanged();
-      if (e.PropertyName == "HbInterval") {
-        UpdateChildHbIntervall(slaveView.Content);
+      if (InvokeRequired) Invoke((Action<object, PropertyChangedEventArgs>)SlaveViewContent_PropertyChanged, sender, e);
+      else {
+        OnContentChanged();
+        if (e.PropertyName == "HbInterval") {
+          UpdateChildHbIntervall(slaveView.Content);
+        }
       }
     }
@@ -196,12 +206,6 @@
 
     private async void ResourcesView_Load(object sender, EventArgs e) {
-      lock (locker) {
-        if (updatingResources) return;
-        updatingResources = true;
-      }
-
       await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
-        action: () => UpdateResources(),
-        finallyCallback: () => updatingResources = false);
+        action: () => UpdateResources());
     }
 
@@ -259,9 +263,23 @@
       slaveView.Content = selectedResource;
 
-      if (selectedResource is SlaveGroup)
-        slaveView.Content.PropertyChanged += SlaveViewContent_PropertyChanged;
-
-      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
-        action: () => UpdateSchedule());
+      if (selectedResource != null && selectedResource is SlaveGroup)
+        selectedResource.PropertyChanged += SlaveViewContent_PropertyChanged;
+
+      if (IsAuthorized(selectedResource)) {
+        if (!tabSlaveGroup.TabPages.Contains(tabSchedule))
+          tabSlaveGroup.TabPages.Add(tabSchedule);
+
+        HiveAdminClient.Instance.DowntimeForResourceId = selectedResource.Id;
+
+        if (tabSlaveGroup.SelectedIndex == 1) {
+          await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+            action: () => UpdateSchedule(),
+            finallyCallback: () => scheduleView.Content = HiveAdminClient.Instance.Downtimes);
+        }
+      } else {
+        if (tabSlaveGroup.TabPages.Contains(tabSchedule))
+          tabSlaveGroup.TabPages.Remove(tabSchedule);
+        HiveAdminClient.Instance.DowntimeForResourceId = Guid.Empty;
+      }
     }
 
@@ -412,11 +430,6 @@
 
     private void UpdateResources() {
-      try {
-        ResetView();
-        HiveAdminClient.Instance.Refresh();
-        Content = HiveAdminClient.Instance.Resources;
-      } catch (AnonymousUserException) {
-        ShowHiveInformationDialog();
-      }
+      HiveAdminClient.Instance.Refresh();
+      Content = HiveAdminClient.Instance.Resources;
     }
 
@@ -452,22 +465,8 @@
 
     private void UpdateSchedule() {
-      var selectedNode = treeSlaveGroup.SelectedNode;
-      var resource = (Resource)selectedNode?.Tag;
-
-      if (IsAuthorized(resource)) {
-        if (!tabSlaveGroup.TabPages.Contains(tabSchedule))
-          tabSlaveGroup.TabPages.Add(tabSchedule);
-
-        if (tabSlaveGroup.SelectedIndex == 1) {
-          HiveAdminClient.Instance.DowntimeForResourceId = resource.Id;
-          HiveAdminClient.Instance.RefreshCalendar();
-          scheduleView.Invoke((Action)(() => {
-            scheduleView.Content = HiveAdminClient.Instance.Downtimes;
-            SetEnabledStateOfControls();
-          }));
-        }
-      } else {
-        if (tabSlaveGroup.TabPages.Contains(tabSchedule))
-          tabSlaveGroup.TabPages.Remove(tabSchedule);
+      try {
+        HiveAdminClient.Instance.RefreshCalendar();
+      } catch (AnonymousUserException) {
+        ShowHiveInformationDialog();
       }
     }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.cs	(revision 15412)
@@ -125,4 +125,8 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
+      bool enabled = Content != null;
+      txtName.Enabled = enabled;
+      txtHbIntervall.Enabled = enabled;
+      cbxPublic.Enabled = enabled;
     }
 
@@ -139,6 +143,5 @@
             int interval = int.Parse(txtHbIntervall.Text);
             Content.HbInterval = interval;
-          }
-          catch (Exception) {
+          } catch (Exception) {
             MessageBox.Show("Please enter a numeric value for the Heartbeat Interval.", "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);
             txtHbIntervall.Text = "10";
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/HeuristicLab.Clients.Hive.JobManager-3.3.csproj
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/HeuristicLab.Clients.Hive.JobManager-3.3.csproj	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/HeuristicLab.Clients.Hive.JobManager-3.3.csproj	(revision 15412)
@@ -164,4 +164,9 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Common\3.3\HeuristicLab.Clients.Common-3.3.csproj">
+      <Project>{730a9104-d4d1-4360-966b-e49b7571dda3}</Project>
+      <Name>HeuristicLab.Clients.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Clients.Hive.Views\3.3\HeuristicLab.Clients.Hive.Views-3.3.csproj">
       <Project>{E1D6C801-892A-406A-B606-F158E36DD3C3}</Project>
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.Designer.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.Designer.cs	(revision 15412)
@@ -46,78 +46,57 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      this.resourcesGroupBox = new System.Windows.Forms.GroupBox();
-      this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.resourcesTreeView = new System.Windows.Forms.TreeView();
-      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.projectsGroupBox = new System.Windows.Forms.GroupBox();
+      this.projectsImageList = new System.Windows.Forms.ImageList(this.components);
+      this.resourcesImageList = new System.Windows.Forms.ImageList(this.components);
       this.searchLabel = new System.Windows.Forms.Label();
       this.searchTextBox = new System.Windows.Forms.TextBox();
-      this.descriptionTextBox = new System.Windows.Forms.TextBox();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.resourcesGroupBox.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
-      this.splitContainer.Panel1.SuspendLayout();
-      this.splitContainer.Panel2.SuspendLayout();
-      this.splitContainer.SuspendLayout();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.projectsTreeView = new System.Windows.Forms.TreeView();
+      this.resourcesTreeView = new System.Windows.Forms.TreeView();
+      this.summaryGroupBox = new System.Windows.Forms.GroupBox();
+      this.coresLabel = new System.Windows.Forms.Label();
+      this.coresSummaryLabel = new System.Windows.Forms.Label();
+      this.memoryLabel = new System.Windows.Forms.Label();
+      this.memorySummaryLabel = new System.Windows.Forms.Label();
+      this.projectsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.summaryGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
-      // resourcesGroupBox
-      // 
-      this.resourcesGroupBox.Controls.Add(this.splitContainer);
-      this.resourcesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.resourcesGroupBox.Location = new System.Drawing.Point(0, 0);
-      this.resourcesGroupBox.Name = "resourcesGroupBox";
-      this.resourcesGroupBox.Size = new System.Drawing.Size(308, 365);
-      this.resourcesGroupBox.TabIndex = 0;
-      this.resourcesGroupBox.TabStop = false;
-      this.resourcesGroupBox.Text = "Available Projects";
-      // 
-      // splitContainer
-      // 
-      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.splitContainer.Location = new System.Drawing.Point(3, 16);
-      this.splitContainer.Name = "splitContainer";
-      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.resourcesTreeView);
-      this.splitContainer.Panel1.Controls.Add(this.searchLabel);
-      this.splitContainer.Panel1.Controls.Add(this.searchTextBox);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.descriptionTextBox);
-      this.splitContainer.Size = new System.Drawing.Size(302, 346);
-      this.splitContainer.SplitterDistance = 219;
-      this.splitContainer.TabIndex = 0;
-      // 
-      // resourcesTreeView
-      // 
-      this.resourcesTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+      // projectsGroupBox
+      // 
+      this.projectsGroupBox.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.resourcesTreeView.CheckBoxes = true;
-      this.resourcesTreeView.HideSelection = false;
-      this.resourcesTreeView.ImageIndex = 0;
-      this.resourcesTreeView.ImageList = this.imageList;
-      this.resourcesTreeView.Location = new System.Drawing.Point(3, 29);
-      this.resourcesTreeView.Name = "resourcesTreeView";
-      this.resourcesTreeView.SelectedImageIndex = 0;
-      this.resourcesTreeView.ShowNodeToolTips = true;
-      this.resourcesTreeView.Size = new System.Drawing.Size(296, 196);
-      this.resourcesTreeView.TabIndex = 2;
-      this.resourcesTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.resourcesTreeView_AfterCheck);
-      this.resourcesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.resourcesTreeView_AfterSelect);
-      // 
-      // imageList
-      // 
-      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      this.projectsGroupBox.Controls.Add(this.searchLabel);
+      this.projectsGroupBox.Controls.Add(this.splitContainer2);
+      this.projectsGroupBox.Controls.Add(this.searchTextBox);
+      this.projectsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.projectsGroupBox.Name = "projectsGroupBox";
+      this.projectsGroupBox.Size = new System.Drawing.Size(426, 461);
+      this.projectsGroupBox.TabIndex = 0;
+      this.projectsGroupBox.TabStop = false;
+      this.projectsGroupBox.Text = "Available Projects";
+      // 
+      // projectsImageList
+      // 
+      this.projectsImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.projectsImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.projectsImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // resourcesImageList
+      // 
+      this.resourcesImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.resourcesImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.resourcesImageList.TransparentColor = System.Drawing.Color.Transparent;
       // 
       // searchLabel
       // 
       this.searchLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Zoom;
-      this.searchLabel.Location = new System.Drawing.Point(3, 3);
+      this.searchLabel.Location = new System.Drawing.Point(6, 19);
       this.searchLabel.Name = "searchLabel";
       this.searchLabel.Size = new System.Drawing.Size(20, 20);
@@ -129,39 +108,126 @@
       this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      this.searchTextBox.Location = new System.Drawing.Point(29, 3);
+      this.searchTextBox.Location = new System.Drawing.Point(32, 19);
       this.searchTextBox.Name = "searchTextBox";
-      this.searchTextBox.Size = new System.Drawing.Size(270, 20);
+      this.searchTextBox.Size = new System.Drawing.Size(388, 20);
       this.searchTextBox.TabIndex = 1;
       this.toolTip.SetToolTip(this.searchTextBox, "Enter string to search for resources");
       this.searchTextBox.TextChanged += new System.EventHandler(this.searchTextBox_TextChanged);
       // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+      // splitContainer2
+      // 
+      this.splitContainer2.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.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F);
-      this.descriptionTextBox.Location = new System.Drawing.Point(3, 3);
-      this.descriptionTextBox.Multiline = true;
-      this.descriptionTextBox.Name = "descriptionTextBox";
-      this.descriptionTextBox.ReadOnly = true;
-      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
-      this.descriptionTextBox.Size = new System.Drawing.Size(296, 108);
-      this.descriptionTextBox.TabIndex = 0;
-      this.descriptionTextBox.WordWrap = false;
-      // 
-      // HiveResourceSelector
+      this.splitContainer2.Location = new System.Drawing.Point(6, 45);
+      this.splitContainer2.Name = "splitContainer2";
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.projectsTreeView);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.resourcesTreeView);
+      this.splitContainer2.Size = new System.Drawing.Size(414, 410);
+      this.splitContainer2.SplitterDistance = 204;
+      this.splitContainer2.TabIndex = 4;
+      // 
+      // projectsTreeView
+      // 
+      this.projectsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.projectsTreeView.HideSelection = false;
+      this.projectsTreeView.ImageIndex = 0;
+      this.projectsTreeView.ImageList = this.projectsImageList;
+      this.projectsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.projectsTreeView.Name = "projectsTreeView";
+      this.projectsTreeView.SelectedImageIndex = 0;
+      this.projectsTreeView.ShowNodeToolTips = true;
+      this.projectsTreeView.Size = new System.Drawing.Size(204, 410);
+      this.projectsTreeView.TabIndex = 3;
+      this.projectsTreeView.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.projectsTreeView_MouseDoubleClick);
+      this.projectsTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.projectsTreeView_MouseDown);
+      // 
+      // resourcesTreeView
+      // 
+      this.resourcesTreeView.CheckBoxes = true;
+      this.resourcesTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.resourcesTreeView.ImageIndex = 0;
+      this.resourcesTreeView.ImageList = this.resourcesImageList;
+      this.resourcesTreeView.Location = new System.Drawing.Point(0, 0);
+      this.resourcesTreeView.Name = "resourcesTreeView";
+      this.resourcesTreeView.SelectedImageIndex = 0;
+      this.resourcesTreeView.Size = new System.Drawing.Size(206, 410);
+      this.resourcesTreeView.TabIndex = 0;
+      this.resourcesTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.resourcesTreeView_AfterCheck);
+      this.resourcesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.resourcesTreeView_MouseDown);
+      // 
+      // summaryGroupBox
+      // 
+      this.summaryGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.summaryGroupBox.Controls.Add(this.memorySummaryLabel);
+      this.summaryGroupBox.Controls.Add(this.memoryLabel);
+      this.summaryGroupBox.Controls.Add(this.coresSummaryLabel);
+      this.summaryGroupBox.Controls.Add(this.coresLabel);
+      this.summaryGroupBox.Location = new System.Drawing.Point(3, 470);
+      this.summaryGroupBox.Name = "summaryGroupBox";
+      this.summaryGroupBox.Size = new System.Drawing.Size(426, 71);
+      this.summaryGroupBox.TabIndex = 1;
+      this.summaryGroupBox.TabStop = false;
+      this.summaryGroupBox.Text = "Computing Resources";
+      // 
+      // coresLabel
+      // 
+      this.coresLabel.AutoSize = true;
+      this.coresLabel.Location = new System.Drawing.Point(6, 22);
+      this.coresLabel.Name = "coresLabel";
+      this.coresLabel.Size = new System.Drawing.Size(37, 13);
+      this.coresLabel.TabIndex = 1;
+      this.coresLabel.Text = "Cores:";
+      // 
+      // coresSummaryLabel
+      // 
+      this.coresSummaryLabel.AutoSize = true;
+      this.coresSummaryLabel.Location = new System.Drawing.Point(59, 22);
+      this.coresSummaryLabel.Name = "coresSummaryLabel";
+      this.coresSummaryLabel.Size = new System.Drawing.Size(124, 13);
+      this.coresSummaryLabel.TabIndex = 5;
+      this.coresSummaryLabel.Text = "0 Total (0 Free / 0 Used)";
+      // 
+      // memoryLabel
+      // 
+      this.memoryLabel.AutoSize = true;
+      this.memoryLabel.Location = new System.Drawing.Point(6, 48);
+      this.memoryLabel.Name = "memoryLabel";
+      this.memoryLabel.Size = new System.Drawing.Size(47, 13);
+      this.memoryLabel.TabIndex = 7;
+      this.memoryLabel.Text = "Memory:";
+      // 
+      // memorySummaryLabel
+      // 
+      this.memorySummaryLabel.AutoSize = true;
+      this.memorySummaryLabel.Location = new System.Drawing.Point(59, 48);
+      this.memorySummaryLabel.Name = "memorySummaryLabel";
+      this.memorySummaryLabel.Size = new System.Drawing.Size(223, 13);
+      this.memorySummaryLabel.TabIndex = 8;
+      this.memorySummaryLabel.Text = "0.00 GB Total (0.00 GB Free / 0.00 GB Used)";
+      // 
+      // HiveProjectSelector
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.resourcesGroupBox);
-      this.Name = "HiveResourceSelector";
-      this.Size = new System.Drawing.Size(308, 365);
-      this.resourcesGroupBox.ResumeLayout(false);
-      this.splitContainer.Panel1.ResumeLayout(false);
-      this.splitContainer.Panel1.PerformLayout();
-      this.splitContainer.Panel2.ResumeLayout(false);
-      this.splitContainer.Panel2.PerformLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
-      this.splitContainer.ResumeLayout(false);
+      this.Controls.Add(this.summaryGroupBox);
+      this.Controls.Add(this.projectsGroupBox);
+      this.Name = "HiveProjectSelector";
+      this.Size = new System.Drawing.Size(432, 544);
+      this.Load += new System.EventHandler(this.HiveProjectSelector_Load);
+      this.projectsGroupBox.ResumeLayout(false);
+      this.projectsGroupBox.PerformLayout();
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.summaryGroupBox.ResumeLayout(false);
+      this.summaryGroupBox.PerformLayout();
       this.ResumeLayout(false);
 
@@ -170,13 +236,18 @@
     #endregion
 
-    protected System.Windows.Forms.GroupBox resourcesGroupBox;
-    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.GroupBox projectsGroupBox;
     protected System.Windows.Forms.Label searchLabel;
     protected System.Windows.Forms.TextBox searchTextBox;
+    protected System.Windows.Forms.ImageList projectsImageList;
+    protected System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList resourcesImageList;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    protected System.Windows.Forms.TreeView projectsTreeView;
     protected System.Windows.Forms.TreeView resourcesTreeView;
-    protected System.Windows.Forms.TextBox descriptionTextBox;
-    protected System.Windows.Forms.ImageList imageList;
-    protected System.Windows.Forms.ToolTip toolTip;
-
+    private System.Windows.Forms.GroupBox summaryGroupBox;
+    private System.Windows.Forms.Label coresLabel;
+    private System.Windows.Forms.Label memorySummaryLabel;
+    private System.Windows.Forms.Label memoryLabel;
+    private System.Windows.Forms.Label coresSummaryLabel;
   }
 }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs	(revision 15412)
@@ -25,4 +25,6 @@
 using System.Linq;
 using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
@@ -36,18 +38,27 @@
     private const int greenFlagImageIndex = 0;
     private const int redFlagImageIndex = 1;
+    private const int slaveImageIndex = 0;
+    private const int slaveGroupImageIndex = 1;
+
+    private readonly ISet<TreeNode> mainTreeNodes = new HashSet<TreeNode>();
+    private readonly ISet<TreeNode> filteredTreeNodes = new HashSet<TreeNode>();
+    private readonly ISet<TreeNode> nodeStore = new HashSet<TreeNode>();
+    private readonly ISet<Resource> resources = new HashSet<Resource>();
+
     private string currentSearchString;
-    private ISet<TreeNode> mainTreeNodes;
-    private ISet<TreeNode> filteredTreeNodes;
-    private ISet<TreeNode> nodeStore;
-
-    private ISet<Project> selectedResources;
-    public ISet<Project> SelectedResources {
-      get { return selectedResources; }
-      set { selectedResources = value; }
-    }
-
+
+    private Project selectedProject;
     public Project SelectedProject {
-      get { return (Project)resourcesTreeView.SelectedNode.Tag; }
-    }
+      get { return selectedProject; }
+      set {
+        if (selectedProject == value) return;
+        selectedProject = value;
+        UpdateResources();
+        OnSelectedProjectChanged();
+      }
+    }
+
+    private readonly IObservableSet<Resource> selectedResources = new ObservableSet<Resource>();
+    public IEnumerable<Resource> SelectedResources { get { return selectedResources; } }
 
     public new IItemList<Project> Content {
@@ -58,34 +69,16 @@
     public HiveProjectSelector() {
       InitializeComponent();
-      mainTreeNodes = new HashSet<TreeNode>();
-      filteredTreeNodes = new HashSet<TreeNode>();
-      nodeStore = new HashSet<TreeNode>();
-      selectedResources = new HashSet<Project>();
-      imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.FlagGreen);
-      imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.FlagRed);
-    }
-
-    public void StartProgressView() {
-      if (InvokeRequired) {
-        Invoke(new Action(StartProgressView));
-      } else {
-        var message = "Downloading projects. Please be patient.";
-        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().AddOperationProgressToView(this, message);
-      }
-    }
-
-    public void FinishProgressView() {
-      if (InvokeRequired) {
-        Invoke(new Action(FinishProgressView));
-      } else {
-        MainFormManager.GetMainForm<HeuristicLab.MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(this);
-      }
-    }
-
+
+      projectsImageList.Images.Add(VSImageLibrary.FlagGreen);
+      projectsImageList.Images.Add(VSImageLibrary.FlagRed);
+      resourcesImageList.Images.Add(VSImageLibrary.MonitorLarge);
+      resourcesImageList.Images.Add(VSImageLibrary.NetworkCenterLarge);
+    }
+
+    #region Overrides
     protected override void OnContentChanged() {
       base.OnContentChanged();
 
       if (Content != null) {
-        selectedResources = new HashSet<Project>(Content.Where(x => selectedResources.Any(y => x.Id == y.Id)));
         UpdateMainTree();
         ExtractStatistics();
@@ -94,12 +87,65 @@
         UpdateFilteredTree();
       }
-    }
-
-    #region MainTree Methods
+
+      SelectedProject = null;
+    }
+    #endregion
+
+    #region Event Handlers
+    private void HiveProjectSelector_Load(object sender, EventArgs e) {
+      projectsTreeView.Nodes.Clear();
+      resourcesTreeView.Nodes.Clear();
+      SelectedProject = null;
+    }
+
+    private void searchTextBox_TextChanged(object sender, EventArgs e) {
+      currentSearchString = searchTextBox.Text.ToLower();
+      UpdateFilteredTree();
+    }
+
+    private void projectsTreeView_MouseDoubleClick(object sender, MouseEventArgs e) {
+      OnProjectsTreeViewDoubleClicked();
+    }
+
+    private void projectsTreeView_MouseDown(object sender, MouseEventArgs e) {
+      var node = projectsTreeView.GetNodeAt(new Point(e.X, e.Y));
+
+      SelectedProject = (Project)node?.Tag;
+
+      if (node == null) {
+        projectsTreeView.SelectedNode = null;
+      }
+
+      ExtractStatistics();
+    }
+
+    private void resourcesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      var node = resourcesTreeView.GetNodeAt(new Point(e.X, e.Y));
+
+      if (node == null) {
+        resourcesTreeView.SelectedNode = null;
+      }
+
+      ExtractStatistics((Resource)node?.Tag);
+    }
+
+    private void resourcesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
+      var resource = (Resource)e.Node.Tag;
+
+      if (e.Node.Checked)
+        selectedResources.Add(resource);
+      else
+        selectedResources.Remove(resource);
+
+      ExtractStatistics((Resource)resourcesTreeView.SelectedNode?.Tag);
+      OnSelectedResourcesChanged();
+    }
+    #endregion
+
+    #region Helpers
     private void UpdateMainTree() {
       mainTreeNodes.Clear();
 
       foreach (Project g in Content.OrderBy(x => x.Name)) {
-        //root node
         if (g.ParentProjectId == null) {
           TreeNode tn = new TreeNode();
@@ -131,7 +177,5 @@
       }
     }
-    #endregion
-
-    #region FilteredTree Methods
+
     private void UpdateFilteredTree() {
       filteredTreeNodes.Clear();
@@ -144,18 +188,9 @@
         }
       }
-      UpdateResourceTree();
-    }
-
-    private void TraverseParentNodes(TreeNode node) {
-      if (node != null) {
-        for (TreeNode parent = node.Parent; parent != null; parent = parent.Parent)
-          filteredTreeNodes.Add(parent);
-      }
-    }
-    #endregion
-
-    #region ResourceTree Methods
-    private void UpdateResourceTree() {
-      resourcesTreeView.Nodes.Clear();
+      UpdateProjectsTree();
+    }
+
+    private void UpdateProjectsTree() {
+      projectsTreeView.Nodes.Clear();
       nodeStore.Clear();
 
@@ -178,37 +213,86 @@
           }
       }
-      resourcesTreeView.Nodes.AddRange(nodeStore.Where(x => ((Project)x.Tag).ParentProjectId == null).ToArray());
+      projectsTreeView.Nodes.AddRange(nodeStore.Where(x => ((Project)x.Tag).ParentProjectId == null).ToArray());
       if (string.IsNullOrEmpty(currentSearchString)) ExpandSlaveGroupNodes();
-      else resourcesTreeView.ExpandAll();
-    }
-    #endregion
-
-    #region Events
-    private void resourcesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
-      //if (e.Action != TreeViewAction.Unknown) {
-      //  if (e.Node.Checked) {
-      //    IncludeChildNodes(mainTreeNodes.SingleOrDefault(x => ((Project)x.Tag).Id == ((Project)e.Node.Tag).Id));
-      //    IncludeParentNodes(mainTreeNodes.SingleOrDefault(x => ((Project)x.Tag).Id == ((Project)e.Node.Tag).Id));
-      //  } else {
-      //    ExcludeChildNodes(mainTreeNodes.SingleOrDefault(x => ((Project)x.Tag).Id == ((Project)e.Node.Tag).Id));
-      //    ExcludeParentNodes(mainTreeNodes.SingleOrDefault(x => ((Project)x.Tag).Id == ((Project)e.Node.Tag).Id));
-      //  }
-      //  ExtractStatistics();
-      //}
-    }
-
-    private void resourcesTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
-      if (e.Action != TreeViewAction.Unknown) {
-        ExtractStatistics(e.Node);
-      }
-    }
-
-    private void searchTextBox_TextChanged(object sender, System.EventArgs e) {
-      currentSearchString = searchTextBox.Text.ToLower();
-      UpdateFilteredTree();
-    }
-    #endregion
-
-    #region Helpers
+      else projectsTreeView.ExpandAll();
+    }
+
+    private void TraverseParentNodes(TreeNode node) {
+      if (node != null) {
+        for (TreeNode parent = node.Parent; parent != null; parent = parent.Parent)
+          filteredTreeNodes.Add(parent);
+      }
+    }
+
+    private void UpdateResources() {
+      selectedResources.Clear();
+
+      if (selectedProject != null) {
+        var assignedResources = HiveServiceLocator.Instance.CallHiveService(s => s.GetAssignedResourcesForProject(selectedProject.Id));
+        var assignedResourceIds = new HashSet<Guid>(assignedResources.Select(x => x.ResourceId));
+
+        foreach (var resource in HiveAdminClient.Instance.Resources) {
+          if (assignedResourceIds.Contains(resource.Id)) {
+            resources.Add(resource);
+            selectedResources.Add(resource);
+          }
+        }
+      }
+
+      BuildResourceTree(selectedResources);
+      ExtractStatistics();
+      OnSelectedResourcesChanged();
+    }
+
+    private Resource BuildResourceTree(IEnumerable<Resource> resources) {
+      resourcesTreeView.Nodes.Clear();
+      if (!resources.Any()) return null;
+
+      var mainResources = new HashSet<Resource>(resources.Where(x => x.ParentResourceId == null));
+      var subResources = new HashSet<Resource>(resources.Except(mainResources));
+
+      var stack = new Stack<Resource>(mainResources.OrderByDescending(x => x.Name));
+      var top = stack.Peek();
+
+      TreeNode currentNode = null;
+      Resource currentResource = null;
+
+      while (stack.Any()) {
+        var newResource = stack.Pop();
+        var newNode = new TreeNode(newResource.Name) {
+          Checked = true,
+          ImageIndex = newResource is Slave ? slaveImageIndex : slaveGroupImageIndex,
+          Tag = newResource
+        };
+
+        while (currentNode != null && newResource.ParentResourceId != currentResource.Id) {
+          currentNode = currentNode.Parent;
+          currentResource = currentNode == null ? null : (Resource)currentNode.Tag;
+        }
+
+        if (currentNode == null) {
+          resourcesTreeView.Nodes.Add(newNode);
+        } else {
+          currentNode.Nodes.Add(newNode);
+        }
+
+        newNode.SelectedImageIndex = newNode.ImageIndex;
+
+        var childResources = subResources.Where(x => x.ParentResourceId == newResource.Id);
+        if (childResources.Any()) {
+          foreach (var resource in childResources.OrderByDescending(x => x.Name)) {
+            subResources.Remove(resource);
+            stack.Push(resource);
+          }
+          currentNode = newNode;
+          currentResource = newResource;
+        }
+      }
+
+      resourcesTreeView.ExpandAll();
+
+      return top;
+    }
+
     private void ExpandSlaveGroupNodes() {
       foreach (TreeNode n in nodeStore.Where(x => x.Tag is SlaveGroup)) {
@@ -219,62 +303,50 @@
     }
 
-    private void ExtractStatistics(TreeNode treeNode = null) {
-      //StringBuilder sb = new StringBuilder();
-      //Resource resource = treeNode == null ? null : treeNode.Tag as Resource;
-      //ISet<Resource> resources = treeNode == null ? selectedResources : new HashSet<Resource>(treeNode.DescendantNodes().Select(x => x.Tag as Resource)); ;
-      //IEnumerable<SlaveGroup> slaveGroups = resources.OfType<SlaveGroup>();
-      //IEnumerable<Slave> slaves = resources.OfType<Slave>();
-      //int cpuSpeed = 0, cores = 0, freeCores = 0, memory = 0, freeMemory = 0;
-      //string contextString = treeNode == null ? "Selected" : "Included";
-
-      //if (resources.Any() || resource != null) {
-      //  foreach (Slave s in slaves) {
-      //    cpuSpeed += s.CpuSpeed.GetValueOrDefault();
-      //    cores += s.Cores.GetValueOrDefault();
-      //    freeCores += s.FreeCores.GetValueOrDefault();
-      //    memory += s.Memory.GetValueOrDefault();
-      //    freeMemory += s.FreeMemory.GetValueOrDefault();
-      //  }
-      //  if (resource != null) {
-      //    if (resource is SlaveGroup) sb.Append("Slave group: ");
-      //    else if (resource is Slave) {
-      //      sb.Append("Slave: ");
-      //      if (!resources.Any()) {
-      //        Slave s = resource as Slave;
-      //        cpuSpeed = s.CpuSpeed.GetValueOrDefault();
-      //        cores = s.Cores.GetValueOrDefault();
-      //        freeCores = s.FreeCores.GetValueOrDefault();
-      //        memory = s.Memory.GetValueOrDefault();
-      //        freeMemory = s.FreeMemory.GetValueOrDefault();
-      //      }
-      //    }
-      //    sb.AppendLine(string.Format("{0}", resource.Name));
-      //  }
-      //  if (resource == null || resource is SlaveGroup) {
-      //    if (resources.Any()) {
-      //      sb.AppendFormat("{0} slave groups ({1}): ", contextString, slaveGroups.Count());
-      //      foreach (SlaveGroup sg in slaveGroups) sb.AppendFormat("{0}; ", sg.Name);
-      //      sb.AppendLine();
-      //      sb.AppendFormat("{0} slaves ({1}): ", contextString, slaves.Count());
-      //      foreach (Slave s in slaves) sb.AppendFormat("{0}; ", s.Name);
-      //      sb.AppendLine();
-      //    } else {
-      //      sb.Append("The selection does not inlcude any further resources.");
-      //    }
-      //  }
-      //  sb.AppendLine();
-      //  sb.AppendLine(string.Format("CPU speed: {0} MHz", cpuSpeed));
-      //  if (resources.Any()) sb.AppendLine(string.Format("Avg. CPU speed: {0:0.00} MHz", (double)cpuSpeed / resources.Count()));
-      //  sb.AppendLine(string.Format("Cores: {0}", cores));
-      //  sb.AppendLine(string.Format("Free cores: {0}", freeCores));
-      //  if (resources.Any()) sb.AppendLine(string.Format("Avg. free cores: {0:0.00}", (double)freeCores / resources.Count()));
-      //  sb.AppendLine(string.Format("Memory: {0} MB", memory));
-      //  sb.AppendFormat("Free memory: {0} MB", freeMemory);
-      //  if (resources.Any()) sb.Append(string.Format("{0}Avg. free memory: {1:0.00} MB", Environment.NewLine, (double)freeMemory / resources.Count()));
-      //} else {
-      //  sb.Append("No resources selected.");
-      //}
-
-      //descriptionTextBox.Text = sb.ToString();
+    private void ExtractStatistics(Resource resource = null) {
+      ISet<Slave> selectedSlaves = null;
+
+      if (resource != null) {
+        var slaveGroup = resource as SlaveGroup;
+        if (slaveGroup != null) {
+          var children = new HashSet<Resource>(resources.Where(x => x.ParentResourceId == slaveGroup.Id));
+          int nrOfChildren = children.Count;
+          do {
+            var newChildren = resources.Where(x => children.Any(y => y.Id == x.ParentResourceId));
+            foreach (var newChild in newChildren)
+              children.Add(newChild);
+          } while (children.Count > nrOfChildren);
+          selectedSlaves = new HashSet<Slave>(children.OfType<Slave>());
+          selectedSlaves.IntersectWith(selectedResources.OfType<Slave>());
+        } else {
+          selectedSlaves = new HashSet<Slave>(new[] { resource as Slave });
+        }
+      } else {
+        selectedSlaves = new HashSet<Slave>(selectedResources.OfType<Slave>());
+      }
+
+      int sumCores = selectedSlaves.OfType<Slave>().Sum(x => x.Cores.GetValueOrDefault());
+      int sumFreeCores = selectedSlaves.OfType<Slave>().Sum(x => x.FreeCores.GetValueOrDefault());
+      double sumMemory = selectedSlaves.OfType<Slave>().Sum(x => x.Memory.GetValueOrDefault()) / 1024.0;
+      double sumFreeMemory = selectedSlaves.OfType<Slave>().Sum(x => x.FreeMemory.GetValueOrDefault()) / 1024.0;
+
+      coresSummaryLabel.Text = $"{sumCores} Total ({sumFreeCores} Free / {sumCores - sumFreeCores} Used)";
+      memorySummaryLabel.Text = $"{sumMemory:0.00} GB Total ({sumFreeMemory:0.00} GB Free / {(sumMemory - sumFreeMemory):0.00} GB Used)";
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler SelectedProjectChanged;
+    private void OnSelectedProjectChanged() {
+      SelectedProjectChanged?.Invoke(this, EventArgs.Empty);
+    }
+
+    public event EventHandler SelectedResourcesChanged;
+    private void OnSelectedResourcesChanged() {
+      SelectedResourcesChanged?.Invoke(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProjectsTreeViewDoubleClicked;
+    private void OnProjectsTreeViewDoubleClicked() {
+      ProjectsTreeViewDoubleClicked?.Invoke(this, EventArgs.Empty);
     }
     #endregion
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.Designer.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.Designer.cs	(revision 15412)
@@ -94,6 +94,10 @@
       this.hiveResourceSelector.Name = "hiveResourceSelector";
       this.hiveResourceSelector.ReadOnly = false;
+      this.hiveResourceSelector.SelectedProject = null;
       this.hiveResourceSelector.Size = new System.Drawing.Size(549, 591);
       this.hiveResourceSelector.TabIndex = 0;
+      this.hiveResourceSelector.SelectedProjectChanged += new System.EventHandler(this.hiveResourceSelector_SelectedProjectChanged);
+      this.hiveResourceSelector.SelectedResourcesChanged += new System.EventHandler(this.hiveResourceSelector_SelectedResourcesChanged);
+      this.hiveResourceSelector.ProjectsTreeViewDoubleClicked += new System.EventHandler(this.hiveResourceSelector_ProjectsTreeViewDoubleClicked);
       // 
       // HiveResourceSelectorDialog
@@ -114,5 +118,4 @@
       this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
       this.Text = "Select Project";
-      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.HiveResourceSelectorDialog_FormClosing);
       this.Load += new System.EventHandler(this.HiveResourceSelectorDialog_Load);
       this.ResumeLayout(false);
@@ -124,6 +127,6 @@
     protected System.Windows.Forms.Button okButton;
     protected System.Windows.Forms.Button cancelButton;
+    protected System.Windows.Forms.Button refreshButton;
     protected HiveProjectSelector hiveResourceSelector;
-    protected System.Windows.Forms.Button refreshButton;
   }
 }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelectorDialog.cs	(revision 15412)
@@ -20,48 +20,115 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
-using System.Threading.Tasks;
+using System.ComponentModel;
+using System.Linq;
 using System.Windows.Forms;
-using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Clients.Hive.Views;
+using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.Hive.JobManager.Views {
   public partial class HiveResourceSelectorDialog : Form {
+    private readonly object locker = new object();
+    private bool updatingProjects = false;
+
+    public Project SelectedProject {
+      get { return hiveResourceSelector.SelectedProject; }
+    }
+
+    public IEnumerable<Resource> SelectedResources {
+      get { return hiveResourceSelector.SelectedResources; }
+    }
+
     public HiveResourceSelectorDialog() {
       InitializeComponent();
     }
 
-    public ISet<Project> GetSelectedResources() { return hiveResourceSelector.SelectedResources; }
-    public Project SelectedProject { get { return hiveResourceSelector.SelectedProject; } }
-
-    private void HiveResourceSelectorDialog_Load(object sender, System.EventArgs e) {
-      HiveAdminClient.Instance.Refreshed += new System.EventHandler(Instance_Refreshed);
-      DownloadResources();
+    #region Overrides
+    protected override void OnLoad(EventArgs e) {
+      HiveAdminClient.Instance.Refreshing += HiveAdminClient_Instance_Refreshing;
+      HiveAdminClient.Instance.Refreshed += HiveAdminClient_Instance_Refreshed;
+      base.OnLoad(e);
     }
 
-    private void HiveResourceSelectorDialog_FormClosing(object sender, FormClosingEventArgs e) {
-      HiveAdminClient.Instance.Refreshed -= new System.EventHandler(Instance_Refreshed);
+    protected override void OnClosing(CancelEventArgs e) {
+      HiveAdminClient.Instance.Refreshed -= HiveAdminClient_Instance_Refreshed;
+      HiveAdminClient.Instance.Refreshing -= HiveAdminClient_Instance_Refreshing;
+      base.OnClosing(e);
+    }
+    #endregion
+
+    #region Event Handlers
+    private void HiveAdminClient_Instance_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveAdminClient_Instance_Refreshing, sender, e);
+      else {
+        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
+        mainForm.AddOperationProgressToView(this, "Refreshing ...");
+        refreshButton.Enabled = false;
+      }
     }
 
-    void Instance_Refreshed(object sender, System.EventArgs e) {
+    private void HiveAdminClient_Instance_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveAdminClient_Instance_Refreshed, sender, e);
+      else {
+        var mainForm = MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>();
+        mainForm.RemoveOperationProgressFromView(this);
+        refreshButton.Enabled = true;
+      }
+    }
+
+    private async void HiveResourceSelectorDialog_Load(object sender, EventArgs e) {
+      lock (locker) {
+        if (updatingProjects) return;
+        updatingProjects = true;
+      }
+
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => UpdateProjects(),
+        finallyCallback: () => updatingProjects = false);
+    }
+
+    private async void refreshButton_Click(object sender, EventArgs e) {
+      lock (locker) {
+        if (updatingProjects) return;
+        updatingProjects = true;
+      }
+
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: () => UpdateProjects(),
+        finallyCallback: () => updatingProjects = false);
+    }
+
+    private void hiveResourceSelector_SelectedProjectChanged(object sender, EventArgs e) {
+      okButton.Enabled = hiveResourceSelector.SelectedProject != null;
+    }
+
+    private void hiveResourceSelector_SelectedResourcesChanged(object sender, EventArgs e) {
+      okButton.Enabled = hiveResourceSelector.SelectedResources.Any();
+    }
+
+    private void hiveResourceSelector_ProjectsTreeViewDoubleClicked(object sender, EventArgs e) {
+      if (hiveResourceSelector.SelectedProject == null) return;
+
+      DialogResult = DialogResult.OK;
+      Close();
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateProjects() {
+      HiveAdminClient.Instance.Refresh();
       hiveResourceSelector.Content = HiveAdminClient.Instance.Projects;
     }
 
-    private void refreshButton_Click(object sender, System.EventArgs e) {
-      DownloadResources();
+    private void ShowHiveInformationDialog() {
+      if (InvokeRequired) Invoke((Action)ShowHiveInformationDialog);
+      else {
+        using (HiveInformationDialog dialog = new HiveInformationDialog()) {
+          dialog.ShowDialog(this);
+        }
+      }
     }
-
-    private void DownloadResources() {
-      var task = System.Threading.Tasks.Task.Factory.StartNew(DownloadResourcesAsync);
-      task.ContinueWith(t => {
-        hiveResourceSelector.FinishProgressView();
-        ErrorHandling.ShowErrorDialog(this, "An error occurred while downloading the tasks.", t.Exception);
-      }, TaskContinuationOptions.OnlyOnFaulted);
-    }
-
-    private void DownloadResourcesAsync() {
-      hiveResourceSelector.StartProgressView();
-      HiveAdminClient.Instance.Refresh();
-      hiveResourceSelector.FinishProgressView();
-    }
+    #endregion
   }
 }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.Designer.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.Designer.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.Designer.cs	(revision 15412)
@@ -51,5 +51,4 @@
       this.permissionTabPage = new System.Windows.Forms.TabPage();
       this.refreshPermissionsButton = new System.Windows.Forms.Button();
-      this.hiveExperimentPermissionListView = new HeuristicLab.Clients.Hive.JobManager.Views.HiveJobPermissionListView();
       this.runsTabPage = new System.Windows.Forms.TabPage();
       this.runCollectionViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
@@ -63,6 +62,6 @@
       this.executionTimeTextBox = new System.Windows.Forms.TextBox();
       this.pauseButton = new System.Windows.Forms.Button();
-      this.resourceIdsLabel = new System.Windows.Forms.Label();
-      this.resourceNamesTextBox = new System.Windows.Forms.TextBox();
+      this.projectLabel = new System.Windows.Forms.Label();
+      this.projectNameTextBox = new System.Windows.Forms.TextBox();
       this.nameLabel = new System.Windows.Forms.Label();
       this.nameTextBox = new System.Windows.Forms.TextBox();
@@ -79,4 +78,5 @@
       this.jobsLabel = new System.Windows.Forms.Label();
       this.searchButton = new System.Windows.Forms.Button();
+      this.hiveExperimentPermissionListView = new HeuristicLab.Clients.Hive.JobManager.Views.HiveJobPermissionListView();
       this.tabControl.SuspendLayout();
       this.tasksTabPage.SuspendLayout();
@@ -91,6 +91,6 @@
       // 
       this.tabControl.AllowDrop = true;
-      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.tabControl.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.tabControl.Controls.Add(this.tasksTabPage);
@@ -119,6 +119,6 @@
       // 
       this.jobsTreeView.AllowDrop = true;
-      this.jobsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.jobsTreeView.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.jobsTreeView.Caption = "ItemTree View";
@@ -155,19 +155,4 @@
       this.refreshPermissionsButton.Click += new System.EventHandler(this.refreshPermissionsButton_Click);
       // 
-      // hiveExperimentPermissionListView
-      // 
-      this.hiveExperimentPermissionListView.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.hiveExperimentPermissionListView.Caption = "HiveExperimentPermissionList View";
-      this.hiveExperimentPermissionListView.Content = null;
-      this.hiveExperimentPermissionListView.HiveExperimentId = new System.Guid("00000000-0000-0000-0000-000000000000");
-      this.hiveExperimentPermissionListView.Location = new System.Drawing.Point(3, 33);
-      this.hiveExperimentPermissionListView.Name = "hiveExperimentPermissionListView";
-      this.hiveExperimentPermissionListView.ReadOnly = false;
-      this.hiveExperimentPermissionListView.ShowDetails = true;
-      this.hiveExperimentPermissionListView.Size = new System.Drawing.Size(703, 390);
-      this.hiveExperimentPermissionListView.TabIndex = 0;
-      // 
       // runsTabPage
       // 
@@ -183,6 +168,6 @@
       // runCollectionViewHost
       // 
-      this.runCollectionViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.runCollectionViewHost.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.runCollectionViewHost.Caption = "View";
@@ -209,6 +194,6 @@
       // stateLogViewHost
       // 
-      this.stateLogViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.stateLogViewHost.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.stateLogViewHost.Caption = "StateLog View";
@@ -235,6 +220,6 @@
       // logView
       // 
-      this.logView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.logView.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.logView.Caption = "Log View";
@@ -302,22 +287,23 @@
       this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
       // 
-      // resourceIdsLabel
-      // 
-      this.resourceIdsLabel.AutoSize = true;
-      this.resourceIdsLabel.Location = new System.Drawing.Point(3, 56);
-      this.resourceIdsLabel.Name = "resourceIdsLabel";
-      this.resourceIdsLabel.Size = new System.Drawing.Size(61, 13);
-      this.resourceIdsLabel.TabIndex = 12;
-      this.resourceIdsLabel.Text = "Resources:";
-      // 
-      // resourceNamesTextBox
-      // 
-      this.resourceNamesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.resourceNamesTextBox.Location = new System.Drawing.Point(70, 52);
-      this.resourceNamesTextBox.Name = "resourceNamesTextBox";
-      this.resourceNamesTextBox.Size = new System.Drawing.Size(471, 20);
-      this.resourceNamesTextBox.TabIndex = 2;
-      this.resourceNamesTextBox.Validated += new System.EventHandler(this.resourceNamesTextBox_Validated);
+      // projectLabel
+      // 
+      this.projectLabel.AutoSize = true;
+      this.projectLabel.Location = new System.Drawing.Point(3, 56);
+      this.projectLabel.Name = "projectLabel";
+      this.projectLabel.Size = new System.Drawing.Size(43, 13);
+      this.projectLabel.TabIndex = 12;
+      this.projectLabel.Text = "Project:";
+      // 
+      // projectNameTextBox
+      // 
+      this.projectNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.projectNameTextBox.Location = new System.Drawing.Point(82, 52);
+      this.projectNameTextBox.Name = "projectNameTextBox";
+      this.projectNameTextBox.ReadOnly = true;
+      this.projectNameTextBox.Size = new System.Drawing.Size(489, 20);
+      this.projectNameTextBox.TabIndex = 2;
+      this.projectNameTextBox.Validated += new System.EventHandler(this.resourceNamesTextBox_Validated);
       // 
       // nameLabel
@@ -332,9 +318,9 @@
       // nameTextBox
       // 
-      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(70, 27);
+      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(52, 27);
       this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(501, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(519, 20);
       this.nameTextBox.TabIndex = 1;
       this.nameTextBox.Validated += new System.EventHandler(this.nameTextBox_Validated);
@@ -391,5 +377,5 @@
       // finishedTextBox
       // 
-      this.finishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.finishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.finishedTextBox.Location = new System.Drawing.Point(74, 64);
@@ -400,5 +386,5 @@
       // calculatingTextBox
       // 
-      this.calculatingTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.calculatingTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.calculatingTextBox.Location = new System.Drawing.Point(74, 40);
@@ -409,5 +395,5 @@
       // jobsTextBox
       // 
-      this.jobsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.jobsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.jobsTextBox.Location = new System.Drawing.Point(74, 16);
@@ -445,7 +431,6 @@
       // searchButton
       // 
-      this.searchButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
       this.searchButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Zoom;
-      this.searchButton.Location = new System.Drawing.Point(547, 50);
+      this.searchButton.Location = new System.Drawing.Point(52, 50);
       this.searchButton.Name = "searchButton";
       this.searchButton.Size = new System.Drawing.Size(24, 24);
@@ -453,4 +438,19 @@
       this.searchButton.UseVisualStyleBackColor = true;
       this.searchButton.Click += new System.EventHandler(this.searchButton_Click);
+      // 
+      // hiveExperimentPermissionListView
+      // 
+      this.hiveExperimentPermissionListView.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.hiveExperimentPermissionListView.Caption = "HiveExperimentPermissionList View";
+      this.hiveExperimentPermissionListView.Content = null;
+      this.hiveExperimentPermissionListView.HiveExperimentId = new System.Guid("00000000-0000-0000-0000-000000000000");
+      this.hiveExperimentPermissionListView.Location = new System.Drawing.Point(3, 33);
+      this.hiveExperimentPermissionListView.Name = "hiveExperimentPermissionListView";
+      this.hiveExperimentPermissionListView.ReadOnly = false;
+      this.hiveExperimentPermissionListView.ShowDetails = true;
+      this.hiveExperimentPermissionListView.Size = new System.Drawing.Size(703, 390);
+      this.hiveExperimentPermissionListView.TabIndex = 0;
       // 
       // RefreshableHiveJobView
@@ -468,7 +468,7 @@
       this.Controls.Add(this.executionTimeTextBox);
       this.Controls.Add(this.executionTimeLabel);
-      this.Controls.Add(this.resourceNamesTextBox);
+      this.Controls.Add(this.projectNameTextBox);
       this.Controls.Add(this.pauseButton);
-      this.Controls.Add(this.resourceIdsLabel);
+      this.Controls.Add(this.projectLabel);
       this.Controls.Add(this.stopButton);
       this.Name = "RefreshableHiveJobView";
@@ -493,6 +493,6 @@
     private System.Windows.Forms.TextBox executionTimeTextBox;
     private System.Windows.Forms.Button pauseButton;
-    private System.Windows.Forms.Label resourceIdsLabel;
-    private System.Windows.Forms.TextBox resourceNamesTextBox;
+    private System.Windows.Forms.Label projectLabel;
+    private System.Windows.Forms.TextBox projectNameTextBox;
     private System.Windows.Forms.TabPage logTabPage;
     private Core.Views.LogView logView;
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs	(revision 15412)
@@ -23,5 +23,4 @@
 using System.ComponentModel;
 using System.Linq;
-using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
@@ -118,5 +117,5 @@
           nameTextBox.Text = string.Empty;
           executionTimeTextBox.Text = string.Empty;
-          resourceNamesTextBox.Text = string.Empty;
+          projectNameTextBox.Text = string.Empty;
           refreshAutomaticallyCheckBox.Checked = false;
           lock (runCollectionViewLocker) {
@@ -137,6 +136,5 @@
           }
         }
-      }
-      finally {
+      } finally {
         SuppressEvents = false;
       }
@@ -158,5 +156,5 @@
       tabControl.Enabled = !Locked;
       nameTextBox.Enabled = !Locked;
-      resourceNamesTextBox.Enabled = !Locked;
+      projectNameTextBox.Enabled = !Locked;
       searchButton.Enabled = !Locked;
       jobsTreeView.Enabled = !Locked;
@@ -183,5 +181,4 @@
 
           this.nameTextBox.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded || Content.IsProgressing;
-          this.resourceNamesTextBox.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded || Content.IsProgressing;
           this.searchButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Prepared && !alreadyUploaded && !Content.IsProgressing;
           this.jobsTreeView.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded || Content.IsProgressing;
@@ -335,17 +332,10 @@
       if (hiveResourceSelectorDialog == null)
         hiveResourceSelectorDialog = new HiveResourceSelectorDialog();
+
       if (hiveResourceSelectorDialog.ShowDialog(this) == DialogResult.OK) {
-        StringBuilder sb = new StringBuilder();
-        //foreach (Project resource in hiveResourceSelectorDialog.GetSelectedResources()) {
-        //  sb.Append(resource.Name);
-        //  sb.Append(";");
-        //}
-        //resourceNamesTextBox.Text = sb.ToString();
-        //if (Content.Job.ResourceNames != resourceNamesTextBox.Text)
-        //  Content.Job.ResourceNames = resourceNamesTextBox.Text;
         var selectedProject = hiveResourceSelectorDialog.SelectedProject;
-        resourceNamesTextBox.Text = selectedProject.Name;
-        if (Content.Job.ProjectId != selectedProject.Id)
-          Content.Job.ProjectId = selectedProject.Id;
+        projectNameTextBox.Text = selectedProject.Name;
+        Content.Job.ProjectId = selectedProject.Id;
+        Content.Job.ResourceIds = hiveResourceSelectorDialog.SelectedResources.Select(x => x.Id).ToList();
       }
     }
@@ -421,7 +411,6 @@
         try {
           invoker.EndInvoke(ar);
-        }
-        catch (Exception ex) {
-          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
+        } catch (Exception ex) {
+          ThreadPool.QueueUserWorkItem(delegate (object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
         }
       }, null);
@@ -510,5 +499,5 @@
           if (subTask is OptimizerHiveTask) {
             OptimizerHiveTask ohTask = subTask as OptimizerHiveTask;
-            ohTask.ExecuteReadActionOnItemTask(new Action(delegate() {
+            ohTask.ExecuteReadActionOnItemTask(new Action(delegate () {
               runs.AddRange(ohTask.ItemTask.Item.Runs);
             }));
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveClient.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/HiveClient.cs	(revision 15412)
@@ -255,13 +255,4 @@
         refreshableJob.IsProgressing = true;
         refreshableJob.Progress.Start("Connecting to server...");
-        IEnumerable<string> resourceNames = ToResourceNameList("");
-        var resourceIds = new List<Guid>();
-        foreach (var resourceName in resourceNames) {
-          Guid resourceId = HiveServiceLocator.Instance.CallHiveService((s) => s.GetResourceId(resourceName));
-          if (resourceId == Guid.Empty) {
-            throw new ResourceNotFoundException(string.Format("Could not find the resource '{0}'", resourceName));
-          }
-          resourceIds.Add(resourceId);
-        }
 
         foreach (OptimizerHiveTask hiveJob in refreshableJob.HiveTasks.OfType<OptimizerHiveTask>()) {
@@ -293,5 +284,5 @@
         foreach (HiveTask hiveTask in refreshableJob.HiveTasks) {
           var task = TS.Task.Factory.StartNew((hj) => {
-            UploadTaskWithChildren(refreshableJob.Progress, (HiveTask)hj, null, resourceIds, jobCount, totalJobCount, configFilePlugin.Id, refreshableJob.Job.Id, refreshableJob.Log, cancellationToken);
+            UploadTaskWithChildren(refreshableJob.Progress, (HiveTask)hj, null, refreshableJob.Job.ResourceIds, jobCount, totalJobCount, configFilePlugin.Id, refreshableJob.Job.Id, refreshableJob.Log, cancellationToken);
           }, hiveTask);
           task.ContinueWith((x) => refreshableJob.Log.LogException(x.Exception), TaskContinuationOptions.OnlyOnFaulted);
@@ -377,5 +368,5 @@
               hiveTask.Task.Id = HiveServiceLocator.Instance.CallHiveService((s) => s.AddChildTask(parentHiveTask.Task.Id, hiveTask.Task, taskData));
             } else {
-              hiveTask.Task.Id = HiveServiceLocator.Instance.CallHiveService((s) => s.AddTask(hiveTask.Task, taskData));
+              hiveTask.Task.Id = HiveServiceLocator.Instance.CallHiveService((s) => s.AddTask(hiveTask.Task, taskData, groups.ToList()));
             }
           }
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 15412)
@@ -30,4 +30,5 @@
     [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.PluginData))]
     [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.ProjectPermission))]
+    [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.AssignedProjectResource))]
     [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Downtime))]
     [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.UserPriority))]
@@ -1166,4 +1167,52 @@
                     this.ProjectIdField = value;
                     this.RaisePropertyChanged("ProjectId");
+                }
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+    [System.Runtime.Serialization.DataContractAttribute(Name="AssignedProjectResource", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
+    [System.SerializableAttribute()]
+    public partial class AssignedProjectResource : HeuristicLab.Clients.Hive.HiveItem
+    {
+        
+        [System.Runtime.Serialization.OptionalFieldAttribute()]
+        private System.Guid ProjectIdField;
+        
+        [System.Runtime.Serialization.OptionalFieldAttribute()]
+        private System.Guid ResourceIdField;
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public System.Guid ProjectId
+        {
+            get
+            {
+                return this.ProjectIdField;
+            }
+            set
+            {
+                if ((this.ProjectIdField.Equals(value) != true))
+                {
+                    this.ProjectIdField = value;
+                    this.RaisePropertyChanged("ProjectId");
+                }
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public System.Guid ResourceId
+        {
+            get
+            {
+                return this.ResourceIdField;
+            }
+            set
+            {
+                if ((this.ResourceIdField.Equals(value) != true))
+                {
+                    this.ResourceIdField = value;
+                    this.RaisePropertyChanged("ResourceId");
                 }
             }
@@ -2210,5 +2259,5 @@
         
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddTask", ReplyAction="http://tempuri.org/IHiveService/AddTaskResponse")]
-        System.Guid AddTask(HeuristicLab.Clients.Hive.Task task, HeuristicLab.Clients.Hive.TaskData taskData);
+        System.Guid AddTask(HeuristicLab.Clients.Hive.Task task, HeuristicLab.Clients.Hive.TaskData taskData, System.Collections.Generic.List<System.Guid> resourceIds);
         
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddChildTask", ReplyAction="http://tempuri.org/IHiveService/AddChildTaskResponse")]
@@ -2318,4 +2367,13 @@
         System.Collections.Generic.List<HeuristicLab.Clients.Hive.ProjectPermission> GetProjectPermissions(System.Guid projectId);
         
+        [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);
+        
+        [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);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetAssignedResourcesForProject", ReplyAction="http://tempuri.org/IHiveService/GetAssignedResourcesForProjectResponse")]
+        System.Collections.Generic.List<HeuristicLab.Clients.Hive.AssignedProjectResource> GetAssignedResourcesForProject(System.Guid projectId);
+        
         [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddSlave", ReplyAction="http://tempuri.org/IHiveService/AddSlaveResponse")]
         System.Guid AddSlave(HeuristicLab.Clients.Hive.Slave slave);
@@ -2416,7 +2474,7 @@
         }
         
-        public System.Guid AddTask(HeuristicLab.Clients.Hive.Task task, HeuristicLab.Clients.Hive.TaskData taskData)
-        {
-            return base.Channel.AddTask(task, taskData);
+        public System.Guid AddTask(HeuristicLab.Clients.Hive.Task task, HeuristicLab.Clients.Hive.TaskData taskData, System.Collections.Generic.List<System.Guid> resourceIds)
+        {
+            return base.Channel.AddTask(task, taskData, resourceIds);
         }
         
@@ -2596,4 +2654,19 @@
         }
         
+        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 System.Collections.Generic.List<HeuristicLab.Clients.Hive.AssignedProjectResource> GetAssignedResourcesForProject(System.Guid projectId)
+        {
+            return base.Channel.GetAssignedResourcesForProject(projectId);
+        }
+        
         public System.Guid AddSlave(HeuristicLab.Clients.Hive.Slave slave)
         {
Index: /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/Job.cs
===================================================================
--- /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/Job.cs	(revision 15411)
+++ /branches/HiveProjectManagement/HeuristicLab.Clients.Hive/3.3/ServiceClients/Job.cs	(revision 15412)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.ComponentModel;
 using HeuristicLab.Common;
@@ -26,4 +27,5 @@
 namespace HeuristicLab.Clients.Hive {
   public partial class Job : IDeepCloneable, IContent {
+    public List<Guid> ResourceIds { get; set; }
 
     #region Constructors and Cloning
@@ -43,4 +45,5 @@
       this.Id = original.Id;
       this.Permission = original.Permission;
+      this.ResourceIds = original.ResourceIds;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
