diff --git a/.docker/.env b/.docker/.env
index f72626ab5ef38013f5672b522006ea410925ead0..d191e59edda36e8ca7795d1da35710d28129cfdc 100644
--- a/.docker/.env
+++ b/.docker/.env
@@ -1,4 +1,4 @@
-APP_VERSION=1.9
+APP_VERSION=1.9.2
 FLUENTBIT_VERSION=4.0.0
 GRAFANA_VERSION=11.4.0
 MARIADB_VERSION=11.3.2
diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml
index c88d780c356bdb651f00ca61cfb7c7e03ff53196..833e44e38550953f02544a3bb78a4e2fbb650f43 100644
--- a/.docker/docker-compose.yml
+++ b/.docker/docker-compose.yml
@@ -316,14 +316,6 @@ services:
       - search-db-data:/bitnami/opensearch/data
     ports:
       - "9200:9200"
-    deploy:
-      resources:
-        reservations:
-          cpus: '0.25'
-          memory: 512M
-        limits:
-          cpus: '0.50'
-          memory: 2048M
     healthcheck:
       test: curl -sSL 127.0.0.1:9200
       <<: *healthcheck-params
@@ -389,7 +381,7 @@ services:
     ports:
       - "80:8080"
     volumes:
-      - ./conf/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro
+      - ./config/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro
     depends_on:
       dbrepo-analyse-service:
         condition: service_healthy
diff --git a/.docs/.openapi/api-analyse-service.yaml b/.docs/.openapi/api-analyse-service.yaml
index 287da431362cba6b19ff3783011daa183ae2b889..b32200943151d90ba32f6b8baf8b647d5cfeeda5 100644
--- a/.docs/.openapi/api-analyse-service.yaml
+++ b/.docs/.openapi/api-analyse-service.yaml
@@ -124,7 +124,7 @@
       "url": "https://www.apache.org/licenses/LICENSE-2.0"
     },
     "title": "Database Repository Analyse Service API",
-    "version": "1.9.0"
+    "version": "1.9.2"
   },
   "openapi": "3.0.0",
   "paths": {
diff --git a/.docs/.openapi/api-dashboard-service.yaml b/.docs/.openapi/api-dashboard-service.yaml
index 10a0140d0965d69e1c3b147588b58935973031f3..cd7f47b785ea04cfdee32fd8605ae8cb916a5c37 100644
--- a/.docs/.openapi/api-dashboard-service.yaml
+++ b/.docs/.openapi/api-dashboard-service.yaml
@@ -216,6 +216,61 @@
           "dashboard-endpoint"
         ]
       }
+    },
+    "/api/dashboard/{uid}/access/{username}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Updates a dashboard access in the Dashboard UI. Requires role `system`.",
+        "operationId": "update_dashboard_access",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "uid",
+            "required": true,
+            "schema": {
+              "format": "uuid",
+              "type": "string"
+            }
+          },
+          {
+            "in": "path",
+            "name": "username",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "202": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Updated dashboard access successfully"
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ],
+        "summary": "Update dashboard access",
+        "tags": [
+          "dashboard-endpoint"
+        ]
+      }
     }
   },
   "servers": [
diff --git a/.docs/.openapi/api-data-service.yaml b/.docs/.openapi/api-data-service.yaml
index c3947778ccf83e0f1521e86e66710b6891229b3b..4bb63ac60782d0a356b019b559571738a8505006 100644
--- a/.docs/.openapi/api-data-service.yaml
+++ b/.docs/.openapi/api-data-service.yaml
@@ -11,11 +11,11 @@
       "name": "Apache 2.0",
       "url": "https://www.apache.org/licenses/LICENSE-2.0"
     },
-    "version": "1.9.0"
+    "version": "1.9.2"
   },
   "externalDocs": {
     "description": "Sourcecode Documentation",
-    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.0/system-services-metadata/"
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.2/system-services-metadata/"
   },
   "servers": [
     {
@@ -1299,6 +1299,170 @@
         ]
       }
     },
+    "/api/database/{databaseId}/grant/{userId}": {
+      "get": {
+        "tags": [
+          "grant-endpoint"
+        ],
+        "summary": "Get grants",
+        "description": "Get the grant permissions for a user of a given database.",
+        "operationId": "find",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Access found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/DatabaseAccessDto"
+                  }
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Not authenticated",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not database owner or foreign user",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Grants malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "grant-endpoint"
+        ],
+        "summary": "Get grants",
+        "description": "Get the grant permissions for a user of a given database.",
+        "operationId": "find_1",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Access found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/DatabaseAccessDto"
+                  }
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Not authenticated",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not database owner or foreign user",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Grants malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
     "/api/database/{databaseId}/subset/{queryId}": {
       "put": {
         "tags": [
@@ -2105,6 +2269,66 @@
           "status"
         ]
       },
+      "DatabaseAccessDto": {
+        "type": "object",
+        "properties": {
+          "user": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "read",
+              "write_own",
+              "write_all"
+            ],
+            "example": "read"
+          }
+        },
+        "required": [
+          "type",
+          "user"
+        ]
+      },
+      "UserBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4"
+          },
+          "username": {
+            "type": "string",
+            "description": "Only contains lowercase characters",
+            "example": "jcarberry"
+          },
+          "name": {
+            "type": "string",
+            "example": "Josiah Carberry"
+          },
+          "orcid": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "qualified_name": {
+            "type": "string",
+            "example": "Josiah Carberry — @jcarberry"
+          },
+          "given_name": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "family_name": {
+            "type": "string",
+            "example": "Carberry"
+          }
+        },
+        "required": [
+          "id",
+          "username"
+        ]
+      },
       "TupleUpdateDto": {
         "type": "object",
         "properties": {
@@ -2805,45 +3029,6 @@
           "query_normalized"
         ]
       },
-      "UserBriefDto": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string",
-            "format": "uuid",
-            "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4"
-          },
-          "username": {
-            "type": "string",
-            "description": "Only contains lowercase characters",
-            "example": "jcarberry"
-          },
-          "name": {
-            "type": "string",
-            "example": "Josiah Carberry"
-          },
-          "orcid": {
-            "type": "string",
-            "example": "0000-0002-1825-0097"
-          },
-          "qualified_name": {
-            "type": "string",
-            "example": "Josiah Carberry — @jcarberry"
-          },
-          "given_name": {
-            "type": "string",
-            "example": "Josiah"
-          },
-          "family_name": {
-            "type": "string",
-            "example": "Carberry"
-          }
-        },
-        "required": [
-          "id",
-          "username"
-        ]
-      },
       "CreatorDto": {
         "type": "object",
         "properties": {
diff --git a/.docs/.openapi/api-metadata-service.yaml b/.docs/.openapi/api-metadata-service.yaml
index 231e1d3c2e3516dd3be5c7bccb40dd6602dfb337..11591e0d7bd446852b52045fb046368f6e790c54 100644
--- a/.docs/.openapi/api-metadata-service.yaml
+++ b/.docs/.openapi/api-metadata-service.yaml
@@ -11,11 +11,11 @@
       "name": "Apache 2.0",
       "url": "https://www.apache.org/licenses/LICENSE-2.0"
     },
-    "version": "1.9.0"
+    "version": "1.9.2"
   },
   "externalDocs": {
     "description": "Sourcecode Documentation",
-    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.0/system-services-metadata/"
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.2/system-services-metadata/"
   },
   "servers": [
     {
diff --git a/.docs/.openapi/api-search-service.yaml b/.docs/.openapi/api-search-service.yaml
index ee2f2a21adb14b8ca19448b9dcc5e291fddb5603..df4123760083023cdc46fe851a286b533b8c517c 100644
--- a/.docs/.openapi/api-search-service.yaml
+++ b/.docs/.openapi/api-search-service.yaml
@@ -128,7 +128,7 @@
       "url": "https://www.apache.org/licenses/LICENSE-2.0"
     },
     "title": "Database Repository Search Service API",
-    "version": "1.9.0"
+    "version": "1.9.2"
   },
   "openapi": "3.0.0",
   "paths": {
diff --git a/.docs/.openapi/api.base.yaml b/.docs/.openapi/api.base.yaml
index ec62afe97aecd1bec6123351f40076ee7591881b..75f7de6d14d6d57799bf9720c47d772967f3d996 100644
--- a/.docs/.openapi/api.base.yaml
+++ b/.docs/.openapi/api.base.yaml
@@ -24,7 +24,7 @@ info:
     name: Apache 2.0
     url: https://www.apache.org/licenses/LICENSE-2.0
   title: DBRepo REST API
-  version: 1.9.1
+  version: 1.9.2
 openapi: 3.1.0
 servers:
   - description: Test Instance
diff --git a/.docs/.openapi/api.yaml b/.docs/.openapi/api.yaml
index 3ed4b4aea0880a0f2f874f2e042930eb411752c0..688c3e4bc14aaff6292c1a134f16b8abe3a10642 100644
--- a/.docs/.openapi/api.yaml
+++ b/.docs/.openapi/api.yaml
@@ -16,7 +16,7 @@ info:
     name: Apache 2.0
     url: 'https://www.apache.org/licenses/LICENSE-2.0'
   title: DBRepo REST API
-  version: 1.9.0
+  version: 1.9.2
 servers:
   - description: Test Instance
     url: 'https://test.dbrepo.tuwien.ac.at'
@@ -982,6 +982,105 @@ paths:
       security:
         - bearerAuth: []
         - basicAuth: []
+  '/api/database/{databaseId}/grant/{userId}':
+    get:
+      tags:
+        - grant-endpoint
+      summary: Get grants
+      description: Get the grant permissions for a user of a given database.
+      operationId: find
+      parameters:
+        - name: databaseId
+          in: path
+          required: true
+          schema:
+            type: string
+            format: uuid
+        - name: userId
+          in: path
+          required: true
+          schema:
+            type: string
+            format: uuid
+      responses:
+        '200':
+          description: Access found
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/DatabaseAccessDto'
+        '401':
+          description: Not authenticated
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not database owner or foreign user
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        '409':
+          description: Grants malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+        - basicAuth: []
+        - bearerAuth: []
+    head:
+      tags:
+        - grant-endpoint
+      summary: Get grants
+      description: Get the grant permissions for a user of a given database.
+      operationId: find_1
+      parameters:
+        - name: databaseId
+          in: path
+          required: true
+          schema:
+            type: string
+            format: uuid
+        - name: userId
+          in: path
+          required: true
+          schema:
+            type: string
+            format: uuid
+      responses:
+        '200':
+          description: Access found
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/DatabaseAccessDto'
+        '401':
+          description: Not authenticated
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not database owner or foreign user
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        '409':
+          description: Grants malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+      security:
+        - basicAuth: []
+        - bearerAuth: []
   '/api/database/{databaseId}/subset/{queryId}':
     put:
       tags:
@@ -1452,7 +1551,7 @@ paths:
         authentication. Foreign user information can only be obtained if
         additional role `find-foreign-user` is present. Finding information
         about internal users results in a 404 error.
-      operationId: find
+      operationId: find1
       parameters:
         - name: userId
           in: path
@@ -1544,7 +1643,7 @@ paths:
         authentication. Foreign user information can only be obtained if
         additional role `find-foreign-user` is present. Finding information
         about internal users results in a 404 error.
-      operationId: find_1
+      operationId: find_11
       parameters:
         - name: userId
           in: path
@@ -4680,6 +4779,50 @@ components:
         - code
         - message
         - status
+    DatabaseAccessDto:
+      type: object
+      properties:
+        user:
+          $ref: '#/components/schemas/UserBriefDto'
+        type:
+          type: string
+          enum:
+            - read
+            - write_own
+            - write_all
+          example: read
+      required:
+        - type
+        - user
+    UserBriefDto:
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        qualified_name:
+          type: string
+          example: Josiah Carberry — @jcarberry
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+      required:
+        - id
+        - username
     TupleUpdateDto:
       type: object
       properties:
@@ -5296,35 +5439,6 @@ components:
         - query
         - query_hash
         - query_normalized
-    UserBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
-        username:
-          type: string
-          description: Only contains lowercase characters
-          example: jcarberry
-        name:
-          type: string
-          example: Josiah Carberry
-        orcid:
-          type: string
-          example: 0000-0002-1825-0097
-        qualified_name:
-          type: string
-          example: Josiah Carberry — @jcarberry
-        given_name:
-          type: string
-          example: Josiah
-        family_name:
-          type: string
-          example: Carberry
-      required:
-        - id
-        - username
     CreatorDto:
       type: object
       properties:
@@ -6263,21 +6377,6 @@ components:
         - is_schema_public
         - name
         - owner_id
-    DatabaseAccessDto:
-      type: object
-      properties:
-        user:
-          $ref: '#/components/schemas/UserBriefDto'
-        type:
-          type: string
-          enum:
-            - read
-            - write_own
-            - write_all
-          example: read
-      required:
-        - type
-        - user
     UserUpdateDto:
       type: object
       properties:
diff --git a/.docs/api/analyse-service.md b/.docs/api/analyse-service.md
index db44f66efda6557a1bbbc84e3b5448646a7368e4..13f9956db04a808febcdc6dd5572888a0b923644 100644
--- a/.docs/api/analyse-service.md
+++ b/.docs/api/analyse-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.1`](https://hub.docker.com/r/dbrepo/analyse-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.2`](https://hub.docker.com/r/dbrepo/analyse-service)
 
     * Ports: 5000/tcp
     * Prometheus: `http://<hostname>:5000/metrics`
diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md
index 4f7a1a30ec80a8e77c403f04aaabb54ee52c8f97..cec568c4324194a37bda5b3aba72f7b9cde74d35 100644
--- a/.docs/api/data-service.md
+++ b/.docs/api/data-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.1`](https://hub.docker.com/r/dbrepo/data-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.2`](https://hub.docker.com/r/dbrepo/data-service)
 
     * Ports: 9093/tcp
     * Info: `http://<hostname>:9093/actuator/info`
diff --git a/.docs/api/metadata-service.md b/.docs/api/metadata-service.md
index af1ecb4a681cd31b5a2208c3bf4975072e52e231..bb5504676fe85ec4bd0417e41dcc35bbca90c2d8 100644
--- a/.docs/api/metadata-service.md
+++ b/.docs/api/metadata-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.1`](https://hub.docker.com/r/dbrepo/metadata-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.2`](https://hub.docker.com/r/dbrepo/metadata-service)
 
     * Ports: 9099/tcp
     * Info: `http://<hostname>:9099/actuator/info`
diff --git a/.docs/api/search-service.md b/.docs/api/search-service.md
index 25f08adec993d5c1ba1f74c0ac9c25a493a0816d..86928387a4eabac8ca9b314fa9cb098a8dbe654a 100644
--- a/.docs/api/search-service.md
+++ b/.docs/api/search-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.1`](https://hub.docker.com/r/dbrepo/search-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.2`](https://hub.docker.com/r/dbrepo/search-service)
 
     * Ports: 4000/tcp
     * Health: `http://<hostname>:4000/api/search/health`
diff --git a/.docs/api/ui.md b/.docs/api/ui.md
index 2f46559e2c165de333b1dcc5d5b92ea86f1043c2..09127fe8504ffc9eb565b4e761623d55dca51cc5 100644
--- a/.docs/api/ui.md
+++ b/.docs/api/ui.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.1`](https://hub.docker.com/r/dbrepo/ui)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.2`](https://hub.docker.com/r/dbrepo/ui)
 
     * Ports: 3000/tcp
 
diff --git a/.docs/changelog.md b/.docs/changelog.md
index df198bb9d14efdc8a7508839174b992252faf50b..8ea8897f5264d2bcb2c41bfbc0dbf073a051ea35 100644
--- a/.docs/changelog.md
+++ b/.docs/changelog.md
@@ -7,6 +7,13 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [UNRELEASED](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.9.2) - 2025-06-??
+
+#### Features
+
+* Added an endpoint to check for database grants and display them in the UI (Database > Settings) for the owner 
+  in [#536](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/536).
+
 ## [v1.9.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.9.1) - 2025-05-31
 
 #### Changes
diff --git a/.docs/index.md b/.docs/index.md
index 833e5db5f7154175294b1f403cc36780c0a61b3c..711906f2e0138d6846b90633a2479a4e6176cd5e 100644
--- a/.docs/index.md
+++ b/.docs/index.md
@@ -14,7 +14,7 @@ author: Martin Weise
 ![Maintainability Rating](./images/maintainability.svg)
 ![Security Rating](./images/security.svg)
 
-Documentation for version: [v1.9.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases).
+Documentation for version: [v1.9.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases).
 
 DBRepo is an open-source database repository that cover the data life cycle supporting data evolution, 
 -citation and -versioning. It implements the query store of the [RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on
diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md
index 3fb005e58046f287840dcd2436da81dd397bbe81..53243bff89012d1629427c694dcb4f6fef098142 100644
--- a/.docs/kubernetes.md
+++ b/.docs/kubernetes.md
@@ -14,7 +14,7 @@ helm upgrade --install dbrepo \
   -n dbrepo \
   "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \
   --values ./values.yaml \
-  --version "1.9.1" \
+  --version "1.9.2" \
   --create-namespace \
   --cleanup-on-fail
 ```
diff --git a/.env b/.env
index f72626ab5ef38013f5672b522006ea410925ead0..d191e59edda36e8ca7795d1da35710d28129cfdc 100644
--- a/.env
+++ b/.env
@@ -1,4 +1,4 @@
-APP_VERSION=1.9
+APP_VERSION=1.9.2
 FLUENTBIT_VERSION=4.0.0
 GRAFANA_VERSION=11.4.0
 MARIADB_VERSION=11.3.2
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c3a44109fa41b9ef5bc75363635307d48ab7557e..6022f8b31775da44e5202bd2dd77daf81de702fb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,9 +12,9 @@ variables:
   REGCLIENT_VERSION: "0.8.2"
   BUN_VERSION: "1.1.40"
   DOC_VERSION: "1.9"
-  APP_VERSION: "1.9.1"
-  CHART_VERSION: "1.9.1"
-  SUPPORTED_VERSIONS: "1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1"
+  APP_VERSION: "1.9.2"
+  CHART_VERSION: "1.9.2"
+  SUPPORTED_VERSIONS: "1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1, 1.9.2"
   SUPPORTED_ARCH: "linux/amd64"
   MAINTAINED_SERVICES: "analyse-service, auth-service-init, dashboard-service, dashboard-service-init, data-service, metadata-service, search-service, search-service-init, storage-service-init, ui"
   CACHE_FALLBACK_KEY: "${CI_DEFAULT_BRANCH}"
diff --git a/.s3cfg b/.s3cfg
deleted file mode 100644
index 5d33284185529b63eca11f14dad396e3b3485cfb..0000000000000000000000000000000000000000
--- a/.s3cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-access_key = seaweedfsadmin
-secret_key = seaweedfsadmin
-# Setup endpoint
-host_base = http://localhost:9000
-host_bucket = dbrepo
-use_https = False
-# Enable S3 v4 signature APIs
-signature_v2 = False
\ No newline at end of file
diff --git a/Makefile b/Makefile
index e13bb9ce88ef7c638bfb69a318c03cf3d8864fe1..ff09f43cb1bf17febbbd5764cb3549f50bd32df3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 .PHONY: all
 
-APP_VERSION ?= 1.9.1
-CHART_VERSION ?= 1.9.1
+APP_VERSION ?= 1.9.2
+CHART_VERSION ?= 1.9.2
 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo
 
 .PHONY: all
diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile
index 6ea296ccf99e239de5b6e65f140044176b839489..2151ebe9ad563dcb7a91443050b229f18e068417 100644
--- a/dbrepo-analyse-service/Pipfile
+++ b/dbrepo-analyse-service/Pipfile
@@ -21,7 +21,7 @@ numpy = "*"
 pandas = "*"
 minio = "*"
 pydantic = "*"
-dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"}
 opensearch-py = "*"
 ecs_logging = "*"
 
diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index 7d7a367358c6455c3a35bd2b382adc1bb6101358..c5870383ba6d34725b078b96f6dee6ced25d1ba1 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "683dd8c657d5355de5fbe9fb26daa0807a4b6a5d66f8293468a7bbca16ffa88c"
+            "sha256": "e7cad9c3a5bea16afca5b7fa00c5d81a390fadf857606d4ee96555c1f3c8db30"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -323,10 +323,10 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:32a72a27077bcaefafed362feae8c025348ed222b438e0dfe855779aed686584"
+                "sha256:57796d53aabbfea68cc48bb238e1cdb00efc28df196fb80121affa589cce641f"
             ],
-            "path": "./lib/dbrepo-1.9.1.tar.gz",
-            "version": "==1.9.1"
+            "path": "./lib/dbrepo-1.9.2.tar.gz",
+            "version": "==1.9.2"
         },
         "ecs-logging": {
             "hashes": [
@@ -971,7 +971,7 @@
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
                 "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.9.0.post0"
         },
         "pytz": {
@@ -1200,7 +1200,7 @@
                 "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
                 "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
         "typing-extensions": {
@@ -1713,7 +1713,7 @@
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
                 "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.9.0.post0"
         },
         "requests": {
@@ -1737,7 +1737,7 @@
                 "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
                 "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
         "testcontainers-core": {
diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py
index 2dfd301e720859c15e18d8f0aac7bcafcf55a7ac..9f816f7e32c872bac6bd29a921876856757cd835 100644
--- a/dbrepo-analyse-service/app.py
+++ b/dbrepo-analyse-service/app.py
@@ -199,7 +199,7 @@ template = {
     "info": {
         "title": "Database Repository Analyse Service API",
         "description": "Service that analyses data structures",
-        "version": "1.9.1",
+        "version": "1.9.2",
         "contact": {
             "name": "Prof. Andreas Rauber",
             "email": "andreas.rauber@tuwien.ac.at"
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.9.1.tar.gz
deleted file mode 100644
index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.9.1.tar.gz and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.9.2-py3-none-any.whl
similarity index 92%
rename from dbrepo-dashboard-service/lib/dbrepo-1.9.1-py3-none-any.whl
rename to dbrepo-analyse-service/lib/dbrepo-1.9.2-py3-none-any.whl
index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-analyse-service/lib/dbrepo-1.9.2-py3-none-any.whl differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.2.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.9.2.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed
Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.9.2.tar.gz differ
diff --git a/dbrepo-auth-service/init/Pipfile b/dbrepo-auth-service/init/Pipfile
index 85449bc7e2bb8e9a7d230136aa7ef8c3f7e41ccf..1a91e97fcbf063210a7cb1d729566dc95f747586 100644
--- a/dbrepo-auth-service/init/Pipfile
+++ b/dbrepo-auth-service/init/Pipfile
@@ -7,7 +7,7 @@ name = "pypi"
 requests = "*"
 mariadb = "*"
 ecs_logging = "*"
-dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"}
 
 [dev-packages]
 coverage = "*"
diff --git a/dbrepo-auth-service/init/Pipfile.lock b/dbrepo-auth-service/init/Pipfile.lock
index b5f520be9b2bd0324926955b66bf9456780283c9..60243d8ccdd96ab77adc8c81410a0a2b352cf541 100644
--- a/dbrepo-auth-service/init/Pipfile.lock
+++ b/dbrepo-auth-service/init/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "abe8b909c2f90002157de747a21ae3607758fc775e59de0657b7c33d945e752a"
+            "sha256": "6fd3a7e6af693bf9a3ad1367d54f826a2ec47441981a2c94a19dcb104200823f"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -132,10 +132,10 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:6cde515183d5f4644ebbc26f06155a474b42ab2a4699f03dfe77fc28688b45a1"
+                "sha256:b9079a9a97d7112459df40cbc8e63302848e4cd995a5bd0fe69d52b99e670be7"
             ],
-            "path": "./lib/dbrepo-1.9.1.tar.gz",
-            "version": "==1.9.1"
+            "path": "./lib/dbrepo-1.9.2.tar.gz",
+            "version": "==1.9.2"
         },
         "ecs-logging": {
             "hashes": [
@@ -413,7 +413,7 @@
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
                 "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.9.0.post0"
         },
         "pytz": {
@@ -436,7 +436,7 @@
                 "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
                 "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
         "typing-extensions": {
@@ -718,7 +718,7 @@
                 "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5",
                 "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421"
             ],
-            "markers": "python_version < '3.14' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))",
+            "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))",
             "version": "==3.2.2"
         },
         "idna": {
diff --git a/dbrepo-auth-service/init/lib/dbrepo-1.9.1.tar.gz b/dbrepo-auth-service/init/lib/dbrepo-1.9.1.tar.gz
deleted file mode 100644
index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000
Binary files a/dbrepo-auth-service/init/lib/dbrepo-1.9.1.tar.gz and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-auth-service/init/lib/dbrepo-1.9.2-py3-none-any.whl
similarity index 92%
rename from dbrepo-analyse-service/lib/dbrepo-1.9.1-py3-none-any.whl
rename to dbrepo-auth-service/init/lib/dbrepo-1.9.2-py3-none-any.whl
index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-auth-service/init/lib/dbrepo-1.9.2-py3-none-any.whl differ
diff --git a/dbrepo-auth-service/init/lib/dbrepo-1.9.2.tar.gz b/dbrepo-auth-service/init/lib/dbrepo-1.9.2.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed
Binary files /dev/null and b/dbrepo-auth-service/init/lib/dbrepo-1.9.2.tar.gz differ
diff --git a/dbrepo-auth-service/listeners/create-event-listener.jar b/dbrepo-auth-service/listeners/create-event-listener.jar
index 8df9e19da6675b86f1b5755a9cec8c8e1044b11f..fb1458371a5ce51be8ca63a9421a621e0ef09ce3 100644
Binary files a/dbrepo-auth-service/listeners/create-event-listener.jar and b/dbrepo-auth-service/listeners/create-event-listener.jar differ
diff --git a/dbrepo-dashboard-service/Pipfile b/dbrepo-dashboard-service/Pipfile
index ee805c077b60ab4a8a6f348ff819da0b568c0614..3bef7a534bc707e491b77217ba369792efa38bdf 100644
--- a/dbrepo-dashboard-service/Pipfile
+++ b/dbrepo-dashboard-service/Pipfile
@@ -12,7 +12,7 @@ prometheus-flask-exporter = "*"
 python-dotenv = "~=1.0"
 jwt = "~=1.3"
 pytest = "*"
-dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"}
 gunicorn = "*"
 pydantic = "*"
 flask_httpauth = "*"
diff --git a/dbrepo-dashboard-service/Pipfile.lock b/dbrepo-dashboard-service/Pipfile.lock
index 3a969a61b14fdd52c18acaf14d9e5fce80ce08e3..e5d5310417014313ceff9beed6977437d16beefa 100644
--- a/dbrepo-dashboard-service/Pipfile.lock
+++ b/dbrepo-dashboard-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "4addd51108f7ad13a3a58c75b68a40dbfe8fa1ce02622f00741cea9c3c3a3ae7"
+            "sha256": "942ef7f6536e2ec7960d3a899d236db8409c093d6fd3e4135394db4a00254937"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -272,10 +272,10 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:b6d7b9f5efeade2274249f1e48517820dd58dce5b24c0bf092cb4fc4be59c602"
+                "sha256:b9079a9a97d7112459df40cbc8e63302848e4cd995a5bd0fe69d52b99e670be7"
             ],
-            "path": "./lib/dbrepo-1.9.1.tar.gz",
-            "version": "==1.9.1"
+            "path": "./lib/dbrepo-1.9.2.tar.gz",
+            "version": "==1.9.2"
         },
         "ecs-logging": {
             "hashes": [
@@ -880,7 +880,7 @@
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
                 "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.9.0.post0"
         },
         "python-dotenv": {
@@ -959,104 +959,104 @@
         },
         "qh3": {
             "hashes": [
-                "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111",
-                "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46",
-                "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337",
-                "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41",
-                "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2",
-                "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846",
-                "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d",
-                "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff",
-                "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf",
-                "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075",
-                "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac",
-                "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e",
-                "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6",
-                "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4",
-                "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865",
-                "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff",
-                "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072",
-                "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52",
-                "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435",
-                "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735",
-                "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f",
-                "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517",
-                "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57",
-                "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244",
-                "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74",
-                "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976",
-                "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3",
-                "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36",
-                "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663",
-                "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956",
-                "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6",
-                "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca",
-                "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d",
-                "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b",
-                "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908",
-                "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147",
-                "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d",
-                "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590",
-                "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652",
-                "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c",
-                "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568",
-                "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2",
-                "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f",
-                "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b",
-                "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522",
-                "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70",
-                "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339",
-                "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163",
-                "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099",
-                "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20",
-                "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be",
-                "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a",
-                "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203",
-                "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85",
-                "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404",
-                "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede",
-                "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf",
-                "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972",
-                "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6",
-                "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d",
-                "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65",
-                "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435",
-                "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb",
-                "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97",
-                "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c",
-                "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34",
-                "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d",
-                "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df",
-                "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35",
-                "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2",
-                "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822",
-                "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1",
-                "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca",
-                "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d",
-                "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66",
-                "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4",
-                "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38",
-                "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88",
-                "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504",
-                "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4",
-                "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93",
-                "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e",
-                "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8",
-                "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58",
-                "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857",
-                "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a",
-                "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9",
-                "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70",
-                "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91",
-                "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416",
-                "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0",
-                "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f",
-                "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869",
-                "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943",
-                "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d"
-            ],
-            "markers": "python_version < '3.12' and (platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or platform_python_implementation == 'PyPy')",
-            "version": "==1.5.1"
+                "sha256:0083b52578a54f04957527f28c9016736242efb8c2b5e589e027ab8b2e1916a2",
+                "sha256:025d7331c8bb45bf7d02c1c0bc8ec9b5a9054b891e865ff679753c22da8bc6c9",
+                "sha256:02856422f3009270990ebdee6a2e29f1f1167b1fe8260c62810b6bfb7d86740d",
+                "sha256:04151e6ce7c3aaaca7d850a2b7dcc769f1356581af178649ab5e6f2aa78b0304",
+                "sha256:04c18ca8ebdeda8ab60cb72a43f2c5d730446705f5060854eb21167b0d21097e",
+                "sha256:0529b9ee9b37f3ccf2833d558e7ad1846596e36f1916a23c0c1af825f07549be",
+                "sha256:087bf1a4b3a6809112b1a22f50dd0dbd86eb991971b036d2f3a650c79d81fe29",
+                "sha256:0a87ecebdf3a3216ecbbd32d6c3cbabcd3f90d1a24363fc6aeea3af99d7c394b",
+                "sha256:0ca013329d0345d4d203f24e12e5adde3bc393571d55c02b8279efd1cf7fd818",
+                "sha256:0eac427589488b069293fb2d06a2d765a4aff77ae74990c566fe161542493bac",
+                "sha256:134939418800fad4e669bb6ce4e7c4e303e5d40d2ff457add9ccd99e64cbbf64",
+                "sha256:1399e604c7ac178758eecdefdfae0bed37f52a792101ee8e32dc594ca2350c0d",
+                "sha256:13fc96388d3010377b52aa3059141568dd4ba35c0d2f3f39b60244fbd4f70b79",
+                "sha256:1735afdce2c3d924da8c4b7f5da5d1020c14981b472e94052e2ec351b1b67068",
+                "sha256:238b185d8d1c41907a093201e389127cffbfbb013141fd9fed98609c0adcfb45",
+                "sha256:2800f9fabec12e4e3ba40cdce65ded9b951f6d5374ec7021be667db88e496a38",
+                "sha256:2ae6a3170f14c49b0733aeb71bfbdb98962d05a3502e2e4f2a056eae76c34800",
+                "sha256:2b928f026cef5eecd530a1a546a468eca8ac71aebc9eaf864b5ff54aebb4a63e",
+                "sha256:2f1997b95fd66835e3a372a6c21062a35ca870bdd1687867c09e1d8f91980df0",
+                "sha256:3bb915e2a46b0d2364e74e7c7c85a9b0d5c473a0bcfcd27a2ed6923773b0216c",
+                "sha256:3d7fb7ec47465c40af3c0471a14f2a4af8f0c1af95a0476ef4ac6eacf18b2b1e",
+                "sha256:3de09f8d58eb69f8d8a9bc1a77982001c1d43df27544512d2a89d00911dfa40c",
+                "sha256:4341c2e53b3f1a5ed065dd2be4f7ff23e0b1708397bb66c19e6b898377fe941c",
+                "sha256:45937d8be16030d1c6da5dcfff10bbba35a7f5bd5f96de45045fd8fbea033df4",
+                "sha256:465c7efc5bb33ee90da4d29580ad0f57efd897c4184f575e77653514e9a058cb",
+                "sha256:4707bdb76176b00cb4bd0d27d8ccea41fc86fbff7479cc9812aef0a23ffc6813",
+                "sha256:486065b50f7787e2f62c918b619bc34c06d8a66e1f1bd4f66cb449a2e467f3a5",
+                "sha256:4bb83c8437d7c43bda7006240fc95dc119d2569dab30a20b428dbf058f686a2b",
+                "sha256:4e7dff6ffc3ed19be9b2e42ea58ef00bc0435f2a950f3320eed932b1dff325b7",
+                "sha256:548b31b6d1bec0b11813c74ed3c94664aeeeef4ba51a3ac312fe471962e58442",
+                "sha256:585ebc0d5a415fa1042189c7c98bd93e63813c38e2d6e1581181f99e2bc7aea7",
+                "sha256:5ac050fce6407914b32ab84366fc15f00c6a7aad33c7116dc29ac441ded3bce6",
+                "sha256:5c1d3f12442b7c43db7753eaf914e9644b8a90d97798206dc6a1444a4a06ddcb",
+                "sha256:5f963a886bc882cba39091568e225ab36b882ae24eb2a965256c5f63e6b7eafa",
+                "sha256:62115845fb1695d1d018e995eae90dc2b53da9a30127e264e5cd370384358178",
+                "sha256:6341cddfd43d962c77849358ed7ae98022949ac8155ee9e97dcb3000edd73613",
+                "sha256:6380a52e146227bf420af66803f8c4b54627129f49631ba9f9b058bed92de51a",
+                "sha256:657442ae3d713f88c8ac8c7bf047da4e1cee4f6cc2aff254a7e7d4e2cc5d9d7a",
+                "sha256:66a6c77d667a848f39fc153675c2d53bce7ad068d8ce7d651da79a5d43672a81",
+                "sha256:66c01e2d825587a7b06062b4f05373c7ec3191939f6b744192403863078ddf41",
+                "sha256:695f0b5ab6a886fd3d1089eed50a4815136e84583b5d426c0de11db24274dff8",
+                "sha256:6975abfe6d21f0f2a74109aab4b9e9071d215f0ae38b5760e070d4c027187fcb",
+                "sha256:69c5f38e00cb41ceea8f6d9f82b76a10cd4bd0f5612551f841ddcc335df5e88b",
+                "sha256:6b8baa1c9789945de14571e48bed5996440171f5dd91589d9572ece6db8aa09d",
+                "sha256:748587c5fd4216d44fedcdfc8b03320e36f2eba6ab373cbf337448583ff37f16",
+                "sha256:74e3d7265edc7268f3eb54b8d0623a2b5adea8e272cc124818686bc6583a4645",
+                "sha256:7d9d83f65e778a421a24e4eb82de22cbac3f94ac09637309890465bf5592a5ce",
+                "sha256:7db6eddc5c19730e92cca95c2a2a7bca184637d854720e33367466db9f428708",
+                "sha256:8022106a134c142f4a1e774be4ae6a2be4e480586de65c0b13658e9e329aea7d",
+                "sha256:819a5733de1a2407b738105f99b323a1fe31f687a701c29566ae934fa893224f",
+                "sha256:844d7ff5a5081f6920d726518860a76138f97763ce6c4206c06756844f0c1645",
+                "sha256:892c335cbd1ac5786229aa6b8987250dbb7f7b0bf3775b56ca11cde6090bcb30",
+                "sha256:89a19e6af701e525b7c0e4e589d8fa0dcf9f1deddb9eee171fa941a0add93ffc",
+                "sha256:89b24c3060cfdf8e61926af5271632f656bee689b6c95c36b85d2c79ec04c757",
+                "sha256:95efc1710dc4d4a7fff837a603a7bc4370449c87bdaecafdf290226e82303b52",
+                "sha256:968b1d7aae7d1dcd9d1899bac4936ff641589420575ef0f886150313b3872de7",
+                "sha256:9b2e8cb7a2940d2b94ca24db9f544f4011cdde2c446ccc71f7d1646ae011df11",
+                "sha256:9c094865d884a88053f8a2a282f26debc2727a21ef14e9fc5ee23d07d9d749f1",
+                "sha256:9e687e7317f87ad139e4959b65bcff22adb4bbec5f8e09c1873a5bb973e1380e",
+                "sha256:a4c265cff95c19da27450c4861fd60a25e4b4dddc58ddf62cf5fe869922d6e8e",
+                "sha256:a75c04955b285c9b9dd54077ad8e180bb5393c714c213e26a37170cbd7cc9df7",
+                "sha256:a790ceebd0f105241e425af0545b7b21623e3e94a67add68e854f13596d3f76b",
+                "sha256:ac1c429b0f283fad0521e50fba6135d70b7d8fa9538523880ee232b0cf0edd09",
+                "sha256:af885eeda54152c3086b7c5861b50f79c94b83e1ea4a1407afaffb84f52aaddf",
+                "sha256:b07b805c3ef734e5c330333b549d98adc514df6e83ef0338cb3353538d570322",
+                "sha256:bbfeeff794bb947fe90ba3fc3d395c78418bb17c2dbafe5ca47552ef3ccb6a29",
+                "sha256:bd7ae2ead0ddd0df3a22fe9f84aff1c44afbac82b1af41dc2934eec6c56ef3ec",
+                "sha256:be8800c5a087e7e4e33cb12f35234ca94f4ec4837d29918899a48d6f61ea59b3",
+                "sha256:c11567cd77d11a7ba2f8be9a31cfa74a11df34a4a78f91cff8fa6bee5c3145c7",
+                "sha256:c2ce0f0cdb9d22cbccd477b09436354e4aa2aaf0cdd0c2ed3f3da6f11979e68e",
+                "sha256:c5d45257e8ecbddf2587aa4ae1a0cf45856eb32d5e847bb01a3f74a39ab4b645",
+                "sha256:c66f50475727ac7cde643d48b27b6388a6b680484c3dcbb0b237fb003529785a",
+                "sha256:cb846ab19c1fa9d2d1aeaa1e603f4ddc6e9837952fc22c5b56061167b28cb2d0",
+                "sha256:cff8b68a89b2e03f8d954606d2015a4241002e3ea7ce45c3e7c7c73918263bac",
+                "sha256:d33da2a9b44f7613fe214b1d2dc03a4345b7a0345383ac562b8636a41129791f",
+                "sha256:d37c6809d76e9ed95277dc0155bb72c08e7334d741b2eae62ff4f9f8adcb43af",
+                "sha256:d58d5d2e59432c86324565a4adc649f383251f747809e469de1c01208691bc02",
+                "sha256:d6bc891a9480c0b4791a1cc7d62b3128ffa04b7883fabf35bb0ece3173338911",
+                "sha256:d725c7335184f1ef96b22660b92ab8f343ada41804bb54d74ac166f82033f115",
+                "sha256:d9362ea607a8640b5a1a612f834f39002dfa57561388e21e4d9dd12c7f5d11fc",
+                "sha256:db84023568e545ea45385cacd9edcc02cd1bd8cb1f4c5c0a89d4d061e8153850",
+                "sha256:ddebca89a63a726b129a7198087a17a8c33d72f957442593892c681e6aef0e8f",
+                "sha256:de091b890eaab8be1cba3c7483f718e68067c7681209f0c98251b50e7e032800",
+                "sha256:de9587b4d32462af1eafb84f2ea35aed5cb92b945f18acb1593cdec0d90accc6",
+                "sha256:def7d1d90c61da6860377403e603d0aff5a47e3fb71cbf0155b8fa0d9f6cacbb",
+                "sha256:e73e1d9633315b3a01763b9c7be55522f7f0983880b61d67f49823ac7e3b4421",
+                "sha256:eaf03403091b30c97bfbf4c22e6fc7057253e283157dbcdd23eb7a925d7ec65a",
+                "sha256:efc70ae80f742e84b320765587f0ce7715f11ae0b6a2a1b9e0ebed650b5da546",
+                "sha256:f0d7845993703cf115c82b9161cc361ddffd91af9d164892297bc009dac70097",
+                "sha256:f5b03dea0416ee7f9ec5c6be7b9dc02ffd3a187eaac159f291fd548160ca6d68",
+                "sha256:f6a2196df79b2aeccefe48fc81b11ad10d99ca274181dbd277793caa1b802890",
+                "sha256:f703a48096176403f86753d0e60da190d9663501c1d491de65607ba51fb4dda2",
+                "sha256:f9c80a48731f267dd9843d2c7149102066c3baf1ef0ac31bfc09d01060774dfe",
+                "sha256:fbfaccbaf223e52f05cb07b56d5ab1ce315a21b796f2531924bdd9aae01b1604",
+                "sha256:ff454ce3765a756392348da7887dffb3972b197e34feddc2b37a0c913cd0a8af"
+            ],
+            "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))",
+            "version": "==1.5.2"
         },
         "referencing": {
             "hashes": [
@@ -1202,7 +1202,7 @@
                 "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
                 "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
         "typing-extensions": {
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.1.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.9.1.tar.gz
deleted file mode 100644
index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.9.1.tar.gz and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.9.2-py3-none-any.whl
similarity index 92%
rename from dbrepo-search-service/lib/dbrepo-1.9.1-py3-none-any.whl
rename to dbrepo-dashboard-service/lib/dbrepo-1.9.2-py3-none-any.whl
index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644
Binary files a/dbrepo-search-service/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-dashboard-service/lib/dbrepo-1.9.2-py3-none-any.whl differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.2.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.9.2.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed
Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.9.2.tar.gz differ
diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml
index f806ccb7794c5c0f5a551289b82284ecf0a321a7..8175e571ab49f8df326510662bfdad3b01789bfd 100644
--- a/dbrepo-data-service/pom.xml
+++ b/dbrepo-data-service/pom.xml
@@ -16,7 +16,7 @@
     <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
     <artifactId>data-service</artifactId>
     <name>data-service</name>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <description>Service that manages the data</description>
 
@@ -96,7 +96,7 @@
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>dbrepo-core</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
         <!-- Spark -->
         <dependency>
diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml
index ddde97c4dc5165f29dcd2abf89f50dfa207610f1..c74b871c0ee0f05aef05210cdae0d08a3bd9d273 100644
--- a/dbrepo-data-service/querystore/pom.xml
+++ b/dbrepo-data-service/querystore/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>data-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>querystore</name>
     <artifactId>querystore</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies/>
 
diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml
index a17e5adecaf5eb8f4748f724aca42bc41e52e84f..e25ad8ff16b30ca5a29b6d8d383b9fef71c9f949 100644
--- a/dbrepo-data-service/report/pom.xml
+++ b/dbrepo-data-service/report/pom.xml
@@ -6,23 +6,23 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>data-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>report</name>
     <artifactId>report</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>rest-service</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>services</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml
index 49d83a28c00b5dab842052386a959de0106e9c0b..76bb9a02ecb0634d1375c0b6e04ef66e0185d9c4 100644
--- a/dbrepo-data-service/rest-service/pom.xml
+++ b/dbrepo-data-service/rest-service/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>data-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>rest-service</name>
     <artifactId>rest-service</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>services</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java
index abd843150b99ce5d541945234de1df78efae996a..d8d66162956512981b549939b12e1f6064502c94 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java
@@ -93,6 +93,7 @@ public class DatabaseEndpoint extends RestEndpoint {
         try {
             final DatabaseDto database = containerService.createDatabase(container, data);
             containerService.createQueryStore(container, data.getInternalName());
+            accessService.create(database, dataMapper.createDatabaseDtoToUserDto(data), AccessTypeDto.WRITE_ALL);
             accessService.create(database, dataMapper.createDatabaseDtoToPrivilegedUserDto(data), AccessTypeDto.WRITE_ALL);
             accessService.create(database, dataMapper.createDatabaseDtoToReadonlyUserDto(data), AccessTypeDto.READ);
             return ResponseEntity.status(HttpStatus.CREATED)
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/GrantEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/GrantEndpoint.java
new file mode 100644
index 0000000000000000000000000000000000000000..5913a997bb05d87601b6cffce7ddd706dcce6032
--- /dev/null
+++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/GrantEndpoint.java
@@ -0,0 +1,100 @@
+package at.ac.tuwien.ifs.dbrepo.endpoints;
+
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto;
+import at.ac.tuwien.ifs.dbrepo.core.exception.*;
+import at.ac.tuwien.ifs.dbrepo.service.CacheService;
+import at.ac.tuwien.ifs.dbrepo.service.GrantService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.constraints.NotNull;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.Principal;
+import java.sql.SQLException;
+import java.util.UUID;
+
+@Slf4j
+@RestController
+@CrossOrigin(origins = "*")
+@RequestMapping(path = "/api/database/{databaseId}/grant")
+public class GrantEndpoint extends RestEndpoint {
+
+    private final CacheService cacheService;
+    private final GrantService grantService;
+
+    @Autowired
+    public GrantEndpoint(CacheService cacheService, GrantService grantService) {
+        this.cacheService = cacheService;
+        this.grantService = grantService;
+    }
+
+    @RequestMapping(path = "/{userId}", method = {RequestMethod.GET, RequestMethod.HEAD})
+    @PreAuthorize("isAuthenticated()")
+    @Operation(summary = "Get grants",
+            description = "Get the grant permissions for a user of a given database.",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "200",
+                    description = "Access found",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = DatabaseAccessDto[].class))}),
+            @ApiResponse(responseCode = "401",
+                    description = "Not authenticated",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "403",
+                    description = "Not database owner or foreign user",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "409",
+                    description = "Grants malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+    })
+    public ResponseEntity<DatabaseGrantsDto> find(@NotNull @PathVariable("databaseId") UUID databaseId,
+                                                  @PathVariable("userId") UUID userId,
+                                                  Principal principal,
+                                                  @NotNull HttpServletRequest request) throws DatabaseNotFoundException,
+            RemoteUnavailableException, MetadataServiceException, DatabaseMalformedException,
+            DatabaseUnavailableException, UserNotFoundException, NotAllowedException {
+        log.debug("endpoint check access to database, databaseId={}", databaseId);
+        final DatabaseDto database = cacheService.getDatabase(databaseId);
+        final UserDto user = cacheService.getUser(userId);
+        if (!database.getOwner().getId().equals(getId(principal)) && !user.getId().equals(getId(principal))) {
+            log.error("Failed to find access: not owner or foreign user");
+            throw new NotAllowedException("Failed to find access: not owner or foreign user");
+        }
+        try {
+            final DatabaseGrantsDto grants = grantService.find(database, user);
+            final DatabaseGrantsDto body = request.getMethod().equals("HEAD") ? null : grants;
+            if (grants.getType() == null) {
+                return ResponseEntity.status(HttpStatus.CONFLICT)
+                        .body(body);
+            }
+            return ResponseEntity.ok()
+                    .body(body);
+        } catch (SQLException e) {
+            log.error("Failed to establish connection to database: {}", e.getMessage());
+            throw new DatabaseUnavailableException("Failed to establish connection to database", e);
+        }
+    }
+
+}
diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml
index 25d00ab8dfd2b9419b017f4f5df702daba807e81..be28c4ba71d4375450609998ee63a3f301b611dd 100644
--- a/dbrepo-data-service/rest-service/src/main/resources/application.yml
+++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml
@@ -82,8 +82,8 @@ dbrepo:
     clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}"
   grant:
     default:
-      read: "${GRANT_DEFAULT_READ:SELECT}"
-      write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}"
+      read: "${GRANT_DEFAULT_READ:SELECT, EXECUTE}"
+      write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}"
   credentialCacheTimeout: "${CREDENTIAL_CACHE_TIMEOUT:300}"
   minConcurrent: "${MIN_CONCURRENT_CONSUMERS:2}"
   maxConcurrent: "${MAX_CONCURRENT_CONSUMERS:6}"
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java
index e8604aabd3d56fcf43287206f5ccf9633ce7abfb..a45498c644032ba9d34eadecf77be0a8e699d40e 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java
@@ -30,6 +30,21 @@ public class MariaDbConfig {
         log.debug("created database {}", database);
     }
 
+    public static void revokeAccess(DatabaseDto database, String username) throws SQLException {
+        final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort() + "/" + database.getInternalName();
+        log.trace("connect to database {}", jdbc);
+        try (Connection connection = DriverManager.getConnection(jdbc, database.getContainer().getUsername(), database.getContainer().getPassword())) {
+            connection.prepareStatement("REVOKE ALL PRIVILEGES, GRANT OPTION FROM `" + username + "`@`%`;")
+                    .executeUpdate();
+            connection.prepareStatement("FLUSH PRIVILEGES;")
+                    .executeUpdate();
+        } catch (SQLException e) {
+            log.error("Failed to revoke access", e);
+            throw new SQLException("Failed to revoke access", e);
+        }
+        log.debug("revoked access from user {} in database {}", username, database.getInternalName());
+    }
+
     public static void createInitDatabase(DatabaseDto database) throws SQLException {
         final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort();
         log.trace("connect to database {}", jdbc);
@@ -41,11 +56,11 @@ public class MariaDbConfig {
         log.debug("created init database {}", database.getInternalName());
     }
 
-    public static void grantWriteAccess(DatabaseDto database, String username) {
+    public static void grantAccess(DatabaseDto database, String grants, String username) {
         final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort() + "/" + database.getInternalName();
         log.trace("connect to database {}", jdbc);
         try (Connection connection = DriverManager.getConnection(jdbc, database.getContainer().getUsername(), database.getContainer().getPassword())) {
-            connection.prepareStatement("GRANT SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE ON *.* TO `" + username + "`@`%`;")
+            connection.prepareStatement("GRANT " + grants + " ON `" + database.getInternalName() + "`.* TO `" + username + "`@`%`;")
                     .executeUpdate();
             connection.prepareStatement("FLUSH PRIVILEGES;")
                     .executeUpdate();
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/GrantEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/GrantEndpointUnitTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1a5258d4791772308b277be8d878f32cdf1ba02
--- /dev/null
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/GrantEndpointUnitTest.java
@@ -0,0 +1,136 @@
+package at.ac.tuwien.ifs.dbrepo.endpoint;
+
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.GrantTypeDto;
+import at.ac.tuwien.ifs.dbrepo.core.exception.*;
+import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
+import at.ac.tuwien.ifs.dbrepo.endpoints.GrantEndpoint;
+import at.ac.tuwien.ifs.dbrepo.service.CacheService;
+import at.ac.tuwien.ifs.dbrepo.service.GrantService;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.sql.SQLException;
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@Slf4j
+@SpringBootTest
+@ExtendWith(SpringExtension.class)
+public class GrantEndpointUnitTest extends BaseTest {
+
+    @Autowired
+    private GrantEndpoint grantEndpoint;
+
+    @MockitoBean
+    private HttpServletRequest httpServletRequest;
+
+    @MockitoBean
+    private CacheService cacheService;
+
+    @MockitoBean
+    private GrantService grantService;
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void find_succeeds() throws UserNotFoundException, DatabaseUnavailableException, NotAllowedException,
+            DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException,
+            DatabaseMalformedException, SQLException {
+
+        /* mock */
+        when(cacheService.getDatabase(DATABASE_1_ID))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(cacheService.getUser(USER_1_ID))
+                .thenReturn(USER_1_DTO);
+        when(grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO))
+                .thenReturn(READ_GRANT_DTO);
+        when(httpServletRequest.getMethod())
+                .thenReturn("GET");
+
+        /* test */
+        final ResponseEntity<DatabaseGrantsDto> response = grantEndpoint.find(DATABASE_1_ID, USER_1_ID, USER_1_PRINCIPAL, httpServletRequest);
+        assertEquals(HttpStatus.OK, response.getStatusCode());
+        assertNotNull(response.getBody());
+        final DatabaseGrantsDto body = response.getBody();
+        assertEquals(GrantTypeDto.READ, body.getType());
+        assertNotNull(body.getGrants());
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void find_own_succeeds() throws UserNotFoundException, DatabaseUnavailableException, NotAllowedException,
+            DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException,
+            DatabaseMalformedException, SQLException {
+
+        /* mock */
+        when(cacheService.getDatabase(DATABASE_2_ID))
+                .thenReturn(DATABASE_2_PRIVILEGED_DTO);
+        when(cacheService.getUser(USER_1_ID))
+                .thenReturn(USER_1_DTO);
+        when(grantService.find(DATABASE_2_PRIVILEGED_DTO, USER_1_DTO))
+                .thenReturn(READ_GRANT_DTO);
+        when(httpServletRequest.getMethod())
+                .thenReturn("GET");
+
+        /* test */
+        final ResponseEntity<DatabaseGrantsDto> response = grantEndpoint.find(DATABASE_2_ID, USER_1_ID, USER_1_PRINCIPAL, httpServletRequest);
+        assertEquals(HttpStatus.OK, response.getStatusCode());
+        assertNotNull(response.getBody());
+        final DatabaseGrantsDto body = response.getBody();
+        assertEquals(GrantTypeDto.READ, body.getType());
+        assertNotNull(body.getGrants());
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void find_head_succeeds() throws UserNotFoundException, DatabaseUnavailableException, NotAllowedException,
+            DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException,
+            DatabaseMalformedException, SQLException {
+
+        /* mock */
+        when(cacheService.getDatabase(DATABASE_1_ID))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(cacheService.getUser(USER_1_ID))
+                .thenReturn(USER_1_DTO);
+        when(grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO))
+                .thenReturn(READ_GRANT_DTO);
+        when(httpServletRequest.getMethod())
+                .thenReturn("HEAD");
+
+        /* test */
+        final ResponseEntity<DatabaseGrantsDto> response = grantEndpoint.find(DATABASE_1_ID, USER_1_ID, USER_1_PRINCIPAL, httpServletRequest);
+        assertEquals(HttpStatus.OK, response.getStatusCode());
+    }
+
+    @Test
+    @WithMockUser(username = USER_2_USERNAME)
+    public void find_notOwnerForeign_fails() throws UserNotFoundException, DatabaseNotFoundException,
+            RemoteUnavailableException, MetadataServiceException {
+
+        /* mock */
+        when(cacheService.getDatabase(any(UUID.class)))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(cacheService.getUser(USER_2_ID))
+                .thenReturn(USER_2_DTO);
+        when(cacheService.getUser(USER_1_ID))
+                .thenReturn(USER_1_DTO);
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            grantEndpoint.find(DATABASE_1_ID, USER_1_ID, USER_2_PRINCIPAL, httpServletRequest);
+        });
+    }
+
+}
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java
index 9e17d447dde57109fd35202bf302660be7b42386..7c7617b6aa3339b31855cbf1082e0fedaf6ee079 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java
@@ -1,8 +1,8 @@
 package at.ac.tuwien.ifs.dbrepo.service;
 
-import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto;
 import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig;
 import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto;
 import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException;
 import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
 import lombok.extern.slf4j.Slf4j;
@@ -42,7 +42,6 @@ public class AccessServiceIntegrationTest extends BaseTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        /* metadata database */
         MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNAL_NAME);
         MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
     }
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java
index 493a2430b863b962e10b6a64737dbeee459f696f..1081358ab5a2b816b99752beec3abd3a1eaef6a2 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java
@@ -1,5 +1,7 @@
 package at.ac.tuwien.ifs.dbrepo.service;
 
+import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig;
+import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableBriefDto;
@@ -16,8 +18,6 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.unique.Unique
 import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto;
-import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig;
-import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig;
 import at.ac.tuwien.ifs.dbrepo.core.exception.*;
 import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +27,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.testcontainers.containers.MariaDBContainer;
@@ -50,6 +51,9 @@ public class DatabaseServiceIntegrationTest extends BaseTest {
     @Autowired
     private DatabaseService databaseService;
 
+    @Value("${dbrepo.grant.default.write}")
+    private String grantDefaultWrite;
+
     @Container
     private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer();
 
@@ -109,7 +113,7 @@ public class DatabaseServiceIntegrationTest extends BaseTest {
                 .build();
 
         /* mock */
-        MariaDbConfig.grantWriteAccess(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
+        MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultWrite, USER_1_USERNAME);
 
         /* pre-condition */
         MariaDbConfig.mockQuery(CONTAINER_1_HOST, CONTAINER_1_PORT, DATABASE_1_INTERNAL_NAME, "CREATE SEQUENCE debug NOCACHE", USER_1_USERNAME, USER_1_PASSWORD);
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/GrantServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/GrantServiceIntegrationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..31a2f3b7c8e927053fb0320fd4115a7b847aa921
--- /dev/null
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/GrantServiceIntegrationTest.java
@@ -0,0 +1,98 @@
+package at.ac.tuwien.ifs.dbrepo.service;
+
+import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig;
+import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.GrantTypeDto;
+import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException;
+import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.testcontainers.containers.MariaDBContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@Slf4j
+@SpringBootTest
+@ExtendWith(SpringExtension.class)
+@Testcontainers
+public class GrantServiceIntegrationTest extends BaseTest {
+
+    @Autowired
+    private GrantService grantService;
+
+    @Value("${dbrepo.grant.default.read}")
+    private String grantDefaultRead;
+
+    @Value("${dbrepo.grant.default.write}")
+    private String grantDefaultWrite;
+
+    @Container
+    private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer();
+
+    @BeforeEach
+    public void beforeEach() throws SQLException {
+        MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNAL_NAME);
+        MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
+        MariaDbConfig.revokeAccess(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
+    }
+
+    @Test
+    public void find_read_succeeds() throws SQLException, DatabaseMalformedException {
+
+        /* mock */
+        MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultRead, USER_1_USERNAME);
+
+        /* test */
+        final DatabaseGrantsDto response = grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO);
+        assertNotNull(response);
+        assertEquals(GrantTypeDto.READ, response.getType());
+        assertEquals(Arrays.stream(grantDefaultRead.split(",")).map(String::trim).map(String::toUpperCase).collect(Collectors.toSet()), response.getGrants());
+    }
+
+    @Test
+    public void find_write_succeeds() throws SQLException, DatabaseMalformedException {
+
+        /* mock */
+        MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultWrite, USER_1_USERNAME);
+
+        /* test */
+        final DatabaseGrantsDto response = grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO);
+        assertNotNull(response);
+        assertEquals(GrantTypeDto.WRITE, response.getType());
+        assertEquals(Arrays.stream(grantDefaultWrite.split(",")).map(String::trim).map(String::toUpperCase).collect(Collectors.toSet()), response.getGrants());
+    }
+
+    @Test
+    public void findAll_succeeds() throws SQLException, DatabaseMalformedException {
+
+        /* mock */
+        MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultRead, USER_1_USERNAME);
+
+        /* test */
+        final Map<String, DatabaseGrantsDto> response = grantService.findAll(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO);
+        assertNotNull(response);
+        assertEquals(2, response.size());
+        final DatabaseGrantsDto grants0 = response.get("*");
+        assertEquals(Collections.EMPTY_SET, grants0.getGrants());
+        assertNull(grants0.getType());
+        final DatabaseGrantsDto grants1 = response.get(DATABASE_1_INTERNAL_NAME);
+        assertEquals(Arrays.stream(grantDefaultRead.split(",")).map(String::trim).map(String::toUpperCase).collect(Collectors.toSet()), grants1.getGrants());
+        assertEquals(GrantTypeDto.READ, grants1.getType());
+    }
+
+}
diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml
index 2513a620242be7085e0a4f006bbf1423a79582c0..4e2d36d39c82a8aecc1f955dabaa168aba63b642 100644
--- a/dbrepo-data-service/services/pom.xml
+++ b/dbrepo-data-service/services/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>data-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>services</name>
     <artifactId>services</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>querystore</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java
index 641136652d639561ac76e2f7b0779f747dbbd36f..15f9602ab6502be4ecd5ed9f3220d67e77a1c852 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java
@@ -1,7 +1,10 @@
 package at.ac.tuwien.ifs.dbrepo.mapper;
 
 import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto;
-import at.ac.tuwien.ifs.dbrepo.core.api.database.*;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.table.*;
@@ -58,6 +61,11 @@ public interface DataMapper {
     })
     UserDto createDatabaseDtoToPrivilegedUserDto(CreateDatabaseDto data);
 
+    @Mappings({
+            @Mapping(target = "id", source = "userId"),
+    })
+    UserDto createDatabaseDtoToUserDto(CreateDatabaseDto data);
+
     @Mappings({
             @Mapping(target = "username", source = "readonlyUsername"),
             @Mapping(target = "password", source = "readonlyPassword"),
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java
index 141c9e9c0882ed710e3b15218806c37563e6c970..dacc5537079e1973c7219869ddd7108b1adfcea6 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java
@@ -33,6 +33,7 @@ import java.time.Instant;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -71,6 +72,40 @@ public interface MariaDbMapper {
         return statement.toString();
     }
 
+    default String databaseFindAccessQuery() {
+        final StringBuilder statement = new StringBuilder("SHOW GRANTS FOR ?@`%`;");
+        log.trace("mapped database find access statement: {}", statement);
+        return statement.toString();
+    }
+
+    default Map<String, Set<String>> resultSetToGrants(ResultSet resultSet) throws SQLException,
+            DatabaseMalformedException {
+        final Pattern grantPattern = Pattern.compile("GRANT (.*) ON");
+        final Matcher grantMatcher = grantPattern.matcher(resultSet.getString(1));
+        final Set<String> grants = new HashSet<>();
+        if (grantMatcher.find()) {
+            Arrays.asList(grantMatcher.group(1)
+                            .split(","))
+                    .forEach(g -> grants.add(g.trim()));
+        } else {
+            log.debug("no grants were found in the result set");
+        }
+        final Map<String, Set<String>> map = new HashMap<>();
+        final Pattern databasePattern = Pattern.compile("ON `?([a-zA-Z0-9*]+)`?");
+        final Matcher databaseMatcher = databasePattern.matcher(resultSet.getString(1));
+        if (databaseMatcher.find()) {
+            final String databaseName = databaseMatcher.group(1)
+                    .trim();
+            if (!databaseName.equals("PROCEDURE")) {
+                map.put(databaseName, grants);
+                log.trace("grant on {} has privilege(s): {}", databaseName, grants);
+            }
+            return map;
+        }
+        log.debug("no database name was found in the result set");
+        throw new DatabaseMalformedException("No database name was found in the result set");
+    }
+
     default String databaseCreateUserQuery(String username, String password) {
         final StringBuilder statement = new StringBuilder("CREATE USER IF NOT EXISTS `")
                 .append(username)
@@ -80,6 +115,12 @@ public interface MariaDbMapper {
         return statement.toString();
     }
 
+    default String databaseAccessRawQuery() {
+        final StringBuilder statement = new StringBuilder(";");
+        log.trace("mapped database access statement: {}", statement);
+        return statement.toString();
+    }
+
     default String databaseGrantPrivilegesQuery(String username, String grants) {
         final StringBuilder statement = new StringBuilder("GRANT ")
                 .append(grants)
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/GrantService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/GrantService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3abce1daf88b462ecd58c406b69c49d78c4aa499
--- /dev/null
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/GrantService.java
@@ -0,0 +1,24 @@
+package at.ac.tuwien.ifs.dbrepo.service;
+
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto;
+import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException;
+
+import java.sql.SQLException;
+import java.util.Map;
+
+public interface GrantService {
+
+    /**
+     * Finds database access grants for a given user for a given database.
+     * @param database The database.
+     * @param user The user.
+     * @return The database access grants.
+     * @throws SQLException               The connection to the database could not be established.
+     * @throws DatabaseMalformedException The database schema is malformed.
+     */
+    DatabaseGrantsDto find(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException;
+
+    Map<String, DatabaseGrantsDto> findAll(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException;
+}
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java
index 8a6d79de51c222cbf78e64e0045a91245ce339b6..fc756583688e0a6a6864a646d0b04b4461474fcb 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java
@@ -25,7 +25,7 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer
     @Value("${dbrepo.grant.default.write}")
     private String grantDefaultWrite;
 
-    private MariaDbMapper mariaDbMapper;
+    private final MariaDbMapper mariaDbMapper;
 
     @Autowired
     public AccessServiceMariaDbImpl(MariaDbMapper mariaDbMapper) {
@@ -42,22 +42,38 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer
             long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseCreateUserQuery(user.getUsername(), user.getPassword()))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("create user in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_user")
+                    .log();
             /* grant access */
             final String grants = access != AccessTypeDto.READ ? grantDefaultWrite : grantDefaultRead;
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("grant user privileges in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "grant_user_privileges")
+                    .log();
             /* grant query store */
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseGrantProcedureQuery(user.getUsername(), "store_query"))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("grant procedure privileges in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "grant_procedure_privileges")
+                    .log();
             /* apply access rights */
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery());
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("flush privileges in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "flush_privileges")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -71,8 +87,8 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer
     }
 
     @Override
-    public void update(DatabaseDto database, UserDto user, AccessTypeDto access)
-            throws DatabaseMalformedException, SQLException {
+    public void update(DatabaseDto database, UserDto user, AccessTypeDto access) throws DatabaseMalformedException,
+            SQLException {
         final ComboPooledDataSource dataSource = getDataSource(database);
         final Connection connection = dataSource.getConnection();
         try {
@@ -81,7 +97,11 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer
             final long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("update privileges in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "grant_user_privileges")
+                    .log();
             /* apply access rights */
             connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery());
             connection.commit();
@@ -105,12 +125,20 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer
             long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseRevokePrivilegesQuery(user.getUsername()))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("revoke privileges in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "grant_user_privileges")
+                    .log();
             /* apply access rights */
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery())
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("flush privileges in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "flush_privileges")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java
index 2178f89707949077bc9bbf254a408abd84e4e72b..0cd04b304def0ef9812a57594460ab8c1f07af3b 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java
@@ -56,10 +56,16 @@ public class CacheServiceImpl implements CacheService {
         if (!forceReload) {
             final DatabaseDto cacheDatabase = databaseCache.getIfPresent(id);
             if (cacheDatabase != null) {
-                log.trace("found database with id {} in cache", id);
+                log.atTrace()
+                        .setMessage("found database with id " + id + " in cache")
+                        .addKeyValue("cache_hit", true)
+                        .log();
                 return cacheDatabase;
             }
-            log.debug("database with id {} not it cache (anymore): reload from metadata service", id);
+            log.atTrace()
+                    .setMessage("reload database from metadata service with id " + id + " in cache")
+                    .addKeyValue("cache_hit", false)
+                    .log();
         }
         final DatabaseDto database = gateway.getDatabaseById(id);
         databaseCache.put(id, database);
@@ -77,10 +83,16 @@ public class CacheServiceImpl implements CacheService {
             MetadataServiceException, TableNotFoundException {
         final TableDto cacheTable = tableCache.getIfPresent(tableId);
         if (cacheTable != null) {
-            log.trace("found table with id {} in cache", tableId);
+            log.atTrace()
+                    .setMessage("found table with id " + tableId + " in cache")
+                    .addKeyValue("cache_hit", true)
+                    .log();
             return cacheTable;
         }
-        log.debug("table with id {} not it cache (anymore): reload from metadata service", tableId);
+        log.atTrace()
+                .setMessage("reload table from metadata service with id " + tableId + " in cache")
+                .addKeyValue("cache_hit", false)
+                .log();
         final TableDto table = gateway.getTableById(databaseId, tableId);
         tableCache.put(tableId, table);
         return table;
@@ -91,10 +103,16 @@ public class CacheServiceImpl implements CacheService {
             TableMalformedException, QueryMalformedException, SQLException {
         final TableStatisticDto cacheStatistic = statisticCache.getIfPresent(view.getId());
         if (cacheStatistic != null) {
-            log.trace("found view statistic with id {} in cache", view.getId());
+            log.atTrace()
+                    .setMessage("found view with id " + view.getId() + " in cache")
+                    .addKeyValue("cache_hit", true)
+                    .log();
             return cacheStatistic;
         }
-        log.debug("view statistic with id {} not it cache (anymore): reload", view.getId());
+        log.atTrace()
+                .setMessage("reload view from metadata service with id " + view.getId() + " in cache")
+                .addKeyValue("cache_hit", false)
+                .log();
         final TableStatisticDto statistic = tableService.getStatistics(database, view.getInternalName());
         statistic.setTotalRows(tableService.getCount(database, view.getInternalName(), Instant.now()));
         statisticCache.put(view.getId(), statistic);
@@ -106,10 +124,16 @@ public class CacheServiceImpl implements CacheService {
             ContainerNotFoundException {
         final ContainerDto cacheContainer = containerCache.getIfPresent(id);
         if (cacheContainer != null) {
-            log.trace("found container with id {} in cache", id);
+            log.atTrace()
+                    .setMessage("found container with id " + id + " in cache")
+                    .addKeyValue("cache_hit", true)
+                    .log();
             return cacheContainer;
         }
-        log.debug("container with id {} not it cache (anymore): reload from metadata service", id);
+        log.atTrace()
+                .setMessage("reload container from metadata service with id " + id + " in cache")
+                .addKeyValue("cache_hit", false)
+                .log();
         final ContainerDto container = gateway.getContainerById(id);
         containerCache.put(id, container);
         return container;
@@ -120,10 +144,16 @@ public class CacheServiceImpl implements CacheService {
             MetadataServiceException, ViewNotFoundException {
         final ViewDto cacheView = viewCache.getIfPresent(viewId);
         if (cacheView != null) {
-            log.trace("found view with id {} in cache", viewId);
+            log.atTrace()
+                    .setMessage("found view with id " + viewId + " in cache")
+                    .addKeyValue("cache_hit", true)
+                    .log();
             return cacheView;
         }
-        log.debug("view with id {} not it cache (anymore): reload from metadata service", viewId);
+        log.atTrace()
+                .setMessage("reload view from metadata service with id " + viewId + " in cache")
+                .addKeyValue("cache_hit", false)
+                .log();
         final ViewDto view = gateway.getViewById(databaseId, viewId);
         viewCache.put(viewId, view);
         return view;
@@ -134,10 +164,16 @@ public class CacheServiceImpl implements CacheService {
             UserNotFoundException {
         final UserDto cacheUser = userCache.getIfPresent(id);
         if (cacheUser != null) {
-            log.trace("found user with id {} in cache", id);
+            log.atTrace()
+                    .setMessage("found user with id " + id + " in cache")
+                    .addKeyValue("cache_hit", true)
+                    .log();
             return cacheUser;
         }
-        log.debug("user with id {} not it cache (anymore): reload from metadata service", id);
+        log.atTrace()
+                .setMessage("reload user from metadata service with id " + id + " in cache")
+                .addKeyValue("cache_hit", false)
+                .log();
         final UserDto user = gateway.getUserById(id);
         userCache.put(id, user);
         return user;
@@ -148,10 +184,16 @@ public class CacheServiceImpl implements CacheService {
             MetadataServiceException, NotAllowedException {
         final DatabaseAccessDto cacheAccess = accessCache.getIfPresent(databaseId);
         if (cacheAccess != null) {
-            log.trace("found access for user with id {} to database with id {} in cache", userId, databaseId);
+            log.atTrace()
+                    .setMessage("found access for user with id " + userId + " in cache")
+                    .addKeyValue("cache_hit", true)
+                    .log();
             return cacheAccess;
         }
-        log.debug("access for user with id {} to database with id {} not it cache (anymore): reload from metadata service", userId, databaseId);
+        log.atTrace()
+                .setMessage("reload access from metadata service with user id " + userId + " in cache")
+                .addKeyValue("cache_hit", false)
+                .log();
         final DatabaseAccessDto access = gateway.getAccess(databaseId, userId);
         accessCache.put(databaseId, access);
         return access;
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java
index f4ab2ed2dec88196f9c70aeda0d22735c1afdadf..899f60d685d3d1ed95a329f7949033b91dfe1464 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java
@@ -1,17 +1,16 @@
 package at.ac.tuwien.ifs.dbrepo.service.impl;
 
+import at.ac.tuwien.ifs.dbrepo.config.RabbitConfig;
 import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.user.UserBriefDto;
 import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException;
 import at.ac.tuwien.ifs.dbrepo.core.exception.QueryStoreCreateException;
-import at.ac.tuwien.ifs.dbrepo.config.RabbitConfig;
 import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper;
 import at.ac.tuwien.ifs.dbrepo.service.ContainerService;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.logging.log4j.message.MapMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -41,8 +40,12 @@ public class ContainerServiceMariaDbImpl extends DataConnector implements Contai
             final long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseCreateDatabaseQuery(data.getInternalName()))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
             connection.commit();
+            log.atDebug()
+                    .setMessage("created database: " + data.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_database")
+                    .log();
         } catch (SQLException e) {
             connection.rollback();
             log.error("Failed to create database access: {}", e.getMessage());
@@ -74,19 +77,35 @@ public class ContainerServiceMariaDbImpl extends DataConnector implements Contai
             long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.queryStoreCreateTableRawQuery())
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("created query store in database: " + databaseName)
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_query_store")
+                    .log();
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.queryStoreCreateHashTableProcedureRawQuery())
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("created query store hash table procedure in database: " + databaseName)
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_procedure_hash_table")
+                    .log();
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.queryStoreCreateStoreQueryProcedureRawQuery())
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("created query store procedure in database: " + databaseName)
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_procedure_store_query")
+                    .log();
             start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.queryStoreCreateInternalStoreQueryProcedureRawQuery())
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("created internal query store procedure in database: " + databaseName)
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_procedure_internal_store_query")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java
index 266ccf7f13d7bb309cb7520ce16eeb977bebfff9..724ef43b2fd887d7fd87ac14314a90eb6f6d689a 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java
@@ -1,8 +1,5 @@
 package at.ac.tuwien.ifs.dbrepo.service.impl;
 
-import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper;
-import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper;
-import at.ac.tuwien.ifs.dbrepo.service.DatabaseService;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto;
@@ -10,6 +7,9 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.unique.Unique
 import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto;
 import at.ac.tuwien.ifs.dbrepo.core.exception.*;
+import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper;
+import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper;
+import at.ac.tuwien.ifs.dbrepo.service.DatabaseService;
 import com.google.common.hash.Hashing;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import lombok.extern.slf4j.Slf4j;
@@ -49,7 +49,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement1.setString(2, viewName);
             log.trace("1={}, 2={}", database.getInternalName(), viewName);
             final ResultSet resultSet1 = statement1.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("inspected view: " + viewName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_view_schema")
+                    .log();
             if (!resultSet1.next()) {
                 throw new ViewNotFoundException("Failed to find view in the information schema");
             }
@@ -63,7 +67,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement2.setString(2, view.getInternalName());
             log.trace("1={}, 2={}", database.getInternalName(), view.getInternalName());
             final ResultSet resultSet2 = statement2.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("inspect view columns: " + viewName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_view_columns")
+                    .log();
             TableDto tmp = TableDto.builder()
                     .columns(new LinkedList<>())
                     .build();
@@ -95,7 +103,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateTableRawQuery(database.getInternalName(),
                             data))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("created table: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_table")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -131,24 +143,32 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
                 .databaseId(database.getId())
                 .columns(new LinkedList<>())
                 .build();
-        log.debug("creating view: {}.{}", database.getInternalName(), view.getInternalName());
         try {
             /* create view if not exists */
-            final long start = System.currentTimeMillis();
+            long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.viewCreateRawQuery(view.getInternalName(), query))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("created view: " + view.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "create_view")
+                    .log();
             /* select view columns */
+            start = System.currentTimeMillis();
             final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery());
             statement2.setString(1, database.getInternalName());
             statement2.setString(2, view.getInternalName());
             final ResultSet resultSet2 = statement2.executeQuery();
+            log.atDebug()
+                    .setMessage("created view: " + view.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_view_columns")
+                    .log();
             while (resultSet2.next()) {
                 view = dataMapper.resultSetToTable(resultSet2, view);
             }
             connection.commit();
         } catch (SQLException e) {
-            log.error("Failed to create table", e);
             connection.rollback();
             log.error("Failed to create view: {}", e.getMessage());
             throw new ViewMalformedException("Failed to create view: " + e.getMessage(), e);
@@ -171,7 +191,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement.setString(1, database.getInternalName());
             final long start = System.currentTimeMillis();
             final ResultSet resultSet1 = statement.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("explored views in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_views")
+                    .log();
             while (resultSet1.next()) {
                 final String viewName = resultSet1.getString(1);
                 if (viewName.length() == 64) {
@@ -208,7 +232,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseTablesSelectRawQuery());
             statement.setString(1, database.getInternalName());
             final ResultSet resultSet1 = statement.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("explored tables in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_tables")
+                    .log();
             while (resultSet1.next()) {
                 final String tableName = resultSet1.getString(1);
                 if (database.getTables().stream().anyMatch(t -> t.getInternalName().equals(tableName))) {
@@ -243,7 +271,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement1.setString(2, tableName);
             log.trace("1={}, 2={}", database.getInternalName(), tableName);
             TableDto table = dataMapper.schemaResultSetToTable(database, statement1.executeQuery());
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("inspected table: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_table_schema")
+                    .log();
             /* obtain columns metadata */
             start = System.currentTimeMillis();
             final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery());
@@ -251,7 +283,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement2.setString(2, tableName);
             log.trace("1={}, 2={}", database.getInternalName(), tableName);
             final ResultSet resultSet2 = statement2.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("inspect table columns: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_table_columns")
+                    .log();
             while (resultSet2.next()) {
                 table = dataMapper.resultSetToTable(resultSet2, table);
             }
@@ -262,7 +298,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement3.setString(2, tableName);
             log.trace("1={}, 2={}", database.getInternalName(), tableName);
             final ResultSet resultSet3 = statement3.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("inspect table check constraints: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_table_constraints_check")
+                    .log();
             while (resultSet3.next()) {
                 final String clause = resultSet3.getString(1);
                 table.getConstraints()
@@ -277,7 +317,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             statement4.setString(2, tableName);
             log.trace("1={}, 2={}", database.getInternalName(), tableName);
             final ResultSet resultSet4 = statement4.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("inspect table constraints: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "select_table_constraints")
+                    .log();
             while (resultSet4.next()) {
                 table = dataMapper.resultSetToConstraint(resultSet4, table);
                 for (UniqueDto uk : table.getConstraints().getUniques()) {
@@ -315,7 +359,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas
             final long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.databaseSetPasswordQuery(data.getUsername(), data.getPassword()))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("updated user password: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "update_user_password")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/GrantServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/GrantServiceMariaDbImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..c19cff34d57d734192dc4106737f643d520e16b2
--- /dev/null
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/GrantServiceMariaDbImpl.java
@@ -0,0 +1,90 @@
+package at.ac.tuwien.ifs.dbrepo.service.impl;
+
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto;
+import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto;
+import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException;
+import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper;
+import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper;
+import at.ac.tuwien.ifs.dbrepo.service.GrantService;
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class GrantServiceMariaDbImpl extends DataConnector implements GrantService {
+
+    @Value("${dbrepo.grant.default.read}")
+    private String grantDefaultRead;
+
+    @Value("${dbrepo.grant.default.write}")
+    private String grantDefaultWrite;
+
+    private final MariaDbMapper mariaDbMapper;
+    private final MetadataMapper metadataMapper;
+
+    @Autowired
+    public GrantServiceMariaDbImpl(MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper) {
+        this.mariaDbMapper = mariaDbMapper;
+        this.metadataMapper = metadataMapper;
+    }
+
+    @Override
+    public DatabaseGrantsDto find(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException {
+        final Map<String, DatabaseGrantsDto> grants = findAll(database, user);
+        if (!grants.containsKey(database.getInternalName())) {
+            log.atError()
+                    .setMessage("Failed to find access grant(s) for database: " + database.getInternalName())
+                    .addKeyValue("user_id", user.getId())
+                    .addKeyValue("database_id", database.getId())
+                    .log();
+            /* there must be at least 1 grant otherwise the user does not exist in the database which indicates malformed */
+            throw new DatabaseMalformedException("Failed to find access grant(s) for database: " + database.getInternalName());
+        }
+        final DatabaseGrantsDto grant = grants.get(database.getInternalName());
+        log.debug("found grant: {}", grant);
+        return grant;
+    }
+
+    @Override
+    public Map<String, DatabaseGrantsDto> findAll(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException {
+        final ComboPooledDataSource dataSource = getDataSource(database);
+        final Connection connection = dataSource.getConnection();
+        final Map<String, DatabaseGrantsDto> grants = new HashMap<>();
+        try {
+            /* get access */
+            long start = System.currentTimeMillis();
+            final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseFindAccessQuery());
+            statement.setString(1, user.getUsername());
+            log.trace("1={}", user.getUsername());
+            final ResultSet resultSet = statement.executeQuery();
+            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            while (resultSet.next()) {
+                mariaDbMapper.resultSetToGrants(resultSet)
+                        .forEach((k, v) -> grants.put(k,
+                                metadataMapper.grantsToDatabaseGrantDto(v, grantDefaultRead, grantDefaultWrite)));
+            }
+            log.atInfo()
+                    .setMessage("Found " + grants.size() + " access grant(s) for user with id: " + user.getId())
+                    .addKeyValue("user_id", user.getId())
+                    .log();
+            return grants;
+        } catch (SQLException e) {
+            connection.rollback();
+            log.error("Failed to list database access: {}", e.getMessage());
+            throw new DatabaseMalformedException("Failed to list database access: " + e.getMessage(), e);
+        } finally {
+            dataSource.close();
+        }
+    }
+}
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java
index f6bd0287ae30921333d1842a90424ee526253163..1a2665738ca5f11a7f3911ad1eb22e5ddc057ae4 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java
@@ -47,8 +47,11 @@ public class QueueServiceRabbitMqImpl extends DataConnector implements QueueServ
             }
             final long start = System.currentTimeMillis();
             preparedStatement.executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
-            log.trace("successfully inserted tuple");
+            log.atDebug()
+                    .setMessage("successfully inserted tuple")
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "insert_tuple")
+                    .log();
         } finally {
             dataSource.close();
         }
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java
index 22887c8d10d2049943468db739d0c5ed4b051044..d941f5117fb1787bfe00e4d003f8133473bdeb0a 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java
@@ -46,21 +46,33 @@ public class StorageServiceS3Impl implements StorageService {
 
     @Override
     public void putObject(String key, byte[] content) {
+        final long start = System.currentTimeMillis();
         s3Client.putObject(PutObjectRequest.builder()
                 .key(key)
                 .bucket(s3Config.getS3Bucket())
                 .build(), RequestBody.fromBytes(content));
-        log.debug("put object in S3 bucket {} with key: {}", s3Config.getS3Bucket(), key);
+        log.atDebug()
+                .setMessage("put object in bucket with key: " + key)
+                .addKeyValue("duration", System.currentTimeMillis() - start)
+                .addKeyValue("action", "s3_put_object")
+                .log();
     }
 
     @Override
     public InputStream getObject(String bucket, String key) throws StorageNotFoundException,
             StorageUnavailableException {
         try {
-            return s3Client.getObject(GetObjectRequest.builder()
+            final long start = System.currentTimeMillis();
+            final InputStream object = s3Client.getObject(GetObjectRequest.builder()
                     .bucket(bucket)
                     .key(key)
                     .build());
+            log.atDebug()
+                    .setMessage("get object from bucket with key: " + key)
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "s3_get_object")
+                    .log();
+            return object;
         } catch (NoSuchKeyException e) {
             log.error("Failed to find object: not found: {}", e.getMessage());
             throw new StorageNotFoundException("Failed to find object: not found: " + e.getMessage(), e);
@@ -88,19 +100,21 @@ public class StorageServiceS3Impl implements StorageService {
 
     @Override
     public void deleteObject(String key) {
+        final long start = System.currentTimeMillis();
         s3Client.deleteObject(DeleteObjectRequest.builder()
                 .bucket(s3Config.getS3Bucket())
                 .key(key)
                 .build());
         log.atDebug()
-                .setMessage("deleted object " + key + " in bucket " + s3Config.getS3Bucket())
-                .addKeyValue("key", key)
-                .addKeyValue("bucket", s3Config.getS3Bucket())
+                .setMessage("delete object from bucket with key: " + key)
+                .addKeyValue("duration", System.currentTimeMillis() - start)
+                .addKeyValue("action", "s3_delete_object")
                 .log();
     }
 
     @Override
     public ExportResourceDto transformDataset(Dataset<Row> dataset) throws StorageUnavailableException {
+        long start = System.currentTimeMillis();
         final List<Map<String, String>> inMemory = dataset.collectAsList()
                 .stream()
                 .map(row -> {
@@ -111,7 +125,12 @@ public class StorageServiceS3Impl implements StorageService {
                     return map;
                 })
                 .toList();
-        log.debug("collected dataset with {} row(s)", inMemory.size());
+        log.atDebug()
+                .setMessage("transformed dataset with rows: " + inMemory.size())
+                .addKeyValue("duration", System.currentTimeMillis() - start)
+                .addKeyValue("action", "dataset_transform")
+                .log();
+        start = System.currentTimeMillis();
         try {
             final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
             try (Writer w = new OutputStreamWriter(byteArrayOutputStream, Charset.defaultCharset())) {
@@ -131,9 +150,15 @@ public class StorageServiceS3Impl implements StorageService {
                 }
                 w.flush();
             }
+            final InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
+            log.atDebug()
+                    .setMessage("transformed dataset to input stream resource")
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "dataset_export")
+                    .log();
             return ExportResourceDto.builder()
                     .filename("dataset.csv")
-                    .resource(new InputStreamResource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())))
+                    .resource(resource)
                     .build();
         } catch (IOException e) {
             log.error("Failed to transform in-memory dataset: {}", e.getMessage());
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java
index 738dfa96429c6ae7458dc04ea50cce629bedc79c..5ba91f2089fa93b4f8d4ae9c81a7325c811c0915 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java
@@ -50,13 +50,20 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
     @Override
     public Dataset<Row> getData(DatabaseDto database, String query) throws QueryMalformedException, TableNotFoundException {
         try {
-            return sparkSession.read()
+            final long start = System.currentTimeMillis();
+            final Dataset<Row> dataset = sparkSession.read()
                     .format("jdbc")
                     .option("user", database.getContainer().getUsername())
                     .option("password", database.getContainer().getPassword())
                     .option("url", getSparkUrl(database))
                     .option("query", query)
                     .load();
+            log.atDebug()
+                    .setMessage("get data from url: " + getSparkUrl(database))
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "jdbc_get_data")
+                    .log();
+            return dataset;
         } catch (Exception e) {
             if (e instanceof ExtendedAnalysisException && e.getMessage().contains("TABLE_OR_VIEW_NOT_FOUND")
                     || e instanceof SQLSyntaxErrorException && e.getMessage().contains("doesn't exist")) {
@@ -98,7 +105,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
                 log.trace("filter persisted only {}", filterPersisted);
             }
             final ResultSet resultSet = statement.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("list subsets in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "list_queries")
+                    .log();
             final List<QueryDto> queries = new LinkedList<>();
             while (resultSet.next()) {
                 final QueryDto query = dataMapper.resultSetToQueryDto(resultSet);
@@ -132,7 +143,13 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
             final long start = System.currentTimeMillis();
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.countRawSelectQuery(statement, timestamp))
                     .executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("count subset in database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "count_query")
+                    .addKeyValue("query", statement)
+                    .addKeyValue("timestamp", timestamp)
+                    .log();
             return mariaDbMapper.resultSetToNumber(resultSet);
         } catch (SQLException e) {
             log.error("Failed to map object: {}", e.getMessage());
@@ -152,7 +169,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
             final PreparedStatement preparedStatement = connection.prepareStatement(mariaDbMapper.queryStoreFindQueryRawQuery());
             preparedStatement.setString(1, String.valueOf(queryId));
             final ResultSet resultSet = preparedStatement.executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("find query in query store of database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "find_query")
+                    .log();
             if (!resultSet.next()) {
                 throw new QueryNotFoundException("Failed to find query");
             }
@@ -190,7 +211,12 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
             callableStatement.setTimestamp(3, Timestamp.from(timestamp));
             callableStatement.registerOutParameter(4, Types.VARCHAR);
             callableStatement.executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("store query in query store of database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "store_query")
+                    .addKeyValue("query", query)
+                    .log();
             queryId = UUID.fromString(callableStatement.getString(4));
             callableStatement.close();
             log.info("Stored query with id {} in database with name {}", queryId, database.getInternalName());
@@ -217,7 +243,12 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
             preparedStatement.setBoolean(1, persist);
             preparedStatement.setString(2, String.valueOf(queryId));
             preparedStatement.executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("persist query in query store of database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "persist_query")
+                    .addKeyValue("query_id", queryId)
+                    .log();
         } catch (SQLException e) {
             log.error("Failed to (un-)persist query: {}", e.getMessage());
             throw new QueryStorePersistException("Failed to (un-)persist query", e);
@@ -235,7 +266,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer
             final long start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.queryStoreDeleteStaleQueriesRawQuery())
                     .executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("delete stale queries in query store of database: " + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "delete_stale_queries")
+                    .log();
         } catch (SQLException e) {
             log.error("Failed to delete stale queries: {}", e.getMessage());
             throw new QueryStoreGCException("Failed to delete stale queries: " + e.getMessage(), e);
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java
index 2382ee09f45d9f4a77282cd137cf3ecc0cb4364b..b4551be7d6ad091f992d37744218312924fe1f6d 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java
@@ -69,7 +69,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             statistic = dataMapper.resultSetToTableStatistic(resultSet);
             statistic.setTotalColumns(Long.parseLong("" + tmpTable.getColumns()
                     .size()));
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("get table statistics: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "get_table_statistics")
+                    .log();
             statistic.setAvgRowLength(tmpTable.getAvgRowLength());
             statistic.setDataLength(tmpTable.getDataLength());
             statistic.setMaxDataLength(tmpTable.getMaxDataLength());
@@ -102,14 +106,18 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             final long start = System.currentTimeMillis();
             final PreparedStatement statement = connection.prepareStatement(
                     mariaDbMapper.tableNameToUpdateTableRawQuery(database.getInternalName(), table.getInternalName()));
-            log.trace("prepare with arg 1={}", data.getDescription());
+            log.trace("1={}", data.getDescription());
             if (data.getDescription() == null) {
                 statement.setString(1, "");
             } else {
                 statement.setString(1, data.getDescription());
             }
             statement.executeUpdate();
-            log.debug(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("update table comment: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "update_table_comment")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -131,7 +139,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             connection.prepareStatement(mariaDbMapper.dropTableRawQuery(database.getInternalName(),
                             table.getInternalName()))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("delete table: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "delete_table")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -155,7 +167,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectHistoryRawQuery(
                             database.getInternalName(), table.getInternalName(), size))
                     .executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("get table history: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "get_table_history")
+                    .log();
             history = dataMapper.resultSetToTableHistory(resultSet);
             connection.commit();
         } catch (SQLException e) {
@@ -181,7 +197,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery(
                             database.getInternalName(), tableName, timestamp))
                     .executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("get table count: " + tableName + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "get_table_count")
+                    .log();
             queryResult = mariaDbMapper.resultSetToNumber(resultSet);
             connection.commit();
         } catch (SQLException e) {
@@ -211,11 +231,17 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
         final String temporaryTable = table.getInternalName() + "_tmp";
         final ComboPooledDataSource dataSource = getDataSource(database);
         final Connection connection = dataSource.getConnection();
+        long start = System.currentTimeMillis();
         try {
             /* import tuple */
             connection.prepareStatement(mariaDbMapper.copyTableSchemaToRawQuery(table.getInternalName(), temporaryTable))
                     .execute();
             connection.commit();
+            log.atDebug()
+                    .setMessage("copy table schema from " + table.getInternalName() + "." + database.getInternalName() + " into temporary table: " + temporaryTable + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_copy_schema")
+                    .log();
         } catch (SQLException e) {
             connection.rollback();
             log.atError()
@@ -226,10 +252,16 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
         }
         log.debug("copied schema from target table {} to import table: {}", table.getInternalName(), temporaryTable);
         try {
+            start = System.currentTimeMillis();
             dataset.write()
                     .mode(SaveMode.Overwrite)
                     .option("header", data.getHeader())
                     .jdbc(getSparkUrl(database), temporaryTable, properties);
+            log.atDebug()
+                    .setMessage("write data into temporary table: " + temporaryTable + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_import_data")
+                    .log();
         } catch (Exception e) {
             log.atError()
                     .setMessage("Failed to write dataset: schema malformed")
@@ -239,10 +271,16 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
         }
         try {
             /* import tuple */
+            start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.temporaryTableToRawMergeQuery(temporaryTable,
                             table.getInternalName(), table.getColumns().stream().map(c -> c.getInternalName()).toList()))
                     .execute();
             connection.commit();
+            log.atDebug()
+                    .setMessage("merge data from temporary table " + temporaryTable + "." + database.getInternalName() + " into table: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_merge_data")
+                    .log();
         } catch (SQLException e) {
             connection.rollback();
             log.atError()
@@ -252,19 +290,21 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             throw new MalformedException("Failed to import tuple: " + e.getMessage(), e);
         } finally {
             /* delete temporary table */
+            start = System.currentTimeMillis();
             connection.prepareStatement(mariaDbMapper.dropTableRawQuery(database.getInternalName(), temporaryTable,
                             false))
                     .execute();
             log.debug("deleted temporary table: {}", temporaryTable);
             connection.commit();
+            log.atDebug()
+                    .setMessage("delete temporary table: " + temporaryTable + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_delete_schema")
+                    .log();
             dataSource.close();
         }
         storageService.deleteObject(data.getLocation());
-        log.atInfo()
-                .setMessage("Imported dataset into table " + database.getInternalName() + "." + table.getInternalName())
-                .addKeyValue("s3_key", data.getLocation())
-                .addKeyValue("table_name", database.getInternalName() + "." + table.getInternalName())
-                .log();
+        log.info("Imported dataset into table {}.{}", database.getInternalName(), table.getInternalName());
     }
 
     @Override
@@ -286,7 +326,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             }
             final long start = System.currentTimeMillis();
             statement.executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("delete tuple in table: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_delete_tuple")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -331,7 +375,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             }
             final long start = System.currentTimeMillis();
             statement.executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("create tuple in table: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_create_tuple")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -368,7 +416,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi
             }
             final long start = System.currentTimeMillis();
             statement.executeUpdate();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("update tuple in table: " + table.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "table_update_tuple")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java
index 589b7eda06f36c6204225da610e369298bff42e5..5bf8ad366017b0ab323ad40808e07e890275f379 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java
@@ -37,7 +37,11 @@ public class ViewServiceMariaDbImpl extends DataConnector implements ViewService
             connection.prepareStatement(mariaDbMapper.dropViewRawQuery(database.getInternalName(),
                             view.getInternalName()))
                     .execute();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("delete view: " + view.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "view_delete")
+                    .log();
             connection.commit();
         } catch (SQLException e) {
             connection.rollback();
@@ -61,7 +65,11 @@ public class ViewServiceMariaDbImpl extends DataConnector implements ViewService
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery(
                             database.getInternalName(), view.getInternalName(), timestamp))
                     .executeQuery();
-            log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start);
+            log.atDebug()
+                    .setMessage("count view: " + view.getInternalName() + "." + database.getInternalName())
+                    .addKeyValue("duration", System.currentTimeMillis() - start)
+                    .addKeyValue("action", "count_view")
+                    .log();
             queryResult = mariaDbMapper.resultSetToNumber(resultSet);
             connection.commit();
         } catch (SQLException e) {
diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf
index 153d6fb7f50444c94fbcd2a29371f12833d20d6d..0fcec7824a6e1f024c5e0cc6e2f0362f8312d84e 100644
--- a/dbrepo-gateway-service/dbrepo.conf
+++ b/dbrepo-gateway-service/dbrepo.conf
@@ -136,7 +136,7 @@ server {
         proxy_read_timeout      90;
     }
 
-    location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" {
+    location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(subset|grant)" {
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header        X-Forwarded-Host $host;
diff --git a/dbrepo-metadata-db/migration/19/schema.sql b/dbrepo-metadata-db/migration/19/schema.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3647c9a87f1c27ba14ae0b677eb22f109bf91fc9
--- /dev/null
+++ b/dbrepo-metadata-db/migration/19/schema.sql
@@ -0,0 +1,30 @@
+ALTER TABLE mdb_identifier_creators
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_creators
+    ADD COLUMN ordinal_position INT NOT NULL;
+ALTER TABLE mdb_identifier_creators
+    ADD SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_titles
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_titles
+    ADD COLUMN ordinal_position INT NOT NULL;
+ALTER TABLE mdb_identifier_titles
+    ADD SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_funders
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_funders
+    ADD COLUMN ordinal_position INT NOT NULL;
+ALTER TABLE mdb_identifier_funders
+    ADD SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_descriptions
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_descriptions
+    ADD COLUMN ordinal_position INT NOT NULL;
+ALTER TABLE mdb_identifier_descriptions
+    ADD SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_related
+    DROP SYSTEM VERSIONING;
+ALTER TABLE mdb_identifier_related
+    ADD COLUMN ordinal_position INT NOT NULL;
+ALTER TABLE mdb_identifier_related
+    ADD SYSTEM VERSIONING;
diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml
index 672f9b98a177acc992d6cd1203ad271e36432134..2e7051933bfa3bf1c4df7f2474800a0b29fa5a6f 100644
--- a/dbrepo-metadata-service/oai/pom.xml
+++ b/dbrepo-metadata-service/oai/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>metadata-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>oai</name>
     <artifactId>oai</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies/>
 
diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml
index 428062e680058ab80e67c056e14117139ea1cd32..0552aa9883fd74521b3fcb7ef2b1afd4c13e0fac 100644
--- a/dbrepo-metadata-service/pom.xml
+++ b/dbrepo-metadata-service/pom.xml
@@ -18,7 +18,7 @@
 
     <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
     <artifactId>metadata-service</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <packaging>pom</packaging>
     <modules>
@@ -69,7 +69,7 @@
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>dbrepo-core</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
         <!-- Data Source -->
         <dependency>
diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml
index 05bebc48357e36773629021f17bb19095c2f32ed..55f33ff3e3792685f26dc987890b39f19f4aa2c2 100644
--- a/dbrepo-metadata-service/report/pom.xml
+++ b/dbrepo-metadata-service/report/pom.xml
@@ -6,23 +6,23 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>metadata-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>report</name>
     <artifactId>report</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>rest-service</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>services</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml
index c7135144b847c5574a6f303b669c74952cc64b66..d7c45b2898bb84baeef2adac49daa1e6b584ad01 100644
--- a/dbrepo-metadata-service/repositories/pom.xml
+++ b/dbrepo-metadata-service/repositories/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>metadata-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>repositories</name>
     <artifactId>repositories</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>oai</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml
index 087e22b654a7ef118053dfdb9f1e451b8ba554bb..992395d34ead6c2e5491bf7db4d60042e7119a3c 100644
--- a/dbrepo-metadata-service/rest-service/pom.xml
+++ b/dbrepo-metadata-service/rest-service/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>metadata-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>rest-service</name>
     <artifactId>rest-service</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>services</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java
index 485967e56814ee0b5449e1faa95c7fc2ab21eef6..aaed002d5c330f5ee98d1ded5b9933e14de1b390 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java
@@ -41,6 +41,7 @@ import java.util.UUID;
 public class DatabaseEndpoint extends AbstractEndpoint {
 
     private final UserService userService;
+    private final AccessService accessService;
     private final MetadataMapper metadataMapper;
     private final StorageService storageService;
     private final DatabaseService databaseService;
@@ -48,10 +49,11 @@ public class DatabaseEndpoint extends AbstractEndpoint {
     private final DashboardService dashboardService;
 
     @Autowired
-    public DatabaseEndpoint(UserService userService, MetadataMapper metadataMapper, StorageService storageService,
+    public DatabaseEndpoint(UserService userService, AccessService accessService, MetadataMapper metadataMapper, StorageService storageService,
                             DatabaseService databaseService, ContainerService containerService,
                             DashboardService dashboardService) {
         this.userService = userService;
+        this.accessService = accessService;
         this.metadataMapper = metadataMapper;
         this.storageService = storageService;
         this.databaseService = databaseService;
diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml
index 6b5f58f4f6797012f6e1e3e621a7c8700f3234e5..f69e7124a530895da06484aedd3dbe8d9a090f8f 100644
--- a/dbrepo-metadata-service/services/pom.xml
+++ b/dbrepo-metadata-service/services/pom.xml
@@ -6,23 +6,23 @@
     <parent>
         <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
         <artifactId>metadata-service</artifactId>
-        <version>1.9.1</version>
+        <version>1.9.2</version>
     </parent>
 
     <name>services</name>
     <artifactId>services</artifactId>
-    <version>1.9.1</version>
+    <version>1.9.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>oai</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>repositories</artifactId>
-            <version>1.9.1</version>
+            <version>1.9.2</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile
index e62574783c7e347bcbd40fcebb4ff2fe0a498e7c..c05cd0a461a0fa3d47242f0624dfe87cedf9c4eb 100644
--- a/dbrepo-search-service/Pipfile
+++ b/dbrepo-search-service/Pipfile
@@ -17,7 +17,7 @@ flask_httpauth = "*"
 jwt = "~=1.3"
 rdflib = "*"
 grafana-client = "*"
-dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"}
 gunicorn = "*"
 ecs_logging = "*"
 
diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock
index 6c32cb119d2b4dc4945c5fdfcc901a422cbff162..0311f44581bb1744221436b48273638364afa081 100644
--- a/dbrepo-search-service/Pipfile.lock
+++ b/dbrepo-search-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "40d4f3f3e19b2840cae3c53ef9a753b8c93e6601e4b10e03c8f4d7a8276440be"
+            "sha256": "415611f31c7f873488df627f955025366a591388a32f43f163254bffd48be442"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -272,10 +272,10 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:b6d7b9f5efeade2274249f1e48517820dd58dce5b24c0bf092cb4fc4be59c602"
+                "sha256:b9079a9a97d7112459df40cbc8e63302848e4cd995a5bd0fe69d52b99e670be7"
             ],
-            "path": "./lib/dbrepo-1.9.1.tar.gz",
-            "version": "==1.9.1"
+            "path": "./lib/dbrepo-1.9.2.tar.gz",
+            "version": "==1.9.2"
         },
         "ecs-logging": {
             "hashes": [
@@ -404,7 +404,7 @@
                 "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5",
                 "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421"
             ],
-            "markers": "python_version < '3.14' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))",
+            "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))",
             "version": "==3.2.2"
         },
         "gunicorn": {
@@ -947,7 +947,7 @@
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
                 "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.9.0.post0"
         },
         "python-dotenv": {
@@ -1026,104 +1026,104 @@
         },
         "qh3": {
             "hashes": [
-                "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111",
-                "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46",
-                "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337",
-                "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41",
-                "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2",
-                "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846",
-                "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d",
-                "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff",
-                "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf",
-                "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075",
-                "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac",
-                "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e",
-                "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6",
-                "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4",
-                "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865",
-                "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff",
-                "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072",
-                "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52",
-                "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435",
-                "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735",
-                "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f",
-                "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517",
-                "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57",
-                "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244",
-                "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74",
-                "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976",
-                "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3",
-                "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36",
-                "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663",
-                "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956",
-                "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6",
-                "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca",
-                "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d",
-                "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b",
-                "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908",
-                "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147",
-                "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d",
-                "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590",
-                "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652",
-                "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c",
-                "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568",
-                "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2",
-                "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f",
-                "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b",
-                "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522",
-                "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70",
-                "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339",
-                "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163",
-                "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099",
-                "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20",
-                "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be",
-                "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a",
-                "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203",
-                "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85",
-                "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404",
-                "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede",
-                "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf",
-                "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972",
-                "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6",
-                "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d",
-                "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65",
-                "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435",
-                "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb",
-                "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97",
-                "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c",
-                "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34",
-                "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d",
-                "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df",
-                "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35",
-                "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2",
-                "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822",
-                "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1",
-                "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca",
-                "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d",
-                "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66",
-                "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4",
-                "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38",
-                "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88",
-                "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504",
-                "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4",
-                "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93",
-                "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e",
-                "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8",
-                "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58",
-                "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857",
-                "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a",
-                "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9",
-                "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70",
-                "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91",
-                "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416",
-                "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0",
-                "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f",
-                "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869",
-                "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943",
-                "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d"
-            ],
-            "markers": "python_version < '3.12' and (platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or platform_python_implementation == 'PyPy')",
-            "version": "==1.5.1"
+                "sha256:0083b52578a54f04957527f28c9016736242efb8c2b5e589e027ab8b2e1916a2",
+                "sha256:025d7331c8bb45bf7d02c1c0bc8ec9b5a9054b891e865ff679753c22da8bc6c9",
+                "sha256:02856422f3009270990ebdee6a2e29f1f1167b1fe8260c62810b6bfb7d86740d",
+                "sha256:04151e6ce7c3aaaca7d850a2b7dcc769f1356581af178649ab5e6f2aa78b0304",
+                "sha256:04c18ca8ebdeda8ab60cb72a43f2c5d730446705f5060854eb21167b0d21097e",
+                "sha256:0529b9ee9b37f3ccf2833d558e7ad1846596e36f1916a23c0c1af825f07549be",
+                "sha256:087bf1a4b3a6809112b1a22f50dd0dbd86eb991971b036d2f3a650c79d81fe29",
+                "sha256:0a87ecebdf3a3216ecbbd32d6c3cbabcd3f90d1a24363fc6aeea3af99d7c394b",
+                "sha256:0ca013329d0345d4d203f24e12e5adde3bc393571d55c02b8279efd1cf7fd818",
+                "sha256:0eac427589488b069293fb2d06a2d765a4aff77ae74990c566fe161542493bac",
+                "sha256:134939418800fad4e669bb6ce4e7c4e303e5d40d2ff457add9ccd99e64cbbf64",
+                "sha256:1399e604c7ac178758eecdefdfae0bed37f52a792101ee8e32dc594ca2350c0d",
+                "sha256:13fc96388d3010377b52aa3059141568dd4ba35c0d2f3f39b60244fbd4f70b79",
+                "sha256:1735afdce2c3d924da8c4b7f5da5d1020c14981b472e94052e2ec351b1b67068",
+                "sha256:238b185d8d1c41907a093201e389127cffbfbb013141fd9fed98609c0adcfb45",
+                "sha256:2800f9fabec12e4e3ba40cdce65ded9b951f6d5374ec7021be667db88e496a38",
+                "sha256:2ae6a3170f14c49b0733aeb71bfbdb98962d05a3502e2e4f2a056eae76c34800",
+                "sha256:2b928f026cef5eecd530a1a546a468eca8ac71aebc9eaf864b5ff54aebb4a63e",
+                "sha256:2f1997b95fd66835e3a372a6c21062a35ca870bdd1687867c09e1d8f91980df0",
+                "sha256:3bb915e2a46b0d2364e74e7c7c85a9b0d5c473a0bcfcd27a2ed6923773b0216c",
+                "sha256:3d7fb7ec47465c40af3c0471a14f2a4af8f0c1af95a0476ef4ac6eacf18b2b1e",
+                "sha256:3de09f8d58eb69f8d8a9bc1a77982001c1d43df27544512d2a89d00911dfa40c",
+                "sha256:4341c2e53b3f1a5ed065dd2be4f7ff23e0b1708397bb66c19e6b898377fe941c",
+                "sha256:45937d8be16030d1c6da5dcfff10bbba35a7f5bd5f96de45045fd8fbea033df4",
+                "sha256:465c7efc5bb33ee90da4d29580ad0f57efd897c4184f575e77653514e9a058cb",
+                "sha256:4707bdb76176b00cb4bd0d27d8ccea41fc86fbff7479cc9812aef0a23ffc6813",
+                "sha256:486065b50f7787e2f62c918b619bc34c06d8a66e1f1bd4f66cb449a2e467f3a5",
+                "sha256:4bb83c8437d7c43bda7006240fc95dc119d2569dab30a20b428dbf058f686a2b",
+                "sha256:4e7dff6ffc3ed19be9b2e42ea58ef00bc0435f2a950f3320eed932b1dff325b7",
+                "sha256:548b31b6d1bec0b11813c74ed3c94664aeeeef4ba51a3ac312fe471962e58442",
+                "sha256:585ebc0d5a415fa1042189c7c98bd93e63813c38e2d6e1581181f99e2bc7aea7",
+                "sha256:5ac050fce6407914b32ab84366fc15f00c6a7aad33c7116dc29ac441ded3bce6",
+                "sha256:5c1d3f12442b7c43db7753eaf914e9644b8a90d97798206dc6a1444a4a06ddcb",
+                "sha256:5f963a886bc882cba39091568e225ab36b882ae24eb2a965256c5f63e6b7eafa",
+                "sha256:62115845fb1695d1d018e995eae90dc2b53da9a30127e264e5cd370384358178",
+                "sha256:6341cddfd43d962c77849358ed7ae98022949ac8155ee9e97dcb3000edd73613",
+                "sha256:6380a52e146227bf420af66803f8c4b54627129f49631ba9f9b058bed92de51a",
+                "sha256:657442ae3d713f88c8ac8c7bf047da4e1cee4f6cc2aff254a7e7d4e2cc5d9d7a",
+                "sha256:66a6c77d667a848f39fc153675c2d53bce7ad068d8ce7d651da79a5d43672a81",
+                "sha256:66c01e2d825587a7b06062b4f05373c7ec3191939f6b744192403863078ddf41",
+                "sha256:695f0b5ab6a886fd3d1089eed50a4815136e84583b5d426c0de11db24274dff8",
+                "sha256:6975abfe6d21f0f2a74109aab4b9e9071d215f0ae38b5760e070d4c027187fcb",
+                "sha256:69c5f38e00cb41ceea8f6d9f82b76a10cd4bd0f5612551f841ddcc335df5e88b",
+                "sha256:6b8baa1c9789945de14571e48bed5996440171f5dd91589d9572ece6db8aa09d",
+                "sha256:748587c5fd4216d44fedcdfc8b03320e36f2eba6ab373cbf337448583ff37f16",
+                "sha256:74e3d7265edc7268f3eb54b8d0623a2b5adea8e272cc124818686bc6583a4645",
+                "sha256:7d9d83f65e778a421a24e4eb82de22cbac3f94ac09637309890465bf5592a5ce",
+                "sha256:7db6eddc5c19730e92cca95c2a2a7bca184637d854720e33367466db9f428708",
+                "sha256:8022106a134c142f4a1e774be4ae6a2be4e480586de65c0b13658e9e329aea7d",
+                "sha256:819a5733de1a2407b738105f99b323a1fe31f687a701c29566ae934fa893224f",
+                "sha256:844d7ff5a5081f6920d726518860a76138f97763ce6c4206c06756844f0c1645",
+                "sha256:892c335cbd1ac5786229aa6b8987250dbb7f7b0bf3775b56ca11cde6090bcb30",
+                "sha256:89a19e6af701e525b7c0e4e589d8fa0dcf9f1deddb9eee171fa941a0add93ffc",
+                "sha256:89b24c3060cfdf8e61926af5271632f656bee689b6c95c36b85d2c79ec04c757",
+                "sha256:95efc1710dc4d4a7fff837a603a7bc4370449c87bdaecafdf290226e82303b52",
+                "sha256:968b1d7aae7d1dcd9d1899bac4936ff641589420575ef0f886150313b3872de7",
+                "sha256:9b2e8cb7a2940d2b94ca24db9f544f4011cdde2c446ccc71f7d1646ae011df11",
+                "sha256:9c094865d884a88053f8a2a282f26debc2727a21ef14e9fc5ee23d07d9d749f1",
+                "sha256:9e687e7317f87ad139e4959b65bcff22adb4bbec5f8e09c1873a5bb973e1380e",
+                "sha256:a4c265cff95c19da27450c4861fd60a25e4b4dddc58ddf62cf5fe869922d6e8e",
+                "sha256:a75c04955b285c9b9dd54077ad8e180bb5393c714c213e26a37170cbd7cc9df7",
+                "sha256:a790ceebd0f105241e425af0545b7b21623e3e94a67add68e854f13596d3f76b",
+                "sha256:ac1c429b0f283fad0521e50fba6135d70b7d8fa9538523880ee232b0cf0edd09",
+                "sha256:af885eeda54152c3086b7c5861b50f79c94b83e1ea4a1407afaffb84f52aaddf",
+                "sha256:b07b805c3ef734e5c330333b549d98adc514df6e83ef0338cb3353538d570322",
+                "sha256:bbfeeff794bb947fe90ba3fc3d395c78418bb17c2dbafe5ca47552ef3ccb6a29",
+                "sha256:bd7ae2ead0ddd0df3a22fe9f84aff1c44afbac82b1af41dc2934eec6c56ef3ec",
+                "sha256:be8800c5a087e7e4e33cb12f35234ca94f4ec4837d29918899a48d6f61ea59b3",
+                "sha256:c11567cd77d11a7ba2f8be9a31cfa74a11df34a4a78f91cff8fa6bee5c3145c7",
+                "sha256:c2ce0f0cdb9d22cbccd477b09436354e4aa2aaf0cdd0c2ed3f3da6f11979e68e",
+                "sha256:c5d45257e8ecbddf2587aa4ae1a0cf45856eb32d5e847bb01a3f74a39ab4b645",
+                "sha256:c66f50475727ac7cde643d48b27b6388a6b680484c3dcbb0b237fb003529785a",
+                "sha256:cb846ab19c1fa9d2d1aeaa1e603f4ddc6e9837952fc22c5b56061167b28cb2d0",
+                "sha256:cff8b68a89b2e03f8d954606d2015a4241002e3ea7ce45c3e7c7c73918263bac",
+                "sha256:d33da2a9b44f7613fe214b1d2dc03a4345b7a0345383ac562b8636a41129791f",
+                "sha256:d37c6809d76e9ed95277dc0155bb72c08e7334d741b2eae62ff4f9f8adcb43af",
+                "sha256:d58d5d2e59432c86324565a4adc649f383251f747809e469de1c01208691bc02",
+                "sha256:d6bc891a9480c0b4791a1cc7d62b3128ffa04b7883fabf35bb0ece3173338911",
+                "sha256:d725c7335184f1ef96b22660b92ab8f343ada41804bb54d74ac166f82033f115",
+                "sha256:d9362ea607a8640b5a1a612f834f39002dfa57561388e21e4d9dd12c7f5d11fc",
+                "sha256:db84023568e545ea45385cacd9edcc02cd1bd8cb1f4c5c0a89d4d061e8153850",
+                "sha256:ddebca89a63a726b129a7198087a17a8c33d72f957442593892c681e6aef0e8f",
+                "sha256:de091b890eaab8be1cba3c7483f718e68067c7681209f0c98251b50e7e032800",
+                "sha256:de9587b4d32462af1eafb84f2ea35aed5cb92b945f18acb1593cdec0d90accc6",
+                "sha256:def7d1d90c61da6860377403e603d0aff5a47e3fb71cbf0155b8fa0d9f6cacbb",
+                "sha256:e73e1d9633315b3a01763b9c7be55522f7f0983880b61d67f49823ac7e3b4421",
+                "sha256:eaf03403091b30c97bfbf4c22e6fc7057253e283157dbcdd23eb7a925d7ec65a",
+                "sha256:efc70ae80f742e84b320765587f0ce7715f11ae0b6a2a1b9e0ebed650b5da546",
+                "sha256:f0d7845993703cf115c82b9161cc361ddffd91af9d164892297bc009dac70097",
+                "sha256:f5b03dea0416ee7f9ec5c6be7b9dc02ffd3a187eaac159f291fd548160ca6d68",
+                "sha256:f6a2196df79b2aeccefe48fc81b11ad10d99ca274181dbd277793caa1b802890",
+                "sha256:f703a48096176403f86753d0e60da190d9663501c1d491de65607ba51fb4dda2",
+                "sha256:f9c80a48731f267dd9843d2c7149102066c3baf1ef0ac31bfc09d01060774dfe",
+                "sha256:fbfaccbaf223e52f05cb07b56d5ab1ce315a21b796f2531924bdd9aae01b1604",
+                "sha256:ff454ce3765a756392348da7887dffb3972b197e34feddc2b37a0c913cd0a8af"
+            ],
+            "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))",
+            "version": "==1.5.2"
         },
         "rdflib": {
             "hashes": [
@@ -1277,7 +1277,7 @@
                 "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
                 "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
         "sqlalchemy": {
@@ -1882,7 +1882,7 @@
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
                 "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.9.0.post0"
         },
         "requests": {
@@ -1906,7 +1906,7 @@
                 "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
                 "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
         "testcontainers-core": {
diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py
index 37885f81dc11d07aecb3c9dddf2d650f58023182..d8aa0a2cedb375658698f41bd05c244ff605245b 100644
--- a/dbrepo-search-service/app.py
+++ b/dbrepo-search-service/app.py
@@ -183,7 +183,7 @@ template = {
     "info": {
         "title": "Database Repository Search Service API",
         "description": "Service that searches the search database",
-        "version": "1.9.1",
+        "version": "1.9.2",
         "contact": {
             "name": "Prof. Andreas Rauber",
             "email": "andreas.rauber@tuwien.ac.at"
diff --git a/dbrepo-search-service/lib/dbrepo-1.9.1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.9.1.tar.gz
deleted file mode 100644
index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.9.1.tar.gz and /dev/null differ
diff --git a/dbrepo-auth-service/init/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.9.2-py3-none-any.whl
similarity index 92%
rename from dbrepo-auth-service/init/lib/dbrepo-1.9.1-py3-none-any.whl
rename to dbrepo-search-service/lib/dbrepo-1.9.2-py3-none-any.whl
index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644
Binary files a/dbrepo-auth-service/init/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-search-service/lib/dbrepo-1.9.2-py3-none-any.whl differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.9.2.tar.gz b/dbrepo-search-service/lib/dbrepo-1.9.2.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed
Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.9.2.tar.gz differ
diff --git a/dbrepo-ui/composables/grant-service.ts b/dbrepo-ui/composables/grant-service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9b259963c1389afc242bc0c96e754da6ae1f263b
--- /dev/null
+++ b/dbrepo-ui/composables/grant-service.ts
@@ -0,0 +1,21 @@
+import {axiosErrorToApiError} from '@/utils'
+
+export const useGrantService = (): any => {
+  async function findOne(databaseId: string, userId: string): Promise<DatabaseGrantsDto> {
+    const axios = useAxiosInstance()
+    console.debug('find grant of database with id', databaseId)
+    return new Promise<DatabaseGrantsDto>((resolve, reject) => {
+      axios.get<DatabaseGrantsDto>(`/api/database/${databaseId}/grant/${userId}`)
+        .then((response) => {
+          console.info('Found grant of database with id', databaseId)
+          resolve(response.data)
+        })
+        .catch((error) => {
+          console.error('Failed to find grant', error)
+          reject(axiosErrorToApiError(error))
+        })
+    })
+  }
+
+  return {findOne}
+}
diff --git a/dbrepo-ui/dto/index.ts b/dbrepo-ui/dto/index.ts
index e05e0fc4d48e3b224131dec7d12bf25023c3faf0..4ab739009b8efd53d451760173944e37a6266524 100644
--- a/dbrepo-ui/dto/index.ts
+++ b/dbrepo-ui/dto/index.ts
@@ -227,6 +227,11 @@ interface IdentifierFunderSaveDto {
   award_title: string;
 }
 
+interface DatabaseGrantsDto {
+  grants: string[];
+  type: string | null;
+}
+
 interface IdentifierDto {
   id: string;
   database_id: string;
diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json
index d3918cab602c062a1c902d6afc29a17b0103b8a7..9c5bf688978d7526686a5d12b4c94d0f1ad88451 100644
--- a/dbrepo-ui/locales/en-US.json
+++ b/dbrepo-ui/locales/en-US.json
@@ -661,13 +661,14 @@
       },
       "subpages": {
         "access": {
-          "title": "Access to database",
+          "title": "Database Access",
           "subtitle": "Overview on users with their access to the database",
           "read": "Read all contents",
           "write-own": "Read all contents & write own tables",
           "write-all": "Read all contents & write all tables",
           "revoke": "No access",
           "action": "Action",
+          "grants": "Grants",
           "username": {
             "label": "Username",
             "hint": "Required"
diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue
index 3b8c104d142a47fd7c121f06d7be1878c82ce301..4168c58649a23765c4f371f3c322cc9b589a2ec8 100644
--- a/dbrepo-ui/pages/database/[database_id]/settings.vue
+++ b/dbrepo-ui/pages/database/[database_id]/settings.vue
@@ -97,14 +97,28 @@
           :subtitle="$t('pages.database.subpages.access.subtitle')" >
           <v-data-table
             :headers="headers"
-            :items="database.accesses"
+            :items="accesses"
             :items-per-page="10">
+            <template v-slot:item.type="{ item }">
+              <v-chip
+                size="small"
+                :append-icon="`mdi-${item.type.startsWith(item.grants?.type) ? 'checkbox-marked-circle' : 'close-circle'}`">
+                {{ item.type }}
+              </v-chip>
+            </template>
             <template v-slot:item.qualified_name="{ item }">
               <span
                 v-if="item && item.user">
                 {{ item.user.qualified_name }}
               </span>
             </template>
+            <template v-slot:item.grants="{ item }">
+              <v-skeleton-loader
+                v-if="item.loading"
+                type="text" />
+              <span
+                v-else>{{ item.grants.grants.join(', ') }}</span>
+            </template>
             <template v-slot:item.action="{ item }">
               <v-btn
                 v-if="item && item.user && item.user.username !== cacheUser.username"
@@ -331,10 +345,15 @@ export default {
           sortable: false
         },
         {
-          title: this.$t('pages.database.subpages.access.title'),
+          title: this.$t('pages.database.subpages.access.type.label'),
           value: 'type',
           sortable: false
         },
+        {
+          title: this.$t('pages.database.subpages.access.grants'),
+          value: 'grants',
+          sortable: false
+        },
         {
           title: this.$t('pages.database.subpages.access.action'),
           value: 'action',
@@ -489,6 +508,8 @@ export default {
     this.modifyVisibility.is_schema_public = this.database.is_schema_public
     this.modifyVisibility.is_dashboard_enabled = this.database.is_dashboard_enabled
     this.modifyOwner.id = this.database.owner.id
+    this.accesses = this.database.accesses
+    this.accesses.forEach(a => this.findGrant(a.user.id))
   },
   methods: {
     submit () {
@@ -514,6 +535,26 @@ export default {
           this.loading = false
         })
     },
+    findGrant (userId) {
+      if (!this.database) {
+        return false
+      }
+      const access = this.accesses.filter(a => a.user.id === userId)[0]
+      console.debug('===>', access)
+      access['loading'] = true
+      const grantService = useGrantService()
+      grantService.findOne(this.database.id, userId)
+        .then((grant) => {
+          access['grants'] = grant
+          access['loading'] = false
+        })
+        .catch(() => {
+          access['loading'] = false
+        })
+        .finally(() => {
+          access['loading'] = false
+        })
+    },
     uploadFile () {
       console.debug('upload file', this.file)
       if (this.file.size > 1_000_000) {
diff --git a/docker-compose.yml b/docker-compose.yml
index 564b666b35fe53a860729cc3db939b718ebe7b2e..aec93aa4fd17a91845b6ca0be5138ff2a090559b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -326,14 +326,6 @@ services:
       - search-db-data:/bitnami/opensearch/data
     ports:
       - "9200:9200"
-    deploy:
-      resources:
-        reservations:
-          cpus: '0.25'
-          memory: 512M
-        limits:
-          cpus: '0.50'
-          memory: 2048M
     healthcheck:
       test: curl -sSL 127.0.0.1:9200
       <<: *healthcheck-params
@@ -373,7 +365,7 @@ services:
     build:
       context: ./dbrepo-ui
       args:
-        APP_VERSION: ${CI_COMMIT_TAG:-latest}
+        APP_VERSION: ${APP_VERSION:-latest}
         COMMIT: ${CI_COMMIT_SHORT_SHA:-}
       network: host
     environment:
@@ -576,8 +568,8 @@ services:
       COMPUTE_SERVICE_ENDPOINT: "${COMPUTE_SERVICE_ENDPOINT:-local[2]}"
       EXCHANGE_NAME: "${EXCHANGE_NAME:-dbrepo}"
       METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}"
-      GRANT_DEFAULT_READ: "${GRANT_DEFAULT_READ:-SELECT}"
-      GRANT_DEFAULT_WRITE: "${GRANT_DEFAULT_WRITE:-SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}"
+      GRANT_DEFAULT_READ: "${GRANT_DEFAULT_READ:-SELECT, EXECUTE}"
+      GRANT_DEFAULT_WRITE: "${GRANT_DEFAULT_WRITE:-SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}"
       JWT_PUBKEY: "${JWT_PUBKEY:-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}"
       LOG_LEVEL: ${LOG_LEVEL:-info}
       QUEUE_NAME: ${QUEUE_NAME:-dbrepo}
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
index 8df9e19da6675b86f1b5755a9cec8c8e1044b11f..fb1458371a5ce51be8ca63a9421a621e0ef09ce3 100644
Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ
diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml
index b15f67ee63dbeba62fbdd0024775ea57f1de8985..4f0bf2968551411f2787a680b89f346011de41c8 100644
--- a/helm/dbrepo/values.yaml
+++ b/helm/dbrepo/values.yaml
@@ -141,7 +141,7 @@ authservice:
   setupJob:
     image:
       ## @skip authservice.setupJob.image.name
-      name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.9.1
+      name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.9.2
     ## @param authservice.setupJob.resourcesPreset The container resource preset
     resourcesPreset: "nano"
     ## @param authservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
@@ -419,7 +419,7 @@ analyseservice:
   enabled: true
   image:
     ## @skip analyseservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.1
+    name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.2
   ## @param analyseservice.podAnnotations the pod annotations. Evaluated as a template
   ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
   podAnnotations: { }
@@ -483,7 +483,7 @@ metadataservice:
   enabled: true
   image:
     ## @skip metadataservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.1
+    name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.2
   ## @param metadataservice.podAnnotations the pod annotations. Evaluated as a template
   ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
   podAnnotations: { }
@@ -583,7 +583,7 @@ dataservice:
   endpoint: http://data-service
   image:
     ## @skip dataservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.1
+    name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.2
   ## @param dataservice.podAnnotations the pod annotations. Evaluated as a template
   ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
   podAnnotations: { }
@@ -672,7 +672,7 @@ searchservice:
   endpoint: http://search-service
   image:
     ## @skip searchservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.1
+    name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.2
   ## @param searchservice.podAnnotations the pod annotations. Evaluated as a template
   ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
   podAnnotations: { }
@@ -724,7 +724,7 @@ searchservice:
     enabled: true
     image:
       ## @skip searchservice.setupJob.image.name
-      name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.9.1
+      name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.9.2
     ## @param searchservice.setupJob.resourcesPreset The container resource preset
     resourcesPreset: "nano"
     ## @param searchservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
@@ -787,7 +787,7 @@ storageservice:
     enabled: true
     image:
       ## @skip storageservice.setupJob.image.name
-      name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.9.1
+      name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.9.2
     s3:
       ## @param storageservice.setupJob.s3.endpoint The S3-capable endpoint the microservice connects to.
       endpoint: http://storage-service-s3:8333
@@ -922,7 +922,7 @@ ui:
   enabled: true
   image:
     ## @skip ui.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.1
+    name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.2
   ## https://stackblitz.com/edit/nuxt-oidc-auth-keygen?file=index.js
   oidc:
     ## @param ui.oidc.authSessionSecret This should be a at least 48 characters random string. It is used to encrypt the user session.
@@ -1043,7 +1043,7 @@ dashboardservice:
   enabled: true
   image:
     ## @skip dashboardservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.9.1
+    name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.9.2
   ## @param dashboardservice.endpoint The endpoint for the microservices.
   endpoint: http://dashboard-service
   ## @param dashboardservice.podAnnotations the pod annotations. Evaluated as a template
@@ -1098,7 +1098,7 @@ dashboardservice:
     enabled: true
     image:
       ## @skip dashboardservice.setupJob.image.name
-      name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.9.1
+      name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.9.2
     ## @param dashboardservice.setupJob.resourcesPreset The container resource preset
     resourcesPreset: "nano"
     ## @param dashboardservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
diff --git a/install.sh b/install.sh
index 6110ab5276d1efa5ff29eb7cc09abd39d63ec9a9..8550259eb7547ebaf562a844548fb53207fc0713 100644
--- a/install.sh
+++ b/install.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # preset
-APP_VERSION="1.9.1"
+APP_VERSION="1.9.2"
 MIN_CPU=8
 MIN_RAM=10
 SKIP_CHECKS=${SKIP_CHECKS:-0}
diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/DatabaseGrantsDto.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/DatabaseGrantsDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..b88680f5d589c245925d87c2ddacd36e73dd572d
--- /dev/null
+++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/DatabaseGrantsDto.java
@@ -0,0 +1,28 @@
+
+package at.ac.tuwien.ifs.dbrepo.core.api.database;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import lombok.extern.jackson.Jacksonized;
+
+import java.util.Set;
+
+@Getter
+@Setter
+@Builder
+@EqualsAndHashCode
+@NoArgsConstructor
+@AllArgsConstructor
+@Jacksonized
+@ToString
+public class DatabaseGrantsDto {
+
+    @NotNull
+    @Schema(example = "[\"SELECT\"]")
+    private Set<String> grants;
+
+    @Schema(example = "read")
+    private GrantTypeDto type;
+
+}
diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/GrantTypeDto.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/GrantTypeDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..b693570c719f760c3d64cf802b212ea03f0f7a0b
--- /dev/null
+++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/GrantTypeDto.java
@@ -0,0 +1,27 @@
+package at.ac.tuwien.ifs.dbrepo.core.api.database;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+
+@Getter
+@Schema
+public enum GrantTypeDto {
+
+    @JsonProperty("read")
+    READ("read"),
+
+    @JsonProperty("write")
+    WRITE("write");
+
+    private final String name;
+
+    GrantTypeDto(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}
diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java
index 0ed6e783c033c7f85e9f3278552374de8ab6f50e..c872e26b5d48fb8b966dd092d621b5127af0a6a3 100644
--- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java
+++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java
@@ -104,6 +104,37 @@ public interface MetadataMapper {
     })
     DataTypeDto dataTypeToDataTypeDto(DataType data);
 
+    default DatabaseGrantsDto grantsToDatabaseGrantDto(Set<String> grants, String grantDefaultRead,
+                                                       String grantDefaultWrite) {
+        final Set<String> read = Arrays.asList(grantDefaultRead.split(","))
+                .stream()
+                .map(String::trim)
+                .map(String::toUpperCase)
+                .collect(Collectors.toSet());
+        final Set<String> write = Arrays.asList(grantDefaultWrite.split(","))
+                .stream()
+                .map(String::trim)
+                .map(String::toUpperCase)
+                .collect(Collectors.toSet());
+        grants = grants.stream()
+                .map(String::trim)
+                .map(String::toUpperCase)
+                .filter(g -> !g.equals("USAGE"))
+                .collect(Collectors.toSet());
+        final GrantTypeDto type;
+        if (write.containsAll(grants) && grants.containsAll(write)) {
+            type = GrantTypeDto.WRITE;
+        } else if (read.containsAll(grants) && grants.containsAll(read)) {
+            type = GrantTypeDto.READ;
+        } else {
+            type = null;
+        }
+        return DatabaseGrantsDto.builder()
+                .grants(grants)
+                .type(type)
+                .build();
+    }
+
     @Mappings({
             @Mapping(target = "databaseName", source = "internalName"),
             @Mapping(target = "ownerUsername", source = "owner.username")
diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java
index e5437b5cd9af0f025b3d8e192160f567cf78f633..9fe2e55ceb012a55ff2742e5616fd287c084175d 100644
--- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java
+++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java
@@ -7339,6 +7339,20 @@ public class BaseTest {
             .user(USER_1_BRIEF_DTO)
             .build();
 
+    public final DatabaseGrantsDto READ_GRANT_DTO = DatabaseGrantsDto.builder()
+            .type(GrantTypeDto.READ)
+            .grants(Set.of("SELECT", "EXECUTE"))
+            .build();
+
+    public final DatabaseGrantsDto WRITE_GRANT_DTO = DatabaseGrantsDto.builder()
+            .type(GrantTypeDto.WRITE)
+            .grants(Set.of("SELECT", "CREATE", "CREATE VIEW", "CREATE ROUTINE", "CREATE TEMPORARY TABLES", "EXECUTE", "LOCK TABLES", "INDEX", "TRIGGER", "INSERT", "UPDATE", "DELETE"))
+            .build();
+
+    public final DatabaseGrantsDto UNKNOWN_GRANT_DTO = DatabaseGrantsDto.builder()
+            .grants(Set.of("MONITOR"))
+            .build();
+
     public final DatabaseAccess DATABASE_1_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder()
             .type(AccessType.WRITE_OWN)
             .hdbid(DATABASE_1_ID)
diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml
index 5e12c02fbe220ad77772d66d14f75cdb978844e7..9ab7afffb88996efaa6cbc0cbe2d0d0db1bdf18a 100644
--- a/lib/python/pyproject.toml
+++ b/lib/python/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "dbrepo"
-version = "1.9.1"
+version = "1.9.2"
 description = "DBRepo Python Library"
 keywords = [
     "DBRepo",
diff --git a/lib/python/setup.py b/lib/python/setup.py
index 0c57a4c3249be99c3edb0d304316cc6334d2bb78..a8beb0574cedadb98db62f110259ed09e38391ab 100644
--- a/lib/python/setup.py
+++ b/lib/python/setup.py
@@ -2,7 +2,7 @@
 from distutils.core import setup
 
 setup(name="dbrepo",
-      version="1.9.1",
+      version="1.9.2",
       description="A library for communicating with DBRepo",
       url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/",
       author="Martin Weise",
diff --git a/make/build.mk b/make/build.mk
index 2c1efca8568a59963ae2d5e0d3b44e6b33462260..152cecf0e0136015e9a75bfb60a61002bdbdcddb 100644
--- a/make/build.mk
+++ b/make/build.mk
@@ -22,7 +22,7 @@ build-ui: ## Build the UI.
 
 .PHONY: build-python-lib
 build-python-lib: ## Build the Python Library.
-	rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-search-service/lib/* ./dbrepo-dashboard-service/lib/* ./dbrepo-auth-service/init/lib/*
+	rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-analyse-service/Pipfile.lock ./dbrepo-search-service/lib/* ./dbrepo-search-service/Pipfile.lock ./dbrepo-dashboard-service/lib/* ./dbrepo-dashboard-service/Pipfile.lock ./dbrepo-auth-service/init/lib/* ./dbrepo-auth-service/init/Pipfile.lock
 	python3 -m build --sdist ./lib/python
 	python3 -m build --wheel ./lib/python
 	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-analyse-service/lib