diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index 9ccd151de033f4c6979efbf56ef7b1989fda01ba..d0d3f2a24209c5b56ff083e4946844575d4efd29 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -5,7 +5,8 @@
   <documentation>%aditoprj%/entity/Role_entity/documentation.adoc</documentation>
   <icon>VAADIN:USER_CHECK</icon>
   <title>Roles</title>
-  <grantCreate v="false" />
+  <grantUpdateProcess>%aditoprj%/entity/Role_entity/grantUpdateProcess.js</grantUpdateProcess>
+  <grantDeleteProcess>%aditoprj%/entity/Role_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Role_entity/contentTitleProcess.js</contentTitleProcess>
   <iconId>VAADIN:USER_CHECK</iconId>
   <titlePlural>Roles</titlePlural>
@@ -17,6 +18,7 @@
     <entityField>
       <name>ROLETITLE</name>
       <title>Title</title>
+      <mandatory v="true" />
     </entityField>
     <entityField>
       <name>ROLETYPE</name>
@@ -27,7 +29,9 @@
       <title>Description</title>
     </entityField>
     <entityField>
-      <name>UID</name>
+      <name>ROLENAME</name>
+      <title>Name</title>
+      <mandatory v="true" />
     </entityField>
     <entityField>
       <name>USERCOUNT</name>
@@ -101,6 +105,16 @@
         </entityDependency>
       </dependencies>
     </entityProvider>
+    <entityField>
+      <name>IS_ASSIGNABLE</name>
+      <title>is assignable</title>
+      <contentType>BOOLEAN</contentType>
+      <dropDownProcess>%aditoprj%/entity/Role_entity/entityfields/is_assignable/dropDownProcess.js</dropDownProcess>
+      <valueProcess>%aditoprj%/entity/Role_entity/entityfields/is_assignable/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -108,10 +122,16 @@
       <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias>
       <isFilterable v="true" />
       <contentProcess>%aditoprj%/entity/Role_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/Role_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/Role_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/Role_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ROLENAME.value</name>
+        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>ROLETITLE.value</name>
           <isFilterable v="true" />
@@ -128,6 +148,9 @@
           <name>USERCOUNT.value</name>
           <isFilterable v="false" />
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>IS_ASSIGNABLE.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Role_entity/entityfields/is_assignable/dropDownProcess.js b/entity/Role_entity/entityfields/is_assignable/dropDownProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..781915d0aed184638a4e8fa0d8cdd406bb93ab14
--- /dev/null
+++ b/entity/Role_entity/entityfields/is_assignable/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.translate");
+import("system.result");
+
+result.object([
+["1", translate.text("yes")]
+,["0", translate.text("no")]
+]);
\ No newline at end of file
diff --git a/entity/Role_entity/entityfields/is_assignable/valueProcess.js b/entity/Role_entity/entityfields/is_assignable/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb9de161ae157656cd2180ed9a8e0347b6d8ab6c
--- /dev/null
+++ b/entity/Role_entity/entityfields/is_assignable/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+if (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) {
+    result.string("1");
+}
\ No newline at end of file
diff --git a/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js b/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js
index 2c71e53a498b1ad3d5a0f915aacb4a836b81657f..c4fc6bffb984a2312dbe938d59b5770b9703ce50 100644
--- a/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js
+++ b/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.UID"));
\ No newline at end of file
+result.string(vars.get("$field.ROLENAME"));
\ No newline at end of file
diff --git a/entity/Role_entity/entityfields/permissions/children/roletitle_param/valueProcess.js b/entity/Role_entity/entityfields/permissions/children/roletitle_param/valueProcess.js
index 2c71e53a498b1ad3d5a0f915aacb4a836b81657f..c4fc6bffb984a2312dbe938d59b5770b9703ce50 100644
--- a/entity/Role_entity/entityfields/permissions/children/roletitle_param/valueProcess.js
+++ b/entity/Role_entity/entityfields/permissions/children/roletitle_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.UID"));
\ No newline at end of file
+result.string(vars.get("$field.ROLENAME"));
\ No newline at end of file
diff --git a/entity/Role_entity/grantDeleteProcess.js b/entity/Role_entity/grantDeleteProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..81c7d9f200eb871ee52c740e473158e3de0322dd
--- /dev/null
+++ b/entity/Role_entity/grantDeleteProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+
+if (vars.get("$field.ROLETYPE") == "CUSTOM") {
+    result.string(true);
+} else {
+    result.string(false);
+}
\ No newline at end of file
diff --git a/entity/Role_entity/grantUpdateProcess.js b/entity/Role_entity/grantUpdateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..81c7d9f200eb871ee52c740e473158e3de0322dd
--- /dev/null
+++ b/entity/Role_entity/grantUpdateProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+
+if (vars.get("$field.ROLETYPE") == "CUSTOM") {
+    result.string(true);
+} else {
+    result.string(false);
+}
\ No newline at end of file
diff --git a/entity/Role_entity/recordcontainers/jdito/contentProcess.js b/entity/Role_entity/recordcontainers/jdito/contentProcess.js
index 1044e52c48b698185800764da51caaf372620fc2..0c6c46b70b1a95980ae3ddfc8a13498eb96d91ea 100644
--- a/entity/Role_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Role_entity/recordcontainers/jdito/contentProcess.js
@@ -23,7 +23,7 @@ for each (let role in allRoles) {
     var roleName = role[3];
     if (!excludeRoles[roleName]) {
         let numberOfUsersInSelectedRole = tools.getUsersWithRole(roleName).length;
-        res.push([roleName, role[0], role[1], role[2], numberOfUsersInSelectedRole + " " + translate.text("User", locale)]);
+        res.push([roleName, roleName, role[0], role[1], role[2], numberOfUsersInSelectedRole + " " + translate.text("User", locale), role[4] ? "1" : "0"]);
     }
 }
 
diff --git a/entity/Role_entity/recordcontainers/jdito/onDelete.js b/entity/Role_entity/recordcontainers/jdito/onDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..fde2f29b37ba7e1a1c8ef746f6b55d501ede6e07
--- /dev/null
+++ b/entity/Role_entity/recordcontainers/jdito/onDelete.js
@@ -0,0 +1,5 @@
+import("system.tools");
+import("system.vars");
+
+var name = vars.get("$field.ROLENAME"); // field got prefix "CUSTOM_" already
+tools.deleteRole(name);
\ No newline at end of file
diff --git a/entity/Role_entity/recordcontainers/jdito/onInsert.js b/entity/Role_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..bfad3b29f30fb6c51e10529b58d4bd44ec019aa0
--- /dev/null
+++ b/entity/Role_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,5 @@
+import("system.tools");
+import("system.vars");
+
+var name = "CUSTOM_" + vars.get("$field.ROLENAME");  // field gets prefix "CUSTOM_"
+tools.createRole(name, vars.get("$field.ROLETITLE"), vars.get("$field.ROLEDESCRIPTION"), vars.get("$field.IS_ASSIGNABLE") == "0" ? false : true, null);
\ No newline at end of file
diff --git a/entity/Role_entity/recordcontainers/jdito/onUpdate.js b/entity/Role_entity/recordcontainers/jdito/onUpdate.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6e58304bb8f7ea60a384c5ce74b45d03945c239
--- /dev/null
+++ b/entity/Role_entity/recordcontainers/jdito/onUpdate.js
@@ -0,0 +1,5 @@
+import("system.tools");
+import("system.vars");
+
+var name = vars.get("$field.ROLENAME");  // field got prefix "CUSTOM_" already
+tools.updateRole(name, vars.get("$field.ROLETITLE"), vars.get("$field.ROLEDESCRIPTION"), true, null);
\ No newline at end of file
diff --git a/neonView/RoleEdit_view/RoleEdit_view.aod b/neonView/RoleEdit_view/RoleEdit_view.aod
index a8bb06d0e8a06b950f91b29198af76a4d0249876..a15091cae4424fde0d5fbce26599272ad160f6fe 100644
--- a/neonView/RoleEdit_view/RoleEdit_view.aod
+++ b/neonView/RoleEdit_view/RoleEdit_view.aod
@@ -14,17 +14,21 @@
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
-          <name>13372a89-9e3c-441f-a80a-2ebb2dd0d54d</name>
-          <entityField>ROLETITLE</entityField>
+          <name>851dc6d8-7522-4fb8-a46a-15fb8010f6e7</name>
+          <entityField>ROLENAME</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>2818c096-b602-406d-8765-ec85356da84c</name>
-          <entityField>ROLETYPE</entityField>
+          <name>13372a89-9e3c-441f-a80a-2ebb2dd0d54d</name>
+          <entityField>ROLETITLE</entityField>
         </entityFieldLink>
         <entityFieldLink>
           <name>c1008a40-23d4-43f9-a5f4-e96b9ad4e480</name>
           <entityField>ROLEDESCRIPTION</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>e09d4310-1cc4-4e91-b93c-aba335456ccb</name>
+          <entityField>IS_ASSIGNABLE</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/RoleFilter_view/RoleFilter_view.aod b/neonView/RoleFilter_view/RoleFilter_view.aod
index 113dc060788c3b659d79872c999f33930d82768a..48282af2d10b0ea2ab9d5601f1318a36ad70e9eb 100644
--- a/neonView/RoleFilter_view/RoleFilter_view.aod
+++ b/neonView/RoleFilter_view/RoleFilter_view.aod
@@ -26,7 +26,7 @@
         </neonTableColumn>
         <neonTableColumn>
           <name>954cb883-bf05-4807-b303-98b31bf8f75e</name>
-          <entityField>UID</entityField>
+          <entityField>ROLENAME</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>e6d9050e-3139-48cc-b186-085dab1cec89</name>
diff --git a/neonView/RolePreview_view/RolePreview_view.aod b/neonView/RolePreview_view/RolePreview_view.aod
index 5cc6460a7662a01401fece5e0a1a66891dc00c07..402b33e3122349f9ee848ab209fe6aa7faaaf319 100644
--- a/neonView/RolePreview_view/RolePreview_view.aod
+++ b/neonView/RolePreview_view/RolePreview_view.aod
@@ -11,7 +11,7 @@
     <cardViewTemplate>
       <name>Card</name>
       <iconField>#ICON</iconField>
-      <titleField>UID</titleField>
+      <titleField>ROLENAME</titleField>
       <subtitleField>ROLETITLE</subtitleField>
       <descriptionField>USERCOUNT</descriptionField>
       <entityField>#ENTITY</entityField>