Index: /trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- /trunk/sources/HeuristicLab 3.3.sln	(revision 8041)
+++ /trunk/sources/HeuristicLab 3.3.sln	(revision 8042)
@@ -318,4 +318,10 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.DebugEngine.Views-3.3", "HeuristicLab.DebugEngine.Views\3.3\HeuristicLab.DebugEngine.Views-3.3.csproj", "{847A8DAE-DB95-4CEE-B48B-EFEE4531D611}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Access-3.3", "HeuristicLab.Clients.Access\3.3\HeuristicLab.Clients.Access-3.3.csproj", "{494F87F4-0F25-4D33-A382-10CDB2174D48}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Access.Views-3.3", "HeuristicLab.Clients.Access.Views\3.3\HeuristicLab.Clients.Access.Views-3.3.csproj", "{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Access.Administration-3.3", "HeuristicLab.Clients.Access.Administration\3.3\HeuristicLab.Clients.Access.Administration-3.3.csproj", "{C9CF6AE8-4637-4A75-9141-042F479B5D50}"
 EndProject
 Global
@@ -1553,4 +1559,40 @@
 		{847A8DAE-DB95-4CEE-B48B-EFEE4531D611}.Release|x86.ActiveCfg = Release|x86
 		{847A8DAE-DB95-4CEE-B48B-EFEE4531D611}.Release|x86.Build.0 = Release|x86
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Debug|x64.ActiveCfg = Debug|x64
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Debug|x64.Build.0 = Debug|x64
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Debug|x86.ActiveCfg = Debug|x86
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Debug|x86.Build.0 = Debug|x86
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Release|Any CPU.Build.0 = Release|Any CPU
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Release|x64.ActiveCfg = Release|x64
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Release|x64.Build.0 = Release|x64
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Release|x86.ActiveCfg = Release|x86
+		{494F87F4-0F25-4D33-A382-10CDB2174D48}.Release|x86.Build.0 = Release|x86
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Debug|x64.ActiveCfg = Debug|x64
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Debug|x64.Build.0 = Debug|x64
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Debug|x86.ActiveCfg = Debug|x86
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Debug|x86.Build.0 = Debug|x86
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Release|x64.ActiveCfg = Release|x64
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Release|x64.Build.0 = Release|x64
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Release|x86.ActiveCfg = Release|x86
+		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}.Release|x86.Build.0 = Release|x86
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Debug|x64.ActiveCfg = Debug|x64
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Debug|x64.Build.0 = Debug|x64
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Debug|x86.ActiveCfg = Debug|x86
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Debug|x86.Build.0 = Debug|x86
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Release|x64.ActiveCfg = Release|x64
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Release|x64.Build.0 = Release|x64
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Release|x86.ActiveCfg = Release|x86
+		{C9CF6AE8-4637-4A75-9141-042F479B5D50}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/AccessAdministrationClient.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/AccessAdministrationClient.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/AccessAdministrationClient.cs	(revision 8042)
@@ -0,0 +1,224 @@
+﻿#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 HeuristicLab.Clients.Common;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [Item("AccessAdministrationClient", "AccessAdministration client.")]
+  public class AccessAdministrationClient : IContent {
+    private static AccessAdministrationClient instance;
+    public static AccessAdministrationClient Instance {
+      get {
+        if (instance == null) instance = new AccessAdministrationClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private ItemList<User> users;
+    public ItemList<User> Users {
+      get {
+        return users;
+      }
+    }
+
+    public ItemList<UserGroup> Groups { get; set; }
+    public ItemList<Role> Roles { get; set; }
+    #endregion
+
+    private AccessAdministrationClient() { }
+
+    #region Refresh
+    public void RefreshUsers() {
+      users = new ItemList<User>();
+      users.AddRange(CallAccessService<ItemList<User>>(s => new ItemList<User>(s.GetAllUsers())));
+    }
+
+    public void RefreshUsersAsync(Action<Exception> exceptionCallback) {
+      ExecuteActionAsync(RefreshUsers, exceptionCallback);
+    }
+
+    public void RefreshUserGroups() {
+      Groups = new ItemList<UserGroup>();
+      Groups.AddRange(CallAccessService<ItemList<UserGroup>>(s => new ItemList<UserGroup>(s.GetAllUserGroups())));
+    }
+
+    public void RefreshUserGroupsAsync(Action<Exception> exceptionCallback) {
+      ExecuteActionAsync(RefreshUserGroups, exceptionCallback);
+    }
+
+    public void RefreshRoles() {
+      Roles = new ItemList<Role>();
+      Roles.AddRange(CallAccessService<ItemList<Role>>(s => new ItemList<Role>(s.GetRoles())));
+    }
+
+    public void RefreshRolesAsync(Action<Exception> exceptionCallback) {
+      ExecuteActionAsync(RefreshRoles, exceptionCallback);
+    }
+
+    #endregion
+
+    #region Store
+    public void StoreUsers() {
+      foreach (User u in users) {
+        if (u.Modified) {
+          if (u.Id == Guid.Empty) {
+            CallAccessService(s => u.Id = s.AddUser(u).Id);
+          } else {
+            CallAccessService(s => s.UpdateUser(u));
+          }
+          u.SetUnmodified();
+        }
+      }
+    }
+
+    public void StoreUsersAsync(Action<Exception> exceptionCallback) {
+      ExecuteActionAsync(StoreUsers, exceptionCallback);
+    }
+
+    public void StoreUserGroups() {
+      foreach (UserGroup g in Groups) {
+        if (g.Modified) {
+          if (g.Id == Guid.Empty) {
+            CallAccessService(s => g.Id = s.AddUserGroup(g));
+          } else {
+            CallAccessService(s => s.UpdateUserGroup(g));
+          }
+          g.SetUnmodified();
+        }
+      }
+    }
+
+    public void StoreUserGroupsAsync(Action<Exception> exceptionCallback) {
+      ExecuteActionAsync(StoreUserGroups, exceptionCallback);
+    }
+
+    public void StoreRoles() {
+      foreach (Role g in Roles) {
+        if (g.Modified) {
+          CallAccessService(s => s.AddRole(g));
+          g.SetUnmodified();
+        }
+      }
+    }
+
+    public void StoreRolesAsync(Action<Exception> exceptionCallback) {
+      ExecuteActionAsync(StoreRoles, exceptionCallback);
+    }
+    #endregion
+
+    #region Delete
+    public void DeleteUser(User u) {
+      CallAccessService(s => s.DeleteUser(u));
+    }
+
+    public void DeleteUserAsync(User u, Action<Exception> exceptionCallback) {
+      Action deleteUserAction = new Action(delegate { DeleteUser(u); });
+      ExecuteActionAsync(deleteUserAction, exceptionCallback);
+    }
+
+    public void DeleteUserGroup(UserGroup u) {
+      CallAccessService(s => s.DeleteUserGroup(u));
+    }
+
+    public void DeleteUserGroupAsync(UserGroup u, Action<Exception> exceptionCallback) {
+      Action deleteUserGroupAction = new Action(delegate { DeleteUserGroup(u); });
+      ExecuteActionAsync(deleteUserGroupAction, exceptionCallback);
+    }
+
+    public void DeleteRole(Role u) {
+      CallAccessService(s => s.DeleteRole(u));
+    }
+
+    public void DeleteRoleAsync(Role u, Action<Exception> exceptionCallback) {
+      Action deleteRoleAction = new Action(delegate { DeleteRole(u); });
+      ExecuteActionAsync(deleteRoleAction, exceptionCallback);
+    }
+    #endregion
+
+    public void ExecuteActionAsync(Action action, Action<Exception> exceptionCallback) {
+      var call = new Func<Exception>(delegate() {
+        try {
+          OnRefreshing();
+          action();
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+        finally {
+          OnRefreshed();
+        }
+        return null;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) exceptionCallback(ex);
+      }, null);
+    }
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      EventHandler handler = Refreshed;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Helpers
+    public static void CallAccessService(Action<IAccessService> call) {
+      AccessServiceClient client = ClientFactory.CreateClient<AccessServiceClient, IAccessService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    public static T CallAccessService<T>(Func<IAccessService, T> call) {
+      AccessServiceClient client = ClientFactory.CreateClient<AccessServiceClient, IAccessService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/HeuristicLab.Clients.Access.Administration-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/HeuristicLab.Clients.Access.Administration-3.3.csproj	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/HeuristicLab.Clients.Access.Administration-3.3.csproj	(revision 8042)
@@ -0,0 +1,315 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C9CF6AE8-4637-4A75-9141-042F479B5D50}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Clients.Access.Administration</RootNamespace>
+    <AssemblyName>HeuristicLab.Clients.Access.Administration-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AccessAdministrationClient.cs" />
+    <Compile Include="MenuItems\UserAdministrationMenuItem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Views\PasswordDisplayDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Views\PasswordDisplayDialog.Designer.cs">
+      <DependentUpon>PasswordDisplayDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RefreshableRoleSelectionListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RefreshableRoleSelectionListView.Designer.cs">
+      <DependentUpon>RefreshableRoleSelectionListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RoleSelectionListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RoleSelectionListView.Designer.cs">
+      <DependentUpon>RoleSelectionListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RefreshableRoleListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RefreshableRoleListView.Designer.cs">
+      <DependentUpon>RefreshableRoleListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RoleListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RoleListView.Designer.cs">
+      <DependentUpon>RoleListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\UserGroupListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\UserGroupListView.Designer.cs">
+      <DependentUpon>UserGroupListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RefreshableUserGroupListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RefreshableUserGroupListView.Designer.cs">
+      <DependentUpon>RefreshableUserGroupListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\UserGroupView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\UserGroupView.Designer.cs">
+      <DependentUpon>UserGroupView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RoleView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RoleView.Designer.cs">
+      <DependentUpon>RoleView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RefreshableUserListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RefreshableUserListView.Designer.cs">
+      <DependentUpon>RefreshableUserListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RefreshableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RefreshableView.Designer.cs">
+      <DependentUpon>RefreshableView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\UserAdministrationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Views\UserAdministrationDialog.Designer.cs">
+      <DependentUpon>UserAdministrationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\UserListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\UserListView.Designer.cs">
+      <DependentUpon>UserListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\UserView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\UserView.Designer.cs">
+      <DependentUpon>UserView.cs</DependentUpon>
+    </Compile>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Access.Views\3.3\HeuristicLab.Clients.Access.Views-3.3.csproj">
+      <Project>{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}</Project>
+      <Name>HeuristicLab.Clients.Access.Views-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Access\3.3\HeuristicLab.Clients.Access-3.3.csproj">
+      <Project>{494F87F4-0F25-4D33-A382-10CDB2174D48}</Project>
+      <Name>HeuristicLab.Clients.Access-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Common\3.3\HeuristicLab.Clients.Common-3.3.csproj">
+      <Project>{730A9104-D4D1-4360-966B-E49B7571DDA3}</Project>
+      <Name>HeuristicLab.Clients.Common-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimizer\3.3\HeuristicLab.Optimizer-3.3.csproj">
+      <Project>{C664305E-497C-4533-A140-967DEDB05C19}</Project>
+      <Name>HeuristicLab.Optimizer-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>True</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/MenuItems/UserAdministrationMenuItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/MenuItems/UserAdministrationMenuItem.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/MenuItems/UserAdministrationMenuItem.cs	(revision 8042)
@@ -0,0 +1,42 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Optimizer;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  public class UserAdministrationMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&User Administration"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Services", "&Access" }; }
+    }
+    public override void Execute() {
+      using (UserAdministrationDialog dialog = new UserAdministrationDialog()) {
+        dialog.ShowDialog();
+      }
+    }
+    public override int Position {
+      get { return 10000; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Plugin.cs.frame	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Plugin.cs.frame	(revision 8042)
@@ -0,0 +1,43 @@
+﻿#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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Clients.Access.Administration plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Clients.Access.Administration", "3.3.6.$WCREV$")]
+  [PluginFile("HeuristicLab.Clients.Access.Administration-3.3.dll", PluginFileType.Assembly)]  
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]  
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Optimizer", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]  
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]  
+  [PluginDependency("HeuristicLab.Clients.Access", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Access.Views", "3.3")] 
+  public class HeuristicLabClientsAccessAdministrationPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Properties/AssemblyInfo.cs.frame	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Properties/AssemblyInfo.cs.frame	(revision 8042)
@@ -0,0 +1,57 @@
+﻿#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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.Access.Administration")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7032d7ba-4799-4708-803d-9f6cb3feed35")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/PasswordDisplayDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/PasswordDisplayDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/PasswordDisplayDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,88 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class PasswordDisplayDialog {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.passwordTextbox = new System.Windows.Forms.TextBox();
+      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(230, 32);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(84, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "New Password: ";
+      // 
+      // passwordTextbox
+      // 
+      this.passwordTextbox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.passwordTextbox.Location = new System.Drawing.Point(102, 6);
+      this.passwordTextbox.Name = "passwordTextbox";
+      this.passwordTextbox.Size = new System.Drawing.Size(203, 20);
+      this.passwordTextbox.TabIndex = 2;
+      // 
+      // PasswordDisplayDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(317, 64);
+      this.Controls.Add(this.passwordTextbox);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.MinimumSize = new System.Drawing.Size(333, 102);
+      this.Name = "PasswordDisplayDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "New Password";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox passwordTextbox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/PasswordDisplayDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/PasswordDisplayDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/PasswordDisplayDialog.cs	(revision 8042)
@@ -0,0 +1,46 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  public partial class PasswordDisplayDialog : Form {
+
+    private string password;
+    public string Password {
+      get { return password; }
+      set {
+        password = value;
+        passwordTextbox.Text = password;
+      }
+    }
+
+
+    public PasswordDisplayDialog() {
+      InitializeComponent();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.Designer.cs	(revision 8042)
@@ -0,0 +1,75 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RefreshableRoleListView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableRoleListView));
+      this.roleListView = new HeuristicLab.Clients.Access.Administration.RoleListView();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // roleListView
+      // 
+      this.roleListView.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.roleListView.Caption = "UserList View";
+      this.roleListView.Content = null;
+      this.roleListView.Location = new System.Drawing.Point(3, 33);
+      this.roleListView.Name = "roleListView";
+      this.roleListView.ReadOnly = false;
+      this.roleListView.Size = new System.Drawing.Size(559, 375);
+      this.roleListView.TabIndex = 2;
+      // 
+      // storeButton
+      // 
+      this.storeButton.Enabled = false;
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(33, 3);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 3;
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // RefreshableRoleListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.roleListView);
+      this.Controls.Add(this.storeButton);
+      this.Name = "RefreshableRoleListView";
+      this.Size = new System.Drawing.Size(565, 411);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.roleListView, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private RoleListView roleListView;
+    private System.Windows.Forms.Button storeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.cs	(revision 8042)
@@ -0,0 +1,77 @@
+﻿#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;
+namespace HeuristicLab.Clients.Access.Administration {
+  public partial class RefreshableRoleListView : RefreshableView {
+    public RefreshableRoleListView() {
+      InitializeComponent();
+    }
+
+    protected override void RefreshData() {
+      Content.RefreshRolesAsync(PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+
+    protected override void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        base.Content_Refreshing(sender, e);
+        roleListView.Enabled = false;
+        storeButton.Enabled = false;
+        if (Content.Roles != null) {
+          Content.Roles.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Role>>(Roles_ItemsRemoved);
+        }
+      }
+    }
+
+    protected override void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        base.Content_Refreshed(sender, e);
+        roleListView.Enabled = true;
+        storeButton.Enabled = true;
+        roleListView.Content = Content.Roles;
+        if (Content.Roles != null) {
+          Content.Roles.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Role>>(Roles_ItemsRemoved);
+        }
+      }
+    }
+
+    protected override void DeregisterContentEvents() {
+      if (Content.Roles != null) {
+        Content.Roles.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Role>>(Roles_ItemsRemoved);
+      }
+      base.DeregisterContentEvents();
+    }
+
+    void Roles_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Role>> e) {
+      foreach (var u in e.Items) {
+        Content.DeleteRoleAsync(u.Value, PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+      }
+    }
+
+    private void storeButton_Click(object sender, EventArgs e) {
+      Content.StoreRolesAsync(PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleSelectionListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleSelectionListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleSelectionListView.Designer.cs	(revision 8042)
@@ -0,0 +1,75 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RefreshableRoleSelectionListView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableRoleSelectionListView));
+      this.storeButton = new System.Windows.Forms.Button();
+      this.roleSelectionListView = new HeuristicLab.Clients.Access.Administration.RoleSelectionListView();
+      this.SuspendLayout();
+      // 
+      // storeButton
+      // 
+      this.storeButton.Enabled = false;
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(33, 3);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 3;
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // roleSelectionListView
+      // 
+      this.roleSelectionListView.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.roleSelectionListView.Caption = "RoleSelectionList View";
+      this.roleSelectionListView.Content = null;
+      this.roleSelectionListView.Location = new System.Drawing.Point(3, 33);
+      this.roleSelectionListView.Name = "roleSelectionListView";
+      this.roleSelectionListView.ReadOnly = false;
+      this.roleSelectionListView.Size = new System.Drawing.Size(559, 375);
+      this.roleSelectionListView.TabIndex = 4;
+      // 
+      // RefreshableRoleSelectionListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.storeButton);
+      this.Controls.Add(this.roleSelectionListView);
+      this.Name = "RefreshableRoleSelectionListView";
+      this.Size = new System.Drawing.Size(565, 411);
+      this.Controls.SetChildIndex(this.roleSelectionListView, 0);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button storeButton;
+    private RoleSelectionListView roleSelectionListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleSelectionListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleSelectionListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleSelectionListView.cs	(revision 8042)
@@ -0,0 +1,114 @@
+﻿#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.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  public partial class RefreshableRoleSelectionListView : RefreshableView {
+    public RefreshableRoleSelectionListView() {
+      InitializeComponent();
+    }
+
+    public List<Role> CurrentRoles = new List<Role>();
+
+    private User currentUser;
+    public User CurrentUser {
+      get { return currentUser; }
+      set {
+        currentUser = value;
+        roleSelectionListView.Content = null;
+        storeButton.Enabled = false;
+      }
+    }
+
+    protected override void RefreshData() {
+      if (CurrentUser != null) {
+        Content.ExecuteActionAsync(new Action(delegate {
+          if (Content.Roles == null) {
+            Content.RefreshRoles();
+          }
+          CurrentRoles = AccessAdministrationClient.CallAccessService<List<Role>>(s => s.GetUserRoles(CurrentUser));
+        }), PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+      }
+    }
+
+    protected override void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        base.Content_Refreshing(sender, e);
+        storeButton.Enabled = false;
+        roleSelectionListView.Enabled = false;
+      }
+    }
+
+    protected override void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        base.Content_Refreshed(sender, e);
+        if (Content.Roles != null) {
+          roleSelectionListView.Enabled = true;
+          storeButton.Enabled = true;
+
+          roleSelectionListView.Content = new ItemList<Role>(Content.Roles);
+          foreach (var role in CurrentRoles) {
+            foreach (ListViewItem lstRole in roleSelectionListView.ItemsListView.Items) {
+              if (((Role)lstRole.Tag).Equals(role)) {
+                lstRole.Checked = true;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    private void storeButton_Click(object sender, EventArgs e) {
+      List<Role> addedRoles = new List<Role>();
+      List<Role> deletedRoles = new List<Role>();
+
+      foreach (ListViewItem lstRole in roleSelectionListView.ItemsListView.Items) {
+        if (!CurrentRoles.Contains(((Role)lstRole.Tag)) && lstRole.Checked) {
+          addedRoles.Add((Role)lstRole.Tag);
+          CurrentRoles.Add((Role)lstRole.Tag);
+        }
+
+        if (CurrentRoles.Contains(((Role)lstRole.Tag)) && !lstRole.Checked) {
+          deletedRoles.Add((Role)lstRole.Tag);
+          CurrentRoles.Remove((Role)lstRole.Tag);
+        }
+      }
+
+      Content.ExecuteActionAsync(new Action(delegate {
+        foreach (var role in addedRoles) {
+          AccessAdministrationClient.CallAccessService(s => s.AddUserToRole(role, CurrentUser));
+        }
+
+        foreach (var role in deletedRoles) {
+          AccessAdministrationClient.CallAccessService(s => s.RemoveUserFromRole(role, CurrentUser));
+        }
+      }), PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserGroupListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserGroupListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserGroupListView.Designer.cs	(revision 8042)
@@ -0,0 +1,76 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RefreshableUserGroupListView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableUserGroupListView));
+      this.userGroupListView = new HeuristicLab.Clients.Access.Administration.UserGroupListView();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // userGroupListView
+      // 
+      this.userGroupListView.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.userGroupListView.Caption = "UserGroupList View";
+      this.userGroupListView.Content = null;
+      this.userGroupListView.Location = new System.Drawing.Point(3, 33);
+      this.userGroupListView.Name = "userGroupListView";
+      this.userGroupListView.ReadOnly = false;
+      this.userGroupListView.Size = new System.Drawing.Size(559, 375);
+      this.userGroupListView.TabIndex = 2;
+      // 
+      // storeButton
+      // 
+      this.storeButton.Enabled = false;
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(33, 3);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 4;
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // RefreshableUserGroupListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.storeButton);
+      this.Controls.Add(this.userGroupListView);
+      this.Name = "RefreshableUserGroupListView";
+      this.Size = new System.Drawing.Size(565, 411);
+      this.Controls.SetChildIndex(this.userGroupListView, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private UserGroupListView userGroupListView;
+    private System.Windows.Forms.Button storeButton;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserGroupListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserGroupListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserGroupListView.cs	(revision 8042)
@@ -0,0 +1,77 @@
+﻿#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;
+namespace HeuristicLab.Clients.Access.Administration {
+  public partial class RefreshableUserGroupListView : RefreshableView {
+    public RefreshableUserGroupListView() {
+      InitializeComponent();
+    }
+
+    protected override void RefreshData() {
+      Content.RefreshUserGroupsAsync(PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+
+    protected override void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        base.Content_Refreshing(sender, e);
+        userGroupListView.Enabled = false;
+        storeButton.Enabled = false;
+        if (Content.Groups != null) {
+          Content.Groups.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<UserGroup>>(Groups_ItemsRemoved);
+        }
+      }
+    }
+
+    protected override void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        base.Content_Refreshed(sender, e);
+        userGroupListView.Enabled = true;
+        storeButton.Enabled = true;
+        userGroupListView.Content = Content.Groups;
+        if (Content.Groups != null) {
+          Content.Groups.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<UserGroup>>(Groups_ItemsRemoved);
+        }
+      }
+    }
+
+    void Groups_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<UserGroup>> e) {
+      foreach (var u in e.Items) {
+        Content.DeleteUserGroupAsync(u.Value, PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+      }
+    }
+
+    protected override void DeregisterContentEvents() {
+      if (Content.Groups != null) {
+        Content.Groups.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<UserGroup>>(Groups_ItemsRemoved);
+      }
+      base.DeregisterContentEvents();
+    }
+
+    private void storeButton_Click(object sender, EventArgs e) {
+      Content.StoreUserGroupsAsync(PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserListView.Designer.cs	(revision 8042)
@@ -0,0 +1,74 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RefreshableUserListView {
+    /// <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.userListView = new HeuristicLab.Clients.Access.Administration.UserListView();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // userListView
+      // 
+      this.userListView.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.userListView.Caption = "UserList View";
+      this.userListView.Content = null;
+      this.userListView.Location = new System.Drawing.Point(3, 33);
+      this.userListView.Name = "userListView";
+      this.userListView.ReadOnly = false;
+      this.userListView.Size = new System.Drawing.Size(559, 375);
+      this.userListView.TabIndex = 2;
+      // 
+      // storeButton
+      // 
+      this.storeButton.Enabled = false;
+      this.storeButton.Location = new System.Drawing.Point(33, 3);
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 3;
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // RefreshableUserListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.userListView);
+      this.Controls.Add(this.storeButton);
+      this.Name = "RefreshableUserListView";
+      this.Size = new System.Drawing.Size(565, 411);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.userListView, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private UserListView userListView;
+    private System.Windows.Forms.Button storeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableUserListView.cs	(revision 8042)
@@ -0,0 +1,79 @@
+﻿#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;
+namespace HeuristicLab.Clients.Access.Administration {
+  public partial class RefreshableUserListView : RefreshableView {
+    public RefreshableUserListView() {
+      InitializeComponent();
+    }
+
+    protected override void RefreshData() {
+      Content.RefreshUsersAsync(PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+
+    protected override void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        base.Content_Refreshing(sender, e);
+        userListView.Enabled = false;
+        storeButton.Enabled = false;
+        if (Content.Users != null) {
+          Content.Users.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<User>>(Users_ItemsRemoved);
+        }
+      }
+    }
+
+    protected override void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        base.Content_Refreshed(sender, e);
+        userListView.Enabled = true;
+        storeButton.Enabled = true;
+        userListView.Content = Content.Users;
+        if (Content.Users != null) {
+          Content.Users.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<User>>(Users_ItemsRemoved);
+        }
+      }
+    }
+
+    protected override void DeregisterContentEvents() {
+      if (Content.Users != null) {
+        Content.Users.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<User>>(Users_ItemsRemoved);
+      }
+      base.DeregisterContentEvents();
+    }
+
+    void Users_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<User>> e) {
+      foreach (var u in e.Items) {
+        if (u.Value.Id != Guid.Empty) {
+          Content.DeleteUserAsync(u.Value, PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+        }
+      }
+    }
+
+    private void storeButton_Click(object sender, EventArgs e) {
+      Content.StoreUsersAsync(PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableView.Designer.cs	(revision 8042)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RefreshableView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableView));
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshButton.Location = new System.Drawing.Point(3, 3);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // RefreshableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshButton);
+      this.Name = "RefreshableView";
+      this.Size = new System.Drawing.Size(506, 254);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button refreshButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableView.cs	(revision 8042)
@@ -0,0 +1,80 @@
+﻿#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.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("Refreshable View")]
+  [Content(typeof(AccessAdministrationClient), true)]
+  public partial class RefreshableView : AsynchronousContentView {
+    public new AccessAdministrationClient Content {
+      get { return (AccessAdministrationClient)base.Content; }
+      set { base.Content = value; }
+    }
+    public RefreshableView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Refreshing -= new EventHandler(Content_Refreshing);
+      Content.Refreshed -= new EventHandler(Content_Refreshed);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Refreshing += new EventHandler(Content_Refreshing);
+      Content.Refreshed += new EventHandler(Content_Refreshed);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      refreshButton.Enabled = Content != null;
+    }
+
+    protected virtual void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        Cursor = Cursors.AppStarting;
+        refreshButton.Enabled = false;
+      }
+    }
+
+    protected virtual void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        Cursor = Cursors.Default;
+        refreshButton.Enabled = true;
+      }
+    }
+
+    protected virtual void RefreshData() { }
+
+    protected void refreshButton_Click(object sender, System.EventArgs e) {
+      RefreshData();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.Designer.cs	(revision 8042)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RoleListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.cs	(revision 8042)
@@ -0,0 +1,43 @@
+﻿#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;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("RoleList View")]
+  [Content(typeof(IItemList<Role>), true)]
+  public partial class RoleListView : ItemListView<Role> {
+    public RoleListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Roles";
+    }
+
+    protected override Role CreateItem() {
+      var role = new Role();
+      role.Name = "New Role";
+      return role;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleSelectionListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleSelectionListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleSelectionListView.Designer.cs	(revision 8042)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RoleSelectionListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleSelectionListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleSelectionListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleSelectionListView.cs	(revision 8042)
@@ -0,0 +1,58 @@
+﻿#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.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("RoleSelectionList View")]
+  [Content(typeof(IItemList<Role>), false)]
+  public partial class RoleSelectionListView : ItemListView<Role> {
+    public RoleSelectionListView() {
+      InitializeComponent();
+      ItemsListView.CheckBoxes = true;
+      ItemsListView.View = System.Windows.Forms.View.Details;
+      showDetailsCheckBox.Checked = false;
+      itemsGroupBox.Text = "Roles";
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+
+      addButton.Enabled = false;
+      removeButton.Enabled = false;
+      showDetailsCheckBox.Enabled = false;
+      moveUpButton.Enabled = false;
+      moveDownButton.Enabled = false;
+    }
+
+    protected override void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      base.itemsListView_SelectedIndexChanged(sender, e);
+      moveUpButton.Enabled = false;
+      moveDownButton.Enabled = false;
+      removeButton.Enabled = false;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.Designer.cs	(revision 8042)
@@ -0,0 +1,67 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class RoleView {
+    /// <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.label2 = new System.Windows.Forms.Label();
+      this.roleNameTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 6);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(63, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Role Name:";
+      // 
+      // roleNameTextBox
+      // 
+      this.roleNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.roleNameTextBox.Location = new System.Drawing.Point(75, 3);
+      this.roleNameTextBox.Name = "roleNameTextBox";
+      this.roleNameTextBox.Size = new System.Drawing.Size(289, 20);
+      this.roleNameTextBox.TabIndex = 3;
+      this.roleNameTextBox.TextChanged += new System.EventHandler(this.roleNameTextBox_TextChanged);
+      // 
+      // RoleView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.roleNameTextBox);
+      this.Controls.Add(this.label2);
+      this.Name = "RoleView";
+      this.Size = new System.Drawing.Size(364, 27);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox roleNameTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.cs	(revision 8042)
@@ -0,0 +1,53 @@
+﻿#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 HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("Role View")]
+  [Content(typeof(Role), true)]
+  public partial class RoleView : ItemView {
+    public new Role Content {
+      get { return (Role)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RoleView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        roleNameTextBox.Clear();
+      } else {
+        roleNameTextBox.Text = Content.Name;
+      }
+    }
+
+    private void roleNameTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (Content.Name != roleNameTextBox.Text)
+        Content.Name = roleNameTextBox.Text;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,157 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class UserAdministrationDialog {
+    /// <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.refreshableUserListView = new HeuristicLab.Clients.Access.Administration.RefreshableUserListView();
+      this.mainTabControl = new System.Windows.Forms.TabControl();
+      this.usersTabPage = new System.Windows.Forms.TabPage();
+      this.UserGroupsTabPage = new System.Windows.Forms.TabPage();
+      this.refreshableUserGroupListView = new HeuristicLab.Clients.Access.Administration.RefreshableUserGroupListView();
+      this.rolesTabPage = new System.Windows.Forms.TabPage();
+      this.refreshableRoleListView = new HeuristicLab.Clients.Access.Administration.RefreshableRoleListView();
+      this.mainTabControl.SuspendLayout();
+      this.usersTabPage.SuspendLayout();
+      this.UserGroupsTabPage.SuspendLayout();
+      this.rolesTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // refreshableUserListView
+      // 
+      this.refreshableUserListView.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.refreshableUserListView.Caption = "View";
+      this.refreshableUserListView.Content = null;
+      this.refreshableUserListView.Location = new System.Drawing.Point(6, 6);
+      this.refreshableUserListView.Name = "refreshableUserListView";
+      this.refreshableUserListView.ReadOnly = false;
+      this.refreshableUserListView.Size = new System.Drawing.Size(921, 527);
+      this.refreshableUserListView.TabIndex = 0;
+      // 
+      // mainTabControl
+      // 
+      this.mainTabControl.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.mainTabControl.Controls.Add(this.usersTabPage);
+      this.mainTabControl.Controls.Add(this.UserGroupsTabPage);
+      this.mainTabControl.Controls.Add(this.rolesTabPage);
+      this.mainTabControl.Location = new System.Drawing.Point(12, 12);
+      this.mainTabControl.Name = "mainTabControl";
+      this.mainTabControl.SelectedIndex = 0;
+      this.mainTabControl.Size = new System.Drawing.Size(941, 565);
+      this.mainTabControl.TabIndex = 1;
+      // 
+      // usersTabPage
+      // 
+      this.usersTabPage.Controls.Add(this.refreshableUserListView);
+      this.usersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.usersTabPage.Name = "usersTabPage";
+      this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.usersTabPage.Size = new System.Drawing.Size(933, 539);
+      this.usersTabPage.TabIndex = 0;
+      this.usersTabPage.Text = "Users";
+      this.usersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // UserGroupsTabPage
+      // 
+      this.UserGroupsTabPage.Controls.Add(this.refreshableUserGroupListView);
+      this.UserGroupsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.UserGroupsTabPage.Name = "UserGroupsTabPage";
+      this.UserGroupsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.UserGroupsTabPage.Size = new System.Drawing.Size(774, 376);
+      this.UserGroupsTabPage.TabIndex = 1;
+      this.UserGroupsTabPage.Text = "Groups";
+      this.UserGroupsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // refreshableUserGroupListView
+      // 
+      this.refreshableUserGroupListView.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.refreshableUserGroupListView.Caption = "View";
+      this.refreshableUserGroupListView.Content = null;
+      this.refreshableUserGroupListView.Location = new System.Drawing.Point(6, 6);
+      this.refreshableUserGroupListView.Name = "refreshableUserGroupListView";
+      this.refreshableUserGroupListView.ReadOnly = false;
+      this.refreshableUserGroupListView.Size = new System.Drawing.Size(762, 364);
+      this.refreshableUserGroupListView.TabIndex = 0;
+      // 
+      // rolesTabPage
+      // 
+      this.rolesTabPage.Controls.Add(this.refreshableRoleListView);
+      this.rolesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.rolesTabPage.Name = "rolesTabPage";
+      this.rolesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.rolesTabPage.Size = new System.Drawing.Size(774, 376);
+      this.rolesTabPage.TabIndex = 2;
+      this.rolesTabPage.Text = "Roles";
+      this.rolesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // refreshableRoleListView
+      // 
+      this.refreshableRoleListView.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.refreshableRoleListView.Caption = "View";
+      this.refreshableRoleListView.Content = null;
+      this.refreshableRoleListView.Location = new System.Drawing.Point(6, 6);
+      this.refreshableRoleListView.Name = "refreshableRoleListView";
+      this.refreshableRoleListView.ReadOnly = false;
+      this.refreshableRoleListView.Size = new System.Drawing.Size(762, 364);
+      this.refreshableRoleListView.TabIndex = 0;
+      // 
+      // UserAdministrationDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(965, 589);
+      this.Controls.Add(this.mainTabControl);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "UserAdministrationDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "User Administration";
+      this.Load += new System.EventHandler(this.UserAdministrationDialog_Load);
+      this.mainTabControl.ResumeLayout(false);
+      this.usersTabPage.ResumeLayout(false);
+      this.UserGroupsTabPage.ResumeLayout(false);
+      this.rolesTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private RefreshableUserListView refreshableUserListView;
+    private System.Windows.Forms.TabControl mainTabControl;
+    private System.Windows.Forms.TabPage usersTabPage;
+    private System.Windows.Forms.TabPage UserGroupsTabPage;
+    private RefreshableUserGroupListView refreshableUserGroupListView;
+    private System.Windows.Forms.TabPage rolesTabPage;
+    private RefreshableRoleListView refreshableRoleListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.cs	(revision 8042)
@@ -0,0 +1,38 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  public partial class UserAdministrationDialog : Form {
+    public UserAdministrationDialog() {
+      InitializeComponent();
+    }
+
+    private void UserAdministrationDialog_Load(object sender, System.EventArgs e) {
+      if (!DesignMode) {
+        refreshableUserListView.Content = AccessAdministrationClient.Instance;
+        refreshableUserGroupListView.Content = AccessAdministrationClient.Instance;
+        refreshableRoleListView.Content = AccessAdministrationClient.Instance;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupListView.Designer.cs	(revision 8042)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class UserGroupListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupListView.cs	(revision 8042)
@@ -0,0 +1,43 @@
+﻿#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;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("UserGroupList View")]
+  [Content(typeof(IItemList<UserGroup>), true)]
+  public partial class UserGroupListView : ItemListView<UserGroup> {
+    public UserGroupListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Groups";
+    }
+
+    protected override UserGroup CreateItem() {
+      var group = new UserGroup();
+      group.Name = "New Group";
+      return group;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.Designer.cs	(revision 8042)
@@ -0,0 +1,122 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class UserGroupView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.groupNameTextBox = new System.Windows.Forms.TextBox();
+      this.idTextBox = new System.Windows.Forms.TextBox();
+      this.refreshableLightweightUserView = new HeuristicLab.Clients.Access.Views.RefreshableLightweightUserView();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(70, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Group Name:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(19, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Id:";
+      // 
+      // groupNameTextBox
+      // 
+      this.groupNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupNameTextBox.Location = new System.Drawing.Point(79, 3);
+      this.groupNameTextBox.Name = "groupNameTextBox";
+      this.groupNameTextBox.Size = new System.Drawing.Size(675, 20);
+      this.groupNameTextBox.TabIndex = 2;
+      this.groupNameTextBox.TextChanged += new System.EventHandler(this.groupNameTextBox_TextChanged);
+      // 
+      // idTextBox
+      // 
+      this.idTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.idTextBox.Enabled = false;
+      this.idTextBox.Location = new System.Drawing.Point(79, 29);
+      this.idTextBox.Name = "idTextBox";
+      this.idTextBox.Size = new System.Drawing.Size(675, 20);
+      this.idTextBox.TabIndex = 3;
+      // 
+      // refreshableLightweightUserView
+      // 
+      this.refreshableLightweightUserView.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.refreshableLightweightUserView.Caption = "RefreshableLightweightUser View";
+      this.refreshableLightweightUserView.Content = null;
+      this.refreshableLightweightUserView.FetchSelectedUsers = null;
+      this.refreshableLightweightUserView.Location = new System.Drawing.Point(0, 55);
+      this.refreshableLightweightUserView.Name = "refreshableLightweightUserView";
+      this.refreshableLightweightUserView.ReadOnly = false;
+      this.refreshableLightweightUserView.Size = new System.Drawing.Size(754, 282);
+      this.refreshableLightweightUserView.TabIndex = 4;
+      // 
+      // storeButton
+      // 
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(31, 58);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 5;
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // UserGroupView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.storeButton);
+      this.Controls.Add(this.refreshableLightweightUserView);
+      this.Controls.Add(this.idTextBox);
+      this.Controls.Add(this.groupNameTextBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "UserGroupView";
+      this.Size = new System.Drawing.Size(757, 340);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox groupNameTextBox;
+    private System.Windows.Forms.TextBox idTextBox;
+    private Views.RefreshableLightweightUserView refreshableLightweightUserView;
+    private System.Windows.Forms.Button storeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserGroupView.cs	(revision 8042)
@@ -0,0 +1,80 @@
+﻿#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 HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("UserGroup View")]
+  [Content(typeof(UserGroup), true)]
+  public partial class UserGroupView : ItemView {
+    public new UserGroup Content {
+      get { return (UserGroup)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public UserGroupView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        groupNameTextBox.Clear();
+        idTextBox.Clear();
+
+        refreshableLightweightUserView.Content = null;
+        refreshableLightweightUserView.FetchSelectedUsers = null;
+      } else {
+        groupNameTextBox.Text = Content.Name;
+        idTextBox.Text = Content.Id.ToString();
+
+        refreshableLightweightUserView.Content = Access.AccessClient.Instance;
+        refreshableLightweightUserView.FetchSelectedUsers = new Func<List<Guid>>(delegate { return AccessAdministrationClient.CallAccessService<List<Guid>>(s => s.GetUserGroupIdsOfGroup(Content.Id)); });
+      }
+    }
+
+    private void groupNameTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (Content.Name != this.groupNameTextBox.Text)
+        Content.Name = this.groupNameTextBox.Text;
+    }
+
+    private void storeButton_Click(object sender, EventArgs e) {
+      Action storeAction = new Action(delegate {
+        foreach (var ug in refreshableLightweightUserView.GetAddedUsers()) {
+          AccessAdministrationClient.CallAccessService(s => s.AddUserGroupBaseToGroup(ug, Content));
+        }
+      });
+
+      Action deleteAction = new Action(delegate {
+        foreach (var ug in refreshableLightweightUserView.GetDeletedUsers()) {
+          AccessAdministrationClient.CallAccessService(s => s.RemoveUserGroupBaseFromGroup(ug, Content));
+        }
+      });
+
+      AccessAdministrationClient.Instance.ExecuteActionAsync(storeAction, PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+      AccessAdministrationClient.Instance.ExecuteActionAsync(deleteAction, PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserListView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserListView.Designer.cs	(revision 8042)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class UserListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserListView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserListView.cs	(revision 8042)
@@ -0,0 +1,43 @@
+﻿#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;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("UserList View")]
+  [Content(typeof(IItemList<User>), true)]
+  public partial class UserListView : ItemListView<User> {
+    public UserListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Users";
+    }
+
+    protected override User CreateItem() {
+      var user = new User();
+      user.UserName = "New User";
+      return user;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.Designer.cs	(revision 8042)
@@ -0,0 +1,223 @@
+﻿namespace HeuristicLab.Clients.Access.Administration {
+  partial class UserView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.userNameTextBox = new System.Windows.Forms.TextBox();
+      this.fullNameTextBox = new System.Windows.Forms.TextBox();
+      this.label3 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.emailTextBox = new System.Windows.Forms.TextBox();
+      this.idTextBox = new System.Windows.Forms.TextBox();
+      this.label5 = new System.Windows.Forms.Label();
+      this.label6 = new System.Windows.Forms.Label();
+      this.lastActivityTextBox = new System.Windows.Forms.TextBox();
+      this.lastLoginTextBox = new System.Windows.Forms.TextBox();
+      this.resetPasswordButton = new System.Windows.Forms.Button();
+      this.refreshableRoleSelectionListView = new HeuristicLab.Clients.Access.Administration.RefreshableRoleSelectionListView();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(63, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "User Name:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(57, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Full Name:";
+      // 
+      // userNameTextBox
+      // 
+      this.userNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userNameTextBox.Location = new System.Drawing.Point(76, 3);
+      this.userNameTextBox.Name = "userNameTextBox";
+      this.userNameTextBox.Size = new System.Drawing.Size(746, 20);
+      this.userNameTextBox.TabIndex = 2;
+      this.userNameTextBox.TextChanged += new System.EventHandler(this.userNameTextBox_TextChanged);
+      // 
+      // fullNameTextBox
+      // 
+      this.fullNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.fullNameTextBox.Location = new System.Drawing.Point(76, 29);
+      this.fullNameTextBox.Name = "fullNameTextBox";
+      this.fullNameTextBox.Size = new System.Drawing.Size(746, 20);
+      this.fullNameTextBox.TabIndex = 3;
+      this.fullNameTextBox.TextChanged += new System.EventHandler(this.fullNameTextBox_TextChanged);
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 58);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(39, 13);
+      this.label3.TabIndex = 4;
+      this.label3.Text = "E-Mail:";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(5, 84);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(19, 13);
+      this.label4.TabIndex = 5;
+      this.label4.Text = "Id:";
+      // 
+      // emailTextBox
+      // 
+      this.emailTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.emailTextBox.Location = new System.Drawing.Point(76, 55);
+      this.emailTextBox.Name = "emailTextBox";
+      this.emailTextBox.Size = new System.Drawing.Size(746, 20);
+      this.emailTextBox.TabIndex = 6;
+      this.emailTextBox.TextChanged += new System.EventHandler(this.emailTextBox_TextChanged);
+      // 
+      // idTextBox
+      // 
+      this.idTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.idTextBox.Enabled = false;
+      this.idTextBox.Location = new System.Drawing.Point(76, 81);
+      this.idTextBox.Name = "idTextBox";
+      this.idTextBox.Size = new System.Drawing.Size(746, 20);
+      this.idTextBox.TabIndex = 7;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(3, 110);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(67, 13);
+      this.label5.TabIndex = 8;
+      this.label5.Text = "Last Activity:";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(3, 136);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(59, 13);
+      this.label6.TabIndex = 9;
+      this.label6.Text = "Last Login:";
+      // 
+      // lastActivityTextBox
+      // 
+      this.lastActivityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastActivityTextBox.Enabled = false;
+      this.lastActivityTextBox.Location = new System.Drawing.Point(76, 107);
+      this.lastActivityTextBox.Name = "lastActivityTextBox";
+      this.lastActivityTextBox.Size = new System.Drawing.Size(746, 20);
+      this.lastActivityTextBox.TabIndex = 10;
+      // 
+      // lastLoginTextBox
+      // 
+      this.lastLoginTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastLoginTextBox.Enabled = false;
+      this.lastLoginTextBox.Location = new System.Drawing.Point(76, 133);
+      this.lastLoginTextBox.Name = "lastLoginTextBox";
+      this.lastLoginTextBox.Size = new System.Drawing.Size(746, 20);
+      this.lastLoginTextBox.TabIndex = 11;
+      // 
+      // resetPasswordButton
+      // 
+      this.resetPasswordButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetPasswordButton.Location = new System.Drawing.Point(8, 417);
+      this.resetPasswordButton.Name = "resetPasswordButton";
+      this.resetPasswordButton.Size = new System.Drawing.Size(96, 23);
+      this.resetPasswordButton.TabIndex = 12;
+      this.resetPasswordButton.Text = "Reset Password";
+      this.resetPasswordButton.UseVisualStyleBackColor = true;
+      this.resetPasswordButton.Click += new System.EventHandler(this.resetPasswordButton_Click);
+      // 
+      // refreshableRoleSelectionListView
+      // 
+      this.refreshableRoleSelectionListView.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.refreshableRoleSelectionListView.Caption = "View";
+      this.refreshableRoleSelectionListView.Content = null;
+      this.refreshableRoleSelectionListView.CurrentUser = null;
+      this.refreshableRoleSelectionListView.Location = new System.Drawing.Point(8, 159);
+      this.refreshableRoleSelectionListView.Name = "refreshableRoleSelectionListView";
+      this.refreshableRoleSelectionListView.ReadOnly = false;
+      this.refreshableRoleSelectionListView.Size = new System.Drawing.Size(814, 252);
+      this.refreshableRoleSelectionListView.TabIndex = 13;
+      // 
+      // UserView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshableRoleSelectionListView);
+      this.Controls.Add(this.resetPasswordButton);
+      this.Controls.Add(this.lastLoginTextBox);
+      this.Controls.Add(this.lastActivityTextBox);
+      this.Controls.Add(this.label6);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.idTextBox);
+      this.Controls.Add(this.emailTextBox);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.fullNameTextBox);
+      this.Controls.Add(this.userNameTextBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "UserView";
+      this.Size = new System.Drawing.Size(825, 447);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox userNameTextBox;
+    private System.Windows.Forms.TextBox fullNameTextBox;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.TextBox emailTextBox;
+    private System.Windows.Forms.TextBox idTextBox;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.TextBox lastActivityTextBox;
+    private System.Windows.Forms.TextBox lastLoginTextBox;
+    private System.Windows.Forms.Button resetPasswordButton;
+    private RefreshableRoleSelectionListView refreshableRoleSelectionListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Administration/3.3/Views/UserView.cs	(revision 8042)
@@ -0,0 +1,99 @@
+﻿#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.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Access.Administration {
+  [View("User View")]
+  [Content(typeof(User), true)]
+  public partial class UserView : ItemView {
+    public new User Content {
+      get { return (User)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public UserView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        userNameTextBox.Clear();
+        fullNameTextBox.Clear();
+        emailTextBox.Clear();
+        idTextBox.Clear();
+        lastActivityTextBox.Clear();
+        lastLoginTextBox.Clear();
+        refreshableRoleSelectionListView.Content = null;
+        refreshableRoleSelectionListView.CurrentUser = null;
+      } else {
+        userNameTextBox.Text = Content.UserName;
+        fullNameTextBox.Text = Content.FullName;
+        emailTextBox.Text = Content.Email;
+        idTextBox.Text = Content.Id.ToString();
+        lastActivityTextBox.Text = Content.LastActivityDate.ToString();
+        lastLoginTextBox.Text = Content.LastLoginDate.ToString();
+        refreshableRoleSelectionListView.Content = AccessAdministrationClient.Instance;
+        refreshableRoleSelectionListView.CurrentUser = Content;
+      }
+    }
+
+    private void fullNameTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (Content.FullName != fullNameTextBox.Text)
+        Content.FullName = fullNameTextBox.Text;
+    }
+
+    private void userNameTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (Content.UserName != userNameTextBox.Text)
+        Content.UserName = userNameTextBox.Text;
+    }
+
+    private void emailTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (Content.Email != emailTextBox.Text)
+        Content.Email = emailTextBox.Text;
+    }
+
+    private void resetPasswordButton_Click(object sender, System.EventArgs e) {
+      Action a = new Action(delegate {
+        string result = AccessAdministrationClient.CallAccessService<string>(s => s.ResetPassword(Content.Id));
+        ShowPassword(result);
+      });
+
+      AccessAdministrationClient.Instance.ExecuteActionAsync(a, PluginInfrastructure.ErrorHandling.ShowErrorDialog); ;
+    }
+
+    private void ShowPassword(string result) {
+      if (InvokeRequired) {
+        Invoke(new Action<string>(ShowPassword), result);
+      } else {
+        using (PasswordDisplayDialog dlg = new PasswordDisplayDialog()) {
+          dlg.Password = result;
+          dlg.ShowDialog(this);
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientInformationDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientInformationDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientInformationDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,122 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class ClientInformationDialog {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ClientInformationDialog));
+      this.clientView = new HeuristicLab.Clients.Access.Views.ClientView();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.registerClientButton = new System.Windows.Forms.Button();
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // clientView
+      // 
+      this.clientView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.clientView.Caption = "Client View";
+      this.clientView.Content = null;
+      this.clientView.Location = new System.Drawing.Point(12, 42);
+      this.clientView.Name = "clientView";
+      this.clientView.ReadOnly = false;
+      this.clientView.Size = new System.Drawing.Size(653, 315);
+      this.clientView.TabIndex = 0;
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshButton.Location = new System.Drawing.Point(12, 12);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // 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(590, 363);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 2;
+      this.okButton.Text = "OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // registerClientButton
+      // 
+      this.registerClientButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.registerClientButton.Location = new System.Drawing.Point(13, 362);
+      this.registerClientButton.Name = "registerClientButton";
+      this.registerClientButton.Size = new System.Drawing.Size(84, 23);
+      this.registerClientButton.TabIndex = 3;
+      this.registerClientButton.Text = "Register client";
+      this.registerClientButton.UseVisualStyleBackColor = true;
+      this.registerClientButton.Visible = false;
+      this.registerClientButton.Click += new System.EventHandler(this.registerClientButton_Click);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.infoLabel.AutoSize = true;
+      this.infoLabel.Location = new System.Drawing.Point(103, 367);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(434, 13);
+      this.infoLabel.TabIndex = 4;
+      this.infoLabel.Text = "Your client isn\'t registered yet. Click on the Register client button to use addi" +
+          "tional services.";
+      this.infoLabel.Visible = false;
+      // 
+      // ClientInformationDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(677, 398);
+      this.Controls.Add(this.infoLabel);
+      this.Controls.Add(this.registerClientButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.clientView);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ClientInformationDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Client Information";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private ClientView clientView;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button registerClientButton;
+    private System.Windows.Forms.Label infoLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientInformationDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientInformationDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientInformationDialog.cs	(revision 8042)
@@ -0,0 +1,66 @@
+﻿#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.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public partial class ClientInformationDialog : Form {
+    public ClientInformationDialog() {
+      InitializeComponent();
+    }
+
+    private void okButton_Click(object sender, System.EventArgs e) {
+      Close();
+    }
+
+    private void refreshButton_Click(object sender, System.EventArgs e) {
+      RefreshInformation();
+    }
+
+    private void registerClientButton_Click(object sender, EventArgs e) {
+      using (ClientRegistrationDialog regDialog = new ClientRegistrationDialog()) {
+        regDialog.ShowDialog(this);
+        RefreshInformation();
+      }
+    }
+
+    private void RefreshInformation() {
+      clientView.StartProgressView();
+      Task.Factory.StartNew(new Action(delegate {
+        ClientInformation.Instance.Refresh();
+        clientView.Content = ClientInformation.Instance.ClientInfo;
+        clientView.FinishProgressView();
+        EnableRegistration();
+      }));
+    }
+
+    private void EnableRegistration() {
+      if (InvokeRequired) {
+        Invoke(new Action(EnableRegistration));
+      } else {
+        registerClientButton.Visible = !ClientInformation.Instance.ClientExists;
+        infoLabel.Visible = !ClientInformation.Instance.ClientExists;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientRegistrationDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientRegistrationDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientRegistrationDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,139 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class ClientRegistrationDialog {
+    /// <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.btnCollectInformation = new System.Windows.Forms.Button();
+      this.richTextBox1 = new System.Windows.Forms.RichTextBox();
+      this.progressBar = new System.Windows.Forms.ProgressBar();
+      this.btnRegisterClient = new System.Windows.Forms.Button();
+      this.btnCancel = new System.Windows.Forms.Button();
+      this.clientView = new HeuristicLab.Clients.Access.Views.ClientView();
+      this.SuspendLayout();
+      // 
+      // btnCollectInformation
+      // 
+      this.btnCollectInformation.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnCollectInformation.Location = new System.Drawing.Point(12, 220);
+      this.btnCollectInformation.Name = "btnCollectInformation";
+      this.btnCollectInformation.Size = new System.Drawing.Size(111, 23);
+      this.btnCollectInformation.TabIndex = 1;
+      this.btnCollectInformation.Text = "Collect Information";
+      this.btnCollectInformation.UseVisualStyleBackColor = true;
+      this.btnCollectInformation.Click += new System.EventHandler(this.btnCollectInformation_Click);
+      // 
+      // richTextBox1
+      // 
+      this.richTextBox1.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.richTextBox1.BackColor = System.Drawing.SystemColors.Control;
+      this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.richTextBox1.Location = new System.Drawing.Point(12, 12);
+      this.richTextBox1.Name = "richTextBox1";
+      this.richTextBox1.Size = new System.Drawing.Size(769, 202);
+      this.richTextBox1.TabIndex = 2;
+      this.richTextBox1.Text = "";
+      this.richTextBox1.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBox1_LinkClicked);
+      // 
+      // progressBar
+      // 
+      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.progressBar.Location = new System.Drawing.Point(129, 220);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(651, 23);
+      this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+      this.progressBar.TabIndex = 4;
+      this.progressBar.Visible = false;
+      // 
+      // btnRegisterClient
+      // 
+      this.btnRegisterClient.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnRegisterClient.Enabled = false;
+      this.btnRegisterClient.Location = new System.Drawing.Point(12, 595);
+      this.btnRegisterClient.Name = "btnRegisterClient";
+      this.btnRegisterClient.Size = new System.Drawing.Size(88, 23);
+      this.btnRegisterClient.TabIndex = 5;
+      this.btnRegisterClient.Text = "Register client";
+      this.btnRegisterClient.UseVisualStyleBackColor = true;
+      this.btnRegisterClient.Click += new System.EventHandler(this.btnRegisterClient_Click);
+      // 
+      // btnCancel
+      // 
+      this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.btnCancel.Location = new System.Drawing.Point(705, 595);
+      this.btnCancel.Name = "btnCancel";
+      this.btnCancel.Size = new System.Drawing.Size(75, 23);
+      this.btnCancel.TabIndex = 6;
+      this.btnCancel.Text = "Close";
+      this.btnCancel.UseVisualStyleBackColor = true;
+      // 
+      // clientView
+      // 
+      this.clientView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.clientView.Caption = "Client View";
+      this.clientView.Content = null;
+      this.clientView.Location = new System.Drawing.Point(11, 249);
+      this.clientView.Name = "clientView";
+      this.clientView.ReadOnly = false;
+      this.clientView.Size = new System.Drawing.Size(769, 340);
+      this.clientView.TabIndex = 3;
+      // 
+      // ClientRegistrationDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.btnCancel;
+      this.ClientSize = new System.Drawing.Size(793, 631);
+      this.Controls.Add(this.btnCancel);
+      this.Controls.Add(this.btnRegisterClient);
+      this.Controls.Add(this.progressBar);
+      this.Controls.Add(this.clientView);
+      this.Controls.Add(this.richTextBox1);
+      this.Controls.Add(this.btnCollectInformation);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ClientRegistrationDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Client Registration";
+      this.TopMost = true;
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnCollectInformation;
+    private System.Windows.Forms.RichTextBox richTextBox1;
+    private ClientView clientView;
+    private System.Windows.Forms.ProgressBar progressBar;
+    private System.Windows.Forms.Button btnRegisterClient;
+    private System.Windows.Forms.Button btnCancel;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientRegistrationDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientRegistrationDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientRegistrationDialog.cs	(revision 8042)
@@ -0,0 +1,114 @@
+﻿#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.IO;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public partial class ClientRegistrationDialog : Form {
+    public ClientRegistrationDialog() {
+      InitializeComponent();
+
+      try {
+        using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(typeof(ClientRegistrationDialog), "Documents.ClientRegistrationInfo.rtf"))
+          richTextBox1.LoadFile(stream, RichTextBoxStreamType.RichText);
+      }
+      catch (Exception) { }
+    }
+
+    private void btnCollectInformation_Click(object sender, EventArgs e) {
+      progressBar.Visible = true;
+      progressBar.Style = ProgressBarStyle.Marquee;
+      btnCollectInformation.Enabled = false;
+      btnRegisterClient.Enabled = false;
+
+      Task<Client> task = Task.Factory.StartNew<Client>(ClientInformationUtils.CollectClientInformation);
+      task.ContinueWith(c => DisplayContent(c.Result));
+    }
+
+    private void DisplayContent(Client client) {
+      if (!this.Disposing) {
+        if (this.InvokeRequired) {
+          Invoke(new Action<Client>(DisplayContent), client);
+        } else {
+          clientView.Content = client;
+          progressBar.Visible = false;
+          btnCollectInformation.Enabled = true;
+          btnRegisterClient.Enabled = true;
+        }
+      }
+    }
+
+    private void AddClient() {
+      AccessClient.CallAccessService(x => x.AddClient(clientView.Content));
+    }
+
+    private void RefreshClientInformation(Task task) {
+      ClientInformation.Instance.Refresh();
+    }
+
+    private void btnRegisterClient_Click(object sender, EventArgs e) {
+      progressBar.Visible = true;
+      btnRegisterClient.Enabled = false;
+      btnCollectInformation.Enabled = false;
+      btnCancel.Enabled = false;
+
+      Task task = Task.Factory.StartNew(AddClient);
+      task.ContinueWith(RefreshClientInformation, TaskContinuationOptions.NotOnFaulted);
+      task.ContinueWith(FinishRegistration, TaskContinuationOptions.NotOnFaulted);
+      task.ContinueWith(HandleRegistrationError, TaskContinuationOptions.OnlyOnFaulted);
+    }
+
+    private void FinishRegistration(Task task) {
+      if (!this.Disposing) {
+        if (this.InvokeRequired) {
+          Invoke(new Action<Task>(FinishRegistration), task);
+        } else {
+          progressBar.Visible = false;
+          btnCollectInformation.Enabled = true;
+          btnCancel.Enabled = true;
+          MessageBox.Show("Your HeuristicLab client has been registered successfully.", "HeuristicLab Registration", MessageBoxButtons.OK, MessageBoxIcon.Information);
+        }
+      }
+    }
+
+    private void HandleRegistrationError(Task task) {
+      if (!this.Disposing) {
+        if (this.InvokeRequired) {
+          Invoke(new Action<Task>(HandleRegistrationError), task);
+        } else {
+          progressBar.Visible = false;
+          btnRegisterClient.Enabled = true;
+          btnCollectInformation.Enabled = true;
+          btnCancel.Enabled = true;
+          PluginInfrastructure.ErrorHandling.ShowErrorDialog(task.Exception);
+        }
+      }
+    }
+
+    private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start(e.LinkText);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.Designer.cs	(revision 8042)
@@ -0,0 +1,343 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class ClientView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label5 = new System.Windows.Forms.Label();
+      this.label6 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.label8 = new System.Windows.Forms.Label();
+      this.label9 = new System.Windows.Forms.Label();
+      this.label10 = new System.Windows.Forms.Label();
+      this.label11 = new System.Windows.Forms.Label();
+      this.txtName = new System.Windows.Forms.TextBox();
+      this.txtDescription = new System.Windows.Forms.TextBox();
+      this.txtVersion = new System.Windows.Forms.TextBox();
+      this.txtTimestamp = new System.Windows.Forms.TextBox();
+      this.txtMemory = new System.Windows.Forms.TextBox();
+      this.txtNumberOfCores = new System.Windows.Forms.TextBox();
+      this.txtClientType = new System.Windows.Forms.TextBox();
+      this.txtClientConfiguration = new System.Windows.Forms.TextBox();
+      this.txtProcessor = new System.Windows.Forms.TextBox();
+      this.txtOS = new System.Windows.Forms.TextBox();
+      this.txtPerformanceValue = new System.Windows.Forms.TextBox();
+      this.label13 = new System.Windows.Forms.Label();
+      this.txtId = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(38, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Name:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(63, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Description:";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 58);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(62, 13);
+      this.label3.TabIndex = 2;
+      this.label3.Text = "HL Version:";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(3, 84);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(47, 13);
+      this.label4.TabIndex = 3;
+      this.label4.Text = "Memory:";
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(3, 110);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(61, 13);
+      this.label5.TabIndex = 4;
+      this.label5.Text = "Timestamp:";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(3, 136);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(62, 13);
+      this.label6.TabIndex = 5;
+      this.label6.Text = "CPU Cores:";
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(3, 162);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(57, 13);
+      this.label7.TabIndex = 6;
+      this.label7.Text = "Processor:";
+      // 
+      // label8
+      // 
+      this.label8.AutoSize = true;
+      this.label8.Location = new System.Drawing.Point(3, 188);
+      this.label8.Name = "label8";
+      this.label8.Size = new System.Drawing.Size(36, 13);
+      this.label8.TabIndex = 7;
+      this.label8.Text = "Client:";
+      // 
+      // label9
+      // 
+      this.label9.AutoSize = true;
+      this.label9.Location = new System.Drawing.Point(3, 214);
+      this.label9.Name = "label9";
+      this.label9.Size = new System.Drawing.Size(63, 13);
+      this.label9.TabIndex = 8;
+      this.label9.Text = "OS Version:";
+      // 
+      // label10
+      // 
+      this.label10.AutoSize = true;
+      this.label10.Location = new System.Drawing.Point(3, 240);
+      this.label10.Name = "label10";
+      this.label10.Size = new System.Drawing.Size(101, 13);
+      this.label10.TabIndex = 9;
+      this.label10.Text = "Client Configuration:";
+      // 
+      // label11
+      // 
+      this.label11.AutoSize = true;
+      this.label11.Location = new System.Drawing.Point(3, 266);
+      this.label11.Name = "label11";
+      this.label11.Size = new System.Drawing.Size(100, 13);
+      this.label11.TabIndex = 10;
+      this.label11.Text = "Performance Value:";
+      // 
+      // txtName
+      // 
+      this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtName.Location = new System.Drawing.Point(110, 3);
+      this.txtName.Name = "txtName";
+      this.txtName.ReadOnly = true;
+      this.txtName.Size = new System.Drawing.Size(265, 20);
+      this.txtName.TabIndex = 12;
+      // 
+      // txtDescription
+      // 
+      this.txtDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtDescription.Location = new System.Drawing.Point(111, 29);
+      this.txtDescription.Name = "txtDescription";
+      this.txtDescription.ReadOnly = true;
+      this.txtDescription.Size = new System.Drawing.Size(264, 20);
+      this.txtDescription.TabIndex = 13;
+      // 
+      // txtVersion
+      // 
+      this.txtVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtVersion.Location = new System.Drawing.Point(111, 55);
+      this.txtVersion.Name = "txtVersion";
+      this.txtVersion.ReadOnly = true;
+      this.txtVersion.Size = new System.Drawing.Size(264, 20);
+      this.txtVersion.TabIndex = 14;
+      // 
+      // txtTimestamp
+      // 
+      this.txtTimestamp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtTimestamp.Location = new System.Drawing.Point(110, 107);
+      this.txtTimestamp.Name = "txtTimestamp";
+      this.txtTimestamp.ReadOnly = true;
+      this.txtTimestamp.Size = new System.Drawing.Size(265, 20);
+      this.txtTimestamp.TabIndex = 15;
+      // 
+      // txtMemory
+      // 
+      this.txtMemory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtMemory.Location = new System.Drawing.Point(110, 81);
+      this.txtMemory.Name = "txtMemory";
+      this.txtMemory.ReadOnly = true;
+      this.txtMemory.Size = new System.Drawing.Size(265, 20);
+      this.txtMemory.TabIndex = 16;
+      // 
+      // txtNumberOfCores
+      // 
+      this.txtNumberOfCores.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtNumberOfCores.Location = new System.Drawing.Point(110, 133);
+      this.txtNumberOfCores.Name = "txtNumberOfCores";
+      this.txtNumberOfCores.ReadOnly = true;
+      this.txtNumberOfCores.Size = new System.Drawing.Size(265, 20);
+      this.txtNumberOfCores.TabIndex = 17;
+      // 
+      // txtClientType
+      // 
+      this.txtClientType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtClientType.Location = new System.Drawing.Point(111, 185);
+      this.txtClientType.Name = "txtClientType";
+      this.txtClientType.ReadOnly = true;
+      this.txtClientType.Size = new System.Drawing.Size(264, 20);
+      this.txtClientType.TabIndex = 18;
+      // 
+      // txtClientConfiguration
+      // 
+      this.txtClientConfiguration.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtClientConfiguration.Location = new System.Drawing.Point(110, 237);
+      this.txtClientConfiguration.Name = "txtClientConfiguration";
+      this.txtClientConfiguration.ReadOnly = true;
+      this.txtClientConfiguration.Size = new System.Drawing.Size(265, 20);
+      this.txtClientConfiguration.TabIndex = 19;
+      // 
+      // txtProcessor
+      // 
+      this.txtProcessor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtProcessor.Location = new System.Drawing.Point(111, 159);
+      this.txtProcessor.Name = "txtProcessor";
+      this.txtProcessor.ReadOnly = true;
+      this.txtProcessor.Size = new System.Drawing.Size(264, 20);
+      this.txtProcessor.TabIndex = 20;
+      // 
+      // txtOS
+      // 
+      this.txtOS.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtOS.Location = new System.Drawing.Point(111, 211);
+      this.txtOS.Name = "txtOS";
+      this.txtOS.ReadOnly = true;
+      this.txtOS.Size = new System.Drawing.Size(264, 20);
+      this.txtOS.TabIndex = 21;
+      // 
+      // txtPerformanceValue
+      // 
+      this.txtPerformanceValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtPerformanceValue.Location = new System.Drawing.Point(110, 263);
+      this.txtPerformanceValue.Name = "txtPerformanceValue";
+      this.txtPerformanceValue.ReadOnly = true;
+      this.txtPerformanceValue.Size = new System.Drawing.Size(265, 20);
+      this.txtPerformanceValue.TabIndex = 23;
+      // 
+      // label13
+      // 
+      this.label13.AutoSize = true;
+      this.label13.Location = new System.Drawing.Point(3, 292);
+      this.label13.Name = "label13";
+      this.label13.Size = new System.Drawing.Size(48, 13);
+      this.label13.TabIndex = 24;
+      this.label13.Text = "Client Id:";
+      // 
+      // txtId
+      // 
+      this.txtId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtId.Location = new System.Drawing.Point(111, 289);
+      this.txtId.Name = "txtId";
+      this.txtId.ReadOnly = true;
+      this.txtId.Size = new System.Drawing.Size(264, 20);
+      this.txtId.TabIndex = 25;
+      // 
+      // ClientView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.txtId);
+      this.Controls.Add(this.label13);
+      this.Controls.Add(this.txtPerformanceValue);
+      this.Controls.Add(this.txtOS);
+      this.Controls.Add(this.txtProcessor);
+      this.Controls.Add(this.txtClientConfiguration);
+      this.Controls.Add(this.txtClientType);
+      this.Controls.Add(this.txtNumberOfCores);
+      this.Controls.Add(this.txtMemory);
+      this.Controls.Add(this.txtTimestamp);
+      this.Controls.Add(this.txtVersion);
+      this.Controls.Add(this.txtDescription);
+      this.Controls.Add(this.txtName);
+      this.Controls.Add(this.label11);
+      this.Controls.Add(this.label10);
+      this.Controls.Add(this.label9);
+      this.Controls.Add(this.label8);
+      this.Controls.Add(this.label7);
+      this.Controls.Add(this.label6);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "ClientView";
+      this.Size = new System.Drawing.Size(378, 315);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Label label1;
+    protected System.Windows.Forms.Label label2;
+    protected System.Windows.Forms.Label label3;
+    protected System.Windows.Forms.Label label4;
+    protected System.Windows.Forms.Label label5;
+    protected System.Windows.Forms.Label label6;
+    protected System.Windows.Forms.Label label7;
+    protected System.Windows.Forms.Label label8;
+    protected System.Windows.Forms.Label label9;
+    protected System.Windows.Forms.Label label10;
+    protected System.Windows.Forms.Label label11;
+    protected System.Windows.Forms.TextBox txtName;
+    protected System.Windows.Forms.TextBox txtDescription;
+    protected System.Windows.Forms.TextBox txtVersion;
+    protected System.Windows.Forms.TextBox txtTimestamp;
+    protected System.Windows.Forms.TextBox txtMemory;
+    protected System.Windows.Forms.TextBox txtNumberOfCores;
+    protected System.Windows.Forms.TextBox txtClientType;
+    protected System.Windows.Forms.TextBox txtClientConfiguration;
+    protected System.Windows.Forms.TextBox txtProcessor;
+    protected System.Windows.Forms.TextBox txtOS;
+    protected System.Windows.Forms.TextBox txtPerformanceValue;
+    protected System.Windows.Forms.Label label13;
+    protected System.Windows.Forms.TextBox txtId;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/ClientViews/ClientView.cs	(revision 8042)
@@ -0,0 +1,104 @@
+﻿#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 HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Views {
+  [View("Client View")]
+  [Content(typeof(Client), true)]
+  public partial class ClientView : ItemView {
+    public new Client Content {
+      get { return (Client)base.Content; }
+      set { base.Content = value; }
+    }
+
+    private ProgressView progressView;
+
+    public ClientView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        txtClientConfiguration.Text = string.Empty;
+        txtClientType.Text = string.Empty;
+        txtDescription.Text = string.Empty;
+        txtMemory.Text = string.Empty;
+        txtName.Text = string.Empty;
+        txtNumberOfCores.Text = string.Empty;
+        txtPerformanceValue.Text = string.Empty;
+        txtProcessor.Text = string.Empty;
+        txtTimestamp.Text = string.Empty;
+        txtVersion.Text = string.Empty;
+        txtId.Text = string.Empty;
+        txtOS.Text = string.Empty;
+      } else {
+        if (Content.ClientConfiguration != null) {
+          txtClientConfiguration.Text = Content.ClientConfiguration.Description; //??
+        }
+        if (Content.ClientType != null) {
+          txtClientType.Text = Content.ClientType.Name;
+        }
+        if (Content.OperatingSystem != null) {
+          txtOS.Text = Content.OperatingSystem.Name;
+        }
+        txtDescription.Text = Content.Description;
+        txtMemory.Text = Content.MemorySize.ToString();
+        txtName.Text = Content.Name;
+        txtNumberOfCores.Text = Content.NumberOfCores.ToString();
+        txtPerformanceValue.Text = Content.PerformanceValue.ToString();
+        txtProcessor.Text = Content.ProcessorType;
+        txtTimestamp.Text = Content.Timestamp.ToShortDateString();
+        txtVersion.Text = Content.HeuristicLabVersion;
+        txtId.Text = Content.Id.ToString();
+      }
+    }
+
+    public void StartProgressView() {
+      if (InvokeRequired) {
+        Invoke(new Action(StartProgressView));
+      } else {
+        if (progressView == null) {
+          IProgress prog = new Progress();
+          prog.Status = "Downloading client information. Please be patient.";
+          progressView = new ProgressView(this, prog);
+        }
+      }
+    }
+
+    public void FinishProgressView() {
+      if (InvokeRequired) {
+        Invoke(new Action(FinishProgressView));
+      } else {
+        if (progressView != null) {
+          progressView.Finish();
+          progressView = null;
+          SetEnabledStateOfControls();
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/HeuristicLab.Clients.Access.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/HeuristicLab.Clients.Access.Views-3.3.csproj	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/HeuristicLab.Clients.Access.Views-3.3.csproj	(revision 8042)
@@ -0,0 +1,248 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Clients.Access.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Clients.Access.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ClientViews\ClientInformationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ClientViews\ClientInformationDialog.Designer.cs">
+      <DependentUpon>ClientInformationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ClientViews\ClientRegistrationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ClientViews\ClientRegistrationDialog.Designer.cs">
+      <DependentUpon>ClientRegistrationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ClientViews\ClientView.cs" />
+    <Compile Include="ClientViews\ClientView.Designer.cs">
+      <DependentUpon>ClientView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MenuItems\ClientInfoMenuItem.cs" />
+    <Compile Include="MenuItems\UserInfoMenuItem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="UserViews\ChangePasswordDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UserViews\ChangePasswordDialog.Designer.cs">
+      <DependentUpon>ChangePasswordDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\LightweightUserGroupSelectionDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UserViews\LightweightUserGroupSelectionDialog.Designer.cs">
+      <DependentUpon>LightweightUserGroupSelectionDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\LightweightUserGroupSelectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UserViews\LightweightUserGroupSelectionView.Designer.cs">
+      <DependentUpon>LightweightUserGroupSelectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\LightweightUserInformationView.cs" />
+    <Compile Include="UserViews\LightweightUserInformationView.Designer.cs">
+      <DependentUpon>LightweightUserInformationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\RefreshableLightweightUserInformationView.cs" />
+    <Compile Include="UserViews\RefreshableLightweightUserInformationView.Designer.cs">
+      <DependentUpon>RefreshableLightweightUserInformationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\LightweightUserView.cs" />
+    <Compile Include="UserViews\LightweightUserView.Designer.cs">
+      <DependentUpon>LightweightUserView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\RefreshableLightweightUserView.cs" />
+    <Compile Include="UserViews\RefreshableLightweightUserView.Designer.cs">
+      <DependentUpon>RefreshableLightweightUserView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\RefreshableView.cs" />
+    <Compile Include="UserViews\RefreshableView.Designer.cs">
+      <DependentUpon>RefreshableView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserViews\UserInformationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UserViews\UserInformationDialog.Designer.cs">
+      <DependentUpon>UserInformationDialog.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Documents\ClientRegistrationInfo.rtf" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Access\3.3\HeuristicLab.Clients.Access-3.3.csproj">
+      <Project>{494F87F4-0F25-4D33-A382-10CDB2174D48}</Project>
+      <Name>HeuristicLab.Clients.Access-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Common\3.3\HeuristicLab.Clients.Common-3.3.csproj">
+      <Project>{730A9104-D4D1-4360-966B-E49B7571DDA3}</Project>
+      <Name>HeuristicLab.Clients.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimizer\3.3\HeuristicLab.Optimizer-3.3.csproj">
+      <Project>{C664305E-497C-4533-A140-967DEDB05C19}</Project>
+      <Name>HeuristicLab.Optimizer-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/MenuItems/ClientInfoMenuItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/MenuItems/ClientInfoMenuItem.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/MenuItems/ClientInfoMenuItem.cs	(revision 8042)
@@ -0,0 +1,42 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Optimizer;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public class ClientInfoMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&Client Information"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Services", "&Access" }; }
+    }
+    public override void Execute() {
+      using (ClientInformationDialog dialog = new ClientInformationDialog()) {
+        dialog.ShowDialog();
+      }
+    }
+    public override int Position {
+      get { return 10000; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/MenuItems/UserInfoMenuItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/MenuItems/UserInfoMenuItem.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/MenuItems/UserInfoMenuItem.cs	(revision 8042)
@@ -0,0 +1,42 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Optimizer;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public class UserInfoMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&User Information"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Services", "&Access" }; }
+    }
+    public override void Execute() {
+      using (UserInformationDialog dialog = new UserInformationDialog()) {
+        dialog.ShowDialog();
+      }
+    }
+    public override int Position {
+      get { return 10000; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/Plugin.cs.frame	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/Plugin.cs.frame	(revision 8042)
@@ -0,0 +1,42 @@
+﻿#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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Access.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Clients.Access.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Clients.Access.Views", "3.3.6.$WCREV$")]
+  [PluginFile("HeuristicLab.Clients.Access.Views-3.3.dll", PluginFileType.Assembly)]  
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]  
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Optimizer", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]  
+  [PluginDependency("HeuristicLab.Clients.Access", "3.3")]
+  public class HeuristicLabClientsAccessPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8042)
@@ -0,0 +1,57 @@
+﻿#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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.Access.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7032d7ba-4799-4708-803d-9f6cb3feed35")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/ChangePasswordDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/ChangePasswordDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/ChangePasswordDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,239 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class ChangePasswordDialog {
+    /// <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.components = new System.ComponentModel.Container();
+      this.oldPasswordTextBox = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.newPasswordTextBox = new System.Windows.Forms.TextBox();
+      this.retypedNewPasswordtextBox = new System.Windows.Forms.TextBox();
+      this.changePasswordButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.label4 = new System.Windows.Forms.Label();
+      this.userNameTextBox = new System.Windows.Forms.TextBox();
+      this.savePasswordCheckBox = new System.Windows.Forms.CheckBox();
+      this.label5 = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.progressBar = new System.Windows.Forms.ProgressBar();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // oldPasswordTextBox
+      // 
+      this.oldPasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.oldPasswordTextBox.Location = new System.Drawing.Point(149, 39);
+      this.oldPasswordTextBox.Name = "oldPasswordTextBox";
+      this.oldPasswordTextBox.PasswordChar = '*';
+      this.oldPasswordTextBox.Size = new System.Drawing.Size(232, 20);
+      this.oldPasswordTextBox.TabIndex = 0;
+      this.oldPasswordTextBox.UseSystemPasswordChar = true;
+      this.oldPasswordTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.oldPasswordTextBox_Validating);
+      this.oldPasswordTextBox.Validated += new System.EventHandler(this.oldPasswordTextBox_Validated);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 42);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(75, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Old Password:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(12, 68);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(81, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "New Password:";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(12, 94);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(116, 13);
+      this.label3.TabIndex = 3;
+      this.label3.Text = "Retype new Password:";
+      // 
+      // newPasswordTextBox
+      // 
+      this.newPasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.newPasswordTextBox.Location = new System.Drawing.Point(149, 65);
+      this.newPasswordTextBox.Name = "newPasswordTextBox";
+      this.newPasswordTextBox.PasswordChar = '*';
+      this.newPasswordTextBox.Size = new System.Drawing.Size(232, 20);
+      this.newPasswordTextBox.TabIndex = 4;
+      this.newPasswordTextBox.UseSystemPasswordChar = true;
+      this.newPasswordTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.newPasswordTextBox_Validating);
+      this.newPasswordTextBox.Validated += new System.EventHandler(this.newPasswordTextBox_Validated);
+      // 
+      // retypedNewPasswordtextBox
+      // 
+      this.retypedNewPasswordtextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.retypedNewPasswordtextBox.Location = new System.Drawing.Point(149, 91);
+      this.retypedNewPasswordtextBox.Name = "retypedNewPasswordtextBox";
+      this.retypedNewPasswordtextBox.PasswordChar = '*';
+      this.retypedNewPasswordtextBox.Size = new System.Drawing.Size(232, 20);
+      this.retypedNewPasswordtextBox.TabIndex = 5;
+      this.retypedNewPasswordtextBox.UseSystemPasswordChar = true;
+      this.retypedNewPasswordtextBox.Validating += new System.ComponentModel.CancelEventHandler(this.retypedNewPasswordtextBox_Validating);
+      this.retypedNewPasswordtextBox.Validated += new System.EventHandler(this.retypedNewPasswordtextBox_Validated);
+      // 
+      // changePasswordButton
+      // 
+      this.changePasswordButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.changePasswordButton.Location = new System.Drawing.Point(192, 127);
+      this.changePasswordButton.Name = "changePasswordButton";
+      this.changePasswordButton.Size = new System.Drawing.Size(108, 23);
+      this.changePasswordButton.TabIndex = 6;
+      this.changePasswordButton.Text = "Change Password";
+      this.changePasswordButton.UseVisualStyleBackColor = true;
+      this.changePasswordButton.Click += new System.EventHandler(this.changePasswordButton_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(306, 127);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 7;
+      this.cancelButton.Text = "Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(12, 16);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(61, 13);
+      this.label4.TabIndex = 8;
+      this.label4.Text = "User name:";
+      // 
+      // userNameTextBox
+      // 
+      this.userNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userNameTextBox.Location = new System.Drawing.Point(149, 13);
+      this.userNameTextBox.Name = "userNameTextBox";
+      this.userNameTextBox.Size = new System.Drawing.Size(232, 20);
+      this.userNameTextBox.TabIndex = 9;
+      this.userNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.userNameTextBox_Validating);
+      this.userNameTextBox.Validated += new System.EventHandler(this.userNameTextBox_Validated);
+      // 
+      // savePasswordCheckBox
+      // 
+      this.savePasswordCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.savePasswordCheckBox.AutoSize = true;
+      this.savePasswordCheckBox.Location = new System.Drawing.Point(149, 132);
+      this.savePasswordCheckBox.Name = "savePasswordCheckBox";
+      this.savePasswordCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.savePasswordCheckBox.TabIndex = 10;
+      this.savePasswordCheckBox.UseVisualStyleBackColor = true;
+      // 
+      // label5
+      // 
+      this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(13, 132);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(84, 13);
+      this.label5.TabIndex = 11;
+      this.label5.Text = "Save Password:";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // progressBar
+      // 
+      this.progressBar.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.progressBar.Location = new System.Drawing.Point(119, 60);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(180, 26);
+      this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+      this.progressBar.TabIndex = 12;
+      this.progressBar.Visible = false;
+      // 
+      // ChangePasswordDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(402, 158);
+      this.Controls.Add(this.progressBar);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.savePasswordCheckBox);
+      this.Controls.Add(this.userNameTextBox);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.changePasswordButton);
+      this.Controls.Add(this.retypedNewPasswordtextBox);
+      this.Controls.Add(this.newPasswordTextBox);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.oldPasswordTextBox);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChangePasswordDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Change Password";
+      this.Load += new System.EventHandler(this.ChangePasswordDialog_Load);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox oldPasswordTextBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox newPasswordTextBox;
+    private System.Windows.Forms.TextBox retypedNewPasswordtextBox;
+    private System.Windows.Forms.Button changePasswordButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.TextBox userNameTextBox;
+    private System.Windows.Forms.CheckBox savePasswordCheckBox;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.ProgressBar progressBar;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/ChangePasswordDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/ChangePasswordDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/ChangePasswordDialog.cs	(revision 8042)
@@ -0,0 +1,157 @@
+﻿#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.Clients.Common;
+using CcSettings = HeuristicLab.Clients.Common.Properties;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public partial class ChangePasswordDialog : Form {
+    public ChangePasswordDialog() {
+      InitializeComponent();
+    }
+
+    private void cancelButton_Click(object sender, System.EventArgs e) {
+      Close();
+    }
+
+    private void changePasswordButton_Click(object sender, System.EventArgs e) {
+      SaveUserPasswordConfig();
+      DisplayProgressBar();
+      ExecuteActionAsync(UpdatePassword);
+    }
+
+    private void UpdatePassword() {
+      UserInformation.Instance.Refresh();
+
+      if (!UserInformation.Instance.UserExists) {
+        MessageBox.Show("Couldn't fetch user information from the server." + Environment.NewLine + "Please verify that you have an existing user and that your user name and password is correct. ", "HeuristicLab Access Service", MessageBoxButtons.OK, MessageBoxIcon.Error);
+      } else {
+        bool result = AccessClient.CallAccessService<bool>(x => x.ChangePassword(UserInformation.Instance.User.Id, oldPasswordTextBox.Text, newPasswordTextBox.Text));
+        if (result) {
+          MessageBox.Show("Password change successfull.", "HeuristicLab Access Service", MessageBoxButtons.OK, MessageBoxIcon.Information);
+          SaveNewUserPasswordConfig();
+          Close();
+        } else {
+          MessageBox.Show("Password change failed. " + Environment.NewLine + "Please check the entered passwords to conform with the passwords standards.", "HeuristicLab Access Service", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
+      }
+    }
+
+    private void SaveUserPasswordConfig() {
+      CcSettings.Settings.Default.UserName = userNameTextBox.Text;
+      CcSettings.Settings.Default.SavePassword = savePasswordCheckBox.Checked;
+      CcSettings.Settings.Default.Password = string.Empty;
+      CcSettings.Settings.Default.Save();
+      CcSettings.Settings.Default.Password = CryptoService.EncryptString(oldPasswordTextBox.Text);
+      if (savePasswordCheckBox.Checked)
+        CcSettings.Settings.Default.Save();
+    }
+
+    private void SaveNewUserPasswordConfig() {
+      CcSettings.Settings.Default.Password = CryptoService.EncryptString(newPasswordTextBox.Text);
+      if (savePasswordCheckBox.Checked)
+        CcSettings.Settings.Default.Save();
+    }
+
+    private void DisplayProgressBar() {
+      progressBar.Visible = true;
+      progressBar.Style = ProgressBarStyle.Marquee;
+      progressBar.Value = 0;
+    }
+
+    private void HideProgressBar() {
+      progressBar.Visible = false;
+    }
+
+    private void ChangePasswordDialog_Load(object sender, EventArgs e) {
+      userNameTextBox.Text = CcSettings.Settings.Default.UserName;
+      oldPasswordTextBox.Text = CryptoService.DecryptString(CcSettings.Settings.Default.Password);
+      savePasswordCheckBox.Checked = CcSettings.Settings.Default.SavePassword;
+    }
+
+    public void ExecuteActionAsync(Action action) {
+      var call = new Func<Exception>(delegate() {
+        try {
+          action();
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+        finally {
+          HideProgressBar();
+        }
+        return null;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) PluginInfrastructure.ErrorHandling.ShowErrorDialog(ex);
+      }, null);
+    }
+
+    #region validation events
+    private void userNameTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (userNameTextBox.Text == string.Empty) {
+        e.Cancel = true;
+        errorProvider.SetError(userNameTextBox, "Please enter a user name");
+      }
+    }
+
+    private void userNameTextBox_Validated(object sender, EventArgs e) {
+      errorProvider.SetError(userNameTextBox, string.Empty);
+    }
+
+    private void oldPasswordTextBox_Validated(object sender, EventArgs e) {
+      errorProvider.SetError(oldPasswordTextBox, string.Empty);
+    }
+
+    private void oldPasswordTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (oldPasswordTextBox.Text == string.Empty) {
+        e.Cancel = true;
+        errorProvider.SetError(oldPasswordTextBox, "Please enter a password");
+      }
+    }
+
+    private void newPasswordTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (newPasswordTextBox.Text == string.Empty) {
+        e.Cancel = true;
+        errorProvider.SetError(newPasswordTextBox, "Please enter a new password");
+      }
+    }
+
+    private void newPasswordTextBox_Validated(object sender, EventArgs e) {
+      errorProvider.SetError(newPasswordTextBox, string.Empty);
+    }
+
+    private void retypedNewPasswordtextBox_Validated(object sender, EventArgs e) {
+      errorProvider.SetError(retypedNewPasswordtextBox, string.Empty);
+    }
+
+    private void retypedNewPasswordtextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (retypedNewPasswordtextBox.Text == string.Empty) {
+        e.Cancel = true;
+        errorProvider.SetError(retypedNewPasswordtextBox, "Please retype the new password");
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,92 @@
+﻿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.AbortButton = 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);
+      // 
+      // AbortButton
+      // 
+      this.AbortButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.AbortButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.AbortButton.Location = new System.Drawing.Point(455, 290);
+      this.AbortButton.Name = "AbortButton";
+      this.AbortButton.Size = new System.Drawing.Size(75, 23);
+      this.AbortButton.TabIndex = 2;
+      this.AbortButton.Text = "Cancel";
+      this.AbortButton.UseVisualStyleBackColor = true;
+      this.AbortButton.Click += new System.EventHandler(this.CancelButton_Click);
+      // 
+      // 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.CancelButton = this.AbortButton;
+      this.ClientSize = new System.Drawing.Size(542, 325);
+      this.Controls.Add(this.AbortButton);
+      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 AbortButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionDialog.cs	(revision 8042)
@@ -0,0 +1,50 @@
+﻿#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();
+    }
+
+    private void CancelButton_Click(object sender, System.EventArgs e) {
+      selectedUsersAndGroups = lightweightUserGroupSelectionView.GetSelectedItems();
+      this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionView.Designer.cs	(revision 8042)
@@ -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: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserGroupSelectionView.cs	(revision 8042)
@@ -0,0 +1,97 @@
+﻿#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) {
+      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: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.Designer.cs	(revision 8042)
@@ -0,0 +1,246 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class LightweightUserInformationView {
+    /// <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();
+      this.changePasswordButton = new System.Windows.Forms.Button();
+      this.label3 = new System.Windows.Forms.Label();
+      this.fullNameTextBox = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.userNameTextBox = new System.Windows.Forms.TextBox();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.rolesListView = new System.Windows.Forms.ListView();
+      this.columnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.groupsListView = new System.Windows.Forms.ListView();
+      this.groupsColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.label5 = new System.Windows.Forms.Label();
+      this.emailTextBox = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // changePasswordButton
+      // 
+      this.changePasswordButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.changePasswordButton.Location = new System.Drawing.Point(316, 231);
+      this.changePasswordButton.Name = "changePasswordButton";
+      this.changePasswordButton.Size = new System.Drawing.Size(112, 23);
+      this.changePasswordButton.TabIndex = 19;
+      this.changePasswordButton.Text = "Change Password";
+      this.changePasswordButton.UseVisualStyleBackColor = true;
+      this.changePasswordButton.Click += new System.EventHandler(this.changePasswordButton_Click);
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 0);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(37, 13);
+      this.label3.TabIndex = 17;
+      this.label3.Text = "Roles:";
+      // 
+      // fullNameTextBox
+      // 
+      this.fullNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.fullNameTextBox.Location = new System.Drawing.Point(69, 29);
+      this.fullNameTextBox.Name = "fullNameTextBox";
+      this.fullNameTextBox.Size = new System.Drawing.Size(359, 20);
+      this.fullNameTextBox.TabIndex = 16;
+      this.fullNameTextBox.TextChanged += new System.EventHandler(this.fullNameTextBox_TextChanged);
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(3, 0);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(44, 13);
+      this.label4.TabIndex = 18;
+      this.label4.Text = "Groups:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(0, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(63, 13);
+      this.label1.TabIndex = 11;
+      this.label1.Text = "User Name:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(0, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(57, 13);
+      this.label2.TabIndex = 12;
+      this.label2.Text = "Full Name:";
+      // 
+      // userNameTextBox
+      // 
+      this.userNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userNameTextBox.Location = new System.Drawing.Point(69, 3);
+      this.userNameTextBox.Name = "userNameTextBox";
+      this.userNameTextBox.ReadOnly = true;
+      this.userNameTextBox.Size = new System.Drawing.Size(359, 20);
+      this.userNameTextBox.TabIndex = 15;
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(3, 81);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.rolesListView);
+      this.splitContainer.Panel1.Controls.Add(this.label3);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.groupsListView);
+      this.splitContainer.Panel2.Controls.Add(this.label4);
+      this.splitContainer.Size = new System.Drawing.Size(425, 144);
+      this.splitContainer.SplitterDistance = 211;
+      this.splitContainer.TabIndex = 20;
+      // 
+      // rolesListView
+      // 
+      this.rolesListView.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.rolesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader});
+      this.rolesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.rolesListView.HideSelection = false;
+      this.rolesListView.Location = new System.Drawing.Point(3, 16);
+      this.rolesListView.Name = "rolesListView";
+      this.rolesListView.Size = new System.Drawing.Size(205, 125);
+      this.rolesListView.SmallImageList = this.imageList;
+      this.rolesListView.TabIndex = 18;
+      this.rolesListView.UseCompatibleStateImageBehavior = false;
+      this.rolesListView.View = System.Windows.Forms.View.Details;
+      // 
+      // columnHeader
+      // 
+      this.columnHeader.Width = 100;
+      // 
+      // 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;
+      // 
+      // groupsListView
+      // 
+      this.groupsListView.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.groupsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.groupsColumnHeader});
+      this.groupsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.groupsListView.HideSelection = false;
+      this.groupsListView.Location = new System.Drawing.Point(3, 16);
+      this.groupsListView.Name = "groupsListView";
+      this.groupsListView.Size = new System.Drawing.Size(204, 125);
+      this.groupsListView.SmallImageList = this.imageList;
+      this.groupsListView.TabIndex = 19;
+      this.groupsListView.UseCompatibleStateImageBehavior = false;
+      this.groupsListView.View = System.Windows.Forms.View.Details;
+      // 
+      // groupsColumnHeader
+      // 
+      this.groupsColumnHeader.Width = 100;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(0, 58);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(39, 13);
+      this.label5.TabIndex = 21;
+      this.label5.Text = "E-Mail:";
+      // 
+      // emailTextBox
+      // 
+      this.emailTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.emailTextBox.Location = new System.Drawing.Point(69, 55);
+      this.emailTextBox.Name = "emailTextBox";
+      this.emailTextBox.Size = new System.Drawing.Size(359, 20);
+      this.emailTextBox.TabIndex = 22;
+      this.emailTextBox.TextChanged += new System.EventHandler(this.emailTextBox_TextChanged);
+      // 
+      // LightweightUserInformationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.emailTextBox);
+      this.Controls.Add(this.label5);
+      this.Controls.Add(this.splitContainer);
+      this.Controls.Add(this.changePasswordButton);
+      this.Controls.Add(this.fullNameTextBox);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.userNameTextBox);
+      this.Name = "LightweightUserInformationView";
+      this.Size = new System.Drawing.Size(431, 257);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel1.PerformLayout();
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.Panel2.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button changePasswordButton;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox fullNameTextBox;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox userNameTextBox;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.ListView rolesListView;
+    private System.Windows.Forms.ListView groupsListView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ColumnHeader columnHeader;
+    private System.Windows.Forms.ColumnHeader groupsColumnHeader;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.TextBox emailTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserInformationView.cs	(revision 8042)
@@ -0,0 +1,117 @@
+﻿#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.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Views {
+  [View("RefreshableLightweightUserInformation View")]
+  [Content(typeof(LightweightUser), true)]
+  public partial class LightweightUserInformationView : AsynchronousContentView {
+    public new LightweightUser Content {
+      get { return (LightweightUser)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public LightweightUserInformationView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      rolesListView.Items.Clear();
+      groupsListView.Items.Clear();
+      rolesListView.SmallImageList.Images.Clear();
+      groupsListView.SmallImageList.Images.Clear();
+
+      if (Content == null) {
+        userNameTextBox.Clear();
+        fullNameTextBox.Clear();
+        emailTextBox.Clear();
+      } else {
+        userNameTextBox.Text = Content.UserName;
+        fullNameTextBox.Text = Content.FullName;
+        emailTextBox.Text = Content.EMail;
+
+        foreach (Role r in Content.Roles)
+          rolesListView.Items.Add(CreateListViewRoleItem(r));
+
+        foreach (UserGroup g in Content.Groups)
+          groupsListView.Items.Add(CreateListViewGroupItem(g));
+
+        rolesListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
+        groupsListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+
+    private void changePasswordButton_Click(object sender, System.EventArgs e) {
+      using (ChangePasswordDialog dialog = new ChangePasswordDialog()) {
+        dialog.ShowDialog(this);
+      }
+    }
+
+    private ListViewItem CreateListViewRoleItem(Role item) {
+      ListViewItem listViewItem = new ListViewItem();
+
+      listViewItem.Text = item.ToString();
+      rolesListView.SmallImageList.Images.Add(item.ItemImage);
+      listViewItem.ImageIndex = rolesListView.SmallImageList.Images.Count - 1;
+      listViewItem.Tag = item;
+
+      return listViewItem;
+    }
+
+    private ListViewItem CreateListViewGroupItem(UserGroup item) {
+      ListViewItem listViewItem = new ListViewItem();
+
+      listViewItem.Text = item.ToString();
+      groupsListView.SmallImageList.Images.Add(item.ItemImage);
+      listViewItem.ImageIndex = rolesListView.SmallImageList.Images.Count - 1;
+      listViewItem.Tag = item;
+
+      return listViewItem;
+    }
+
+    private void fullNameTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (UserInformation.Instance.User.FullName != fullNameTextBox.Text) {
+        UserInformation.Instance.User.FullName = fullNameTextBox.Text;
+        OnUserInformationChanged();
+      }
+    }
+
+    private void emailTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (UserInformation.Instance.User.EMail != emailTextBox.Text) {
+        UserInformation.Instance.User.EMail = emailTextBox.Text;
+        OnUserInformationChanged();
+      }
+    }
+
+    #region Events
+    public event EventHandler UserInformationChanged;
+    private void OnUserInformationChanged() {
+      EventHandler handler = UserInformationChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserView.Designer.cs	(revision 8042)
@@ -0,0 +1,41 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class LightweightUserView {
+    /// <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.SuspendLayout();
+      // 
+      // LightweightUserView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "LightweightUserView";
+      this.Size = new System.Drawing.Size(538, 235);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/LightweightUserView.cs	(revision 8042)
@@ -0,0 +1,74 @@
+﻿#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.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Views {
+  [View("LightweightUser View")]
+  [Content(typeof(ItemList<UserGroupBase>), true)]
+  public partial class LightweightUserView : ItemListView<UserGroupBase> {
+    public LightweightUserView() {
+      InitializeComponent();
+      this.showDetailsCheckBox.Checked = false;
+      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();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      this.showDetailsCheckBox.Enabled = false;
+    }
+
+    public event EventHandler SelectedUsersChanged;
+    protected virtual void OnSelectedUsersChanged() {
+      if (InvokeRequired)
+        Invoke((MethodInvoker)OnSelectedUsersChanged);
+      else {
+        EventHandler handler = SelectedUsersChanged;
+        if (handler != null)
+          handler(this, EventArgs.Empty);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserInformationView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserInformationView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserInformationView.Designer.cs	(revision 8042)
@@ -0,0 +1,82 @@
+﻿using System;
+namespace HeuristicLab.Clients.Access.Views {
+  partial class RefreshableLightweightUserInformationView {
+    /// <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)) {
+        lightweightUserInformationView.UserInformationChanged -= new EventHandler(lightweightUserInformationView_Changed);
+        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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableLightweightUserInformationView));
+      this.lightweightUserInformationView = new HeuristicLab.Clients.Access.Views.LightweightUserInformationView();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Location = new System.Drawing.Point(4, 3);
+      // 
+      // lightweightUserInformationView
+      // 
+      this.lightweightUserInformationView.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.lightweightUserInformationView.Caption = "RefreshableLightweightUserInformation View";
+      this.lightweightUserInformationView.Content = null;
+      this.lightweightUserInformationView.Location = new System.Drawing.Point(3, 33);
+      this.lightweightUserInformationView.Name = "lightweightUserInformationView";
+      this.lightweightUserInformationView.ReadOnly = false;
+      this.lightweightUserInformationView.Size = new System.Drawing.Size(378, 245);
+      this.lightweightUserInformationView.TabIndex = 2;
+      // 
+      // storeButton
+      // 
+      this.storeButton.Enabled = false;
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(34, 3);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 3;
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // RefreshableLightweightUserInformationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.lightweightUserInformationView);
+      this.Controls.Add(this.storeButton);
+      this.Name = "RefreshableLightweightUserInformationView";
+      this.Size = new System.Drawing.Size(384, 281);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.lightweightUserInformationView, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private LightweightUserInformationView lightweightUserInformationView;
+    private System.Windows.Forms.Button storeButton;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserInformationView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserInformationView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserInformationView.cs	(revision 8042)
@@ -0,0 +1,76 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public partial class RefreshableLightweightUserInformationView : RefreshableView {
+    public RefreshableLightweightUserInformationView() {
+      InitializeComponent();
+    }
+
+    private void RefreshUserData() {
+      UserInformation.Instance.Refresh();
+      lightweightUserInformationView.UserInformationChanged += new EventHandler(lightweightUserInformationView_Changed);
+    }
+
+    void lightweightUserInformationView_Changed(object sender, EventArgs e) {
+      if (!storeButton.Enabled) storeButton.Enabled = true;
+    }
+
+    protected override void RefreshData() {
+      Content.ExecuteActionAsync(RefreshUserData, PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+
+    protected override void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        base.Content_Refreshing(sender, e);
+        lightweightUserInformationView.Enabled = false;
+        storeButton.Enabled = false;
+      }
+    }
+
+    protected override void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        base.Content_Refreshed(sender, e);
+        lightweightUserInformationView.Enabled = true;
+        if (!UserInformation.Instance.UserExists) {
+          MessageBox.Show("Couldn't fetch user information from the server." + Environment.NewLine +
+            "Please verify that you have an existing user and that your user name and password is correct. ", "HeuristicLab Access Service", MessageBoxButtons.OK, MessageBoxIcon.Error);
+          lightweightUserInformationView.Content = null;
+        } else {
+          lightweightUserInformationView.Content = UserInformation.Instance.User;
+        }
+      }
+    }
+
+    private void storeButton_Click(object sender, EventArgs e) {
+      AccessClient.Instance.ExecuteActionAsync(new Action(delegate {
+        AccessClient.CallAccessService(x => x.UpdateLightweightUser(UserInformation.Instance.User));
+      }), HeuristicLab.PluginInfrastructure.ErrorHandling.ShowErrorDialog);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserView.Designer.cs	(revision 8042)
@@ -0,0 +1,59 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class RefreshableLightweightUserView {
+    /// <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.lightweightUserView = new HeuristicLab.Clients.Access.Views.LightweightUserView();
+      this.SuspendLayout();
+      // 
+      // lightweightUserView
+      // 
+      this.lightweightUserView.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.lightweightUserView.Caption = "LightweightUser View";
+      this.lightweightUserView.Content = null;
+      this.lightweightUserView.Location = new System.Drawing.Point(3, 33);
+      this.lightweightUserView.Name = "lightweightUserView";
+      this.lightweightUserView.ReadOnly = false;
+      this.lightweightUserView.Size = new System.Drawing.Size(500, 218);
+      this.lightweightUserView.TabIndex = 2;
+      this.lightweightUserView.SelectedUsersChanged += new System.EventHandler(this.lightweightUserView_SelectedUsersChanged);
+      // 
+      // RefreshableLightweightUserView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.lightweightUserView);
+      this.Name = "RefreshableLightweightUserView";
+      this.Controls.SetChildIndex(this.lightweightUserView, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private LightweightUserView lightweightUserView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableLightweightUserView.cs	(revision 8042)
@@ -0,0 +1,118 @@
+﻿#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.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Access.Views {
+  [View("RefreshableLightweightUser View")]
+  [Content(typeof(AccessClient), false)]
+  public partial class RefreshableLightweightUserView : RefreshableView {
+    public RefreshableLightweightUserView() {
+      InitializeComponent();
+    }
+
+    //set an action like a webservice call to retrieve the users which should be marked as checked           
+    private Func<List<Guid>> fetchSelectedUsers;
+    public Func<List<Guid>> FetchSelectedUsers {
+      get { return fetchSelectedUsers; }
+      set {
+        fetchSelectedUsers = value;
+        selectedUsers = null;
+        lightweightUserView.Content = null;
+        SetEnabledStateOfControls();
+      }
+    }
+
+    private List<Guid> selectedUsers;
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      selectedUsers = null;
+      lightweightUserView.Content = null;
+    }
+
+    protected override void RefreshData() {
+      Action completeRefreshAction = new Action(delegate {
+        selectedUsers = FetchSelectedUsers();
+        Content.Refresh();
+      });
+
+      Content.ExecuteActionAsync(completeRefreshAction, new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Refresh failed.", ex)));
+    }
+
+    protected override void Content_Refreshing(object sender, EventArgs e) {
+      base.Content_Refreshing(sender, e);
+      lightweightUserView.Content = null;
+    }
+
+    protected override void Content_Refreshed(object sender, EventArgs e) {
+      base.Content_Refreshed(sender, e);
+
+      lightweightUserView.Content = new ItemList<UserGroupBase>(Content.UsersAndGroups.Where(x => selectedUsers.Contains(x.Id)));
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      refreshButton.Enabled = FetchSelectedUsers != null && Content != null;
+    }
+
+    public IItemList<UserGroupBase> GetDeletedUsers() {
+      if (lightweightUserView.Content == null) {
+        return null;
+      } else {
+        var deletedIds = selectedUsers.Where(x => lightweightUserView.Content.Count(y => y.Id == x) == 0);
+        List<UserGroupBase> deletedUGs = Content.UsersAndGroups.Where(x => deletedIds.Contains(x.Id)).ToList();
+        return new ItemList<UserGroupBase>(deletedUGs);
+      }
+    }
+
+    public IItemList<UserGroupBase> GetCheckedUsers() {
+      return (lightweightUserView.Content == null) ? null : lightweightUserView.Content;
+    }
+
+    public IItemList<UserGroupBase> GetAddedUsers() {
+      return (lightweightUserView.Content == null) ? null : new ItemList<UserGroupBase>(lightweightUserView.Content.Where(x => !selectedUsers.Contains(x.Id)));
+    }
+
+    public event EventHandler SelectedUsersChanged;
+    protected virtual void OnSelectedUsersChanged() {
+      if (InvokeRequired)
+        Invoke((MethodInvoker)OnSelectedUsersChanged);
+      else {
+        EventHandler handler = SelectedUsersChanged;
+        if (handler != null)
+          handler(this, EventArgs.Empty);
+      }
+    }
+
+    private void lightweightUserView_SelectedUsersChanged(object sender, EventArgs e) {
+      OnSelectedUsersChanged();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableView.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableView.Designer.cs	(revision 8042)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class RefreshableView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableView));
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshButton.Location = new System.Drawing.Point(3, 3);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // RefreshableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshButton);
+      this.Name = "RefreshableView";
+      this.Size = new System.Drawing.Size(506, 254);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button refreshButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableView.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/RefreshableView.cs	(revision 8042)
@@ -0,0 +1,84 @@
+﻿#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.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Access.Views {
+  [View("Refreshable View")]
+  [Content(typeof(AccessClient), true)]
+  public partial class RefreshableView : AsynchronousContentView {
+    public new AccessClient Content {
+      get { return (AccessClient)base.Content; }
+      set { base.Content = value; }
+    }
+    public RefreshableView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Refreshing -= new EventHandler(Content_Refreshing);
+      Content.Refreshed -= new EventHandler(Content_Refreshed);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Refreshing += new EventHandler(Content_Refreshing);
+      Content.Refreshed += new EventHandler(Content_Refreshed);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      refreshButton.Enabled = Content != null;
+    }
+
+    protected virtual void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        Cursor = Cursors.AppStarting;
+        refreshButton.Enabled = false;
+      }
+    }
+
+    protected virtual void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        Cursor = Cursors.Default;
+        refreshButton.Enabled = true;
+      }
+    }
+
+    protected virtual void RefreshData() { }
+
+    public void ManualRefresh() {
+      RefreshData();
+    }
+
+    protected void refreshButton_Click(object sender, System.EventArgs e) {
+      RefreshData();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/UserInformationDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/UserInformationDialog.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/UserInformationDialog.Designer.cs	(revision 8042)
@@ -0,0 +1,79 @@
+﻿namespace HeuristicLab.Clients.Access.Views {
+  partial class UserInformationDialog {
+    /// <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.closeButton = new System.Windows.Forms.Button();
+      this.refreshableLightweightUserInformationView = new HeuristicLab.Clients.Access.Views.RefreshableLightweightUserInformationView();
+      this.SuspendLayout();
+      // 
+      // closeButton
+      // 
+      this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.closeButton.Location = new System.Drawing.Point(16, 245);
+      this.closeButton.Name = "closeButton";
+      this.closeButton.Size = new System.Drawing.Size(75, 23);
+      this.closeButton.TabIndex = 1;
+      this.closeButton.Text = "OK";
+      this.closeButton.UseVisualStyleBackColor = true;
+      this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
+      // 
+      // refreshableLightweightUserInformationView
+      // 
+      this.refreshableLightweightUserInformationView.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.refreshableLightweightUserInformationView.Caption = "";
+      this.refreshableLightweightUserInformationView.Content = null;
+      this.refreshableLightweightUserInformationView.Location = new System.Drawing.Point(12, 12);
+      this.refreshableLightweightUserInformationView.Name = "refreshableLightweightUserInformationView";
+      this.refreshableLightweightUserInformationView.ReadOnly = false;
+      this.refreshableLightweightUserInformationView.Size = new System.Drawing.Size(362, 262);
+      this.refreshableLightweightUserInformationView.TabIndex = 0;
+      // 
+      // UserInformationDialog
+      // 
+      this.AcceptButton = this.closeButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(386, 286);
+      this.Controls.Add(this.closeButton);
+      this.Controls.Add(this.refreshableLightweightUserInformationView);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "UserInformationDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "User Information";
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.UserInformationDialog_FormClosing);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private RefreshableLightweightUserInformationView refreshableLightweightUserInformationView;
+    private System.Windows.Forms.Button closeButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/UserInformationDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/UserInformationDialog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access.Views/3.3/UserViews/UserInformationDialog.cs	(revision 8042)
@@ -0,0 +1,56 @@
+﻿#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;
+
+namespace HeuristicLab.Clients.Access.Views {
+  public partial class UserInformationDialog : Form {
+    public UserInformationDialog() {
+      InitializeComponent();
+    }
+
+    protected override void OnLoad(System.EventArgs e) {
+      base.OnLoad(e);
+      if (!DesignMode) {
+        refreshableLightweightUserInformationView.Content = AccessClient.Instance;
+        AccessClient.Instance.Refreshing += new System.EventHandler(Instance_Refreshing);
+        AccessClient.Instance.Refreshed += new System.EventHandler(Instance_Refreshed);
+      }
+    }
+
+    void Instance_Refreshed(object sender, System.EventArgs e) {
+      closeButton.Enabled = true;
+    }
+
+    void Instance_Refreshing(object sender, System.EventArgs e) {
+      closeButton.Enabled = false;
+    }
+
+    private void closeButton_Click(object sender, System.EventArgs e) {
+      Close();
+    }
+
+    private void UserInformationDialog_FormClosing(object sender, FormClosingEventArgs e) {
+      AccessClient.Instance.Refreshing -= new System.EventHandler(Instance_Refreshing);
+      AccessClient.Instance.Refreshed -= new System.EventHandler(Instance_Refreshed);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/AccessClient.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/AccessClient.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/AccessClient.cs	(revision 8042)
@@ -0,0 +1,136 @@
+﻿#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 HeuristicLab.Clients.Common;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("AccessClient", "Access client.")]
+  public sealed class AccessClient : IContent {
+    private static AccessClient instance;
+    public static AccessClient Instance {
+      get {
+        if (instance == null) instance = new AccessClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private ItemList<UserGroupBase> usersAndGroups;
+    public ItemList<UserGroupBase> UsersAndGroups {
+      get { return usersAndGroups; }
+    }
+    #endregion
+
+    private AccessClient() { }
+
+    #region Refresh
+    public void Refresh() {
+      usersAndGroups = new ItemList<UserGroupBase>();
+      usersAndGroups.AddRange(CallAccessService<ItemList<UserGroupBase>>(s => new ItemList<UserGroupBase>(s.GetAllLeightweightUsersAndGroups())));
+    }
+    public void RefreshAsync(Action<Exception> exceptionCallback) {
+      var call = new Func<Exception>(delegate() {
+        try {
+          OnRefreshing();
+          Refresh();
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+        finally {
+          OnRefreshed();
+        }
+        return null;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) exceptionCallback(ex);
+      }, null);
+    }
+    public void ExecuteActionAsync(Action action, Action<Exception> exceptionCallback) {
+      var call = new Func<Exception>(delegate() {
+        try {
+          OnRefreshing();
+          action();
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+        finally {
+          OnRefreshed();
+        }
+        return null;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) exceptionCallback(ex);
+      }, null);
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      EventHandler handler = Refreshed;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Helpers
+    public static void CallAccessService(Action<IAccessService> call) {
+      AccessServiceClient client = ClientFactory.CreateClient<AccessServiceClient, IAccessService>();
+      try {
+        call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    public static T CallAccessService<T>(Func<IAccessService, T> call) {
+      AccessServiceClient client = ClientFactory.CreateClient<AccessServiceClient, IAccessService>();
+      try {
+        return call(client);
+      }
+      finally {
+        try {
+          client.Close();
+        }
+        catch (Exception) {
+          client.Abort();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ClientInformation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ClientInformation.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ClientInformation.cs	(revision 8042)
@@ -0,0 +1,103 @@
+﻿#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.ServiceModel.Security;
+
+namespace HeuristicLab.Clients.Access {
+  public sealed class ClientInformation {
+    private static ClientInformation instance;
+    public static ClientInformation Instance {
+      get {
+        if (instance == null) instance = new ClientInformation();
+        return instance;
+      }
+    }
+
+    private Client clientInfo;
+    public Client ClientInfo {
+      get { return clientInfo; }
+    }
+
+    private bool clientExists = false;
+    public bool ClientExists {
+      get { return clientExists; }
+    }
+
+    private bool errorOccured = false;
+    public bool ErrorOccured {
+      get { return errorOccured; }
+    }
+
+    private Exception occuredException;
+    public Exception OccuredException {
+      get { return occuredException; }
+    }
+
+    private ClientInformation() {
+      if (ClientInformationUtils.IsClientHeuristicLab()) {
+        FetchClientInformationFromServer();
+      } else {
+        // this means we are executed by an Hive slave, therefore we just get our machine id (e.g. for OKB Algs)
+        // because the slave has already done the registration process
+        GenerateLocalClientConfig();
+      }
+    }
+
+    private void GenerateLocalClientConfig() {
+      clientExists = true;
+      errorOccured = false;
+      occuredException = null;
+      clientInfo = new Client();
+      clientInfo.Id = ClientInformationUtils.GetUniqueMachineId();
+    }
+
+    private void FetchClientInformationFromServer() {
+      Guid clientId = ClientInformationUtils.GetUniqueMachineId();
+
+      try {
+        AccessClient.CallAccessService(x => clientInfo = x.GetClient(clientId));
+        if (clientInfo != null) {
+          clientExists = true;
+          clientInfo.HeuristicLabVersion = ClientInformationUtils.GetHLVersion();
+          AccessClient.CallAccessService(x => x.UpdateClient(clientInfo));
+        }
+        errorOccured = false;
+        occuredException = null;
+      }
+      catch (MessageSecurityException e) {
+        //wrong username or password
+        clientExists = false;
+        errorOccured = true;
+        occuredException = e;
+      }
+      catch (Exception e) {
+        clientExists = false;
+        errorOccured = true;
+        occuredException = e;
+      }
+    }
+
+    public void Refresh() {
+      FetchClientInformationFromServer();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ClientInformationUtils.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ClientInformationUtils.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ClientInformationUtils.cs	(revision 8042)
@@ -0,0 +1,222 @@
+﻿#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.Diagnostics;
+using System.Management;
+using System.Reflection;
+using HeuristicLab.Algorithms.Benchmarks;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Clients.Access {
+  public static class ClientInformationUtils {
+
+    public static Client CollectClientInformation() {
+      Client client = new Client();
+      OperatingSystem os = new OperatingSystem();
+      ClientType cType = new ClientType();
+      cType.Name = Settings.Default.ClientTypeName;
+
+      client.Id = GetUniqueMachineId();
+      client.HeuristicLabVersion = GetHLVersion();
+      client.Name = GetMachineName();
+      client.MemorySize = GetPhysicalMemory().GetValueOrDefault();
+      client.NumberOfCores = GetNumberOfCores();
+      os.Name = GetOperatingSystem();
+      client.OperatingSystem = os;
+      client.ProcessorType = GetCpuInfo();
+      client.ClientType = cType;
+      //client.ClientConfiguration = GetClientConfiguration();
+      client.Timestamp = DateTime.Now;
+      client.PerformanceValue = RunBenchmark();
+
+      return client;
+    }
+
+    public static string GetClientConfiguration() {
+      //TODO: does it make sense to send the client configuration to the server? for what do we need this?
+      return string.Empty;
+    }
+
+    public static string GetHLVersion() {
+      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
+      return versionInfo.FileVersion;
+    }
+
+    public static bool IsClientHeuristicLab() {
+      return Process.GetCurrentProcess().ProcessName == Settings.Default.HLExeName;
+    }
+
+    public static int GetNumberOfCores() {
+      return Environment.ProcessorCount;
+    }
+
+    public static string GetOperatingSystem() {
+      return Environment.OSVersion.VersionString;
+    }
+
+    public static string GetMachineName() {
+      return Environment.MachineName;
+    }
+
+    public static Guid GetUniqueMachineId() {
+      Guid id;
+      try {
+        id = GetUniqueMachineIdFromMac();
+      }
+      catch {
+        // fallback if something goes wrong...        
+        id = new Guid(Environment.MachineName.GetHashCode(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      }
+      return id;
+    }
+
+    /// <summary>
+    /// returns total physical memory of the machine in MB
+    /// </summary>
+    public static int? GetPhysicalMemory() {
+      long? res = GetWMIValue("Win32_ComputerSystem", "TotalPhysicalMemory");
+      if (res != null)
+        return (int)(res / 1024 / 1024);
+      else
+        return null;
+    }
+
+    /// <summary>
+    /// returns CPU frequence of the machine in Mhz
+    /// </summary>
+    public static string GetCpuInfo() {
+      string name = GetWMIString("Win32_Processor", "Name");
+      string manufacturer = GetWMIString("Win32_Processor", "Manufacturer");
+      return manufacturer + " " + name;
+    }
+
+    /// <summary>
+    /// Generate a guid based on mac address of the first found nic (yes, mac addresses are not unique...)
+    /// and the machine name.
+    /// Format:
+    /// 
+    ///  D1      D2  D3  Res.   D4
+    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    /// |n a m e|0 0|0 0|0 0 mac address|
+    /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    /// 
+    /// The mac address is saved in the last 48 bits of the Data 4 segment 
+    /// of the guid (first 2 bytes of Data 4 are reserved).
+    /// D1 contains the hash of the machinename. 
+    /// </summary>    
+    private static Guid GetUniqueMachineIdFromMac() {
+      ManagementClass mgtClass = new ManagementClass("Win32_NetworkAdapterConfiguration");
+      ManagementObjectCollection mgtCol = mgtClass.GetInstances();
+
+      foreach (ManagementObject mgtObj in mgtCol) {
+        foreach (var prop in mgtObj.Properties) {
+          if (prop.Value != null && prop.Name == "MACAddress") {
+            try {
+              //simply take the first nic
+              string mac = prop.Value.ToString();
+              byte[] b = new byte[8];
+              string[] macParts = mac.Split(':');
+              if (macParts.Length == 6) {
+                for (int i = 0; i < macParts.Length; i++) {
+                  b[i + 2] = (byte)((ParseNybble(macParts[i][0]) << 4) | ParseNybble(macParts[i][1]));
+                }
+
+                // also get machine name and save it to the first 4 bytes                
+                Guid guid = new Guid(Environment.MachineName.GetHashCode(), 0, 0, b);
+                return guid;
+              } else
+                throw new Exception("Error getting mac addresse");
+            }
+            catch {
+              throw new Exception("Error getting mac addresse");
+            }
+          }
+        }
+      }
+      throw new Exception("Error getting mac addresse");
+    }
+
+    /// <summary>
+    /// return numeric value of a single hex-char
+    /// (see: http://stackoverflow.com/questions/854012/how-to-convert-hex-to-a-byte-array)
+    /// </summary>    
+    private static int ParseNybble(char c) {
+      if (c >= '0' && c <= '9') {
+        return c - '0';
+      }
+      if (c >= 'A' && c <= 'F') {
+        return c - 'A' + 10;
+      }
+      if (c >= 'a' && c <= 'f') {
+        return c - 'a' + 10;
+      }
+      throw new ArgumentException("Invalid hex digit: " + c);
+    }
+
+    private static long? GetWMIValue(string clazz, string property) {
+      ManagementClass mgtClass = new ManagementClass(clazz);
+      ManagementObjectCollection mgtCol = mgtClass.GetInstances();
+
+      foreach (ManagementObject mgtObj in mgtCol) {
+        foreach (var prop in mgtObj.Properties) {
+          if (prop.Value != null && prop.Name == property) {
+            try {
+              return long.Parse(prop.Value.ToString());
+            }
+            catch {
+              return null;
+            }
+          }
+        }
+      }
+      return null;
+    }
+
+    private static string GetWMIString(string clazz, string property) {
+      ManagementClass mgtClass = new ManagementClass(clazz);
+      ManagementObjectCollection mgtCol = mgtClass.GetInstances();
+
+      foreach (ManagementObject mgtObj in mgtCol) {
+        foreach (var prop in mgtObj.Properties) {
+          if (prop.Value != null && prop.Name == property) {
+            try {
+              return prop.Value.ToString();
+            }
+            catch {
+              return string.Empty;
+            }
+          }
+        }
+      }
+      return string.Empty;
+    }
+
+    public static double RunBenchmark() {
+      Linpack linpack = new Linpack();
+      ResultCollection results = new ResultCollection();
+      linpack.Run(new System.Threading.CancellationToken(), results);
+      DoubleValue mflops = (DoubleValue)results["Mflops/s"].Value;
+      return mflops.Value;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/HeuristicLab.Clients.Access-3.3.csproj	(revision 8042)
@@ -0,0 +1,211 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{494F87F4-0F25-4D33-A382-10CDB2174D48}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Clients.Access</RootNamespace>
+    <AssemblyName>HeuristicLab.Clients.Access-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Management" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AccessClient.cs" />
+    <Compile Include="ClientInformation.cs" />
+    <Compile Include="ClientInformationUtils.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ServiceClients\AccessServiceClient.cs" />
+    <Compile Include="ServiceClients\AccessItem.cs" />
+    <Compile Include="ServiceClients\ClientConfiguration.cs" />
+    <Compile Include="ServiceClients\ClientError.cs" />
+    <Compile Include="ServiceClients\ClientGroup.cs" />
+    <Compile Include="ServiceClients\Client.cs" />
+    <Compile Include="ServiceClients\ClientLog.cs" />
+    <Compile Include="ServiceClients\ClientType.cs" />
+    <Compile Include="ServiceClients\Country.cs" />
+    <Compile Include="ServiceClients\OperatingSystem.cs" />
+    <Compile Include="ServiceClients\User.cs" />
+    <Compile Include="ServiceClients\Role.cs" />
+    <Compile Include="ServiceClients\Resource.cs" />
+    <Compile Include="ServiceClients\IAccessItem.cs" />
+    <Compile Include="ServiceClients\LightweightUser.cs" />
+    <Compile Include="ServiceClients\UserGroup.cs" />
+    <Compile Include="ServiceClients\UserGroupBase.cs" />
+    <Compile Include="Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="UserInformation.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="ServiceClients\GenerateServiceClients.cmd" />
+    <None Include="Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Algorithms.Benchmarks\3.3\HeuristicLab.Algorithms.Benchmarks-3.3.csproj">
+      <Project>{068C70A7-8CAF-4AB6-8721-4564D62292BC}</Project>
+      <Name>HeuristicLab.Algorithms.Benchmarks-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Common\3.3\HeuristicLab.Clients.Common-3.3.csproj">
+      <Project>{730A9104-D4D1-4360-966B-E49B7571DDA3}</Project>
+      <Name>HeuristicLab.Clients.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/Plugin.cs.frame	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/Plugin.cs.frame	(revision 8042)
@@ -0,0 +1,40 @@
+﻿#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 HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Access {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Clients.Access plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Clients.Access", "3.3.6.$WCREV$")]
+  [PluginFile("HeuristicLab.Clients.Access-3.3.dll", PluginFileType.Assembly)]  
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Algorithms.Benchmarks", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]  
+  public class HeuristicLabClientsAccessPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/Properties/AssemblyInfo.cs.frame	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/Properties/AssemblyInfo.cs.frame	(revision 8042)
@@ -0,0 +1,57 @@
+﻿#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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.Clients.Access")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7032d7ba-4799-4708-803d-9f6cb3feed35")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessItem.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessItem.cs	(revision 8042)
@@ -0,0 +1,121 @@
+﻿#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.ComponentModel;
+using System.Drawing;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("AccessItem", "Base class for all AccessService items.")]
+  public partial class AccessItem : IAccessItem {
+    public virtual string ItemName {
+      get { return ItemAttribute.GetName(this.GetType()); }
+    }
+    public virtual string ItemDescription {
+      get { return ItemAttribute.GetDescription(this.GetType()); }
+    }
+    public Version ItemVersion {
+      get { return ItemAttribute.GetVersion(this.GetType()); }
+    }
+    public static Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Database; }
+    }
+    public virtual Image ItemImage {
+      get {
+        if (Modified)
+          return HeuristicLab.Common.Resources.VSImageLibrary.DatabaseModified;
+        else
+          return ItemAttribute.GetImage(this.GetType());
+      }
+    }
+
+    private bool modified;
+    public bool Modified {
+      get { return modified; }
+      private set {
+        if (value != modified) {
+          modified = value;
+          OnModifiedChanged();
+          RaisePropertyChanged("Modified");
+          OnItemImageChanged();
+          RaisePropertyChanged("ItemImage");
+        }
+      }
+    }
+
+    public void SetUnmodified() {
+      Modified = false;
+    }
+
+    protected AccessItem(AccessItem original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      modified = true;
+    }
+    protected AccessItem() {
+      modified = true;
+    }
+
+    [OnDeserialized]
+    private void OnDeserialized(StreamingContext context) {
+      modified = false;
+    }
+
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      return new AccessItem(this, cloner);
+    }
+
+    public override string ToString() {
+      return ItemName;
+    }
+
+    protected void RaisePropertyChanged(string propertyName) {
+      OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
+      if ((propertyName != "Id") && (propertyName != "Modified") && (propertyName != "ItemImage")) {
+        Modified = true;
+      }
+    }
+    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, e);
+    }
+    public event EventHandler ModifiedChanged;
+    protected virtual void OnModifiedChanged() {
+      EventHandler handler = ModifiedChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ItemImageChanged;
+    protected virtual void OnItemImageChanged() {
+      EventHandler handler = ItemImageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ToStringChanged;
+    protected virtual void OnToStringChanged() {
+      EventHandler handler = ToStringChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/AccessServiceClient.cs	(revision 8042)
@@ -0,0 +1,1518 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.544
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Clients.Access {
+
+
+  [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.Role))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientError))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Resource))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Client))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientConfiguration))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.ClientType))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.Country))]
+  [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Access.OperatingSystem))]
+  [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.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))]
+  public partial class AccessItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
+
+    [System.NonSerializedAttribute()]
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+  }
+
+  [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 = "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 double PerformanceValueField;
+
+    [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 double PerformanceValue {
+      get {
+        return this.PerformanceValueField;
+      }
+      set {
+        if ((this.PerformanceValueField.Equals(value) != true)) {
+          this.PerformanceValueField = value;
+          this.RaisePropertyChanged("PerformanceValue");
+        }
+      }
+    }
+
+    [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 = "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.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 = "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 = "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" +
+      "")]
+  [System.SerializableAttribute()]
+  public partial class LightweightUser : HeuristicLab.Clients.Access.UserGroupBase {
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string EMailField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string FullNameField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GroupsField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> RolesField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private string UserNameField;
+
+    [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 System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> Groups {
+      get {
+        return this.GroupsField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.GroupsField, value) != true)) {
+          this.GroupsField = value;
+          this.RaisePropertyChanged("Groups");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> Roles {
+      get {
+        return this.RolesField;
+      }
+      set {
+        if ((object.ReferenceEquals(this.RolesField, value) != true)) {
+          this.RolesField = value;
+          this.RaisePropertyChanged("Roles");
+        }
+      }
+    }
+
+    [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 = "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()]
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ChildField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ParentField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Child {
+      get {
+        return this.ChildField;
+      }
+      set {
+        if ((this.ChildField.Equals(value) != true)) {
+          this.ChildField = value;
+          this.RaisePropertyChanged("Child");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Parent {
+      get {
+        return this.ParentField;
+      }
+      set {
+        if ((this.ParentField.Equals(value) != true)) {
+          this.ParentField = value;
+          this.RaisePropertyChanged("Parent");
+        }
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+    protected void RaisePropertyChanged(string propertyName) {
+      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+      if ((propertyChanged != null)) {
+        propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+      }
+    }
+  }
+
+  [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.NonSerializedAttribute()]
+    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ChildField;
+
+    [System.Runtime.Serialization.OptionalFieldAttribute()]
+    private System.Guid ParentField;
+
+    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
+      get {
+        return this.extensionDataField;
+      }
+      set {
+        this.extensionDataField = value;
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Child {
+      get {
+        return this.ChildField;
+      }
+      set {
+        if ((this.ChildField.Equals(value) != true)) {
+          this.ChildField = value;
+          this.RaisePropertyChanged("Child");
+        }
+      }
+    }
+
+    [System.Runtime.Serialization.DataMemberAttribute()]
+    public System.Guid Parent {
+      get {
+        return this.ParentField;
+      }
+      set {
+        if ((this.ParentField.Equals(value) != true)) {
+          this.ParentField = value;
+          this.RaisePropertyChanged("Parent");
+        }
+      }
+    }
+
+    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+    protected void RaisePropertyChanged(string propertyName) {
+      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+      if ((propertyChanged != null)) {
+        propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+      }
+    }
+  }
+
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  [System.ServiceModel.ServiceContractAttribute(ConfigurationName = "HeuristicLab.Clients.Access.IAccessService")]
+  public interface IAccessService {
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddUserGroupBaseToGroup", ReplyAction = "http://tempuri.org/IAccessService/AddUserGroupBaseToGroupResponse")]
+    void AddUserGroupBaseToGroup(HeuristicLab.Clients.Access.UserGroupBase resource, HeuristicLab.Clients.Access.UserGroup group);
+
+    [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();
+
+    [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/GetUserGroupIdsOfGroup", ReplyAction = "http://tempuri.org/IAccessService/GetUserGroupIdsOfGroupResponse")]
+    System.Collections.Generic.List<System.Guid> GetUserGroupIdsOfGroup(System.Guid groupId);
+
+    [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);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteRole", ReplyAction = "http://tempuri.org/IAccessService/DeleteRoleResponse")]
+    void DeleteRole(HeuristicLab.Clients.Access.Role role);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUserRoles", ReplyAction = "http://tempuri.org/IAccessService/GetUserRolesResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetUserRoles(HeuristicLab.Clients.Access.User user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddRoleToGroup", ReplyAction = "http://tempuri.org/IAccessService/AddRoleToGroupResponse")]
+    void AddRoleToGroup(HeuristicLab.Clients.Access.UserGroup userGroup, HeuristicLab.Clients.Access.Role role);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/RemoveRoleFromGroup", ReplyAction = "http://tempuri.org/IAccessService/RemoveRoleFromGroupResponse")]
+    void RemoveRoleFromGroup(HeuristicLab.Clients.Access.UserGroup userGroup, HeuristicLab.Clients.Access.Role role);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/ReportError", ReplyAction = "http://tempuri.org/IAccessService/ReportErrorResponse")]
+    void ReportError(HeuristicLab.Clients.Access.ClientError error);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClientErrors", ReplyAction = "http://tempuri.org/IAccessService/GetClientErrorsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientError> GetClientErrors();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetLastClientErrors", ReplyAction = "http://tempuri.org/IAccessService/GetLastClientErrorsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientError> GetLastClientErrors(System.DateTime startDate);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteError", ReplyAction = "http://tempuri.org/IAccessService/DeleteErrorResponse")]
+    void DeleteError(HeuristicLab.Clients.Access.ClientError error);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/ClientExists", ReplyAction = "http://tempuri.org/IAccessService/ClientExistsResponse")]
+    bool ClientExists(System.Guid id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClient", ReplyAction = "http://tempuri.org/IAccessService/GetClientResponse")]
+    HeuristicLab.Clients.Access.Client GetClient(System.Guid id);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClients", ReplyAction = "http://tempuri.org/IAccessService/GetClientsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.Client> GetClients(System.Collections.Generic.List<System.Guid> ids);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllClients", ReplyAction = "http://tempuri.org/IAccessService/GetAllClientsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.Client> GetAllClients();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddClient", ReplyAction = "http://tempuri.org/IAccessService/AddClientResponse")]
+    void AddClient(HeuristicLab.Clients.Access.Client client);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/UpdateClient", ReplyAction = "http://tempuri.org/IAccessService/UpdateClientResponse")]
+    void UpdateClient(HeuristicLab.Clients.Access.Client client);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteClient", ReplyAction = "http://tempuri.org/IAccessService/DeleteClientResponse")]
+    void DeleteClient(HeuristicLab.Clients.Access.Client client);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllClientGroups", ReplyAction = "http://tempuri.org/IAccessService/GetAllClientGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientGroup> GetAllClientGroups();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClientGroups", ReplyAction = "http://tempuri.org/IAccessService/GetClientGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientGroup> GetClientGroups(System.Collections.Generic.List<System.Guid> ids);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddClientGroup", ReplyAction = "http://tempuri.org/IAccessService/AddClientGroupResponse")]
+    System.Guid AddClientGroup(HeuristicLab.Clients.Access.ClientGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/UpdateClientGroup", ReplyAction = "http://tempuri.org/IAccessService/UpdateClientGroupResponse")]
+    void UpdateClientGroup(HeuristicLab.Clients.Access.ClientGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteClientGroup", ReplyAction = "http://tempuri.org/IAccessService/DeleteClientGroupResponse")]
+    void DeleteClientGroup(HeuristicLab.Clients.Access.ClientGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddResourceToGroup", ReplyAction = "http://tempuri.org/IAccessService/AddResourceToGroupResponse")]
+    void AddResourceToGroup(HeuristicLab.Clients.Access.Resource resource, HeuristicLab.Clients.Access.ClientGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/RemoveResourceFromGroup", ReplyAction = "http://tempuri.org/IAccessService/RemoveResourceFromGroupResponse")]
+    void RemoveResourceFromGroup(HeuristicLab.Clients.Access.Resource resource, HeuristicLab.Clients.Access.ClientGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClientGroupMapping", ReplyAction = "http://tempuri.org/IAccessService/GetClientGroupMappingResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientGroupMapping> GetClientGroupMapping();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetResources", ReplyAction = "http://tempuri.org/IAccessService/GetResourcesResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.Resource> GetResources();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetLastClientLog", ReplyAction = "http://tempuri.org/IAccessService/GetLastClientLogResponse")]
+    HeuristicLab.Clients.Access.ClientLog GetLastClientLog(System.Guid clientId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClientLogs", ReplyAction = "http://tempuri.org/IAccessService/GetClientLogsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientLog> GetClientLogs(System.Guid clientId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetClientLogsSince", ReplyAction = "http://tempuri.org/IAccessService/GetClientLogsSinceResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientLog> GetClientLogsSince(System.DateTime startDate);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddClientLog", ReplyAction = "http://tempuri.org/IAccessService/AddClientLogResponse")]
+    void AddClientLog(HeuristicLab.Clients.Access.ClientLog log);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteClientLog", ReplyAction = "http://tempuri.org/IAccessService/DeleteClientLogResponse")]
+    void DeleteClientLog(HeuristicLab.Clients.Access.ClientLog log);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/Login", ReplyAction = "http://tempuri.org/IAccessService/LoginResponse")]
+    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")]
+    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/UpdateLightweightUser", ReplyAction = "http://tempuri.org/IAccessService/UpdateLightweightUserResponse")]
+    void UpdateLightweightUser(HeuristicLab.Clients.Access.LightweightUser user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllUsers", ReplyAction = "http://tempuri.org/IAccessService/GetAllUsersResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.User> GetAllUsers();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUsers", ReplyAction = "http://tempuri.org/IAccessService/GetUsersResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.User> GetUsers(System.Collections.Generic.List<System.Guid> ids);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddUser", ReplyAction = "http://tempuri.org/IAccessService/AddUserResponse")]
+    HeuristicLab.Clients.Access.User AddUser(HeuristicLab.Clients.Access.User user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteUser", ReplyAction = "http://tempuri.org/IAccessService/DeleteUserResponse")]
+    void DeleteUser(HeuristicLab.Clients.Access.User user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/UpdateUser", ReplyAction = "http://tempuri.org/IAccessService/UpdateUserResponse")]
+    void UpdateUser(HeuristicLab.Clients.Access.User user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddUserToRole", ReplyAction = "http://tempuri.org/IAccessService/AddUserToRoleResponse")]
+    void AddUserToRole(HeuristicLab.Clients.Access.Role role, HeuristicLab.Clients.Access.User user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/RemoveUserFromRole", ReplyAction = "http://tempuri.org/IAccessService/RemoveUserFromRoleResponse")]
+    void RemoveUserFromRole(HeuristicLab.Clients.Access.Role role, HeuristicLab.Clients.Access.User user);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/ChangePassword", ReplyAction = "http://tempuri.org/IAccessService/ChangePasswordResponse")]
+    bool ChangePassword(System.Guid userId, string oldPassword, string newPassword);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/ResetPassword", ReplyAction = "http://tempuri.org/IAccessService/ResetPasswordResponse")]
+    string ResetPassword(System.Guid userId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetAllUserGroups", ReplyAction = "http://tempuri.org/IAccessService/GetAllUserGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetAllUserGroups();
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUserGroupsOfUser", ReplyAction = "http://tempuri.org/IAccessService/GetUserGroupsOfUserResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetUserGroupsOfUser(System.Guid userId);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/GetUserGroups", ReplyAction = "http://tempuri.org/IAccessService/GetUserGroupsResponse")]
+    System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetUserGroups(System.Collections.Generic.List<System.Guid> ids);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/AddUserGroup", ReplyAction = "http://tempuri.org/IAccessService/AddUserGroupResponse")]
+    System.Guid AddUserGroup(HeuristicLab.Clients.Access.UserGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/UpdateUserGroup", ReplyAction = "http://tempuri.org/IAccessService/UpdateUserGroupResponse")]
+    void UpdateUserGroup(HeuristicLab.Clients.Access.UserGroup group);
+
+    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IAccessService/DeleteUserGroup", ReplyAction = "http://tempuri.org/IAccessService/DeleteUserGroupResponse")]
+    void DeleteUserGroup(HeuristicLab.Clients.Access.UserGroup group);
+  }
+
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  public interface IAccessServiceChannel : HeuristicLab.Clients.Access.IAccessService, System.ServiceModel.IClientChannel {
+  }
+
+  [System.Diagnostics.DebuggerStepThroughAttribute()]
+  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+  public partial class AccessServiceClient : System.ServiceModel.ClientBase<HeuristicLab.Clients.Access.IAccessService>, HeuristicLab.Clients.Access.IAccessService {
+
+    public AccessServiceClient() {
+    }
+
+    public AccessServiceClient(string endpointConfigurationName) :
+      base(endpointConfigurationName) {
+    }
+
+    public AccessServiceClient(string endpointConfigurationName, string remoteAddress) :
+      base(endpointConfigurationName, remoteAddress) {
+    }
+
+    public AccessServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
+      base(endpointConfigurationName, remoteAddress) {
+    }
+
+    public AccessServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
+      base(binding, remoteAddress) {
+    }
+
+    public void AddUserGroupBaseToGroup(HeuristicLab.Clients.Access.UserGroupBase resource, HeuristicLab.Clients.Access.UserGroup group) {
+      base.Channel.AddUserGroupBaseToGroup(resource, group);
+    }
+
+    public void RemoveUserGroupBaseFromGroup(HeuristicLab.Clients.Access.UserGroupBase resource, HeuristicLab.Clients.Access.UserGroup group) {
+      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();
+    }
+
+    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<System.Guid> GetUserGroupIdsOfGroup(System.Guid groupId) {
+      return base.Channel.GetUserGroupIdsOfGroup(groupId);
+    }
+
+    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);
+    }
+
+    public void DeleteRole(HeuristicLab.Clients.Access.Role role) {
+      base.Channel.DeleteRole(role);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Role> GetUserRoles(HeuristicLab.Clients.Access.User user) {
+      return base.Channel.GetUserRoles(user);
+    }
+
+    public void AddRoleToGroup(HeuristicLab.Clients.Access.UserGroup userGroup, HeuristicLab.Clients.Access.Role role) {
+      base.Channel.AddRoleToGroup(userGroup, role);
+    }
+
+    public void RemoveRoleFromGroup(HeuristicLab.Clients.Access.UserGroup userGroup, HeuristicLab.Clients.Access.Role role) {
+      base.Channel.RemoveRoleFromGroup(userGroup, role);
+    }
+
+    public void ReportError(HeuristicLab.Clients.Access.ClientError error) {
+      base.Channel.ReportError(error);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientError> GetClientErrors() {
+      return base.Channel.GetClientErrors();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientError> GetLastClientErrors(System.DateTime startDate) {
+      return base.Channel.GetLastClientErrors(startDate);
+    }
+
+    public void DeleteError(HeuristicLab.Clients.Access.ClientError error) {
+      base.Channel.DeleteError(error);
+    }
+
+    public bool ClientExists(System.Guid id) {
+      return base.Channel.ClientExists(id);
+    }
+
+    public HeuristicLab.Clients.Access.Client GetClient(System.Guid id) {
+      return base.Channel.GetClient(id);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Client> GetClients(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetClients(ids);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Client> GetAllClients() {
+      return base.Channel.GetAllClients();
+    }
+
+    public void AddClient(HeuristicLab.Clients.Access.Client client) {
+      base.Channel.AddClient(client);
+    }
+
+    public void UpdateClient(HeuristicLab.Clients.Access.Client client) {
+      base.Channel.UpdateClient(client);
+    }
+
+    public void DeleteClient(HeuristicLab.Clients.Access.Client client) {
+      base.Channel.DeleteClient(client);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientGroup> GetAllClientGroups() {
+      return base.Channel.GetAllClientGroups();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientGroup> GetClientGroups(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetClientGroups(ids);
+    }
+
+    public System.Guid AddClientGroup(HeuristicLab.Clients.Access.ClientGroup group) {
+      return base.Channel.AddClientGroup(group);
+    }
+
+    public void UpdateClientGroup(HeuristicLab.Clients.Access.ClientGroup group) {
+      base.Channel.UpdateClientGroup(group);
+    }
+
+    public void DeleteClientGroup(HeuristicLab.Clients.Access.ClientGroup group) {
+      base.Channel.DeleteClientGroup(group);
+    }
+
+    public void AddResourceToGroup(HeuristicLab.Clients.Access.Resource resource, HeuristicLab.Clients.Access.ClientGroup group) {
+      base.Channel.AddResourceToGroup(resource, group);
+    }
+
+    public void RemoveResourceFromGroup(HeuristicLab.Clients.Access.Resource resource, HeuristicLab.Clients.Access.ClientGroup group) {
+      base.Channel.RemoveResourceFromGroup(resource, group);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientGroupMapping> GetClientGroupMapping() {
+      return base.Channel.GetClientGroupMapping();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.Resource> GetResources() {
+      return base.Channel.GetResources();
+    }
+
+    public HeuristicLab.Clients.Access.ClientLog GetLastClientLog(System.Guid clientId) {
+      return base.Channel.GetLastClientLog(clientId);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientLog> GetClientLogs(System.Guid clientId) {
+      return base.Channel.GetClientLogs(clientId);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.ClientLog> GetClientLogsSince(System.DateTime startDate) {
+      return base.Channel.GetClientLogsSince(startDate);
+    }
+
+    public void AddClientLog(HeuristicLab.Clients.Access.ClientLog log) {
+      base.Channel.AddClientLog(log);
+    }
+
+    public void DeleteClientLog(HeuristicLab.Clients.Access.ClientLog log) {
+      base.Channel.DeleteClientLog(log);
+    }
+
+    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();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.LightweightUser> GetAllLightweightUsers() {
+      return base.Channel.GetAllLightweightUsers();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.LightweightUser> GetLightweightUsers(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetLightweightUsers(ids);
+    }
+
+    public void UpdateLightweightUser(HeuristicLab.Clients.Access.LightweightUser user) {
+      base.Channel.UpdateLightweightUser(user);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.User> GetAllUsers() {
+      return base.Channel.GetAllUsers();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.User> GetUsers(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetUsers(ids);
+    }
+
+    public HeuristicLab.Clients.Access.User AddUser(HeuristicLab.Clients.Access.User user) {
+      return base.Channel.AddUser(user);
+    }
+
+    public void DeleteUser(HeuristicLab.Clients.Access.User user) {
+      base.Channel.DeleteUser(user);
+    }
+
+    public void UpdateUser(HeuristicLab.Clients.Access.User user) {
+      base.Channel.UpdateUser(user);
+    }
+
+    public void AddUserToRole(HeuristicLab.Clients.Access.Role role, HeuristicLab.Clients.Access.User user) {
+      base.Channel.AddUserToRole(role, user);
+    }
+
+    public void RemoveUserFromRole(HeuristicLab.Clients.Access.Role role, HeuristicLab.Clients.Access.User user) {
+      base.Channel.RemoveUserFromRole(role, user);
+    }
+
+    public bool ChangePassword(System.Guid userId, string oldPassword, string newPassword) {
+      return base.Channel.ChangePassword(userId, oldPassword, newPassword);
+    }
+
+    public string ResetPassword(System.Guid userId) {
+      return base.Channel.ResetPassword(userId);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetAllUserGroups() {
+      return base.Channel.GetAllUserGroups();
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetUserGroupsOfUser(System.Guid userId) {
+      return base.Channel.GetUserGroupsOfUser(userId);
+    }
+
+    public System.Collections.Generic.List<HeuristicLab.Clients.Access.UserGroup> GetUserGroups(System.Collections.Generic.List<System.Guid> ids) {
+      return base.Channel.GetUserGroups(ids);
+    }
+
+    public System.Guid AddUserGroup(HeuristicLab.Clients.Access.UserGroup group) {
+      return base.Channel.AddUserGroup(group);
+    }
+
+    public void UpdateUserGroup(HeuristicLab.Clients.Access.UserGroup group) {
+      base.Channel.UpdateUserGroup(group);
+    }
+
+    public void DeleteUserGroup(HeuristicLab.Clients.Access.UserGroup group) {
+      base.Channel.DeleteUserGroup(group);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Client.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Client.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Client.cs	(revision 8042)
@@ -0,0 +1,57 @@
+﻿#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("Client", "A client.")]
+  public partial class Client {
+    protected Client(Client original, Cloner cloner)
+      : base(original, cloner) {
+      this.HeuristicLabVersion = original.HeuristicLabVersion;
+      this.MemorySize = original.MemorySize;
+      this.Timestamp = original.Timestamp;
+      this.NumberOfCores = original.NumberOfCores;
+      this.ProcessorType = original.ProcessorType;
+      this.ClientType = original.ClientType;
+      this.OperatingSystem = original.OperatingSystem;
+      this.ClientConfiguration = original.ClientConfiguration;
+      this.Country = original.Country;
+      this.PerformanceValue = original.PerformanceValue;
+    }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.MonitorLarge; }
+    }
+
+    public Client() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Client(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientConfiguration.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientConfiguration.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientConfiguration.cs	(revision 8042)
@@ -0,0 +1,41 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("ClientConfiguration", "A client's configuration file.")]
+  public partial class ClientConfiguration {
+    protected ClientConfiguration(ClientConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.Hash = original.Hash;
+      this.Description = original.Description;
+    }
+
+    public ClientConfiguration()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientConfiguration(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientError.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientError.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientError.cs	(revision 8042)
@@ -0,0 +1,45 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("ClientError", "An object containing an error message.")]
+  public partial class ClientError {
+    protected ClientError(ClientError original, Cloner cloner)
+      : base(original, cloner) {
+      this.ClientId = original.ClientId;
+      this.ConfigDump = original.ConfigDump;
+      this.Exception = original.Exception;
+      this.Timestamp = original.Timestamp;
+      this.UserComment = original.UserComment;
+      this.UserId = original.UserId;
+    }
+
+    public ClientError()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientError(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientGroup.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientGroup.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientGroup.cs	(revision 8042)
@@ -0,0 +1,46 @@
+﻿#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("ClientGroup", "A client group.")]
+  public partial class ClientGroup {
+    protected ClientGroup(ClientGroup original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.NetworkCenterLarge; }
+    }
+
+    public ClientGroup() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientGroup(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientLog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientLog.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientLog.cs	(revision 8042)
@@ -0,0 +1,42 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("ClientLog", "A log that captures an event on a client. ")]
+  public partial class ClientLog {
+    protected ClientLog(ClientLog original, Cloner cloner)
+      : base(original, cloner) {
+      this.Message = original.Message;
+      this.ResourceId = original.ResourceId;
+      this.Timestamp = original.Timestamp;
+    }
+
+    public ClientLog()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientLog(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientType.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientType.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/ClientType.cs	(revision 8042)
@@ -0,0 +1,40 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("ClientType", "Type of a client.")]
+  public partial class ClientType {
+    protected ClientType(ClientType original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+    }
+
+    public ClientType()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientType(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Country.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Country.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Country.cs	(revision 8042)
@@ -0,0 +1,40 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("Country", "A Country.")]
+  public partial class Country {
+    protected Country(Country original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+    }
+
+    public Country()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Country(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/GenerateServiceClients.cmd
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/GenerateServiceClients.cmd	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/GenerateServiceClients.cmd	(revision 8042)
@@ -0,0 +1,30 @@
+echo off
+
+echo.
+echo *******************************************************************************************
+echo Generating AccessService client
+echo.
+
+svcutil.exe ^
+  http://localhost:81/AccessService?wsdl ^
+  /out:AccessServiceClient ^
+  /namespace:*,HeuristicLab.Clients.Access ^
+  /collectionType:System.Collections.Generic.List`1 ^
+  /targetClientVersion:Version35 ^
+  /serializable ^
+  /enableDataBinding ^
+  /config:..\app.config 
+
+echo.
+echo ---------------------------------------------------------------------------------------
+echo !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!!
+echo.
+echo Following modifications have to be done manually in generated data contracts:
+echo  * Remove method "protected void RaisePropertyChanged(string propertyName)" in AccessServiceItem
+echo.
+echo !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!!
+echo ---------------------------------------------------------------------------------------
+echo.
+echo Generation of AccessService client finished.
+echo *******************************************************************************************
+
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/IAccessItem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/IAccessItem.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/IAccessItem.cs	(revision 8042)
@@ -0,0 +1,31 @@
+﻿#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.ComponentModel;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  public interface IAccessItem : IItem, INotifyPropertyChanged {
+    bool Modified { get; }    
+    event EventHandler ModifiedChanged;
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/LightweightUser.cs	(revision 8042)
@@ -0,0 +1,53 @@
+﻿#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 System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("LightweightUser", "A user.")]
+  public partial class LightweightUser {
+    protected LightweightUser(LightweightUser original, Cloner cloner)
+      : base(original, cloner) {
+      this.FullName = original.FullName;
+      this.UserName = original.UserName;
+      this.EMail = original.EMail;
+      this.Groups = original.Groups.Select(x => (UserGroup)x.Clone(cloner)).ToList();
+      this.Roles = original.Roles.Select(x => (Role)x.Clone(cloner)).ToList();
+    }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.User; }
+    }
+
+    public LightweightUser() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LightweightUser(this, cloner);
+    }
+
+    public override string ToString() {
+      return UserName + " (" + FullName + ")";
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/OperatingSystem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/OperatingSystem.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/OperatingSystem.cs	(revision 8042)
@@ -0,0 +1,39 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("OperatingSystem", "An OperatingSystem.")]
+  public partial class OperatingSystem {
+    protected OperatingSystem(OperatingSystem original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+    }
+    public OperatingSystem()
+      : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OperatingSystem(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Resource.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Resource.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Resource.cs	(revision 8042)
@@ -0,0 +1,49 @@
+﻿#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("Resource", "A resource.")]
+  public partial class Resource {
+    protected Resource(Resource original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+      this.Description = original.Description;
+    }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.OrgChart; }
+    }
+
+    public Resource() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Resource(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Role.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Role.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/Role.cs	(revision 8042)
@@ -0,0 +1,55 @@
+﻿#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("Role ", "A role.")]
+  public partial class Role {
+    protected Role(Role original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+    }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Script; }
+    }
+
+    public Role() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Role(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+
+    public override bool Equals(object obj) {
+      return ((Role)obj).Name.Equals(this.Name);
+    }
+
+    public override int GetHashCode() {
+      return Name.GetHashCode();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/User.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/User.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/User.cs	(revision 8042)
@@ -0,0 +1,56 @@
+﻿#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("User ", "A user.")]
+  public partial class User {
+    protected User(User original, Cloner cloner)
+      : base(original, cloner) {
+      this.Comment = original.Comment;
+      this.Email = original.Email;
+      this.CreationDate = original.CreationDate;
+      this.FullName = original.FullName;
+      this.IsApproved = original.IsApproved;
+      this.LastActivityDate = original.LastActivityDate;
+      this.LastLoginDate = original.LastLoginDate;
+      this.LastPasswordChangedDate = original.LastPasswordChangedDate;
+      this.UserName = original.UserName;
+    }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.User; }
+    }
+
+    public User() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new User(this, cloner);
+    }
+
+    public override string ToString() {
+      return UserName + "(" + FullName + ")";
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroup.cs	(revision 8042)
@@ -0,0 +1,69 @@
+﻿#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.Drawing;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+namespace HeuristicLab.Clients.Access {
+  [Item("UserGroup", "A group.")]
+  public partial class UserGroup : IDisposable {
+    protected UserGroup(UserGroup original, Cloner cloner)
+      : base(original, cloner) {
+      this.Name = original.Name;
+    }
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.UserAccounts; }
+    }
+
+    public UserGroup() {
+      this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(UserGroup_PropertyChanged);
+    }
+
+    [OnDeserialized]
+    private void RegisterNamePropertyChangedEvent(StreamingContext c) {
+      this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(UserGroup_PropertyChanged);
+    }
+
+    void UserGroup_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
+      //this is a workaround as we can't overide the Name property and fire directly 
+      if (e.PropertyName == "Name") {
+        OnToStringChanged();
+      }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UserGroup(this, cloner);
+    }
+
+    public override string ToString() {
+      return Name;
+    }
+
+    #region IDisposable Members
+    public void Dispose() {
+      this.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(UserGroup_PropertyChanged);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroupBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroupBase.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/ServiceClients/UserGroupBase.cs	(revision 8042)
@@ -0,0 +1,52 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Access {
+  [Item("UserGroupBase", "A UserGroupBase.")]
+  public partial class UserGroupBase {
+    protected UserGroupBase(UserGroupBase original, Cloner cloner)
+      : base(original, cloner) {
+      Id = original.Id;
+    }
+
+    public UserGroupBase() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      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;
+      }
+    }
+
+    public override int GetHashCode() {
+      return Id.GetHashCode();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/Settings.Designer.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/Settings.Designer.cs	(revision 8042)
@@ -0,0 +1,44 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.544
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Clients.Access {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab 3.3")]
+        public string HLExeName {
+            get {
+                return ((string)(this["HLExeName"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HLClient")]
+        public string ClientTypeName {
+            get {
+                return ((string)(this["ClientTypeName"]));
+            }
+        }
+    }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/Settings.settings	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/Settings.settings	(revision 8042)
@@ -0,0 +1,12 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.Clients.Access" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="HLExeName" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">HeuristicLab 3.3</Value>
+    </Setting>
+    <Setting Name="ClientTypeName" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">HLClient</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/UserInformation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/UserInformation.cs	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/UserInformation.cs	(revision 8042)
@@ -0,0 +1,93 @@
+﻿#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.ServiceModel.Security;
+
+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; }
+    }
+
+    private bool errorOccured;
+    public bool ErrorOccured {
+      get { return errorOccured; }
+    }
+
+    private Exception occuredException;
+    public Exception OccuredException {
+      get { return occuredException; }
+    }
+
+    private UserInformation() {
+      //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 = HeuristicLab.Clients.Common.Properties.Settings.Default.UserName;
+
+      try {
+        AccessClient.CallAccessService(x => user = x.Login());
+        errorOccured = false;
+        userExists = true;
+        occuredException = null;
+      }
+      catch (MessageSecurityException e) {
+        //wrong username or password
+        errorOccured = false;
+        userExists = false;
+        occuredException = e;
+      }
+      catch (Exception e) {
+        errorOccured = true;
+        userExists = false;
+        occuredException = e;
+      }
+    }
+
+    public void Refresh() {
+      FetchUserInformationFromServer();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Clients.Access/3.3/app.config
===================================================================
--- /trunk/sources/HeuristicLab.Clients.Access/3.3/app.config	(revision 8042)
+++ /trunk/sources/HeuristicLab.Clients.Access/3.3/app.config	(revision 8042)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <configSections>
+        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.Clients.Access.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <system.serviceModel>
+        <bindings>
+            <wsHttpBinding>
+                <binding name="WSHttpBinding_IAccessService" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
+                    allowCookies="false">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
+                        enabled="false" />
+                    <security mode="Message">
+                        <transport clientCredentialType="Windows" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" negotiateServiceCredential="true"
+                            algorithmSuite="Default" />
+                    </security>
+                </binding>
+            </wsHttpBinding>
+        </bindings>
+        <client>
+            <endpoint address="http://services.heuristiclab.com/AccessService-3.3/AccessService.svc" binding="wsHttpBinding"
+                bindingConfiguration="WSHttpBinding_IAccessService" contract="HeuristicLab.Clients.Access.IAccessService"
+                name="WSHttpBinding_IAccessService">
+                <identity>
+                    <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+                </identity>
+            </endpoint>
+        </client>
+    </system.serviceModel>
+    <applicationSettings>
+      <HeuristicLab.Clients.Access.Settings>
+        <setting name="HLExeName" serializeAs="String">
+          <value>HeuristicLab 3.3</value>
+        </setting>
+        <setting name="ClientTypeName" serializeAs="String">
+          <value>HLClient</value>
+        </setting>
+      </HeuristicLab.Clients.Access.Settings>
+    </applicationSettings>
+</configuration>
