From 346bf78e5726761387dcf2f2a04dff882b51c166 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Thu, 13 Jun 2024 09:11:15 +0000
Subject: [PATCH] Master

---
 .docs/.swagger/api.base.yaml                  |    7 +-
 .docs/.swagger/api.yaml                       |  979 +++++++++-----
 .docs/.swagger/swagger-site.sh                |   21 -
 .docs/api/data-db.md                          |    5 +-
 .docs/api/index.md                            |   66 +-
 .docs/api/metadata-db.md                      |   30 +-
 .docs/api/open-api.md                         |    2 +-
 .docs/api/python.md                           |    2 +-
 .docs/api/ui.md                               |    2 +-
 .docs/concepts/authentication.md              |   26 +-
 .docs/concepts/databases.md                   |   13 +-
 .docs/concepts/messaging.md                   |   21 +-
 .docs/index.md                                |    2 +-
 .docs/publications.md                         |    4 +-
 .gitlab-ci.yml                                |    8 +-
 dbrepo-analyse-service/Pipfile.lock           |   68 +-
 dbrepo-analyse-service/app.py                 |   22 +-
 .../as-yml/analyse_datatypes.yml              |    2 +-
 .../as-yml/analyse_keys.yml                   |    4 +-
 .../as-yml/analyse_table_stat.yml             |   41 -
 .../lib/dbrepo-1.4.4-py3-none-any.whl         |  Bin 27881 -> 27872 bytes
 .../lib/dbrepo-1.4.4.tar.gz                   |  Bin 38911 -> 38112 bytes
 .../at/tuwien/endpoints/AccessEndpoint.java   |   45 +-
 .../at/tuwien/endpoints/DatabaseEndpoint.java |    6 +-
 .../at/tuwien/endpoints/SubsetEndpoint.java   |   54 +-
 .../at/tuwien/endpoints/TableEndpoint.java    |   94 +-
 .../at/tuwien/endpoints/ViewEndpoint.java     |   22 +-
 .../endpoint/AccessEndpointUnitTest.java      |   23 +-
 .../endpoint/DatabaseEndpointUnitTest.java    |    4 -
 .../endpoint/TableEndpointUnitTest.java       |    7 +-
 .../tuwien/endpoint/ViewEndpointUnitTest.java |    1 -
 .../tuwien/mvc/PrometheusEndpointMvcTest.java |    2 +-
 .../service/SchemaServiceIntegrationTest.java |   46 +-
 .../src/test/resources/init/zoo.sql           |    9 +
 .../java/at/tuwien/mapper/MariaDbMapper.java  |   18 +-
 dbrepo-metadata-db/setup-schema.sql           |    1 +
 .../foreignKey/ForeignKeyReference.java       |   10 +-
 .../java/at/tuwien/mapper/DatabaseMapper.java |    0
 .../java/at/tuwien/mapper/MetadataMapper.java |   36 +-
 .../at/tuwien/endpoints/AccessEndpoint.java   |   37 +-
 .../at/tuwien/endpoints/ConceptEndpoint.java  |    5 +-
 .../tuwien/endpoints/ContainerEndpoint.java   |   41 +-
 .../at/tuwien/endpoints/DatabaseEndpoint.java |   46 +-
 .../tuwien/endpoints/IdentifierEndpoint.java  |   61 +-
 .../at/tuwien/endpoints/ImageEndpoint.java    |   24 +-
 .../at/tuwien/endpoints/LicenseEndpoint.java  |    8 +-
 .../at/tuwien/endpoints/MessageEndpoint.java  |   32 +-
 .../at/tuwien/endpoints/MetadataEndpoint.java |   10 +-
 .../at/tuwien/endpoints/OntologyEndpoint.java |   34 +-
 .../at/tuwien/endpoints/TableEndpoint.java    |   54 +-
 .../at/tuwien/endpoints/UnitEndpoint.java     |    4 +-
 .../at/tuwien/endpoints/UserEndpoint.java     |   58 +-
 .../at/tuwien/endpoints/ViewEndpoint.java     |   36 +-
 .../src/main/resources/application-local.yml  |    2 +
 .../endpoints/AccessEndpointUnitTest.java     |    5 +-
 .../endpoints/ContainerEndpointUnitTest.java  |    2 +-
 ...Test.java => MessageEndpointUnitTest.java} |   14 +-
 .../endpoints/UserEndpointUnitTest.java       |    4 +-
 .../tuwien/mapper/MetadataMapperUnitTest.java |   20 +-
 .../tuwien/mvc/PrometheusEndpointMvcTest.java |    2 +-
 .../tuwien/service/TableServiceUnitTest.java  |    2 +-
 .../java/at/tuwien/service/AccessService.java |    5 +-
 .../service/impl/AccessServiceImpl.java       |   18 +-
 .../service/impl/DatabaseServiceImpl.java     |   53 +-
 .../tuwien/service/impl/TableServiceImpl.java |    1 -
 .../java/at/tuwien/test/AbstractUnitTest.java |    4 +
 .../main/java/at/tuwien/test/BaseTest.java    |   51 +-
 dbrepo-search-service/Pipfile.lock            |   39 +-
 dbrepo-search-service/app.py                  |    5 +-
 .../lib/dbrepo-1.4.4-py3-none-any.whl         |  Bin 27881 -> 27872 bytes
 dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz |  Bin 38911 -> 38112 bytes
 .../database/[database_id]/table/import.vue   |    9 +-
 docker-compose.yml                            |    1 +
 helm/dbrepo/values.yaml                       |    8 +
 lib/python/dbrepo/RestClient.py               | 1124 ++++++++++++-----
 lib/python/dbrepo/api/dto.py                  |   13 +
 lib/python/dbrepo/api/exceptions.py           |   28 +
 lib/python/tests/test_unit_identifier.py      |   67 +-
 lib/python/tests/test_unit_query.py           |  160 +--
 lib/python/tests/test_unit_table.py           |   62 +-
 lib/python/tests/test_unit_user.py            |   41 +-
 lib/python/tests/test_unit_view.py            |   10 -
 make/gen.mk                                   |    7 +-
 mkdocs.yml                                    |    2 +-
 84 files changed, 2375 insertions(+), 1537 deletions(-)
 delete mode 100644 .docs/.swagger/swagger-site.sh
 delete mode 100644 dbrepo-analyse-service/as-yml/analyse_table_stat.yml
 delete mode 100644 dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java
 rename dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/{MaintenanceEndpointUnitTest.java => MessageEndpointUnitTest.java} (91%)

diff --git a/.docs/.swagger/api.base.yaml b/.docs/.swagger/api.base.yaml
index aa83c853ce..c7b01fab0e 100644
--- a/.docs/.swagger/api.base.yaml
+++ b/.docs/.swagger/api.base.yaml
@@ -10,13 +10,16 @@ components:
       scheme: bearer
       type: http
 externalDocs:
-  description: Sourcecode Documentation
+  description: Project Website
   url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/
 info:
   contact:
     email: andreas.rauber@tuwien.ac.at
     name: Prof. Andreas Rauber
-  description: The REST API
+  description: |
+    The merged REST API of DBRepo for users, developers and data stewards to be accessed publicly. Have a look at
+    the [source code](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services) for non-public endpoints
+    that are used between the services themselves.
   license:
     name: Apache 2.0
     url: https://www.apache.org/licenses/LICENSE-2.0
diff --git a/.docs/.swagger/api.yaml b/.docs/.swagger/api.yaml
index 7ba582ed3f..c2b5b17fd4 100644
--- a/.docs/.swagger/api.yaml
+++ b/.docs/.swagger/api.yaml
@@ -3,7 +3,15 @@ info:
   contact:
     email: andreas.rauber@tuwien.ac.at
     name: Prof. Andreas Rauber
-  description: The REST API
+  description: >
+    The merged REST API of DBRepo for users, developers and data stewards to be
+    accessed publicly. Have a look at
+
+    the [source
+    code](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services)
+    for non-public endpoints
+
+    that are used between the services themselves.
   license:
     name: Apache 2.0
     url: 'https://www.apache.org/licenses/LICENSE-2.0'
@@ -15,14 +23,16 @@ servers:
   - description: Local Instance
     url: 'http://localhost'
 externalDocs:
-  description: Sourcecode Documentation
+  description: Project Website
   url: 'https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/'
 paths:
   /api/analyse/datatypes:
     get:
       consumes:
         - application/json
-      description: This is a simple API which returns the datatypes of a (path) csv file
+      description: >-
+        Determines MySQL 8 datatypes of a given dataset. Requires role
+        `table-semantic-analyse`.
       operationId: analyse_datatypes
       parameters:
         - example: filename_s3_key
@@ -87,8 +97,8 @@ paths:
       consumes:
         - application/json
       description: >-
-        This is a simple API which returns the primary keys + ranking of a
-        (path) csv file
+        Determines primary keys of a given dataset. Requires role
+        `table-semantic-analyse`.
       operationId: analyse_keys
       parameters:
         - example: filename_s3_key
@@ -133,14 +143,18 @@ paths:
       security:
         - bearerAuth: []
         - basicAuth: []
-      summary: Determine primary keys
+      summary: Determine keys
       tags:
         - analyse-endpoint
   '/api/database/{databaseId}/view/{viewId}/data':
     get:
       tags:
         - view-endpoint
-      summary: Retrieve view data
+      summary: Get view data
+      description: >-
+        Gets data from a view of a database. For private databases, the user
+        needs at least *READ* access to the associated database. Requires role
+        `view-database-view-data`.
       operationId: getData
       parameters:
         - name: databaseId
@@ -176,6 +190,15 @@ paths:
       responses:
         '200':
           description: Retrieved view data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
           content:
             application/json:
               schema:
@@ -216,7 +239,11 @@ paths:
     head:
       tags:
         - view-endpoint
-      summary: Retrieve view data
+      summary: Get view data
+      description: >-
+        Gets data from a view of a database. For private databases, the user
+        needs at least *READ* access to the associated database. Requires role
+        `view-database-view-data`.
       operationId: getData_1
       parameters:
         - name: databaseId
@@ -252,6 +279,15 @@ paths:
       responses:
         '200':
           description: Retrieved view data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
           content:
             application/json:
               schema:
@@ -293,7 +329,13 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Retrieve table data
+      summary: Get table data
+      description: >-
+        Gets data from a table with id. For a table in a private database, the
+        user needs to have at least *READ* access to the associated database.
+        Requests with HTTP method **GET** return the full dataset, requests with
+        HTTP method **HEAD** only the number of tuples in the `X-Count` header.
+        Requires role `view-table-data`.
       operationId: getData_2
       parameters:
         - name: databaseId
@@ -328,7 +370,16 @@ paths:
             format: int64
       responses:
         '200':
-          description: Retrieved table data
+          description: Get table data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
           content:
             application/json:
               schema:
@@ -339,6 +390,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not allowed to get table data
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: Failed to find table in metadata database
           content:
@@ -357,10 +414,11 @@ paths:
     put:
       tags:
         - table-endpoint
-      summary: Update a raw data tuple
+      summary: Update tuple
       description: >-
-        Updates a raw data tuple in a table with at least WRITE_OWN access. Then
-        update the table statistics.
+        Updates a data tuple into a table, then the table statistics are
+        updated. The user needs to have at least *WRITE_OWN* access to the
+        associated database. Requires role `insert-table-data`.
       operationId: updateRawTuple
       parameters:
         - name: databaseId
@@ -414,10 +472,11 @@ paths:
     post:
       tags:
         - table-endpoint
-      summary: Insert a raw data tuple
+      summary: Insert tuple
       description: >-
-        Inserts a raw data tuple into a table with at least WRITE_OWN access.
-        Then update the table statistics.
+        Inserts a data tuple into a table, then the table statistics are
+        updated. The user needs to have at least *WRITE_OWN* access to the
+        associated database. Requires role `insert-table-data`.
       operationId: insertRawTuple
       parameters:
         - name: databaseId
@@ -473,10 +532,11 @@ paths:
     delete:
       tags:
         - table-endpoint
-      summary: Delete table data
+      summary: Delete tuple
       description: >-
-        Deletes a raw data tuple in a table with at least WRITE_OWN access. Then
-        update the table statistics.
+        Deletes a data tuple into a table, then the table statistics are
+        updated. The user needs to have at least *WRITE_OWN* access to the
+        associated database. Requires role `delete-table-data`.
       operationId: deleteRawTuple
       parameters:
         - name: databaseId
@@ -530,7 +590,13 @@ paths:
     head:
       tags:
         - table-endpoint
-      summary: Retrieve table data
+      summary: Get table data
+      description: >-
+        Gets data from a table with id. For a table in a private database, the
+        user needs to have at least *READ* access to the associated database.
+        Requests with HTTP method **GET** return the full dataset, requests with
+        HTTP method **HEAD** only the number of tuples in the `X-Count` header.
+        Requires role `view-table-data`.
       operationId: getData_3
       parameters:
         - name: databaseId
@@ -565,7 +631,16 @@ paths:
             format: int64
       responses:
         '200':
-          description: Retrieved table data
+          description: Get table data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
           content:
             application/json:
               schema:
@@ -576,6 +651,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not allowed to get table data
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: Failed to find table in metadata database
           content:
@@ -595,7 +676,13 @@ paths:
     get:
       tags:
         - subset-endpoint
-      summary: Retrieved subset data
+      summary: Get subset data
+      description: >-
+        Gets data of subset with id. For private databases, the user needs at
+        least *READ* access to the associated database. Requests with HTTP
+        method **GET** return the subset dataset, requests with HTTP method
+        **HEAD** only the number of rows in the subset dataset in the `X-Count`
+        header
       operationId: getData_4
       parameters:
         - name: databaseId
@@ -625,12 +712,21 @@ paths:
       responses:
         '200':
           description: Retrieved subset data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/QueryResultDto'
         '400':
-          description: Malformed select query
+          description: Invalid pagination
           content:
             application/json:
               schema:
@@ -661,7 +757,13 @@ paths:
     head:
       tags:
         - subset-endpoint
-      summary: Retrieved subset data
+      summary: Get subset data
+      description: >-
+        Gets data of subset with id. For private databases, the user needs at
+        least *READ* access to the associated database. Requests with HTTP
+        method **GET** return the subset dataset, requests with HTTP method
+        **HEAD** only the number of rows in the subset dataset in the `X-Count`
+        header
       operationId: getData_5
       parameters:
         - name: databaseId
@@ -691,12 +793,21 @@ paths:
       responses:
         '200':
           description: Retrieved subset data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/QueryResultDto'
         '400':
-          description: Malformed select query
+          description: Invalid pagination
           content:
             application/json:
               schema:
@@ -729,6 +840,7 @@ paths:
       tags:
         - subset-endpoint
       summary: Persist subset
+      description: Persists a subset with id. Requires role `persist-query`.
       operationId: persist
       parameters:
         - name: databaseId
@@ -795,10 +907,12 @@ paths:
     post:
       tags:
         - table-endpoint
-      summary: Import data from a dataset
+      summary: Import dataset
       description: >-
-        Deletes a raw data tuple in a table with at least WRITE_OWN access. Then
-        update the table statistics.
+        Imports a dataset in a table. Then update the table statistics. The user
+        needs to have at least *WRITE_OWN* access to the associated database
+        when importing into a owned table. Otherwise *WRITE_ALL* access in
+        needed. Requires role `insert-table-data`.
       operationId: importDataset
       parameters:
         - name: databaseId
@@ -854,6 +968,10 @@ paths:
       tags:
         - subset-endpoint
       summary: Find subsets
+      description: >-
+        Finds subsets in the query store. The result can be optionally filtered
+        by setting `persisted`. When set to *true*, only persisted queries are
+        returned, otherwise only non-persisted queries are returned.
       operationId: list
       parameters:
         - name: databaseId
@@ -873,7 +991,9 @@ paths:
           content:
             application/json:
               schema:
-                type: string
+                type: array
+                items:
+                  $ref: '#/components/schemas/QueryDto'
         '403':
           description: Not allowed to find subsets
           content:
@@ -901,6 +1021,9 @@ paths:
       tags:
         - subset-endpoint
       summary: Create subset
+      description: >-
+        Creates a subset in the query store of the data database. Requires role
+        `execute-query`
       operationId: create
       parameters:
         - name: databaseId
@@ -985,7 +1108,10 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Generate table statistic
+      summary: Get table statistic
+      description: >-
+        Gets basic statistical properties (min, max, mean, median, std.dev) of
+        numerical columns of a table with id.
       operationId: statistic
       parameters:
         - name: databaseId
@@ -1029,10 +1155,11 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Find table history
+      summary: Get history
       description: >-
-        Lists the insert/delete operations performed. Authentication is only
-        required for tables in private databases
+        Gets the insert/delete operations history performed. For tables in
+        private databases, the user needs to have at least *READ* access to the
+        associated database.
       operationId: getHistory
       parameters:
         - name: databaseId
@@ -1059,9 +1186,11 @@ paths:
           content:
             application/json:
               schema:
-                type: string
+                type: array
+                items:
+                  $ref: '#/components/schemas/TableHistoryDto'
         '400':
-          description: Invalid pagination request
+          description: 'Invalid pagination size request, must be > 0'
           content:
             application/json:
               schema:
@@ -1091,7 +1220,11 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Export table data
+      summary: Get table data
+      description: >-
+        Gets data from table with id as downloadable file. For tables in private
+        databases, the user needs to have at least *READ* access to the
+        associated database.
       operationId: exportData
       parameters:
         - name: databaseId
@@ -1152,6 +1285,10 @@ paths:
       tags:
         - subset-endpoint
       summary: Find subset
+      description: >-
+        Finds a subset in the data database. Requests with HTTP header
+        `Accept=application/json` return the metadata, requests with HTTP header
+        `Accept=text/csv` return the data as downloadable file.
       operationId: findById
       parameters:
         - name: databaseId
@@ -1220,6 +1357,10 @@ paths:
       tags:
         - database-endpoint
       summary: List databases
+      description: >-
+        Lists all databases in the metadata database. Requests with HTTP method
+        **GET** return the list of databases, requests with HTTP method **HEAD**
+        only the number in the `X-Count` header.
       operationId: list1
       parameters:
         - name: internal_name
@@ -1230,6 +1371,15 @@ paths:
       responses:
         '200':
           description: List of databases
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of databases
+              required: true
+              style: simple
           content:
             application/json:
               schema:
@@ -1240,6 +1390,9 @@ paths:
       tags:
         - database-endpoint
       summary: Create database
+      description: >-
+        Creates a database in the container with id. Requires roles
+        `create-database`.
       operationId: create_5
       requestBody:
         content:
@@ -1299,6 +1452,10 @@ paths:
       tags:
         - database-endpoint
       summary: List databases
+      description: >-
+        Lists all databases in the metadata database. Requests with HTTP method
+        **GET** return the list of databases, requests with HTTP method **HEAD**
+        only the number in the `X-Count` header.
       operationId: list_1
       parameters:
         - name: internal_name
@@ -1309,6 +1466,15 @@ paths:
       responses:
         '200':
           description: List of databases
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of databases
+              required: true
+              style: simple
           content:
             application/json:
               schema:
@@ -1319,7 +1485,13 @@ paths:
     get:
       tags:
         - access-endpoint
-      summary: Check access to some database
+      summary: Find/Check access
+      description: >-
+        Finds or checks access of a user with given id to a database with given
+        id. Requests with HTTP method **GET** return the access object, requests
+        with HTTP method **HEAD** only the status. When the user has at least
+        *READ* access, the status 200 is returned, 403 otherwise. Requires role
+        `check-database-access` or `admin`.
       operationId: find
       parameters:
         - name: databaseId
@@ -1359,7 +1531,10 @@ paths:
     put:
       tags:
         - access-endpoint
-      summary: Modify access to some database
+      summary: Modify access
+      description: >-
+        Modifies access of a user with given id to database with given id.
+        Requires role `update-database-access`.
       operationId: update_4
       parameters:
         - name: databaseId
@@ -1382,7 +1557,7 @@ paths:
         required: true
       responses:
         '202':
-          description: Modify access succeeded
+          description: Modified access
         '400':
           description: Modify access query or database connection is malformed
           content:
@@ -1423,7 +1598,10 @@ paths:
     post:
       tags:
         - access-endpoint
-      summary: Give access to some database
+      summary: Give access
+      description: >-
+        Give a user with given id access to some database with given id.
+        Requires role `create-database-access`.
       operationId: create_8
       parameters:
         - name: databaseId
@@ -1447,6 +1625,10 @@ paths:
       responses:
         '202':
           description: Granting access succeeded
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/DatabaseAccessDto'
         '400':
           description: Granting access query or database connection is malformed
           content:
@@ -1465,12 +1647,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '405':
-          description: Granting access not permitted
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '502':
           description: Access could not be created due to connection error
           content:
@@ -1489,7 +1665,10 @@ paths:
     delete:
       tags:
         - access-endpoint
-      summary: Revoke access to some database
+      summary: Delete access
+      description: >-
+        Delete access of a user with id to a database with id. Requires role
+        `delete-database-access`.
       operationId: revoke
       parameters:
         - name: databaseId
@@ -1506,7 +1685,7 @@ paths:
             format: uuid
       responses:
         '202':
-          description: Revoked access successfully
+          description: Deleted access
         '400':
           description: Modify access query or database connection is malformed
           content:
@@ -1543,7 +1722,13 @@ paths:
     head:
       tags:
         - access-endpoint
-      summary: Check access to some database
+      summary: Find/Check access
+      description: >-
+        Finds or checks access of a user with given id to a database with given
+        id. Requests with HTTP method **GET** return the access object, requests
+        with HTTP method **HEAD** only the status. When the user has at least
+        *READ* access, the status 200 is returned, 403 otherwise. Requires role
+        `check-database-access` or `admin`.
       operationId: find_1
       parameters:
         - name: databaseId
@@ -1584,7 +1769,8 @@ paths:
     get:
       tags:
         - user-endpoint
-      summary: Get a user info
+      summary: Get user
+      description: Gets user with id from the metadata database. Requires authentication.
       operationId: find_2
       parameters:
         - name: userId
@@ -1618,7 +1804,8 @@ paths:
     put:
       tags:
         - user-endpoint
-      summary: Modify user information
+      summary: Update user
+      description: Updates user with id. Requires role `modify-user-information`.
       operationId: modify
       parameters:
         - name: userId
@@ -1665,7 +1852,8 @@ paths:
     put:
       tags:
         - user-endpoint
-      summary: Modify user password
+      summary: Update user password
+      description: Updates password of user with id. Requires authentication.
       operationId: password
       parameters:
         - name: userId
@@ -1683,10 +1871,12 @@ paths:
       responses:
         '202':
           description: Modified user password
+        '400':
+          description: Invalid password payload
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/UserDto'
+                $ref: '#/components/schemas/ApiErrorDto'
         '403':
           description: Not allowed to change foreign user password
           content:
@@ -1718,7 +1908,8 @@ paths:
     put:
       tags:
         - user-endpoint
-      summary: Refresh user token
+      summary: Refresh token
+      description: Refreshes user token by refresh token.
       operationId: refreshToken
       requestBody:
         content:
@@ -1733,12 +1924,18 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/TokenDto'
-        '403':
+        '400':
           description: Invalid refresh token
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not allowed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '502':
           description: Connection to auth service failed
           content:
@@ -1748,7 +1945,8 @@ paths:
     post:
       tags:
         - user-endpoint
-      summary: Obtain user token
+      summary: Create token
+      description: Creates a user token via the auth service.
       operationId: getToken
       requestBody:
         content:
@@ -1763,6 +1961,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/TokenDto'
+        '400':
+          description: Invalid login request
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '403':
           description: Not allowed to get token
           content:
@@ -1799,7 +2003,8 @@ paths:
     get:
       tags:
         - ontology-endpoint
-      summary: Find one ontology
+      summary: Find ontology
+      description: Finds an ontology with id in the metadata database.
       operationId: find_3
       parameters:
         - name: ontologyId
@@ -1824,7 +2029,8 @@ paths:
     put:
       tags:
         - ontology-endpoint
-      summary: Update an ontology
+      summary: Update ontology
+      description: Updates an ontology with id. Requires role `update-ontology`.
       operationId: update
       parameters:
         - name: ontologyId
@@ -1858,7 +2064,8 @@ paths:
     delete:
       tags:
         - ontology-endpoint
-      summary: Delete an ontology
+      summary: Delete ontology
+      description: Deletes an ontology with given id. Requires role `delete-ontology`.
       operationId: delete
       parameters:
         - name: ontologyId
@@ -1885,7 +2092,8 @@ paths:
     put:
       tags:
         - message-endpoint
-      summary: Update maintenance message
+      summary: Update message
+      description: Updates a message with id. Requires role `update-maintenance-message`.
       operationId: update_1
       parameters:
         - name: messageId
@@ -1919,7 +2127,8 @@ paths:
     delete:
       tags:
         - message-endpoint
-      summary: Delete maintenance message
+      summary: Delete message
+      description: Deletes a message with id. Requires role `delete-maintenance-message`.
       operationId: delete_1
       parameters:
         - name: messageId
@@ -1946,7 +2155,8 @@ paths:
     get:
       tags:
         - image-endpoint
-      summary: Find some image
+      summary: Find image
+      description: Finds a container image in the metadata database.
       operationId: findById1
       parameters:
         - name: imageId
@@ -1971,7 +2181,10 @@ paths:
     put:
       tags:
         - image-endpoint
-      summary: Update some image
+      summary: Update image
+      description: >-
+        Updates container image in the metadata database. Requires role
+        `modify-image`.
       operationId: update_2
       parameters:
         - name: imageId
@@ -2005,7 +2218,10 @@ paths:
     delete:
       tags:
         - image-endpoint
-      summary: Delete some image
+      summary: Delete image
+      description: >-
+        Deletes a container image in the metadata database. Requires role
+        `delete-image`.
       operationId: delete_2
       parameters:
         - name: imageId
@@ -2030,7 +2246,10 @@ paths:
     get:
       tags:
         - identifier-endpoint
-      summary: Find some identifier
+      summary: Find identifier
+      description: >-
+        Finds an identifier with id. The response format depends on the HTTP
+        `Accept` header set on the request.
       operationId: find_6
       parameters:
         - name: identifierId
@@ -2112,6 +2331,11 @@ paths:
       tags:
         - identifier-endpoint
       summary: Save identifier
+      description: >-
+        Saves an identifier with id as a draft identifier. Identifiers can only
+        be created for objects the user has at least *READ* access in the
+        associated database (requires role `create-identifier`) or for any
+        object in any database (requires role `create-foreign-identifier`).
       operationId: save
       parameters:
         - name: identifierId
@@ -2151,12 +2375,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '405':
-          description: Creating identifier not permitted
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '502':
           description: Connection to search service failed
           content:
@@ -2175,7 +2393,8 @@ paths:
     delete:
       tags:
         - identifier-endpoint
-      summary: Delete some identifier
+      summary: Delete identifier
+      description: Deletes an identifier with id. Requires role `delete-identifier`.
       operationId: delete_3
       parameters:
         - name: identifierId
@@ -2187,10 +2406,6 @@ paths:
       responses:
         '202':
           description: Deleted identifier
-          content:
-            '*/*':
-              schema:
-                type: object
         '403':
           description: Deleting identifier not permitted
           content:
@@ -2223,6 +2438,9 @@ paths:
       tags:
         - identifier-endpoint
       summary: Publish identifier
+      description: >-
+        Publishes an identifier with id. A published identifier cannot be
+        changed anymore. Requires role `publish-identifier`.
       operationId: publish
       parameters:
         - name: identifierId
@@ -2256,12 +2474,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '405':
-          description: Creating identifier not permitted
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '502':
           description: Connection to search service failed
           content:
@@ -2282,6 +2494,9 @@ paths:
       tags:
         - database-endpoint
       summary: Update database visibility
+      description: >-
+        Updates the database with id on the visibility. Only the database owner
+        can perform this operation. Requires role `modify-database-visibility`.
       operationId: visibility
       parameters:
         - name: databaseId
@@ -2303,6 +2518,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/DatabaseDto'
+        '400':
+          description: The visibility payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '403':
           description: Visibility modification is not permitted
           content:
@@ -2334,7 +2555,8 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Get information about table
+      summary: Find table
+      description: Finds a table with id.
       operationId: findById_2
       parameters:
         - name: databaseId
@@ -2369,13 +2591,13 @@ paths:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
         '502':
-          description: Connection to search service failed
+          description: Failed to establish connection with broker service
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
         '503':
-          description: Failed to save in search service
+          description: Failed to obtain queue information from broker service
           content:
             application/json:
               schema:
@@ -2386,7 +2608,11 @@ paths:
     put:
       tags:
         - table-endpoint
-      summary: Update table statistics
+      summary: Update statistics
+      description: >-
+        Updates basic statistical properties (min, max, mean, median, std.dev)
+        for numerical columns in a table with id. Requires role
+        `update-table-statistic`
       operationId: updateStatistic
       parameters:
         - name: databaseId
@@ -2434,7 +2660,11 @@ paths:
     delete:
       tags:
         - table-endpoint
-      summary: Delete a table
+      summary: Delete table
+      description: >-
+        Deletes a table with id. Only the owner of a table can perform this
+        action (requires role `delete-table`) or anyone can delete a table
+        (requires role `delete-foreign-table`).
       operationId: delete_5
       parameters:
         - name: databaseId
@@ -2489,7 +2719,12 @@ paths:
     put:
       tags:
         - table-endpoint
-      summary: Update a table column semantic mapping
+      summary: Update semantics
+      description: >-
+        Updates column semantics of a table column with id. Only the table owner
+        with at least *READ* access to the associated database can update the
+        column semantics (requires role `modify-table-column-semantics`) or
+        foreign table columns if role `modify-foreign-table-column-semantics`.
       operationId: update_3
       parameters:
         - name: databaseId
@@ -2563,6 +2798,9 @@ paths:
       tags:
         - database-endpoint
       summary: Update database owner
+      description: >-
+        Updates the database with id on the owner. Only the database owner can
+        perform this operation. Requires role `modify-database-owner`.
       operationId: transfer
       parameters:
         - name: databaseId
@@ -2584,6 +2822,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/DatabaseDto'
+        '400':
+          description: Owner payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '403':
           description: Transfer of ownership is not permitted
           content:
@@ -2615,7 +2859,11 @@ paths:
     put:
       tags:
         - database-endpoint
-      summary: Refresh database views metadata
+      summary: Update database view schemas
+      description: >-
+        Updates the database with id with generated metadata from view that are
+        not yet known to the database. Only the database owner can perform this
+        operation. Requires role `find-database`.
       operationId: refreshViewMetadata
       parameters:
         - name: databaseId
@@ -2662,7 +2910,11 @@ paths:
     put:
       tags:
         - database-endpoint
-      summary: Refresh database tables metadata
+      summary: Update database table schemas
+      description: >-
+        Updates the database with id with generated metadata from tables that
+        are not yet known to the database. Only the database owner can perform
+        this operation. Requires role `find-database`.
       operationId: refreshTableMetadata
       parameters:
         - name: databaseId
@@ -2715,7 +2967,10 @@ paths:
     put:
       tags:
         - database-endpoint
-      summary: Update database image
+      summary: Update database preview image
+      description: >-
+        Updates the database with id on the preview image. Only the database
+        owner can perform this operation. Requires role `modify-database-image`.
       operationId: modifyImage
       parameters:
         - name: databaseId
@@ -2774,7 +3029,8 @@ paths:
     get:
       tags:
         - user-endpoint
-      summary: Find all users
+      summary: List users
+      description: Lists users known to the metadata database.
       operationId: findAll
       responses:
         '200':
@@ -2789,6 +3045,9 @@ paths:
       tags:
         - user-endpoint
       summary: Create user
+      description: >-
+        Creates a user in the auth service and metadata database. Requires that
+        no credentials are sent in the request.
       operationId: create1
       requestBody:
         content:
@@ -2802,7 +3061,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/UserBriefDto'
+                $ref: '#/components/schemas/UserDto'
         '400':
           description: Parameters are not well-formed (likely email)
           content:
@@ -2841,21 +3100,25 @@ paths:
     get:
       tags:
         - ontology-endpoint
-      summary: List all ontologies
+      summary: List ontologies
+      description: Lists all ontologies known to the metadata database.
       operationId: findAll_2
       responses:
         '200':
-          description: List all ontologies
+          description: List ontologies
           content:
             application/json:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/OntologyDto'
+                  $ref: '#/components/schemas/OntologyBriefDto'
     post:
       tags:
         - ontology-endpoint
-      summary: Register a new ontology
+      summary: Create ontology
+      description: >-
+        Creates an ontology in the metadata database. Requires role
+        `create-ontology`.
       operationId: create_1
       requestBody:
         content:
@@ -2877,14 +3140,20 @@ paths:
     get:
       tags:
         - message-endpoint
-      summary: Find maintenance messages
+      summary: List messages
+      description: >-
+        Lists messages known to the metadata database. Messages can be filtered
+        be filtered with the optional `active` parameter. If set to *true*, only
+        active messages (that is, messages whose end time has not been reached)
+        will be returned. Otherwise only inactive messages are returned. If not
+        set, active and inactive messages are returned.
       operationId: list_2
       parameters:
-        - name: filter
+        - name: active
           in: query
           required: false
           schema:
-            type: string
+            type: boolean
       responses:
         '200':
           description: List messages
@@ -2897,7 +3166,10 @@ paths:
     post:
       tags:
         - message-endpoint
-      summary: Create maintenance message
+      summary: Create message
+      description: >-
+        Creates a message in the metadata database. Requires role
+        `create-maintenance-message`.
       operationId: create_2
       requestBody:
         content:
@@ -2919,7 +3191,8 @@ paths:
     get:
       tags:
         - image-endpoint
-      summary: Find all images
+      summary: List images
+      description: Lists all container images known to the metadata database.
       operationId: findAll_3
       responses:
         '200':
@@ -2929,11 +3202,14 @@ paths:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/ContainerImage'
+                  $ref: '#/components/schemas/ImageBriefDto'
     post:
       tags:
         - image-endpoint
       summary: Create image
+      description: >-
+        Creates a container image in the metadata database. Requires role
+        `create-image`.
       operationId: create_3
       requestBody:
         content:
@@ -2967,7 +3243,8 @@ paths:
     get:
       tags:
         - identifier-endpoint
-      summary: Find all identifiers
+      summary: List identifiers
+      description: Lists all identifiers known to the metadata database
       operationId: findAll_4
       parameters:
         - name: dbid
@@ -3005,10 +3282,14 @@ paths:
           content:
             application/json:
               schema:
-                type: string
+                type: array
+                items:
+                  $ref: '#/components/schemas/ConceptDto'
             application/ld+json:
               schema:
-                type: string
+                type: array
+                items:
+                  $ref: '#/components/schemas/LdDatasetDto'
         '406':
           description: 'Identifier could not be exported, the requested style is not known'
           content:
@@ -3018,7 +3299,12 @@ paths:
     post:
       tags:
         - identifier-endpoint
-      summary: Draft identifier
+      summary: Create identifier
+      description: >-
+        Create an identifier with id to create a draft identifier. Identifiers
+        can only be created for objects the user has at least *READ* access in
+        the associated database (requires role `create-identifier`) or for any
+        object in any database (requires role `create-foreign-identifier`).
       operationId: create_4
       requestBody:
         content:
@@ -3051,12 +3337,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '405':
-          description: Creating identifier not permitted
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '502':
           description: Connection to search service failed
           content:
@@ -3076,7 +3356,8 @@ paths:
     get:
       tags:
         - view-endpoint
-      summary: Find all views
+      summary: List views
+      description: Lists views known to the metadata database.
       operationId: findAll_5
       parameters:
         - name: databaseId
@@ -3106,7 +3387,8 @@ paths:
     post:
       tags:
         - view-endpoint
-      summary: Create a view
+      summary: Create view
+      description: Creates a view. Requires role `create-database-view`.
       operationId: create_6
       parameters:
         - name: databaseId
@@ -3134,12 +3416,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '401':
-          description: Credentials missing
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '403':
           description: Credentials missing
           content:
@@ -3152,12 +3428,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '405':
-          description: Create view is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '423':
           description: Create view resulted in an invalid query statement
           content:
@@ -3183,7 +3453,8 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: List all tables
+      summary: List tables
+      description: Lists all tables known to the metadata database.
       operationId: list_4
       parameters:
         - name: databaseId
@@ -3219,7 +3490,8 @@ paths:
     post:
       tags:
         - table-endpoint
-      summary: Create a table
+      summary: Create table
+      description: Creates a table in the database with id. Requires role `create-table`.
       operationId: create_7
       parameters:
         - name: databaseId
@@ -3284,7 +3556,8 @@ paths:
     get:
       tags:
         - container-endpoint
-      summary: Find all containers
+      summary: List containers
+      description: List all containers in the metadata database.
       operationId: findAll_6
       parameters:
         - name: limit
@@ -3301,11 +3574,14 @@ paths:
               schema:
                 type: array
                 items:
-                  type: string
+                  $ref: '#/components/schemas/ContainerBriefDto'
     post:
       tags:
         - container-endpoint
       summary: Create container
+      description: >-
+        Creates a container in the metadata database. Requires role
+        `create-container`.
       operationId: create_9
       requestBody:
         content:
@@ -3319,7 +3595,19 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/ContainerBriefDto'
+                $ref: '#/components/schemas/ContainerDto'
+        '400':
+          description: Container payload malformed
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: 'Create container not permitted, need authority `create-container`'
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: Container image or user could not be found
           content:
@@ -3339,7 +3627,8 @@ paths:
     get:
       tags:
         - unit-endpoint
-      summary: List semantic units
+      summary: List units
+      description: Lists units known to the metadata database.
       operationId: findAll_1
       responses:
         '200':
@@ -3355,6 +3644,9 @@ paths:
       tags:
         - ontology-endpoint
       summary: Find entities
+      description: >-
+        Finds semantic entities by label or uri in an ontology with id. Requires
+        role `execute-semantic-query`.
       operationId: find_4
       parameters:
         - name: ontologyId
@@ -3413,7 +3705,7 @@ paths:
     get:
       tags:
         - metadata-endpoint
-      summary: Get the record
+      summary: Get record
       operationId: identify_1_1_1_1
       parameters:
         - name: verb
@@ -3432,7 +3724,8 @@ paths:
     get:
       tags:
         - message-endpoint
-      summary: Find one maintenance message
+      summary: Find message
+      description: Finds a message with id in the metadata database.
       operationId: find_5
       parameters:
         - name: messageId
@@ -3458,7 +3751,8 @@ paths:
     get:
       tags:
         - license-endpoint
-      summary: Get all licenses
+      summary: List licenses
+      description: Lists licenses known to the metadata database.
       operationId: list_3
       responses:
         '200':
@@ -3468,12 +3762,15 @@ paths:
               schema:
                 type: array
                 items:
-                  type: string
+                  $ref: '#/components/schemas/LicenseDto'
   /api/identifier/retrieve:
     get:
       tags:
         - identifier-endpoint
-      summary: Retrieve metadata from identifier
+      summary: Retrieve PID metadata
+      description: >-
+        Retrieves Persistent Identifier (PID) metadata from external endpoints.
+        Supported PIDs are: ORCID, ROR, DOI.
       operationId: retrieve
       parameters:
         - name: url
@@ -3498,7 +3795,8 @@ paths:
     get:
       tags:
         - database-endpoint
-      summary: Find some database
+      summary: Find database
+      description: Finds a database with id.
       operationId: findById_1
       parameters:
         - name: databaseId
@@ -3539,7 +3837,8 @@ paths:
     get:
       tags:
         - view-endpoint
-      summary: Find one view
+      summary: Get view
+      description: Gets a view with id in the metadata database.
       operationId: find_7
       parameters:
         - name: databaseId
@@ -3579,7 +3878,8 @@ paths:
     delete:
       tags:
         - view-endpoint
-      summary: Delete one view
+      summary: Delete view
+      description: Deletes a view with id. Requires role `delete-database-view`.
       operationId: delete_4
       parameters:
         - name: databaseId
@@ -3597,6 +3897,10 @@ paths:
       responses:
         '202':
           description: Delete view successfully
+          content:
+            '*/*':
+              schema:
+                $ref: '#/components/schemas/View'
         '400':
           description: Delete view query is malformed
           content:
@@ -3615,12 +3919,6 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
-        '405':
-          description: Delete view is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ApiErrorDto'
         '423':
           description: Delete view resulted in an invalid query statement
           content:
@@ -3646,7 +3944,10 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Suggest table semantics
+      summary: Suggest semantics
+      description: >-
+        Suggests semantic concepts for a table. Requires role
+        `table-semantic-analyse`.
       operationId: analyseTable
       parameters:
         - name: databaseId
@@ -3669,7 +3970,7 @@ paths:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/TableColumnEntityDto'
+                  $ref: '#/components/schemas/EntityDto'
         '400':
           description: Failed to parse statistic in search service
           content:
@@ -3701,7 +4002,8 @@ paths:
     get:
       tags:
         - table-endpoint
-      summary: Suggest table column semantics
+      summary: Suggest semantics
+      description: Suggests column semantics. Requires role `table-semantic-analyse`.
       operationId: analyseTableColumn
       parameters:
         - name: databaseId
@@ -3756,7 +4058,8 @@ paths:
     get:
       tags:
         - container-endpoint
-      summary: Find some container
+      summary: Find container
+      description: Finds a container in the metadata database.
       operationId: findById_3
       parameters:
         - name: containerId
@@ -3781,7 +4084,10 @@ paths:
     delete:
       tags:
         - container-endpoint
-      summary: Delete some container
+      summary: Delete container
+      description: >-
+        Deletes a container in the metadata database. Requires role
+        `delete-container`.
       operationId: delete_6
       parameters:
         - name: containerId
@@ -3792,11 +4098,13 @@ paths:
             format: int64
       responses:
         '202':
-          description: Deleted container successfully
+          description: Deleted container
+        '403':
+          description: 'Create container not permitted, need authority `delete-container`'
           content:
-            '*/*':
+            application/json:
               schema:
-                type: object
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: Container not found
           content:
@@ -3810,11 +4118,12 @@ paths:
     get:
       tags:
         - concept-endpoint
-      summary: List semantic concepts
+      summary: List concepts
+      description: List all semantic concepts known to the metadata database
       operationId: findAll_7
       responses:
         '200':
-          description: Find all semantic concepts
+          description: List concepts
           content:
             application/json:
               schema:
@@ -4092,29 +4401,6 @@ components:
         column_name:
           type: string
       type: object
-    QueryResultDto:
-      required:
-        - headers
-        - id
-        - result
-      type: object
-      properties:
-        result:
-          type: array
-          items:
-            type: object
-            additionalProperties:
-              type: object
-        headers:
-          type: array
-          items:
-            type: object
-            additionalProperties:
-              type: integer
-              format: int32
-        id:
-          type: integer
-          format: int64
     ApiErrorDto:
       required:
         - code
@@ -4201,6 +4487,29 @@ components:
         code:
           type: string
           example: error.service.code
+    QueryResultDto:
+      required:
+        - headers
+        - id
+        - result
+      type: object
+      properties:
+        result:
+          type: array
+          items:
+            type: object
+            additionalProperties:
+              type: object
+        headers:
+          type: array
+          items:
+            type: object
+            additionalProperties:
+              type: integer
+              format: int32
+        id:
+          type: integer
+          format: int64
     TupleUpdateDto:
       required:
         - data
@@ -5323,6 +5632,23 @@ components:
         rows:
           type: integer
           format: int64
+    TableHistoryDto:
+      required:
+        - event
+        - timestamp
+        - total
+      type: object
+      properties:
+        timestamp:
+          type: string
+          format: date-time
+          example: '2021-03-12T15:26:21.000Z'
+        event:
+          type: string
+        total:
+          type: integer
+          format: int64
+          example: 1
     TupleDeleteDto:
       required:
         - keys
@@ -7950,58 +8276,33 @@ components:
         privileged_password:
           type: string
           description: Password of privileged user
-    ContainerBriefDto:
+    OntologyBriefDto:
       required:
-        - created
-        - hash
         - id
-        - image
-        - internal_name
-        - name
-        - running
+        - prefix
+        - rdf
+        - sparql
+        - uri
       type: object
       properties:
         id:
           type: integer
           format: int64
-        hash:
+        uri:
           type: string
-          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
-        name:
+          example: 'http://www.wikidata.org/'
+        prefix:
           type: string
-          example: Air Quality
-        image:
-          $ref: '#/components/schemas/ImageBriefDto'
-        running:
+          example: wd
+        sparql:
           type: boolean
           example: true
-        created:
-          type: string
-          format: date-time
-          example: '2021-03-12T15:26:21.000Z'
-        internal_name:
-          type: string
-          example: air-quality
-    ImageBriefDto:
-      required:
-        - id
-        - jdbc_method
-        - name
-        - version
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        name:
-          type: string
-          example: mariadb
-        version:
-          type: string
-          example: '10.5'
-        jdbc_method:
+        rdf:
+          type: boolean
+          example: false
+        uri_pattern:
           type: string
-          example: mariadb
+          example: 'http://www.wikidata.org/entity/.*'
     EntityDto:
       required:
         - label
@@ -8030,14 +8331,14 @@ components:
           type: string
         resumptionToken:
           type: string
+        parametersString:
+          type: string
         fromDate:
           type: string
           format: date-time
         untilDate:
           type: string
           format: date-time
-        parametersString:
-          type: string
     BannerMessageDto:
       required:
         - id
@@ -8071,6 +8372,149 @@ components:
           type: string
           format: date-time
           example: '2021-03-12T15:26:21.000Z'
+    ImageBriefDto:
+      required:
+        - id
+        - jdbc_method
+        - name
+        - version
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+          example: '10.5'
+        jdbc_method:
+          type: string
+          example: mariadb
+    LdCreatorDto:
+      required:
+        - '@type'
+        - name
+      type: object
+      properties:
+        name:
+          type: string
+        sameAs:
+          type: string
+        givenName:
+          type: string
+        familyName:
+          type: string
+        '@type':
+          type: string
+    LdDatasetDto:
+      required:
+        - '@context'
+        - '@type'
+        - citation
+        - creator
+        - description
+        - hasPart
+        - identifier
+        - name
+        - temporalCoverage
+        - url
+        - version
+      type: object
+      properties:
+        name:
+          type: string
+        description:
+          type: string
+        url:
+          type: string
+        identifier:
+          type: array
+          items:
+            type: string
+        license:
+          type: string
+        creator:
+          type: array
+          items:
+            $ref: '#/components/schemas/LdCreatorDto'
+        citation:
+          type: string
+        hasPart:
+          type: array
+          items:
+            $ref: '#/components/schemas/LdDatasetDto'
+        temporalCoverage:
+          type: string
+        version:
+          type: string
+          format: date-time
+        '@context':
+          type: string
+        '@type':
+          type: string
+    TableColumnEntityDto:
+      required:
+        - column_id
+        - database_id
+        - table_id
+        - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: 'https://www.wikidata.org/entity/Q1686799'
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        column_id:
+          type: integer
+          format: int64
+          example: 1
+    ContainerBriefDto:
+      required:
+        - created
+        - hash
+        - id
+        - image
+        - internal_name
+        - name
+        - running
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        image:
+          $ref: '#/components/schemas/ImageBriefDto'
+        running:
+          type: boolean
+          example: true
+        created:
+          type: string
+          format: date-time
+          example: '2021-03-12T15:26:21.000Z'
+        internal_name:
+          type: string
+          example: air-quality
     Constraints:
       type: object
       properties:
@@ -9510,97 +9954,6 @@ components:
         d:
           type: integer
           format: int64
-    LdCreatorDto:
-      required:
-        - '@type'
-        - name
-      type: object
-      properties:
-        name:
-          type: string
-        sameAs:
-          type: string
-        givenName:
-          type: string
-        familyName:
-          type: string
-        '@type':
-          type: string
-    LdDatasetDto:
-      required:
-        - '@context'
-        - '@type'
-        - citation
-        - creator
-        - description
-        - hasPart
-        - identifier
-        - name
-        - temporalCoverage
-        - url
-        - version
-      type: object
-      properties:
-        name:
-          type: string
-        description:
-          type: string
-        url:
-          type: string
-        identifier:
-          type: array
-          items:
-            type: string
-        license:
-          type: string
-        creator:
-          type: array
-          items:
-            $ref: '#/components/schemas/LdCreatorDto'
-        citation:
-          type: string
-        hasPart:
-          type: array
-          items:
-            $ref: '#/components/schemas/LdDatasetDto'
-        temporalCoverage:
-          type: string
-        version:
-          type: string
-          format: date-time
-        '@context':
-          type: string
-        '@type':
-          type: string
-    TableColumnEntityDto:
-      required:
-        - column_id
-        - database_id
-        - table_id
-        - uri
-      type: object
-      properties:
-        uri:
-          type: string
-          example: 'https://www.wikidata.org/entity/Q1686799'
-        label:
-          type: string
-          example: Apache Jena
-        description:
-          type: string
-          example: open source semantic web framework for Java
-        database_id:
-          type: integer
-          format: int64
-          example: 1
-        table_id:
-          type: integer
-          format: int64
-          example: 1
-        column_id:
-          type: integer
-          format: int64
-          example: 1
     IndexDto:
       properties:
         results:
diff --git a/.docs/.swagger/swagger-site.sh b/.docs/.swagger/swagger-site.sh
deleted file mode 100644
index d8d91a73cb..0000000000
--- a/.docs/.swagger/swagger-site.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-declare -A services
-#services[1080]=upload
-services[4000]=search
-services[5000]=analyse
-services[9093]=data
-services[9099]=metadata
-services[3305]=sidecar
-
-rm -f ./tmp.yaml
-mkdir -p ./site/swagger
-touch ./tmp.yaml
-
-# -> build paths: map
-for key in "${!services[@]}"; do
-  cat .docs/.swagger/api-${services[$key]}.yaml | yq .paths >> ./tmp.yaml
-done
-
-# -> merge with api.base.yaml into final api.yaml
-yq ".paths *= load(\"tmp.yaml\")" .docs/.swagger/api.base.yaml > .docs/.swagger/api.yaml
-
diff --git a/.docs/api/data-db.md b/.docs/api/data-db.md
index 859264a53a..c91d230be7 100644
--- a/.docs/api/data-db.md
+++ b/.docs/api/data-db.md
@@ -11,10 +11,9 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`dbrepo/data-db-sidecar:__APPVERSION__`](https://hub.docker.com/r/dbrepo/data-db-sidecar)
+    Image: [`dbrepo/data-db-sidecar:1.4.4`](https://hub.docker.com/r/dbrepo/data-db-sidecar)
 
-    * Ports: 3305/tcp
-    * Swagger UI: `http://<hostname>:1080/swagger-ui/` <a href="../swagger/sidecar" target="_blank">:fontawesome-solid-square-up-right: view online</a>
+    * Ports: 8080/tcp
 
 ## Overview
 
diff --git a/.docs/api/index.md b/.docs/api/index.md
index 1468c2b20f..47d5ba14d1 100644
--- a/.docs/api/index.md
+++ b/.docs/api/index.md
@@ -5,7 +5,7 @@ author: Martin Weise
 # Overview
 
 We developed a Python Library for communicating with DBRepo from e.g. Jupyter Notebooks. See
-the [Python Library](./usage-python) page for more details.
+the [Python Library](./open-api) page for more details.
 
 We give usage examples of the most important use-cases we identified.
 
@@ -34,7 +34,7 @@ A user wants to create an account in DBRepo.
     that your administrator has assigned.
 
     <figure markdown>
-    ![Create user account](images/screenshots/create-account-step-1.png){ .img-border }
+    ![Create user account](../images/screenshots/create-account-step-1.png){ .img-border }
     <figcaption>Figure 1: Create user account.</figcaption>
     </figure>
 
@@ -44,7 +44,7 @@ A user wants to create an account in DBRepo.
     authenticated with DBRepo in Figure 2.
 
     <figure markdown>
-    ![Create user account](images/screenshots/create-account-step-2.png){ .img-border }
+    ![Create user account](../images/screenshots/create-account-step-2.png){ .img-border }
     <figcaption>Figure 2: Login to the user account.</figcaption>
     </figure>
 
@@ -54,7 +54,7 @@ A user wants to create an account in DBRepo.
     identically in field :material-numeric-4-circle-outline:. 
 
     <figure markdown>
-    ![Change user account password](images/screenshots/create-account-step-3.png){ .img-border }
+    ![Change user account password](../images/screenshots/create-account-step-3.png){ .img-border }
     <figcaption>Figure 3: Change user account password.</figcaption>
     </figure>
 
@@ -134,7 +134,7 @@ A user wants to create a database in DBRepo.
     Login and press the ":material-plus: DATABASE" button on the top right :material-numeric-1-circle-outline: as seen in Figure 4.
 
     <figure markdown>
-    ![Open the create database dialog](images/screenshots/create-database-step-1.png){ .img-border }
+    ![Open the create database dialog](../images/screenshots/create-database-step-1.png){ .img-border }
     <figcaption>Figure 4: Open the create database dialog.</figcaption>
     </figure>
 
@@ -143,14 +143,14 @@ A user wants to create a database in DBRepo.
     finally create the database, press "Create" :material-numeric-3-circle-outline: as seen in Figure 5.
 
     <figure markdown>
-    ![Create database form](images/screenshots/create-database-step-2.png){ .img-border }
+    ![Create database form](../images/screenshots/create-database-step-2.png){ .img-border }
     <figcaption>Figure 5: Create database form.</figcaption>
     </figure>
 
     After a few seconds, you can see the created database in the "Recent Databases" list, as seen in Figure 6.
 
     <figure markdown>
-    ![View the created database](images/screenshots/create-database-step-3.png){ .img-border }
+    ![View the created database](../images/screenshots/create-database-step-3.png){ .img-border }
     <figcaption>Figure 6: View the created database.</figcaption>
     </figure>
 
@@ -213,7 +213,7 @@ access to. This is the default for self-created databases like above in [Create
     Figure 7.
 
     <figure markdown>
-    ![Open the import CSV form](images/screenshots/import-dataset-step-1.png){ .img-border }
+    ![Open the import CSV form](../images/screenshots/import-dataset-step-1.png){ .img-border }
     <figcaption>Figure 7: Open the import CSV form.</figcaption>
     </figure>
 
@@ -221,7 +221,7 @@ access to. This is the default for self-created databases like above in [Create
     as seen in Figure 8.
 
     <figure markdown>
-    ![Basic table information](images/screenshots/import-dataset-step-2.png){ .img-border }
+    ![Basic table information](../images/screenshots/import-dataset-step-2.png){ .img-border }
     <figcaption>Figure 8: Basic table information.</figcaption>
     </figure>
 
@@ -238,7 +238,7 @@ access to. This is the default for self-created databases like above in [Create
     provide this information in :material-numeric-6-circle-outline:.
 
     <figure markdown>
-    ![Dataset metadata necessary for import](images/screenshots/import-dataset-step-3.png){ .img-border }
+    ![Dataset metadata necessary for import](../images/screenshots/import-dataset-step-3.png){ .img-border }
     <figcaption>Figure 9: Dataset metadata necessary for import.</figcaption>
     </figure>
 
@@ -246,7 +246,7 @@ access to. This is the default for self-created databases like above in [Create
     dataset file onto the field in Figure 10.
 
     <figure markdown>
-    ![Dataset import file](images/screenshots/import-dataset-step-4.png){ .img-border }
+    ![Dataset import file](../images/screenshots/import-dataset-step-4.png){ .img-border }
     <figcaption>Figure 10: Dataset import file.</figcaption>
     </figure>
 
@@ -261,7 +261,7 @@ access to. This is the default for self-created databases like above in [Create
     definitions by clicking the "ADD COLUMN" button in Figure 11.
 
     <figure markdown>
-    ![Confirm the table schema and provide missing information](images/screenshots/import-dataset-step-5.png){ .img-border }
+    ![Confirm the table schema and provide missing information](../images/screenshots/import-dataset-step-5.png){ .img-border }
     <figcaption>Figure 11: Confirm the table schema and provide missing information.</figcaption>
     </figure>
 
@@ -270,7 +270,7 @@ access to. This is the default for self-created databases like above in [Create
     dataset as seen in Figure 12.
 
     <figure markdown>
-    ![Confirm the table schema and provide missing information](images/screenshots/import-dataset-step-6.png){ .img-border }
+    ![Confirm the table schema and provide missing information](../images/screenshots/import-dataset-step-6.png){ .img-border }
     <figcaption>Figure 12: Confirm the table schema and provide missing information.</figcaption>
     </figure>
 
@@ -284,7 +284,7 @@ access to. This is the default for self-created databases like above in [Create
     13.
 
     <figure markdown>
-    ![Table data](images/screenshots/import-dataset-step-7.png){ .img-border }
+    ![Table data](../images/screenshots/import-dataset-step-7.png){ .img-border }
     <figcaption>Figure 13: Table data.</figcaption>
     </figure>
 
@@ -432,7 +432,7 @@ A user wants to import a database dump in `.sql` (or in `.sql.gz`) format into D
     clicking the "OK" button :material-numeric-4-circle-outline:.
 
     <figure markdown>
-    ![Setup New Connection in MySQL Workbench](images/screenshots/import-database-dump-step-1.png)
+    ![Setup New Connection in MySQL Workbench](../images/screenshots/import-database-dump-step-1.png)
     <figcaption>Figure 14: Setup New Connection in MySQL Workbench.</figcaption>
     </figure>
 
@@ -440,7 +440,7 @@ A user wants to import a database dump in `.sql` (or in `.sql.gz`) format into D
     :material-numeric-1-circle-outline: and basic connection and version information :material-numeric-2-circle-outline:.
 
     <figure markdown>
-    ![Server status of the Data Database in MySQL Workbench](images/screenshots/import-database-dump-step-2.png)
+    ![Server status of the Data Database in MySQL Workbench](../images/screenshots/import-database-dump-step-2.png)
     <figcaption>Figure 15: Server status of the Data Database in MySQL Workbench.</figcaption>
     </figure>
 
@@ -451,7 +451,7 @@ A user wants to import a database dump in `.sql` (or in `.sql.gz`) format into D
     The import starts after clicking "Start Import" :material-numeric-5-circle-outline:.
 
     <figure markdown>
-    ![Data Import/Restore in MySQL Workbench](images/screenshots/import-database-dump-step-3.png)
+    ![Data Import/Restore in MySQL Workbench](../images/screenshots/import-database-dump-step-3.png)
     <figcaption>Figure 16: Data Import/Restore in MySQL Workbench.</figcaption>
     </figure>
 
@@ -510,7 +510,7 @@ A user wants to import live data from e.g. sensor measurements fast and without
     database via JDBC, you can obtain the connection string in the UI under the database info (c.f. Figure 14).
 
     <figure markdown>
-    ![JDBC connection information](images/screenshots/database-jdbc.png){ .img-border }
+    ![JDBC connection information](../images/screenshots/database-jdbc.png){ .img-border }
     <figcaption>Figure 14: JDBC connection information.</figcaption>
     </figure>
     
@@ -526,7 +526,7 @@ A user wants to import live data from e.g. sensor measurements fast and without
     database via AMQP, you can obtain the connection string in the UI under the table info (c.f. Figure 14).
 
     <figure markdown>
-    ![AMQP connection information](images/screenshots/table-amqp.png){ .img-border }
+    ![AMQP connection information](../images/screenshots/table-amqp.png){ .img-border }
     <figcaption>Figure 14: AMQP connection information.</figcaption>
     </figure>
 
@@ -550,7 +550,7 @@ A user wants to create a subset and export it as csv file.
     Figure 17.
 
     <figure markdown>
-    ![Open the create subset form](images/screenshots/export-subset-step-1.png){ .img-border }
+    ![Open the create subset form](../images/screenshots/export-subset-step-1.png){ .img-border }
     <figcaption>Figure 17: Open the create subset form.</figcaption>
     </figure>
 
@@ -562,7 +562,7 @@ A user wants to create a subset and export it as csv file.
     Once you are confident the query covers the desired result, click ":material-run: Create".
 
     <figure markdown>
-    ![Subset query building](images/screenshots/export-subset-step-2.png){ .img-border }
+    ![Subset query building](../images/screenshots/export-subset-step-2.png){ .img-border }
     <figcaption>Figure 18: Subset query building.</figcaption>
     </figure>
 
@@ -571,7 +571,7 @@ A user wants to create a subset and export it as csv file.
     View" on the top (c.f. Figure 19).
 
     <figure markdown>
-    ![Subset result set](images/screenshots/export-subset-step-3.png){ .img-border }
+    ![Subset result set](../images/screenshots/export-subset-step-3.png){ .img-border }
     <figcaption>Figure 19: Subset result set.</figcaption>
     </figure>
 
@@ -584,7 +584,7 @@ A user wants to create a subset and export it as csv file.
     a csv file by clicking the ":material-download: DATA .CSV" button :material-numeric-2-circle-outline:.
 
     <figure markdown>
-    ![Subset information](images/screenshots/export-subset-step-4.png){ .img-border }
+    ![Subset information](../images/screenshots/export-subset-step-4.png){ .img-border }
     <figcaption>Figure 20: Subset information.</figcaption>
     </figure>
 
@@ -648,7 +648,7 @@ A user wants to create a subset and export it as csv file.
     under the database info (c.f. Figure 20).
 
     <figure markdown>
-    ![JDBC connection information](images/screenshots/database-jdbc.png){ .img-border }
+    ![JDBC connection information](../images/screenshots/database-jdbc.png){ .img-border }
     <figcaption>Figure 20: JDBC connection information.</figcaption>
     </figure>
 
@@ -728,7 +728,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     the ":material-identifier: GET PID" button :material-numeric-1-circle-outline: as seen in Figure 21.
 
     <figure markdown>
-    ![Open the get persisent identifier form](images/screenshots/assign-database-pid-step-1.png){ .img-border }
+    ![Open the get persisent identifier form](../images/screenshots/assign-database-pid-step-1.png){ .img-border }
     <figcaption>Figure 21: Open the get persisent identifier form.</figcaption>
     </figure>
 
@@ -743,7 +743,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     :material-numeric-8-circle-outline:.
 
     <figure markdown>
-    ![Identifier creator fields](images/screenshots/assign-database-pid-step-2.png){ .img-border }
+    ![Identifier creator fields](../images/screenshots/assign-database-pid-step-2.png){ .img-border }
     <figcaption>Figure 22: Identifier creator fields.</figcaption>
     </figure>
 
@@ -753,7 +753,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     again :material-numeric-4-circle-outline: if they are not needed in Figure 23.
 
     <figure markdown>
-    ![JDBC connection information](images/screenshots/assign-database-pid-step-3.png){ .img-border }
+    ![JDBC connection information](../images/screenshots/assign-database-pid-step-3.png){ .img-border }
     <figcaption>Figure 23: Identifier title fields.</figcaption>
     </figure>
 
@@ -764,7 +764,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     publication month and publication day in Figure 24.
 
     <figure markdown>
-    ![Identifier description fields and publishing information](images/screenshots/assign-database-pid-step-4.png){ .img-border }
+    ![Identifier description fields and publishing information](../images/screenshots/assign-database-pid-step-4.png){ .img-border }
     <figcaption>Figure 24: Identifier description fields and publishing information.</figcaption>
     </figure>
 
@@ -775,7 +775,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     your data.
 
     <figure markdown>
-    ![Related identifiers, license and language of the identifier](images/screenshots/assign-database-pid-step-5.png){ .img-border }
+    ![Related identifiers, license and language of the identifier](../images/screenshots/assign-database-pid-step-5.png){ .img-border }
     <figcaption>Figure 25: Related identifiers, license and language of the identifier.</figcaption>
     </figure>
 
@@ -787,7 +787,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     language on the identifier summary page (c.f. Figure 26).
 
     <figure markdown>
-    ![Identifier funder information](images/screenshots/assign-database-pid-step-6.png){ .img-border }
+    ![Identifier funder information](../images/screenshots/assign-database-pid-step-6.png){ .img-border }
     <figcaption>Figure 26: Identifier funder information.</figcaption>
     </figure>
 
@@ -795,7 +795,7 @@ A user wants to assign a persistent identifier to a database owned by them.
     result is displayed in Figure 27.
 
     <figure markdown>
-    ![Identifier summary page](images/screenshots/assign-database-pid-step-7.png){ .img-border }
+    ![Identifier summary page](../images/screenshots/assign-database-pid-step-7.png){ .img-border }
     <figcaption>Figure 27: Identifier summary page.</figcaption>
     </figure>
 
@@ -884,7 +884,7 @@ A user wants a public database to be private and only give specific users access
     the dialog (c.f. Figure 28).
 
     <figure markdown>
-    ![Database settings for visibility and access](images/screenshots/private-database-access-step-1.png){ .img-border }
+    ![Database settings for visibility and access](../images/screenshots/private-database-access-step-1.png){ .img-border }
     <figcaption>Figure 28: Database settings for visibility and access.</figcaption>
     </figure>
 
@@ -893,7 +893,7 @@ A user wants a public database to be private and only give specific users access
     allowing users to view the private data (c.f. Figure 29).
 
     <figure markdown>
-    ![Database acccess dialog](images/screenshots/private-database-access-step-2.png){ .img-border }
+    ![Database acccess dialog](../images/screenshots/private-database-access-step-2.png){ .img-border }
     <figcaption>Figure 29: Database acccess dialog.</figcaption>
     </figure>
 
diff --git a/.docs/api/metadata-db.md b/.docs/api/metadata-db.md
index e56b88ab8b..38cbe3f127 100644
--- a/.docs/api/metadata-db.md
+++ b/.docs/api/metadata-db.md
@@ -2,4 +2,32 @@
 author: Martin Weise
 ---
 
-TBD
\ No newline at end of file
+!!! debug "Debug Information"
+
+    Image: [`bitnami/mariadb-galera:11.2.2-debian-11-r0`](https://hub.docker.com/r/bitnami/mariadb-galera)
+
+    * Ports: 3306/tcp
+    * JDBC: `jdbc://mariadb:<hostname>:3306`
+
+## Overview
+
+The metadata database is the single, central source of truth within DBRepo and holds all metadata information for
+interaction between the services and displaying information in the UI.
+
+On the first start, the schema is generated by the file `/docker-entrypoint-initdb.d/setup-schema.sql` within the 
+container. You can add custom files that should be executed on the first start by placing them into the 
+`/docker-entrypoint-initdb.d/` folder as well. For example:
+
+```yaml
+services:
+  dbrepo-metadata-db:
+    ...
+    volumes:
+      - /path/to/setup-some-data.sql:/docker-entrypoint-initdb.d/setup-some-data.sql
+    ...
+```
+
+!!! warning "Alphabetic Filename Sorting"
+
+    Beware that the init script provided by Bitnami executes files in alphabetic order! For example: the file 
+    `setup-schema.sql` is executed **after** the file `setup-data.sql`!
\ No newline at end of file
diff --git a/.docs/api/open-api.md b/.docs/api/open-api.md
index 72395271de..575ce9483d 100644
--- a/.docs/api/open-api.md
+++ b/.docs/api/open-api.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 ## tl;dr
 
-[:simple-swagger: &nbsp;View Swagger-UI](../../swagger/){ .md-button .md-button--primary tabindex=-1 }
+[:simple-swagger: &nbsp;View Swagger-UI](../../rest/){ .md-button .md-button--primary tabindex=-1 }
 
 ## Overview
 
diff --git a/.docs/api/python.md b/.docs/api/python.md
index 7289639bfa..a48fb53d8d 100644
--- a/.docs/api/python.md
+++ b/.docs/api/python.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 ## tl;dr
 
-[:fontawesome-solid-cube: &nbsp;View Docs](../sphinx){ .md-button .md-button--primary }
+[:fontawesome-solid-cube: &nbsp;View Docs](../../python){ .md-button .md-button--primary }
 
 ## Installing
 
diff --git a/.docs/api/ui.md b/.docs/api/ui.md
index 659b21ea90..2acc439097 100644
--- a/.docs/api/ui.md
+++ b/.docs/api/ui.md
@@ -52,7 +52,7 @@ User Interface on development.
 
 ### Example
 
-See the [Usage Overview](../usage-overview/) page for detailed examples.
+See the [API Overview](..) page for detailed examples.
 
 ## Limitations
 
diff --git a/.docs/concepts/authentication.md b/.docs/concepts/authentication.md
index 5919b25723..c49abdf86e 100644
--- a/.docs/concepts/authentication.md
+++ b/.docs/concepts/authentication.md
@@ -2,14 +2,32 @@
 author: Martin Weise
 ---
 
+This is a short conceptional overview on the authentication mechanisms provided by Keycloak. We use Keycloak as the
+single source of truth for authorization and user management.
+
+## Basic Authentication
+
+DBRepo supports `Basic` authentication (that is with username and password) in the REST API. When requesting a resource
+from e.g. the [Metadata Service](../../api/metadata-service), the service internally retrieves a
+[Bearer Token](#bearer-authentication) from the [Auth Service](../../api/auth-service) and checks if a certain role
+is present to perform the desired action. This entails a small overhead on each request, since the service does not
+store anything.
+
 ## Bearer Authentication
 
-TBD
+DBRepo supports `Bearer` authentication by accepting JWT tokens in the
+[`Authorization`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization) header of HTTP requests to
+any service. There are two (major) types of tokens:
 
-## Basic Authentication
+* Access tokens who are short lived (e.g. 15 minutes) to access resources, and
+* Refresh token who are long lived (e.g. 30 days) to request new access tokens without having to provide username and
+  password again.
 
-TBD
+The [User Interface](../../api/ui) for example refreshes the token on-the-fly by intercepting each request and, in case
+of an expired access token, requests a new one without having to terminate the request. This happens only once after the
+access token has expired (after e.g. 15 minutes).
 
 ## OpenID Connect (OIDC)
 
-TBD
\ No newline at end of file
+We use the widely accepted authentication protocol OIDC for client authentication. Other protocols are e.g. SAML2 which
+are not used by DBRepo.
\ No newline at end of file
diff --git a/.docs/concepts/databases.md b/.docs/concepts/databases.md
index 1076f775ef..ecf1025b1d 100644
--- a/.docs/concepts/databases.md
+++ b/.docs/concepts/databases.md
@@ -4,15 +4,22 @@ author: Martin Weise
 
 ## Relational Database
 
-TBD
+DBRepo manages relational databases that store information relations in tables.
 
 ## Query
 
-TBD
+A query is the method to interact with a relational database and is used to read/write data or to create/change/delete
+schema information e.g. tables. DBRepo uses a query store to store certain (important) queries that generate subsets
+to restore the exact same subset at a later point.
 
 ## System Versioning
 
-TBD
+DBRepo uses a mechanism offered by SQL:2013 to version tables with the system (=server) time. When inserting a tuple
+into a system-versioned table, the database engine maintains invisible `ROW_START` and `ROW_END` timestamp columns to
+denote a tuple validity. When deleting a tuple, the database engine actually just marks the tuple as `ROW_END = NOW()`
+and does not delete the tuple.
+
+At a later point in time, the (historic) tuple can still be queried using system versioning.
 
 ## Data Ingest
 
diff --git a/.docs/concepts/messaging.md b/.docs/concepts/messaging.md
index 448c7a3f63..c19e1fc2a5 100644
--- a/.docs/concepts/messaging.md
+++ b/.docs/concepts/messaging.md
@@ -2,14 +2,23 @@
 author: Martin Weise
 ---
 
-## Tuple
+We use the message broker RabbitMQ and a single exchange with distributed (`quorum`) queue. Both are named `dbrepo`.
 
-TBD
+<figure markdown>
+<img src="../../images/exchange-binding.png" />
+<caption>Figure 1: Exchange binding in DBRepo.</caption>
+</figure>
 
-## AMQP
+## Tuple
 
-TBD
+A tuple is the atomic granularity of information when transmitting data through message-queue systems. Represented as
+JSON, a tuple looks like this in RabbitMQ:
 
-## MQTT
+```JSON
+{"firstname": "foo", "lastname":  "bar"}
+```
+
+## AMQP
 
-TBD
\ No newline at end of file
+DBRepo uses AMQP to route messages which allows for both Basic/Bearer authentication. For more information please
+consult the [RabbitMQ AMQP](https://www.rabbitmq.com/tutorials/amqp-concepts) documentation.
\ No newline at end of file
diff --git a/.docs/index.md b/.docs/index.md
index aa65b7d939..a6cfdea09b 100644
--- a/.docs/index.md
+++ b/.docs/index.md
@@ -29,7 +29,7 @@ Installing DBRepo is very easy or
 
 ## Who is using DBRepo?
 
-![Logos of DBRepo adopters](../images/logos.png)
+![Logos of DBRepo adopters](images/logos.png)
 
 ## How can I try DBRepo
 
diff --git a/.docs/publications.md b/.docs/publications.md
index 4b64d9a574..b62114dc0f 100644
--- a/.docs/publications.md
+++ b/.docs/publications.md
@@ -20,8 +20,8 @@ hide:
 
 DBRepo logo in various formats:
 
-* PNG: [bigger](./images/logo/logo.png) ([smaller](./images/logo/favicon.png))
-* SVG: [bigger](./images/logo/logo.svg) ([smaller](./images/logo/favicon.svg))
+* PNG: [bigger](../images/logos/logo.png) ([smaller](../images/logos/favicon.png))
+* SVG: [bigger](../images/logos/logo.svg) ([smaller](../images/logos/favicon.svg))
 
 
 ## Refereed
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 813ca707d1..d2552eb054 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -619,10 +619,10 @@ release-docs:
     - "mkdir -p ./final/${APP_VERSION}/swagger"
   script:
     - "make gen-lib-doc gen-docs-doc"
-    - "cp -r ./lib/python/docs/build/html ./final/${APP_VERSION}/sphinx" # sphinx
-    - "cp .docs/.swagger/api.yaml ./final/${APP_VERSION}/swagger/api.yaml" # swagger
-    - "cp .docs/.swagger/swagger-ui.html ./final/${APP_VERSION}/swagger/index.html" # swagger
-    - "cp .docs/.swagger/custom.css ./final/${APP_VERSION}/swagger/custom.css" # swagger
+    - "cp -r ./lib/python/docs/build/html ./final/${APP_VERSION}/python" # sphinx
+    - "cp .docs/.swagger/api.yaml ./final/${APP_VERSION}/rest/api.yaml" # swagger
+    - "cp .docs/.swagger/swagger-ui.html ./final/${APP_VERSION}/rest/index.html" # swagger
+    - "cp .docs/.swagger/custom.css ./final/${APP_VERSION}/rest/custom.css" # swagger
     - "cp -r ./site/* ./final/${APP_VERSION}" # mkdocs
     - eval $(ssh-agent -s)
     - "mkdir -p /root/.ssh"
diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index adf893c960..2ff8fb46f4 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -167,20 +167,19 @@
         },
         "boto3": {
             "hashes": [
-                "sha256:8f9c43c54b3dfaa36c4a0d7b42c417227a515bc7a2e163e62802780000a5a3e2",
-                "sha256:cea2365a25b2b83a97e77f24ac6f922ef62e20636b42f9f6ee9f97188f9c1c03"
+                "sha256:42b140fc850cf261ee4b1e8ef527fa071b1f1592a6d6a68d34b29f37cc46b4dd",
+                "sha256:56bec52d485d5670ce96d53ae7b2cd4ae4e8a705fb2298a21093cdd77d642331"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
-            "version": "==1.34.119"
+            "version": "==1.34.123"
         },
         "botocore": {
             "hashes": [
-                "sha256:4bdf7926a1290b2650d62899ceba65073dd2693e61c35f5cdeb3a286a0aaa27b",
-                "sha256:b253f15b24b87b070e176af48e8ef146516090429d30a7d8b136a4c079b28008"
+                "sha256:8c34ada2a708c82e7174bff700611643db7ce2cb18f1130c35045c24310d299d",
+                "sha256:a8577f6574600c4d159b5cd103ee05744a443d77f7778304e17307940b369c4f"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==1.34.119"
+            "version": "==1.34.123"
         },
         "certifi": {
             "hashes": [
@@ -392,9 +391,11 @@
         },
         "dbrepo": {
             "hashes": [
+                "sha256:2506475fc8fb3f4fdd722e3e92f8e6ad28d0707023c3d8ea5d6d076cef71f395",
                 "sha256:2bdb48c70b4c99b5044fbfc12aa653c1e9281ca8913a433cc08a1e14cb4bd2ef"
             ],
-            "path": "./lib/dbrepo-1.4.4.tar.gz"
+            "path": "./lib/dbrepo-1.4.4.tar.gz",
+            "version": "==1.4.4"
         },
         "events": {
             "hashes": [
@@ -408,7 +409,6 @@
                 "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==1.2.1"
         },
         "flasgger": {
@@ -424,7 +424,6 @@
                 "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==3.0.3"
         },
         "flask-cors": {
@@ -449,7 +448,6 @@
                 "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7' and python_version < '4'",
             "version": "==4.6.0"
         },
         "frozenlist": {
@@ -580,7 +578,6 @@
                 "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==24.2.1"
         },
         "greenlet": {
@@ -645,7 +642,6 @@
                 "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==3.0.3"
         },
         "gunicorn": {
@@ -654,7 +650,6 @@
                 "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==22.0.0"
         },
         "idna": {
@@ -710,7 +705,6 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "markupsafe": {
@@ -931,7 +925,6 @@
                 "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.9'",
             "version": "==1.26.4"
         },
         "opensearch-py": {
@@ -940,16 +933,15 @@
                 "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.6.0"
         },
         "packaging": {
             "hashes": [
-                "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
-                "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
+                "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
+                "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==24.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==24.1"
         },
         "pandas": {
             "hashes": [
@@ -984,7 +976,6 @@
                 "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.9'",
             "version": "==2.2.2"
         },
         "pika": {
@@ -1063,7 +1054,6 @@
                 "sha256:ea91b002777bf643bb20dd717c028ec43216b24a6001a280f83877fd2655d0b4"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==2.7.3"
         },
         "pydantic-core": {
@@ -1245,7 +1235,6 @@
                 "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
         "rpds-py": {
@@ -1395,11 +1384,11 @@
         },
         "typing-extensions": {
             "hashes": [
-                "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a",
-                "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"
+                "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+                "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==4.12.1"
+            "version": "==4.12.2"
         },
         "tzdata": {
             "hashes": [
@@ -1414,7 +1403,7 @@
                 "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d",
                 "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"
             ],
-            "markers": "python_version >= '3.10'",
+            "markers": "python_version >= '3.8'",
             "version": "==2.2.1"
         },
         "werkzeug": {
@@ -1826,7 +1815,6 @@
                 "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==7.5.3"
         },
         "docker": {
@@ -1873,16 +1861,15 @@
                 "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.6.0"
         },
         "packaging": {
             "hashes": [
-                "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
-                "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
+                "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
+                "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==24.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==24.1"
         },
         "pluggy": {
             "hashes": [
@@ -1944,7 +1931,6 @@
                 "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==8.2.2"
         },
         "python-dateutil": {
@@ -1961,7 +1947,6 @@
                 "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
         "requests-mock": {
@@ -1970,7 +1955,6 @@
                 "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.5'",
             "version": "==1.12.1"
         },
         "six": {
@@ -1993,7 +1977,6 @@
                 "sha256:54d330d085c0a11fc5da0b001af87aec4dd3e814104376bf7513e8646c77442a"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "testcontainers-opensearch": {
@@ -2001,23 +1984,22 @@
                 "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "typing-extensions": {
             "hashes": [
-                "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a",
-                "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"
+                "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+                "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==4.12.1"
+            "version": "==4.12.2"
         },
         "urllib3": {
             "hashes": [
                 "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d",
                 "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"
             ],
-            "markers": "python_version >= '3.10'",
+            "markers": "python_version >= '3.8'",
             "version": "==2.2.1"
         },
         "wrapt": {
diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py
index 0e8a10bf1d..61c866982b 100644
--- a/dbrepo-analyse-service/app.py
+++ b/dbrepo-analyse-service/app.py
@@ -1,17 +1,15 @@
-import json
+import os
 import logging
 from typing import Any, List
-import os
 
 from json import dumps
 
 import requests.exceptions
 from dbrepo.api.dto import ApiError
-from flasgger import LazyJSONEncoder, Swagger
-from flask_httpauth import HTTPBasicAuth, MultiAuth, HTTPTokenAuth
-from flasgger.utils import swag_from
+from flasgger import LazyJSONEncoder, Swagger, swag_from
 from flask import Flask, Response, request
 from flask_cors import CORS
+from flask_httpauth import HTTPBasicAuth, MultiAuth, HTTPTokenAuth
 from prometheus_flask_exporter import PrometheusMetrics
 
 from botocore.exceptions import ClientError
@@ -52,14 +50,14 @@ app = Flask(__name__)
 
 cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
 
+metrics = PrometheusMetrics(app)
+metrics.info("app_info", "Application info", version="0.0.1")
+app.config["SWAGGER"] = {"openapi": "3.0.1", "title": "Swagger UI", "uiversion": 3}
+
 token_auth = HTTPTokenAuth(scheme='Bearer')
 basic_auth = HTTPBasicAuth()
 auth = MultiAuth(token_auth, basic_auth)
 
-metrics = PrometheusMetrics(app)
-metrics.info("app_info", "Application info", version="1.4.4")
-app.config["SWAGGER"] = {"openapi": "3.0.1", "title": "Swagger UI", "uiversion": 3}
-
 swagger_config = {
     "headers": [],
     "specs": [
@@ -165,7 +163,7 @@ template = {
     },
     "externalDocs": {
         "description": "Sourcecode Documentation",
-        "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/__APPVERSION__/"
+        "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.4/"
     },
     "servers": [
         {
@@ -185,7 +183,7 @@ app.config["JWT_ALGORITHM"] = "HS256"
 app.config["JWT_PUBKEY"] = '-----BEGIN PUBLIC KEY-----\n' + os.getenv("JWT_PUBKEY",
                                                                       "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB") + '\n-----END PUBLIC KEY-----'
 app.config["AUTH_SERVICE_ENDPOINT"] = os.getenv("AUTH_SERVICE_ENDPOINT", "http://localhost/api/auth")
-app.config["AUTH_SERVICE_CLIENT"] = os.getenv("AUTH_SERVICE_CLIENT", "dbrepo")
+app.config["AUTH_SERVICE_CLIENT"] = os.getenv("AUTH_SERVICE_CLIENT", "dbrepo-client")
 app.config["AUTH_SERVICE_CLIENT_SECRET"] = os.getenv("AUTH_SERVICE_CLIENT_SECRET", "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG")
 app.config["ADMIN_USERNAME"] = os.getenv('ADMIN_USERNAME', 'admin')
 app.config["ADMIN_PASSWORD"] = os.getenv('ADMIN_PASSWORD', 'admin')
@@ -253,7 +251,7 @@ def analyse_datatypes():
 
     if filename is None or separator is None:
         return Response(
-            json.dumps({'success': False, 'message': "Missing required query parameters 'filename' and 'separator'"}),
+            dumps({'success': False, 'message': "Missing required query parameters 'filename' and 'separator'"}),
             mimetype="application/json"), 400
 
     try:
diff --git a/dbrepo-analyse-service/as-yml/analyse_datatypes.yml b/dbrepo-analyse-service/as-yml/analyse_datatypes.yml
index ae52198766..14529bb34b 100644
--- a/dbrepo-analyse-service/as-yml/analyse_datatypes.yml
+++ b/dbrepo-analyse-service/as-yml/analyse_datatypes.yml
@@ -2,7 +2,7 @@ tags:
   - analyse-endpoint
 summary: "Determine datatypes"
 operationId: analyse_datatypes
-description: "This is a simple API which returns the datatypes of a (path) csv file"
+description: "Determines MySQL 8 datatypes of a given dataset. Requires role `table-semantic-analyse`."
 consumes:
   - "application/json"
 produces:
diff --git a/dbrepo-analyse-service/as-yml/analyse_keys.yml b/dbrepo-analyse-service/as-yml/analyse_keys.yml
index da4f0bbca0..fb760930f4 100644
--- a/dbrepo-analyse-service/as-yml/analyse_keys.yml
+++ b/dbrepo-analyse-service/as-yml/analyse_keys.yml
@@ -1,8 +1,8 @@
 tags:
   - analyse-endpoint
-summary: "Determine primary keys"
+summary: "Determine keys"
 operationId: analyse_keys
-description: "This is a simple API which returns the primary keys + ranking of a (path) csv file"
+description: "Determines primary keys of a given dataset. Requires role `table-semantic-analyse`."
 consumes:
   - "application/json"
 produces:
diff --git a/dbrepo-analyse-service/as-yml/analyse_table_stat.yml b/dbrepo-analyse-service/as-yml/analyse_table_stat.yml
deleted file mode 100644
index 8639d4dd92..0000000000
--- a/dbrepo-analyse-service/as-yml/analyse_table_stat.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-tags:
-  - analyse-endpoint
-summary: Determine table statistics
-operationId: analyse_table_stat
-parameters:
-  - name: database_id
-    in: path
-    required: true
-    example: 1
-    schema:
-      type: integer
-      format: int64
-  - name: table_id
-    in: path
-    required: true
-    example: 1
-    schema:
-      type: integer
-      format: int64
-security:
-  - bearerAuth: [ ]
-  - basicAuth: [ ]
-responses:
-  202:
-    description: Determined statistics
-    content:
-      application/json:
-        schema:
-          $ref: '#/components/schemas/TableStats'
-  400:
-    description: "Missing parameters"
-    content:
-      application/json:
-        schema:
-          $ref: '#/components/schemas/ErrorDto'
-  404:
-    description: "Table not found"
-    content:
-      application/json:
-        schema:
-          $ref: '#/components/schemas/ErrorDto'
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl
index 694a6fc02560b3b5d858df0e5a0bd9acf45c8f20..503cfef91315990bbf06027d6de14c8b3184507b 100644
GIT binary patch
delta 9428
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

delta 9382
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
ahNsL746;btwlp4qC_IuQ#%7-hk^uk;ckm7X

diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz
index f344d01026b92476d80703cbfb7d884cb7822e05..9a90176f0a093b05d89d1cd74cf701cd0730861a 100644
GIT binary patch
delta 36946
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

delta 37796
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

diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java
index 4b58c5de33..95332db436 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java
@@ -43,7 +43,8 @@ public class AccessEndpoint {
 
     @PostMapping("/{userId}")
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Give access to some database", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Give access",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -74,11 +75,11 @@ public class AccessEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> create(@NotBlank @PathVariable("databaseId") Long databaseId,
-                                    @NotBlank @PathVariable("userId") UUID userId,
-                                    @Valid @RequestBody UpdateDatabaseAccessDto data)
-            throws NotAllowedException, QueryMalformedException, DatabaseNotFoundException, RemoteUnavailableException,
-            UserNotFoundException, DatabaseMalformedException, ServiceException {
+    public ResponseEntity<Void> create(@NotBlank @PathVariable("databaseId") Long databaseId,
+                                       @NotBlank @PathVariable("userId") UUID userId,
+                                       @Valid @RequestBody UpdateDatabaseAccessDto data)
+            throws NotAllowedException, DatabaseUnavailableException, DatabaseNotFoundException,
+            RemoteUnavailableException, UserNotFoundException, DatabaseMalformedException, ServiceException {
         log.debug("endpoint give access to database, databaseId={}, userId={}", databaseId, userId);
         final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId);
         final PrivilegedUserDto user = metadataServiceGateway.getPrivilegedUserById(userId);
@@ -91,18 +92,19 @@ public class AccessEndpoint {
             return ResponseEntity.accepted()
                     .build();
         } catch (SQLException e) {
-            throw new QueryMalformedException(e);
+            log.error("Failed to establish connection to database: {}", e.getMessage());
+            throw new DatabaseUnavailableException("Failed to establish connection to database", e);
         }
     }
 
     @PutMapping("/{userId}")
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Update access to some database", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Update access",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Update access succeeded",
-                    content = {@Content}),
+                    description = "Update access succeeded"),
             @ApiResponse(responseCode = "400",
                     description = "Update access query or database connection is malformed",
                     content = {@Content(
@@ -129,10 +131,10 @@ public class AccessEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> update(@NotBlank @PathVariable("databaseId") Long databaseId,
-                                    @NotBlank @PathVariable("userId") UUID userId,
-                                    @Valid @RequestBody UpdateDatabaseAccessDto access) throws NotAllowedException,
-            QueryMalformedException, DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
+    public ResponseEntity<Void> update(@NotBlank @PathVariable("databaseId") Long databaseId,
+                                       @NotBlank @PathVariable("userId") UUID userId,
+                                       @Valid @RequestBody UpdateDatabaseAccessDto access) throws NotAllowedException,
+            DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
             DatabaseMalformedException, ServiceException {
         log.debug("endpoint modify access to database, databaseId={}, userId={}, access.type={}", databaseId, userId,
                 access.getType());
@@ -147,13 +149,15 @@ public class AccessEndpoint {
             return ResponseEntity.accepted()
                     .build();
         } catch (SQLException e) {
-            throw new QueryMalformedException(e);
+            log.error("Failed to establish connection to database: {}", e.getMessage());
+            throw new DatabaseUnavailableException("Failed to establish connection to database", e);
         }
     }
 
     @DeleteMapping("/{userId}")
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Revoke access to some database", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Revoke access",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -184,9 +188,9 @@ public class AccessEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> revoke(@NotBlank @PathVariable("databaseId") Long databaseId,
-                                    @NotBlank @PathVariable("userId") UUID userId) throws NotAllowedException,
-            QueryMalformedException, DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
+    public ResponseEntity<Void> revoke(@NotBlank @PathVariable("databaseId") Long databaseId,
+                                       @NotBlank @PathVariable("userId") UUID userId) throws NotAllowedException,
+            DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
             DatabaseMalformedException, ServiceException {
         log.debug("endpoint revoke access to database, databaseId={}, userId={}", databaseId, userId);
         final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId);
@@ -200,7 +204,8 @@ public class AccessEndpoint {
             return ResponseEntity.accepted()
                     .build();
         } catch (SQLException e) {
-            throw new QueryMalformedException(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/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index bd32093068..5397ba1584 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -54,7 +54,8 @@ public class DatabaseEndpoint {
 
     @PostMapping
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Create database", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Create database",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
@@ -108,7 +109,8 @@ public class DatabaseEndpoint {
 
     @PutMapping("/{databaseId}")
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Update user password in database", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Update user password",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java
index 0d4b53b92c..e75cd571eb 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java
@@ -1,6 +1,7 @@
 package at.tuwien.endpoints;
 
 import at.tuwien.ExportResourceDto;
+import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.query.ExecuteStatementDto;
 import at.tuwien.api.database.query.QueryDto;
@@ -14,6 +15,8 @@ import at.tuwien.utils.UserUtil;
 import at.tuwien.validation.EndpointValidator;
 import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -57,13 +60,15 @@ public class SubsetEndpoint {
 
     @GetMapping
     @Observed(name = "dbrepo_subset_list")
-    @Operation(summary = "Find subsets", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @Operation(summary = "Find subsets",
+            description = "Finds subsets in the query store. The result can be optionally filtered by setting `persisted`. When set to *true*, only persisted queries are returned, otherwise only non-persisted queries are returned.",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found subsets",
                     content = {@Content(
                             mediaType = "application/json",
-                            schema = @Schema(implementation = QueryDto[].class))}),
+                            array = @ArraySchema(schema = @Schema(implementation = QueryDto.class)))}),
             @ApiResponse(responseCode = "403",
                     description = "Not allowed to find subsets",
                     content = {@Content(
@@ -85,8 +90,7 @@ public class SubsetEndpoint {
                                                Principal principal)
             throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException,
             QueryNotFoundException, NotAllowedException, ServiceException {
-        log.debug("endpoint find subsets in database, databaseId={}, filterPersisted={}, principal.name={}", databaseId,
-                filterPersisted, principal != null ? principal.getName() : null);
+        log.debug("endpoint find subsets in database, databaseId={}, filterPersisted={}", databaseId, filterPersisted);
         final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId);
         if (!database.getIsPublic()) {
             if (principal == null) {
@@ -102,13 +106,15 @@ public class SubsetEndpoint {
             log.error("Failed to establish connection to database: {}", e.getMessage());
             throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e);
         }
-        log.info("Found {} subsets in data database", queries.size());
+        log.info("Found {} subset(s)", queries.size());
         return ResponseEntity.ok(queries);
     }
 
     @GetMapping("/{subsetId}")
     @Observed(name = "dbrepo_subset_find")
-    @Operation(summary = "Find subset", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @Operation(summary = "Find subset",
+            description = "Finds a subset in the data database. Requests with HTTP header `Accept=application/json` return the metadata, requests with HTTP header `Accept=text/csv` return the data as downloadable file.",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found subset",
@@ -171,12 +177,12 @@ public class SubsetEndpoint {
         }
         /* parameters */
         if (timestamp == null) {
-            log.debug("timestamp not set: default to now");
             timestamp = Instant.now();
+            log.debug("timestamp not set: default to {}", timestamp);
         }
         if (accept == null) {
-            log.debug("accept header not set: default to application/json");
             accept = MediaType.APPLICATION_JSON_VALUE;
+            log.debug("accept header not set: default to {}", accept);
         }
         switch (accept) {
             case MediaType.APPLICATION_JSON_VALUE:
@@ -205,7 +211,9 @@ public class SubsetEndpoint {
     @PostMapping
     @Observed(name = "dbrepo_subset_create")
     @PreAuthorize("hasAuthority('execute-query')")
-    @Operation(summary = "Create subset", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @Operation(summary = "Create subset",
+            description = "Creates a subset in the query store of the data database. Requires role `execute-query`",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created subset",
@@ -253,24 +261,24 @@ public class SubsetEndpoint {
             QueryNotFoundException, StorageUnavailableException, QueryMalformedException, SidecarExportException,
             StorageNotFoundException, QueryStoreInsertException, TableMalformedException, PaginationException,
             QueryNotSupportedException, NotAllowedException, UserNotFoundException, ServiceException {
-        log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, page={}, size={}, timestamp={}",
-                databaseId, data.getStatement(), principal.getName(), page, size, timestamp);
+        log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, page={}, " +
+                "size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size, timestamp);
         /* check */
         endpointValidator.validateDataParams(page, size);
         endpointValidator.validateForbiddenStatements(data.getStatement());
         metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal));
         /* parameters */
         if (page == null) {
-            log.debug("page not set: default to 0");
             page = 0L;
+            log.debug("page not set: default to {}", page);
         }
         if (size == null) {
-            log.debug("size not set: default to 10");
             size = 10L;
+            log.debug("size not set: default to {}", size);
         }
         if (timestamp == null) {
-            log.debug("timestamp not set: default to now");
             timestamp = Instant.now();
+            log.debug("timestamp not set: default to {}", timestamp);
         }
         /* create */
         final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId);
@@ -282,22 +290,26 @@ public class SubsetEndpoint {
             log.error("Failed to establish connection to database: {}", e.getMessage());
             throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e);
         }
-        log.info("Created subset with id {} in data database", queryResult.getId());
+        log.info("Created subset with id: {}", queryResult.getId());
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(queryResult);
     }
 
     @RequestMapping(value = "/{subsetId}/data", method = {RequestMethod.GET, RequestMethod.HEAD})
     @Observed(name = "dbrepo_subset_data")
-    @Operation(summary = "Retrieved subset data", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Get subset data",
+            description = "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Retrieved subset data",
+                    headers = {@Header(name = "X-Count", description = "Number of rows", schema = @Schema(implementation = Long.class), required = true),
+                            @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)},
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = QueryResultDto.class))}),
             @ApiResponse(responseCode = "400",
-                    description = "Malformed select query",
+                    description = "Invalid pagination",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -339,12 +351,12 @@ public class SubsetEndpoint {
         }
         /* parameters */
         if (page == null) {
-            log.debug("page not set: default to 0");
             page = 0L;
+            log.debug("page not set: default to {}", page);
         }
         if (size == null) {
-            log.debug("size not set: default to 10");
             size = 10L;
+            log.debug("size not set: default to {}", size);
         }
         try {
             final QueryDto query = subsetService.findById(database, subsetId);
@@ -372,7 +384,9 @@ public class SubsetEndpoint {
     @PutMapping("/{queryId}")
     @PreAuthorize("hasAuthority('persist-query')")
     @Observed(name = "dbrepo_subset_persist")
-    @Operation(summary = "Persist subset", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Persist subset",
+            description = "Persists a subset with id. Requires role `persist-query`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Persisted subset",
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index 6856e634ab..a0200609a6 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -5,6 +5,7 @@ import at.tuwien.api.database.DatabaseAccessDto;
 import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.query.ImportCsvDto;
+import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.query.QueryResultDto;
 import at.tuwien.api.database.table.*;
 import at.tuwien.api.database.table.internal.PrivilegedTableDto;
@@ -17,6 +18,8 @@ import at.tuwien.utils.UserUtil;
 import at.tuwien.validation.EndpointValidator;
 import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -59,7 +62,8 @@ public class TableEndpoint {
 
     @PostMapping
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Create table", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Create table",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
@@ -105,7 +109,8 @@ public class TableEndpoint {
 
     @DeleteMapping("/{tableId}")
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Delete table", security = {@SecurityRequirement(name = "basicAuth")},
+    @Operation(summary = "Delete table",
+            security = {@SecurityRequirement(name = "basicAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -147,10 +152,14 @@ public class TableEndpoint {
 
     @RequestMapping(value = "/{tableId}/data", method = {RequestMethod.GET, RequestMethod.HEAD})
     @Observed(name = "dbrepo_table_data_list")
-    @Operation(summary = "Retrieve table data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @Operation(summary = "Get table data",
+            description = "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
-                    description = "Retrieved table data",
+                    description = "Get table data",
+                    headers = {@Header(name = "X-Count", description = "Number of rows", schema = @Schema(implementation = Long.class), required = true),
+                            @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)},
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = QueryResultDto.class))}),
@@ -159,6 +168,11 @@ public class TableEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "403",
+                    description = "Not allowed to get table data",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
                     description = "Failed to find table in metadata database",
                     content = {@Content(
@@ -174,26 +188,36 @@ public class TableEndpoint {
                                                   @NotBlank @PathVariable("tableId") Long tableId,
                                                   @RequestParam(required = false) Instant timestamp,
                                                   @RequestParam(required = false) Long page,
-                                                  @RequestParam(required = false) Long size)
+                                                  @RequestParam(required = false) Long size,
+                                                  Principal principal)
             throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException,
-            TableMalformedException, PaginationException, QueryMalformedException, ServiceException {
+            TableMalformedException, PaginationException, QueryMalformedException, ServiceException,
+            NotAllowedException {
         log.debug("endpoint find table data, databaseId={}, tableId={}, timestamp={}, page={}, size={}", databaseId,
                 tableId, timestamp, page, size);
         endpointValidator.validateDataParams(page, size);
         /* parameters */
         if (page == null) {
-            log.debug("page not set: default to 0");
             page = 0L;
+            log.debug("page not set: default to {}", page);
         }
         if (size == null) {
-            log.debug("size not set: default to 10");
             size = 10L;
+            log.debug("size not set: default to {}", size);
         }
         if (timestamp == null) {
-            log.debug("timestamp not set: default to now");
             timestamp = Instant.now();
+            log.debug("timestamp not set: default to {}", timestamp);
         }
         final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId);
+        if (!table.getIsPublic()) {
+            if (principal == null) {
+                log.error("Failed find table data: authentication required");
+                throw new NotAllowedException("Failed to find table data: authentication required");
+            }
+            final DatabaseAccessDto access = metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal));
+            endpointValidator.validateOnlyWriteOwnOrWriteAllAccess(access.getType(), table.getOwner().getId(), UserUtil.getId(principal));
+        }
         final HttpHeaders headers = new HttpHeaders();
         headers.set("Access-Control-Expose-Headers", "X-Count");
         try {
@@ -211,8 +235,8 @@ public class TableEndpoint {
     @PostMapping("/{tableId}/data")
     @PreAuthorize("hasAuthority('insert-table-data')")
     @Observed(name = "dbrepo_table_data_create")
-    @Operation(summary = "Insert a raw data tuple",
-            description = "Inserts a raw data tuple into a table with at least WRITE_OWN access. Then update the table statistics.",
+    @Operation(summary = "Insert tuple",
+            description = "Inserts a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.",
             security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
@@ -263,8 +287,8 @@ public class TableEndpoint {
     @PutMapping("/{tableId}/data")
     @PreAuthorize("hasAuthority('insert-table-data')")
     @Observed(name = "dbrepo_table_data_update")
-    @Operation(summary = "Update a raw data tuple",
-            description = "Updates a raw data tuple in a table with at least WRITE_OWN access. Then update the table statistics.",
+    @Operation(summary = "Update tuple",
+            description = "Updates a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.",
             security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -315,8 +339,8 @@ public class TableEndpoint {
     @DeleteMapping("/{tableId}/data")
     @PreAuthorize("hasAuthority('delete-table-data')")
     @Observed(name = "dbrepo_table_data_delete")
-    @Operation(summary = "Delete table data",
-            description = "Deletes a raw data tuple in a table with at least WRITE_OWN access. Then update the table statistics.",
+    @Operation(summary = "Delete tuple",
+            description = "Deletes a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `delete-table-data`.",
             security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -366,17 +390,17 @@ public class TableEndpoint {
 
     @GetMapping("/{tableId}/history")
     @Observed(name = "dbrepo_table_data_history")
-    @Operation(summary = "Find table history",
-            description = "Lists the insert/delete operations performed. Authentication is only required for tables in private databases",
+    @Operation(summary = "Get history",
+            description = "Gets the insert/delete operations history performed. For tables in private databases, the user needs to have at least *READ* access to the associated database.",
             security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found table history",
                     content = {@Content(
                             mediaType = "application/json",
-                            schema = @Schema(implementation = TableHistoryDto[].class))}),
+                            array = @ArraySchema(schema = @Schema(implementation = TableHistoryDto.class)))}),
             @ApiResponse(responseCode = "400",
-                    description = "Invalid pagination request",
+                    description = "Invalid pagination size request, must be > 0",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -431,13 +455,14 @@ public class TableEndpoint {
     @GetMapping
     @PreAuthorize("hasAuthority('admin')")
     @Observed(name = "dbrepo_table_schema_list")
-    @Operation(summary = "Find table schemas", hidden = true)
+    @Operation(summary = "Find tables",
+            hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Got table schemas",
                     content = {@Content(
                             mediaType = "application/json",
-                            schema = @Schema(implementation = TableDto[].class))}),
+                            array = @ArraySchema(schema = @Schema(implementation = TableDto.class)))}),
             @ApiResponse(responseCode = "400",
                     description = "Schema data malformed",
                     content = {@Content(
@@ -479,7 +504,9 @@ public class TableEndpoint {
 
     @GetMapping("/{tableId}/export")
     @Observed(name = "dbrepo_table_data_export")
-    @Operation(summary = "Export table data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @Operation(summary = "Get table data",
+            description = "Gets data from table with id as downloadable file. For tables in private databases, the user needs to have at least *READ* access to the associated database.",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Exported table data",
@@ -515,6 +542,11 @@ public class TableEndpoint {
             NotAllowedException, StorageUnavailableException, QueryMalformedException, SidecarExportException,
             StorageNotFoundException, ServiceException {
         log.debug("endpoint find table history, databaseId={}, tableId={}, timestamp={}", databaseId, tableId, timestamp);
+        /* parameters */
+        if (timestamp == null) {
+            timestamp = Instant.now();
+            log.debug("timestamp not set: default to {}", timestamp);
+        }
         final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId);
         if (!table.getIsPublic()) {
             if (principal == null) {
@@ -523,11 +555,6 @@ public class TableEndpoint {
             }
             metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal));
         }
-        /* parameters */
-        if (timestamp == null) {
-            log.debug("timestamp not set: default to now");
-            timestamp = Instant.now();
-        }
         try {
             final HttpHeaders headers = new HttpHeaders();
             final ExportResourceDto resource = tableService.exportDataset(table, timestamp);
@@ -546,8 +573,8 @@ public class TableEndpoint {
     @PostMapping("/{tableId}/data/import")
     @Observed(name = "dbrepo_table_data_import")
     @PreAuthorize("hasAuthority('insert-table-data')")
-    @Operation(summary = "Import data from a dataset",
-            description = "Deletes a raw data tuple in a table with at least WRITE_OWN access. Then update the table statistics.",
+    @Operation(summary = "Import dataset",
+            description = "Imports a dataset in a table. Then update the table statistics. The user needs to have at least *WRITE_OWN* access to the associated database when importing into a owned table. Otherwise *WRITE_ALL* access in needed. Requires role `insert-table-data`.",
             security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -585,12 +612,12 @@ public class TableEndpoint {
         final DatabaseAccessDto access = metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal));
         endpointValidator.validateOnlyWriteOwnOrWriteAllAccess(access.getType(), table.getOwner().getId(), UserUtil.getId(principal));
         if (data.getNullElement() == null) {
-            log.debug("null element not present, default to empty string");
             data.setNullElement("");
+            log.debug("null element not present, default to empty string");
         }
         if (data.getLineTermination() == null) {
-            log.debug("line termination not present, default to \\r\\n");
-            data.setLineTermination("\r\n");
+            data.setLineTermination("\\r\\n");
+            log.debug("line termination not present, default to {}", data.getLineTermination());
         }
         try {
             tableService.importDataset(table, data);
@@ -605,7 +632,8 @@ public class TableEndpoint {
 
     @GetMapping("/{tableId}/statistic")
     @Observed(name = "dbrepo_table_statistic")
-    @Operation(summary = "Generate table statistic")
+    @Operation(summary = "Get table statistic",
+            description = "Gets basic statistical properties (min, max, mean, median, std.dev) of numerical columns of a table with id.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Generated table statistic",
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
index 64eea4ebd0..3212b699a2 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
@@ -12,6 +12,7 @@ import at.tuwien.utils.UserUtil;
 import at.tuwien.validation.EndpointValidator;
 import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -55,7 +56,8 @@ public class ViewEndpoint {
     @GetMapping
     @PreAuthorize("hasAuthority('admin')")
     @Observed(name = "dbrepo_view_schema_list")
-    @Operation(summary = "Find view schemas", hidden = true)
+    @Operation(summary = "Find views",
+            hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found view schemas",
@@ -104,7 +106,8 @@ public class ViewEndpoint {
 
     @PostMapping
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Create view", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")},
+    @Operation(summary = "Create view",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -149,7 +152,8 @@ public class ViewEndpoint {
 
     @DeleteMapping("/{viewId}")
     @PreAuthorize("hasAuthority('admin')")
-    @Operation(summary = "Delete view", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")},
+    @Operation(summary = "Delete view",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")},
             hidden = true)
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -193,10 +197,14 @@ public class ViewEndpoint {
 
     @RequestMapping(value = "/{viewId}/data", method = {RequestMethod.GET, RequestMethod.HEAD})
     @Observed(name = "dbrepo_view_data")
-    @Operation(summary = "Retrieve view data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
+    @Operation(summary = "Get view data",
+            description = "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database. Requires role `view-database-view-data`.",
+            security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Retrieved view data",
+                    headers = {@Header(name = "X-Count", description = "Number of rows", schema = @Schema(implementation = Long.class), required = true),
+                            @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)},
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = QueryResultDto.class))}),
@@ -241,16 +249,16 @@ public class ViewEndpoint {
         endpointValidator.validateDataParams(page, size);
         /* parameters */
         if (page == null) {
-            log.debug("page not set: default to 0");
             page = 0L;
+            log.debug("page not set: default to {}", page);
         }
         if (size == null) {
-            log.debug("size not set: default to 10");
             size = 10L;
+            log.debug("size not set: default to {}", size);
         }
         if (timestamp == null) {
-            log.debug("timestamp not set: default to now");
             timestamp = Instant.now();
+            log.debug("timestamp not set: default to {}", timestamp);
         }
         final PrivilegedViewDto view = metadataServiceGateway.getViewById(databaseId, viewId);
         if (!view.getIsPublic()) {
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java
index 544f3f0d17..0a69255f10 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java
@@ -1,5 +1,7 @@
 package at.tuwien.endpoint;
 
+import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
+import at.tuwien.api.user.UserDto;
 import at.tuwien.endpoints.AccessEndpoint;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.MetadataServiceGateway;
@@ -15,9 +17,10 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.sql.SQLException;
+
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 @Log4j2
 @SpringBootTest
@@ -28,10 +31,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
     private AccessEndpoint accessEndpoint;
 
     @MockBean
-    private AccessService accessService;
+    private MetadataServiceGateway metadataServiceGateway;
 
     @MockBean
-    private MetadataServiceGateway metadataServiceGateway;
+    private AccessService accessService;
 
     @BeforeEach
     public void beforeEach() {
@@ -40,7 +43,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"admin"})
-    public void create_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException,
+    public void create_succeeds() throws UserNotFoundException, NotAllowedException, DatabaseUnavailableException,
             DatabaseNotFoundException, RemoteUnavailableException, DatabaseMalformedException, ServiceException {
 
         /* mock */
@@ -117,7 +120,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"admin"})
     public void update_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
-            NotAllowedException, QueryMalformedException, DatabaseMalformedException, ServiceException {
+            NotAllowedException, DatabaseUnavailableException, DatabaseMalformedException, ServiceException {
 
         /* mock */
         when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
@@ -175,14 +178,18 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"admin"})
-    public void revoke_succeeds() throws UserNotFoundException, NotAllowedException, QueryMalformedException,
-            DatabaseNotFoundException, RemoteUnavailableException, DatabaseMalformedException, ServiceException {
+    public void revoke_succeeds() throws UserNotFoundException, NotAllowedException, DatabaseUnavailableException,
+            DatabaseNotFoundException, RemoteUnavailableException, DatabaseMalformedException, ServiceException,
+            SQLException {
 
         /* mock */
         when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_PRIVILEGED_DTO);
         when(metadataServiceGateway.getPrivilegedUserById(USER_1_ID))
                 .thenReturn(USER_1_PRIVILEGED_DTO);
+        doNothing()
+                .when(accessService)
+                .delete(any(PrivilegedDatabaseDto.class), any(UserDto.class));
 
         /* test */
         accessEndpoint.revoke(DATABASE_1_ID, USER_1_ID);
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java
index 21769ff5eb..aa424e3aa6 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java
@@ -5,7 +5,6 @@ import at.tuwien.api.user.PrivilegedUserDto;
 import at.tuwien.endpoints.DatabaseEndpoint;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.MetadataServiceGateway;
-import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.service.AccessService;
 import at.tuwien.service.DatabaseService;
 import at.tuwien.service.SubsetService;
@@ -41,9 +40,6 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @MockBean
     private AccessService accessService;
 
-    @MockBean
-    private MetadataMapper metadataMapper;
-
     @MockBean
     private DatabaseService databaseService;
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java
index 62375e2ab4..022b043caa 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java
@@ -140,7 +140,8 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithAnonymousUser
     public void getData_succeeds() throws DatabaseUnavailableException, TableNotFoundException, TableMalformedException,
-            SQLException, QueryMalformedException, RemoteUnavailableException, PaginationException, ServiceException {
+            SQLException, QueryMalformedException, RemoteUnavailableException, PaginationException, ServiceException,
+            NotAllowedException {
 
         /* mock */
         when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID))
@@ -151,7 +152,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(TABLE_8_DATA_DTO);
 
         /* test */
-        final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null);
+        final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, null);
         assertEquals(HttpStatus.OK, response.getStatusCode());
         assertNotNull(response.getHeaders().get("X-Count"));
         assertEquals(1, response.getHeaders().get("X-Count").size());
@@ -174,7 +175,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(TableNotFoundException.class, () -> {
-            tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null);
+            tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, null);
         });
     }
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java
index af4767b049..9f7ad136a8 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java
@@ -17,7 +17,6 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
index 803632c078..9d42c1a54d 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
@@ -171,7 +171,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
 
         /* mock */
         try {
-            tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null);
+            tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, null);
         } catch (Exception e) {
             /* ignore */
         }
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
index 25dcb0caea..db00195e04 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
@@ -53,7 +53,9 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         genesis();
         /* metadata database */
         MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
+        MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME);
         MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO);
+        MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_DTO);
     }
 
     @Test
@@ -92,6 +94,46 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals(0, foreignKeys.size());
     }
 
+    @Test
+    public void inspectTableEnum_succeeds() throws TableNotFoundException, SQLException, QueryMalformedException {
+
+        /* test */
+        final TableDto response = schemaService.inspectTable(DATABASE_2_PRIVILEGED_DTO, "experiments");
+        assertEquals("experiments", response.getInternalName());
+        assertEquals("experiments", response.getName());
+        assertEquals(DATABASE_2_ID, response.getTdbid());
+        assertTrue(response.getIsVersioned());
+        assertEquals(DATABASE_2_PUBLIC, response.getIsPublic());
+        assertEquals(DATABASE_2_OWNER, response.getCreatedBy());
+        assertNotNull(response.getCreator());
+        assertEquals(DATABASE_2_OWNER, response.getCreator().getId());
+        assertEquals(USER_2_NAME, response.getCreator().getName());
+        assertEquals(USER_2_USERNAME, response.getCreator().getUsername());
+        assertEquals(USER_2_FIRSTNAME, response.getCreator().getFirstname());
+        assertEquals(USER_2_LASTNAME, response.getCreator().getLastname());
+        assertEquals(USER_2_QUALIFIED_NAME, response.getCreator().getQualifiedName());
+        assertNotNull(response.getCreator().getAttributes());
+        assertEquals(USER_2_AFFILIATION, response.getCreator().getAttributes().getAffiliation());
+        assertEquals(USER_2_THEME, response.getCreator().getAttributes().getTheme());
+        assertEquals(USER_2_LANGUAGE, response.getCreator().getAttributes().getLanguage());
+        assertEquals(USER_2_ORCID_URL, response.getCreator().getAttributes().getOrcid());
+        assertNull(response.getCreator().getAttributes().getMariadbPassword());
+        final List<IdentifierDto> identifiers = response.getIdentifiers();
+        assertNotNull(identifiers);
+        assertEquals(0, identifiers.size());
+        final List<ColumnDto> columns = response.getColumns();
+        assertNotNull(columns);
+        assertEquals(3, columns.size());
+        assertColumn(columns.get(0), null, null, DATABASE_2_ID, "id", "id", ColumnTypeDto.BIGINT, 19L, 0L, false, null, null);
+        assertColumn(columns.get(1), null, null, DATABASE_2_ID, "mode", "mode", ColumnTypeDto.ENUM, 3L, null, false, null, null);
+        assertEquals(2, columns.get(1).getEnums().size());
+        assertEquals(List.of("ABC", "DEF"), columns.get(1).getEnums());
+        assertColumn(columns.get(2), null, null, DATABASE_2_ID, "seq", "seq", ColumnTypeDto.SET, 5L, null, true, null, null);
+        assertEquals(3, columns.get(2).getSets().size());
+        assertEquals(List.of("1", "2", "3"), columns.get(2).getSets());
+        /* ignore rest (constraints) */
+    }
+
     @Test
     public void inspectTableFullConstraints_succeeds() throws TableNotFoundException, SQLException, QueryMalformedException {
 
@@ -348,8 +390,8 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
     }
 
     protected static void assertColumn(ColumnDto column, Long id, Long tableId, Long databaseId, String name,
-                                           String internalName, ColumnTypeDto type, Long size, Long d, Boolean nullAllowed,
-                                           Long dfid, String description) {
+                                       String internalName, ColumnTypeDto type, Long size, Long d, Boolean nullAllowed,
+                                       Long dfid, String description) {
         log.trace("assert column: {}", internalName);
         assertNotNull(column);
         assertEquals(id, column.getId());
diff --git a/dbrepo-data-service/rest-service/src/test/resources/init/zoo.sql b/dbrepo-data-service/rest-service/src/test/resources/init/zoo.sql
index 6279d887cc..88284978c5 100644
--- a/dbrepo-data-service/rest-service/src/test/resources/init/zoo.sql
+++ b/dbrepo-data-service/rest-service/src/test/resources/init/zoo.sql
@@ -38,6 +38,15 @@ create table names
     unique key (firstname, lastname)
 ) with system versioning;
 
+CREATE SEQUENCE seq_experiments;
+
+create table experiments
+(
+    id   bigint              not null default nextval(seq_experiments),
+    mode enum ('ABC', 'DEF') not null,
+    seq  set ('1','2','3')
+) WITH SYSTEM VERSIONING;
+
 create table likes
 (
     name_id bigint not null,
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java
index 5be39d4f0a..afb0701455 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java
@@ -182,7 +182,7 @@ public interface MariaDbMapper {
     }
 
     default String databaseTableConstraintsSelectRawQuery() {
-        final String statement = "SELECT k.`ORDINAL_POSITION`, c.`CONSTRAINT_TYPE`, k.`CONSTRAINT_NAME`, k.`COLUMN_NAME`, k.`REFERENCED_TABLE_NAME`, k.`REFERENCED_COLUMN_NAME`, r.`DELETE_RULE`, r.`UPDATE_RULE` FROM information_schema.TABLE_CONSTRAINTS c JOIN information_schema.KEY_COLUMN_USAGE k ON c.`TABLE_NAME` = k.`TABLE_NAME` AND c.`CONSTRAINT_NAME` = k.`CONSTRAINT_NAME` LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS r ON r.`CONSTRAINT_NAME` = k.`CONSTRAINT_NAME` WHERE LOWER(k.`COLUMN_NAME`) != 'row_end' AND c.`TABLE_SCHEMA` = ? AND c.`TABLE_NAME` = ? ORDER BY k.`ORDINAL_POSITION` ASC;";
+        final String statement = "SELECT k.`ORDINAL_POSITION`, c.`CONSTRAINT_TYPE`, k.`CONSTRAINT_NAME`, k.`COLUMN_NAME`, k.`REFERENCED_TABLE_NAME`, k.`REFERENCED_COLUMN_NAME`, r.`DELETE_RULE`, r.`UPDATE_RULE` FROM information_schema.TABLE_CONSTRAINTS c JOIN information_schema.KEY_COLUMN_USAGE k ON c.`TABLE_NAME` = k.`TABLE_NAME` AND c.`CONSTRAINT_NAME` = k.`CONSTRAINT_NAME` LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS r ON r.`CONSTRAINT_NAME` = k.`CONSTRAINT_NAME` WHERE LOWER(k.`COLUMN_NAME`) != 'row_end' AND c.`TABLE_SCHEMA` = ? AND c.`TABLE_NAME` = ? GROUP BY k.`ORDINAL_POSITION`, k.`CONSTRAINT_NAME` ORDER BY k.`ORDINAL_POSITION` ASC;";
         log.trace("mapped select table constraints statement: {}", statement);
         return statement;
     }
@@ -754,6 +754,22 @@ public interface MariaDbMapper {
                 .databaseId(table.getTdbid())
                 .description(resultSet.getString(11))
                 .build();
+        if (column.getColumnType().equals(ColumnTypeDto.ENUM)) {
+            column.setEnums(Arrays.stream(resultSet.getString(8)
+                            .substring(0, resultSet.getString(8).length() - 1)
+                            .replace("enum(", "")
+                            .split(","))
+                    .map(value -> value.replace("'", ""))
+                    .toList());
+        }
+        if (column.getColumnType().equals(ColumnTypeDto.SET)) {
+            column.setSets(Arrays.stream(resultSet.getString(8)
+                            .substring(0, resultSet.getString(8).length() - 1)
+                            .replace("set(", "")
+                            .split(","))
+                    .map(value -> value.replace("'", ""))
+                    .toList());
+        }
         /* constraints */
         if (resultSet.getString(9) != null && resultSet.getString(9).equals("PRI")) {
             table.getConstraints().getPrimaryKey().add(PrimaryKeyDto.builder()
diff --git a/dbrepo-metadata-db/setup-schema.sql b/dbrepo-metadata-db/setup-schema.sql
index 7a12ed5e82..e385ea4d9b 100644
--- a/dbrepo-metadata-db/setup-schema.sql
+++ b/dbrepo-metadata-db/setup-schema.sql
@@ -249,6 +249,7 @@ CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key_reference`
     cid  BIGINT NOT NULL,
     rcid BIGINT NOT NULL,
     PRIMARY KEY (id),
+    UNIQUE (fkid, cid, rcid),
     FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid) ON UPDATE CASCADE,
     FOREIGN KEY (cid) REFERENCES mdb_columns (id),
     FOREIGN KEY (rcid) REFERENCES mdb_columns (id)
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
index 89f52c6cb2..c63cdd22e6 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
@@ -15,7 +15,9 @@ import jakarta.persistence.*;
 @ToString
 @EntityListeners(AuditingEntityListener.class)
 @EqualsAndHashCode(onlyExplicitlyIncluded = true)
-@Table(name = "mdb_constraints_foreign_key_reference")
+@Table(name = "mdb_constraints_foreign_key_reference", uniqueConstraints = {
+        @UniqueConstraint(columnNames = {"fkid", "cid", "rcid"})
+})
 public class ForeignKeyReference {
 
     @Id
@@ -26,17 +28,17 @@ public class ForeignKeyReference {
     private Long id;
 
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false)
     private ForeignKey foreignKey;
 
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false)
     })
     private TableColumn column;
 
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false)
     })
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
index 1cb8f6d394..8e628f710a 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
@@ -539,20 +539,21 @@ public interface MetadataMapper {
                     pk.getColumn().setTableId(data.getId());
                     pk.getColumn().setDatabaseId(data.getDatabase().getId());
                 });
-        for (ForeignKeyDto fk : table.getConstraints().getForeignKeys()) {
-            for (ForeignKeyReferenceDto ref : fk.getReferences()) {
-                ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk));
-                ref.getColumn().setTableId(table.getId());
-                ref.getColumn().setDatabaseId(table.getTdbid());
-                final Optional<TableColumn> optional = data.getDatabase().getTables().stream().map(Table::getColumns).flatMap(List::stream).filter(c -> c.getId().equals(ref.getReferencedColumn().getId())).findFirst();
-                if (optional.isEmpty()) {
-                    log.error("Failed to find foreign key referenced column {}.{} in columns: {}", table.getInternalName(), ref.getReferencedColumn().getInternalName(), data.getDatabase().getTables().stream().map(Table::getColumns).flatMap(List::stream).toList());
-                    throw new IllegalArgumentException("Failed to find foreign key referenced column");
-                }
-                ref.getReferencedColumn().setTableId(optional.get().getTable().getId());
-                ref.getReferencedColumn().setDatabaseId(optional.get().getTable().getTdbid());
-            }
-        }
+        table.getConstraints()
+                .getForeignKeys()
+                .forEach(fk -> {
+                    fk.getTable().setDatabaseId(table.getTdbid());
+                    fk.getReferencedTable().setDatabaseId(table.getTdbid());
+                    fk.getReferences()
+                            .forEach(ref -> {
+                                ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk));
+                                ref.getColumn().setTableId(table.getId());
+                                ref.getColumn().setDatabaseId(table.getTdbid());
+                                ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId());
+                                ref.getReferencedColumn().setDatabaseId(table.getTdbid());
+                                log.trace("mapped foreign key part ({}) reference ({})", ref.getColumn().getInternalName(), ref.getReferencedColumn().getInternalName());
+                            });
+                });
         table.getConstraints()
                 .getUniques()
                 .forEach(uk -> {
@@ -594,7 +595,7 @@ public interface MetadataMapper {
     Unique uniqueDtoToUnique(UniqueDto data);
 
     @Mappings({
-            @Mapping(target = "ownedBy", source = "owner.id"),
+            @Mapping(target = "ownedBy", source = "owner.id")
     })
     Table tableDtoToTable(TableDto data);
 
@@ -828,8 +829,9 @@ public interface MetadataMapper {
         final Pattern WHITESPACE = Pattern.compile("[\\s]");
         String nowhitespace = WHITESPACE.matcher(data).replaceAll("_");
         String normalized = Normalizer.normalize(nowhitespace, Normalizer.Form.NFD);
-        String slug = NONLATIN.matcher(normalized).replaceAll("");
-        final String name = slug.toLowerCase(Locale.ENGLISH);
+        String slug = NONLATIN.matcher(normalized).replaceAll("_");
+        final String name = slug.toLowerCase(Locale.ENGLISH)
+                .replaceAll("-", "_");
         log.debug("mapping name {} to internal name {}", data, name);
         return name;
     }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java
index 17c1e20978..1a85308940 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java
@@ -56,11 +56,15 @@ public class AccessEndpoint {
     @Transactional
     @Observed(name = "dbrepo_access_give")
     @PreAuthorize("hasAuthority('create-database-access')")
-    @Operation(summary = "Give access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Give access",
+            description = "Give a user with given id access to some database with given id. Requires role `create-database-access`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Granting access succeeded",
-                    content = {@Content}),
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = DatabaseAccessDto.class))}),
             @ApiResponse(responseCode = "400",
                     description = "Granting access query or database connection is malformed",
                     content = {@Content(
@@ -76,11 +80,6 @@ public class AccessEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "405",
-                    description = "Granting access not permitted",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "502",
                     description = "Access could not be created due to connection error",
                     content = {@Content(
@@ -92,7 +91,7 @@ public class AccessEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> create(@NotBlank @PathVariable("databaseId") Long databaseId,
+    public ResponseEntity<DatabaseAccessDto> create(@NotBlank @PathVariable("databaseId") Long databaseId,
                                     @NotBlank @PathVariable("userId") UUID userId,
                                     @Valid @RequestBody UpdateDatabaseAccessDto data,
                                     @NotNull Principal principal) throws NotAllowedException, ServiceException,
@@ -122,11 +121,12 @@ public class AccessEndpoint {
     @Transactional
     @Observed(name = "dbrepo_access_modify")
     @PreAuthorize("hasAuthority('update-database-access')")
-    @Operation(summary = "Modify access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Modify access",
+            description = "Modifies access of a user with given id to database with given id. Requires role `update-database-access`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Modify access succeeded",
-                    content = {@Content}),
+                    description = "Modified access"),
             @ApiResponse(responseCode = "400",
                     description = "Modify access query or database connection is malformed",
                     content = {@Content(
@@ -153,7 +153,7 @@ public class AccessEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> update(@NotBlank @PathVariable("databaseId") Long databaseId,
+    public ResponseEntity<Void> update(@NotBlank @PathVariable("databaseId") Long databaseId,
                                     @NotBlank @PathVariable("userId") UUID userId,
                                     @Valid @RequestBody UpdateDatabaseAccessDto data,
                                     @NotNull Principal principal) throws NotAllowedException,
@@ -177,7 +177,9 @@ public class AccessEndpoint {
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_access_get")
     @PreAuthorize("hasAuthority('check-database-access') or hasAuthority('admin')")
-    @Operation(summary = "Check access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Find/Check access",
+            description = "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `admin`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found database access",
@@ -220,11 +222,12 @@ public class AccessEndpoint {
     @Transactional
     @Observed(name = "dbrepo_access_delete")
     @PreAuthorize("hasAuthority('delete-database-access')")
-    @Operation(summary = "Revoke access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete access",
+            description = "Delete access of a user with id to a database with id. Requires role `delete-database-access`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Revoked access successfully",
-                    content = {@Content}),
+                    description = "Deleted access"),
             @ApiResponse(responseCode = "400",
                     description = "Modify access query or database connection is malformed",
                     content = {@Content(
@@ -251,7 +254,7 @@ public class AccessEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> revoke(@NotBlank @PathVariable("databaseId") Long databaseId,
+    public ResponseEntity<Void> revoke(@NotBlank @PathVariable("databaseId") Long databaseId,
                                     @NotBlank @PathVariable("userId") UUID userId,
                                     @NotNull Principal principal) throws NotAllowedException, ServiceException,
             ServiceConnectionException, DatabaseNotFoundException, UserNotFoundException, AccessNotFoundException,
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java
index cb58e62def..44a592658e 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java
@@ -36,10 +36,11 @@ public class ConceptEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_semantic_concepts_findall")
-    @Operation(summary = "List semantic concepts")
+    @Operation(summary = "List concepts",
+            description = "List all semantic concepts known to the metadata database")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
-                    description = "Find all semantic concepts",
+                    description = "List concepts",
                     content = {@Content(
                             mediaType = "application/json",
                             array = @ArraySchema(schema = @Schema(implementation = ConceptDto.class)))}),
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
index 9d6e24801b..77d35ec498 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
@@ -54,13 +54,14 @@ public class ContainerEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_container_findall")
-    @Operation(summary = "Find all containers")
+    @Operation(summary = "List containers",
+            description = "List all containers in the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List containers",
                     content = {@Content(
                             mediaType = "application/json",
-                            array = @ArraySchema(schema = @Schema(implementation = ContainerBriefDto[].class)))}),
+                            array = @ArraySchema(schema = @Schema(implementation = ContainerBriefDto.class)))}),
     })
     public ResponseEntity<List<ContainerBriefDto>> findAll(@RequestParam(required = false) Integer limit) {
         log.debug("endpoint find all containers, limit={}", limit);
@@ -77,13 +78,25 @@ public class ContainerEndpoint {
     @Transactional
     @Observed(name = "dbrepo_container_create")
     @PreAuthorize("hasAuthority('create-container')")
-    @Operation(summary = "Create container", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create container",
+            description = "Creates a container in the metadata database. Requires role `create-container`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created a new container",
                     content = {@Content(
                             mediaType = "application/json",
-                            schema = @Schema(implementation = ContainerBriefDto.class))}),
+                            schema = @Schema(implementation = ContainerDto.class))}),
+            @ApiResponse(responseCode = "400",
+                    description = "Container payload malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "403",
+                    description = "Create container not permitted, need authority `create-container`",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
                     description = "Container image or user could not be found",
                     content = {@Content(
@@ -95,11 +108,11 @@ public class ContainerEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<ContainerBriefDto> create(@Valid @RequestBody ContainerCreateDto data)
+    public ResponseEntity<ContainerDto> create(@Valid @RequestBody ContainerCreateDto data)
             throws ImageNotFoundException, ContainerAlreadyExistsException {
         log.debug("endpoint create container, data={}", data);
         final Container container = containerService.create(data);
-        final ContainerBriefDto dto = metadataMapper.containerToDatabaseContainerBriefDto(container);
+        final ContainerDto dto = metadataMapper.containerToContainerDto(container);
         log.trace("create container resulted in container {}", dto);
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(dto);
@@ -108,7 +121,8 @@ public class ContainerEndpoint {
     @GetMapping("/{containerId}")
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_container_find")
-    @Operation(summary = "Find some container")
+    @Operation(summary = "Find container",
+            description = "Finds a container in the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found container",
@@ -147,17 +161,24 @@ public class ContainerEndpoint {
     @Transactional
     @Observed(name = "dbrepo_container_delete")
     @PreAuthorize("hasAuthority('delete-container')")
-    @Operation(summary = "Delete some container", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete container",
+            description = "Deletes a container in the metadata database. Requires role `delete-container`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Deleted container successfully"),
+                    description = "Deleted container"),
+            @ApiResponse(responseCode = "403",
+                    description = "Create container not permitted, need authority `delete-container`",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
                     description = "Container not found",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("containerId") Long containerId) throws ContainerNotFoundException {
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("containerId") Long containerId) throws ContainerNotFoundException {
         log.debug("endpoint delete container, containerId={}", containerId);
         final Container container = containerService.find(containerId);
         containerService.remove(container);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index b5248ed232..36cf03bb37 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -12,6 +12,7 @@ import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.service.*;
 import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -65,10 +66,13 @@ public class DatabaseEndpoint {
     @RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD})
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_database_findall")
-    @Operation(summary = "List databases")
+    @Operation(summary = "List databases",
+            description = "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List of databases",
+                    headers = {@Header(name = "X-Count", description = "Number of databases", schema = @Schema(implementation = Long.class), required = true),
+                            @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)},
                     content = {@Content(
                             mediaType = "application/json",
                             array = @ArraySchema(schema = @Schema(implementation = DatabaseDto.class)))}),
@@ -101,7 +105,9 @@ public class DatabaseEndpoint {
     @Transactional(rollbackFor = Exception.class)
     @PreAuthorize("hasAuthority('create-database')")
     @Observed(name = "dbrepo_database_create")
-    @Operation(summary = "Create database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create database",
+            description = "Creates a database in the container with id. Requires roles `create-database`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created a new database",
@@ -152,10 +158,12 @@ public class DatabaseEndpoint {
     }
 
     @PutMapping("/{databaseId}/metadata/table")
-    @Transactional(rollbackFor = {SearchServiceException.class, SearchServiceConnectionException.class, DatabaseNotFoundException.class})
+    @Transactional(rollbackFor = {Exception.class})
     @PreAuthorize("hasAuthority('find-database')")
     @Observed(name = "dbrepo_tables_refresh")
-    @Operation(summary = "Refresh database tables metadata", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update database table schemas",
+            description = "Updates the database with id with generated metadata from tables that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Refreshed database tables metadata",
@@ -206,7 +214,9 @@ public class DatabaseEndpoint {
     @Transactional(rollbackFor = {SearchServiceException.class, SearchServiceConnectionException.class, DatabaseNotFoundException.class})
     @PreAuthorize("hasAuthority('find-database')")
     @Observed(name = "dbrepo_views_refresh")
-    @Operation(summary = "Refresh database views metadata", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update database view schemas",
+            description = "Updates the database with id with generated metadata from view that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Refreshed database views metadata",
@@ -252,13 +262,20 @@ public class DatabaseEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('modify-database-visibility')")
     @Observed(name = "dbrepo_database_visibility")
-    @Operation(summary = "Update database visibility", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update database visibility",
+            description = "Updates the database with id on the visibility. Only the database owner can perform this operation. Requires role `modify-database-visibility`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Visibility modified successfully",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = DatabaseDto.class))}),
+            @ApiResponse(responseCode = "400",
+                    description = "The visibility payload is malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "403",
                     description = "Visibility modification is not permitted",
                     content = {@Content(
@@ -299,13 +316,20 @@ public class DatabaseEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('modify-database-owner')")
     @Observed(name = "dbrepo_database_transfer")
-    @Operation(summary = "Update database owner", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update database owner",
+            description = "Updates the database with id on the owner. Only the database owner can perform this operation. Requires role `modify-database-owner`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Transfer of ownership was successful",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = DatabaseDto.class))}),
+            @ApiResponse(responseCode = "400",
+                    description = "Owner payload is malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
                     description = "Database or user could not be found",
                     content = {@Content(
@@ -349,7 +373,9 @@ public class DatabaseEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('modify-database-image')")
     @Observed(name = "dbrepo_database_image")
-    @Operation(summary = "Update database image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update database preview image",
+            description = "Updates the database with id on the preview image. Only the database owner can perform this operation. Requires role `modify-database-image`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Modify of image was successful",
@@ -407,7 +433,9 @@ public class DatabaseEndpoint {
     @GetMapping("/{databaseId}")
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_database_find")
-    @Operation(summary = "Find some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Find database",
+            description = "Finds a database with id.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Database found successfully",
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
index c1bf712840..781e5c44e8 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
@@ -1,6 +1,7 @@
 package at.tuwien.endpoints;
 
 import at.tuwien.api.database.query.QueryDto;
+import at.tuwien.api.database.table.columns.concepts.ConceptDto;
 import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.api.identifier.*;
 import at.tuwien.api.identifier.ld.LdDatasetDto;
@@ -22,6 +23,7 @@ import at.tuwien.utils.UserUtil;
 import at.tuwien.validation.EndpointValidator;
 import io.micrometer.observation.annotation.Observed;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -86,13 +88,16 @@ public class IdentifierEndpoint {
     @GetMapping(produces = {MediaType.APPLICATION_JSON_VALUE, "application/ld+json"})
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_identifier_list")
-    @Operation(summary = "Find all identifiers")
+    @Operation(summary = "List identifiers",
+            description = "Lists all identifiers known to the metadata database")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found identifiers successfully",
                     content = {
-                            @Content(mediaType = "application/json", schema = @Schema(implementation = IdentifierDto[].class)),
-                            @Content(mediaType = "application/ld+json", schema = @Schema(implementation = LdDatasetDto[].class))
+                            @Content(mediaType = "application/json",
+                                    array = @ArraySchema(schema = @Schema(implementation = ConceptDto.class))),
+                            @Content(mediaType = "application/ld+json",
+                                    array = @ArraySchema(schema = @Schema(implementation = LdDatasetDto.class)))
                     }),
             @ApiResponse(responseCode = "406",
                     description = "Identifier could not be exported, the requested style is not known",
@@ -104,7 +109,8 @@ public class IdentifierEndpoint {
                                      @Valid @RequestParam(value = "qid", required = false) Long qid,
                                      @Valid @RequestParam(value = "vid", required = false) Long vid,
                                      @Valid @RequestParam(value = "tid", required = false) Long tid,
-                                     @RequestHeader(HttpHeaders.ACCEPT) String accept) throws FormatNotAvailableException {
+                                     @RequestHeader(HttpHeaders.ACCEPT) String accept)
+            throws FormatNotAvailableException {
         log.debug("endpoint find identifiers, dbid={}, qid={}, vid={}, tid={}, accept={}", dbid, qid, vid, tid, accept);
         final List<Identifier> identifiers = identifierService.findAll()
                 .stream()
@@ -141,7 +147,8 @@ public class IdentifierEndpoint {
             "text/bibliography; style=ieee", "text/bibliography; style=bibtex"})
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_identifier_find")
-    @Operation(summary = "Find some identifier")
+    @Operation(summary = "Find identifier",
+            description = "Finds an identifier with id. The response format depends on the HTTP `Accept` header set on the request.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found identifier successfully",
@@ -265,7 +272,9 @@ public class IdentifierEndpoint {
     @Transactional
     @Observed(name = "dbrepo_identifier_delete")
     @PreAuthorize("hasAuthority('delete-identifier')")
-    @Operation(summary = "Delete some identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete identifier",
+            description = "Deletes an identifier with id. Requires role `delete-identifier`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Deleted identifier"),
@@ -290,7 +299,7 @@ public class IdentifierEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("identifierId") Long identifierId)
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("identifierId") Long identifierId)
             throws IdentifierNotFoundException, NotAllowedException, ServiceException, ServiceConnectionException,
             DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException {
         log.debug("endpoint delete identifier, identifierId={}", identifierId);
@@ -300,7 +309,6 @@ public class IdentifierEndpoint {
             throw new NotAllowedException("Failed to delete identifier: already published");
         }
         identifierService.delete(identifier);
-        log.info("Deleted identifier with pid: {}", identifierId);
         return ResponseEntity.accepted()
                 .build();
     }
@@ -309,7 +317,9 @@ public class IdentifierEndpoint {
     @Transactional
     @Observed(name = "dbrepo_identifier_publish")
     @PreAuthorize("hasAuthority('publish-identifier')")
-    @Operation(summary = "Publish identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Publish identifier",
+            description = "Publishes an identifier with id. A published identifier cannot be changed anymore. Requires role `publish-identifier`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Published identifier",
@@ -331,11 +341,6 @@ public class IdentifierEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "405",
-                    description = "Creating identifier not permitted",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "502",
                     description = "Connection to search service failed",
                     content = {@Content(
@@ -351,7 +356,7 @@ public class IdentifierEndpoint {
             throws SearchServiceException, DatabaseNotFoundException, SearchServiceConnectionException,
             MalformedException, ServiceConnectionException, IdentifierNotFoundException {
         log.debug("endpoint publish identifier, identifierId={}", identifierId);
-        final Identifier identifier = identifierService.find(identifierId);
+        identifierService.find(identifierId);
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(metadataMapper.identifierToIdentifierDto(identifierService.publish(identifierId)));
     }
@@ -360,7 +365,9 @@ public class IdentifierEndpoint {
     @Transactional(rollbackFor = {Exception.class})
     @Observed(name = "dbrepo_identifier_save")
     @PreAuthorize("hasAuthority('create-identifier') or hasAuthority('create-foreign-identifier')")
-    @Operation(summary = "Save identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Save identifier",
+            description = "Saves an identifier with id as a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Saved identifier",
@@ -382,11 +389,6 @@ public class IdentifierEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "405",
-                    description = "Creating identifier not permitted",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "502",
                     description = "Connection to search service failed",
                     content = {@Content(
@@ -485,7 +487,9 @@ public class IdentifierEndpoint {
     @Transactional(rollbackFor = {Exception.class})
     @Observed(name = "dbrepo_identifier_create")
     @PreAuthorize("hasAuthority('create-identifier') or hasAuthority('create-foreign-identifier')")
-    @Operation(summary = "Draft identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create identifier",
+            description = "Create an identifier with id to create a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Drafted identifier",
@@ -507,11 +511,6 @@ public class IdentifierEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "405",
-                    description = "Creating identifier not permitted",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "502",
                     description = "Connection to search service failed",
                     content = {@Content(
@@ -532,10 +531,9 @@ public class IdentifierEndpoint {
         final Database database = databaseService.findById(data.getDatabaseId());
         final User user = userService.findByUsername(principal.getName());
         /* check access */
-        DatabaseAccess access = null;
         try {
-            access = accessService.find(database, user);
-            log.trace("found access: {}", access);
+            final DatabaseAccess access = accessService.find(database, user);
+            log.trace("found access: {}", access.getType());
         } catch (AccessNotFoundException e) {
             if (!UserUtil.hasRole(principal, "create-foreign-identifier")) {
                 log.error("Failed to create identifier: insufficient role");
@@ -549,7 +547,8 @@ public class IdentifierEndpoint {
 
     @GetMapping("/retrieve")
     @Observed(name = "dbrepo_identifier_retrieve")
-    @Operation(summary = "Retrieve metadata from identifier")
+    @Operation(summary = "Retrieve PID metadata",
+            description = "Retrieves Persistent Identifier (PID) metadata from external endpoints. Supported PIDs are: ORCID, ROR, DOI.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Retrieved metadata from identifier",
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java
index d295cc7a11..088dc2981b 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java
@@ -52,13 +52,14 @@ public class ImageEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_image_findall")
-    @Operation(summary = "Find all images")
+    @Operation(summary = "List images",
+            description = "Lists all container images known to the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List images",
                     content = {@Content(
                             mediaType = "application/json",
-                            array = @ArraySchema(schema = @Schema(implementation = ContainerImage.class)))}),
+                            array = @ArraySchema(schema = @Schema(implementation = ImageBriefDto.class)))}),
     })
     public ResponseEntity<List<ImageBriefDto>> findAll() {
         log.debug("endpoint find all images");
@@ -66,14 +67,16 @@ public class ImageEndpoint {
         return ResponseEntity.ok()
                 .body(containers.stream()
                         .map(metadataMapper::containerImageToImageBriefDto)
-                        .collect(Collectors.toList()));
+                        .toList());
     }
 
     @PostMapping
     @Transactional
     @Observed(name = "dbrepo_image_create")
     @PreAuthorize("hasAuthority('create-image')")
-    @Operation(summary = "Create image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create image",
+            description = "Creates a container image in the metadata database. Requires role `create-image`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created image",
@@ -109,7 +112,8 @@ public class ImageEndpoint {
     @GetMapping("/{imageId}")
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_image_find")
-    @Operation(summary = "Find some image")
+    @Operation(summary = "Find image",
+            description = "Finds a container image in the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found image",
@@ -135,7 +139,9 @@ public class ImageEndpoint {
     @Transactional
     @Observed(name = "dbrepo_image_update")
     @PreAuthorize("hasAuthority('modify-image')")
-    @Operation(summary = "Update some image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update image",
+            description = "Updates container image in the metadata database. Requires role `modify-image`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Updated image successfully",
@@ -164,7 +170,9 @@ public class ImageEndpoint {
     @Transactional
     @Observed(name = "dbrepo_image_delete")
     @PreAuthorize("hasAuthority('delete-image')")
-    @Operation(summary = "Delete some image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete image",
+            description = "Deletes a container image in the metadata database. Requires role `delete-image`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Deleted image successfully",
@@ -175,7 +183,7 @@ public class ImageEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("imageId") Long imageId) throws ImageNotFoundException {
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("imageId") Long imageId) throws ImageNotFoundException {
         log.debug("endpoint delete image, id={}", imageId);
         final ContainerImage image = imageService.find(imageId);
         imageService.delete(image);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java
index e2b47905c9..75998b03a5 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java
@@ -41,21 +41,21 @@ public class LicenseEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_license_findall")
-    @Operation(summary = "Get all licenses")
+    @Operation(summary = "List licenses",
+            description = "Lists licenses known to the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List of licenses",
                     content = {@Content(
                             mediaType = "application/json",
-                            array = @ArraySchema(schema = @Schema(implementation = LicenseDto[].class)))}),
+                            array = @ArraySchema(schema = @Schema(implementation = LicenseDto.class)))}),
     })
     public ResponseEntity<List<LicenseDto>> list() {
         log.debug("endpoint list licenses");
         final List<LicenseDto> licenses = licenseService.findAll()
                 .stream()
                 .map(metadataMapper::licenseToLicenseDto)
-                .collect(Collectors.toList());
-        log.trace("list licenses resulted in licenses {}", licenses);
+                .toList();
         return ResponseEntity.status(HttpStatus.OK)
                 .body(licenses);
     }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java
index 62677967b0..0a1cddf5df 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java
@@ -45,7 +45,8 @@ public class MessageEndpoint {
 
     @GetMapping
     @Observed(name = "dbrepo_maintenance_findall")
-    @Operation(summary = "Find maintenance messages")
+    @Operation(summary = "List messages",
+            description = "Lists messages known to the metadata database. Messages can be filtered be filtered with the optional `active` parameter. If set to *true*, only active messages (that is, messages whose end time has not been reached) will be returned. Otherwise only inactive messages are returned. If not set, active and inactive messages are returned.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List messages",
@@ -53,10 +54,10 @@ public class MessageEndpoint {
                             mediaType = "application/json",
                             array = @ArraySchema(schema = @Schema(implementation = BannerMessageDto.class)))}),
     })
-    public ResponseEntity<List<BannerMessageDto>> list(@RequestParam(required = false) String filter) {
-        log.debug("endpoint list active maintenance messages");
+    public ResponseEntity<List<BannerMessageDto>> list(@RequestParam(required = false) Boolean active) {
+        log.debug("endpoint list messages, active={}", active);
         List<BannerMessageDto> dtos;
-        if (filter.equals("active")) {
+        if (active != null && active) {
             dtos = bannerMessageService.getActive()
                     .stream()
                     .map(metadataMapper::bannerMessageToBannerMessageDto)
@@ -67,13 +68,14 @@ public class MessageEndpoint {
                     .map(metadataMapper::bannerMessageToBannerMessageDto)
                     .toList();
         }
-        log.trace("list maintenance messages results in dtos {}", dtos);
+        log.info("List messages resulted in {} message(s)", dtos.size());
         return ResponseEntity.ok(dtos);
     }
 
     @GetMapping("/message/{messageId}")
     @Observed(name = "dbrepo_maintenance_find")
-    @Operation(summary = "Find one maintenance message")
+    @Operation(summary = "Find message",
+            description = "Finds a message with id in the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Get messages",
@@ -88,16 +90,17 @@ public class MessageEndpoint {
     })
     public ResponseEntity<BannerMessageDto> find(@NotNull @PathVariable("messageId") Long messageId)
             throws MessageNotFoundException {
-        log.debug("endpoint find one maintenance messages");
+        log.debug("endpoint find one maintenance message, messageId={}", messageId);
         final BannerMessageDto dto = metadataMapper.bannerMessageToBannerMessageDto(bannerMessageService.find(messageId));
-        log.trace("find one maintenance message results in dto {}", dto);
         return ResponseEntity.ok(dto);
     }
 
     @PostMapping
     @Observed(name = "dbrepo_maintenance_create")
-    @Operation(summary = "Create maintenance message", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @PreAuthorize("hasAuthority('create-maintenance-message')")
+    @Operation(summary = "Create message",
+            description = "Creates a message in the metadata database. Requires role `create-maintenance-message`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created message",
@@ -115,8 +118,10 @@ public class MessageEndpoint {
 
     @PutMapping("/{messageId}")
     @Observed(name = "dbrepo_maintenance_update")
-    @Operation(summary = "Update maintenance message", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @PreAuthorize("hasAuthority('update-maintenance-message')")
+    @Operation(summary = "Update message",
+            description = "Updates a message with id. Requires role `update-maintenance-message`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Updated message",
@@ -142,8 +147,10 @@ public class MessageEndpoint {
 
     @DeleteMapping("/{messageId}")
     @Observed(name = "dbrepo_maintenance_delete")
-    @Operation(summary = "Delete maintenance message", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @PreAuthorize("hasAuthority('delete-maintenance-message')")
+    @Operation(summary = "Delete message",
+            description = "Deletes a message with id. Requires role `delete-maintenance-message`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Deleted message",
@@ -154,7 +161,8 @@ public class MessageEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("messageId") Long messageId) throws MessageNotFoundException {
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("messageId") Long messageId)
+            throws MessageNotFoundException {
         log.debug("endpoint delete maintenance message, messageId={}", messageId);
         final BannerMessage message = bannerMessageService.find(messageId);
         bannerMessageService.delete(message);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java
index 18bf1c3e62..462ca9df97 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java
@@ -44,7 +44,7 @@ public class MetadataEndpoint {
             @ExampleObject(value = "ListMetadataFormats"),
     })
     @Observed(name = "dbrepo_oai_identify")
-    @Operation(summary = "Identify the repository")
+    @Operation(summary = "Identify repository")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List containers",
@@ -57,7 +57,7 @@ public class MetadataEndpoint {
 
     @GetMapping(params = "verb=Identify", produces = MediaType.TEXT_XML_VALUE)
     @Observed(name = "dbrepo_oai_identify")
-    @Operation(summary = "Identify the repository")
+    @Operation(summary = "Identify repository")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List containers",
@@ -72,7 +72,7 @@ public class MetadataEndpoint {
 
     @GetMapping(params = "verb=ListIdentifiers", produces = MediaType.TEXT_XML_VALUE)
     @Observed(name = "dbrepo_oai_identifiers_list")
-    @Operation(summary = "List the identifiers")
+    @Operation(summary = "List identifiers")
     public ResponseEntity<String> listIdentifiers(OaiListIdentifiersParameters parameters) {
         log.debug("endpoint list identifiers, verb=ListIdentifiers, parameters={}", parameters);
         final String xml = metadataService.listIdentifiers(parameters);
@@ -82,7 +82,7 @@ public class MetadataEndpoint {
 
     @GetMapping(params = "verb=GetRecord", produces = MediaType.TEXT_XML_VALUE)
     @Observed(name = "dbrepo_oai_record_get")
-    @Operation(summary = "Get the record")
+    @Operation(summary = "Get record")
     public ResponseEntity<String> getRecord(OaiRecordParameters parameters) {
         log.debug("endpoint get record, verb=GetRecord, parameters={}", parameters);
         final List<String> supportedMetadataFormats = List.of("oai_dc", "oai_datacite");
@@ -117,7 +117,7 @@ public class MetadataEndpoint {
 
     @GetMapping(params = "verb=ListMetadataFormats", produces = MediaType.TEXT_XML_VALUE)
     @Observed(name = "dbrepo_oai_metadataformats_list")
-    @Operation(summary = "List the metadata formats")
+    @Operation(summary = "List metadata formats")
     public ResponseEntity<String> listMetadataFormats() {
         log.debug("endpoint list metadata formats, verb=ListMetadataFormats");
         final String xml = metadataService.listMetadataFormats();
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java
index 8d626db323..cd17c7ac0b 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java
@@ -39,7 +39,7 @@ public class OntologyEndpoint {
     private final OntologyService ontologyService;
 
     @Autowired
-    public OntologyEndpoint(EntityService entityService, MetadataMapper metadataMapper, 
+    public OntologyEndpoint(EntityService entityService, MetadataMapper metadataMapper,
                             OntologyService ontologyService) {
         this.entityService = entityService;
         this.metadataMapper = metadataMapper;
@@ -48,13 +48,14 @@ public class OntologyEndpoint {
 
     @GetMapping
     @Observed(name = "dbrepo_ontologies_findall")
-    @Operation(summary = "List all ontologies")
+    @Operation(summary = "List ontologies",
+            description = "Lists all ontologies known to the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
-                    description = "List all ontologies",
+                    description = "List ontologies",
                     content = {@Content(
                             mediaType = "application/json",
-                            array = @ArraySchema(schema = @Schema(implementation = OntologyDto.class)))}),
+                            array = @ArraySchema(schema = @Schema(implementation = OntologyBriefDto.class)))}),
     })
     public ResponseEntity<List<OntologyBriefDto>> findAll() {
         log.debug("endpoint find all ontologies");
@@ -62,13 +63,13 @@ public class OntologyEndpoint {
                 .stream()
                 .map(metadataMapper::ontologyToOntologyBriefDto)
                 .toList();
-        log.trace("create ontology resulted in dtos {}", dtos);
         return ResponseEntity.ok(dtos);
     }
 
     @GetMapping("/{ontologyId}")
     @Observed(name = "dbrepo_ontologies_find")
-    @Operation(summary = "Find one ontology")
+    @Operation(summary = "Find ontology",
+            description = "Finds an ontology with id in the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Find one ontology",
@@ -85,14 +86,15 @@ public class OntologyEndpoint {
             throws OntologyNotFoundException {
         log.debug("endpoint find all ontologies, ontologyId={}", ontologyId);
         final OntologyDto dto = metadataMapper.ontologyToOntologyDto(ontologyService.find(ontologyId));
-        log.trace("create ontology resulted in dto {}", dto);
         return ResponseEntity.ok(dto);
     }
 
     @PostMapping
     @PreAuthorize("hasAuthority('create-ontology')")
     @Observed(name = "dbrepo_ontologies_create")
-    @Operation(summary = "Register a new ontology", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create ontology",
+            description = "Creates an ontology in the metadata database. Requires role `create-ontology`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Registered ontology successfully",
@@ -104,7 +106,6 @@ public class OntologyEndpoint {
                                               @NotNull Principal principal) {
         log.debug("endpoint create ontology, data={}", data);
         final OntologyDto dto = metadataMapper.ontologyToOntologyDto(ontologyService.create(data, principal));
-        log.trace("create ontology resulted in dto {}", dto);
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(dto);
     }
@@ -112,7 +113,9 @@ public class OntologyEndpoint {
     @PutMapping("/{ontologyId}")
     @PreAuthorize("hasAuthority('update-ontology')")
     @Observed(name = "dbrepo_ontologies_update")
-    @Operation(summary = "Update an ontology", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update ontology",
+            description = "Updates an ontology with id. Requires role `update-ontology`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Updated ontology successfully",
@@ -131,7 +134,6 @@ public class OntologyEndpoint {
         log.debug("endpoint update ontology, data={}", data);
         final Ontology ontology = ontologyService.find(ontologyId);
         final OntologyDto dto = metadataMapper.ontologyToOntologyDto(ontologyService.update(ontology, data));
-        log.trace("update ontology resulted in dto {}", dto);
         return ResponseEntity.accepted()
                 .body(dto);
     }
@@ -139,7 +141,9 @@ public class OntologyEndpoint {
     @DeleteMapping("/{ontologyId}")
     @PreAuthorize("hasAuthority('delete-ontology')")
     @Observed(name = "dbrepo_ontologies_delete")
-    @Operation(summary = "Delete an ontology", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete ontology",
+            description = "Deletes an ontology with given id. Requires role `delete-ontology`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Deleted ontology successfully",
@@ -151,7 +155,7 @@ public class OntologyEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("ontologyId") Long ontologyId)
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("ontologyId") Long ontologyId)
             throws OntologyNotFoundException {
         log.debug("endpoint delete ontology, ontologyId={}", ontologyId);
         final Ontology ontology = ontologyService.find(ontologyId);
@@ -163,7 +167,9 @@ public class OntologyEndpoint {
     @GetMapping("/{ontologyId}/entity")
     @PreAuthorize("hasAuthority('execute-semantic-query')")
     @Observed(name = "dbrepo_ontologies_entities_find")
-    @Operation(summary = "Find entities", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Find entities",
+            description = "Finds semantic entities by label or uri in an ontology with id. Requires role `execute-semantic-query`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found entities",
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index c87b4039c1..0577ef7232 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -77,7 +77,9 @@ public class TableEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_tables_findall")
-    @Operation(summary = "List all tables", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "List tables",
+            description = "Lists all tables known to the metadata database.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List tables",
@@ -114,13 +116,15 @@ public class TableEndpoint {
     @Transactional(readOnly = true)
     @PreAuthorize("hasAuthority('table-semantic-analyse')")
     @Observed(name = "dbrepo_semantic_table_analyse")
-    @Operation(summary = "Suggest table semantics", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Suggest semantics",
+            description = "Suggests semantic concepts for a table. Requires role `table-semantic-analyse`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Suggested table semantics successfully",
                     content = {@Content(
                             mediaType = "application/json",
-                            array = @ArraySchema(schema = @Schema(implementation = TableColumnEntityDto.class)))}),
+                            array = @ArraySchema(schema = @Schema(implementation = EntityDto.class)))}),
             @ApiResponse(responseCode = "400",
                     description = "Failed to parse statistic in search service",
                     content = {@Content(
@@ -148,7 +152,6 @@ public class TableEndpoint {
         log.debug("endpoint analyse table semantics, databaseId={}, tableId={}", databaseId, tableId);
         final Table table = tableService.findById(databaseId, tableId);
         final List<EntityDto> dtos = entityService.suggestByTable(table);
-        log.trace("analyse table semantics resulted in dtos {}", dtos);
         return ResponseEntity.ok()
                 .body(dtos);
     }
@@ -157,7 +160,9 @@ public class TableEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('update-table-statistic') or hasAuthority('admin')")
     @Observed(name = "dbrepo_statistic_table_update")
-    @Operation(summary = "Update table statistics", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update statistics",
+            description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. Requires role `update-table-statistic`",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Updated table statistics successfully"),
@@ -197,7 +202,9 @@ public class TableEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('modify-table-column-semantics') or hasAuthority('modify-foreign-table-column-semantics')")
     @Observed(name = "dbrepo_semantics_column_save")
-    @Operation(summary = "Update a table column semantic mapping", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update semantics",
+            description = "Updates column semantics of a table column with id. Only the table owner with at least *READ* access to the associated database can update the column semantics (requires role `modify-table-column-semantics`) or foreign table columns if role `modify-foreign-table-column-semantics`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Updated column semantics successfully",
@@ -258,7 +265,9 @@ public class TableEndpoint {
     @Transactional(readOnly = true)
     @PreAuthorize("hasAuthority('table-semantic-analyse')")
     @Observed(name = "dbrepo_semantic_column_analyse")
-    @Operation(summary = "Suggest table column semantics", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Suggest semantics",
+            description = "Suggests column semantics. Requires role `table-semantic-analyse`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Suggested table column semantics successfully",
@@ -289,16 +298,17 @@ public class TableEndpoint {
         final Table table = tableService.findById(databaseId, tableId);
         TableColumn column = tableService.findColumnById(table, columnId);
         final List<TableColumnEntityDto> dtos = entityService.suggestByColumn(column);
-        log.trace("analyse table semantics resulted in dtos {}", dtos);
         return ResponseEntity.ok()
                 .body(dtos);
     }
 
     @PostMapping
-    @Transactional(rollbackFor = {ServiceConnectionException.class, DatabaseNotFoundException.class, ServiceException.class})
+    @Transactional(rollbackFor = {Exception.class})
     @PreAuthorize("hasAuthority('create-table')")
     @Observed(name = "dbrepo_table_create")
-    @Operation(summary = "Create a table", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create table",
+            description = "Creates a table in the database with id. Requires role `create-table`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created a new table",
@@ -357,7 +367,7 @@ public class TableEndpoint {
         }
         final Table table = tableService.createTable(database, data, principal);
         final TableDto dto = metadataMapper.customTableToTableDto(table);
-        log.debug("create table resulted in table.id={}", dto.getId());
+        log.info("Created table with id {}", dto.getId());
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(dto);
     }
@@ -365,7 +375,9 @@ public class TableEndpoint {
     @GetMapping("/{tableId}")
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_tables_find")
-    @Operation(summary = "Get information about table", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Find table",
+            description = "Finds a table with id.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Find table successfully",
@@ -383,12 +395,12 @@ public class TableEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "502",
-                    description = "Connection to search service failed",
+                    description = "Failed to establish connection with broker service",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "503",
-                    description = "Failed to save in search service",
+                    description = "Failed to obtain queue information from broker service",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -418,7 +430,6 @@ public class TableEndpoint {
                 headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-Sidecar-Host X-Sidecar-Port");
             }
         }
-        log.trace("find table resulted in table {}", dto);
         return ResponseEntity.status(HttpStatus.OK)
                 .headers(headers)
                 .body(dto);
@@ -428,11 +439,12 @@ public class TableEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('delete-table') or hasAuthority('delete-foreign-table')")
     @Observed(name = "dbrepo_table_delete")
-    @Operation(summary = "Delete a table", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete table",
+            description = "Deletes a table with id. Only the owner of a table can perform this action (requires role `delete-table`) or anyone can delete a table (requires role `delete-foreign-table`).",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Delete table successfully",
-                    content = {@Content}),
+                    description = "Delete table successfully"),
             @ApiResponse(responseCode = "400",
                     description = "Delete table query resulted in an invalid query statement",
                     content = {@Content(
@@ -459,9 +471,9 @@ public class TableEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId,
-                                    @NotNull @PathVariable("tableId") Long tableId,
-                                    @NotNull Principal principal) throws NotAllowedException,
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("databaseId") Long databaseId,
+                                       @NotNull @PathVariable("tableId") Long tableId,
+                                       @NotNull Principal principal) throws NotAllowedException,
             ServiceException, ServiceConnectionException, TableNotFoundException, DatabaseNotFoundException,
             SearchServiceException, SearchServiceConnectionException {
         log.debug("endpoint delete table, databaseId={}, tableId={}", databaseId, tableId);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java
index 71dfa78cef..c992f151b5 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java
@@ -36,7 +36,8 @@ public class UnitEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_semantic_units_findall")
-    @Operation(summary = "List semantic units")
+    @Operation(summary = "List units",
+            description = "Lists units known to the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Find all semantic units",
@@ -50,7 +51,6 @@ public class UnitEndpoint {
                 .stream()
                 .map(metadataMapper::tableColumnUnitToUnitDto)
                 .toList();
-        log.trace("Find all units resulted in dtos {}", dtos);
         return ResponseEntity.ok()
                 .body(dtos);
     }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
index fb9ddc0096..1ca013ac2c 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java
@@ -59,7 +59,8 @@ public class UserEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_users_list")
-    @Operation(summary = "Find all users")
+    @Operation(summary = "List users",
+            description = "Lists users known to the metadata database.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "List users",
@@ -73,21 +74,21 @@ public class UserEndpoint {
                 .stream()
                 .map(userMapper::userToUserBriefDto)
                 .toList();
-        log.trace("find all users resulted in users {}", users);
         return ResponseEntity.ok(users);
     }
 
     @PostMapping
-    @Transactional(rollbackFor = {ServiceException.class, ServiceConnectionException.class})
+    @Transactional(rollbackFor = {Exception.class})
     @PreAuthorize("!isAuthenticated()")
     @Observed(name = "dbrepo_user_create")
-    @Operation(summary = "Create user")
+    @Operation(summary = "Create user",
+            description = "Creates a user in the auth service and metadata database. Requires that no credentials are sent in the request.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Created user",
                     content = {@Content(
                             mediaType = "application/json",
-                            schema = @Schema(implementation = UserBriefDto.class))}),
+                            schema = @Schema(implementation = UserDto.class))}),
             @ApiResponse(responseCode = "400",
                     description = "Parameters are not well-formed (likely email)",
                     content = {@Content(mediaType = "application/json")}),
@@ -117,30 +118,35 @@ public class UserEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody SignupRequestDto data)
+    public ResponseEntity<UserDto> create(@NotNull @Valid @RequestBody SignupRequestDto data)
             throws UserExistsException, EmailExistsException, ServiceException, ServiceConnectionException,
             UserNotFoundException {
-        log.debug("endpoint create a user, data.username={}", data.getUsername());
+        log.debug("endpoint create user, data.username={}", data.getUsername());
         userService.validateUsernameNotExists(data.getUsername());
         userService.validateEmailNotExists(data.getEmail());
         authenticationService.create(data);
         final at.tuwien.api.keycloak.UserDto keycloakUserDto = authenticationService.findByUsername(data.getUsername());
         final User user = userService.create(data, keycloakUserDto.getId());
-        final UserBriefDto dto = userMapper.userToUserBriefDto(user);
-        log.trace("create user resulted in dto {}", dto);
+        log.info("Created user with id: {}", user.getId());
         return ResponseEntity.status(HttpStatus.CREATED)
-                .body(dto);
+                .body(userMapper.userToUserDto(user));
     }
 
     @PostMapping("/token")
     @Observed(name = "dbrepo_user_token")
-    @Operation(summary = "Obtain user token")
+    @Operation(summary = "Create token",
+            description = "Creates a user token via the auth service.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Obtained user token",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = TokenDto.class))}),
+            @ApiResponse(responseCode = "400",
+                    description = "Invalid login request",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "403",
                     description = "Not allowed to get token",
                     content = {@Content(
@@ -192,18 +198,24 @@ public class UserEndpoint {
 
     @PutMapping("/token")
     @Observed(name = "dbrepo_user_refresh_token")
-    @Operation(summary = "Refresh user token")
+    @Operation(summary = "Refresh token",
+            description = "Refreshes user token by refresh token.")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Refreshed user token",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = TokenDto.class))}),
-            @ApiResponse(responseCode = "403",
+            @ApiResponse(responseCode = "400",
                     description = "Invalid refresh token",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "403",
+                    description = "Not allowed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "502",
                     description = "Connection to auth service failed",
                     content = {@Content(
@@ -223,7 +235,9 @@ public class UserEndpoint {
     @Transactional(readOnly = true)
     @PreAuthorize("isAuthenticated()")
     @Observed(name = "dbrepo_user_find")
-    @Operation(summary = "Get a user info", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Get user",
+            description = "Gets user with id from the metadata database. Requires authentication.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Found user",
@@ -262,7 +276,9 @@ public class UserEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('modify-user-information')")
     @Observed(name = "dbrepo_user_modify")
-    @Operation(summary = "Modify user information", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update user",
+            description = "Updates user with id. Requires role `modify-user-information`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
                     description = "Modified user information",
@@ -305,13 +321,17 @@ public class UserEndpoint {
     @Transactional
     @PreAuthorize("isAuthenticated()")
     @Observed(name = "dbrepo_user_password_modify")
-    @Operation(summary = "Modify user password", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Update user password",
+            description = "Updates password of user with id. Requires authentication.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Modified user password",
+                    description = "Modified user password"),
+            @ApiResponse(responseCode = "400",
+                    description = "Invalid password payload",
                     content = {@Content(
                             mediaType = "application/json",
-                            schema = @Schema(implementation = UserDto.class))}),
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "403",
                     description = "Not allowed to change foreign user password",
                     content = {@Content(
@@ -333,7 +353,7 @@ public class UserEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> password(@NotNull @PathVariable("userId") UUID userId,
+    public ResponseEntity<Void> password(@NotNull @PathVariable("userId") UUID userId,
                                       @NotNull @Valid @RequestBody UserPasswordDto data,
                                       @NotNull Principal principal) throws NotAllowedException, ServiceException,
             ServiceConnectionException, UserNotFoundException, DatabaseNotFoundException {
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
index 701e3172fb..775b117bc3 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
@@ -59,7 +59,9 @@ public class ViewEndpoint {
     @GetMapping
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_views_findall")
-    @Operation(summary = "Find all views", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "List views",
+            description = "Lists views known to the metadata database.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Find views successfully",
@@ -90,7 +92,9 @@ public class ViewEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('create-database-view')")
     @Observed(name = "dbrepo_view_create")
-    @Operation(summary = "Create a view", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Create view",
+            description = "Creates a view. Requires role `create-database-view`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
                     description = "Create view successfully",
@@ -102,11 +106,6 @@ public class ViewEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "401",
-                    description = "Credentials missing",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "403",
                     description = "Credentials missing",
                     content = {@Content(
@@ -117,11 +116,6 @@ public class ViewEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "405",
-                    description = "Create view is not permitted",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "423",
                     description = "Create view resulted in an invalid query statement",
                     content = {@Content(
@@ -161,7 +155,9 @@ public class ViewEndpoint {
     @GetMapping("/{viewId}")
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_view_find")
-    @Operation(summary = "Find one view", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Get view",
+            description = "Gets a view with id in the metadata database.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200",
                     description = "Find view successfully",
@@ -208,11 +204,12 @@ public class ViewEndpoint {
     @Transactional
     @PreAuthorize("hasAuthority('delete-database-view')")
     @Observed(name = "dbrepo_view_delete")
-    @Operation(summary = "Delete one view", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @Operation(summary = "Delete view",
+            description = "Deletes a view with id. Requires role `delete-database-view`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
-                    description = "Delete view successfully",
-                    content = {@Content}),
+                    description = "Delete view successfully"),
             @ApiResponse(responseCode = "400",
                     description = "Delete view query is malformed",
                     content = {@Content(
@@ -228,11 +225,6 @@ public class ViewEndpoint {
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
-            @ApiResponse(responseCode = "405",
-                    description = "Delete view is not permitted",
-                    content = {@Content(
-                            mediaType = "application/json",
-                            schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "423",
                     description = "Delete view resulted in an invalid query statement",
                     content = {@Content(
@@ -249,7 +241,7 @@ public class ViewEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId,
+    public ResponseEntity<View> delete(@NotNull @PathVariable("databaseId") Long databaseId,
                                     @NotNull @PathVariable("viewId") Long viewId,
                                     @NotNull Principal principal) throws NotAllowedException, ServiceException,
             ServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException,
diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
index 3312af7c5a..87987f76bc 100644
--- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
+++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
@@ -13,6 +13,7 @@ spring:
         default_schema: fda
         jdbc:
           time_zone: UTC
+        format_sql: false
   application:
     name: metadata-service
   rabbitmq:
@@ -43,6 +44,7 @@ logging:
     root: warn
     at.tuwien.: trace
     org.springframework.security.web.FilterChainProxy: debug
+#    org.hibernate.resource.jdbc: trace
     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
 dbrepo:
   repository-name: Database Repository
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java
index 0444a76690..16c212a546 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/AccessEndpointUnitTest.java
@@ -78,9 +78,8 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
             SearchServiceConnectionException {
 
         /* mock */
-        doNothing()
-                .when(accessService)
-                .create(eq(DATABASE_1), eq(USER_2), any(AccessTypeDto.class));
+        when(accessService.create(eq(DATABASE_1), eq(USER_2), any(AccessTypeDto.class)))
+                .thenReturn(DATABASE_1_USER_1_READ_ACCESS);
 
         /* test */
         generic_create(USER_2_PRINCIPAL, USER_2_ID, USER_2_USERNAME, USER_2);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java
index 1296346660..cb230377f3 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java
@@ -239,7 +239,7 @@ public class ContainerEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(CONTAINER_1);
 
         /* test */
-        final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(data);
+        final ResponseEntity<ContainerDto> response = containerEndpoint.create(data);
         assertEquals(HttpStatus.CREATED, response.getStatusCode());
         assertNotNull(response.getBody());
     }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MaintenanceEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java
similarity index 91%
rename from dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MaintenanceEndpointUnitTest.java
rename to dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java
index b05e32e92e..cea67bc510 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MaintenanceEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MessageEndpointUnitTest.java
@@ -27,13 +27,13 @@ import static org.mockito.Mockito.*;
 @Log4j2
 @SpringBootTest
 @ExtendWith(SpringExtension.class)
-public class MaintenanceEndpointUnitTest extends AbstractUnitTest {
+public class MessageEndpointUnitTest extends AbstractUnitTest {
 
     @MockBean
     private BannerMessageService bannerMessageService;
 
     @Autowired
-    private MessageEndpoint maintenanceEndpoint;
+    private MessageEndpoint messageEndpoint;
 
     @Test
     @WithAnonymousUser
@@ -198,7 +198,7 @@ public class MaintenanceEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(BANNER_MESSAGE_1, BANNER_MESSAGE_2));
 
         /* test */
-        final ResponseEntity<List<BannerMessageDto>> response = maintenanceEndpoint.list("");
+        final ResponseEntity<List<BannerMessageDto>> response = messageEndpoint.list(null);
         assertEquals(HttpStatus.OK, response.getStatusCode());
         assertNotNull(response.getBody());
     }
@@ -216,7 +216,7 @@ public class MaintenanceEndpointUnitTest extends AbstractUnitTest {
         }
 
         /* test */
-        final ResponseEntity<BannerMessageDto> response = maintenanceEndpoint.find(messageId);
+        final ResponseEntity<BannerMessageDto> response = messageEndpoint.find(messageId);
         assertEquals(HttpStatus.OK, response.getStatusCode());
         assertNotNull(response.getBody());
     }
@@ -228,7 +228,7 @@ public class MaintenanceEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(message);
 
         /* test */
-        final ResponseEntity<BannerMessageDto> response = maintenanceEndpoint.create(data);
+        final ResponseEntity<BannerMessageDto> response = messageEndpoint.create(data);
         assertEquals(HttpStatus.CREATED, response.getStatusCode());
         assertNotNull(response.getBody());
     }
@@ -243,7 +243,7 @@ public class MaintenanceEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(message);
 
         /* test */
-        final ResponseEntity<BannerMessageDto> response = maintenanceEndpoint.update(messageId, data);
+        final ResponseEntity<BannerMessageDto> response = messageEndpoint.update(messageId, data);
         assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
         assertNotNull(response.getBody());
     }
@@ -264,7 +264,7 @@ public class MaintenanceEndpointUnitTest extends AbstractUnitTest {
                 .delete(message);
 
         /* test */
-        final ResponseEntity<?> response = maintenanceEndpoint.delete(messageId);
+        final ResponseEntity<?> response = messageEndpoint.delete(messageId);
         assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
         assertNull(response.getBody());
     }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java
index b7db83d321..dfc2615b29 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java
@@ -259,9 +259,9 @@ public class UserEndpointUnitTest extends AbstractUnitTest {
                 .create(any(SignupRequestDto.class));
 
         /* test */
-        final ResponseEntity<UserBriefDto> response = userEndpoint.create(data);
+        final ResponseEntity<UserDto> response = userEndpoint.create(data);
         assertEquals(HttpStatus.CREATED, response.getStatusCode());
-        final UserBriefDto body = response.getBody();
+        final UserDto body = response.getBody();
         assertNotNull(body);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
index 28ab4ccb41..732c11124f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
@@ -284,15 +284,17 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
         assertEquals("fk_location", table1fk.getName());
         assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete());
         assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate());
-        assertEquals(TABLE_1_ID, table1fk.getTable().getId());
-        assertEquals(TABLE_2_ID, table1fk.getReferencedTable().getId());
+        assertEquals(TABLE_2_ID, table1fk.getTable().getId());
+        assertEquals(DATABASE_1_ID, table1fk.getTable().getDatabaseId());
+        assertEquals(TABLE_1_ID, table1fk.getReferencedTable().getId());
+        assertEquals(DATABASE_1_ID, table1fk.getReferencedTable().getDatabaseId());
         final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0);
         assertEquals(1L, table1fkr.getId());
         assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId());
-        assertEquals(TABLE_2_COLUMNS_DTO.get(2).getTable().getId(), table1fkr.getColumn().getTableId());
+        assertEquals(TABLE_2_COLUMNS_DTO.get(2).getTableId(), table1fkr.getColumn().getTableId());
         assertEquals(TABLE_2_COLUMNS_DTO.get(2).getDatabaseId(), table1fkr.getColumn().getDatabaseId());
-        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getDatabaseId(), table1fkr.getReferencedColumn().getId());
-        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getDatabaseId(), table1fkr.getReferencedColumn().getTableId());
+        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getId(), table1fkr.getReferencedColumn().getId());
+        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getTableId(), table1fkr.getReferencedColumn().getTableId());
         assertEquals(TABLE_1_COLUMNS_DTO.get(0).getDatabaseId(), table1fkr.getReferencedColumn().getDatabaseId());
         assertEquals(1, table1.getConstraints().getPrimaryKey().size());
         final PrimaryKeyDto table1pk = new ArrayList<>(table1.getConstraints().getPrimaryKey()).get(0);
@@ -396,10 +398,10 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
 
     public static Stream<Arguments> nameToInternalName_parameters() {
         return Stream.of(
-                Arguments.arguments("dash_minus", "OE/NO-027", "oeno-027"),
-                Arguments.arguments("percent", "OE%NO-027", "oeno-027"),
-                Arguments.arguments("umlaut", "OE/NÖ-027", "oeno-027"),
-                Arguments.arguments("dot", "OE.NO-027", "oeno-027")
+                Arguments.arguments("dash_minus", "OE/NO-027", "oe_no_027"),
+                Arguments.arguments("percent", "OE%NO-027", "oe_no_027"),
+                Arguments.arguments("umlaut", "OE/NÖ-027", "oe_no__027"),
+                Arguments.arguments("dot", "OE.NO-027", "oe_no_027")
         );
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
index 44b924f396..23aa393e9f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java
@@ -352,7 +352,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest {
 
         /* mock */
         try {
-            messageEndpoint.list("");
+            messageEndpoint.list(null);
         } catch (Exception e) {
             /* ignore */
         }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
index c16a4191f9..d32189f944 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
@@ -184,7 +184,7 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         assertTrue(column0.getAutoGenerated());
         final TableColumn column1 = response.getColumns().get(1);
         assertEquals("I Am Späshül", column1.getName());
-        assertEquals("i_am_spashul", column1.getInternalName());
+        assertEquals("i_am_spa_shu_l", column1.getInternalName());
         assertEquals(TableColumnType.TEXT, column1.getColumnType());
         assertTrue(column1.getIsNullAllowed());
         assertFalse(column1.getAutoGenerated());
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java
index a013a25ce1..d5a4d03092 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java
@@ -25,7 +25,7 @@ public interface AccessService {
      *
      * @param database The database.
      * @param user     The user.
-     * @return The database access.
+     * @return The database access, if successful.
      * @throws AccessNotFoundException The access was not found in the metadata database.
      */
     DatabaseAccess find(Database database, User user) throws AccessNotFoundException;
@@ -36,11 +36,12 @@ public interface AccessService {
      * @param database The database.
      * @param access   The access.
      * @param user     The user.
+     * @return The database access, if successful.
      * @throws ServiceException           The data service responded with unexpected behavior.
      * @throws ServiceConnectionException The connection with the data service could not be established.
      * @throws DatabaseNotFoundException  The database was not found in the metadata/search database.
      */
-    void create(Database database, User user, AccessTypeDto access) throws ServiceException, ServiceConnectionException,
+    DatabaseAccess create(Database database, User user, AccessTypeDto access) throws ServiceException, ServiceConnectionException,
             DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException;
 
     /**
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
index 5de1366e9f..e1e6924e76 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
@@ -62,23 +62,25 @@ public class AccessServiceImpl implements AccessService {
 
     @Override
     @Transactional
-    public void create(Database database, User user, AccessTypeDto access) throws ServiceException,
+    public DatabaseAccess create(Database database, User user, AccessTypeDto type) throws ServiceException,
             ServiceConnectionException, DatabaseNotFoundException, SearchServiceException,
             SearchServiceConnectionException {
         /* create in data database */
-        dataServiceGateway.createAccess(database.getId(), user.getId(), access);
+        dataServiceGateway.createAccess(database.getId(), user.getId(), type);
         /* create in metadata database */
+        final DatabaseAccess access = DatabaseAccess.builder()
+                .hdbid(database.getId())
+                .database(database)
+                .huserid(user.getId())
+                .type(metadataMapper.accessTypeDtoToAccessType(type))
+                .build();
         database.getAccesses()
-                .add(DatabaseAccess.builder()
-                        .hdbid(database.getId())
-                        .database(database)
-                        .huserid(user.getId())
-                        .type(metadataMapper.accessTypeDtoToAccessType(access))
-                        .build());
+                .add(access);
         database = databaseRepository.save(database);
         /* create in search service */
         searchServiceGateway.update(database);
         log.info("Created access to database with id {}", database.getId());
+        return access;
     }
 
     @Override
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
index 16d23d7af1..f42992781c 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
@@ -6,13 +6,13 @@ import at.tuwien.api.database.DatabaseModifyVisibilityDto;
 import at.tuwien.api.database.ViewDto;
 import at.tuwien.api.database.internal.CreateDatabaseDto;
 import at.tuwien.api.database.table.TableDto;
-import at.tuwien.api.database.table.columns.ColumnDto;
-import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto;
 import at.tuwien.api.user.internal.UpdateUserPasswordDto;
 import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.*;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.database.table.columns.TableColumn;
+import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey;
+import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference;
 import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
@@ -238,6 +238,55 @@ public class DatabaseServiceImpl implements DatabaseService {
             database.getTables()
                     .add(tableEntity);
         }
+        /* update referenced tables after they are known to the service */
+        for (ForeignKey foreignKey : database.getTables().stream().map(t -> t.getConstraints().getForeignKeys()).flatMap(List::stream).toList()) {
+            log.trace("lookup table {} in tables: {}", foreignKey.getReferencedTable().getInternalName(), database.getTables().stream().map(Table::getInternalName).toList());
+            final Optional<Table> optional = database.getTables()
+                    .stream()
+                    .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName()))
+                    .findFirst();
+            if (optional.isEmpty()) {
+                log.error("Failed to find referenced table: {}.{}", database.getInternalName(), foreignKey.getReferencedTable().getInternalName());
+                throw new IllegalArgumentException("Failed to find referenced table: " + database.getInternalName() + "." + foreignKey.getReferencedTable().getInternalName());
+            }
+            foreignKey.setReferencedTable(optional.get());
+            for (ForeignKeyReference reference : foreignKey.getReferences()) {
+                reference.setForeignKey(foreignKey);
+                final Optional<TableColumn> optional1 = database.getTables()
+                        .stream()
+                        .filter(t -> t.getInternalName().equals(foreignKey.getTable().getInternalName()))
+                        .map(Table::getColumns)
+                        .flatMap(List::stream)
+                        .filter(c -> c.getInternalName().equals(reference.getColumn().getInternalName()))
+                        .findFirst();
+                if (optional1.isEmpty()) {
+                    log.error("Failed to find foreign key column: {}.{}.{}", database.getInternalName(), foreignKey.getTable().getInternalName(), reference.getColumn().getInternalName());
+                    throw new IllegalArgumentException("Failed to find foreign key column: " + reference.getColumn().getInternalName());
+                }
+                reference.setColumn(optional1.get());
+                final Optional<TableColumn> optional2 = database.getTables()
+                        .stream()
+                        .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName()))
+                        .map(Table::getColumns)
+                        .flatMap(List::stream)
+                        .filter(c -> c.getInternalName().equals(reference.getReferencedColumn().getInternalName()))
+                        .findFirst();
+                if (optional2.isEmpty()) {
+                    log.error("Failed to find foreign key referenced column: {}", reference.getReferencedColumn().getInternalName());
+                    throw new IllegalArgumentException("Failed to find foreign key referenced column: " + reference.getReferencedColumn().getInternalName());
+                }
+                reference.setReferencedColumn(optional2.get());
+            }
+        }
+        database.getTables()
+                .stream()
+                .filter(t -> t.getConstraints().getForeignKeys().size() > 0)
+                .map(t -> t.getConstraints().getForeignKeys())
+                .flatMap(List::stream)
+                .filter(fk -> fk.getReferences().size() > 1)
+                .forEach(fk -> {
+                    log.debug("");
+                });
         /* update in metadata database */
         database = databaseRepository.save(database);
         /* save in search service */
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
index e8fecdf300..593b612a9c 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
@@ -19,7 +19,6 @@ import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
 import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
-import at.tuwien.mapper.SparqlMapper;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.service.*;
 import lombok.extern.log4j.Log4j2;
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
index cf32bf4f00..156563a041 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
@@ -72,9 +72,13 @@ public abstract class AbstractUnitTest extends BaseTest {
         /* DATABASE 2 */
         DATABASE_2.setSubsets(new LinkedList<>());
         DATABASE_2.setAccesses(new LinkedList<>(List.of(DATABASE_2_USER_2_WRITE_ALL_ACCESS, DATABASE_2_USER_3_READ_ACCESS)));
+        DATABASE_2_PRIVILEGED_DTO.setAccesses(new LinkedList<>(List.of(DATABASE_2_USER_2_WRITE_ALL_ACCESS_DTO, DATABASE_2_USER_3_READ_ACCESS_DTO)));
         DATABASE_2.setTables(new LinkedList<>(List.of(TABLE_5, TABLE_6, TABLE_7)));
         DATABASE_2.setViews(new LinkedList<>(List.of(VIEW_4)));
         DATABASE_2.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_5)));
+        DATABASE_2_PRIVILEGED_DTO.setTables(new LinkedList<>(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO)));
+        DATABASE_2_PRIVILEGED_DTO.setViews(new LinkedList<>(List.of(VIEW_4_DTO)));
+        DATABASE_2_PRIVILEGED_DTO.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_5_DTO)));
         TABLE_5.setDatabase(DATABASE_2);
         TABLE_5.setColumns(new LinkedList<>(TABLE_5_COLUMNS));
         TABLE_5.setConstraints(TABLE_5_CONSTRAINTS);
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index fa47be8af8..2d9a2f40a0 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -29,7 +29,6 @@ import at.tuwien.api.database.table.internal.PrivilegedTableDto;
 import at.tuwien.api.datacite.DataCiteBody;
 import at.tuwien.api.datacite.DataCiteData;
 import at.tuwien.api.datacite.doi.DataCiteDoi;
-import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.api.identifier.*;
 import at.tuwien.api.keycloak.CredentialDto;
 import at.tuwien.api.keycloak.CredentialTypeDto;
@@ -74,21 +73,15 @@ import at.tuwien.entities.maintenance.BannerMessageType;
 import at.tuwien.entities.semantics.Ontology;
 import at.tuwien.entities.user.User;
 import at.tuwien.test.utils.ArrayUtils;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.http.MediaType;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.web.bind.annotation.ResponseStatus;
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.charset.Charset;
@@ -592,6 +585,8 @@ public abstract class BaseTest {
             .firstname(USER_2_FIRSTNAME)
             .lastname(USER_2_LASTNAME)
             .name(USER_2_NAME)
+            .qualifiedName(USER_2_QUALIFIED_NAME)
+            .attributes(USER_2_ATTRIBUTES_DTO)
             .build();
 
     public final static UserBriefDto USER_2_BRIEF_DTO = UserBriefDto.builder()
@@ -1257,14 +1252,6 @@ public abstract class BaseTest {
     public final static UUID DATABASE_2_OWNER = USER_2_ID;
     public final static UUID DATABASE_2_CREATOR = USER_2_ID;
 
-    public final static PrivilegedDatabaseDto DATABASE_2_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
-            .id(DATABASE_2_ID)
-            .name(DATABASE_2_NAME)
-            .internalName(DATABASE_2_INTERNALNAME)
-            .container(CONTAINER_1_PRIVILEGED_DTO)
-            .views(new LinkedList<>())
-            .build();
-
     public final static DatabaseCreateDto DATABASE_2_CREATE = DatabaseCreateDto.builder()
             .name(DATABASE_2_NAME)
             .isPublic(DATABASE_2_PUBLIC)
@@ -7178,6 +7165,22 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>())
             .build();
 
+    public final static PrivilegedDatabaseDto DATABASE_2_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
+            .id(DATABASE_2_ID)
+            .created(Instant.now().minus(1, HOURS))
+            .isPublic(DATABASE_2_PUBLIC)
+            .name(DATABASE_2_NAME)
+            .container(CONTAINER_1_PRIVILEGED_DTO)
+            .internalName(DATABASE_2_INTERNALNAME)
+            .exchangeName(DATABASE_2_EXCHANGE)
+            .identifiers(List.of(IDENTIFIER_5_DTO))
+            .tables(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO))
+            .views(List.of(VIEW_4_DTO))
+            .created(DATABASE_2_CREATED)
+            .creator(USER_2_DTO)
+            .owner(USER_2_DTO)
+            .build();
+
     public final static DatabaseDto DATABASE_2_DTO = DatabaseDto.builder()
             .id(DATABASE_2_ID)
             .created(DATABASE_2_CREATED)
@@ -7240,6 +7243,13 @@ public abstract class BaseTest {
             .user(USER_2)
             .build();
 
+    public final static DatabaseAccessDto DATABASE_2_USER_2_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder()
+            .type(AccessTypeDto.WRITE_ALL)
+            .hdbid(DATABASE_2_ID)
+            .huserid(USER_2_ID)
+            .user(USER_2_DTO)
+            .build();
+
     public final static DatabaseAccess DATABASE_2_USER_3_READ_ACCESS = DatabaseAccess.builder()
             .type(AccessType.READ)
             .hdbid(DATABASE_2_ID)
@@ -7248,6 +7258,13 @@ public abstract class BaseTest {
             .user(USER_3)
             .build();
 
+    public final static DatabaseAccessDto DATABASE_2_USER_3_READ_ACCESS_DTO = DatabaseAccessDto.builder()
+            .type(AccessTypeDto.READ)
+            .hdbid(DATABASE_2_ID)
+            .huserid(USER_3_ID)
+            .user(USER_3_DTO)
+            .build();
+
     public final static DatabaseAccess DATABASE_2_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder()
             .type(AccessType.WRITE_OWN)
             .hdbid(DATABASE_2_ID)
@@ -7555,8 +7572,8 @@ public abstract class BaseTest {
                             .referencedColumn(TABLE_1_COLUMNS.get(0))
                             .foreignKey(null) // set later
                             .build())))
-                    .table(TABLE_1)
-                    .referencedTable(TABLE_2)
+                    .table(TABLE_2)
+                    .referencedTable(TABLE_1)
                     .onUpdate(ReferenceType.NO_ACTION)
                     .build())))
             .uniques(new LinkedList<>(List.of(Unique.builder()
diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock
index a0b551b34a..3388956b20 100644
--- a/dbrepo-search-service/Pipfile.lock
+++ b/dbrepo-search-service/Pipfile.lock
@@ -340,9 +340,11 @@
         },
         "dbrepo": {
             "hashes": [
+                "sha256:09a10584a44c952a7cf83852123c14bd2917ab009e50698c1f9d8c2690ec4bde",
                 "sha256:2bdb48c70b4c99b5044fbfc12aa653c1e9281ca8913a433cc08a1e14cb4bd2ef"
             ],
-            "path": "./lib/dbrepo-1.4.4.tar.gz"
+            "path": "./lib/dbrepo-1.4.4.tar.gz",
+            "version": "==1.4.4"
         },
         "docker": {
             "hashes": [
@@ -371,7 +373,6 @@
                 "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==2.3.3"
         },
         "flask-cors": {
@@ -396,7 +397,6 @@
                 "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7' and python_version < '4'",
             "version": "==4.6.0"
         },
         "flask-sqlalchemy": {
@@ -405,7 +405,6 @@
                 "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==3.1.1"
         },
         "frozenlist": {
@@ -561,7 +560,6 @@
                 "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==22.0.0"
         },
         "idna": {
@@ -624,7 +622,6 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "markupsafe": {
@@ -845,16 +842,15 @@
                 "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.6.0"
         },
         "packaging": {
             "hashes": [
-                "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
-                "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
+                "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
+                "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==24.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==24.1"
         },
         "pandas": {
             "hashes": [
@@ -1046,7 +1042,6 @@
                 "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==8.2.2"
         },
         "python-dateutil": {
@@ -1063,7 +1058,6 @@
                 "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==1.0.1"
         },
         "pytz": {
@@ -1136,7 +1130,6 @@
                 "sha256:9995eb8569428059b8c1affd26b25eac510d64f5043d9ce8c84e0d0036e995ae"
             ],
             "index": "pypi",
-            "markers": "python_full_version >= '3.8.1' and python_full_version < '4.0.0'",
             "version": "==7.0.0"
         },
         "referencing": {
@@ -1329,7 +1322,6 @@
                 "sha256:bc599c8c3b3319e53ce6c5c3c471120bd325d0071fb6f38a10e924e3d07b9990"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==0.41.2"
         },
         "testcontainers-core": {
@@ -1344,7 +1336,6 @@
                 "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "tinydb": {
@@ -1365,11 +1356,11 @@
         },
         "typing-extensions": {
             "hashes": [
-                "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a",
-                "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"
+                "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+                "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==4.12.1"
+            "version": "==4.12.2"
         },
         "tzdata": {
             "hashes": [
@@ -1625,7 +1616,6 @@
                 "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==7.5.3"
         },
         "iniconfig": {
@@ -1638,11 +1628,11 @@
         },
         "packaging": {
             "hashes": [
-                "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
-                "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
+                "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
+                "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==24.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==24.1"
         },
         "pluggy": {
             "hashes": [
@@ -1658,7 +1648,6 @@
                 "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.8'",
             "version": "==8.2.2"
         }
     }
diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py
index 5d3c816ffd..460f0c7eba 100644
--- a/dbrepo-search-service/app.py
+++ b/dbrepo-search-service/app.py
@@ -13,7 +13,6 @@ from flask_httpauth import HTTPTokenAuth, HTTPBasicAuth, MultiAuth
 from opensearchpy import TransportError, NotFoundError
 from prometheus_flask_exporter import PrometheusMetrics
 from pydantic import ValidationError
-from logging.config import dictConfig
 
 from clients.keycloak_client import User, KeycloakClient
 from clients.opensearch_client import OpenSearchClient
@@ -21,6 +20,8 @@ from clients.opensearch_client import OpenSearchClient
 logging.addLevelName(level=logging.NOTSET, levelName='TRACE')
 logging.basicConfig(level=logging.DEBUG)
 
+from logging.config import dictConfig
+
 # logging configuration
 dictConfig({
     'version': 1,
@@ -191,7 +192,7 @@ template = {
 }
 
 swagger = Swagger(app, config=swagger_config, template=template)
-app.config["GATEWAY_ENDPOINT"] = os.getenv("GATEWAY_ENDPOINT", "http://localhost")
+app.config["GATEWAY_SERVICE_ENDPOINT"] = os.getenv("GATEWAY_SERVICE_ENDPOINT", "http://localhost")
 app.config["JWT_ALGORITHM"] = "HS256"
 app.config["JWT_PUBKEY"] = '-----BEGIN PUBLIC KEY-----\n' + os.getenv("JWT_PUBKEY",
                                                                       "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB") + '\n-----END PUBLIC KEY-----'
diff --git a/dbrepo-search-service/lib/dbrepo-1.4.4-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.4.4-py3-none-any.whl
index 694a6fc02560b3b5d858df0e5a0bd9acf45c8f20..503cfef91315990bbf06027d6de14c8b3184507b 100644
GIT binary patch
delta 9428
zcmaEPlkve#M&1B#W)=|!1_llW5v5ZbdABq3^2MKy_}VEid_$3ep=a_%X5;!(+L^^(
zd$xs7+Fbs$R8zok$_6$@JqE8dk=pOG-&Ha*3otl#Y+9)`yW-3jleAs+cQ1eDO8aba
za!$!iJMJ5)I_nSp_+{0xZhq(QmOtARGN;+iR{MBnrhcvdsiw}u_v3V)KbiXetns7`
zEH{<rwlH>XGW<P}Q~af%-Gh=nC%y-L{8WGA^d5Pke7AWUxBm-udiL?hUz;A=|0fnK
zwl@~4{+#e8eWS<s`K{BRd~P|jS)ngwW4g-R%h5$5zn`dhK1zAA$KO*Z(9O?|{mbm1
zhbPYzZ#g#EyfE#~|4(NY*4rOB8T#P2$|L{!FNZScoaxXnddm5Ki^9oIHr>L3fBIEE
z*F;IWPpQ|P)#oyK>4S&GY;#(ld;h9P6ZxGr@vcCI2>(968jfqi_iU=a<p@<}a^0W3
zahCOwp6crAAJv7<Tgv&oeJsn>KIUxem{3si_73aKUgz$jzWw%#r@opqcTT*;`g?Qx
z=7uMFM2kpGFq&y4tY5UQWAdak9}k(7<uRXEyqG)T$VDEm`h=YORh|!GTUBH&Q)+CF
zJyH4eywG8CLS(=JRow@lo}B%-d;9WyJ-2gB+x_(p{{B39v-$cun}tg@oxJgLe?_Cu
zk?ks;O!GeoHGbz@ds8RUCu8YrozwZ3e@>C<o1gg4`HaF$n-tOG*^YK{*7<>F_7uF4
znY?m4N9L)$vvp?6%gMylS4-~vJnj6;^gC?Ao0eY|y+3WSwp@0}*O=m45#@!Co)>i<
zSKS$86sfXh$^4a163zynoq6e)lJXkXg<t$6VpQWcE&1v^+oCIT?gW(?dWI9#pXi;K
z=4Vqn?W0nmUfg{7IrH})+w>scX_C&2CXR_$B!hHitjhzQDX~uU^0cU($9BD5@MG_k
z-%(dDUQ<eTjtgbJu&g9zRj=Sd@l|Za`XQ=M<2tH#bUhBRIWBHD(`x#3N0F52)14EF
zRqQ?gJ^d+hL%K5IWY*&=lg=F5t{VAHTQ8&ct@Zi;(v#&+J(0P2JUmXyN8^xB^J~Qi
zlc(=&zR$b2WD=|KrukO;rJ2%ypO3HOzFx1mQ&qA0gZhs76HUIZ%iMMF#KH1)3#w~A
z{r$Z^YR6^CvqF!~#$;6-%Y1gcJ11VP-Ac~;Z~01Bsp43f_{ljI8V!uP@hay7Cn^Lw
zx+)xVNc8IKTJc*;>wVnZ`TzfXdov?Q@TBO}gs6ER|2%o|_vXoj`<y``+MAcE@UKZ+
zZ84!Gre3T5!Uty0)_~G=i%#m96z=!l^K*`h&mGyW9&^LVHc{@LC)NwtUvhqaSRn7a
zJ=e-5`qL7MV#>;$ZRRt*Uig@O@|u{Um4AFss48?$xhF5dV;E>Se^CH;juiLj+7;J#
zD7^>}KP)+m$uV16;$V21@@MnkX|1Yp6NF|r%KCk;Ti{pE*s9AlXUjQ<ewOrhE=faX
zJAR=@?=^2O`08n&Wwpcn$iIj4?CK>%Os=VibFW&>d{O25n@5Qo;%A9S_e?ZanPeKj
z^TyMc9nbcqi(6)`nfNMLxVP%O-YPqXgj;*nw(PvLv*)UQ9M@CZ{g*h!uDV_*5A10F
zJ$1|Ch-J&anZ&<bAyxmhr;BCX4yp4i{H5Z4b>EE97C#!bIc|~YtJ6F7R-F6MZad+N
z1?RukqTTGfZ14V_SHbC7Va*Z6Up;lIq2p_(=riv2Mtpxx9u!^7d_UpJuD8rAvwiKF
z!uwW!R5mUz6@IqE&HAN5j?kAo)y;pJ57m}eH1GSr?^_|~NiokQ0^RXE^)r9%dc%J3
z>eByi5!1N;_wJbgH0w}&Zsf!F*G>9j^c;j5WB+MSxSeXRoZ0;`J$_~*>o=Jlf-{18
zcF(B}U^P*Er2jWmR6oY(M{;c6m5&DEYhw$Z)*L@ABI@8>AR8I<e2%5ZoxN@L@8)G4
zZ3^#R!r-}bI_J%ac6-nM*ex)B$qm!`OPw2kE&uh8xwd!HQRBJ)8@IiCB78K~@zRrw
zmaMHad{%5WjxD%u`G4=`r>gHC?^;!D-EvIl!7s+Q4RRa0Y#qY*O*9kFbN(ow^d!PY
z=G3Z!r=f=0{_7l%hSY3at?G4%|JPZInQRm7WdhRX<j<MjzODQ|&o_IiZ=n}N4V*<=
z?Ii2Fp1<hWvmr8Yt-DvLZ=`?Ns;ux|8sXKhy+TVhS1yga_;h`_WK^Br?lAe=uYwlG
z{C}&*{A2U!Z?{*U;Z~aPcK_d+gA3I5{hAtZz0K7&Z^m?mC+xdsPGJ0HabxGve?nct
zf9<r&IdV8>s;TTv^zZUY_{OekbBTM6`Pq{StNyPlPULyp>18$PWBsaq|Lwm{Zst<t
zp0cc;ae?6{Mz1>e$?Lg1-2cu?sPN}}ed4CD&l}Co${Xf;bOO2FMpfNZ+B@gMEOwJ$
z-;Qp7_C5CKKcUEnFBg88Q+~X#Et%>2vAn$oA66FdH#)3c^#8{r{>gUSvi0l_eJ^Si
zwXN^#^Sc*2N2Zxwx$x^dwQp&RN~<>fJGZ~sXmR)R-7LG_&t!`TTYFWoS5y6@*VDaM
zY`0YZb~NeD{IBzT<=aT<8|xG;z4DWmhD<sC|AzJrW#c@SZ5&2RR^5tY&-}*Nbo#zJ
z<IK7(*YCy~CP*bEuH1U7fu}-eMw01@`mF~QqQp`^UehkDYI)@yyFJS?Y;})%L3w%q
zwbS#ylx44a*S&4k>Run7;;sAb#b(u5#s^(nG{@<BpxKAM2xF75t>WiCyuHt>D$KOl
zQg3?W`k1_gy-q0x%-IKDKM-qP{l)Hsw&{BFmx52u7z!_OEml}v=M(W%z#|~|1K+z!
zTig1a)f`Tn*Cty1%P^Kr)4k<7$<+OU^{Tco?(KnLzMEt_{<VCwTPgQ!N&K$2mi4ty
z1SGnRO_`_OS|{i3A$#Xr#~sC|xAM&1i=V1F*U#OxH{8Tk<d2%0iiwfxxx#rqcGCal
zPBc$nefn+e@{OHq?AE1jF$wQpabe3pXRpKYVww?m>hrFJ9(rdtT{=tnvGt?tts?Wk
z>daADw)doU|HT={x=%PM+HYCC-9_?!>`dnm4Wbfj`QD%4u%4W?;?Ke!Z_RWswk1bc
z!==RkuYYZ{KZgBFfO2)oEb(HE#>Od^oPA5!q?=;e;vzmQOg=Gp%FbP`|EHU#1%+(*
z^hwn1`IYr*-1`6PbCMO;E0&&8KX1w!b^M#e7wKEGrl0%p;?0xLea?qdmY%tL=wW_l
zwUhp?xQgqK%A`~>!+JDY=RI8+I(zR+6AosU;K?p?e43J6R^549-7i1!TJhg0GY_v9
z`N1=7j<ocivw3^Yc;-KHeX)4wL8U)U2OoVcUbsnc&TN5&C+~1Kzm|5W-)ei`+wP#g
zT?OCA4M)76N`GAt(6Fi`vaRAs)83j2r>UMwD&AdNwum_=y_sDRdQ&Y_qUOdXzs!7#
zn02SJO}5O7t#*7ZpJaQPp{GVuRZr5YcYC_~^5d#ItIPQ$g8xc<oA;aRb8FtbtrJtl
zkKL5Mk-cnf#`?hMm_P9cyS4R9I_e9bhW0k;)H_wh78+hkJ%4qb<*yw-{vT7$%Kp~5
zMw$DnZRuG{i;^Y|@6s3lxr447*vZx(`4OhGZ=?LD*x&iKEV7CRO*cEezERtp;Xcvl
z?1%U+w~bW{ZvC5=DV{5;-REv_CXGErg4>y`{9EJS&>QW{f#G*0xw>U5)Ss-s5c#`)
z6Jvz%rS<Hc#jM|3k40@%-4GM_sr=ilyvrBnpD1!V`hT*sg0p*=V~MlXCSHMt=g!}b
zCeBv=xai!C-bF!{4T~q){?q7tk{bQ^MeD*jG2JC*^A<-fUF<09Il)@$lN_(znHV<B
z$@7Cvk120{<>z`*!e3f*^X!ndH;fM7+C4+=&g=TCJGL&i-xOLc!_=h7u&L<Hvt{pm
zn0kHGS23KPwa!LM!?MKo+4=AXtIot}elWWFc=4)))aav|8CGplv}z8%DHYo-;JdHG
zNY$e;;^MUYiOL?~&UF!1u??rx8uB*&IN)->^l3Xc``QZ&&m2}4czkH`-t*@-zWe@d
zyNBG4LecGQx%Hw!v8hp^i>J>DyLQyftD$alMS$r|rzJP#JgjzHw@b->yF6p(zVv_-
zW>YWA_S}jpS93M}`7SNw$rR_=fq?~1D^r$D|9mu5!skZSYN=U=k1gPR%DKqMJk)ke
z=2WSai|TP4yIL)#pZwSQa53A_4Ku!FPWWc#(Y#vWiFa6UQ^3s|^+6F4#jhqrPtw`>
z?BJ*C+ViYi7_Da+?`;0ozqlZ>;{x+t$@tT6c`kFlT~no;dqVB*`N<;M$`b2uGpo(+
zxqkIUOi8AE@n_v@5*HE=>5H&TKfNob$5q@feE-FgGgHH*=l5J>Y%}ZK@lmn*qFt@u
z;eb@FgISkYwOHRV{q<X}<ngCI{6@&5i(448YFnIc$qBRWofDX}AokJiD<4~mI?Dz2
zY!%R%z1EardzsqnzFB`HejhCP$-h)On<4Xc;AD4(Ai1~OUgXSYmRNdpJ@2Ye))MO{
z+N>t~f*0OU+9tN_?skSSorU~9Yo$!vb{;-);#*>by+%nx{C-27s_rBgS(|$t*7aW^
zBmZ3Qu-l_N@1R)F(gn$1P9Hw%<FeU)gWWOK6uU#>^4?Y&IgL7B%ZxcvUhRBR9A)6C
z?rCuTyp8LO!&h#16n;CvusZBk$AN9SRtvHoJLUao<$o3Q;Ov2-$G&^#xT!uqzLLF+
zYjt{F(yo7rR{K{x7KxIs6#VJ<XJP1%PaJkP>vw0bzk0{X|JgOO5Kj)B-^)y^j+Uu<
zADt)Entv;TM=8B#!z?*Ny~bZ_*i}soOSZl)6ZUTP+VQ7+N%oA@vH3PT8t>oy8lo2b
zASaM5=bp1-y4SxnrR5oYzGpLye!kG(bBKFQ-&&LS$Dh)^{t}BbIxPSD(6nuavVOZ}
zH}LUzDIToflI6j5)|xASE~o3veaxzVw#s%3B|nk8Us7!CzF2DU^T&L%vd`YQxxq4f
zLEkZt)qDMGvN_UQjZd(7o2oB(@c!XCGo6FC&dpEq-Q^gqc5`;m>D&|AmOI3+?%H~I
z-|MKa%dUm2jM3j_5+5`BWu#T_R>!7m#*sI@bsxF><TE(#QBc2oLelc@xnJgWy18Co
z5__jx^H<uInH%pcwiD;hS$t7#Dxdn+&1vF~6JGmFS!BfdZ<9<=^AG+~|C`IY&*yti
z3R)@N$ZIEgL`*I!JMQY_i;sC*L|x9B_v?qSZJ&R@WSv>{ib6w?sn@v0rcAqC##h!D
zp&r|GyW!5-cMJYCFVlKIt9}_@&`l4K9V$XnMf&pG_bh*g^)&3d8Fk$5ez_ZG^wsQl
z_pZDDe0l!*^{(u<uZyMTX4bEq&#%v`(O|Z!i_M`eN}++zep%e@`_p|kopfQH#Flm7
zw`|0erlSXK*PmV6%ih59O_s00>ZQ1%6+_3nWqsjJEoKRSrDfueuFn+~K7Fv>`J7z(
ztLSUtFS0cxcW9(MjAyU>uqkZW)L>b|>%lXgt*C#-=dk<3wq0`1S-)OtuMG5x{qw&t
zZT5Q3tNIUg8ZTYHA2qS&Yk_X_F+TTf?VUM$5}OaE)+g_LeN(2{!`ykf4bR;(*0G{3
zezPNH*x6oLFJls2IX7CM_npMTiYw)(1?x{e*tEanR~1L9z)OR9eMQlNUgnNmYJ7*?
zroC}FEUv81`%g7LexJtXAOEfty^;MJcO&N8{Z||Ae5%{Yb0J^w*HfXhPx<C^{x<lf
z&~f9~jEhNSsX5sz`MN6u6^^XB;>U3>^5h<!OO0OaXAb|oH&dxSn1@j*;rqEOmB;z?
zru8PM*7vUsdlgxHD60K{px^Dw-#6X-o^vcBK`YhpM_}8!&j&3Qa;dDYXp@=Rvg+~o
zhD#D}e4p^QGb<P-oZ7uVex}e1z8P_^t(8o=7CiAwyPe>`s@46_W9#g5+~1eCv$kAv
zE1mJ@aHaQj&QcK}`&L`!V?KM<%Ch`gwQON-hG*i27EZZ(zR5QC?wpZPw&k^Y>Xl=C
zXUW8uc?&WpH=obp$uhsPXXC<W%LMz@7cQB}nfRXh?6#!qfq%}m&%AkMvRC}g8DZBh
zMV39dQgrHiP92A;zz*4N?wtqg+VxE5Cxl&Je(!_I_Lxm;i&t;G7C5ow(@Y;R53cCd
zHQ#^F4Zhdgneb^-7W;9-`45`UZ?;fO%ZoGDe8<JHJAk=Y+o9bx<&DeUcXy7cKYkFb
zw<O`ZerVc4mZx9W-Tts+@^?`K$>39dhitiL8Q&|r-&8w8p)H=nY}&2jQ@=$gJBVp9
zeZ4(7M@*6N^yEG<qx$@Ai_@}#)9bjNO-~d!xXJJ4{<%)=PbRs1an_iz*3P!?uVeg)
zd7Wh+4s9^BeXwdm=KJYSrf1|&{d;IttF8Uz=r#T?6dK~)<sEZvITtT8H9l9hX#OFc
zDOJgqp?+P5SRYyZ70WyMVfV)aa#}N(7RtVO!L%wk=|Z_?UZ7&yoP`fo)YrO8ygHnG
z?c=;V7fM9ZR`K;*cIAD(J8`}IkHhT?awaTElTgrK>=1Z|(YIrzfPT_TtsSR4b0sA`
z!W>oAA5?06*!9Z6KKRn-oyIZA4!b9BsY|!HlDKy1V&n85#R5M+#_rl*9A#A+rIzR*
zAb0=#!YRsoWG~(OY_lxkk>B@s7X=0D`Q>gf`px*p5TbuK*o@;{;il!MPxeI~S{M=^
z9=9@P?cHU}-!l7+<R>V86!1HK#5eB9^6aoPQ^S?pjP?HAui=+y)nB)3$}t@kV<z6z
z18$$4Bw`AZ*vdGxkKdQ<xUfg2g~j)NEVFXdyVuuFIOo1<GMc?xRWD=WOuLwX>Xm1m
z#OtpL@BGBur8BqY+=Gy(A7sM!T+5zyKwVfr(6>3_d_j_I`p$?T_ux4;ziLlUu{?FN
zNbmc`la~8gpU();cjnu$=97iu$5gTQL!xQtw3*XAS=f1wUNG43i7S%((zJaV71RE_
zp2M(2HSw8_-_0cz30;RItQan7fB4{|@w78>s>t6<^}auwb8CXH2|fG8bj{A7#ZOW1
zYTu+iaT82b_w75O&~-ET*H6)PQ?i^&)~)<Jt>Pk!vW?O1$QK4X`W~?~IS1D~+?2SZ
z%c#ZS$$r-`ZL{@js&}4ge5zd|TCEct=zPZUlelxpM)pJA1~1cU99yPaJ+BYA*QypF
z@N?0P2S3BM3)a@(zQh~Jx!LK+b(LJ>WPiEvCC6{%@ZWxW&RaBz+iU%fym`+xUq#9J
zw1!CJUR!#dqyDXpyU?<oALV=deDWpl7=7YlSGt~{!uh7ZD09g_eiI$NB}}%`22Z!|
zW9EJK{$WsUmsFndokYE7?3b*z#2Vkody%#FZE>marj@2z_f5;5*SEL^S>0c1fBnkl
zO@+p$;!>Y>^cA1;6%W5&x<@j4rR;9w`6o85QxAUD_Ghk+`J2WwlM~pQHK*KsTV}W~
z?66Pl9RH{_9@+ZoPTbBqH*db#6Za;^%zyK#wDktN8WR1F+{=pCX}mRl=E_vZz!To~
zHZ!KYH4fSJ^~KIJndX~iif>G-|8nCXkD8oy+3XLx_qOLAS$SmB29{OJ%BCG&Ipg4h
z@3ya6o`mkrt4N-FO=G6;cR6z-af1od59BhqNc-OjvtlVKZLB})WaZ>o_uzun<YR6R
z0+wx6o3J-LeTKn?+j@64UsyBC?%1n!f8T73DO@AA(4yeN)=Oz|W{x|KtUPNN?U15d
zzd)HIO@5p7owuoOQD>Xy%y>0J_|lALJ3qwBE7#vW=ll4%WbW|;3tDIXJJ<87CT~`2
zp8GSW`_;QA?p%?p^ds$#{}GoQ{<P%N2Ur&9Gi{aU?+?$rwMb!Rr<POEdW$=Gm#4jD
zh~hT3eP4M`^+ME(vK^(}PB*<{5;oloUHNAHv0EYaECpV9M=u4ZR7x+F-kIWG%b4Z4
zA#J-&$?s|H+oHL+SnHWp|FatH{{G?r;rELD)%^eMC0MUSJiXb++dK8(d-h|iA1!E^
z_d}og_j3=wyVaF9Q>wR0Kl=Il-K*2e(IRKtjQB68dRi?Lu#x%m{<HG7ZTZd<*WPV9
zcem+WsP&~Qg^cxF*1l#&7jAEU8MW1PvX1>G-`52yk2K#k-rVB<^{B$uJNaFnkCG3U
zHqPBw{{GVG*lK=#$2G!trd)chs1=g?^eb2Jfkb)H=WYqJ<PL6PVYiew5c=n8@#(Iz
z=<0>Jw$hJgY(AB8&Z^0(?buzJG!M;W(W}yF5vOyzC0UbVbLR!}*PE@_5%A!+^_(V7
z-Le%AJ#-@k)x8RO`?4Q#PT8~Xv+B?GmPsjkg1^_uyvb2D$=zwM7OmtLky_4O#{PYe
z<?Ju>q~En1TvExg_VuB9-N$$OTc`NWwXKVDU`*ducK)+b+i&XyiMkE?y&I+rzAyXb
z-M``dv5&!gS{ySCHr`7<u)(;V+1mKRddUovzfZI`GjW^7zRiqiG-~@j`}8JB?Etqu
zw<C3P*EpOFuH7c_wtT^!(gk~X+1a<wPWe=_U{lY-e`$+z*tAY}lyA0_o!#c3S9oKo
zh{D%ovuIzpNJH+WA97@lmLIOo?JlvFns4y#;e@T9=f{1XDZ10+9j_;c^^$~%D)kK|
z99-sdXQx;ye!SEZrg~Jj@0n_PJ=2j_zx0+%R|x7!rW!kUod0y$Tv9>1@6_pu6|e54
znEy_GUe6REEbUV<VNM{!J!ZC<Hs3cpJzblr$9253X~_dMxA>bfQc(wYuk*=c>JyN$
z`<b)!tIpg>i@U{Zv)<XX=<7^9e7@FVk*Ht2x8lW=m4U))?rZ&)7)|Vw<qF<*Lwd#O
z!;wdhZ!!P&@==$UXTNdnwZ8XL71n=K-&H4LTAwsQ-@rlU_NugxH_STnH~HuNje8i`
zyY{a2*SsA!C%3)5=vG_Y^X0*s2(LSDMCQgchUFY+H?^$znVy|I-N9pSn)>|bJ-l~B
zoerI_imQ)aw}ek!Q2FSqrBXU4XI*Z;ZngedkB#~%^Uc3fpUzF5S9AB?##OATlja>N
zd8l4J=gGOXtBO|7V5mEoCpv$R>&Hj`7PhW0EzlR)_C502*=19Dj!fV6r@Z`~Z!x>h
zM7AVmyNK<LOO;mJR%Cv2GJm~7^mL6+{Mr~Nvj^)$xnHMTT2%k(YS@`?d5<=Ro@aZ1
z<ny7~7F^SFxYAec<ezpneZSB8oae9K)Xe2`^0@uxT8-f4ALa9ooSXc^%cisH9rG{t
z8&*$G%SRM{*qgXrK`l5bXa5}5bJn*ba;3MI*0NvwFU2hEdr|89-JI^rva?s)=%3}e
zD%G%7JVt(%_KctJj-GzCHl|)X`<->Qc9^8YU+%1#`;L{l=`S?q7M^gbwRC-EckO}m
z{~~guH0I7awzN65<bbHolgF(2-rIYmw=Xx6UMJkV`JKk^vPAncKkJ`Xf9^3_(E0CQ
zghbQnpOZF;nr>vD-Snd2i}BU95edTFU)Ppa>{(QtE*5@qWA=rq6*kEY@*i2w)HBAr
zTwZYAu*q5Yz=F+&k3(Yx_T|3W_SLEA<P-I|QGGKLb{=6ASXu6U<WoV}G`9P)A8Zre
zWx6P)yz=d+d)K0rG|#B<((Is%es+PA40gu6VbLg;i3zAk+NhLq@RZR0MeDA%`NY({
zzhk%C>a5u34V<wtS+W0ie-yQS{cVET=A>oy`+r1jJfJ4_ap~6u$F;JPrlpHUPg~Ob
z)iPF6WS@ln0^Mn>mm9n)UY={;VfHaZZO?(!_Q(mXExUio-}sfP%em)Igz5jneLJ|C
zr!eWyKh*c;h^OR1<!`?pcciAM--^@goNl0|?e)pi%9BYZKx=W`nn^Wl3PYYwIVGf-
z`jx##`(?ewlxQbuH<kLcd9SAkS6%$d#C|vKv$p4z4PQR3+~+v8X2whD@M{{O>l5xr
z&pPsD`euu!$;)2_`g(8_e>AN$e*L~@Z}?RWEsnopUw2f^XU|%n;&t4APv*5Vx`Mak
ze1AL)?20<t6}uyA(nM{(w4<-tW}0qo{PSrWBj?ggaV6%~x%DOcHO1TbywYw2v(GbA
z$atk;)>RdBHu`7a!XRJ$3yz0pZ`(3Oh}p32`m7mOvQ^YdcJpfPz8&NGs^`x(jt3{M
z?v{Ra_OaIE&)@IQpC9w0uRvho?SQ}yx#>IGj{bZ6<;nB3*0gJP)1<|!Kfd~XUH$AS
zU5BK&J1-B1olS4NY?E1Yr@m{4Xwl7@P6PL)+f=51i3xdhwj_Rn<_g|(OGLe_UY^hS
z_h<2)RdU<j%D<j?<(*!npX~H6ob}I_{J11}$mH;1g~iiM6fd*RskZ1$-|VWQ;&ZL&
zZ|%d-zpLj>UZHgTWVMU)*(bYhnHKBb_4%wG`^`9L+S#e$rqeE4T-vqs(V`cIyXt?k
zD<A&1<CpJRqn){hKi3!ij43pnr18Fs`|07Gj~0a`%2dSuTm8p6Jf`PU#nWf+vZn?&
zsBQm{lF}@3{gcn@uO-`3h5q0DVx*yZ)K;(ck@Tk(Qg<G4nux{yzRj;0pVgfAul!qS
zqF737Xn|Zos<5QN?SpK-RSWOxn6^t~8nP^?mz&`}@hS)R6eaJu1&*&5IApH;mf-kY
zv9XScsb7%qhKoVM=7kN#T9*Vk9L{t8@zhmnxV`5?@$4@rjpL?OPL^Jl-Kd%}A(-Rx
zV_oa3dE&`8j!Kjnw#D`&f|+OT?3QreEOGeY-oys^GQ;-RGYc=za6YT}SKsmpgYCiP
zf(7*&1-G1c9E^JQteLkp$y`25L*(W~GfkPm*DTUmrJwH^R_#=b&z(0b*X`D;x;y8-
z-}osvb>DGD@h9ifdTJ+LYYD$}*+9cAt$KrI>e0M=Yi@Ym+mpI+>a9SL>cU#zOKUQs
z#XJ|7O^B1UNC_$FR$y+)vCmA5c=G#u`tszc+xK$h>Vw{$zc;UU4tQ8p`T3VWXJ4N9
z`C7WF^3S&|8J!b0&-u%k)t}l>A$rZkQS3>7QfPF|?+}rcfY8Y@-Kn3<e8oRk&beaE
zA2#s^cf(8DwTIWnF22F}%IsSZx6m3zE|ZqP$GrV5n*`sdOq~5<{i1WLOmmYWmehns
zpAetP$#m-F#(Is5uVWrHNv##Jx12s_@{O>I+By@3Om}8Y47uBUFl5fI$=|O3dLy&V
z`TnM}igjIfYG3jlzFobvaH9SpgDF$uJr|`G*vvWf_jVJP-R+t0^PlJ6x2dnqxw|ke
zYM0{u*Gl@*anAx>K5p5@%)dMDyz#!pQrqM>6(+n5SSWUI2J-~_TM28P9lr3NZQk{O
zWt9)K{|4^9a!_ObI=L;iJc8H1ZI<5SWX9fp?!ci#4;C&hE88-8PHVZZ>*_5x>duw(
ze!c!eT*2Y;?5)$h{;hPgUvMBq&c0_OQ}B(nZV~=YeUDkO7oz55P3BdV;uo>Y?zQ|H
zvV75k3CtHiaZEN-4d#q9`FNOd^_u4D$&*yol#btNh)rK|{%ccIV=muW)0Jz)&HvY<
ztVY;;OZ6iYvxw5E$>%imLG&a|V`gccQ=82+7YT#-n{V52F@hN{Y$q`?yTza0Tx-9S
zAIwnoKOzQVOn#F(8B8~&c?i12pN`<+Rh{m_#K7>BnSnue@`N<0`XE<l{~(vO7d-nH
zIWVw3sQxeZg01W81$HyWNEQ}BeU@240SmfZW9t6;7$qO~JbwGh-TiyMpGs<ws6CO}
ze|1^g-7kIlM<Sl`9IrRyI;F=w&5UjT-S3ZTtybNs2sg=p+wm^Ur?+rDv&+i0YQjAp
z-uX}Eby^;OVGeHE5WVVf<Er`)&Fy>|QIb!Wb!B+vUCCT`M|taAug<BS&!-45Cai21
zd(8IqDgS#t&w{H9lO7!Q>Rhk<Aau3(qFO60$IGP_X}THT5-+duXF1#TsQL7!U8|St
zR4<Bfyv$r9;+r~ma%9R@&Xc;K6?_R5S(fLIo=!<`$f}Jya-@8%%=Q0QwbZ{HsaLVy
zV0q5$<TtK+mlV!a&huxk?`yv-!XR<Q?al7;S<{`TCrC7k&eyzAyHJSF|Bl!EE^mwL
z+bbDFdVO=RHSOCU>9qb{`612k3(EAqfAwMNX85!J##in~E8Xt?crtV0>0OSey}blQ
z=3Lt4#Vh0^_pAHJm3Hsb(a*YybM8+|ZAz=Cf2Z$p>HVAcQ@&bEEZy!d-?#MDy{P|j
zZ)aY$d+cP|o^HMK>rCDyJC9y!5}do*R_l$_;%}So8S=SaFnQ1tzHYVqCN=j@%zWqn
z{XKAI>9)mBd-b0kzbas{u<>$+e{ih+hqm)!0gah6g|=vTJrJEUW7j*IkYr7to0@@Q
z+r1~s=kO`To^<+n)U%=_`rwH?=Acz)j~?62)^cQzl6uQ#wsRXQ=dZime62EL>y&HX
zToq*n&mM7Nlom?ZrWz?<^{+PM#QIyCCx@uT?Gt$QO6v;8qqpJ#-i%Bl%<v^Oll?O7
z(U#QA$~2W1Q92dT_ie|)156AI7g!k>#264@N#l{p?=n?2Kx#muOdx`Rfk6mLgQz8q
zJ2V&=Qj&^N3-Tw|XGtiaD@HZ&mBwU#O^M0fSv;T&G<jB*G^4`gZCMJS%rp6BmNeth
z$zQWnz&x33X~s*FEwa@WK)L0Q0FPY`KLbOo4g-T6$YLm7(wJ^Pd19L6<Qdt*;Ow<7
zTbhaAA1vhS&oTK;HV;_%ceXUswN#L>LAZyjs}FMMfXq*fW~$?4U|?WpU|>*znhm0s
kH0DfB%rTY+sX@uHAW10R(ztzcVvf}0vpHgHW|<&C0BLH^R{#J2

delta 9382
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
ahNsL746;btwlp4qC_IuQ#%7-hk^uk;ckm7X

diff --git a/dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz b/dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz
index f344d01026b92476d80703cbfb7d884cb7822e05..9a90176f0a093b05d89d1cd74cf701cd0730861a 100644
GIT binary patch
delta 36946
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

delta 37796
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

diff --git a/dbrepo-ui/pages/database/[database_id]/table/import.vue b/dbrepo-ui/pages/database/[database_id]/table/import.vue
index 724205c7ba..07e56afea3 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/import.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/import.vue
@@ -325,10 +325,9 @@ export default {
           this.table = table
           resolve(table)
         })
-        .catch((error) => {
-          console.error('Failed to create table', error)
+        .catch(({code, message}) => {
           const toast = useToastInstance()
-          toast.error(this.$t(error.code))
+          toast.error(`${this.$t(code)}: ${message}`)
           this.loading = false
           reject(error)
         })
@@ -347,10 +346,10 @@ export default {
           toast.success(this.$t('success.import.dataset'))
           this.cacheStore.reloadDatabase()
         })
-        .catch(({code}) => {
+        .catch(({code, message}) => {
           console.error('Failed to import csv')
           const toast = useToastInstance()
-          toast.error(this.$t(code))
+          toast.error(`${this.$t(code)}: ${message}`)
           this.loading = false
         })
         .finally(() => {
diff --git a/docker-compose.yml b/docker-compose.yml
index 17389cad12..48d62373b2 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -269,6 +269,7 @@ services:
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
       AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080}
       COLLECTION: ${COLLECTION:-['database','table','column','identifier','unit','concept','user','view']}
+      GATEWAY_SERVICE_ENDPOINT: ${GATEWAY_SERVICE_ENDPOINT:-http://gateway-service}
       OPENSEARCH_HOST: ${OPENSEARCH_HOST:-search-db}
       OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200}
       OPENSEARCH_USERNAME: ${OPENSEARCH_USERNAME:-admin}
diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml
index dc8cd7bdba..15e6888d17 100644
--- a/helm/dbrepo/values.yaml
+++ b/helm/dbrepo/values.yaml
@@ -336,6 +336,14 @@ uploadservice:
   image:
     repository: tusproject/tusd
     tag: v1.12
+  securityContext:
+    allowPrivilegeEscalation: false
+    runAsNonRoot: true
+    seccompProfile:
+      type: RuntimeDefault
+    capabilities:
+      drop:
+        - ALL
   containerArgs:
     - "--base-path=/api/upload/files/"
     - "-s3-endpoint=http://storageservice-s3:9000"
diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py
index 0a03fd669b..6813acd095 100644
--- a/lib/python/dbrepo/RestClient.py
+++ b/lib/python/dbrepo/RestClient.py
@@ -11,7 +11,7 @@ from dbrepo.UploadClient import UploadClient
 from dbrepo.api.dto import *
 from dbrepo.api.exceptions import ResponseCodeError, UsernameExistsError, EmailExistsError, NotExistsError, \
     ForbiddenError, MalformedError, NameExistsError, QueryStoreError, MetadataConsistencyError, ExternalSystemError, \
-    AuthenticationError, UploadError
+    AuthenticationError, UploadError, FormatNotAvailable, RequestError, ServiceError, ServiceConnectionError
 
 
 class RestClient:
@@ -45,6 +45,8 @@ class RestClient:
             self.secure = os.environ.get('REST_API_SECURE') == 'True'
         else:
             self.secure = secure
+        logging.debug(
+            f'initialized rest client with endpoint={self.endpoint}, username={username}, verify_ssl={secure}')
 
     def _wrapper(self, method: str, url: str, params: [(str,)] = None, payload=None, headers: dict = None,
                  force_auth: bool = False, stream: bool = False) -> requests.Response:
@@ -93,14 +95,18 @@ class RestClient:
 
     def get_jwt_auth(self, username: str = None, password: str = None) -> JwtAuth:
         """
-        Obtains a JWT auth object from the Auth Service containing e.g. the access token and refresh token.
+        Obtains a JWT auth object from the auth service containing e.g. the access token and refresh token.
 
-        :param username: The username used to authenticate with the Auth Service. Optional. Default: username from the `RestClient` constructor.
-        :param password: The password used to authenticate with the Auth Service. Optional. Default: password from the `RestClient` constructor.
+        :param username: The username used to authenticate with the auth service. Optional. Default: username from the `RestClient` constructor.
+        :param password: The password used to authenticate with the auth service. Optional. Default: password from the `RestClient` constructor.
 
-        :returns: JWT auth object from the Auth Service, if successful.
+        :returns: JWT auth object from the auth service, if successful.
 
-        :raises ForbiddenError: If something went wrong with the authentication.
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises AuthenticationError: If something went wrong with the authentication.
+        :raises ServiceConnectionError: If something went wrong with connection to the auth service.
+        :raises ServiceError: If something went wrong with obtaining the information in the auth service.
         :raises ResponseCodeError: If something went wrong with the authentication.
         """
         if username is None:
@@ -112,9 +118,45 @@ class RestClient:
         if response.status_code == 202:
             body = response.json()
             return JwtAuth.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to get JWT: {response.text}')
         if response.status_code == 403:
-            raise ForbiddenError(f'Failed to get JWT auth')
-        raise ResponseCodeError(f'Failed to get JWT auth: response code: {response.status_code} is not 202 (ACCEPTED)')
+            raise ForbiddenError(f'Failed to get JWT: not allowed')
+        if response.status_code == 428:
+            raise AuthenticationError(f'Failed to get JWT: account not fully setup (requires password change?)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to get JWT: failed to establish connection with auth service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to get JWT: failed to get user in auth service')
+        raise ResponseCodeError(f'Failed to get JWT: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
+
+    def refresh_jwt_auth(self, refresh_token: str) -> JwtAuth:
+        """
+        Refreshes a JWT auth object from the auth service containing e.g. the access token and refresh token.
+
+        :param refresh_token: The refresh token.
+
+        :returns: JWT auth object from the auth service, if successful.
+
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises ServiceConnectionError: If something went wrong with the connection to the auth service.
+        :raises ResponseCodeError: If something went wrong with the authentication.
+        """
+        url = f'{self.endpoint}/api/user/token'
+        response = self._wrapper(method="put", url=url, payload={"refresh_token": refresh_token})
+        if response.status_code == 202:
+            body = response.json()
+            return JwtAuth.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to refresh JWT: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to refresh JWT: not allowed')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to refresh JWT: failed to establish connection with auth service')
+        raise ResponseCodeError(f'Failed to refresh JWT: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def whoami(self) -> str | None:
         """
@@ -141,7 +183,24 @@ class RestClient:
         if response.status_code == 200:
             body = response.json()
             return TypeAdapter(List[UserBrief]).validate_python(body)
-        raise ResponseCodeError(f'Failed to find users: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to find users: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
+
+    def get_units(self) -> List[Unit]:
+        """
+        Get all units known to the metadata database.
+
+        :returns: List of units, if successful.
+
+        :raises ResponseCodeError: If something went wrong with the retrieval.
+        """
+        url = f'/api/unit'
+        response = self._wrapper(method="get", url=url)
+        if response.status_code == 200:
+            body = response.json()
+            return TypeAdapter(List[Unit]).validate_python(body)
+        raise ResponseCodeError(f'Failed to find units: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_user(self, user_id: str) -> User:
         """
@@ -150,17 +209,20 @@ class RestClient:
         :returns: The user, if successful.
 
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises NotExistsError: If theuser does not exist.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the user does not exist.
         """
         url = f'/api/user/{user_id}'
         response = self._wrapper(method="get", url=url)
         if response.status_code == 200:
             body = response.json()
             return User.model_validate(body)
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to find user: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to find user with id {user_id}')
-        raise ResponseCodeError(
-            f'Failed to find user with id {user_id}: response code: {response.status_code} is not 200 (OK)')
+            raise NotExistsError(f'Failed to find user: not found')
+        raise ResponseCodeError(f'Failed to find user: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def create_user(self, username: str, password: str, email: str) -> UserBrief:
         """
@@ -172,11 +234,13 @@ class RestClient:
 
         :returns: The user, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the creation.
+        :raises MalformedError: If the payload was rejected by the service.
         :raises UsernameExistsError: The username exists already.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedefault role was not found.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the created user was not found in the auth service.
         :raises EmailExistsError: The email exists already.
+        :raises ServiceConnectionError: If something went wrong with connection to the auth service.
+        :raises ServiceError: If something went wrong with obtaining the information in the auth service.
         """
         url = f'/api/user'
         response = self._wrapper(method="post", url=url,
@@ -184,16 +248,20 @@ class RestClient:
         if response.status_code == 201:
             body = response.json()
             return UserBrief.model_validate(body)
-        if response.status_code == 403:
-            raise ForbiddenError(f'Failed to update user password: not allowed')
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to create user: {response.text}')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to create user: default role not found')
+            raise NotExistsError(f'Failed to create user: failed to find created user in auth service')
         if response.status_code == 409:
             raise UsernameExistsError(f'Failed to create user: user with username exists')
         if response.status_code == 417:
             raise EmailExistsError(f'Failed to create user: user with e-mail exists')
-        raise ResponseCodeError(
-            f'Failed to create user: response code: {response.status_code} is not 201 (CREATED)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to create user: failed to establish connection with auth service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to create user: failed to create in auth service')
+        raise ResponseCodeError(f'Failed to create user: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
     def update_user(self, user_id: str, theme: str, language: str, firstname: str = None, lastname: str = None,
                     affiliation: str = None, orcid: str = None) -> User:
@@ -210,9 +278,10 @@ class RestClient:
 
         :returns: The user, if successful.
 
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the user does not exist.
         :raises ResponseCodeError: If something went wrong with the update.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If theuser does not exist.
         """
         url = f'/api/user/{user_id}'
         response = self._wrapper(method="put", url=url, force_auth=True,
@@ -222,15 +291,13 @@ class RestClient:
             body = response.json()
             return User.model_validate(body)
         if response.status_code == 400:
-            raise ResponseCodeError(f'Failed to update user: invalid values')
+            raise MalformedError(f'Failed to update user: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update user password: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update user: user not found')
-        if response.status_code == 405:
-            raise ForbiddenError(f'Failed to update user: foreign user')
-        raise ResponseCodeError(
-            f'Failed to update user: response code: {response.status_code} is not 202 (ACCEPTED)')
+        raise ResponseCodeError(f'Failed to update user: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def update_user_password(self, user_id: str, password: str) -> User:
         """
@@ -241,9 +308,12 @@ class RestClient:
 
         :returns: The user, if successful.
 
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the user does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the auth service.
+        :raises ServiceError: If something went wrong with obtaining the information in the auth service.
         :raises ResponseCodeError: If something went wrong with the update.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If theuser does not exist.
         """
         url = f'/api/user/{user_id}/password'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=UpdateUserPassword(password=password))
@@ -251,17 +321,18 @@ class RestClient:
             body = response.json()
             return User.model_validate(body)
         if response.status_code == 400:
-            raise ResponseCodeError(f'Failed to update user password: invalid values')
+            raise MalformedError(f'Failed to update user password: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update user password: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update user password: not found')
-        if response.status_code == 405:
-            raise ForbiddenError(f'Failed to update user password: foreign user')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to update user password: failed to establish connection with auth service')
         if response.status_code == 503:
-            raise ResponseCodeError(f'Failed to update user password: keycloak error')
-        raise ResponseCodeError(
-            f'Failed to update user theme: response code: {response.status_code} is not 202 (ACCEPTED)')
+            raise ServiceError(f'Failed to update user password: failed to update in auth service')
+        raise ResponseCodeError(f'Failed to update user theme: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def get_containers(self) -> List[ContainerBrief]:
         """
@@ -276,7 +347,8 @@ class RestClient:
         if response.status_code == 200:
             body = response.json()
             return TypeAdapter(List[ContainerBrief]).validate_python(body)
-        raise ResponseCodeError(f'Failed to find containers: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to find containers: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_container(self, container_id: int) -> Container:
         """
@@ -294,7 +366,8 @@ class RestClient:
             return Container.model_validate(body)
         if response.status_code == 404:
             raise NotExistsError(f'Failed to get container: not found')
-        raise ResponseCodeError(f'Failed to get container: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to get container: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_databases(self) -> List[Database]:
         """
@@ -309,7 +382,8 @@ class RestClient:
         if response.status_code == 200:
             body = response.json()
             return TypeAdapter(List[Database]).validate_python(body)
-        raise ResponseCodeError(f'Failed to find databases: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to find databases: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_databases_count(self) -> int:
         """
@@ -322,7 +396,8 @@ class RestClient:
         response = self._wrapper(method="head", url=url)
         if response.status_code == 200:
             return int(response.headers.get("x-count"))
-        raise ResponseCodeError(f'Failed to find databases: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to find databases: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_database(self, database_id: int) -> Database:
         """
@@ -332,6 +407,9 @@ class RestClient:
 
         :returns: The database, if successful.
 
+        :raises NotExistsError: If the container does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the broker service.
+        :raises ServiceError: If something went wrong with obtaining the information in the broker service.
         :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}'
@@ -340,9 +418,13 @@ class RestClient:
             body = response.json()
             return Database.model_validate(body)
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to find database with id {database_id}')
-        raise ResponseCodeError(
-            f'Failed to find database with id {database_id}: response code: {response.status_code} is not 200 (OK)')
+            raise NotExistsError(f'Failed to find database: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to find database: failed to establish connection with broker service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to find database: failed to obtain queue metadata from broker service')
+        raise ResponseCodeError(f'Failed to find database: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def create_database(self, name: str, container_id: int, is_public: bool) -> Database:
         """
@@ -355,9 +437,13 @@ class RestClient:
 
         :returns: The database, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the container does not exist.
+        :raises QueryStoreError: If something went wrong with the query store.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database'
         response = self._wrapper(method="post", url=url, force_auth=True,
@@ -365,12 +451,68 @@ class RestClient:
         if response.status_code == 201:
             body = response.json()
             return Database.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to create database: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to create database: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to create database: container not found')
-        raise ResponseCodeError(
-            f'Failed to create database: response code: {response.status_code} is not 201 (CREATED)')
+        if response.status_code == 409:
+            raise QueryStoreError(f'Failed to create database: failed to create query store in data database')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to create database: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to create database: failed to create in search service')
+        raise ResponseCodeError(f'Failed to create database: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
+
+    def create_container(self, name: str, host: str, image_id: int, sidecar_host: str, sidecar_port: int,
+                         privileged_username: str, privileged_password: str, port: int = None, ui_host: str = None,
+                         ui_port: int = None) -> Container:
+        """
+        Register a container instance executing a given container image. Note that this does not create a container,
+        but only saves it in the metadata database to be used within DBRepo. The container still needs to be created
+        through e.g. `docker run image:tag -d`.
+
+        :param name: The container name.
+        :param host: The container hostname.
+        :param image_id: The container image id.
+        :param sidecar_host: The container sidecar hostname.
+        :param sidecar_port: The container sidecar port.
+        :param privileged_username: The container privileged user username.
+        :param privileged_password: The container privileged user password.
+        :param port: The container port bound to the host. Optional.
+        :param ui_host: The container hostname displayed in the user interface. Optional. Default: value of `host`
+        :param ui_port: The container port displayed in the user interface. Optional. Default: `default_port` of image.
+
+        :returns: The container, if successful.
+
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
+        :raises NameExistsError: If a container with this name already exists.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
+        """
+        url = f'/api/container'
+        response = self._wrapper(method="post", url=url, force_auth=True,
+                                 payload=CreateContainer(name=name, host=host, image_id=image_id,
+                                                         sidecar_host=sidecar_host, sidecar_port=sidecar_port,
+                                                         privileged_username=privileged_username,
+                                                         privileged_password=privileged_password, port=port,
+                                                         ui_host=ui_host, ui_port=ui_port))
+        if response.status_code == 201:
+            body = response.json()
+            return Container.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to create container: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to create container: not allowed')
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to create container: container not found')
+        if response.status_code == 409:
+            raise NameExistsError(f'Failed to create container: container name already exists')
+        raise ResponseCodeError(f'Failed to create container: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
     def update_database_visibility(self, database_id: int, is_public: bool) -> Database:
         """
@@ -382,19 +524,29 @@ class RestClient:
 
         :returns: The database, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase does not exist.
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the update.
         """
         url = f'/api/database/{database_id}'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=ModifyVisibility(is_public=is_public))
         if response.status_code == 202:
             body = response.json()
             return Database.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to update database visibility: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update database visibility: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update database visibility: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to update database visibility: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to update database visibility: failed to update in search service')
         raise ResponseCodeError(
             f'Failed to update database visibility: response code: {response.status_code} is not 202 (ACCEPTED)')
 
@@ -407,21 +559,71 @@ class RestClient:
 
         :returns: The database, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises NotExistsError: If thedatabase does not exist.
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the update.
         """
         url = f'/api/database/{database_id}/owner'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=ModifyOwner(id=user_id))
         if response.status_code == 202:
             body = response.json()
             return Database.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to update database visibility: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update database visibility: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update database visibility: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to update database visibility: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to update database visibility: failed to update in search service')
         raise ResponseCodeError(
             f'Failed to update database visibility: response code: {response.status_code} is not 202 (ACCEPTED)')
 
+    def update_database_schema(self, database_id: int) -> Database:
+        """
+        Updates the database table and view metadata of a database with given database id.
+
+        :param database_id: The database id.
+
+        :returns: The updated database, if successful.
+
+        :raises MalformedError: If the payload was rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the data service.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the update.
+        """
+        url = f'/api/database/{database_id}/metadata/table'
+        response = self._wrapper(method="put", url=url, force_auth=True)
+        if response.status_code == 200:
+            response.json()
+            url = f'/api/database/{database_id}/metadata/view'
+            response = self._wrapper(method="put", url=url, force_auth=True)
+            if response.status_code == 200:
+                body = response.json()
+                return Database.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to update database schema: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to update database schema: not allowed')
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to update database schema: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to update database schema: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to update database schema: failed to update in search service')
+        raise ResponseCodeError(
+            f'Failed to update database schema: response code: {response.status_code} is not 200 (OK)')
+
     def create_table(self, database_id: int, name: str, columns: List[CreateTableColumn],
                      constraints: CreateTableConstraints, description: str = None) -> Table:
         """
@@ -435,11 +637,13 @@ class RestClient:
 
         :returns: The table, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises NameExistsError: If a table with this name already exists.
-        :raises ForbiddenError: If the action is not allowed.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises NotExistsError: If the container does not exist.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database does not exist.
+        :raises NameExistsError: If a table with this name already exists.
+        :raises ServiceConnectionError: If something went wrong with connection to the data service.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the creation.
         """
         url = f'/api/database/{database_id}/table'
         response = self._wrapper(method="post", url=url, force_auth=True,
@@ -449,15 +653,19 @@ class RestClient:
             body = response.json()
             return Table.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to create table: service rejected malformed payload')
+            raise MalformedError(f'Failed to create table: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to create table: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to create table: container not found')
+            raise NotExistsError(f'Failed to create table: not found')
         if response.status_code == 409:
             raise NameExistsError(f'Failed to create table: table name exists')
-        raise ResponseCodeError(
-            f'Failed to create table: response code: {response.status_code} is not 201 (CREATED)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to create table: failed to establish connection to data service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to create table: failed to create table in data service')
+        raise ResponseCodeError(f'Failed to create table: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
     def get_tables(self, database_id: int) -> List[TableBrief]:
         """
@@ -467,6 +675,8 @@ class RestClient:
 
         :returns: List of tables, if successful.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database does not exist.
         :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/table'
@@ -474,7 +684,12 @@ class RestClient:
         if response.status_code == 200:
             body = response.json()
             return TypeAdapter(List[TableBrief]).validate_python(body)
-        raise ResponseCodeError(f'Failed to find tables: response code: {response.status_code} is not 200 (OK)')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to get tables: not allowed')
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to get tables: database not found')
+        raise ResponseCodeError(f'Failed to get tables: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_table(self, database_id: int, table_id: int) -> Table:
         """
@@ -485,9 +700,11 @@ class RestClient:
 
         :returns: List of tables, if successful.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the table does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the metadata service.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
         """
         url = f'/api/database/{database_id}/table/{table_id}'
         response = self._wrapper(method="get", url=url)
@@ -498,7 +715,12 @@ class RestClient:
             raise ForbiddenError(f'Failed to find table: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to find table: not found')
-        raise ResponseCodeError(f'Failed to find table: response code: {response.status_code} is not 200 (OK)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to find table: failed to establish connection to broker service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to find table: failed to obtain queue information from broker service')
+        raise ResponseCodeError(f'Failed to find table: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def delete_table(self, database_id: int, table_id: int) -> None:
         """
@@ -507,19 +729,55 @@ class RestClient:
         :param database_id: The database id.
         :param table_id: The table id.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the data service.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the deletion.
         """
         url = f'/api/database/{database_id}/table/{table_id}'
         response = self._wrapper(method="delete", url=url, force_auth=True)
         if response.status_code == 202:
             return
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to delete table: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to delete table: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to delete table: not found')
-        raise ResponseCodeError(f'Failed to delete table: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to delete table: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to delete table: failed to delete in search service')
+        raise ResponseCodeError(f'Failed to delete table: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
+
+    def delete_container(self, container_id: int) -> None:
+        """
+        Deletes a container with given id. Note that this does not delete the container, but deletes the entry in the
+        metadata database. The container still needs to be removed, e.g. `docker container stop hash` and then
+        `docker container rm hash`.
+
+        :param container_id: The container id.
+
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
+        :raises ResponseCodeError: If something went wrong with the deletion.
+        """
+        url = f'/api/container/{container_id}'
+        response = self._wrapper(method="delete", url=url, force_auth=True)
+        if response.status_code == 202:
+            return
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to delete container: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to delete container: not allowed')
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to delete container: not found')
+        raise ResponseCodeError(f'Failed to delete container: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def get_table_metadata(self, database_id: int) -> Database:
         """
@@ -527,9 +785,9 @@ class RestClient:
 
         :param database_id: The database id.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the table does not exist.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If the container does not exist.
         """
         url = f'/api/database/{database_id}/metadata/table'
         response = self._wrapper(method="put", url=url, force_auth=True)
@@ -540,7 +798,38 @@ class RestClient:
             raise ForbiddenError(f'Failed to get tables metadata: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to get tables metadata: not found')
-        raise ResponseCodeError(f'Failed to get tables metadata: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to get tables metadata: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
+
+    def get_table_history(self, database_id: int, table_id: int, size: int = 100) -> Database:
+        """
+        Get the table history of insert/delete operations.
+
+        :param database_id: The database id.
+        :param table_id: The table id.
+        :param size: The number of operations. Optional. Default: 100.
+
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the table does not exist.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
+        """
+        url = f'/api/database/{database_id}/table/{table_id}/history?size={size}'
+        response = self._wrapper(method="get", url=url, force_auth=True)
+        if response.status_code == 200:
+            body = response.json()
+            return Database.model_validate(body)
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to get table history: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to get table history: not allowed')
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to get table history: not found')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to get table history: failed to establish connection with metadata service')
+        raise ResponseCodeError(f'Failed to get table history: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_views(self, database_id: int) -> List[View]:
         """
@@ -550,20 +839,18 @@ class RestClient:
 
         :returns: The list of views, if successful.
 
+        :raises NotExistsError: If the container does not exist.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
         """
         url = f'/api/database/{database_id}/view'
         response = self._wrapper(method="get", url=url)
         if response.status_code == 200:
             body = response.json()
             return TypeAdapter(List[View]).validate_python(body)
-        if response.status_code == 403:
-            raise ForbiddenError(f'Failed to find views: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to find views: not found')
-        raise ResponseCodeError(f'Failed to find views: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to find views: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_view(self, database_id: int, view_id: int) -> View:
         """
@@ -574,9 +861,9 @@ class RestClient:
 
         :returns: The view, if successful.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
         """
         url = f'/api/database/{database_id}/view/{view_id}'
         response = self._wrapper(method="get", url=url)
@@ -587,7 +874,8 @@ class RestClient:
             raise ForbiddenError(f'Failed to find view: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to find view: not found')
-        raise ResponseCodeError(f'Failed to find view: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to find view: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def create_view(self, database_id: int, name: str, query: str, is_public: bool) -> View:
         """
@@ -601,9 +889,13 @@ class RestClient:
 
         :returns: The created view, if successful.
 
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database does not exist.
+        :raises ExternalSystemError: If the mapped view creation query is erroneous.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
         """
         url = f'/api/database/{database_id}/view'
         response = self._wrapper(method="post", url=url, force_auth=True,
@@ -611,13 +903,20 @@ class RestClient:
         if response.status_code == 201:
             body = response.json()
             return View.model_validate(body)
-        if response.status_code == 400 or response.status_code == 423:
-            raise MalformedError(f'Failed to create view: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to create view: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to create view: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to create view: not found')
-        raise ResponseCodeError(f'Failed to create view: response code: {response.status_code} is not 201 (CREATED)')
+        if response.status_code == 423:
+            raise ExternalSystemError(f'Failed to create view: mapped invalid query: {response.text}')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to create view: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to create view: failed to save in search service')
+        raise ResponseCodeError(f'Failed to create view: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
     def delete_view(self, database_id: int, view_id: int) -> None:
         """
@@ -626,21 +925,32 @@ class RestClient:
         :param database_id: The database id.
         :param view_id: The view id.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
+        :raises ExternalSystemError: If the mapped view deletion query is erroneous.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the deletion.
         """
         url = f'/api/database/{database_id}/view/{view_id}'
         response = self._wrapper(method="delete", url=url, force_auth=True)
         if response.status_code == 202:
             return
-        if response.status_code == 400 or response.status_code == 423:
-            raise MalformedError(f'Failed to delete view: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to delete view: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to delete view: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to delete view: not found')
-        raise ResponseCodeError(f'Failed to delete view: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 423:
+            raise ExternalSystemError(f'Failed to delete view: mapped invalid delete query')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to delete view: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to delete view: failed to save in search service')
+        raise ResponseCodeError(f'Failed to delete view: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def get_view_data(self, database_id: int, view_id: int, page: int = 0, size: int = 10,
                       df: bool = False) -> Result | DataFrame:
@@ -655,9 +965,12 @@ class RestClient:
 
         :returns: The result of the view query, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the view does not exist.
+        :raises ExternalSystemError: If the mapped view selection query is erroneous.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/view/{view_id}/data'
         params = []
@@ -672,12 +985,18 @@ class RestClient:
                 return DataFrame.from_records(res.result)
             return res
         if response.status_code == 400:
-            raise MalformedError(f'Failed to get view data: service rejected malformed payload')
+            raise MalformedError(f'Failed to get view data: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to get view data: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to get view data: not found')
-        raise ResponseCodeError(f'Failed to get view data: response code: {response.status_code} is not 200 (OK)')
+        if response.status_code == 409:
+            raise ExternalSystemError(f'Failed to get view data: mapping failed: {response.text}')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to get view data: data service failed to establish connection to '
+                               f'metadata service')
+        raise ResponseCodeError(f'Failed to get view data: response code: {response.status_code} is not '
+                                f'200 (OK):{response.text}')
 
     def get_views_metadata(self, database_id: int) -> Database:
         """
@@ -685,9 +1004,9 @@ class RestClient:
 
         :param database_id: The database id.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the container does not exist.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/metadata/view'
         response = self._wrapper(method="put", url=url, force_auth=True)
@@ -698,7 +1017,8 @@ class RestClient:
             raise ForbiddenError(f'Failed to get views metadata: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to get views metadata: not found')
-        raise ResponseCodeError(f'Failed to get views metadata: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to get views metadata: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_table_data(self, database_id: int, table_id: int, page: int = 0, size: int = 10,
                        timestamp: datetime.datetime = None, df: bool = False) -> Result | DataFrame:
@@ -714,10 +1034,11 @@ class RestClient:
 
         :returns: The result of the view query, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the table does not exist.
-        :raises QueryStoreError: If the result set could not be counted.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/table/{table_id}/data'
         params = []
@@ -734,14 +1055,16 @@ class RestClient:
                 return DataFrame.from_records(res.result)
             return res
         if response.status_code == 400:
-            raise MalformedError(f'Failed to get table data: service rejected malformed payload')
+            raise MalformedError(f'Failed to get table data: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to get table data: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to get table data: not found')
-        if response.status_code == 409:
-            raise QueryStoreError(f'Failed to get table data: service rejected result count')
-        raise ResponseCodeError(f'Failed to get table data: response code: {response.status_code} is not 200 (OK)')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to get table data: data service failed to establish connection to '
+                               f'metadata service')
+        raise ResponseCodeError(f'Failed to get table data: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def create_table_data(self, database_id: int, table_id: int, data: dict) -> None:
         """
@@ -751,23 +1074,27 @@ class RestClient:
         :param table_id: The table id.
         :param data: The data dictionary to be inserted into the table with the form column=value of the table.
 
-        :raises ResponseCodeError: If something went wrong with the insert.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises MalformedError: If the payload is rejected by the service (e.g. LOB could not be imported).
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the table does not exist.
-        :raises MalformedError: If the payload is rejected by the service (e.g. LOB data could not be imported).
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the insert.
         """
         url = f'/api/database/{database_id}/table/{table_id}/data'
         response = self._wrapper(method="post", url=url, force_auth=True, payload=CreateData(data=data))
         if response.status_code == 201:
             return
-        if response.status_code == 400 or response.status_code == 410:
-            raise MalformedError(f'Failed to insert table data: service rejected malformed payload')
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to insert table data: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to insert table data: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to insert table data: not found')
-        raise ResponseCodeError(
-            f'Failed to insert table data: response code: {response.status_code} is not 201 (CREATED)')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to insert table data: data service failed to establish connection to metadata service')
+        raise ResponseCodeError(f'Failed to insert table data: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
     def import_table_data(self, database_id: int, table_id: int, separator: str, file_path: str,
                           quote: str = None, skip_lines: int = 0, false_encoding: str = None,
@@ -787,10 +1114,11 @@ class RestClient:
         :param null_encoding: The encoding of null. Optional.
         :param line_encoding: The encoding of the line termination. Optional. Default: CR (Windows).
 
-        :raises ResponseCodeError: If something went wrong with the insert.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises MalformedError: If the payload is rejected by the service (e.g. LOB could not be imported).
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the table does not exist.
-        :raises MalformedError: If the payload is rejected by the service (e.g. LOB data could not be imported).
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the insert.
         """
         client = UploadClient(endpoint=f"{self.endpoint}/api/upload/files")
         filename = client.upload(file_path=file_path)
@@ -803,15 +1131,16 @@ class RestClient:
         if response.status_code == 202:
             return
         if response.status_code == 400:
-            raise MalformedError(f'Failed to import table data: service rejected malformed payload')
+            raise MalformedError(f'Failed to import table data: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to import table data: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to import table data: not found')
-        if response.status_code == 409 or response.status_code == 422:
-            raise ExternalSystemError(f'Failed to import table data: sidecar rejected the import')
-        raise ResponseCodeError(
-            f'Failed to import table data: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to insert table data: data service failed to establish connection to metadata service')
+        raise ResponseCodeError(f'Failed to import table data: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def analyse_datatypes(self, file_path: str, separator: str, enum: bool = None,
                           enum_tol: int = None, upload: bool = True) -> DatatypeAnalysis:
@@ -827,9 +1156,9 @@ class RestClient:
 
         :returns: The determined data types, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the analysis.
         :raises MalformedError: If the payload is rejected by the service.
         :raises NotExistsError: If the file was not found by the Analyse Service.
+        :raises ResponseCodeError: If something went wrong with the analysis.
         """
         if upload:
             client = UploadClient(endpoint=f"{self.endpoint}/api/upload/files")
@@ -847,12 +1176,12 @@ class RestClient:
         if response.status_code == 202:
             body = response.json()
             return DatatypeAnalysis.model_validate(body)
-        if response.status_code == 400 or response.status_code == 500:
-            raise MalformedError(f'Failed to analyse data types: service rejected malformed payload')
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to analyse data types: {response.text}')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to analyse data types: failed to find file in Storage Service')
-        raise ResponseCodeError(
-            f'Failed to analyse data types: response code: {response.status_code} is not 202 (ACCEPTED)')
+            raise NotExistsError(f'Failed to analyse data types: failed to find file in storage service')
+        raise ResponseCodeError(f'Failed to analyse data types: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def analyse_keys(self, file_path: str, separator: str, upload: bool = True) -> KeyAnalysis:
         """
@@ -865,9 +1194,9 @@ class RestClient:
 
         :returns: The determined ranking of the primary key candidates, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the analysis.
         :raises MalformedError: If the payload is rejected by the service.
         :raises NotExistsError: If the file was not found by the Analyse Service.
+        :raises ResponseCodeError: If something went wrong with the analysis.
         """
         if upload:
             client = UploadClient(endpoint=f"{self.endpoint}/api/upload/files")
@@ -883,12 +1212,12 @@ class RestClient:
         if response.status_code == 202:
             body = response.json()
             return KeyAnalysis.model_validate(body)
-        if response.status_code == 400 or response.status_code == 500:
-            raise MalformedError(f'Failed to analyse data types: service rejected malformed payload')
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to analyse data keys: {response.text}')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to analyse data types: failed to find file in Storage Service')
-        raise ResponseCodeError(
-            f'Failed to analyse data types: response code: {response.status_code} is not 202 (ACCEPTED)')
+            raise NotExistsError(f'Failed to analyse data keys: failed to find file in Storage Service')
+        raise ResponseCodeError(f'Failed to analyse data types: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def analyse_table_statistics(self, database_id: int, table_id: int) -> TableStatistics:
         """
@@ -899,9 +1228,11 @@ class RestClient:
 
         :returns: The table statistics, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the analysis.
         :raises MalformedError: If the payload is rejected by the service.
         :raises NotExistsError: If the file was not found by the Analyse Service.
+        :raises ServiceConnectionError: If something went wrong with connection to the metadata service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the analysis.
         """
         url = f'/api/analyse/database/{database_id}/table/{table_id}/statistics'
         response = self._wrapper(method="get", url=url)
@@ -909,11 +1240,16 @@ class RestClient:
             body = response.json()
             return TableStatistics.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to analyse table statistics: service rejected malformed payload')
+            raise MalformedError(f'Failed to analyse table statistics: {response.text}')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to analyse table statistics: separator error')
-        raise ResponseCodeError(
-            f'Failed to analyse table statistics: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 502:
+            raise NotExistsError(
+                f'Failed to analyse table statistics: data service failed to establish connection to metadata service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to analyse table statistics: failed to save statistic in search service')
+        raise ResponseCodeError(f'Failed to analyse table statistics: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def update_table_data(self, database_id: int, table_id: int, data: dict, keys: dict) -> None:
         """
@@ -924,23 +1260,27 @@ class RestClient:
         :param data: The data dictionary to be updated into the table with the form column=value of the table.
         :param keys: The key dictionary matching the rows in the form column=value.
 
-        :raises ResponseCodeError: If something went wrong with the update.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If the table does not exist.
         :raises MalformedError: If the payload is rejected by the service (e.g. LOB data could not be imported).
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the table does not exist.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the update.
         """
         url = f'/api/database/{database_id}/table/{table_id}/data'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=UpdateData(data=data, keys=keys))
         if response.status_code == 202:
             return
-        if response.status_code == 400 or response.status_code == 410:
-            raise MalformedError(f'Failed to update table data: service rejected malformed payload')
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to update table data: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update table data: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update table data: not found')
-        raise ResponseCodeError(
-            f'Failed to update table data: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to update table data: data service failed to establish connection to metadata service')
+        raise ResponseCodeError(f'Failed to update table data: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def delete_table_data(self, database_id: int, table_id: int, keys: dict) -> None:
         """
@@ -950,23 +1290,27 @@ class RestClient:
         :param table_id: The table id.
         :param keys: The key dictionary matching the rows in the form column=value.
 
-        :raises ResponseCodeError: If something went wrong with the deletion.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If the table does not exist.
         :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the table does not exist.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the deletion.
         """
         url = f'/api/database/{database_id}/table/{table_id}/data'
         response = self._wrapper(method="delete", url=url, force_auth=True, payload=DeleteData(keys=keys))
         if response.status_code == 202:
             return
         if response.status_code == 400:
-            raise MalformedError(f'Failed to delete table data: service rejected malformed payload')
+            raise MalformedError(f'Failed to delete table data: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to delete table data: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to delete table data: not found')
-        raise ResponseCodeError(
-            f'Failed to delete table data: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to update table data: data service failed to establish connection to metadata service')
+        raise ResponseCodeError(f'Failed to delete table data: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def get_table_data_count(self, database_id: int, table_id: int, page: int = 0, size: int = 10,
                              timestamp: datetime.datetime = None) -> int:
@@ -981,10 +1325,12 @@ class RestClient:
 
         :returns: The result of the view query, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the table does not exist.
-        :raises QueryStoreError: If the result set could not be counted.
+        :raises ExternalSystemError: If the mapped view selection query is erroneous.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/table/{table_id}/data'
         if page is not None and size is not None:
@@ -999,14 +1345,18 @@ class RestClient:
         if response.status_code == 200:
             return int(response.headers.get('X-Count'))
         if response.status_code == 400:
-            raise MalformedError(f'Failed to get table data: service rejected malformed payload')
+            raise MalformedError(f'Failed to count table data: {response.text}')
         if response.status_code == 403:
-            raise ForbiddenError(f'Failed to get table data: not allowed')
+            raise ForbiddenError(f'Failed to count table data: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to get table data: not found')
+            raise NotExistsError(f'Failed to count table data: not found')
         if response.status_code == 409:
-            raise QueryStoreError(f'Failed to get table data: service rejected result count')
-        raise ResponseCodeError(f'Failed to get table data: response code: {response.status_code} is not 200 (OK)')
+            raise ExternalSystemError(f'Failed to count table data: mapping failed: {response.text}')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to count table data: data service failed to establish connection to metadata service')
+        raise ResponseCodeError(f'Failed to count table data: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_view_data_count(self, database_id: int, view_id: int) -> int:
         """
@@ -1017,22 +1367,30 @@ class RestClient:
 
         :returns: The result count of the view query, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the view does not exist.
+        :raises ExternalSystemError: If the mapped view selection query is erroneous.
+        :raises ServiceError: If something went wrong with obtaining the information in the metadata service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/view/{view_id}/data'
         response = self._wrapper(method="head", url=url)
         if response.status_code == 200:
             return int(response.headers.get('X-Count'))
         if response.status_code == 400:
-            raise MalformedError(f'Failed to get view data count: service rejected malformed payload')
+            raise MalformedError(f'Failed to count view data: {response.text}')
         if response.status_code == 403:
-            raise ForbiddenError(f'Failed to get view data count: not allowed')
+            raise ForbiddenError(f'Failed to count view data: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to get view data count: not found')
-        raise ResponseCodeError(f'Failed to get view data count: response code: {response.status_code} is not 200 (OK)')
+            raise NotExistsError(f'Failed to count view data: not found')
+        if response.status_code == 409:
+            raise ExternalSystemError(f'Failed to count view data: mapping failed: {response.text}')
+        if response.status_code == 503:
+            raise ServiceError(
+                f'Failed to count view data: data service failed to establish connection to metadata service')
+        raise ResponseCodeError(f'Failed to count view data: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_database_access(self, database_id: int) -> AccessType:
         """
@@ -1042,9 +1400,9 @@ class RestClient:
 
         :returns: The access type, if successful.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thecontainer does not exist.
         """
         url = f'/api/database/{database_id}/access'
         response = self._wrapper(method="get", url=url)
@@ -1055,7 +1413,31 @@ class RestClient:
             raise ForbiddenError(f'Failed to get database access: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to get database access: not found')
-        raise ResponseCodeError(f'Failed to get database access: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to get database access: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
+
+    def check_database_access(self, database_id: int) -> bool:
+        """
+        Checks access of a view in a database with given database id and view id.
+
+        :param database_id: The database id.
+
+        :returns: The access type, if successful.
+
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
+        """
+        url = f'/api/database/{database_id}/access'
+        response = self._wrapper(method="get", url=url)
+        if response.status_code == 200:
+            return True
+        if response.status_code == 403:
+            return False
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to check database access: not found')
+        raise ResponseCodeError(f'Failed to check database access: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def create_database_access(self, database_id: int, user_id: str, type: AccessType) -> AccessType:
         """
@@ -1067,10 +1449,12 @@ class RestClient:
 
         :returns: The access type, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase or user does not exist.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database or user does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the data service.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/access/{user_id}'
         response = self._wrapper(method="post", url=url, force_auth=True, payload=CreateAccess(type=type))
@@ -1078,13 +1462,18 @@ class RestClient:
             body = response.json()
             return DatabaseAccess.model_validate(body).type
         if response.status_code == 400:
-            raise MalformedError(f'Failed to create database access: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+            raise MalformedError(f'Failed to create database access: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to create database access: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to create database access: not found')
-        raise ResponseCodeError(
-            f'Failed to create database access: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to create database access: failed to establish connection to data service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to create database access: failed to create access in data service')
+        raise ResponseCodeError(f'Failed to create database access: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def update_database_access(self, database_id: int, user_id: str, type: AccessType) -> AccessType:
         """
@@ -1096,10 +1485,12 @@ class RestClient:
 
         :returns: The access type, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase or user does not exist.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database or user does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the data service.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/access/{user_id}'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=UpdateAccess(type=type))
@@ -1107,13 +1498,18 @@ class RestClient:
             body = response.json()
             return DatabaseAccess.model_validate(body).type
         if response.status_code == 400:
-            raise MalformedError(f'Failed to update database access: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+            raise MalformedError(f'Failed to update database access: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to update database access: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update database access: not found')
-        raise ResponseCodeError(
-            f'Failed to update database access: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to update database access: failed to establish connection to data service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to update database access: failed to update access in data service')
+        raise ResponseCodeError(f'Failed to update database access: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def delete_database_access(self, database_id: int, user_id: str) -> None:
         """
@@ -1122,25 +1518,32 @@ class RestClient:
         :param database_id: The database id.
         :param user_id: The user id.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase or user does not exist.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database or user does not exist.
+        :raises ServiceConnectionError: If something went wrong with connection to the data service.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/access/{user_id}'
         response = self._wrapper(method="delete", url=url, force_auth=True)
         if response.status_code == 202:
             return
         if response.status_code == 400:
-            raise MalformedError(f'Failed to delete database access: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+            raise MalformedError(f'Failed to delete database access: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to delete database access: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to delete database access: not found')
-        raise ResponseCodeError(
-            f'Failed to delete database access: response code: {response.status_code} is not 202 (ACCEPTED)')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to delete database access: failed to establish connection to data service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to delete database access: failed to delete access in data service')
+        raise ResponseCodeError(f'Failed to delete database access: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
-    def execute_query(self, database_id: int, query: str, page: int = 0, size: int = 10,
+    def create_subset(self, database_id: int, query: str, page: int = 0, size: int = 10,
                       timestamp: datetime.datetime = datetime.datetime.now()) -> Result:
         """
         Executes a SQL query in a database where the current user has at least read access with given database id. The
@@ -1151,45 +1554,48 @@ class RestClient:
         :param query: The query statement.
         :param page: The result pagination number. Optional. Default: 0.
         :param size: The result pagination size. Optional. Default: 10.
-        :param timestamp: The query execution time. Optional.
+        :param timestamp: The query execution time. Optional. Default: now.
 
         :returns: The result set, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the database, table or user does not exist.
         :raises QueryStoreError: The query store rejected the query.
-        :raises MetadataConsistencyError: The service failed to parse columns from the metadata database.
+        :raises FormatNotAvailable: The subset query contains non-supported keywords.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         url = f'/api/database/{database_id}/subset'
         if page is not None and size is not None:
             url += f'?page={page}&size={size}'
         response = self._wrapper(method="post", url=url, force_auth=True,
                                  payload=ExecuteQuery(statement=query, timestamp=timestamp))
-        if response.status_code == 202:
+        if response.status_code == 201:
             body = response.json()
             return Result.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to execute query: service rejected malformed payload')
+            raise MalformedError(f'Failed to create subset: {response.text}')
         if response.status_code == 403:
-            raise ForbiddenError(f'Failed to execute query: not allowed')
+            raise ForbiddenError(f'Failed to create subset: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to execute query: not found')
-        if response.status_code == 409:
-            raise QueryStoreError(f'Failed to execute query: query store rejected query')
+            raise NotExistsError(f'Failed to create subset: not found')
         if response.status_code == 417:
-            raise MetadataConsistencyError(f'Failed to execute query: service expected other metadata')
-        raise ResponseCodeError(
-            f'Failed to execute query: response code: {response.status_code} is not 202 (ACCEPTED)')
+            raise QueryStoreError(f'Failed to create subset: query store rejected query')
+        if response.status_code == 501:
+            raise FormatNotAvailable(f'Failed to create subset: contains non-supported keywords: {response.text}')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to create subset: failed to establish connection with data database')
+        raise ResponseCodeError(f'Failed to create subset: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
-    def get_query_data(self, database_id: int, query_id: int, page: int = 0, size: int = 10,
-                       df: bool = False) -> Result | DataFrame:
+    def get_subset_data(self, database_id: int, subset_id: int, page: int = 0, size: int = 10,
+                        df: bool = False) -> Result | DataFrame:
         """
         Re-executes a query in a database with given database id and query id.
 
         :param database_id: The database id.
-        :param query_id: The query id.
+        :param subset_id: The subset id.
         :param page: The result pagination number. Optional. Default: 0.
         :param size: The result pagination size. Optional. Default: 10.
         :param size: The result pagination size. Optional. Default: 10.
@@ -1197,15 +1603,14 @@ class RestClient:
 
         :returns: The result set, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the database, query or user does not exist.
-        :raises QueryStoreError: The query store rejected the query.
-        :raises MetadataConsistencyError: The service failed to parse columns from the metadata database.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
         headers = {}
-        url = f'/api/database/{database_id}/subset/{query_id}/data'
+        url = f'/api/database/{database_id}/subset/{subset_id}/data'
         if page is not None and size is not None:
             url += f'?page={page}&size={size}'
         response = self._wrapper(method="get", url=url, headers=headers)
@@ -1216,85 +1621,80 @@ class RestClient:
                 return DataFrame.from_records(res.result)
             return res
         if response.status_code == 400:
-            raise MalformedError(f'Failed to re-execute query: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
-            raise ForbiddenError(f'Failed to re-execute query: not allowed')
+            raise MalformedError(f'Failed to get query data: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to get query data: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to re-execute query: not found')
-        if response.status_code == 409:
-            raise QueryStoreError(f'Failed to re-execute query: query store rejected query')
-        if response.status_code == 417:
-            raise MetadataConsistencyError(f'Failed to re-execute query: service expected other metadata')
-        raise ResponseCodeError(
-            f'Failed to re-execute query: response code: {response.status_code} is not 200 (OK)')
+            raise NotExistsError(f'Failed to get query data: not found')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to get query data: failed to establish connection with data database')
+        raise ResponseCodeError(f'Failed to get query data: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
-    def get_query_data_count(self, database_id: int, query_id: int, page: int = 0, size: int = 10) -> int:
+    def get_subset_data_count(self, database_id: int, subset_id: int, page: int = 0, size: int = 10) -> int:
         """
         Re-executes a query in a database with given database id and query id and only counts the results.
 
         :param database_id: The database id.
-        :param query_id: The query id.
+        :param subset_id: The subset id.
         :param page: The result pagination number. Optional. Default: 0.
         :param size: The result pagination size. Optional. Default: 10.
 
         :returns: The result set, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
         :raises MalformedError: If the payload is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the database, query or user does not exist.
-        :raises QueryStoreError: The query store rejected the query.
-        :raises MetadataConsistencyError: The service failed to parse columns from the metadata database.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
-        url = f'/api/database/{database_id}/subset/{query_id}/data'
+        url = f'/api/database/{database_id}/subset/{subset_id}/data'
         if page is not None and size is not None:
             url += f'?page={page}&size={size}'
         response = self._wrapper(method="head", url=url)
         if response.status_code == 200:
             return int(response.headers.get('X-Count'))
         if response.status_code == 400:
-            raise MalformedError(f'Failed to re-execute query: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
-            raise ForbiddenError(f'Failed to re-execute query: not allowed')
+            raise MalformedError(f'Failed to get query count: {response.text}')
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to get query count: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to re-execute query: not found')
-        if response.status_code == 409:
-            raise QueryStoreError(f'Failed to re-execute query: query store rejected query')
-        if response.status_code == 417:
-            raise MetadataConsistencyError(f'Failed to re-execute query: service expected other metadata')
+            raise NotExistsError(f'Failed to get query count: not found')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to get query count: failed to establish connection with data database')
         raise ResponseCodeError(
-            f'Failed to re-execute query: response code: {response.status_code} is not 200 (OK)')
+            f'Failed to get query count: response code: {response.status_code} is not 200 (OK)')
 
-    def get_query(self, database_id: int, query_id: int) -> Query:
+    def get_subset(self, database_id: int, subset_id: int) -> Query:
         """
         Get query from a database with given database id and query id.
 
         :param database_id: The database id.
-        :param query_id: The query id.
+        :param subset_id: The subset id.
 
         :returns: The query, if successful.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database, query or user does not exist.
+        :raises FormatNotAvailable: If the service could not represent the output.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase, query or user does not exist.
-        :raises QueryStoreError: The query store rejected the query.
-        :raises MetadataConsistencyError: The service failed to parse columns from the metadata database.
         """
-        url = f'/api/database/{database_id}/subset/{query_id}'
+        url = f'/api/database/{database_id}/subset/{subset_id}'
         response = self._wrapper(method="get", url=url)
         if response.status_code == 200:
             body = response.json()
             return Query.model_validate(body)
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to find subset: not allowed')
         if response.status_code == 404:
-            raise NotExistsError(f'Failed to find query: not found')
-        if response.status_code == 403 or response.status_code == 405:
-            raise ForbiddenError(f'Failed to find query: not allowed')
-        if response.status_code == 417:
-            raise MetadataConsistencyError(f'Failed to find query: service expected other metadata')
-        if response.status_code == 501 or response.status_code == 503 or response.status_code == 504:
-            raise QueryStoreError(f'Failed to find query: query store rejected query')
-        raise ResponseCodeError(
-            f'Failed to find query: response code: {response.status_code} is not 200 (OK)')
+            raise NotExistsError(f'Failed to find subset: not found')
+        if response.status_code == 406:
+            raise FormatNotAvailable(f'Failed to find subset: failed to provide acceptable representation')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to find subset: failed to establish connection with data database')
+        raise ResponseCodeError(f'Failed to find subset: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def get_queries(self, database_id: int) -> List[Query]:
         """
@@ -1304,63 +1704,66 @@ class RestClient:
 
         :returns: List of queries, if successful.
 
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database or user does not exist.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
         :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises MalformedError: If the query is rejected by the service.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase or user does not exist.
-        :raises QueryStoreError: The query store rejected the query.
         """
         url = f'/api/database/{database_id}/subset'
         response = self._wrapper(method="get", url=url)
         if response.status_code == 200:
             body = response.json()
             return TypeAdapter(List[Query]).validate_python(body)
-        if response.status_code == 403 or response.status_code == 405:
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to find queries: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to find queries: not found')
-        if response.status_code == 423:
-            raise MalformedError(f'Failed to find queries: service rejected malformed query')
-        if response.status_code == 501 or response.status_code == 503 or response.status_code == 504:
-            raise QueryStoreError(f'Failed to find queries: query store rejected query')
-        raise ResponseCodeError(
-            f'Failed to find query: response code: {response.status_code} is not 200 (OK)')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to find queries: failed to establish connection with data database')
+        raise ResponseCodeError(f'Failed to find query: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
-    def update_query(self, database_id: int, query_id: int, persist: bool) -> Query:
+    def update_subset(self, database_id: int, subset_id: int, persist: bool) -> Query:
         """
-        Update query from a database with given database id and query id.
+        Save query or mark it for deletion (at a later time) in a database with given database id and query id.
 
         :param database_id: The database id.
-        :param query_id: The query id.
-        :param persist: If set to true, the query will be saved and visible in the User Interface, otherwise the query \
-                is marked for deletion in the future and not visible in the User Interface.
+        :param subset_id: The subset id.
+        :param persist: If set to true, the query will be saved and visible in the user interface, otherwise the query \
+                is marked for deletion in the future and not visible in the user interface.
 
         :returns: The query, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval.
-        :raises ForbiddenError: If the action is not allowed.
-        :raises NotExistsError: If thedatabase or user does not exist.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the database or user does not exist.
         :raises QueryStoreError: The query store rejected the update.
+        :raises ServiceError: If something went wrong with obtaining the information in the data service.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
         """
-        url = f'/api/database/{database_id}/subset/{query_id}'
+        url = f'/api/database/{database_id}/subset/{subset_id}'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=UpdateQuery(persist=persist))
         if response.status_code == 202:
             body = response.json()
             return Query.model_validate(body)
-        if response.status_code == 403 or response.status_code == 405:
+        if response.status_code == 400:
+            raise MalformedError(f'Failed to update query: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to update query: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update query: not found')
-        if response.status_code == 412:
+        if response.status_code == 417:
             raise QueryStoreError(f'Failed to update query: query store rejected update')
-        raise ResponseCodeError(
-            f'Failed to update query: response code: {response.status_code} is not 200 (OK)')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to update query: failed to establish connection with data database')
+        raise ResponseCodeError(f'Failed to update query: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def create_identifier(self, database_id: int, type: IdentifierType, titles: List[CreateIdentifierTitle],
                           publisher: str, creators: List[CreateIdentifierCreator], publication_year: int,
                           descriptions: List[CreateIdentifierDescription] = None,
                           funders: List[CreateIdentifierFunder] = None, licenses: List[License] = None,
-                          language: Language = None, query_id: int = None, view_id: int = None, table_id: int = None,
+                          language: Language = None, subset_id: int = None, view_id: int = None, table_id: int = None,
                           publication_day: int = None, publication_month: int = None,
                           related_identifiers: List[CreateRelatedIdentifier] = None) -> Identifier:
         """
@@ -1376,7 +1779,7 @@ class RestClient:
         :param funders: The funders(s) of the created identifier. Optional.
         :param licenses: The license(s) of the created identifier. Optional.
         :param language: The language of the created identifier. Optional.
-        :param query_id: The query id of the created identifier. Required when type=SUBSET, otherwise invalid. Optional.
+        :param subset_id: The subset id of the created identifier. Required when type=SUBSET, otherwise invalid. Optional.
         :param view_id: The view id of the created identifier. Required when type=VIEW, otherwise invalid. Optional.
         :param table_id: The table id of the created identifier. Required when type=TABLE, otherwise invalid. Optional.
         :param publication_day: The publication day of the created identifier. Optional.
@@ -1385,16 +1788,17 @@ class RestClient:
 
         :returns: The identifier, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the creation of the identifier.
-        :raises ForbiddenError: If the action is not allowed.
         :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the database, table/view/subset or user does not exist.
-        :raises ExternalSystemError: If the external system (DataCite) refused communication with the service.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the creation of the identifier.
         """
         url = f'/api/identifier'
         payload = CreateIdentifier(database_id=database_id, type=type, titles=titles, publisher=publisher,
                                    creators=creators, publication_year=publication_year, descriptions=descriptions,
-                                   funders=funders, licenses=licenses, language=language, query_id=query_id,
+                                   funders=funders, licenses=licenses, language=language, subset_id=subset_id,
                                    view_id=view_id, table_id=table_id, publication_day=publication_day,
                                    publication_month=publication_month, related_identifiers=related_identifiers)
         response = self._wrapper(method="post", url=url, force_auth=True, payload=payload)
@@ -1402,21 +1806,24 @@ class RestClient:
             body = response.json()
             return Identifier.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to create identifier: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+            raise MalformedError(f'Failed to create identifier: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to create identifier: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to create identifier: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to create identifier: failed to establish connection with search service')
         if response.status_code == 503:
-            raise ExternalSystemError(f'Failed to create identifier: external system rejected communication')
-        raise ResponseCodeError(
-            f'Failed to create identifier: response code: {response.status_code} is not 201 (CREATED)')
+            raise ServiceError(f'Failed to create identifier: failed to save in search service')
+        raise ResponseCodeError(f'Failed to create identifier: response code: {response.status_code} is not '
+                                f'201 (CREATED): {response.text}')
 
     def save_identifier(self, identifier_id: int, database_id: int, type: IdentifierType,
                         titles: List[CreateIdentifierTitle], publisher: str, creators: List[CreateIdentifierCreator],
                         publication_year: int, descriptions: List[CreateIdentifierDescription] = None,
                         funders: List[CreateIdentifierFunder] = None, licenses: List[License] = None,
-                        language: Language = None, query_id: int = None, view_id: int = None, table_id: int = None,
+                        language: Language = None, subset_id: int = None, view_id: int = None, table_id: int = None,
                         publication_day: int = None, publication_month: int = None,
                         related_identifiers: List[CreateRelatedIdentifier] = None) -> Identifier:
         """
@@ -1433,7 +1840,7 @@ class RestClient:
         :param funders: The funders(s) of the created identifier. Optional.
         :param licenses: The license(s) of the created identifier. Optional.
         :param language: The language of the created identifier. Optional.
-        :param query_id: The query id of the created identifier. Required when type=SUBSET, otherwise invalid. Optional.
+        :param subset_id: The subset id of the created identifier. Required when type=SUBSET, otherwise invalid. Optional.
         :param view_id: The view id of the created identifier. Required when type=VIEW, otherwise invalid. Optional.
         :param table_id: The table id of the created identifier. Required when type=TABLE, otherwise invalid. Optional.
         :param publication_day: The publication day of the created identifier. Optional.
@@ -1442,32 +1849,36 @@ class RestClient:
 
         :returns: The identifier, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the creation of the identifier.
-        :raises ForbiddenError: If the action is not allowed.
         :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the database, table/view/subset or user does not exist.
-        :raises ExternalSystemError: If the external system (DataCite) refused communication with the service.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the creation of the identifier.
         """
         url = f'/api/identifier/{identifier_id}'
         payload = CreateIdentifier(database_id=database_id, type=type, titles=titles, publisher=publisher,
                                    creators=creators, publication_year=publication_year, descriptions=descriptions,
-                                   funders=funders, licenses=licenses, language=language, query_id=query_id,
+                                   funders=funders, licenses=licenses, language=language, subset_id=subset_id,
                                    view_id=view_id, table_id=table_id, publication_day=publication_day,
                                    publication_month=publication_month, related_identifiers=related_identifiers)
         response = self._wrapper(method="put", url=url, force_auth=True, payload=payload)
-        if response.status_code == 201:
+        if response.status_code == 202:
             body = response.json()
             return Identifier.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to save identifier: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+            raise MalformedError(f'Failed to save identifier: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to save identifier: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to save identifier: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to save identifier: failed to establish connection with search service')
         if response.status_code == 503:
-            raise ExternalSystemError(f'Failed to save identifier: external system rejected communication')
-        raise ResponseCodeError(
-            f'Failed to save identifier: response code: {response.status_code} is not 202 (ACCEPTED)')
+            raise ServiceError(f'Failed to save identifier: failed to update in search service')
+        raise ResponseCodeError(f'Failed to save identifier: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
     def publish_identifier(self, identifier_id: int) -> Identifier:
         """
@@ -1477,87 +1888,102 @@ class RestClient:
 
         :returns: The identifier, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the creation of the identifier.
-        :raises ForbiddenError: If the action is not allowed.
         :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the database, table/view/subset or user does not exist.
-        :raises ExternalSystemError: If the external system (DataCite) refused communication with the service.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the creation of the identifier.
         """
         url = f'/api/identifier/{identifier_id}/publish'
         response = self._wrapper(method="put", url=url, force_auth=True)
-        if response.status_code == 201:
+        if response.status_code == 202:
             body = response.json()
             return Identifier.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to publish identifier: service rejected malformed payload')
-        if response.status_code == 403 or response.status_code == 405:
+            raise MalformedError(f'Failed to publish identifier: {response.text}')
+        if response.status_code == 403:
             raise ForbiddenError(f'Failed to publish identifier: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to publish identifier: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(
+                f'Failed to publish identifier: failed to establish connection with search service')
         if response.status_code == 503:
-            raise ExternalSystemError(f'Failed to publish identifier: external system rejected communication')
-        raise ResponseCodeError(
-            f'Failed to publish identifier: response code: {response.status_code} is not 201 (CREATED)')
+            raise ServiceError(f'Failed to publish identifier: failed to update in search service')
+        raise ResponseCodeError(f'Failed to publish identifier: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
 
-    def suggest_identifier(self, uri: str) -> Identifier:
+    def get_licenses(self) -> List[License]:
         """
-        Suggest identifier metadata for a given identifier URI. Example: ROR, ORCID, ISNI, GND, DOI.
-
-        :param uri: The identifier URI.
-
-        :returns: The identifier, if successful.
+        Get list of licenses allowed.
 
-        :raises ResponseCodeError: If something went wrong with the suggestion of the identifier.
-        :raises NotExistsError: If no metadata can be found or the identifier type is not supported.
+        :returns: List of licenses, if successful.
         """
-        url = f'/api/identifier?url={uri}'
+        url = f'/api/database/license'
         response = self._wrapper(method="get", url=url)
         if response.status_code == 200:
             body = response.json()
-            return Identifier.model_validate(body)
-        if response.status_code == 404:
-            raise NotExistsError(f'Failed to suggest identifier: not found or not supported')
-        raise ResponseCodeError(f'Failed to suggest identifier: response code: {response.status_code} is not 200 (OK)')
+            return TypeAdapter(List[License]).validate_python(body)
+        raise ResponseCodeError(f'Failed to get licenses: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
-    def get_licenses(self) -> List[License]:
+    def get_concepts(self) -> List[Concept]:
         """
-        Get list of licenses allowed.
+        Get list of concepts known to the metadata database.
 
-        :returns: List of licenses, if successful.
+        :returns: List of concepts, if successful.
         """
-        url = f'/api/database/license'
+        url = f'/api/concept'
         response = self._wrapper(method="get", url=url)
         if response.status_code == 200:
             body = response.json()
-            return TypeAdapter(List[License]).validate_python(body)
-        raise ResponseCodeError(f'Failed to get licenses: response code: {response.status_code} is not 200 (OK)')
+            return TypeAdapter(List[Concept]).validate_python(body)
+        raise ResponseCodeError(f'Failed to get concepts: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
-    def get_identifiers(self, ld: bool = False) -> List[Identifier] | str:
+    def get_identifiers(self, database_id: int = None, subset_id: int = None, view_id: int = None,
+                        table_id: int = None) -> List[Identifier] | str:
         """
-        Get list of identifiers.
+        Get list of identifiers, filter by the remaining optional arguments.
 
-        :param ld: If set to true, identifiers are requested as JSON-LD. Optional. Default: false.
+        :param database_id: The database id. Optional.
+        :param subset_id: The subset id. Optional. Requires `database_id` to be set.
+        :param view_id: The view id. Optional. Requires `database_id` to be set.
+        :param table_id: The table id. Optional. Requires `database_id` to be set.
 
         :returns: List of identifiers, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval of the identifiers.
         :raises NotExistsError: If the accept header is neither application/json nor application/ld+json.
+        :raises FormatNotAvailable: If the service could not represent the output.
+        :raises ResponseCodeError: If something went wrong with the retrieval of the identifiers.
         """
-        url = f'/api/pid'
-        headers = None
-        if ld:
-            headers = {'Accept': 'application/ld+json'}
-        response = self._wrapper(method="get", url=url, headers=headers)
+        url = f'/api/identifiers'
+        if database_id is not None:
+            url += f'?dbid={database_id}'
+        if subset_id is not None:
+            if database_id is None:
+                raise RequestError(f'Filtering by subset_id requires database_id to be set')
+            url += f'&qid={subset_id}'
+        if view_id is not None:
+            if database_id is None:
+                raise RequestError(f'Filtering by view_id requires database_id to be set')
+            url += f'&vid={view_id}'
+        if table_id is not None:
+            if database_id is None:
+                raise RequestError(f'Filtering by table_id requires database_id to be set')
+            url += f'&tid={table_id}'
+        response = self._wrapper(method="get", url=url, headers={'Accept': 'application/json'})
         if response.status_code == 200:
-            if ld:
-                return response.json()
-            else:
-                body = response.json()
-                return TypeAdapter(List[Identifier]).validate_python(body)
+            body = response.json()
+            return TypeAdapter(List[Identifier]).validate_python(body)
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to get identifiers: requested style is not known')
         if response.status_code == 406:
             raise MalformedError(
                 f'Failed to get identifiers: accept header must be application/json or application/ld+json')
-        raise ResponseCodeError(f'Failed to get identifiers: response code: {response.status_code} is not 200 (OK)')
+        raise ResponseCodeError(f'Failed to get identifiers: response code: {response.status_code} is not '
+                                f'200 (OK): {response.text}')
 
     def update_table_column(self, database_id: int, table_id: int, column_id: int, concept_uri: str = None,
                             unit_uri: str = None) -> Column:
@@ -1572,8 +1998,12 @@ class RestClient:
 
         :returns: The column, if successful.
 
-        :raises ResponseCodeError: If something went wrong with the retrieval of the identifiers.
+        :raises MalformedError: If the payload is rejected by the service.
+        :raises ForbiddenError: If something went wrong with the authorization.
         :raises NotExistsError: If the accept header is neither application/json nor application/ld+json.
+        :raises ServiceConnectionError: If something went wrong with connection to the search service.
+        :raises ServiceError: If something went wrong with obtaining the information in the search service.
+        :raises ResponseCodeError: If something went wrong with the retrieval of the identifiers.
         """
         url = f'/api/database/{database_id}/table/{table_id}/column/{column_id}'
         response = self._wrapper(method="put", url=url, force_auth=True,
@@ -1582,9 +2012,13 @@ class RestClient:
             body = response.json()
             return Column.model_validate(body)
         if response.status_code == 400:
-            raise MalformedError(f'Failed to update column: service rejected malformed payload')
+            raise MalformedError(f'Failed to update column: {response.text}')
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update colum: not allowed')
         if response.status_code == 404:
             raise NotExistsError(f'Failed to update colum: not found')
+        if response.status_code == 502:
+            raise ServiceConnectionError(f'Failed to update colum: failed to establish connection to search service')
+        if response.status_code == 503:
+            raise ServiceError(f'Failed to update colum: failed to save in search service')
         raise ResponseCodeError(f'Failed to update colum: response code: {response.status_code} is not 202 (ACCEPTED)')
diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py
index 5eae072f35..4656a5220d 100644
--- a/lib/python/dbrepo/api/dto.py
+++ b/lib/python/dbrepo/api/dto.py
@@ -56,6 +56,19 @@ class CreateDatabase(BaseModel):
     is_public: bool
 
 
+class CreateContainer(BaseModel):
+    name: str
+    host: str
+    image_id: int
+    sidecar_host: str
+    sidecar_port: int
+    privileged_username: str
+    privileged_password: str
+    ui_host: Optional[str] = None
+    ui_port: Optional[int] = None
+    port: Optional[int] = None
+
+
 class CreateUser(BaseModel):
     username: str
     email: str
diff --git a/lib/python/dbrepo/api/exceptions.py b/lib/python/dbrepo/api/exceptions.py
index a606a4fc7b..9aeb83d93b 100644
--- a/lib/python/dbrepo/api/exceptions.py
+++ b/lib/python/dbrepo/api/exceptions.py
@@ -61,6 +61,13 @@ class MetadataConsistencyError(Exception):
     pass
 
 
+class FormatNotAvailable(Exception):
+    """
+    The service cannot provide the result in the requested representation.
+    """
+    pass
+
+
 class ExternalSystemError(Exception):
     """
     The service could not communicate with the external system.
@@ -75,8 +82,29 @@ class AuthenticationError(Exception):
     pass
 
 
+class ServiceConnectionError(Exception):
+    """
+    The service failed to establish connection.
+    """
+    pass
+
+
+class ServiceError(Exception):
+    """
+    The service failed to perform the requested action.
+    """
+    pass
+
+
 class UploadError(Exception):
     """
     The upload was not successful.
     """
     pass
+
+
+class RequestError(Exception):
+    """
+    The request cannot be sent.
+    """
+    pass
diff --git a/lib/python/tests/test_unit_identifier.py b/lib/python/tests/test_unit_identifier.py
index b64816731d..2832f0e799 100644
--- a/lib/python/tests/test_unit_identifier.py
+++ b/lib/python/tests/test_unit_identifier.py
@@ -9,8 +9,7 @@ from dbrepo.api.dto import Identifier, IdentifierType, CreateIdentifierTitle, Cr
     IdentifierCreator, IdentifierTitle, IdentifierDescription, CreateIdentifierDescription, Language, \
     CreateIdentifierFunder, CreateRelatedIdentifier, RelatedIdentifierRelation, RelatedIdentifierType, IdentifierFunder, \
     RelatedIdentifier, UserBrief, IdentifierStatusType
-from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, ExternalSystemError, \
-    AuthenticationError
+from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, AuthenticationError
 
 
 class IdentifierUnitTest(unittest.TestCase):
@@ -100,22 +99,6 @@ class IdentifierUnitTest(unittest.TestCase):
             except NotExistsError:
                 pass
 
-    def test_create_identifier_not_found_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.post('/api/identifier', status_code=503)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                response = client.create_identifier(
-                    database_id=1, type=IdentifierType.VIEW,
-                    titles=[CreateIdentifierTitle(title='Test Title')],
-                    descriptions=[CreateIdentifierDescription(description='Test')],
-                    publisher='TU Wien', publication_year=2024,
-                    creators=[CreateIdentifierCreator(creator_name='Carberry, Josiah')])
-            except ExternalSystemError:
-                pass
-
     def test_create_identifier_not_auth_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
@@ -131,38 +114,6 @@ class IdentifierUnitTest(unittest.TestCase):
             except AuthenticationError:
                 pass
 
-    def test_suggest_identifier_succeeds(self):
-        with requests_mock.Mocker() as mock:
-            exp = Identifier(id=10,
-                             database_id=1,
-                             publication_year=2024,
-                             publisher='TU Wien',
-                             titles=[IdentifierTitle(id=10, title='Test Title')],
-                             descriptions=[IdentifierDescription(id=10, description='Test')],
-                             created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                             last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                             type=IdentifierType.VIEW,
-                             creators=[IdentifierCreator(id=5, creator_name='Carberry, Josiah',
-                                                         name_identifier='https://orcid.org/0000-0002-1825-0097')],
-                             status=IdentifierStatusType.DRAFT,
-                             creator=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise')
-                             )
-            # mock
-            mock.get('/api/identifier?url=https://orcid.org/0000-0002-1825-0097', json=exp.model_dump())
-            # test
-            response = RestClient().suggest_identifier("https://orcid.org/0000-0002-1825-0097")
-            self.assertEqual(exp, response)
-
-    def test_suggest_identifier_not_found_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/identifier?url=https://orcid.org/0000-0002-1825-0097', status_code=404)
-            # test
-            try:
-                response = RestClient().suggest_identifier("https://orcid.org/0000-0002-1825-0097")
-            except NotExistsError:
-                pass
-
     def test_get_identifiers_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = [Identifier(id=10,
@@ -184,25 +135,11 @@ class IdentifierUnitTest(unittest.TestCase):
                               status=IdentifierStatusType.PUBLISHED,
                               creator=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))]
             # mock
-            mock.get('/api/pid', json=[exp[0].model_dump()], headers={"Accept": "application/json"})
+            mock.get('/api/identifiers', json=[exp[0].model_dump()], headers={"Accept": "application/json"})
             # test
             response = RestClient().get_identifiers()
             self.assertEqual(exp, response)
 
-    def test_get_identifiers_ld_json_succeeds(self):
-        with requests_mock.Mocker() as mock:
-            exp = [{"@context": "https://schema.org/", "@type": "Dataset", "url": "http://localhost/database/2/info",
-                    "citation": "http://localhost/pid/2", "hasPart": [], "version": "2024-03-21T12:05:46.000Z",
-                    "name": "sdfsdf", "description": "sfsdf", "identifier": ["http://localhost/pid/2"],
-                    "license": "https://creativecommons.org/licenses/by/4.0/legalcode", "creator": [
-                    {"name": "Weise, Martin", "@type": "Person", "sameAs": "https://orcid.org/0000-0003-4216-302X",
-                     "givenName": "Martin", "familyName": "Weise"}], "temporalCoverage": 2024}]
-            # mock
-            mock.get('/api/pid', json=exp, headers={"Accept": "application/ld+json"})
-            # test
-            response = RestClient().get_identifiers(ld=True)
-            self.assertEqual(exp, response)
-
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/lib/python/tests/test_unit_query.py b/lib/python/tests/test_unit_query.py
index 1a6109dc2b..d2de6f8278 100644
--- a/lib/python/tests/test_unit_query.py
+++ b/lib/python/tests/test_unit_query.py
@@ -15,86 +15,62 @@ from dbrepo.api.exceptions import MalformedError, NotExistsError, ForbiddenError
 
 class QueryUnitTest(unittest.TestCase):
 
-    def test_execute_query_succeeds(self):
+    def test_create_subset_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = Result(result=[{'id': 1, 'username': 'foo'}, {'id': 2, 'username': 'bar'}],
                          headers=[{'id': 0, 'username': 1}],
                          id=None)
             # mock
-            mock.post('/api/database/1/subset', json=exp.model_dump(), status_code=202)
+            mock.post('/api/database/1/subset', json=exp.model_dump(), status_code=201)
             # test
             client = RestClient(username="a", password="b")
-            response = client.execute_query(database_id=1, page=0, size=10,
+            response = client.create_subset(database_id=1, page=0, size=10,
                                             query="SELECT id, username FROM some_table WHERE id IN (1,2)")
             self.assertEqual(exp, response)
 
-    def test_execute_query_malformed_fails(self):
+    def test_create_subset_malformed_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.post('/api/database/1/subset', status_code=400)
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.execute_query(database_id=1,
+                response = client.create_subset(database_id=1,
                                                 query="SELECT id, username FROM some_table WHERE id IN (1,2)")
             except MalformedError:
                 pass
 
-    def test_execute_query_not_allowed_fails(self):
+    def test_create_subset_not_allowed_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.post('/api/database/1/subset', status_code=403)
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.execute_query(database_id=1,
+                response = client.create_subset(database_id=1,
                                                 query="SELECT id, username FROM some_table WHERE id IN (1,2)")
             except ForbiddenError:
                 pass
 
-    def test_execute_query_not_found_fails(self):
+    def test_create_subset_not_found_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.post('/api/database/1/subset', status_code=404)
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.execute_query(database_id=1,
+                response = client.create_subset(database_id=1,
                                                 query="SELECT id, username FROM some_table WHERE id IN (1,2)")
             except NotExistsError:
                 pass
 
-    def test_execute_query_not_valid_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.post('/api/database/1/subset', status_code=409)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                response = client.execute_query(database_id=1,
-                                                query="SELECT id, username FROM some_table WHERE id IN (1,2)")
-            except QueryStoreError:
-                pass
-
-    def test_execute_query_not_expected_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.post('/api/database/1/subset', status_code=417)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                response = client.execute_query(database_id=1,
-                                                query="SELECT id, username FROM some_table WHERE id IN (1,2)")
-            except MetadataConsistencyError:
-                pass
-
-    def test_execute_query_not_auth_fails(self):
+    def test_create_subset_not_auth_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.post('/api/database/1/subset', status_code=417)
             # test
             try:
-                response = RestClient().execute_query(database_id=1,
+                response = RestClient().create_subset(database_id=1,
                                                       query="SELECT id, username FROM some_table WHERE id IN (1,2)")
             except AuthenticationError:
                 pass
@@ -119,7 +95,7 @@ class QueryUnitTest(unittest.TestCase):
             # mock
             mock.get('/api/database/1/subset/6', json=exp.model_dump())
             # test
-            response = RestClient().get_query(database_id=1, query_id=6)
+            response = RestClient().get_subset(database_id=1, subset_id=6)
             self.assertEqual(exp, response)
 
     def test_find_query_not_allowed_fails(self):
@@ -128,7 +104,7 @@ class QueryUnitTest(unittest.TestCase):
             mock.get('/api/database/1/subset/6', status_code=403)
             # test
             try:
-                response = RestClient().get_query(database_id=1, query_id=6)
+                response = RestClient().get_subset(database_id=1, subset_id=6)
             except ForbiddenError:
                 pass
 
@@ -138,30 +114,10 @@ class QueryUnitTest(unittest.TestCase):
             mock.get('/api/database/1/subset/6', status_code=404)
             # test
             try:
-                response = RestClient().get_query(database_id=1, query_id=6)
+                response = RestClient().get_subset(database_id=1, subset_id=6)
             except NotExistsError:
                 pass
 
-    def test_find_query_not_valid_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/subset/6', status_code=501)
-            # test
-            try:
-                response = RestClient().get_query(database_id=1, query_id=6)
-            except QueryStoreError:
-                pass
-
-    def test_find_query_not_expected_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/subset/6', status_code=417)
-            # test
-            try:
-                response = RestClient().get_query(database_id=1, query_id=6)
-            except MetadataConsistencyError:
-                pass
-
     def test_get_queries_empty_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = []
@@ -214,27 +170,7 @@ class QueryUnitTest(unittest.TestCase):
             except NotExistsError:
                 pass
 
-    def test_get_queries_not_valid_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/subset', status_code=501)
-            # test
-            try:
-                response = RestClient().get_queries(database_id=1)
-            except QueryStoreError:
-                pass
-
-    def test_get_queries_malformed_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/subset', status_code=423)
-            # test
-            try:
-                response = RestClient().get_queries(database_id=1)
-            except MalformedError:
-                pass
-
-    def test_get_query_data_succeeds(self):
+    def test_get_subset_data_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = Result(result=[{'id': 1, 'username': 'foo'}, {'id': 2, 'username': 'bar'}],
                          headers=[{'id': 0, 'username': 1}],
@@ -242,10 +178,10 @@ class QueryUnitTest(unittest.TestCase):
             # mock
             mock.get('/api/database/1/subset/6/data', json=exp.model_dump())
             # test
-            response = RestClient().get_query_data(database_id=1, query_id=6)
+            response = RestClient().get_subset_data(database_id=1, subset_id=6)
             self.assertEqual(exp, response)
 
-    def test_get_query_data_dataframe_succeeds(self):
+    def test_get_subset_data_dataframe_succeeds(self):
         with requests_mock.Mocker() as mock:
             res = Result(result=[{'id': 1, 'username': 'foo'}, {'id': 2, 'username': 'bar'}],
                          headers=[{'id': 0, 'username': 1}],
@@ -254,99 +190,59 @@ class QueryUnitTest(unittest.TestCase):
             # mock
             mock.get('/api/database/1/subset/6/data', json=res.model_dump())
             # test
-            response = RestClient().get_query_data(database_id=1, query_id=6, df=True)
+            response = RestClient().get_subset_data(database_id=1, subset_id=6, df=True)
             self.assertEqual(exp.shape, response.shape)
             self.assertTrue(DataFrame.equals(exp, response))
 
-    def test_get_query_data_not_allowed_fails(self):
+    def test_get_subset_data_not_allowed_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.get('/api/database/1/subset/6/data', status_code=403)
             # test
             try:
-                response = RestClient().get_query_data(database_id=1, query_id=6)
+                response = RestClient().get_subset_data(database_id=1, subset_id=6)
             except ForbiddenError:
                 pass
 
-    def test_get_query_data_not_found_fails(self):
+    def test_get_subset_data_not_found_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.get('/api/database/1/subset/6/data', status_code=404)
             # test
             try:
-                response = RestClient().get_query_data(database_id=1, query_id=6)
+                response = RestClient().get_subset_data(database_id=1, subset_id=6)
             except NotExistsError:
                 pass
 
-    def test_get_query_data_not_valid_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/subset/6/data', status_code=409)
-            # test
-            try:
-                response = RestClient().get_query_data(database_id=1, query_id=6)
-            except QueryStoreError:
-                pass
-
-    def test_get_query_data_not_consistent_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/subset/6/data', status_code=417)
-            # test
-            try:
-                response = RestClient().get_query_data(database_id=1, query_id=6)
-            except MetadataConsistencyError:
-                pass
-
-    def test_get_query_data_count_succeeds(self):
+    def test_get_subset_data_count_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = 2
             # mock
             mock.head('/api/database/1/subset/6/data', headers={'X-Count': str(exp)})
             # test
-            response = RestClient().get_query_data_count(database_id=1, query_id=6)
+            response = RestClient().get_subset_data_count(database_id=1, subset_id=6)
             self.assertEqual(exp, response)
 
-    def test_get_query_data_count_not_allowed_fails(self):
+    def test_get_subset_data_count_not_allowed_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.head('/api/database/1/subset/6/data', status_code=403)
             # test
             try:
-                response = RestClient().get_query_data_count(database_id=1, query_id=6)
+                response = RestClient().get_subset_data_count(database_id=1, subset_id=6)
             except ForbiddenError:
                 pass
 
-    def test_get_query_data_count_not_found_fails(self):
+    def test_get_subset_data_count_not_found_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
             mock.head('/api/database/1/subset/6/data', status_code=404)
             # test
             try:
-                response = RestClient().get_query_data_count(database_id=1, query_id=6)
+                response = RestClient().get_subset_data_count(database_id=1, subset_id=6)
             except NotExistsError:
                 pass
 
-    def test_get_query_data_count_not_valid_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.head('/api/database/1/subset/6/data', status_code=409)
-            # test
-            try:
-                response = RestClient().get_query_data_count(database_id=1, query_id=6)
-            except QueryStoreError:
-                pass
-
-    def test_get_query_data_count_not_consistent_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.head('/api/database/1/subset/6/data', status_code=417)
-            # test
-            try:
-                response = RestClient().get_query_data_count(database_id=1, query_id=6)
-            except MetadataConsistencyError:
-                pass
-
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/lib/python/tests/test_unit_table.py b/lib/python/tests/test_unit_table.py
index 5dff01582e..0be3a4a9fb 100644
--- a/lib/python/tests/test_unit_table.py
+++ b/lib/python/tests/test_unit_table.py
@@ -10,7 +10,7 @@ from pandas import DataFrame
 from dbrepo.api.dto import Table, CreateTableConstraints, UserAttributes, User, Column, Constraints, ColumnType, Result, \
     Concept, Unit, TableStatistics, ColumnStatistic, PrimaryKey, TableMinimal, ColumnMinimal, TableBrief, UserBrief
 from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, NameExistsError, QueryStoreError, \
-    AuthenticationError
+    AuthenticationError, ExternalSystemError
 
 
 class TableUnitTest(unittest.TestCase):
@@ -294,16 +294,6 @@ class TableUnitTest(unittest.TestCase):
             except NotExistsError:
                 pass
 
-    def test_get_table_data_not_countable_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/table/9/data', status_code=409)
-            # test
-            try:
-                response = RestClient().get_table_data(database_id=1, table_id=9)
-            except QueryStoreError:
-                pass
-
     def test_get_table_data_count_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = 2
@@ -350,7 +340,7 @@ class TableUnitTest(unittest.TestCase):
             # test
             try:
                 response = RestClient().get_table_data_count(database_id=1, table_id=9)
-            except QueryStoreError:
+            except ExternalSystemError:
                 pass
 
     def test_create_table_data_succeeds(self):
@@ -398,29 +388,6 @@ class TableUnitTest(unittest.TestCase):
             except NotExistsError:
                 pass
 
-    def test_create_table_data_not_lob_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.post('/api/database/1/table/9/data', status_code=410)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                client.create_table_data(database_id=1, table_id=9,
-                                         data={'name': 'Josiah', 'age': 45, 'gender': 'male'})
-            except MalformedError:
-                pass
-
-    def test_create_table_data_not_auth_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.post('/api/database/1/table/9/data', status_code=410)
-            # test
-            try:
-                RestClient().create_table_data(database_id=1, table_id=9,
-                                               data={'name': 'Josiah', 'age': 45, 'gender': 'male'})
-            except AuthenticationError:
-                pass
-
     def test_update_table_data_succeeds(self):
         with requests_mock.Mocker() as mock:
             # mock
@@ -470,31 +437,6 @@ class TableUnitTest(unittest.TestCase):
             except NotExistsError:
                 pass
 
-    def test_update_table_data_not_lob_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.put('/api/database/1/table/9/data', status_code=410)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                client.update_table_data(database_id=1, table_id=9,
-                                         data={'name': 'Josiah', 'age': 45, 'gender': 'male'},
-                                         keys={'id': 1})
-            except MalformedError:
-                pass
-
-    def test_update_table_data_not_auth_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.put('/api/database/1/table/9/data', status_code=410)
-            # test
-            try:
-                RestClient().update_table_data(database_id=1, table_id=9,
-                                               data={'name': 'Josiah', 'age': 45, 'gender': 'male'},
-                                               keys={'id': 1})
-            except AuthenticationError:
-                pass
-
     def test_delete_table_data_succeeds(self):
         with requests_mock.Mocker() as mock:
             # mock
diff --git a/lib/python/tests/test_unit_user.py b/lib/python/tests/test_unit_user.py
index 08133fa6f0..0d12ecf48f 100644
--- a/lib/python/tests/test_unit_user.py
+++ b/lib/python/tests/test_unit_user.py
@@ -5,7 +5,7 @@ import requests_mock
 from dbrepo.RestClient import RestClient
 from dbrepo.api.dto import User, UserAttributes, UserBrief
 from dbrepo.api.exceptions import ResponseCodeError, UsernameExistsError, EmailExistsError, NotExistsError, \
-    ForbiddenError, AuthenticationError
+    ForbiddenError, AuthenticationError, MalformedError, ServiceError
 
 
 class UserUnitTest(unittest.TestCase):
@@ -66,18 +66,7 @@ class UserUnitTest(unittest.TestCase):
             # test
             try:
                 response = RestClient().create_user(username='mweise', password='s3cr3t', email='mweise@example.com')
-            except ResponseCodeError as e:
-                pass
-
-    def test_create_user_not_allowed_fails(self):
-        with requests_mock.Mocker() as mock:
-            exp = UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise')
-            # mock
-            mock.post('http://gateway-service/api/user', json=exp.model_dump(), status_code=403)
-            # test
-            try:
-                response = RestClient().create_user(username='mweise', password='s3cr3t', email='mweise@example.com')
-            except ForbiddenError as e:
+            except MalformedError as e:
                 pass
 
     def test_create_user_username_exists_fails(self):
@@ -171,18 +160,6 @@ class UserUnitTest(unittest.TestCase):
             except NotExistsError as e:
                 pass
 
-    def test_update_user_foreign_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.put('http://gateway-service/api/user/8638c043-5145-4be8-a3e4-4b79991b0a16', status_code=405)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                response = client.update_user(user_id='8638c043-5145-4be8-a3e4-4b79991b0a16', firstname='Martin',
-                                              language='en', theme='light')
-            except ForbiddenError as e:
-                pass
-
     def test_update_user_not_auth_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
@@ -231,18 +208,6 @@ class UserUnitTest(unittest.TestCase):
             except NotExistsError as e:
                 pass
 
-    def test_update_user_password_foreign_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.put('http://gateway-service/api/user/8638c043-5145-4be8-a3e4-4b79991b0a16/password', status_code=405)
-            # test
-            try:
-                client = RestClient(username="a", password="b")
-                response = client.update_user_password(user_id='8638c043-5145-4be8-a3e4-4b79991b0a16',
-                                                       password='s3cr3t1n0rm4t10n')
-            except ForbiddenError as e:
-                pass
-
     def test_update_user_password_keycloak_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
@@ -252,7 +217,7 @@ class UserUnitTest(unittest.TestCase):
                 client = RestClient(username="a", password="b")
                 response = client.update_user_password(user_id='8638c043-5145-4be8-a3e4-4b79991b0a16',
                                                        password='s3cr3t1n0rm4t10n')
-            except ResponseCodeError as e:
+            except ServiceError as e:
                 pass
 
     def test_update_user_password_not_auth_fails(self):
diff --git a/lib/python/tests/test_unit_view.py b/lib/python/tests/test_unit_view.py
index 476f047370..19a88be85a 100644
--- a/lib/python/tests/test_unit_view.py
+++ b/lib/python/tests/test_unit_view.py
@@ -44,16 +44,6 @@ class ViewUnitTest(unittest.TestCase):
             response = RestClient().get_views(database_id=1)
             self.assertEqual(exp, response)
 
-    def test_get_views_not_allowed_fails(self):
-        with requests_mock.Mocker() as mock:
-            # mock
-            mock.get('/api/database/1/view', status_code=403)
-            # test
-            try:
-                response = RestClient().get_views(database_id=1)
-            except ForbiddenError:
-                pass
-
     def test_get_views_not_found_fails(self):
         with requests_mock.Mocker() as mock:
             # mock
diff --git a/make/gen.mk b/make/gen.mk
index 14206d6633..dac662c136 100644
--- a/make/gen.mk
+++ b/make/gen.mk
@@ -1,14 +1,9 @@
 ##@ Generate
 
-.PHONY: gen-swagger-doc
-gen-swagger-doc: ## Generate Swagger documentation.
-	bash .docs/.swagger/swagger-site.sh
-
 .PHONY: gen-swagger-doc-fe
-gen-swagger-doc-fe: build-images ## Generate Swagger documentation and fetch.
+gen-swagger-doc: build-images ## Generate Swagger documentation and fetch.
 	docker compose up -d
 	bash .docs/.swagger/swagger-generate.sh
-	bash .docs/.swagger/swagger-site.sh
 	docker compose down
 	openapi-merge-cli --config .docs/.swagger/openapi-merge.json
 
diff --git a/mkdocs.yml b/mkdocs.yml
index 86b83c4eeb..ada8171b50 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,5 +1,5 @@
 site_name: Database Repository
-site_url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/
+site_url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.4/
 repo_url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
 repo_name: fda-services
 site_author: Research Unit Data Science, Technische Universit&auml;t Wien
-- 
GitLab