Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/AccessClient.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/AccessClient.cs	(revision 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/AccessClient.cs	(revision 7436)
@@ -108,5 +108,5 @@
 
     #region Helpers
-    private static void CallRunCreationService(Action<IAccessService> call) {
+    public static void CallRunCreationService(Action<IAccessService> call) {
       AccessServiceClient client = ClientFactory.CreateClient<AccessServiceClient, IAccessService>();
       try {
@@ -122,5 +122,5 @@
       }
     }
-    private static T CallRunCreationService<T>(Func<IAccessService, T> call) {
+    public static T CallRunCreationService<T>(Func<IAccessService, T> call) {
       AccessServiceClient client = ClientFactory.CreateClient<AccessServiceClient, IAccessService>();
       try {
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 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj	(revision 7436)
@@ -104,4 +104,5 @@
     <Compile Include="ServiceClients\UserGroup.cs" />
     <Compile Include="ServiceClients\UserGroupBase.cs" />
+    <Compile Include="UserInformation.cs" />
     <Compile Include="Views\LightweightUserGroupSelectionDialog.cs">
       <SubType>Form</SubType>
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs	(revision 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs	(revision 7436)
@@ -17,7 +17,7 @@
       "")]
   [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))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroup))]
   public partial class UserGroupBase : HeuristicLab.Clients.Access.AccessItem {
 
@@ -55,7 +55,7 @@
   [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientLog))]
   [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))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.UserGroup))]
   public partial class AccessItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
 
@@ -671,4 +671,196 @@
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+  [System.Runtime.Serialization.DataContractAttribute(Name = "User", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class User : HeuristicLab.Clients.Access.UserGroupBase {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string CommentField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime CreationDateField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string EmailField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string FullNameField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private bool IsApprovedField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime LastActivityDateField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime LastLoginDateField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.DateTime LastPasswordChangedDateField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string UserNameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Comment {
+      get {
+        return this.CommentField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.CommentField, value) != true)) {
+          this.CommentField = value;
+          this.RaisePropertyChanged("Comment");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime CreationDate {
+      get {
+        return this.CreationDateField;
+      }
+      set {
+        if ((this.CreationDateField.Equals(value) != true)) {
+          this.CreationDateField = value;
+          this.RaisePropertyChanged("CreationDate");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string Email {
+      get {
+        return this.EmailField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.EmailField, value) != true)) {
+          this.EmailField = value;
+          this.RaisePropertyChanged("Email");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string FullName {
+      get {
+        return this.FullNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.FullNameField, value) != true)) {
+          this.FullNameField = value;
+          this.RaisePropertyChanged("FullName");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public bool IsApproved {
+      get {
+        return this.IsApprovedField;
+      }
+      set {
+        if ((this.IsApprovedField.Equals(value) != true)) {
+          this.IsApprovedField = value;
+          this.RaisePropertyChanged("IsApproved");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime LastActivityDate {
+      get {
+        return this.LastActivityDateField;
+      }
+      set {
+        if ((this.LastActivityDateField.Equals(value) != true)) {
+          this.LastActivityDateField = value;
+          this.RaisePropertyChanged("LastActivityDate");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime LastLoginDate {
+      get {
+        return this.LastLoginDateField;
+      }
+      set {
+        if ((this.LastLoginDateField.Equals(value) != true)) {
+          this.LastLoginDateField = value;
+          this.RaisePropertyChanged("LastLoginDate");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.DateTime LastPasswordChangedDate {
+      get {
+        return this.LastPasswordChangedDateField;
+      }
+      set {
+        if ((this.LastPasswordChangedDateField.Equals(value) != true)) {
+          this.LastPasswordChangedDateField = value;
+          this.RaisePropertyChanged("LastPasswordChangedDate");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string UserName {
+      get {
+        return this.UserNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.UserNameField, value) != true)) {
+          this.UserNameField = value;
+          this.RaisePropertyChanged("UserName");
+        }
+      }
+    }
+  }
+
+  [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" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class LightweightUser : HeuristicLab.Clients.Access.UserGroupBase {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string FullNameField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string UserNameField;
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string FullName {
+      get {
+        return this.FullNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.FullNameField, value) != true)) {
+          this.FullNameField = value;
+          this.RaisePropertyChanged("FullName");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public string UserName {
+      get {
+        return this.UserNameField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.UserNameField, value) != true)) {
+          this.UserNameField = value;
+          this.RaisePropertyChanged("UserName");
+        }
+      }
+    }
+  }
+
+  [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" +
       "")]
@@ -688,196 +880,4 @@
           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 = "User", Namespace = "http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Access.DataTransfer" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class User : HeuristicLab.Clients.Access.UserGroupBase {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string CommentField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime CreationDateField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string EmailField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string FullNameField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private bool IsApprovedField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime LastActivityDateField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime LastLoginDateField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private System.DateTime LastPasswordChangedDateField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string UserNameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Comment {
-      get {
-        return this.CommentField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.CommentField, value) != true)) {
-          this.CommentField = value;
-          this.RaisePropertyChanged("Comment");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime CreationDate {
-      get {
-        return this.CreationDateField;
-      }
-      set {
-        if ((this.CreationDateField.Equals(value) != true)) {
-          this.CreationDateField = value;
-          this.RaisePropertyChanged("CreationDate");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string Email {
-      get {
-        return this.EmailField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.EmailField, value) != true)) {
-          this.EmailField = value;
-          this.RaisePropertyChanged("Email");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string FullName {
-      get {
-        return this.FullNameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.FullNameField, value) != true)) {
-          this.FullNameField = value;
-          this.RaisePropertyChanged("FullName");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public bool IsApproved {
-      get {
-        return this.IsApprovedField;
-      }
-      set {
-        if ((this.IsApprovedField.Equals(value) != true)) {
-          this.IsApprovedField = value;
-          this.RaisePropertyChanged("IsApproved");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime LastActivityDate {
-      get {
-        return this.LastActivityDateField;
-      }
-      set {
-        if ((this.LastActivityDateField.Equals(value) != true)) {
-          this.LastActivityDateField = value;
-          this.RaisePropertyChanged("LastActivityDate");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime LastLoginDate {
-      get {
-        return this.LastLoginDateField;
-      }
-      set {
-        if ((this.LastLoginDateField.Equals(value) != true)) {
-          this.LastLoginDateField = value;
-          this.RaisePropertyChanged("LastLoginDate");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public System.DateTime LastPasswordChangedDate {
-      get {
-        return this.LastPasswordChangedDateField;
-      }
-      set {
-        if ((this.LastPasswordChangedDateField.Equals(value) != true)) {
-          this.LastPasswordChangedDateField = value;
-          this.RaisePropertyChanged("LastPasswordChangedDate");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string UserName {
-      get {
-        return this.UserNameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.UserNameField, value) != true)) {
-          this.UserNameField = value;
-          this.RaisePropertyChanged("UserName");
-        }
-      }
-    }
-  }
-
-  [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" +
-      "")]
-  [System.SerializableAttribute()]
-  public partial class LightweightUser : HeuristicLab.Clients.Access.UserGroupBase {
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string FullNameField;
-
-    [System.Runtime.Serialization.OptionalFieldAttribute()]
-    private string UserNameField;
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string FullName {
-      get {
-        return this.FullNameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.FullNameField, value) != true)) {
-          this.FullNameField = value;
-          this.RaisePropertyChanged("FullName");
-        }
-      }
-    }
-
-    [System.Runtime.Serialization.DataMemberAttribute()]
-    public string UserName {
-      get {
-        return this.UserNameField;
-      }
-      set {
-        if ((object.ReferenceEquals(this.UserNameField, value) != true)) {
-          this.UserNameField = value;
-          this.RaisePropertyChanged("UserName");
         }
       }
@@ -1011,4 +1011,10 @@
   public interface IAccessService {
 
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUsersAndGroups", ReplyAction = "http://tempuri.org/IAccessService/GetUsersAndGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetUsersAndGroups();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllLeightweightUsersAndGroups", ReplyAction = "http://tempuri.org/IAccessService/GetAllLeightweightUsersAndGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetAllLeightweightUsersAndGroups();
+
     [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);
@@ -1111,5 +1117,11 @@
 
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/Login", ReplyAction = "http://tempuri.org/IAccessService/LoginResponse")]
-    HeuristicLab.Clients.Access.User Login();
+    HeuristicLab.Clients.Access.LightweightUser Login();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetGroupsOfCurrentUser", ReplyAction = "http://tempuri.org/IAccessService/GetGroupsOfCurrentUserResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetGroupsOfCurrentUser();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetRolesOfCurrentUser", ReplyAction = "http://tempuri.org/IAccessService/GetRolesOfCurrentUserResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetRolesOfCurrentUser();
 
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllLightweightUsers", ReplyAction = "http://tempuri.org/IAccessService/GetAllLightweightUsersResponse")]
@@ -1166,10 +1178,4 @@
     [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/RemoveUserGroupBaseFromGroup", ReplyAction = "http://tempuri.org/IAccessService/RemoveUserGroupBaseFromGroupResponse")]
     void RemoveUserGroupBaseFromGroup(HeuristicLab.Clients.Access.UserGroupBase resource, HeuristicLab.Clients.Access.UserGroup group);
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUsersAndGroups", ReplyAction = "http://tempuri.org/IAccessService/GetUsersAndGroupsResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetUsersAndGroups();
-
-    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllLeightweightUsersAndGroups", ReplyAction = "http://tempuri.org/IAccessService/GetAllLeightweightUsersAndGroupsResponse")]
-    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetAllLeightweightUsersAndGroups();
   }
 
@@ -1201,4 +1207,12 @@
     }
 
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetUsersAndGroups() {
+      return base.Channel.GetUsersAndGroups();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetAllLeightweightUsersAndGroups() {
+      return base.Channel.GetAllLeightweightUsersAndGroups();
+    }
+
     public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetLeightweightUsersAndGroups(System.Collections.Generic.List<System.Guid> ids) {
       return base.Channel.GetLeightweightUsersAndGroups(ids);
@@ -1333,6 +1347,14 @@
     }
 
-    public HeuristicLab.Clients.Access.User Login() {
+    public HeuristicLab.Clients.Access.LightweightUser Login() {
       return base.Channel.Login();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetGroupsOfCurrentUser() {
+      return base.Channel.GetGroupsOfCurrentUser();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetRolesOfCurrentUser() {
+      return base.Channel.GetRolesOfCurrentUser();
     }
 
@@ -1408,12 +1430,4 @@
       base.Channel.RemoveUserGroupBaseFromGroup(resource, group);
     }
-
-    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroupBase> GetUsersAndGroups() {
-      return base.Channel.GetUsersAndGroups();
-    }
-
-    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 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs	(revision 7436)
@@ -33,5 +33,5 @@
     }
 
-    public static Image StaticItemImage {
+    public static new 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 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs	(revision 7436)
@@ -31,5 +31,5 @@
     }
 
-    public static Image StaticItemImage {
+    public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.UserAccounts; }
     }
Index: /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/UserInformation.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/UserInformation.cs	(revision 7436)
+++ /branches/ClientUserManagement/HeuristicLab.Clients.Access/3.3/UserInformation.cs	(revision 7436)
@@ -0,0 +1,129 @@
+﻿#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.Collections.Generic;
+using System.ServiceModel.Security;
+using HeuristicLab.Clients.Common.Properties;
+
+namespace HeuristicLab.Clients.Access {
+  public sealed class UserInformation {
+    private static UserInformation instance;
+    public static UserInformation Instance {
+      get {
+        if (instance == null) instance = new UserInformation();
+        return instance;
+      }
+    }
+
+    private string userName;
+    public string UserName {
+      get { return userName; }
+    }
+
+    private bool userExists = false;
+    public bool UserExists {
+      get { return userExists; }
+    }
+
+    private LightweightUser user;
+    public LightweightUser User {
+      get { return user; }
+    }
+
+    //the groups a user is in
+    private List<UserGroup> groups;
+    public List<UserGroup> Groups {
+      get { return groups; }
+    }
+
+    //the roles a user has
+    private List<Role> roles;
+    public List<Role> Roles {
+      get { return roles; }
+    }
+
+    private bool errorOccured;
+    public bool ErrorOccured {
+      get { return errorOccured; }
+    }
+
+    private Exception occuredException;
+    public Exception OccuredException {
+      get { return occuredException; }
+    }
+
+    private bool isInitialized = false;
+
+    public static void Initialize() {
+      if (!Instance.isInitialized) {
+        FetchUserInformationFromServerAsync();
+      }
+    }
+
+    private UserInformation() {
+      if (!Instance.isInitialized) {
+        //this blocks, so there should be anywhere in the Optimizer startup process
+        //a call to FetchUserInformationFromServerAsync which is non-blocking
+        FetchUserInformationFromServer();
+      }
+    }
+
+
+    private void FetchUserInformationFromServer() {
+      userName = Settings.Default.UserName;
+
+      try {
+        AccessClient.CallRunCreationService(x => user = x.Login());
+        AccessClient.CallRunCreationService(x => groups = x.GetGroupsOfCurrentUser());
+        AccessClient.CallRunCreationService(x => roles = x.GetRolesOfCurrentUser());
+      }
+      catch (MessageSecurityException e) {
+        //wrong username or password
+        errorOccured = false;
+        userExists = false;
+        isInitialized = true;
+        occuredException = e;
+        return;
+      }
+      catch (Exception e) {
+        errorOccured = true;
+        userExists = false;
+        isInitialized = false;
+        occuredException = e;
+        return;
+      }
+
+      errorOccured = false;
+      userExists = true;
+      isInitialized = true;
+      occuredException = null;
+    }
+
+    private static void FetchUserInformationFromServerAsync() {
+      throw new NotImplementedException();
+    }
+
+    public void Refresh() {
+      FetchUserInformationFromServer();
+    }
+  }
+}
Index: /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs	(revision 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs	(revision 7436)
@@ -359,8 +359,35 @@
     }
 
-    public DT.User Login() {
+    public DT.LightweightUser Login() {
       Guid userId = UserManager.CurrentUserId;
-      return BuildUserDto(userId);
-    }
+      return BuildLightweightUserDto(userId);
+    }
+
+    public IEnumerable<DT.UserGroup> GetGroupsOfCurrentUser() {
+      Guid userId = UserManager.CurrentUserId;
+
+      using (DA.ClientManagementDataContext context = new DA.ClientManagementDataContext()) {
+        //TODO: this has to be done recursive, so check if a group is in another 
+        //group because then the user is also in this group...
+        var query = from g in context.UserGroupUserGroups
+                    from ug in context.UserGroupBases.OfType<DA.UserGroup>()
+                    where g.UserGroupId == userId && g.UserGroupUserGroupId == ug.Id
+                    select Convert.ToDto(ug);
+        return query.ToList();
+      }
+    }
+
+    public IEnumerable<DT.Role> GetRolesOfCurrentUser() {
+      Guid userId = UserManager.CurrentUserId;
+
+      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
+        var query = from ur in context.aspnet_UsersInRoles
+                    from r in context.aspnet_Roles
+                    where ur.UserId == userId && ur.RoleId == r.RoleId
+                    select Convert.ToDto(r);
+        return query.ToList();
+      }
+    }
+
 
     public IEnumerable<DT.LightweightUser> GetAllLightweightUsers() {
Index: /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/IAccessService.cs
===================================================================
--- /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/IAccessService.cs	(revision 7435)
+++ /branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/IAccessService.cs	(revision 7436)
@@ -106,5 +106,11 @@
     //TODO: i don't think this method is needed
     [OperationContract]
-    User Login();
+    LightweightUser Login();
+
+    [OperationContract]
+    IEnumerable<UserGroup> GetGroupsOfCurrentUser();
+
+    [OperationContract]
+    IEnumerable<Role> GetRolesOfCurrentUser();
 
     [OperationContract]
