Index: /trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ITableAdapterWrapper.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ITableAdapterWrapper.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ITableAdapterWrapper.cs	(revision 1720)
@@ -30,5 +30,5 @@
   public interface ITableAdapterWrapper<AdapterT, ObjT, RowT>
    where AdapterT : new()
-   where ObjT : IPersistableObject, new()
+   where ObjT : new()
    where RowT : System.Data.DataRow {
     void UpdateRow(RowT row);
Index: /trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/TableAdapterWrapperBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/TableAdapterWrapperBase.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/TableAdapterWrapperBase.cs	(revision 1720)
@@ -31,5 +31,5 @@
     ITableAdapterWrapper<AdapterT, ObjT, RowT>
     where AdapterT : new()
-    where ObjT : IPersistableObject, new()
+    where ObjT : new()
     where RowT : System.Data.DataRow {
     protected AdapterT adapter =
Index: /trunk/sources/HeuristicLab.DataAccess/3.2/PersistableObject.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAccess/3.2/PersistableObject.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.DataAccess/3.2/PersistableObject.cs	(revision 1720)
@@ -30,5 +30,5 @@
   public class PersistableObject: IPersistableObject {
     [DataMember]
-      public Guid Id { get; set; }
+    public Guid Id { get; set; }
 
     public override bool Equals(object obj) {
Index: /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/HeuristicLab.Security.ADODataAccess-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/HeuristicLab.Security.ADODataAccess-3.2.csproj	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/HeuristicLab.Security.ADODataAccess-3.2.csproj	(revision 1720)
@@ -74,4 +74,6 @@
   <ItemGroup>
     <Compile Include="ADODataAccessPlugin.cs" />
+    <Compile Include="DbTestApp.cs" />
+    <Compile Include="TableAdapterWrapper\GrantedPermissionsAdapterWrapper.cs" />
     <Compile Include="TableAdapterWrapper\PermissionOwner_UserGroupAdapterWrapper.cs" />
     <Compile Include="UserGroupAdapter.cs" />
Index: /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/PermissionAdapter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/PermissionAdapter.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/PermissionAdapter.cs	(revision 1720)
@@ -16,4 +16,17 @@
     public PermissionAdapter() :
       base(new PermissionAdapterWrapper()) {
+    }
+
+    private GrantedPermissionsAdapterWrapper grantedPermissionsAdapter;
+
+    private GrantedPermissionsAdapterWrapper GrantedPermissionsAdapter {
+      get {
+        if (grantedPermissionsAdapter == null)
+          grantedPermissionsAdapter = new GrantedPermissionsAdapterWrapper();
+
+        grantedPermissionsAdapter.Session = Session as Session;
+
+        return grantedPermissionsAdapter;
+      }
     }
 
@@ -59,20 +72,47 @@
     #region IPermissionAdapter Members
 
-    public GrantedPermission getPermission(PermissionOwner permissionOwner, 
-      Permission permission, 
-      Guid entityId) {
-      throw new NotImplementedException();
+    #endregion
+
+    #region IPermissionAdapter Members
+
+    public GrantedPermission getPermission(Guid permissionOwnerId, Guid permissionId, Guid entityId) {
+      dsSecurity.GrantedPermissionsRow row =
+          GrantedPermissionsAdapter.FindByPermissionPermissionOwnerEntityId(
+        permissionId, permissionOwnerId, entityId); 
+
+      if (row != null) {
+        GrantedPermission perm = new GrantedPermission();
+        perm.PermissionId = row.PermissionId;
+        perm.PermissionOwnerId = row.PermissionOwnerId;
+        perm.EntityId = row.EntityId;
+
+        return perm;
+      } else {
+        return null;
+      }
     }
 
-    public bool grantPermission(Guid permissionOwnerId, 
-      Guid permissionId, 
-      Guid entityId) {
-      throw new NotImplementedException();
+    public bool grantPermission(Guid permissionOwnerId, Guid permissionId, Guid entityId) {
+      if (getPermission(permissionOwnerId, permissionId, entityId) == null) {
+        GrantedPermission perm = new GrantedPermission();
+        perm.PermissionId = permissionId;
+        perm.PermissionOwnerId = permissionOwnerId;
+        perm.EntityId = entityId;
+
+        return GrantedPermissionsAdapter.InsertNewRow(perm) != null;
+      } else {
+        return false;
+      }      
     }
 
-    public bool revokePermission(Guid permissionOwnerId, 
-      Guid permissionId, 
-      Guid entityId) {
-      throw new NotImplementedException();
+    public bool revokePermission(Guid permissionOwnerId, Guid permissionId, Guid entityId) {
+      GrantedPermission perm =
+        getPermission(permissionOwnerId, permissionId, entityId);
+      
+      if (perm != null) {
+        return GrantedPermissionsAdapter.DeleteRow(perm);
+      } else {
+        return false;
+      } 
     }
 
Index: /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/TableAdapterWrapper/GrantedPermissionsAdapterWrapper.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/TableAdapterWrapper/GrantedPermissionsAdapterWrapper.cs	(revision 1720)
+++ /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/TableAdapterWrapper/GrantedPermissionsAdapterWrapper.cs	(revision 1720)
@@ -0,0 +1,80 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Security.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Security.ADODataAccess.TableAdapterWrapper {
+  class GrantedPermissionsAdapterWrapper :
+   TableAdapterWrapperBase<
+       dsSecurityTableAdapters.GrantedPermissionsTableAdapter,
+       GrantedPermission,
+       dsSecurity.GrantedPermissionsRow> {
+    public override void UpdateRow(dsSecurity.GrantedPermissionsRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override dsSecurity.GrantedPermissionsRow
+      InsertNewRow(GrantedPermission relation) {
+      dsSecurity.GrantedPermissionsDataTable data =
+        new dsSecurity.GrantedPermissionsDataTable();
+
+      dsSecurity.GrantedPermissionsRow row = data.NewGrantedPermissionsRow();
+      row.PermissionOwnerId = relation.PermissionOwnerId;
+      row.PermissionId = relation.PermissionId;
+      row.EntityId = relation.EntityId;
+
+      data.AddGrantedPermissionsRow(row);
+
+      return row;
+    }
+
+    public bool DeleteRow(GrantedPermission perm) {
+      dsSecurity.GrantedPermissionsRow row =
+        FindByPermissionPermissionOwnerEntityId(perm.PermissionId, perm.PermissionOwnerId, perm.EntityId);
+
+      if (row != null) {
+        row.Delete();
+        UpdateRow(row);
+
+        return true;
+      } else {
+        return false;
+      }
+    }
+
+    public override IEnumerable<dsSecurity.GrantedPermissionsRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataByPermissionOwnerId(id);
+    }
+
+    public dsSecurity.GrantedPermissionsRow
+      FindByPermissionPermissionOwnerEntityId(Guid permissionId, 
+      Guid permissionOwnerId, Guid entityId) {
+      IEnumerable<dsSecurity.GrantedPermissionsRow> result = 
+        TransactionalAdapter.GetDataByPermissionPermissionOwnerEntityId(
+          permissionId, permissionOwnerId, entityId);
+
+      if(result.Count() == 1)
+        return result.GetEnumerator().Current;
+      else
+        return null;
+    }
+
+    public override IEnumerable<dsSecurity.GrantedPermissionsRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.Designer.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.Designer.cs	(revision 1720)
@@ -2839,9 +2839,33 @@
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
         private void InitCommandCollection() {
-            this._commandCollection = new global::System.Data.SqlClient.SqlCommand[1];
+            this._commandCollection = new global::System.Data.SqlClient.SqlCommand[5];
             this._commandCollection[0] = new global::System.Data.SqlClient.SqlCommand();
             this._commandCollection[0].Connection = this.Connection;
             this._commandCollection[0].CommandText = "SELECT * FROM dbo.GrantedPermissions";
             this._commandCollection[0].CommandType = global::System.Data.CommandType.Text;
+            this._commandCollection[1] = new global::System.Data.SqlClient.SqlCommand();
+            this._commandCollection[1].Connection = this.Connection;
+            this._commandCollection[1].CommandText = "SELECT * FROM dbo.GrantedPermissions WHERE EntityId = @EntityId";
+            this._commandCollection[1].CommandType = global::System.Data.CommandType.Text;
+            this._commandCollection[1].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@EntityId", global::System.Data.SqlDbType.UniqueIdentifier, 16, global::System.Data.ParameterDirection.Input, 0, 0, "EntityId", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._commandCollection[2] = new global::System.Data.SqlClient.SqlCommand();
+            this._commandCollection[2].Connection = this.Connection;
+            this._commandCollection[2].CommandText = "SELECT * FROM dbo.GrantedPermissions WHERE PermissionId = @PermissionId";
+            this._commandCollection[2].CommandType = global::System.Data.CommandType.Text;
+            this._commandCollection[2].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@PermissionId", global::System.Data.SqlDbType.UniqueIdentifier, 16, global::System.Data.ParameterDirection.Input, 0, 0, "PermissionId", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._commandCollection[3] = new global::System.Data.SqlClient.SqlCommand();
+            this._commandCollection[3].Connection = this.Connection;
+            this._commandCollection[3].CommandText = "SELECT * FROM dbo.GrantedPermissions WHERE PermissionOwnerId = @PermissionOwnerId" +
+                "";
+            this._commandCollection[3].CommandType = global::System.Data.CommandType.Text;
+            this._commandCollection[3].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@PermissionOwnerId", global::System.Data.SqlDbType.UniqueIdentifier, 16, global::System.Data.ParameterDirection.Input, 0, 0, "PermissionOwnerId", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._commandCollection[4] = new global::System.Data.SqlClient.SqlCommand();
+            this._commandCollection[4].Connection = this.Connection;
+            this._commandCollection[4].CommandText = "SELECT * FROM dbo.GrantedPermissions WHERE PermissionId = @PermissionId AND Permi" +
+                "ssionOwnerId = @PermissionOwnerId AND EntityId = @EntityId";
+            this._commandCollection[4].CommandType = global::System.Data.CommandType.Text;
+            this._commandCollection[4].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@PermissionId", global::System.Data.SqlDbType.UniqueIdentifier, 16, global::System.Data.ParameterDirection.Input, 0, 0, "PermissionId", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._commandCollection[4].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@PermissionOwnerId", global::System.Data.SqlDbType.UniqueIdentifier, 16, global::System.Data.ParameterDirection.Input, 0, 0, "PermissionOwnerId", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._commandCollection[4].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@EntityId", global::System.Data.SqlDbType.UniqueIdentifier, 16, global::System.Data.ParameterDirection.Input, 0, 0, "EntityId", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
         }
         
@@ -2863,4 +2887,104 @@
         public virtual dsSecurity.GrantedPermissionsDataTable GetData() {
             this.Adapter.SelectCommand = this.CommandCollection[0];
+            dsSecurity.GrantedPermissionsDataTable dataTable = new dsSecurity.GrantedPermissionsDataTable();
+            this.Adapter.Fill(dataTable);
+            return dataTable;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Fill, false)]
+        public virtual int FillByEntityId(dsSecurity.GrantedPermissionsDataTable dataTable, System.Guid EntityId) {
+            this.Adapter.SelectCommand = this.CommandCollection[1];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(EntityId));
+            if ((this.ClearBeforeFill == true)) {
+                dataTable.Clear();
+            }
+            int returnValue = this.Adapter.Fill(dataTable);
+            return returnValue;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, false)]
+        public virtual dsSecurity.GrantedPermissionsDataTable GetDataByEntityId(System.Guid EntityId) {
+            this.Adapter.SelectCommand = this.CommandCollection[1];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(EntityId));
+            dsSecurity.GrantedPermissionsDataTable dataTable = new dsSecurity.GrantedPermissionsDataTable();
+            this.Adapter.Fill(dataTable);
+            return dataTable;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Fill, false)]
+        public virtual int FillByPermissionId(dsSecurity.GrantedPermissionsDataTable dataTable, System.Guid PermissionId) {
+            this.Adapter.SelectCommand = this.CommandCollection[2];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(PermissionId));
+            if ((this.ClearBeforeFill == true)) {
+                dataTable.Clear();
+            }
+            int returnValue = this.Adapter.Fill(dataTable);
+            return returnValue;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, false)]
+        public virtual dsSecurity.GrantedPermissionsDataTable GetDataByPermissionId(System.Guid PermissionId) {
+            this.Adapter.SelectCommand = this.CommandCollection[2];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(PermissionId));
+            dsSecurity.GrantedPermissionsDataTable dataTable = new dsSecurity.GrantedPermissionsDataTable();
+            this.Adapter.Fill(dataTable);
+            return dataTable;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Fill, false)]
+        public virtual int FillByPermissionOwnerId(dsSecurity.GrantedPermissionsDataTable dataTable, System.Guid PermissionOwnerId) {
+            this.Adapter.SelectCommand = this.CommandCollection[3];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(PermissionOwnerId));
+            if ((this.ClearBeforeFill == true)) {
+                dataTable.Clear();
+            }
+            int returnValue = this.Adapter.Fill(dataTable);
+            return returnValue;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, false)]
+        public virtual dsSecurity.GrantedPermissionsDataTable GetDataByPermissionOwnerId(System.Guid PermissionOwnerId) {
+            this.Adapter.SelectCommand = this.CommandCollection[3];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(PermissionOwnerId));
+            dsSecurity.GrantedPermissionsDataTable dataTable = new dsSecurity.GrantedPermissionsDataTable();
+            this.Adapter.Fill(dataTable);
+            return dataTable;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Fill, false)]
+        public virtual int FillByPermissionPermissionOwnerEntityId(dsSecurity.GrantedPermissionsDataTable dataTable, System.Guid PermissionId, System.Guid PermissionOwnerId, System.Guid EntityId) {
+            this.Adapter.SelectCommand = this.CommandCollection[4];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(PermissionId));
+            this.Adapter.SelectCommand.Parameters[1].Value = ((System.Guid)(PermissionOwnerId));
+            this.Adapter.SelectCommand.Parameters[2].Value = ((System.Guid)(EntityId));
+            if ((this.ClearBeforeFill == true)) {
+                dataTable.Clear();
+            }
+            int returnValue = this.Adapter.Fill(dataTable);
+            return returnValue;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, false)]
+        public virtual dsSecurity.GrantedPermissionsDataTable GetDataByPermissionPermissionOwnerEntityId(System.Guid PermissionId, System.Guid PermissionOwnerId, System.Guid EntityId) {
+            this.Adapter.SelectCommand = this.CommandCollection[4];
+            this.Adapter.SelectCommand.Parameters[0].Value = ((System.Guid)(PermissionId));
+            this.Adapter.SelectCommand.Parameters[1].Value = ((System.Guid)(PermissionOwnerId));
+            this.Adapter.SelectCommand.Parameters[2].Value = ((System.Guid)(EntityId));
             dsSecurity.GrantedPermissionsDataTable dataTable = new dsSecurity.GrantedPermissionsDataTable();
             this.Adapter.Fill(dataTable);
Index: /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.xsd
===================================================================
--- /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.xsd	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.xsd	(revision 1720)
@@ -59,5 +59,48 @@
               <Mapping SourceColumn="EntityId" DataSetColumn="EntityId" />
             </Mappings>
-            <Sources />
+            <Sources>
+              <DbSource ConnectionRef="HeuristicLab_SecurityConnectionString (Settings)" DbObjectName="[HeuristicLab.Security].dbo.GrantedPermissions" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="FillByEntityId" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetDataByEntityId" GeneratorSourceName="FillByEntityId" GetMethodModifier="Public" GetMethodName="GetDataByEntityId" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetDataByEntityId" UserSourceName="FillByEntityId">
+                <SelectCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="true">
+                    <CommandText>SELECT * FROM dbo.GrantedPermissions WHERE EntityId = @EntityId</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="EntityId" ColumnName="EntityId" DataSourceName="[HeuristicLab.Security].dbo.GrantedPermissions" DataTypeServer="uniqueidentifier" DbType="Guid" Direction="Input" ParameterName="@EntityId" Precision="0" ProviderType="UniqueIdentifier" Scale="0" Size="16" SourceColumn="EntityId" SourceColumnNullMapping="false" SourceVersion="Current" />
+                    </Parameters>
+                  </DbCommand>
+                </SelectCommand>
+              </DbSource>
+              <DbSource ConnectionRef="HeuristicLab_SecurityConnectionString (Settings)" DbObjectName="[HeuristicLab.Security].dbo.GrantedPermissions" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="FillByPermissionId" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetDataByPermissionId" GeneratorSourceName="FillByPermissionId" GetMethodModifier="Public" GetMethodName="GetDataByPermissionId" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetDataByPermissionId" UserSourceName="FillByPermissionId">
+                <SelectCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="true">
+                    <CommandText>SELECT * FROM dbo.GrantedPermissions WHERE PermissionId = @PermissionId</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="PermissionId" ColumnName="PermissionId" DataSourceName="[HeuristicLab.Security].dbo.GrantedPermissions" DataTypeServer="uniqueidentifier" DbType="Guid" Direction="Input" ParameterName="@PermissionId" Precision="0" ProviderType="UniqueIdentifier" Scale="0" Size="16" SourceColumn="PermissionId" SourceColumnNullMapping="false" SourceVersion="Current" />
+                    </Parameters>
+                  </DbCommand>
+                </SelectCommand>
+              </DbSource>
+              <DbSource ConnectionRef="HeuristicLab_SecurityConnectionString (Settings)" DbObjectName="[HeuristicLab.Security].dbo.GrantedPermissions" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="FillByPermissionOwnerId" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetDataByPermissionOwnerId" GeneratorSourceName="FillByPermissionOwnerId" GetMethodModifier="Public" GetMethodName="GetDataByPermissionOwnerId" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetDataByPermissionOwnerId" UserSourceName="FillByPermissionOwnerId">
+                <SelectCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="true">
+                    <CommandText>SELECT * FROM dbo.GrantedPermissions WHERE PermissionOwnerId = @PermissionOwnerId</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="PermissionOwnerId" ColumnName="PermissionOwnerId" DataSourceName="[HeuristicLab.Security].dbo.GrantedPermissions" DataTypeServer="uniqueidentifier" DbType="Guid" Direction="Input" ParameterName="@PermissionOwnerId" Precision="0" ProviderType="UniqueIdentifier" Scale="0" Size="16" SourceColumn="PermissionOwnerId" SourceColumnNullMapping="false" SourceVersion="Current" />
+                    </Parameters>
+                  </DbCommand>
+                </SelectCommand>
+              </DbSource>
+              <DbSource ConnectionRef="HeuristicLab_SecurityConnectionString (Settings)" DbObjectName="[HeuristicLab.Security].dbo.GrantedPermissions" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="FillByPermissionPermissionOwnerEntityId" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetDataByPermissionPermissionOwnerEntityId" GeneratorSourceName="FillByPermissionPermissionOwnerEntityId" GetMethodModifier="Public" GetMethodName="GetDataByPermissionPermissionOwnerEntityId" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetDataByPermissionPermissionOwnerEntityId" UserSourceName="FillByPermissionPermissionOwnerEntityId">
+                <SelectCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="true">
+                    <CommandText>SELECT * FROM dbo.GrantedPermissions WHERE PermissionId = @PermissionId AND PermissionOwnerId = @PermissionOwnerId AND EntityId = @EntityId</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="PermissionId" ColumnName="PermissionId" DataSourceName="[HeuristicLab.Security].dbo.GrantedPermissions" DataTypeServer="uniqueidentifier" DbType="Guid" Direction="Input" ParameterName="@PermissionId" Precision="0" ProviderType="UniqueIdentifier" Scale="0" Size="16" SourceColumn="PermissionId" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="PermissionOwnerId" ColumnName="PermissionOwnerId" DataSourceName="[HeuristicLab.Security].dbo.GrantedPermissions" DataTypeServer="uniqueidentifier" DbType="Guid" Direction="Input" ParameterName="@PermissionOwnerId" Precision="0" ProviderType="UniqueIdentifier" Scale="0" Size="16" SourceColumn="PermissionOwnerId" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="EntityId" ColumnName="EntityId" DataSourceName="[HeuristicLab.Security].dbo.GrantedPermissions" DataTypeServer="uniqueidentifier" DbType="Guid" Direction="Input" ParameterName="@EntityId" Precision="0" ProviderType="UniqueIdentifier" Scale="0" Size="16" SourceColumn="EntityId" SourceColumnNullMapping="false" SourceVersion="Current" />
+                    </Parameters>
+                  </DbCommand>
+                </SelectCommand>
+              </DbSource>
+            </Sources>
           </TableAdapter>
           <TableAdapter BaseClass="System.ComponentModel.Component" DataAccessorModifier="AutoLayout, AnsiClass, Class, Public" DataAccessorName="UserGroupTableAdapter" GeneratorDataComponentClassName="UserGroupTableAdapter" Name="UserGroup" UserDataComponentName="UserGroupTableAdapter">
@@ -399,7 +442,7 @@
           <xs:complexType>
             <xs:sequence>
-              <xs:element name="PermissionId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionId" msprop:Generator_ColumnPropNameInRow="PermissionId" msprop:Generator_ColumnVarNameInTable="columnPermissionId" msprop:Generator_ColumnPropNameInTable="PermissionIdColumn" type="xs:string" />
-              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
-              <xs:element name="EntityId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="EntityId" msprop:Generator_ColumnPropNameInRow="EntityId" msprop:Generator_ColumnVarNameInTable="columnEntityId" msprop:Generator_ColumnPropNameInTable="EntityIdColumn" type="xs:string" />
+              <xs:element name="PermissionId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionId" msprop:Generator_ColumnVarNameInTable="columnPermissionId" msprop:Generator_ColumnPropNameInRow="PermissionId" msprop:Generator_ColumnPropNameInTable="PermissionIdColumn" type="xs:string" />
+              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
+              <xs:element name="EntityId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="EntityId" msprop:Generator_ColumnVarNameInTable="columnEntityId" msprop:Generator_ColumnPropNameInRow="EntityId" msprop:Generator_ColumnPropNameInTable="EntityIdColumn" type="xs:string" />
             </xs:sequence>
           </xs:complexType>
@@ -408,5 +451,5 @@
           <xs:complexType>
             <xs:sequence>
-              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
+              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
             </xs:sequence>
           </xs:complexType>
@@ -415,20 +458,20 @@
           <xs:complexType>
             <xs:sequence>
-              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
-              <xs:element name="Password" msprop:Generator_UserColumnName="Password" msprop:Generator_ColumnVarNameInTable="columnPassword" msprop:Generator_ColumnPropNameInRow="Password" msprop:Generator_ColumnPropNameInTable="PasswordColumn" minOccurs="0">
-                <xs:simpleType>
-                  <xs:restriction base="xs:string">
-                    <xs:maxLength value="2147483647" />
-                  </xs:restriction>
-                </xs:simpleType>
-              </xs:element>
-              <xs:element name="Login" msprop:Generator_UserColumnName="Login" msprop:Generator_ColumnVarNameInTable="columnLogin" msprop:Generator_ColumnPropNameInRow="Login" msprop:Generator_ColumnPropNameInTable="LoginColumn" minOccurs="0">
-                <xs:simpleType>
-                  <xs:restriction base="xs:string">
-                    <xs:maxLength value="2147483647" />
-                  </xs:restriction>
-                </xs:simpleType>
-              </xs:element>
-              <xs:element name="MailAddress" msprop:Generator_UserColumnName="MailAddress" msprop:Generator_ColumnVarNameInTable="columnMailAddress" msprop:Generator_ColumnPropNameInRow="MailAddress" msprop:Generator_ColumnPropNameInTable="MailAddressColumn" minOccurs="0">
+              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
+              <xs:element name="Password" msprop:Generator_UserColumnName="Password" msprop:Generator_ColumnPropNameInRow="Password" msprop:Generator_ColumnVarNameInTable="columnPassword" msprop:Generator_ColumnPropNameInTable="PasswordColumn" minOccurs="0">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="2147483647" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="Login" msprop:Generator_UserColumnName="Login" msprop:Generator_ColumnPropNameInRow="Login" msprop:Generator_ColumnVarNameInTable="columnLogin" msprop:Generator_ColumnPropNameInTable="LoginColumn" minOccurs="0">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="2147483647" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="MailAddress" msprop:Generator_UserColumnName="MailAddress" msprop:Generator_ColumnPropNameInRow="MailAddress" msprop:Generator_ColumnVarNameInTable="columnMailAddress" msprop:Generator_ColumnPropNameInTable="MailAddressColumn" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
@@ -443,20 +486,20 @@
           <xs:complexType>
             <xs:sequence>
-              <xs:element name="PermissionId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionId" msprop:Generator_ColumnPropNameInRow="PermissionId" msprop:Generator_ColumnVarNameInTable="columnPermissionId" msprop:Generator_ColumnPropNameInTable="PermissionIdColumn" type="xs:string" />
-              <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnPropNameInTable="NameColumn" minOccurs="0">
-                <xs:simpleType>
-                  <xs:restriction base="xs:string">
-                    <xs:maxLength value="2147483647" />
-                  </xs:restriction>
-                </xs:simpleType>
-              </xs:element>
-              <xs:element name="Description" msprop:Generator_UserColumnName="Description" msprop:Generator_ColumnVarNameInTable="columnDescription" msprop:Generator_ColumnPropNameInRow="Description" msprop:Generator_ColumnPropNameInTable="DescriptionColumn" minOccurs="0">
-                <xs:simpleType>
-                  <xs:restriction base="xs:string">
-                    <xs:maxLength value="2147483647" />
-                  </xs:restriction>
-                </xs:simpleType>
-              </xs:element>
-              <xs:element name="Plugin" msprop:Generator_UserColumnName="Plugin" msprop:Generator_ColumnVarNameInTable="columnPlugin" msprop:Generator_ColumnPropNameInRow="Plugin" msprop:Generator_ColumnPropNameInTable="PluginColumn" minOccurs="0">
+              <xs:element name="PermissionId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionId" msprop:Generator_ColumnVarNameInTable="columnPermissionId" msprop:Generator_ColumnPropNameInRow="PermissionId" msprop:Generator_ColumnPropNameInTable="PermissionIdColumn" type="xs:string" />
+              <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInTable="NameColumn" minOccurs="0">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="2147483647" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="Description" msprop:Generator_UserColumnName="Description" msprop:Generator_ColumnPropNameInRow="Description" msprop:Generator_ColumnVarNameInTable="columnDescription" msprop:Generator_ColumnPropNameInTable="DescriptionColumn" minOccurs="0">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="2147483647" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="Plugin" msprop:Generator_UserColumnName="Plugin" msprop:Generator_ColumnPropNameInRow="Plugin" msprop:Generator_ColumnVarNameInTable="columnPlugin" msprop:Generator_ColumnPropNameInTable="PluginColumn" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
@@ -471,6 +514,6 @@
           <xs:complexType>
             <xs:sequence>
-              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
-              <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnPropNameInTable="NameColumn" minOccurs="0">
+              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
+              <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInTable="NameColumn" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
@@ -485,6 +528,6 @@
           <xs:complexType>
             <xs:sequence>
-              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
-              <xs:element name="UserGroupId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="UserGroupId" msprop:Generator_ColumnPropNameInRow="UserGroupId" msprop:Generator_ColumnVarNameInTable="columnUserGroupId" msprop:Generator_ColumnPropNameInTable="UserGroupIdColumn" type="xs:string" />
+              <xs:element name="PermissionOwnerId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="PermissionOwnerId" msprop:Generator_ColumnVarNameInTable="columnPermissionOwnerId" msprop:Generator_ColumnPropNameInRow="PermissionOwnerId" msprop:Generator_ColumnPropNameInTable="PermissionOwnerIdColumn" type="xs:string" />
+              <xs:element name="UserGroupId" msdata:DataType="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" msprop:Generator_UserColumnName="UserGroupId" msprop:Generator_ColumnVarNameInTable="columnUserGroupId" msprop:Generator_ColumnPropNameInRow="UserGroupId" msprop:Generator_ColumnPropNameInTable="UserGroupIdColumn" type="xs:string" />
             </xs:sequence>
           </xs:complexType>
Index: /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.xss
===================================================================
--- /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.xss	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.ADODataAccess/3.2/dsSecurity.xss	(revision 1720)
@@ -7,5 +7,5 @@
 <DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="231" ViewPortY="48" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
   <Shapes>
-    <Shape ID="DesignTable:GrantedPermissions" ZOrder="9" X="241" Y="438" Height="122" Width="256" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="75" />
+    <Shape ID="DesignTable:GrantedPermissions" ZOrder="9" X="241" Y="438" Height="190" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="75" />
     <Shape ID="DesignTable:UserGroup" ZOrder="8" X="946" Y="238" Height="106" Width="202" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="42" />
     <Shape ID="DesignTable:HLUser" ZOrder="2" X="577" Y="484" Height="156" Width="182" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="92" />
@@ -38,5 +38,5 @@
         </Point>
         <Point>
-          <X>497</X>
+          <X>541</X>
           <Y>455</Y>
         </Point>
Index: /trunk/sources/HeuristicLab.Security.Contracts/3.2/BusinessObjects/GrantedPermission.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.Contracts/3.2/BusinessObjects/GrantedPermission.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.Contracts/3.2/BusinessObjects/GrantedPermission.cs	(revision 1720)
@@ -24,15 +24,16 @@
 using System.Text;
 using System.Runtime.Serialization;
+using HeuristicLab.DataAccess.Interfaces;
 
 namespace HeuristicLab.Security.Contracts.BusinessObjects {
   
   [DataContract]
-  public class GrantedPermission : PersistableObject {
+  public class GrantedPermission {    
     [DataMember]
-    public Permission Permission { get; set; }
+    public Guid PermissionId { get; set; }
     [DataMember]
     public Guid EntityId { get; set; }
     [DataMember]
-    public PermissionOwner PermissionOwner { get; set; }
+    public Guid PermissionOwnerId { get; set; }
   }
 }
Index: /trunk/sources/HeuristicLab.Security.Core/3.2/PermissionManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.Core/3.2/PermissionManager.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.Core/3.2/PermissionManager.cs	(revision 1720)
@@ -73,5 +73,5 @@
           
           if ((permission != null) && (permOwner != null))
-            return (permissionAdapter.getPermission(permOwner, permission,entityId) != null);
+            return (permissionAdapter.getPermission(permOwner.Id, permission.Id, entityId) != null);
           else return false;
         }
Index: /trunk/sources/HeuristicLab.Security.DataAccess/3.2/IPermissionAdapter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.DataAccess/3.2/IPermissionAdapter.cs	(revision 1719)
+++ /trunk/sources/HeuristicLab.Security.DataAccess/3.2/IPermissionAdapter.cs	(revision 1720)
@@ -38,5 +38,5 @@
     /// <param name="entityId"></param>
     /// <returns></returns>
-    GrantedPermission getPermission(PermissionOwner permissionOwner, Permission permission, Guid entityId);
+    GrantedPermission getPermission(Guid permissionOwnerId, Guid permissionId, Guid entityId);
 
     /// <summary>
