diff --git a/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod b/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
index fe089ed55075ea4743a46e0a380b07203b6efec0..22665a76510afe814f6249d87ccd55d4129fb05b 100644
--- a/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
+++ b/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
@@ -92,6 +92,7 @@
       <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias>
       <isPageable v="false" />
       <isFilterable v="true" />
+      <isSortable v="true" />
       <contentProcess>%aditoprj%/entity/PermissionMetaData_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
diff --git a/entity/PermissionMetaData_entity/recordcontainers/jdito/contentProcess.js b/entity/PermissionMetaData_entity/recordcontainers/jdito/contentProcess.js
index 88ebe7191307eca9c722e78e99c00a77bf3e52aa..0b415b767e292de18d6e094b9d6073adf8010107 100644
--- a/entity/PermissionMetaData_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/PermissionMetaData_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.vars");
 import("system.result");
 import("system.project");
@@ -17,4 +18,23 @@ if (selectedEntity == null) {
     res.push([entity[0], entity[1], entity[2], entity[6]]);
 }
 
-result.object(res.sort());
\ No newline at end of file
+var order = vars.get("$local.order");
+var columnOrder = {
+    "UID.value" : 1,
+    "TITLE.value" : 2
+};
+var sortOrder = [];
+for (let field in order)
+{
+    if (field in columnOrder)
+    {
+        sortOrder.push(columnOrder[field]);
+        sortOrder.push(order[field] == "DOWN");
+    }
+}
+if (!sortOrder.length) //sort by entity name by default
+    sortOrder = [1, false];
+
+ArrayUtils.sortMulti(res, sortOrder);
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/PermissionOverview_entity/PermissionOverview_entity.aod b/entity/PermissionOverview_entity/PermissionOverview_entity.aod
index 58ab47b9975b00c4b67b44922f5ac2bf9c144104..fd6fc59650653ac2300ce7605660c6b70397d4a0 100644
--- a/entity/PermissionOverview_entity/PermissionOverview_entity.aod
+++ b/entity/PermissionOverview_entity/PermissionOverview_entity.aod
@@ -86,6 +86,7 @@
       <name>jDito</name>
       <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias>
       <isFilterable v="false" />
+      <isSortable v="true" />
       <contentProcess>%aditoprj%/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
diff --git a/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js b/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js
index c99614f12f2d1f5c9ab7a3323041a6fa425d209d..91b35720856e710bc0391020dc68b607c6328c00 100644
--- a/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("Sql_lib");
 import("system.project");
 import("system.vars");
@@ -80,6 +81,30 @@ for each (var entry in rolesOrEntities) { // entry contains either a role or an
 
     res.push(currOverview);
 }
+
+var order = vars.get("$local.order");
+var columnOrder = {
+    "ENTITY.value" : 1,
+    "ACTION_VIEW.value" : 2,
+    "ACTION_CREATE.value" : 3,
+    "ACTION_READ.value" : 4,
+    "ACTION_UPDATE.value" : 5,
+    "ACTION_DELETE.value" : 6
+};
+var sortOrder = [];
+for (let field in order)
+{
+    if (field in columnOrder)
+    {
+        sortOrder.push(columnOrder[field]);
+        sortOrder.push(order[field] == "DOWN");
+    }
+}
+if (!sortOrder.length) //sort by entity or role by default
+    sortOrder = [1, false];
+
+ArrayUtils.sortMulti(res, sortOrder);
+
 result.object(res);
 
 function prepareOverview(pPermSetId, pCurrOverview, pMode) {
diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index ee8b103c8d209a2f32bd8aa8060a155335a5112f..6e7e70808590a0c64e4b8f4654d3ee8033c40bd0 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -142,6 +142,7 @@
       <name>jDito</name>
       <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias>
       <isFilterable v="true" />
+      <isSortable 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>
diff --git a/entity/Role_entity/recordcontainers/jdito/contentProcess.js b/entity/Role_entity/recordcontainers/jdito/contentProcess.js
index 0c6c46b70b1a95980ae3ddfc8a13498eb96d91ea..58a9778135dfb21e9a90f9afa8106c6eb5df1ade 100644
--- a/entity/Role_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Role_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.translate");
 import("system.vars");
 import("system.result");
@@ -41,4 +42,25 @@ if (ids != null)
     });
 }
 
-result.object(res.sort());
\ No newline at end of file
+var order = vars.get("$local.order");
+var columnOrder = {
+    "ROLENAME.value" : 1,
+    "ROLETITLE.value" : 2,
+    "ROLETYPE.value" : 3,
+    "USERCOUNT.value" : 5
+};
+var sortOrder = [];
+for (let field in order)
+{
+    if (field in columnOrder)
+    {
+        sortOrder.push(columnOrder[field]);
+        sortOrder.push(order[field] == "DOWN");
+    }
+}
+if (!sortOrder.length) //sort by role name by default
+    sortOrder = [1, false];
+
+ArrayUtils.sortMulti(res, sortOrder);
+
+result.object(res);
\ No newline at end of file