Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/AccessAdministrationClient.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/AccessAdministrationClient.cs	(revision 7651)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/AccessAdministrationClient.cs	(revision 7848)
@@ -45,4 +45,5 @@
 
     public ItemList<UserGroup> Groups { get; set; }
+    public ItemList<Role> Roles { get; set; }
     #endregion
 
@@ -67,4 +68,14 @@
       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
 
@@ -104,4 +115,17 @@
     }
 
+    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);
+    }
+
     //i don't think such a generic method is a good idea
     /*public static void Store(IAccessItem item) {
@@ -127,4 +151,13 @@
       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
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/HeuristicLab.Clients.Access.Administration-3.3.csproj
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/HeuristicLab.Clients.Access.Administration-3.3.csproj	(revision 7651)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/HeuristicLab.Clients.Access.Administration-3.3.csproj	(revision 7848)
@@ -129,4 +129,16 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <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>
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.Designer.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.Designer.cs	(revision 7848)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.Designer.cs	(revision 7848)
@@ -0,0 +1,73 @@
+﻿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() {
+      this.roleListView = new HeuristicLab.Clients.Access.Administration.RoleListView();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // userListView
+      // 
+      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 = "userListView";
+      this.roleListView.ReadOnly = false;
+      this.roleListView.Size = new System.Drawing.Size(559, 375);
+      this.roleListView.TabIndex = 2;
+      // 
+      // storeButton
+      // 
+      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.roleListView);
+      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.roleListView, 0);
+      this.Controls.SetChildIndex(this.refreshButton, 0);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private RoleListView roleListView;
+    private System.Windows.Forms.Button storeButton;
+  }
+}
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.cs	(revision 7848)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RefreshableRoleListView.cs	(revision 7848)
@@ -0,0 +1,75 @@
+﻿#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;
+        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;
+        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: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.Designer.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.Designer.cs	(revision 7848)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.Designer.cs	(revision 7848)
@@ -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: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.cs	(revision 7848)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleListView.cs	(revision 7848)
@@ -0,0 +1,36 @@
+﻿#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();
+    }
+  }
+}
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.Designer.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.Designer.cs	(revision 7651)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.Designer.cs	(revision 7848)
@@ -39,10 +39,11 @@
       // 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.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
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.cs	(revision 7651)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/RoleView.cs	(revision 7848)
@@ -45,4 +45,9 @@
       }
     }
+
+    private void roleNameTextBox_TextChanged(object sender, System.EventArgs e) {
+      if (Content.Name != roleNameTextBox.Text)
+        Content.Name = roleNameTextBox.Text;
+    }
   }
 }
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.Designer.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.Designer.cs	(revision 7651)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.Designer.cs	(revision 7848)
@@ -29,14 +29,17 @@
       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.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;
@@ -49,9 +52,10 @@
       // 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.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";
@@ -84,7 +88,7 @@
       // 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.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;
@@ -94,4 +98,28 @@
       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
@@ -112,4 +140,5 @@
       this.usersTabPage.ResumeLayout(false);
       this.UserGroupsTabPage.ResumeLayout(false);
+      this.rolesTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -123,4 +152,6 @@
     private System.Windows.Forms.TabPage UserGroupsTabPage;
     private RefreshableUserGroupListView refreshableUserGroupListView;
+    private System.Windows.Forms.TabPage rolesTabPage;
+    private RefreshableRoleListView refreshableRoleListView;
   }
 }
Index: branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.cs
===================================================================
--- branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.cs	(revision 7651)
+++ branches/ClientUserManagement/HeuristicLab.Clients.Access.Administration/3.3/Views/UserAdministrationDialog.cs	(revision 7848)
@@ -32,4 +32,5 @@
         refreshableUserListView.Content = AccessAdministrationClient.Instance;
         refreshableUserGroupListView.Content = AccessAdministrationClient.Instance;
+        refreshableRoleListView.Content = AccessAdministrationClient.Instance;
       }
     }
