Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/HeuristicLab.Clients.Hive.Administrator-3.3.csproj	(revision 7951)
@@ -80,4 +80,13 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Clients.Access-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\HeuristicLab.Clients.Access-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Access.Administration-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\HeuristicLab.Clients.Access.Administration-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Access.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\HeuristicLab.Clients.Access.Views-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.DayView-1.0, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <HintPath>..\..\bin\HeuristicLab.DayView-1.0.dll</HintPath>
@@ -97,4 +106,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="HiveRoles.cs" />
     <Compile Include="Views\HiveAdministratorView.cs">
       <SubType>UserControl</SubType>
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/HiveRoles.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/HiveRoles.cs	(revision 7951)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/HiveRoles.cs	(revision 7951)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Clients.Access;
+
+namespace HeuristicLab.Clients.Hive.Administrator {
+  public static class HiveRoles {
+    public const string Administrator = "Hive Administrator";
+    public const string User = "Hive User";
+    public const string Slave = "Hive Slave";
+    public const string IsAllowedPrivileged = "Hive IsAllowedPrivileged";
+
+    public static bool CheckAdminUserPermissions() {
+      UserInformation.Instance.Refresh();
+      return UserInformation.Instance.UserExists && UserInformation.Instance.Roles.Any(x => x.Name == HiveRoles.Administrator);
+    }
+  }
+}
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.Designer.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.Designer.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.Designer.cs	(revision 7951)
@@ -54,4 +54,5 @@
       this.btnRemoveGroup = new System.Windows.Forms.Button();
       this.btnAddGroup = new System.Windows.Forms.Button();
+      this.btnPermissionsSave = new System.Windows.Forms.Button();
       this.treeSlaveGroup = new System.Windows.Forms.TreeView();
       this.tabSlaveGroup = new System.Windows.Forms.TabControl();
@@ -61,4 +62,6 @@
       this.scheduleView = new HeuristicLab.Clients.Hive.Administrator.Views.ScheduleView();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.tabPermissions = new System.Windows.Forms.TabPage();
+      this.permissionView = new HeuristicLab.Clients.Access.Views.RefreshableLightweightUserView();
       ((System.ComponentModel.ISupportInitialize)(this.splitSlaves)).BeginInit();
       this.splitSlaves.Panel1.SuspendLayout();
@@ -68,4 +71,5 @@
       this.tabDetails.SuspendLayout();
       this.tabSchedule.SuspendLayout();
+      this.tabPermissions.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -75,28 +79,4 @@
       this.imageListSlaveGroups.ImageSize = new System.Drawing.Size(16, 16);
       this.imageListSlaveGroups.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // splitSlaves
-      // 
-      this.splitSlaves.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.splitSlaves.Location = new System.Drawing.Point(3, 3);
-      this.splitSlaves.Name = "splitSlaves";
-      // 
-      // splitSlaves.Panel1
-      // 
-      this.splitSlaves.Panel1.Controls.Add(this.btnRefresh);
-      this.splitSlaves.Panel1.Controls.Add(this.progressBar);
-      this.splitSlaves.Panel1.Controls.Add(this.btnSave);
-      this.splitSlaves.Panel1.Controls.Add(this.btnRemoveGroup);
-      this.splitSlaves.Panel1.Controls.Add(this.btnAddGroup);
-      this.splitSlaves.Panel1.Controls.Add(this.treeSlaveGroup);
-      // 
-      // splitSlaves.Panel2
-      // 
-      this.splitSlaves.Panel2.Controls.Add(this.tabSlaveGroup);
-      this.splitSlaves.Size = new System.Drawing.Size(847, 547);
-      this.splitSlaves.SplitterDistance = 249;
-      this.splitSlaves.TabIndex = 3;
       // 
       // btnRefresh
@@ -111,12 +91,4 @@
       this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
       // 
-      // progressBar
-      // 
-      this.progressBar.Location = new System.Drawing.Point(123, 4);
-      this.progressBar.Name = "progressBar";
-      this.progressBar.Size = new System.Drawing.Size(123, 23);
-      this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
-      this.progressBar.TabIndex = 7;
-      // 
       // btnSave
       // 
@@ -152,10 +124,54 @@
       this.btnAddGroup.Click += new System.EventHandler(this.btnAddGroup_Click);
       // 
+      // btnPermissionsSave
+      // 
+      this.btnPermissionsSave.Enabled = false;
+      this.btnPermissionsSave.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.btnPermissionsSave.Location = new System.Drawing.Point(36, 6);
+      this.btnPermissionsSave.Name = "btnPermissionsSave";
+      this.btnPermissionsSave.Size = new System.Drawing.Size(24, 24);
+      this.btnPermissionsSave.TabIndex = 1;
+      this.toolTip.SetToolTip(this.btnPermissionsSave, "Store slave and group sharing permissions on the server");
+      this.btnPermissionsSave.UseVisualStyleBackColor = true;
+      this.btnPermissionsSave.Click += new System.EventHandler(this.btnPermissionsSave_Click);
+      // 
+      // splitSlaves
+      // 
+      this.splitSlaves.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.splitSlaves.Location = new System.Drawing.Point(3, 3);
+      this.splitSlaves.Name = "splitSlaves";
+      // 
+      // splitSlaves.Panel1
+      // 
+      this.splitSlaves.Panel1.Controls.Add(this.btnRefresh);
+      this.splitSlaves.Panel1.Controls.Add(this.progressBar);
+      this.splitSlaves.Panel1.Controls.Add(this.btnSave);
+      this.splitSlaves.Panel1.Controls.Add(this.btnRemoveGroup);
+      this.splitSlaves.Panel1.Controls.Add(this.btnAddGroup);
+      this.splitSlaves.Panel1.Controls.Add(this.treeSlaveGroup);
+      // 
+      // splitSlaves.Panel2
+      // 
+      this.splitSlaves.Panel2.Controls.Add(this.tabSlaveGroup);
+      this.splitSlaves.Size = new System.Drawing.Size(847, 547);
+      this.splitSlaves.SplitterDistance = 249;
+      this.splitSlaves.TabIndex = 3;
+      // 
+      // progressBar
+      // 
+      this.progressBar.Location = new System.Drawing.Point(123, 4);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(123, 23);
+      this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+      this.progressBar.TabIndex = 7;
+      // 
       // treeSlaveGroup
       // 
       this.treeSlaveGroup.AllowDrop = true;
       this.treeSlaveGroup.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)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.treeSlaveGroup.ImageIndex = 0;
       this.treeSlaveGroup.ImageList = this.imageListSlaveGroups;
@@ -166,5 +182,5 @@
       this.treeSlaveGroup.TabIndex = 0;
       this.treeSlaveGroup.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeSlaveGroup_ItemDrag);
-      this.treeSlaveGroup.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeSlaveGroup_NodeMouseClick);
+      this.treeSlaveGroup.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeSlaveGroup_AfterSelect);
       this.treeSlaveGroup.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeSlaveGroup_DragDrop);
       this.treeSlaveGroup.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeSlaveGroup_DragEnter);
@@ -175,8 +191,9 @@
       // 
       this.tabSlaveGroup.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)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.tabSlaveGroup.Controls.Add(this.tabDetails);
       this.tabSlaveGroup.Controls.Add(this.tabSchedule);
+      this.tabSlaveGroup.Controls.Add(this.tabPermissions);
       this.tabSlaveGroup.Location = new System.Drawing.Point(3, 3);
       this.tabSlaveGroup.Name = "tabSlaveGroup";
@@ -200,12 +217,12 @@
       // 
       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)));
+            | 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(7, 7);
+      this.slaveView.Location = new System.Drawing.Point(6, 6);
       this.slaveView.Name = "slaveView";
       this.slaveView.ReadOnly = false;
-      this.slaveView.Size = new System.Drawing.Size(564, 502);
+      this.slaveView.Size = new System.Drawing.Size(565, 503);
       this.slaveView.TabIndex = 0;
       // 
@@ -224,13 +241,36 @@
       // 
       this.scheduleView.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)));
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.scheduleView.Caption = "ScheduleView";
       this.scheduleView.Content = null;
-      this.scheduleView.Location = new System.Drawing.Point(3, 8);
+      this.scheduleView.Location = new System.Drawing.Point(6, 6);
       this.scheduleView.Name = "scheduleView";
       this.scheduleView.ReadOnly = false;
-      this.scheduleView.Size = new System.Drawing.Size(568, 501);
+      this.scheduleView.Size = new System.Drawing.Size(565, 503);
       this.scheduleView.TabIndex = 0;
+      // 
+      // tabPermissions
+      // 
+      this.tabPermissions.Controls.Add(this.btnPermissionsSave);
+      this.tabPermissions.Controls.Add(this.permissionView);
+      this.tabPermissions.Location = new System.Drawing.Point(4, 22);
+      this.tabPermissions.Name = "tabPermissions";
+      this.tabPermissions.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPermissions.Size = new System.Drawing.Size(577, 515);
+      this.tabPermissions.TabIndex = 2;
+      this.tabPermissions.Text = "Permissions";
+      this.tabPermissions.UseVisualStyleBackColor = true;
+      // 
+      // permissionView
+      // 
+      this.permissionView.Caption = "RefreshableLightweightUser View";
+      this.permissionView.Content = null;
+      this.permissionView.FetchSelectedUsers = null;
+      this.permissionView.Location = new System.Drawing.Point(6, 6);
+      this.permissionView.Name = "permissionView";
+      this.permissionView.ReadOnly = false;
+      this.permissionView.Size = new System.Drawing.Size(565, 503);
+      this.permissionView.TabIndex = 0;
       // 
       // ResourcesView
@@ -249,4 +289,5 @@
       this.tabDetails.ResumeLayout(false);
       this.tabSchedule.ResumeLayout(false);
+      this.tabPermissions.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -269,4 +310,7 @@
     private System.Windows.Forms.Button btnRefresh;
     private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.TabPage tabPermissions;
+    private Access.Views.RefreshableLightweightUserView permissionView;
+    private System.Windows.Forms.Button btnPermissionsSave;
   }
 }
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs	(revision 7951)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
@@ -27,4 +28,5 @@
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using HeuristicLab.Clients.Access;
 using HeuristicLab.Clients.Hive.Views;
 using HeuristicLab.Core;
@@ -45,6 +47,8 @@
     private const int slaveImageIndex = 0;
     private const int slaveGroupImageIndex = 1;
+    private readonly Color ownedResourceColor = Color.LightGreen;
     private TS.Task progressTask;
     private bool stopProgressTask;
+    private bool currentlyAuthorized;
 
 
@@ -56,4 +60,7 @@
       HiveAdminClient.Instance.Refreshing += new EventHandler(Instance_Refreshing);
       HiveAdminClient.Instance.Refreshed += new EventHandler(Instance_Refreshed);
+
+      Access.AccessClient.Instance.Refreshing += new EventHandler(Content_Refreshing);
+      Access.AccessClient.Instance.Refreshed += new EventHandler(Content_Refreshed);
     }
 
@@ -61,4 +68,7 @@
       HiveAdminClient.Instance.Refreshing -= new EventHandler(Instance_Refreshing);
       HiveAdminClient.Instance.Refreshed -= new EventHandler(Instance_Refreshed);
+
+      Access.AccessClient.Instance.Refreshing -= new EventHandler(Content_Refreshing);
+      Access.AccessClient.Instance.Refreshed -= new EventHandler(Content_Refreshed);
     }
 
@@ -87,8 +97,22 @@
       progressTask = new TS.Task(UpdateProgress);
       progressTask.Start();
+      SetEnabledStateOfControls(false);
     }
 
     void Instance_Refreshed(object sender, EventArgs e) {
       stopProgressTask = true;
+      SetEnabledStateOfControls(true);
+    }
+
+    void Content_Refreshing(object sender, EventArgs e) {
+      stopProgressTask = false;
+      progressTask = new TS.Task(UpdateProgress);
+      progressTask.Start();
+      SetEnabledStateOfControls(false);
+    }
+
+    void Content_Refreshed(object sender, EventArgs e) {
+      stopProgressTask = true;
+      SetEnabledStateOfControls(true);
     }
 
@@ -110,6 +134,10 @@
       if (Content == null) {
         slaveView.Content = null;
+        scheduleView.Content = null;
+        permissionView.Content = null;
+        permissionView.FetchSelectedUsers = null;
         treeSlaveGroup.Nodes.Clear();
       } else {
+        permissionView.Content = Access.AccessClient.Instance;
         treeSlaveGroup.Nodes.Clear();
 
@@ -134,4 +162,5 @@
               tn.Tag = g;
               tn.Text = g.Name;
+              if (g.OwnerUserId == Access.UserInformation.Instance.User.Id) tn.BackColor = ownedResourceColor;
 
               BuildSlaveGroupTree(g, tn);
@@ -144,4 +173,5 @@
               stn.SelectedImageIndex = stn.ImageIndex;
               stn.Tag = g;
+              if (g.OwnerUserId == Access.UserInformation.Instance.User.Id) stn.BackColor = ownedResourceColor;
               ungrp.Nodes.Add(stn);
             }
@@ -162,4 +192,5 @@
         stn.SelectedImageIndex = stn.ImageIndex;
         stn.Tag = r;
+        if (r.OwnerUserId == Access.UserInformation.Instance.User.Id) stn.BackColor = ownedResourceColor;
         tn.Nodes.Add(stn);
 
@@ -174,4 +205,6 @@
         btnRemoveGroup.Enabled = false;
         btnSave.Enabled = false;
+        btnPermissionsSave.Enabled = false;
+        permissionView.Enabled = false;
       } else {
         btnAddGroup.Enabled = true;
@@ -181,18 +214,60 @@
     }
 
-    private void treeSlaveGroup_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
-      if (slaveView.Content != null && slaveView.Content is SlaveGroup) {
-        slaveView.Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
-      }
-
-      slaveView.Content = (Resource)e.Node.Tag;
-      HiveAdminClient.Instance.DowntimeForResourceId = ((Resource)e.Node.Tag).Id;
-
-      if (e.Node.Tag is SlaveGroup) {
-        slaveView.Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
-      }
-
-      if (tabSlaveGroup.SelectedIndex == 1) {
-        UpdateScheduleAsync();
+    public virtual void SetEnabledStateOfControls(bool state) {
+      if (InvokeRequired) {
+        Invoke(new Action(() => SetEnabledStateOfControls(state)));
+      } else {
+        if (Content == null) state = false;
+        btnAddGroup.Enabled = state;
+        btnRemoveGroup.Enabled = state;
+        btnSave.Enabled = state;
+        scheduleView.SetEnabledStateOfControls(state && IsAuthorized(slaveView.Content));
+        btnPermissionsSave.Enabled = state && permissionView.FetchSelectedUsers != null && Content != null;
+        permissionView.Enabled = state && permissionView.FetchSelectedUsers != null && Content != null;
+      }
+    }
+
+    private bool IsAuthorized(Resource resource) {
+      return resource != null
+          && resource.Name != UngroupedGroupName
+          && resource.Id != Guid.Empty
+          && HiveServiceLocator.Instance.CallHiveService<bool>(service => { return service.AuthorizesForResourceAdministration(resource.Id); });
+    }
+
+    private void treeSlaveGroup_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (e.Action != TreeViewAction.Unknown) {
+        Resource selectedResource = ((Resource)e.Node.Tag);
+        currentlyAuthorized = IsAuthorized(selectedResource);
+        if (currentlyAuthorized) {
+          permissionView.FetchSelectedUsers = new Func<List<Guid>>(() => {
+            return HiveServiceLocator.Instance.CallHiveService<List<ResourcePermission>>(service => {
+              return service.GetResourcePermissions(selectedResource.Id);
+            }).Select(x => x.GrantedUserId).ToList();
+          });
+          if (!tabSlaveGroup.TabPages.Contains(tabPermissions)) tabSlaveGroup.TabPages.Add(tabPermissions);
+        } else {
+          permissionView.FetchSelectedUsers = null;
+          btnPermissionsSave.Enabled = false;
+          if (selectedResource.Id == Guid.Empty) {
+            if (!tabSlaveGroup.TabPages.Contains(tabPermissions)) tabSlaveGroup.TabPages.Add(tabPermissions);
+          } else tabSlaveGroup.TabPages.Remove(tabPermissions);
+        }
+
+        if (slaveView.Content != null && slaveView.Content is SlaveGroup) {
+          slaveView.Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
+        }
+
+        slaveView.Content = selectedResource;
+        HiveAdminClient.Instance.DowntimeForResourceId = selectedResource.Id;
+
+        if (selectedResource is SlaveGroup) {
+          slaveView.Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
+        }
+
+        if (tabSlaveGroup.SelectedIndex == 1) {
+          UpdateScheduleAsync();
+        } else if (tabSlaveGroup.SelectedIndex == 2) {
+          UpdatePermissionsAsync();
+        }
       }
     }
@@ -217,4 +292,5 @@
       SlaveGroup newGroup = new SlaveGroup();
       newGroup.Name = "New Group";
+      newGroup.OwnerUserId = UserInformation.Instance.User.Id;
       Content.Add(newGroup);
     }
@@ -269,5 +345,5 @@
         if (destNode.TreeView == newNode.TreeView) {
           if (destNode.Text == UngroupedGroupName || (destNode.Parent != null && destNode.Parent.Text == UngroupedGroupName)) {
-            MessageBox.Show(String.Format("You can't drag items to the {0} group.{1}This group only contains slaves which haven't yet been assigned to a real group.",
+            MessageBox.Show(string.Format("You can't drag items to the group \"{0}\".{1}This group only contains slaves which haven't yet been assigned to a real group.",
               UngroupedGroupName, Environment.NewLine), "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Information);
             return;
@@ -285,4 +361,12 @@
 
           if (newNode.Tag is SlaveGroup && CheckParentsEqualsMovedNode(parentNode, newNode)) {
+            return;
+          }
+
+          SlaveGroup parent = (SlaveGroup)parentNode.Tag;
+
+          if (parent.OwnerUserId != null && !IsAuthorized(parent)) {
+            MessageBox.Show(string.Format("You don't have the permissions to drag items to the group \"{0}\".", ((Resource)parentNode.Tag).Name),
+              "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);
             return;
           }
@@ -330,5 +414,6 @@
     private void treeSlaveGroup_ItemDrag(object sender, ItemDragEventArgs e) {
       TreeNode sourceNode = (TreeNode)e.Item;
-      DoDragDrop(sourceNode, DragDropEffects.All);
+      if (IsAuthorized((Resource)sourceNode.Tag))
+        DoDragDrop(sourceNode, DragDropEffects.All);
     }
 
@@ -403,5 +488,8 @@
     private void UpdateSchedule() {
       HiveAdminClient.Instance.RefreshCalendar();
-      scheduleView.Invoke(new Action(() => scheduleView.Content = HiveAdminClient.Instance.Downtimes));
+      scheduleView.Invoke(new Action(() => {
+        scheduleView.Content = HiveAdminClient.Instance.Downtimes;
+        SetEnabledStateOfControls(currentlyAuthorized);
+      }));
     }
 
@@ -412,4 +500,16 @@
     }
 
+    private void UpdatePermissions() {
+      if (permissionView.Content != null && permissionView.FetchSelectedUsers != null)
+        permissionView.Invoke(new Action(() => permissionView.ManualRefresh()));
+    }
+
+    private void UpdatePermissionsAsync() {
+      TS.Task.Factory.StartNew(UpdatePermissions).ContinueWith((t) => {
+        DisplayError(t.Exception);
+      }, TaskContinuationOptions.OnlyOnFaulted);
+    }
+
+
     private void DisplayError(Exception ex) {
       MessageBox.Show(string.Format("An error occured while updating: {0} {1}", Environment.NewLine, ex.Message), "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Error);
@@ -419,4 +519,6 @@
       if (tabSlaveGroup.SelectedIndex == 1) {
         UpdateScheduleAsync();
+      } else if (tabSlaveGroup.SelectedIndex == 2) {
+        UpdatePermissionsAsync();
       }
     }
@@ -429,4 +531,13 @@
       UpdateResourcesAsync();
     }
+
+    private void btnPermissionsSave_Click(object sender, EventArgs e) {
+      SetEnabledStateOfControls(false);
+      HiveServiceLocator.Instance.CallHiveService(service => {
+        service.GrantResourcePermissions(((Resource)treeSlaveGroup.SelectedNode.Tag).Id, permissionView.GetAddedUsers().Select(x => x.Id).ToList());
+        service.RevokeResourcePermissions(((Resource)treeSlaveGroup.SelectedNode.Tag).Id, permissionView.GetDeletedUsers().Select(x => x.Id).ToList());
+      });
+      SetEnabledStateOfControls(true);
+    }
   }
 }
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.Designer.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.Designer.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.Designer.cs	(revision 7951)
@@ -71,6 +71,6 @@
       this.dvOnline.ActiveTool = drawTool1;
       this.dvOnline.AmPmDisplay = false;
-      this.dvOnline.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.dvOnline.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.dvOnline.AppointmentDuration = Calendar.AppointmentSlotDuration.SixtyMinutes;
       this.dvOnline.AppointmentHeightMode = Calendar.AppHeightDrawMode.TrueHeightAll;
@@ -83,10 +83,10 @@
       this.dvOnline.EnableTimeIndicator = false;
       this.dvOnline.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
-      this.dvOnline.Location = new System.Drawing.Point(9, 176);
+      this.dvOnline.Location = new System.Drawing.Point(3, 183);
       this.dvOnline.MinHalfHourApp = false;
       this.dvOnline.Name = "dvOnline";
       this.dvOnline.SelectionEnd = new System.DateTime(((long)(0)));
       this.dvOnline.SelectionStart = new System.DateTime(((long)(0)));
-      this.dvOnline.Size = new System.Drawing.Size(823, 354);
+      this.dvOnline.Size = new System.Drawing.Size(836, 354);
       this.dvOnline.StartDate = new System.DateTime(((long)(0)));
       this.dvOnline.TabIndex = 54;
@@ -123,4 +123,5 @@
       // groupBox1
       // 
+      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
       this.groupBox1.Controls.Add(this.txttimeTo);
       this.groupBox1.Controls.Add(this.txttimeFrom);
@@ -133,7 +134,7 @@
       this.groupBox1.Controls.Add(this.label1);
       this.groupBox1.Controls.Add(this.btCreate);
-      this.groupBox1.Location = new System.Drawing.Point(373, 4);
+      this.groupBox1.Location = new System.Drawing.Point(375, 3);
       this.groupBox1.Name = "groupBox1";
-      this.groupBox1.Size = new System.Drawing.Size(254, 161);
+      this.groupBox1.Size = new System.Drawing.Size(259, 168);
       this.groupBox1.TabIndex = 56;
       this.groupBox1.TabStop = false;
@@ -217,7 +218,8 @@
       // btnSaveCal
       // 
+      this.btnSaveCal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
       this.btnSaveCal.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
       this.btnSaveCal.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.btnSaveCal.Location = new System.Drawing.Point(633, 41);
+      this.btnSaveCal.Location = new System.Drawing.Point(640, 41);
       this.btnSaveCal.Name = "btnSaveCal";
       this.btnSaveCal.Size = new System.Drawing.Size(199, 26);
@@ -230,7 +232,8 @@
       // btnClearCal
       // 
+      this.btnClearCal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
       this.btnClearCal.Image = HeuristicLab.Common.Resources.VSImageLibrary.Document;
       this.btnClearCal.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
-      this.btnClearCal.Location = new System.Drawing.Point(633, 9);
+      this.btnClearCal.Location = new System.Drawing.Point(640, 9);
       this.btnClearCal.Name = "btnClearCal";
       this.btnClearCal.Size = new System.Drawing.Size(199, 26);
@@ -243,6 +246,8 @@
       // mcOnline
       // 
+      this.mcOnline.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.mcOnline.CalendarDimensions = new System.Drawing.Size(2, 1);
-      this.mcOnline.Location = new System.Drawing.Point(4, 9);
+      this.mcOnline.Location = new System.Drawing.Point(3, 9);
       this.mcOnline.Name = "mcOnline";
       this.mcOnline.TabIndex = 55;
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.cs	(revision 7951)
@@ -228,8 +228,14 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      if (Content == null) {
-        btnSaveCal.Enabled = false;
+    }
+
+    public virtual void SetEnabledStateOfControls(bool state) {
+      if (InvokeRequired) {
+        Invoke(new Action(() => SetEnabledStateOfControls(state)));
       } else {
-        btnSaveCal.Enabled = true;
+        if (Content == null) state = false;
+        groupBox1.Enabled = state;
+        btnClearCal.Enabled = state;
+        btnSaveCal.Enabled = state;
       }
     }
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.Designer.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.Designer.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.Designer.cs	(revision 7951)
@@ -67,4 +67,6 @@
       this.cbxDisposable = new System.Windows.Forms.CheckBox();
       this.label4 = new System.Windows.Forms.Label();
+      this.cbxPublic = new System.Windows.Forms.CheckBox();
+      this.label5 = new System.Windows.Forms.Label();
       this.SuspendLayout();
       // 
@@ -74,5 +76,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtSlaveState.Enabled = false;
-      this.txtSlaveState.Location = new System.Drawing.Point(146, 216);
+      this.txtSlaveState.Location = new System.Drawing.Point(146, 242);
       this.txtSlaveState.Name = "txtSlaveState";
       this.txtSlaveState.Size = new System.Drawing.Size(390, 20);
@@ -84,5 +86,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtOS.Enabled = false;
-      this.txtOS.Location = new System.Drawing.Point(146, 190);
+      this.txtOS.Location = new System.Drawing.Point(146, 216);
       this.txtOS.Name = "txtOS";
       this.txtOS.Size = new System.Drawing.Size(390, 20);
@@ -92,5 +94,5 @@
       // 
       this.label15.AutoSize = true;
-      this.label15.Location = new System.Drawing.Point(3, 219);
+      this.label15.Location = new System.Drawing.Point(3, 245);
       this.label15.Name = "label15";
       this.label15.Size = new System.Drawing.Size(35, 13);
@@ -101,5 +103,5 @@
       // 
       this.label14.AutoSize = true;
-      this.label14.Location = new System.Drawing.Point(3, 193);
+      this.label14.Location = new System.Drawing.Point(3, 219);
       this.label14.Name = "label14";
       this.label14.Size = new System.Drawing.Size(93, 13);
@@ -112,5 +114,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtDetailsDescription.Enabled = false;
-      this.txtDetailsDescription.Location = new System.Drawing.Point(146, 86);
+      this.txtDetailsDescription.Location = new System.Drawing.Point(146, 112);
       this.txtDetailsDescription.Name = "txtDetailsDescription";
       this.txtDetailsDescription.Size = new System.Drawing.Size(390, 20);
@@ -120,5 +122,5 @@
       // 
       this.label13.AutoSize = true;
-      this.label13.Location = new System.Drawing.Point(3, 89);
+      this.label13.Location = new System.Drawing.Point(3, 115);
       this.label13.Name = "label13";
       this.label13.Size = new System.Drawing.Size(63, 13);
@@ -141,5 +143,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtCPU.Enabled = false;
-      this.txtCPU.Location = new System.Drawing.Point(146, 112);
+      this.txtCPU.Location = new System.Drawing.Point(146, 138);
       this.txtCPU.Name = "txtCPU";
       this.txtCPU.Size = new System.Drawing.Size(390, 20);
@@ -151,5 +153,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtMemory.Enabled = false;
-      this.txtMemory.Location = new System.Drawing.Point(146, 138);
+      this.txtMemory.Location = new System.Drawing.Point(146, 164);
       this.txtMemory.Name = "txtMemory";
       this.txtMemory.Size = new System.Drawing.Size(390, 20);
@@ -161,5 +163,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtLastHeartbeat.Enabled = false;
-      this.txtLastHeartbeat.Location = new System.Drawing.Point(146, 242);
+      this.txtLastHeartbeat.Location = new System.Drawing.Point(146, 268);
       this.txtLastHeartbeat.Name = "txtLastHeartbeat";
       this.txtLastHeartbeat.Size = new System.Drawing.Size(390, 20);
@@ -169,5 +171,5 @@
       // 
       this.label12.AutoSize = true;
-      this.label12.Location = new System.Drawing.Point(3, 245);
+      this.label12.Location = new System.Drawing.Point(3, 271);
       this.label12.Name = "label12";
       this.label12.Size = new System.Drawing.Size(80, 13);
@@ -178,5 +180,5 @@
       // 
       this.label11.AutoSize = true;
-      this.label11.Location = new System.Drawing.Point(3, 141);
+      this.label11.Location = new System.Drawing.Point(3, 167);
       this.label11.Name = "label11";
       this.label11.Size = new System.Drawing.Size(47, 13);
@@ -187,5 +189,5 @@
       // 
       this.label10.AutoSize = true;
-      this.label10.Location = new System.Drawing.Point(3, 115);
+      this.label10.Location = new System.Drawing.Point(3, 141);
       this.label10.Name = "label10";
       this.label10.Size = new System.Drawing.Size(32, 13);
@@ -205,5 +207,5 @@
       // 
       this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 167);
+      this.label1.Location = new System.Drawing.Point(3, 193);
       this.label1.Name = "label1";
       this.label1.Size = new System.Drawing.Size(70, 13);
@@ -216,5 +218,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtFreeMemory.Enabled = false;
-      this.txtFreeMemory.Location = new System.Drawing.Point(146, 164);
+      this.txtFreeMemory.Location = new System.Drawing.Point(146, 190);
       this.txtFreeMemory.Name = "txtFreeMemory";
       this.txtFreeMemory.Size = new System.Drawing.Size(390, 20);
@@ -226,5 +228,5 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.txtId.Enabled = false;
-      this.txtId.Location = new System.Drawing.Point(146, 60);
+      this.txtId.Location = new System.Drawing.Point(146, 86);
       this.txtId.Name = "txtId";
       this.txtId.Size = new System.Drawing.Size(390, 20);
@@ -234,5 +236,5 @@
       // 
       this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(3, 63);
+      this.label2.Location = new System.Drawing.Point(3, 89);
       this.label2.Name = "label2";
       this.label2.Size = new System.Drawing.Size(19, 13);
@@ -262,15 +264,16 @@
       // 
       this.cbxDisposable.AutoSize = true;
-      this.cbxDisposable.Location = new System.Drawing.Point(146, 268);
+      this.cbxDisposable.Enabled = false;
+      this.cbxDisposable.Location = new System.Drawing.Point(146, 297);
       this.cbxDisposable.Name = "cbxDisposable";
       this.cbxDisposable.Size = new System.Drawing.Size(15, 14);
       this.cbxDisposable.TabIndex = 34;
       this.cbxDisposable.UseVisualStyleBackColor = true;
-      this.cbxDisposable.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
+      this.cbxDisposable.CheckedChanged += new System.EventHandler(this.cbxDisposable_CheckedChanged);
       // 
       // label4
       // 
       this.label4.AutoSize = true;
-      this.label4.Location = new System.Drawing.Point(3, 269);
+      this.label4.Location = new System.Drawing.Point(3, 297);
       this.label4.Name = "label4";
       this.label4.Size = new System.Drawing.Size(62, 13);
@@ -278,8 +281,30 @@
       this.label4.Text = "Disposable:";
       // 
+      // cbxPublic
+      // 
+      this.cbxPublic.AutoSize = true;
+      this.cbxPublic.Enabled = false;
+      this.cbxPublic.Location = new System.Drawing.Point(146, 63);
+      this.cbxPublic.Name = "cbxPublic";
+      this.cbxPublic.Size = new System.Drawing.Size(15, 14);
+      this.cbxPublic.TabIndex = 36;
+      this.cbxPublic.UseVisualStyleBackColor = true;
+      this.cbxPublic.CheckedChanged += new System.EventHandler(this.cbxPublic_CheckedChanged);
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(3, 63);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(39, 13);
+      this.label5.TabIndex = 37;
+      this.label5.Text = "Public:";
+      // 
       // SlaveView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.cbxPublic);
       this.Controls.Add(this.label4);
       this.Controls.Add(this.cbxDisposable);
@@ -305,5 +330,5 @@
       this.Controls.Add(this.label9);
       this.Name = "SlaveView";
-      this.Size = new System.Drawing.Size(539, 285);
+      this.Size = new System.Drawing.Size(539, 407);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -335,4 +360,6 @@
     private System.Windows.Forms.CheckBox cbxDisposable;
     private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.CheckBox cbxPublic;
+    private System.Windows.Forms.Label label5;
   }
 }
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive.Administrator/3.3/Views/SlaveView.cs	(revision 7951)
@@ -22,4 +22,5 @@
 using System;
 using System.Windows.Forms;
+using HeuristicLab.Clients.Access;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
@@ -63,11 +64,16 @@
         txtHbIntervall.Clear();
         cbxDisposable.Checked = false;
+        cbxPublic.Checked = false;
       } else {
         if (Content.GetType() == typeof(Slave)) {
           ShowSlaveUI(true);
           Slave ct = (Slave)Content;
+          bool authorized = HiveServiceLocator.Instance.CallHiveService<bool>(service => service.AuthorizesForResourceAdministration(ct.Id));
           txtName.Text = ct.Name;
           txtHbIntervall.Text = ct.HbInterval.ToString();
-          cbxDisposable.Checked = ct.IsDisposable.GetValueOrDefault();
+          cbxPublic.Enabled = authorized;
+          cbxPublic.CheckedChanged -= new EventHandler(cbxPublic_CheckedChanged);
+          cbxPublic.Checked = ct.OwnerUserId == null;
+          cbxPublic.CheckedChanged += new EventHandler(cbxPublic_CheckedChanged);
           txtCPU.Text = string.Format("{0} Cores @ {1} Mhz, Arch.: {2}", ct.Cores.ToString(), ct.CpuSpeed.ToString(), ct.CpuArchitecture.ToString());
           txtDetailsDescription.Text = ct.Description;
@@ -78,8 +84,14 @@
           txtFreeMemory.Text = ct.FreeMemory.ToString();
           txtId.Text = ct.Id.ToString();
+          cbxDisposable.Enabled = authorized;
+          cbxDisposable.Checked = ct.IsDisposable.GetValueOrDefault();
         } else if (Content.GetType() == typeof(SlaveGroup)) {
           SlaveGroup ct = (SlaveGroup)Content;
           txtName.Text = ct.Name;
           txtHbIntervall.Text = ct.HbInterval.ToString();
+          cbxPublic.Enabled = ct.Name != "UNGROUPED" && HiveRoles.CheckAdminUserPermissions();
+          cbxPublic.CheckedChanged -= new EventHandler(cbxPublic_CheckedChanged);
+          cbxPublic.Checked = ct.OwnerUserId == null;
+          cbxPublic.CheckedChanged += new EventHandler(cbxPublic_CheckedChanged);
           ShowSlaveUI(false);
         } else {
@@ -136,9 +148,15 @@
     }
 
-    private void checkBox1_CheckedChanged(object sender, EventArgs e) {
+    private void cbxDisposable_CheckedChanged(object sender, EventArgs e) {
       if (Content != null) {
         ((Slave)Content).IsDisposable = cbxDisposable.Checked;
       }
     }
+
+    private void cbxPublic_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        Content.OwnerUserId = cbxPublic.Checked ? null : new Guid?(UserInformation.Instance.User.Id);
+      }
+    }
   }
 }
Index: branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs
===================================================================
--- branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 7950)
+++ branches/HiveResourcePermissionManagement (trunk integration)/HeuristicLab.Clients.Hive/3.3/ServiceClients/HiveServiceClient.cs	(revision 7951)
@@ -2,5 +2,5 @@
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.269
+//     Runtime Version:4.0.30319.17379
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
@@ -422,4 +422,233 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Downtime", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
+  [System.SerializableAttribute()]
+  public partial class Downtime : HeuristicLab.Clients.Hive.HiveItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private bool AllDayEventField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime EndDateField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private bool RecurringField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid RecurringIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ResourceIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime StartDateField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public bool AllDayEvent {
+      get {
+        return this.AllDayEventField;
+      }
+      set {
+        if ((this.AllDayEventField.Equals(value) != true)) {
+          this.AllDayEventField = value;
+          this.RaisePropertyChanged("AllDayEvent");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime EndDate {
+      get {
+        return this.EndDateField;
+      }
+      set {
+        if ((this.EndDateField.Equals(value) != true)) {
+          this.EndDateField = value;
+          this.RaisePropertyChanged("EndDate");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public bool Recurring {
+      get {
+        return this.RecurringField;
+      }
+      set {
+        if ((this.RecurringField.Equals(value) != true)) {
+          this.RecurringField = value;
+          this.RaisePropertyChanged("Recurring");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid RecurringId {
+      get {
+        return this.RecurringIdField;
+      }
+      set {
+        if ((this.RecurringIdField.Equals(value) != true)) {
+          this.RecurringIdField = value;
+          this.RaisePropertyChanged("RecurringId");
+        }
+      }
+    }
+
+    [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");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime StartDate {
+      get {
+        return this.StartDateField;
+      }
+      set {
+        if ((this.StartDateField.Equals(value) != true)) {
+          this.StartDateField = value;
+          this.RaisePropertyChanged("StartDate");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "JobPermission", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
+  [System.SerializableAttribute()]
+  public partial class JobPermission : HeuristicLab.Clients.Hive.HiveItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid GrantedByUserIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid GrantedUserIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid JobIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private HeuristicLab.Clients.Hive.Permission PermissionField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid GrantedByUserId {
+      get {
+        return this.GrantedByUserIdField;
+      }
+      set {
+        if ((this.GrantedByUserIdField.Equals(value) != true)) {
+          this.GrantedByUserIdField = value;
+          this.RaisePropertyChanged("GrantedByUserId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid GrantedUserId {
+      get {
+        return this.GrantedUserIdField;
+      }
+      set {
+        if ((this.GrantedUserIdField.Equals(value) != true)) {
+          this.GrantedUserIdField = value;
+          this.RaisePropertyChanged("GrantedUserId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid JobId {
+      get {
+        return this.JobIdField;
+      }
+      set {
+        if ((this.JobIdField.Equals(value) != true)) {
+          this.JobIdField = value;
+          this.RaisePropertyChanged("JobId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.Hive.Permission Permission {
+      get {
+        return this.PermissionField;
+      }
+      set {
+        if ((this.PermissionField.Equals(value) != true)) {
+          this.PermissionField = value;
+          this.RaisePropertyChanged("Permission");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "PluginData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
+  [System.SerializableAttribute()]
+  public partial class PluginData : HeuristicLab.Clients.Hive.HiveItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private byte[] DataField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string FileNameField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid PluginIdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public byte[] Data {
+      get {
+        return this.DataField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DataField, value) != true)) {
+          this.DataField = value;
+          this.RaisePropertyChanged("Data");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string FileName {
+      get {
+        return this.FileNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.FileNameField, value) != true)) {
+          this.FileNameField = value;
+          this.RaisePropertyChanged("FileName");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid PluginId {
+      get {
+        return this.PluginIdField;
+      }
+      set {
+        if ((this.PluginIdField.Equals(value) != true)) {
+          this.PluginIdField = value;
+          this.RaisePropertyChanged("PluginId");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
   [System.Runtime.Serialization.DataContractAttribute(Name = "ResourcePermission", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
   [System.SerializableAttribute()]
@@ -470,233 +699,4 @@
           this.ResourceIdField = value;
           this.RaisePropertyChanged("ResourceId");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "Downtime", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
-  [System.SerializableAttribute()]
-  public partial class Downtime : HeuristicLab.Clients.Hive.HiveItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private bool AllDayEventField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime EndDateField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private bool RecurringField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid RecurringIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid ResourceIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime StartDateField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public bool AllDayEvent {
-      get {
-        return this.AllDayEventField;
-      }
-      set {
-        if ((this.AllDayEventField.Equals(value) != true)) {
-          this.AllDayEventField = value;
-          this.RaisePropertyChanged("AllDayEvent");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime EndDate {
-      get {
-        return this.EndDateField;
-      }
-      set {
-        if ((this.EndDateField.Equals(value) != true)) {
-          this.EndDateField = value;
-          this.RaisePropertyChanged("EndDate");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public bool Recurring {
-      get {
-        return this.RecurringField;
-      }
-      set {
-        if ((this.RecurringField.Equals(value) != true)) {
-          this.RecurringField = value;
-          this.RaisePropertyChanged("Recurring");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid RecurringId {
-      get {
-        return this.RecurringIdField;
-      }
-      set {
-        if ((this.RecurringIdField.Equals(value) != true)) {
-          this.RecurringIdField = value;
-          this.RaisePropertyChanged("RecurringId");
-        }
-      }
-    }
-
-    [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");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime StartDate {
-      get {
-        return this.StartDateField;
-      }
-      set {
-        if ((this.StartDateField.Equals(value) != true)) {
-          this.StartDateField = value;
-          this.RaisePropertyChanged("StartDate");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "JobPermission", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
-  [System.SerializableAttribute()]
-  public partial class JobPermission : HeuristicLab.Clients.Hive.HiveItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid GrantedByUserIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid GrantedUserIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid JobIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private HeuristicLab.Clients.Hive.Permission PermissionField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid GrantedByUserId {
-      get {
-        return this.GrantedByUserIdField;
-      }
-      set {
-        if ((this.GrantedByUserIdField.Equals(value) != true)) {
-          this.GrantedByUserIdField = value;
-          this.RaisePropertyChanged("GrantedByUserId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid GrantedUserId {
-      get {
-        return this.GrantedUserIdField;
-      }
-      set {
-        if ((this.GrantedUserIdField.Equals(value) != true)) {
-          this.GrantedUserIdField = value;
-          this.RaisePropertyChanged("GrantedUserId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid JobId {
-      get {
-        return this.JobIdField;
-      }
-      set {
-        if ((this.JobIdField.Equals(value) != true)) {
-          this.JobIdField = value;
-          this.RaisePropertyChanged("JobId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public HeuristicLab.Clients.Hive.Permission Permission {
-      get {
-        return this.PermissionField;
-      }
-      set {
-        if ((this.PermissionField.Equals(value) != true)) {
-          this.PermissionField = value;
-          this.RaisePropertyChanged("Permission");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "PluginData", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.DataTransfer")]
-  [System.SerializableAttribute()]
-  public partial class PluginData : HeuristicLab.Clients.Hive.HiveItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private byte[] DataField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string FileNameField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid PluginIdField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public byte[] Data {
-      get {
-        return this.DataField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.DataField, value) != true)) {
-          this.DataField = value;
-          this.RaisePropertyChanged("Data");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string FileName {
-      get {
-        return this.FileNameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.FileNameField, value) != true)) {
-          this.FileNameField = value;
-          this.RaisePropertyChanged("FileName");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid PluginId {
-      get {
-        return this.PluginIdField;
-      }
-      set {
-        if ((this.PluginIdField.Equals(value) != true)) {
-          this.PluginIdField = value;
-          this.RaisePropertyChanged("PluginId");
         }
       }
@@ -1664,4 +1664,16 @@
   public interface IHiveService {
 
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlaveGroup", ReplyAction = "http://tempuri.org/IHiveService/GetSlaveGroupResponse")]
+    HeuristicLab.Clients.Hive.SlaveGroup GetSlaveGroup(System.Guid slaveGroupId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlaves", ReplyAction = "http://tempuri.org/IHiveService/GetSlavesResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Hive.Slave> GetSlaves();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlaveGroups", ReplyAction = "http://tempuri.org/IHiveService/GetSlaveGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Hive.SlaveGroup> GetSlaveGroups();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/UpdateSlave", ReplyAction = "http://tempuri.org/IHiveService/UpdateSlaveResponse")]
+    void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave);
+
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/UpdateSlaveGroup", ReplyAction = "http://tempuri.org/IHiveService/UpdateSlaveGroupResponse")]
     void UpdateSlaveGroup(HeuristicLab.Clients.Hive.SlaveGroup slaveGroup);
@@ -1691,13 +1703,4 @@
     int GetNewHeartbeatInterval(System.Guid slaveId);
 
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GrantResourcePermission", ReplyAction = "http://tempuri.org/IHiveService/GrantResourcePermissionResponse")]
-    void GrantResourcePermission(System.Guid slaveId, System.Guid grantedUserId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/RevokeResourcePermission", ReplyAction = "http://tempuri.org/IHiveService/RevokeResourcePermissionResponse")]
-    void RevokeResourcePermission(System.Guid slaveId, System.Guid grantedUserId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlavePermissions", ReplyAction = "http://tempuri.org/IHiveService/GetSlavePermissionsResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Hive.ResourcePermission> GetSlavePermissions(System.Guid slaveId);
-
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/AddDowntime", ReplyAction = "http://tempuri.org/IHiveService/AddDowntimeResponse")]
     System.Guid AddDowntime(HeuristicLab.Clients.Hive.Downtime downtime);
@@ -1717,4 +1720,7 @@
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetUserIdByUsername", ReplyAction = "http://tempuri.org/IHiveService/GetUserIdByUsernameResponse")]
     System.Guid GetUserIdByUsername(string username);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/AuthorizesForResourceAdministration", ReplyAction = "http://tempuri.org/IHiveService/AuthorizesForResourceAdministrationResponse")]
+    bool AuthorizesForResourceAdministration(System.Guid resourceId);
 
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/AddTask", ReplyAction = "http://tempuri.org/IHiveService/AddTaskResponse")]
@@ -1824,4 +1830,13 @@
     void DeletePlugin(System.Guid pluginId);
 
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GrantResourcePermissions", ReplyAction = "http://tempuri.org/IHiveService/GrantResourcePermissionsResponse")]
+    void GrantResourcePermissions(System.Guid resourceId, System.Collections.Generic.List<System.Guid> grantedUserIds);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/RevokeResourcePermissions", ReplyAction = "http://tempuri.org/IHiveService/RevokeResourcePermissionsResponse")]
+    void RevokeResourcePermissions(System.Guid resourceId, System.Collections.Generic.List<System.Guid> grantedUserIds);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetResourcePermissions", ReplyAction = "http://tempuri.org/IHiveService/GetResourcePermissionsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Hive.ResourcePermission> GetResourcePermissions(System.Guid resourceId);
+
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/AddSlave", ReplyAction = "http://tempuri.org/IHiveService/AddSlaveResponse")]
     System.Guid AddSlave(HeuristicLab.Clients.Hive.Slave slave);
@@ -1832,16 +1847,4 @@
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlave", ReplyAction = "http://tempuri.org/IHiveService/GetSlaveResponse")]
     HeuristicLab.Clients.Hive.Slave GetSlave(System.Guid slaveId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlaveGroup", ReplyAction = "http://tempuri.org/IHiveService/GetSlaveGroupResponse")]
-    HeuristicLab.Clients.Hive.SlaveGroup GetSlaveGroup(System.Guid slaveGroupId);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlaves", ReplyAction = "http://tempuri.org/IHiveService/GetSlavesResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Hive.Slave> GetSlaves();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/GetSlaveGroups", ReplyAction = "http://tempuri.org/IHiveService/GetSlaveGroupsResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Hive.SlaveGroup> GetSlaveGroups();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IHiveService/UpdateSlave", ReplyAction = "http://tempuri.org/IHiveService/UpdateSlaveResponse")]
-    void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave);
   }
 
@@ -1873,4 +1876,20 @@
     }
 
+    public HeuristicLab.Clients.Hive.SlaveGroup GetSlaveGroup(System.Guid slaveGroupId) {
+      return base.Channel.GetSlaveGroup(slaveGroupId);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Hive.Slave> GetSlaves() {
+      return base.Channel.GetSlaves();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Hive.SlaveGroup> GetSlaveGroups() {
+      return base.Channel.GetSlaveGroups();
+    }
+
+    public void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave) {
+      base.Channel.UpdateSlave(slave);
+    }
+
     public void UpdateSlaveGroup(HeuristicLab.Clients.Hive.SlaveGroup slaveGroup) {
       base.Channel.UpdateSlaveGroup(slaveGroup);
@@ -1909,16 +1928,4 @@
     }
 
-    public void GrantResourcePermission(System.Guid slaveId, System.Guid grantedUserId) {
-      base.Channel.GrantResourcePermission(slaveId, grantedUserId);
-    }
-
-    public void RevokeResourcePermission(System.Guid slaveId, System.Guid grantedUserId) {
-      base.Channel.RevokeResourcePermission(slaveId, grantedUserId);
-    }
-
-    public System.Collections.Generic.List<HeuristicLab.Clients.Hive.ResourcePermission> GetSlavePermissions(System.Guid slaveId) {
-      return base.Channel.GetSlavePermissions(slaveId);
-    }
-
     public System.Guid AddDowntime(HeuristicLab.Clients.Hive.Downtime downtime) {
       return base.Channel.AddDowntime(downtime);
@@ -1945,4 +1952,8 @@
     }
 
+    public bool AuthorizesForResourceAdministration(System.Guid resourceId) {
+      return base.Channel.AuthorizesForResourceAdministration(resourceId);
+    }
+
     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);
@@ -2085,4 +2096,16 @@
     }
 
+    public void GrantResourcePermissions(System.Guid resourceId, System.Collections.Generic.List<System.Guid> grantedUserIds) {
+      base.Channel.GrantResourcePermissions(resourceId, grantedUserIds);
+    }
+
+    public void RevokeResourcePermissions(System.Guid resourceId, System.Collections.Generic.List<System.Guid> grantedUserIds) {
+      base.Channel.RevokeResourcePermissions(resourceId, grantedUserIds);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Hive.ResourcePermission> GetResourcePermissions(System.Guid resourceId) {
+      return base.Channel.GetResourcePermissions(resourceId);
+    }
+
     public System.Guid AddSlave(HeuristicLab.Clients.Hive.Slave slave) {
       return base.Channel.AddSlave(slave);
@@ -2096,20 +2119,4 @@
       return base.Channel.GetSlave(slaveId);
     }
-
-    public HeuristicLab.Clients.Hive.SlaveGroup GetSlaveGroup(System.Guid slaveGroupId) {
-      return base.Channel.GetSlaveGroup(slaveGroupId);
-    }
-
-    public System.Collections.Generic.List<HeuristicLab.Clients.Hive.Slave> GetSlaves() {
-      return base.Channel.GetSlaves();
-    }
-
-    public System.Collections.Generic.List<HeuristicLab.Clients.Hive.SlaveGroup> GetSlaveGroups() {
-      return base.Channel.GetSlaveGroups();
-    }
-
-    public void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave) {
-      base.Channel.UpdateSlave(slave);
-    }
   }
 }
