Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/AccessClient.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/AccessClient.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/AccessClient.cs	(revision 7426)
@@ -37,18 +37,16 @@
 
     #region Properties
-    private ItemList<LightweightUser> users;
-    public ItemList<LightweightUser> Users {
-      get { return users; }
+    private ItemList<UserGroupBase> usersAndGroups;
+    public ItemList<UserGroupBase> UsersAndGroups {
+      get { return usersAndGroups; }
     }
     #endregion
 
-    private AccessClient() {
-      users = new ItemList<LightweightUser>();
-    }
+    private AccessClient() { }
 
     #region Refresh
     public void Refresh() {
-      users = new ItemList<LightweightUser>();
-      users.AddRange(CallRunCreationService<ItemList<LightweightUser>>(s => new ItemList<LightweightUser>(s.GetAllLightweightUsers())));
+      usersAndGroups = new ItemList<UserGroupBase>();
+      usersAndGroups.AddRange(CallRunCreationService<ItemList<UserGroupBase>>(s => new ItemList<UserGroupBase>(s.GetAllLeightweightUsersAndGroups())));
     }
     public void RefreshAsync(Action<Exception> exceptionCallback) {
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj	(revision 7426)
@@ -102,5 +102,18 @@
     <Compile Include="ServiceClients\IAccessItem.cs" />
     <Compile Include="ServiceClients\LightweightUser.cs" />
+    <Compile Include="ServiceClients\UserGroup.cs" />
     <Compile Include="ServiceClients\UserGroupBase.cs" />
+    <Compile Include="Views\LightweightUserGroupSelectionDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Views\LightweightUserGroupSelectionDialog.Designer.cs">
+      <DependentUpon>LightweightUserGroupSelectionDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\LightweightUserGroupSelectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\LightweightUserGroupSelectionView.Designer.cs">
+      <DependentUpon>LightweightUserGroupSelectionView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Views\LightweightUserView.cs">
       <SubType>UserControl</SubType>
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs	(revision 7426)
@@ -14,11 +14,35 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "UserGroupBase", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroup))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.User))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.LightweightUser))]
+  public partial class UserGroupBase : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid IdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
   [System.Runtime.Serialization.DataContractAttribute(Name = "AccessItem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
       "")]
   [System.SerializableAttribute()]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroupBase))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.User))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroup))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.LightweightUser))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Role))]
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientError))]
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Resource))]
@@ -30,5 +54,8 @@
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientGroup))]
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientLog))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Role))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroupBase))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroup))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.User))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.LightweightUser))]
   public partial class AccessItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
@@ -50,14 +77,92 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "UserGroupBase", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.User))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroup))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.LightweightUser))]
-  public partial class UserGroupBase : HeuristicLab.Clients.Access.AccessItem {
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Role", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class Role : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientError", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class ClientError : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ClientIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string ConfigDumpField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string ExceptionField;
 
     [System.Runtime.Serialization.OptionalFieldAttribute()]
     private System.Guid IdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime TimestampField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string UserCommentField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid UserIdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid ClientId {
+      get {
+        return this.ClientIdField;
+      }
+      set {
+        if ((this.ClientIdField.Equals(value) != true)) {
+          this.ClientIdField = value;
+          this.RaisePropertyChanged("ClientId");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string ConfigDump {
+      get {
+        return this.ConfigDumpField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ConfigDumpField, value) != true)) {
+          this.ConfigDumpField = value;
+          this.RaisePropertyChanged("ConfigDump");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Exception {
+      get {
+        return this.ExceptionField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ExceptionField, value) != true)) {
+          this.ExceptionField = value;
+          this.RaisePropertyChanged("Exception");
+        }
+      }
+    }
 
     [System.Runtime.Serialization.DataMemberAttribute()]
@@ -73,4 +178,517 @@
       }
     }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime Timestamp {
+      get {
+        return this.TimestampField;
+      }
+      set {
+        if ((this.TimestampField.Equals(value) != true)) {
+          this.TimestampField = value;
+          this.RaisePropertyChanged("Timestamp");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string UserComment {
+      get {
+        return this.UserCommentField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.UserCommentField, value) != true)) {
+          this.UserCommentField = value;
+          this.RaisePropertyChanged("UserComment");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid UserId {
+      get {
+        return this.UserIdField;
+      }
+      set {
+        if ((this.UserIdField.Equals(value) != true)) {
+          this.UserIdField = value;
+          this.RaisePropertyChanged("UserId");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Resource", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Client))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientGroup))]
+  public partial class Resource : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string DescriptionField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid IdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Description {
+      get {
+        return this.DescriptionField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DescriptionField, value) != true)) {
+          this.DescriptionField = value;
+          this.RaisePropertyChanged("Description");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Client", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class Client : HeuristicLab.Clients.Access.Resource {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private HeuristicLab.Clients.Access.ClientConfiguration ClientConfigurationField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private HeuristicLab.Clients.Access.ClientType ClientTypeField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private HeuristicLab.Clients.Access.Country CountryField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string HeuristicLabVersionField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private int MemorySizeField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private int NumberOfCoresField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private HeuristicLab.Clients.Access.OperatingSystem OperatingSystemField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string ProcessorTypeField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime TimestampField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.Access.ClientConfiguration ClientConfiguration {
+      get {
+        return this.ClientConfigurationField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ClientConfigurationField, value) != true)) {
+          this.ClientConfigurationField = value;
+          this.RaisePropertyChanged("ClientConfiguration");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.Access.ClientType ClientType {
+      get {
+        return this.ClientTypeField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ClientTypeField, value) != true)) {
+          this.ClientTypeField = value;
+          this.RaisePropertyChanged("ClientType");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.Access.Country Country {
+      get {
+        return this.CountryField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.CountryField, value) != true)) {
+          this.CountryField = value;
+          this.RaisePropertyChanged("Country");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string HeuristicLabVersion {
+      get {
+        return this.HeuristicLabVersionField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.HeuristicLabVersionField, value) != true)) {
+          this.HeuristicLabVersionField = value;
+          this.RaisePropertyChanged("HeuristicLabVersion");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public int MemorySize {
+      get {
+        return this.MemorySizeField;
+      }
+      set {
+        if ((this.MemorySizeField.Equals(value) != true)) {
+          this.MemorySizeField = value;
+          this.RaisePropertyChanged("MemorySize");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public int NumberOfCores {
+      get {
+        return this.NumberOfCoresField;
+      }
+      set {
+        if ((this.NumberOfCoresField.Equals(value) != true)) {
+          this.NumberOfCoresField = value;
+          this.RaisePropertyChanged("NumberOfCores");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public HeuristicLab.Clients.Access.OperatingSystem OperatingSystem {
+      get {
+        return this.OperatingSystemField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.OperatingSystemField, value) != true)) {
+          this.OperatingSystemField = value;
+          this.RaisePropertyChanged("OperatingSystem");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string ProcessorType {
+      get {
+        return this.ProcessorTypeField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.ProcessorTypeField, value) != true)) {
+          this.ProcessorTypeField = value;
+          this.RaisePropertyChanged("ProcessorType");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime Timestamp {
+      get {
+        return this.TimestampField;
+      }
+      set {
+        if ((this.TimestampField.Equals(value) != true)) {
+          this.TimestampField = value;
+          this.RaisePropertyChanged("Timestamp");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientConfiguration", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class ClientConfiguration : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string DescriptionField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string HashField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid IdField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Description {
+      get {
+        return this.DescriptionField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.DescriptionField, value) != true)) {
+          this.DescriptionField = value;
+          this.RaisePropertyChanged("Description");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Hash {
+      get {
+        return this.HashField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.HashField, value) != true)) {
+          this.HashField = value;
+          this.RaisePropertyChanged("Hash");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientType", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class ClientType : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid IdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "Country", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class Country : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid IdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "OperatingSystem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class OperatingSystem : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid IdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Id {
+      get {
+        return this.IdField;
+      }
+      set {
+        if ((this.IdField.Equals(value) != true)) {
+          this.IdField = value;
+          this.RaisePropertyChanged("Id");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientGroup", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class ClientGroup : HeuristicLab.Clients.Access.Resource {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientLog", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class ClientLog : HeuristicLab.Clients.Access.AccessItem {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string MessageField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ResourceIdField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime TimestampField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Message {
+      get {
+        return this.MessageField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.MessageField, value) != true)) {
+          this.MessageField = value;
+          this.RaisePropertyChanged("Message");
+        }
+      }
+    }
+
+    [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 Timestamp {
+      get {
+        return this.TimestampField;
+      }
+      set {
+        if ((this.TimestampField.Equals(value) != true)) {
+          this.TimestampField = value;
+          this.RaisePropertyChanged("Timestamp");
+        }
+      }
+    }
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "UserGroup", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class UserGroup : HeuristicLab.Clients.Access.UserGroupBase {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string NameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Name {
+      get {
+        return this.NameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.NameField, value) != true)) {
+          this.NameField = value;
+          this.RaisePropertyChanged("Name");
+        }
+      }
+    }
   }
 
@@ -229,28 +847,4 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "UserGroup", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class UserGroup : HeuristicLab.Clients.Access.UserGroupBase {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string NameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Name {
-      get {
-        return this.NameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.NameField, value) != true)) {
-          this.NameField = value;
-          this.RaisePropertyChanged("Name");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
   [System.Runtime.Serialization.DataContractAttribute(Name = "LightweightUser", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
       "")]
@@ -293,602 +887,8 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientError", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class ClientError : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid ClientIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string ConfigDumpField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string ExceptionField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid IdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime TimestampField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string UserCommentField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid UserIdField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid ClientId {
-      get {
-        return this.ClientIdField;
-      }
-      set {
-        if ((this.ClientIdField.Equals(value) != true)) {
-          this.ClientIdField = value;
-          this.RaisePropertyChanged("ClientId");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string ConfigDump {
-      get {
-        return this.ConfigDumpField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.ConfigDumpField, value) != true)) {
-          this.ConfigDumpField = value;
-          this.RaisePropertyChanged("ConfigDump");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Exception {
-      get {
-        return this.ExceptionField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.ExceptionField, value) != true)) {
-          this.ExceptionField = value;
-          this.RaisePropertyChanged("Exception");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid Id {
-      get {
-        return this.IdField;
-      }
-      set {
-        if ((this.IdField.Equals(value) != true)) {
-          this.IdField = value;
-          this.RaisePropertyChanged("Id");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime Timestamp {
-      get {
-        return this.TimestampField;
-      }
-      set {
-        if ((this.TimestampField.Equals(value) != true)) {
-          this.TimestampField = value;
-          this.RaisePropertyChanged("Timestamp");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string UserComment {
-      get {
-        return this.UserCommentField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.UserCommentField, value) != true)) {
-          this.UserCommentField = value;
-          this.RaisePropertyChanged("UserComment");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid UserId {
-      get {
-        return this.UserIdField;
-      }
-      set {
-        if ((this.UserIdField.Equals(value) != true)) {
-          this.UserIdField = value;
-          this.RaisePropertyChanged("UserId");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "Resource", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Client))]
-  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientGroup))]
-  public partial class Resource : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string DescriptionField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid IdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string NameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Description {
-      get {
-        return this.DescriptionField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.DescriptionField, value) != true)) {
-          this.DescriptionField = value;
-          this.RaisePropertyChanged("Description");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid Id {
-      get {
-        return this.IdField;
-      }
-      set {
-        if ((this.IdField.Equals(value) != true)) {
-          this.IdField = value;
-          this.RaisePropertyChanged("Id");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Name {
-      get {
-        return this.NameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.NameField, value) != true)) {
-          this.NameField = value;
-          this.RaisePropertyChanged("Name");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "Client", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class Client : HeuristicLab.Clients.Access.Resource {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private HeuristicLab.Clients.Access.ClientConfiguration ClientConfigurationField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private HeuristicLab.Clients.Access.ClientType ClientTypeField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private HeuristicLab.Clients.Access.Country CountryField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string HeuristicLabVersionField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private int MemorySizeField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private int NumberOfCoresField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private HeuristicLab.Clients.Access.OperatingSystem OperatingSystemField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string ProcessorTypeField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime TimestampField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public HeuristicLab.Clients.Access.ClientConfiguration ClientConfiguration {
-      get {
-        return this.ClientConfigurationField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.ClientConfigurationField, value) != true)) {
-          this.ClientConfigurationField = value;
-          this.RaisePropertyChanged("ClientConfiguration");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public HeuristicLab.Clients.Access.ClientType ClientType {
-      get {
-        return this.ClientTypeField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.ClientTypeField, value) != true)) {
-          this.ClientTypeField = value;
-          this.RaisePropertyChanged("ClientType");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public HeuristicLab.Clients.Access.Country Country {
-      get {
-        return this.CountryField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.CountryField, value) != true)) {
-          this.CountryField = value;
-          this.RaisePropertyChanged("Country");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string HeuristicLabVersion {
-      get {
-        return this.HeuristicLabVersionField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.HeuristicLabVersionField, value) != true)) {
-          this.HeuristicLabVersionField = value;
-          this.RaisePropertyChanged("HeuristicLabVersion");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public int MemorySize {
-      get {
-        return this.MemorySizeField;
-      }
-      set {
-        if ((this.MemorySizeField.Equals(value) != true)) {
-          this.MemorySizeField = value;
-          this.RaisePropertyChanged("MemorySize");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public int NumberOfCores {
-      get {
-        return this.NumberOfCoresField;
-      }
-      set {
-        if ((this.NumberOfCoresField.Equals(value) != true)) {
-          this.NumberOfCoresField = value;
-          this.RaisePropertyChanged("NumberOfCores");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public HeuristicLab.Clients.Access.OperatingSystem OperatingSystem {
-      get {
-        return this.OperatingSystemField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.OperatingSystemField, value) != true)) {
-          this.OperatingSystemField = value;
-          this.RaisePropertyChanged("OperatingSystem");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string ProcessorType {
-      get {
-        return this.ProcessorTypeField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.ProcessorTypeField, value) != true)) {
-          this.ProcessorTypeField = value;
-          this.RaisePropertyChanged("ProcessorType");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime Timestamp {
-      get {
-        return this.TimestampField;
-      }
-      set {
-        if ((this.TimestampField.Equals(value) != true)) {
-          this.TimestampField = value;
-          this.RaisePropertyChanged("Timestamp");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientConfiguration", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class ClientConfiguration : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string DescriptionField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string HashField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid IdField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Description {
-      get {
-        return this.DescriptionField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.DescriptionField, value) != true)) {
-          this.DescriptionField = value;
-          this.RaisePropertyChanged("Description");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Hash {
-      get {
-        return this.HashField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.HashField, value) != true)) {
-          this.HashField = value;
-          this.RaisePropertyChanged("Hash");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid Id {
-      get {
-        return this.IdField;
-      }
-      set {
-        if ((this.IdField.Equals(value) != true)) {
-          this.IdField = value;
-          this.RaisePropertyChanged("Id");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientType", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class ClientType : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid IdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string NameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid Id {
-      get {
-        return this.IdField;
-      }
-      set {
-        if ((this.IdField.Equals(value) != true)) {
-          this.IdField = value;
-          this.RaisePropertyChanged("Id");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Name {
-      get {
-        return this.NameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.NameField, value) != true)) {
-          this.NameField = value;
-          this.RaisePropertyChanged("Name");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "Country", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class Country : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid IdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string NameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid Id {
-      get {
-        return this.IdField;
-      }
-      set {
-        if ((this.IdField.Equals(value) != true)) {
-          this.IdField = value;
-          this.RaisePropertyChanged("Id");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Name {
-      get {
-        return this.NameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.NameField, value) != true)) {
-          this.NameField = value;
-          this.RaisePropertyChanged("Name");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "OperatingSystem", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class OperatingSystem : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid IdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string NameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.Guid Id {
-      get {
-        return this.IdField;
-      }
-      set {
-        if ((this.IdField.Equals(value) != true)) {
-          this.IdField = value;
-          this.RaisePropertyChanged("Id");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Name {
-      get {
-        return this.NameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.NameField, value) != true)) {
-          this.NameField = value;
-          this.RaisePropertyChanged("Name");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientGroup", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class ClientGroup : HeuristicLab.Clients.Access.Resource {
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientLog", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class ClientLog : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string MessageField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.Guid ResourceIdField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime TimestampField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Message {
-      get {
-        return this.MessageField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.MessageField, value) != true)) {
-          this.MessageField = value;
-          this.RaisePropertyChanged("Message");
-        }
-      }
-    }
-
-    [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 Timestamp {
-      get {
-        return this.TimestampField;
-      }
-      set {
-        if ((this.TimestampField.Equals(value) != true)) {
-          this.TimestampField = value;
-          this.RaisePropertyChanged("Timestamp");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "Role", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class Role : HeuristicLab.Clients.Access.AccessItem {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string NameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Name {
-      get {
-        return this.NameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.NameField, value) != true)) {
-          this.NameField = value;
-          this.RaisePropertyChanged("Name");
-        }
-      }
-    }
-  }
-
-  [System.Diagnostics.DebuggerStepThroughAttribute()]
-  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientGroupMapping", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class ClientGroupMapping : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+  [System.Runtime.Serialization.DataContractAttribute(Name = "UserGroupMapping", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class UserGroupMapping : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
     [System.NonSerializedAttribute()]
@@ -948,8 +948,8 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
-  [System.Runtime.Serialization.DataContractAttribute(Name = "UserGroupMapping", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class UserGroupMapping : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+  [System.Runtime.Serialization.DataContractAttribute(Name = "ClientGroupMapping", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class ClientGroupMapping : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
     [System.NonSerializedAttribute()]
@@ -1011,4 +1011,13 @@
   public interface IAccessService {
 
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetLeightweightUsersAndGroups", ReplyAction = "http://tempuri.org/IAccessService/GetLeightweightUsersAndGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetLeightweightUsersAndGroups(System.Collections.Generic.List<System.Guid> ids);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUserGroupMapping", ReplyAction = "http://tempuri.org/IAccessService/GetUserGroupMappingResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupMapping> GetUserGroupMapping();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetRoles", ReplyAction = "http://tempuri.org/IAccessService/GetRolesResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetRoles();
+
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddRole", ReplyAction = "http://tempuri.org/IAccessService/AddRoleResponse")]
     HeuristicLab.Clients.Access.Role AddRole(HeuristicLab.Clients.Access.Role role);
@@ -1107,4 +1116,7 @@
     System.Collections.Generic.List<HeuristicLab.Clients.Access.LightweightUser> GetAllLightweightUsers();
 
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetLightweightUsers", ReplyAction = "http://tempuri.org/IAccessService/GetLightweightUsersResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.LightweightUser> GetLightweightUsers(System.Collections.Generic.List<System.Guid> ids);
+
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllUsers", ReplyAction = "http://tempuri.org/IAccessService/GetAllUsersResponse")]
     System.Collections.Generic.List<HeuristicLab.Clients.Access.User> GetAllUsers();
@@ -1158,9 +1170,6 @@
     System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetUsersAndGroups();
 
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUserGroupMapping", ReplyAction = "http://tempuri.org/IAccessService/GetUserGroupMappingResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupMapping> GetUserGroupMapping();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetRoles", ReplyAction = "http://tempuri.org/IAccessService/GetRolesResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetRoles();
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllLeightweightUsersAndGroups", ReplyAction = "http://tempuri.org/IAccessService/GetAllLeightweightUsersAndGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetAllLeightweightUsersAndGroups();
   }
 
@@ -1192,4 +1201,16 @@
     }
 
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetLeightweightUsersAndGroups(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetLeightweightUsersAndGroups(ids);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupMapping> GetUserGroupMapping() {
+      return base.Channel.GetUserGroupMapping();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetRoles() {
+      return base.Channel.GetRoles();
+    }
+
     public HeuristicLab.Clients.Access.Role AddRole(HeuristicLab.Clients.Access.Role role) {
       return base.Channel.AddRole(role);
@@ -1320,4 +1341,8 @@
     }
 
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.LightweightUser> GetLightweightUsers(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetLightweightUsers(ids);
+    }
+
     public System.Collections.Generic.List<HeuristicLab.Clients.Access.User> GetAllUsers() {
       return base.Channel.GetAllUsers();
@@ -1388,10 +1413,6 @@
     }
 
-    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupMapping> GetUserGroupMapping() {
-      return base.Channel.GetUserGroupMapping();
-    }
-
-    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetRoles() {
-      return base.Channel.GetRoles();
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetAllLeightweightUsersAndGroups() {
+      return base.Channel.GetAllLeightweightUsersAndGroups();
     }
   }
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs	(revision 7426)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Drawing;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -30,4 +31,8 @@
       FullName = original.FullName;
       UserName = original.UserName;
+    }
+
+    public static Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.User; }
     }
 
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs	(revision 7426)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs	(revision 7426)
@@ -0,0 +1,47 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+namespace HeuristicLab.Clients.Access {
+  [Item("UserGroup", "A group.")]
+  public partial class UserGroup {
+    protected UserGroup(UserGroup original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+    }
+
+    public static Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.UserAccounts; }
+    }
+
+    public UserGroup() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UserGroup(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+  }
+}
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroupBase.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroupBase.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroupBase.cs	(revision 7426)
@@ -36,4 +36,13 @@
       return new UserGroupBase(this, cloner);
     }
+
+    public override bool Equals(object obj) {
+      var o = obj as UserGroupBase;
+      if (o == null) {
+        return false;
+      } else {
+        return this.Id == o.Id;
+      }
+    }
   }
 }
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionDialog.Designer.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionDialog.Designer.cs	(revision 7426)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionDialog.Designer.cs	(revision 7426)
@@ -0,0 +1,90 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class LightweightUserGroupSelectionDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.OkButton = new System.Windows.Forms.Button();
+      this.CancelButton = new System.Windows.Forms.Button();
+      this.lightweightUserGroupSelectionView = new HeuristicLab.Clients.Access.Views.LightweightUserGroupSelectionView();
+      this.SuspendLayout();
+      // 
+      // OkButton
+      // 
+      this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.OkButton.Location = new System.Drawing.Point(374, 290);
+      this.OkButton.Name = "OkButton";
+      this.OkButton.Size = new System.Drawing.Size(75, 23);
+      this.OkButton.TabIndex = 1;
+      this.OkButton.Text = "OK";
+      this.OkButton.UseVisualStyleBackColor = true;
+      this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+      // 
+      // CancelButton
+      // 
+      this.CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.CancelButton.Location = new System.Drawing.Point(455, 290);
+      this.CancelButton.Name = "CancelButton";
+      this.CancelButton.Size = new System.Drawing.Size(75, 23);
+      this.CancelButton.TabIndex = 2;
+      this.CancelButton.Text = "Cancel";
+      this.CancelButton.UseVisualStyleBackColor = true;
+      // 
+      // lightweightUserGroupSelectionView
+      // 
+      this.lightweightUserGroupSelectionView.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.lightweightUserGroupSelectionView.Location = new System.Drawing.Point(12, 12);
+      this.lightweightUserGroupSelectionView.Name = "lightweightUserGroupSelectionView";
+      this.lightweightUserGroupSelectionView.Size = new System.Drawing.Size(518, 272);
+      this.lightweightUserGroupSelectionView.TabIndex = 0;
+      // 
+      // LightweightUserGroupSelectionDialog
+      // 
+      this.AcceptButton = this.OkButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(542, 325);
+      this.Controls.Add(this.CancelButton);
+      this.Controls.Add(this.OkButton);
+      this.Controls.Add(this.lightweightUserGroupSelectionView);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "LightweightUserGroupSelectionDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Select users and groups";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private LightweightUserGroupSelectionView lightweightUserGroupSelectionView;
+    private System.Windows.Forms.Button OkButton;
+    private System.Windows.Forms.Button CancelButton;
+  }
+}
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionDialog.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionDialog.cs	(revision 7426)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionDialog.cs	(revision 7426)
@@ -0,0 +1,44 @@
+﻿#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.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public partial class LightweightUserGroupSelectionDialog : Form {
+    private ItemList<UserGroupBase> selectedUsersAndGroups;
+    public ItemList<UserGroupBase> SelectedUsersAndGroups {
+      get {
+        return selectedUsersAndGroups;
+      }
+    }
+
+    public LightweightUserGroupSelectionDialog() {
+      InitializeComponent();
+    }
+
+    private void OkButton_Click(object sender, System.EventArgs e) {
+      selectedUsersAndGroups = lightweightUserGroupSelectionView.GetSelectedItems();
+      this.DialogResult = System.Windows.Forms.DialogResult.OK;
+      Close();
+    }
+  }
+}
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionView.Designer.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionView.Designer.cs	(revision 7426)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionView.Designer.cs	(revision 7426)
@@ -0,0 +1,94 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class LightweightUserGroupSelectionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Groups", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Users", System.Windows.Forms.HorizontalAlignment.Left);
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.detailsColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.SuspendLayout();
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.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.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.detailsColumnHeader});
+      this.itemsListView.FullRowSelect = true;
+      listViewGroup1.Header = "Groups";
+      listViewGroup1.Name = "groupsListViewGroup";
+      listViewGroup2.Header = "Users";
+      listViewGroup2.Name = "usersListViewGroup";
+      this.itemsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup1,
+            listViewGroup2});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 3);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.Size = new System.Drawing.Size(446, 308);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 0;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      // 
+      // detailsColumnHeader
+      // 
+      this.detailsColumnHeader.Text = "Details";
+      // 
+      // 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;
+      // 
+      // LightweightUserGroupSelectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.itemsListView);
+      this.Name = "LightweightUserGroupSelectionView";
+      this.Size = new System.Drawing.Size(452, 314);
+      this.Load += new System.EventHandler(this.LightweightUserGroupSelectionView_Load);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView itemsListView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ColumnHeader nameColumnHeader;
+    private System.Windows.Forms.ColumnHeader detailsColumnHeader;
+  }
+}
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionView.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionView.cs	(revision 7426)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserGroupSelectionView.cs	(revision 7426)
@@ -0,0 +1,98 @@
+﻿#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;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public sealed partial class LightweightUserGroupSelectionView : UserControl {
+    public LightweightUserGroupSelectionView() {
+      InitializeComponent();
+    }
+
+    public ItemList<UserGroupBase> GetSelectedItems() {
+      ItemList<UserGroupBase> result = new ItemList<UserGroupBase>();
+
+      foreach (var item in itemsListView.SelectedItems) {
+        UserGroupBase ugb = ((ListViewItem)item).Tag as UserGroupBase;
+        if (ugb != null) {
+          result.Add(ugb);
+        }
+      }
+      return result;
+    }
+
+    private void LightweightUserGroupSelectionView_Load(object sender, EventArgs e) {
+      if (!this.DesignMode && AccessClient.Instance.UsersAndGroups == null) {
+        AccessClient.Instance.Refreshing += new EventHandler(Instance_Refreshing);
+        AccessClient.Instance.Refreshed += new EventHandler(Instance_Refreshed);
+        AccessClient.Instance.RefreshAsync(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Refresh failed.", ex)));
+        AccessClient.Instance.Refreshing -= new EventHandler(Instance_Refreshing);
+        AccessClient.Instance.Refreshed -= new EventHandler(Instance_Refreshed);
+      }
+
+      if (AccessClient.Instance.UsersAndGroups != null) {
+        AccessClient.Instance.UsersAndGroups.ForEach(x => AddListViewItem(CreateListViewItem(x)));
+
+        foreach (ColumnHeader c in this.itemsListView.Columns) {
+          c.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        }
+      }
+    }
+
+    void Instance_Refreshed(object sender, EventArgs e) {
+      //TODO: show loading bar
+      if (AccessClient.Instance.UsersAndGroups != null)
+        this.itemsListView.Enabled = true;
+    }
+
+    void Instance_Refreshing(object sender, EventArgs e) {
+      this.itemsListView.Enabled = false;
+    }
+
+    private ListViewItem CreateListViewItem(UserGroupBase item) {
+      ListViewItem listViewItem = new ListViewItem();
+
+      listViewItem.Text = item.ToString();
+      itemsListView.SmallImageList.Images.Add(item.ItemImage);
+      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      listViewItem.Tag = item;
+      if (item is UserGroup) {
+        listViewItem.SubItems.Insert(0, new ListViewItem.ListViewSubItem(listViewItem, item.ToString()));
+        listViewItem.SubItems.Insert(1, new ListViewItem.ListViewSubItem(listViewItem, string.Empty));
+        listViewItem.Group = itemsListView.Groups[0];
+      } else if (item is LightweightUser) {
+        var lu = item as LightweightUser;
+        listViewItem.SubItems.Insert(0, new ListViewItem.ListViewSubItem(listViewItem, lu.UserName));
+        listViewItem.SubItems.Insert(1, new ListViewItem.ListViewSubItem(listViewItem, lu.FullName));
+        listViewItem.Group = itemsListView.Groups[1];
+      }
+
+      return listViewItem;
+    }
+
+    private void AddListViewItem(ListViewItem listViewItem) {
+      itemsListView.Items.Add(listViewItem);
+    }
+  }
+}
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserView.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserView.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/LightweightUserView.cs	(revision 7426)
@@ -22,5 +22,4 @@
 using System;
 using System.Windows.Forms;
-using HeuristicLab.Collections;
 using HeuristicLab.Core;
 using HeuristicLab.Core.Views;
@@ -29,12 +28,30 @@
 
 namespace HeuristicLab.Clients.Access.Views {
-
   [View("LightweightUser View")]
-  [Content(typeof(ReadOnlyCheckedItemList<LightweightUser>), true)]
-  public partial class LightweightUserView : CheckedItemListView<LightweightUser> {
+  [Content(typeof(ItemList<UserGroupBase>), true)]
+  public partial class LightweightUserView : ItemListView<UserGroupBase> {
     public LightweightUserView() {
       InitializeComponent();
       this.showDetailsCheckBox.Checked = false;
-      this.itemsGroupBox.Text = "Users";
+      this.itemsGroupBox.Text = "Users and Groups";
+    }
+
+    protected override void addButton_Click(object sender, System.EventArgs e) {
+      using (LightweightUserGroupSelectionDialog dlg = new LightweightUserGroupSelectionDialog()) {
+        DialogResult res = dlg.ShowDialog(this);
+        if (res == DialogResult.OK) {
+          dlg.SelectedUsersAndGroups.ForEach(x => {
+            if (!Content.Contains(x)) {
+              Content.Add(x);
+              OnSelectedUsersChanged();
+            }
+          });
+        }
+      }
+    }
+
+    protected override void removeButton_Click(object sender, EventArgs e) {
+      base.removeButton_Click(sender, e);
+      OnSelectedUsersChanged();
     }
 
@@ -42,9 +59,4 @@
       base.SetEnabledStateOfControls();
       this.showDetailsCheckBox.Enabled = false;
-    }
-
-    protected override void Content_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<LightweightUser>> e) {
-      base.Content_CheckedItemsChanged(sender, e);
-      OnSelectedUsersChanged();
     }
 
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/RefreshableLightweightUserView.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/RefreshableLightweightUserView.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/Views/RefreshableLightweightUserView.cs	(revision 7426)
@@ -22,4 +22,5 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Core;
@@ -57,10 +58,5 @@
       base.Content_Refreshed(sender, e);
 
-      var checkedUsers = new CheckedItemList<LightweightUser>(Content.Users);
-      checkedUsers.ForEach(u => {
-        int idx = checkedUsers.IndexOf(u);
-        checkedUsers.SetItemCheckedState(idx, selectedUsers.Contains(u.Id));
-      });
-      lightweightUserView.Content = checkedUsers.AsReadOnly();
+      lightweightUserView.Content = new ItemList<UserGroupBase>(Content.UsersAndGroups.Where(x => selectedUsers.Contains(x.Id)));
     }
 
@@ -70,5 +66,5 @@
     }
 
-    public ICheckedItemList<LightweightUser> GetCheckedUsers() {
+    public IItemList<UserGroupBase> GetCheckedUsers() {
       return (lightweightUserView.Content == null) ? null : lightweightUserView.Content;
     }
Index: /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs	(revision 7426)
@@ -397,5 +397,26 @@
       }
 
+      if (accessUserGuids.Count() != ids.Count()) {
+        throw new Exception("Couldn't find one or more users for the given user ids.");
+      }
+
       return accessUserGuids.Select(x => BuildUserDto(x));
+    }
+
+    public IEnumerable<DT.LightweightUser> GetLightweightUsers(IEnumerable<Guid> ids) {
+      List<Guid> accessUserGuids = null;
+
+      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
+        var query = from u in context.UserGroupBases.OfType<DA.User>()
+                    where ids.Contains(u.Id)
+                    select u.Id;
+        accessUserGuids = query.ToList();
+      }
+
+      if (accessUserGuids.Count() != ids.Count()) {
+        throw new Exception("Couldn't find one or more users for the given user ids.");
+      }
+
+      return accessUserGuids.Select(x => BuildLightweightUserDto(x));
     }
 
@@ -589,4 +610,51 @@
     #endregion
 
+    #region UserGroupBase
+    public IEnumerable<DT.UserGroupBase> GetAllLeightweightUsersAndGroups() {
+      List<DA.UserGroupBase> dbUserGroupsBases = new List<DA.UserGroupBase>();
+      List<DT.UserGroupBase> result = new List<DT.UserGroupBase>();
+
+      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
+        var query = from u in context.UserGroupBases
+                    select u;
+        dbUserGroupsBases = query.ToList();
+      }
+
+      foreach (var ugb in dbUserGroupsBases) {
+        if (ugb.GetType() == typeof(DA.User)) {
+          var user = BuildLightweightUserDto(ugb.Id);
+          result.Add(user);
+        } else if (ugb.GetType() == typeof(DA.UserGroup)) {
+          var group = Convert.ToDto(ugb as DA.UserGroup);
+          result.Add(group);
+        }
+      }
+      return result;
+    }
+
+    public IEnumerable<DT.UserGroupBase> GetLeightweightUsersAndGroups(IEnumerable<Guid> ids) {
+      List<DA.UserGroupBase> dbUserGroupsBases = new List<DA.UserGroupBase>();
+      List<DT.UserGroupBase> result = new List<DT.UserGroupBase>();
+
+      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
+        var query = from u in context.UserGroupBases
+                    where ids.Contains(u.Id)
+                    select u;
+        dbUserGroupsBases = query.ToList();
+      }
+
+      foreach (var ugb in dbUserGroupsBases) {
+        if (ugb.GetType() == typeof(DA.User)) {
+          var user = BuildLightweightUserDto(ugb.Id);
+          result.Add(user);
+        } else if (ugb.GetType() == typeof(DA.UserGroup)) {
+          var group = Convert.ToDto(ugb as DA.UserGroup);
+          result.Add(group);
+        }
+      }
+      return result;
+    }
+    #endregion
+
     #region Roles
     public IEnumerable<DT.Role> GetRoles() {
Index: /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/IAccessService.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/IAccessService.cs	(revision 7425)
+++ /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/IAccessService.cs	(revision 7426)
@@ -112,4 +112,7 @@
 
     [OperationContract]
+    IEnumerable<LightweightUser> GetLightweightUsers(IEnumerable<Guid> ids);
+
+    [OperationContract]
     IEnumerable<User> GetAllUsers();
 
@@ -165,4 +168,10 @@
     [OperationContract]
     IEnumerable<UserGroupBase> GetUsersAndGroups();
+
+    [OperationContract]
+    IEnumerable<UserGroupBase> GetAllLeightweightUsersAndGroups();
+
+    [OperationContract]
+    IEnumerable<UserGroupBase> GetLeightweightUsersAndGroups(IEnumerable<Guid> ids);
     #endregion
 
