diff --git a/.docs/changelog.md b/.docs/changelog.md
index f2bb1ab0571500d7cb4a80d955381d3ef03a2b52..e2bb59c3748fde0b9da1db9099e013fd6b928db8 100644
--- a/.docs/changelog.md
+++ b/.docs/changelog.md
@@ -2,6 +2,22 @@
 author: Martin Weise
 ---
 
+## v1.6.2 (2025-01-24)
+
+[:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.2)
+
+### What's Changed
+
+#### Changes
+
+* Added interface tests for the Python library in Gitlab CI/CD pipeline
+  in [#486](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/486).
+
+#### Fixes
+
+* Fixed a bug where no pagination was possible
+  in [#487](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/487).
+
 ## v1.6.1 (2025-01-21)
 
 [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.6.1)
@@ -15,7 +31,7 @@ author: Martin Weise
 
 #### Fixes
 
-* Added init container that adds the admin user to the Metadata Database 
+* Added init container that adds the admin user to the Metadata Database
   in [#480](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/480).
 
 ## v1.6.0 (2025-01-07)
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 35c646674712a531ed475532220afed30ab01295..92ba523f367dc170bd0e60e7113334e34cc697de 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
@@ -723,11 +723,11 @@ public class TableEndpoint extends RestEndpoint {
     public ResponseEntity<TableStatisticDto> statistic(@NotNull @PathVariable("databaseId") Long databaseId,
                                                        @NotNull @PathVariable("tableId") Long tableId)
             throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException,
-            MetadataServiceException, TableMalformedException, DatabaseNotFoundException {
+            MetadataServiceException, TableMalformedException {
         log.debug("endpoint generate table statistic, databaseId={}, tableId={}", databaseId, tableId);
-        final TableDto table = credentialService.getTable(databaseId, tableId);
         try {
-            return ResponseEntity.ok(tableService.getStatistics(credentialService.getDatabase(table.getTdbid()), table));
+            return ResponseEntity.ok(tableService.getStatistics(
+                    credentialService.getTable(databaseId, tableId)));
         } catch (SQLException e) {
             log.error("Failed to establish connection to database: {}", e.getMessage());
             throw new DatabaseUnavailableException("Failed to establish connection to database", e);
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java
index 00553dce066641b63afa36da7df33fe6e9c192ca..3cecdb64570a6c9de282964a0ee07a220135360a 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
@@ -53,7 +53,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_4_ID))
-                .thenReturn(USER_4_PRIVILEGED_DTO);
+                .thenReturn(USER_4_DTO);
 
         /* test */
         final ResponseEntity<Void> response = accessEndpoint.create(DATABASE_1_ID, USER_4_ID, UPDATE_DATABASE_ACCESS_READ_DTO);
@@ -70,7 +70,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_1_ID))
-                .thenReturn(USER_1_PRIVILEGED_DTO);
+                .thenReturn(USER_1_DTO);
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -87,10 +87,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_4_ID))
-                .thenReturn(USER_4_PRIVILEGED_DTO);
+                .thenReturn(USER_4_DTO);
         doThrow(SQLException.class)
                 .when(accessService)
-                .create(DATABASE_1_DTO, USER_4_PRIVILEGED_DTO, AccessTypeDto.READ);
+                .create(DATABASE_1_DTO, USER_4_DTO, AccessTypeDto.READ);
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
@@ -151,7 +151,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_1_ID))
-                .thenReturn(USER_1_PRIVILEGED_DTO);
+                .thenReturn(USER_1_DTO);
 
         /* test */
         final ResponseEntity<Void> response = accessEndpoint.update(DATABASE_1_ID, USER_1_ID, UPDATE_DATABASE_ACCESS_READ_DTO);
@@ -168,10 +168,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_1_ID))
-                .thenReturn(USER_1_PRIVILEGED_DTO);
+                .thenReturn(USER_1_DTO);
         doThrow(SQLException.class)
                 .when(accessService)
-                .update(DATABASE_1_DTO, USER_1_PRIVILEGED_DTO, AccessTypeDto.READ);
+                .update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.READ);
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
@@ -188,7 +188,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_4_ID))
-                .thenReturn(USER_4_PRIVILEGED_DTO);
+                .thenReturn(USER_4_DTO);
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -250,7 +250,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_1_ID))
-                .thenReturn(USER_1_PRIVILEGED_DTO);
+                .thenReturn(USER_1_DTO);
         doNothing()
                 .when(accessService)
                 .delete(any(DatabaseDto.class), any(UserDto.class));
@@ -270,7 +270,7 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_4_ID))
-                .thenReturn(USER_4_PRIVILEGED_DTO);
+                .thenReturn(USER_4_DTO);
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -331,10 +331,10 @@ public class AccessEndpointUnitTest extends AbstractUnitTest {
         when(credentialService.getDatabase(DATABASE_1_ID))
                 .thenReturn(DATABASE_1_DTO);
         when(credentialService.getUser(USER_1_ID))
-                .thenReturn(USER_1_PRIVILEGED_DTO);
+                .thenReturn(USER_1_DTO);
         doThrow(SQLException.class)
                 .when(accessService)
-                .delete(DATABASE_1_DTO, USER_1_PRIVILEGED_DTO);
+                .delete(DATABASE_1_DTO, USER_1_DTO);
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
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 592063e03412f480db0e1bd796b4825445114e60..0c6f9d8521d1a1214e4ab1145e55fa8b3e9c3299 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,10 @@ import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.user.UserDto;
 import at.tuwien.endpoints.DatabaseEndpoint;
 import at.tuwien.exception.*;
-import at.tuwien.service.*;
+import at.tuwien.service.AccessService;
+import at.tuwien.service.ContainerService;
+import at.tuwien.service.CredentialService;
+import at.tuwien.service.DatabaseService;
 import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
@@ -35,9 +38,6 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @Autowired
     private DatabaseEndpoint databaseEndpoint;
 
-    @MockBean
-    private SubsetService queryService;
-
     @MockBean
     private ContainerService containerService;
 
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 35df8f5dd91481e6c2ee9ae987df2f0b197982b0..c7a74de17fc6ecc15e410aefb1366a0ab0e81549 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
@@ -1,7 +1,6 @@
 package at.tuwien.endpoint;
 
 import at.tuwien.api.database.DatabaseAccessDto;
-import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.database.query.ImportDto;
 import at.tuwien.api.database.table.*;
 import at.tuwien.endpoints.TableEndpoint;
@@ -166,12 +165,12 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithAnonymousUser
     public void statistic_succeeds() throws DatabaseUnavailableException, TableNotFoundException, SQLException,
-            TableMalformedException, RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException {
+            TableMalformedException, RemoteUnavailableException, MetadataServiceException {
 
         /* mock */
         when(credentialService.getTable(DATABASE_3_ID, TABLE_8_ID))
                 .thenReturn(TABLE_8_DTO);
-        when(tableService.getStatistics(any(DatabaseDto.class), any(TableDto.class)))
+        when(tableService.getStatistics(any(TableDto.class)))
                 .thenReturn(TABLE_8_STATISTIC_DTO);
 
         /* test */
@@ -189,7 +188,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(TABLE_8_DTO);
         doThrow(SQLException.class)
                 .when(tableService)
-                .getStatistics(any(DatabaseDto.class), any(TableDto.class));
+                .getStatistics(any(TableDto.class));
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java
index a8633836b88705db66ae2c163796c7fd34b270c1..a2ed7e38174bd9ba2258b5929b010f54313812f6 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java
@@ -36,10 +36,6 @@ import static org.mockito.Mockito.when;
 @ExtendWith(SpringExtension.class)
 public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
-    @MockBean
-    @Qualifier("restTemplate")
-    private RestTemplate restTemplate;
-
     @MockBean
     @Qualifier("internalRestTemplate")
     private RestTemplate internalRestTemplate;
@@ -56,13 +52,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getTableById_succeeds() throws TableNotFoundException, RemoteUnavailableException,
             MetadataServiceException {
         final HttpHeaders headers = new HttpHeaders();
-        headers.set("X-Type", IMAGE_1_JDBC);
-        headers.set("X-Host", CONTAINER_1_HOST);
-        headers.set("X-Port", "" + CONTAINER_1_PORT);
         headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
-        headers.set("X-Database", DATABASE_1_INTERNALNAME);
-        headers.set("X-Table", TABLE_1_INTERNAL_NAME);
 
         /* mock */
         when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
@@ -72,12 +63,11 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* test */
         final TableDto response = metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID);
-        assertEquals(IMAGE_1_JDBC, response.getJdbcMethod());
-        assertEquals(CONTAINER_1_HOST, response.getHost());
-        assertEquals(CONTAINER_1_PORT, response.getPort());
-        assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getUsername());
-        assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getPassword());
-        assertEquals(DATABASE_1_INTERNALNAME, response.getDatabase());
+        assertEquals(IMAGE_1_JDBC, response.getDatabase().getContainer().getImage().getJdbcMethod());
+        assertEquals(CONTAINER_1_HOST, response.getDatabase().getContainer().getHost());
+        assertEquals(CONTAINER_1_PORT, response.getDatabase().getContainer().getPort());
+        assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getDatabase().getContainer().getUsername());
+        assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getDatabase().getContainer().getPassword());
         assertEquals(TABLE_1_INTERNAL_NAME, response.getInternalName());
     }
 
@@ -147,13 +137,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     @Test
     public void getTableById_emptyBody_fails() {
         final HttpHeaders headers = new HttpHeaders();
-        headers.set("X-Type", IMAGE_1_JDBC);
-        headers.set("X-Host", CONTAINER_1_HOST);
-        headers.set("X-Port", "" + CONTAINER_1_PORT);
         headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
-        headers.set("X-Database", DATABASE_1_INTERNALNAME);
-        headers.set("X-Table", TABLE_1_INTERNAL_NAME);
 
         /* mock */
         when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
@@ -173,8 +158,6 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         final HttpHeaders headers = new HttpHeaders();
         headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
-        headers.set("X-Host", CONTAINER_1_HOST);
-        headers.set("X-Port", "" + CONTAINER_1_PORT);
 
         /* mock */
         when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseDto.class)))
@@ -369,13 +352,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     @Test
     public void getViewById_succeeds() throws RemoteUnavailableException, ViewNotFoundException, MetadataServiceException {
         final HttpHeaders headers = new HttpHeaders();
-        headers.set("X-Type", IMAGE_1_JDBC);
-        headers.set("X-Host", CONTAINER_1_HOST);
-        headers.set("X-Port", "" + CONTAINER_1_PORT);
         headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
-        headers.set("X-Database", DATABASE_1_INTERNALNAME);
-        headers.set("X-View", VIEW_1_INTERNAL_NAME);
 
         /* mock */
         when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(ViewDto.class)))
@@ -454,12 +432,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     @Test
     public void getViewById_emptyBody_fails() {
         final HttpHeaders headers = new HttpHeaders();
-        headers.set("X-Type", IMAGE_1_JDBC);
-        headers.set("X-Host", CONTAINER_1_HOST);
-        headers.set("X-Port", "" + CONTAINER_1_PORT);
         headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
-        headers.set("X-Database", DATABASE_1_INTERNALNAME);
 
         /* mock */
         when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java
index 44e5f88912627f20741a25967f9774c24b945f65..752a9b0e055e8084f29498af07e41f3acabf7794 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerIntegrationTest.java
@@ -57,8 +57,8 @@ public class DefaultListenerIntegrationTest extends AbstractUnitTest {
     public void beforeEach() throws SQLException {
         genesis();
         /* database */
-        MariaDbConfig.dropAllDatabases(CONTAINER_1_DTO);
-        MariaDbConfig.createInitDatabase(CONTAINER_1_DTO, DATABASE_1_DTO);
+        MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO);
+        MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO);
     }
 
     @Test
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java
index b3a3bf639763cc0ff56837bff07d66c8d5a3b356..7a439ed55c54442df0e3babb034ce27120c4a208 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/listener/DefaultListenerUnitTest.java
@@ -51,9 +51,10 @@ public class DefaultListenerUnitTest extends AbstractUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
+        genesis();
         /* metadata database */
-        MariaDbConfig.dropAllDatabases(CONTAINER_1_DTO);
-        MariaDbConfig.createInitDatabase(CONTAINER_1_DTO, DATABASE_1_DTO);
+        MariaDbConfig.dropAllDatabases(CONTAINER_1_PRIVILEGED_DTO);
+        MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO);
     }
 
     @Test
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java
index bc121c3b265be3e1b40be470e9261615aaa7b84e..2c174e0a3da88a30e2e8ed8d739cf0200fd5a237 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java
@@ -44,16 +44,16 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void beforeEach() throws SQLException {
         genesis();
         /* metadata database */
-        MariaDbConfig.dropDatabase(CONTAINER_1_DTO, DATABASE_1_INTERNALNAME);
-        MariaDbConfig.createInitDatabase(CONTAINER_1_DTO, DATABASE_1_DTO);
+        MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
+        MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_PRIVILEGED_DTO);
     }
 
     @Test
     public void create_read_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.create(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.READ);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.create(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.READ);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         for (String privilege : grantDefaultRead.split(",")) {
             assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim())));
         }
@@ -63,8 +63,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void create_writeOwn_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.create(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.create(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         for (String privilege : grantDefaultWrite.split(",")) {
             assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim())));
         }
@@ -74,8 +74,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void create_writeAll_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.create(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.create(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         for (String privilege : grantDefaultWrite.split(",")) {
             assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim())));
         }
@@ -85,8 +85,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void update_read_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.READ);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.READ);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         for (String privilege : grantDefaultRead.split(",")) {
             assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim())));
         }
@@ -96,8 +96,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void update_writeOwn_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_OWN);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         for (String privilege : grantDefaultWrite.split(",")) {
             assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim())));
         }
@@ -107,8 +107,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void update_writeAll_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.update(DATABASE_1_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.WRITE_ALL);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         for (String privilege : grantDefaultWrite.split(",")) {
             assertTrue(privileges.stream().anyMatch(p -> p.trim().equals(privilege.trim())));
         }
@@ -119,7 +119,7 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseMalformedException.class, () -> {
-            accessService.update(DATABASE_1_DTO, USER_5_DTO, AccessTypeDto.WRITE_ALL);
+            accessService.update(DATABASE_1_PRIVILEGED_DTO, USER_5_DTO, AccessTypeDto.WRITE_ALL);
         });
     }
 
@@ -127,8 +127,8 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
     public void delete_succeeds() throws SQLException, DatabaseMalformedException {
 
         /* test */
-        accessService.delete(DATABASE_1_DTO, USER_1_DTO);
-        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_DTO, USER_1_USERNAME);
+        accessService.delete(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO);
+        final List<String> privileges = MariaDbConfig.getPrivileges(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME);
         assertEquals(1, privileges.size());
         assertEquals("USAGE", privileges.get(0));
     }
@@ -138,7 +138,7 @@ public class AccessServiceIntegrationTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseMalformedException.class, () -> {
-            accessService.delete(DATABASE_1_DTO, USER_5_DTO);
+            accessService.delete(DATABASE_1_PRIVILEGED_DTO, USER_5_DTO);
         });
     }
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
index e793a8362c595eeeb9db6b4d9053ae94c40ac237..251dfe53c5c6a10782c0ec44a674e1fdba8c1e40 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
@@ -45,7 +45,7 @@ public class ContainerServiceIntegrationTest extends AbstractUnitTest {
     public void beforeEach() throws SQLException {
         genesis();
         /* metadata database */
-        MariaDbConfig.dropDatabase(CONTAINER_1_DTO, DATABASE_1_INTERNALNAME);
+        MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
     }
 
     @Test
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
index 26ff951dda400984090eee3134b62813d8109638..ae1917202dbf519cf500892b8238b53eaecc0933 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
@@ -63,7 +63,7 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
     public void beforeEach() throws SQLException {
         genesis();
         /* metadata database */
-        MariaDbConfig.dropDatabase(CONTAINER_1_DTO, DATABASE_1_INTERNALNAME);
+        MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME);
     }
 
     @Test
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
index f8687d8e0d3f4c3aa9c6197fb523163b1262a276..cfab2600e51c682d0b6dce922d6c7c10b68b43a4 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
@@ -374,7 +374,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
     public void getStatistics_succeeds() throws TableMalformedException, SQLException, TableNotFoundException {
 
         /* test */
-        final TableStatisticDto response = tableService.getStatistics(DATABASE_1_DTO, TABLE_2_DTO);
+        final TableStatisticDto response = tableService.getStatistics(TABLE_2_DTO);
         assertEquals(TABLE_2_COLUMNS.size(), response.getColumns().size());
         log.trace("response rows: {}", response.getRows());
         assertEquals(3L, response.getRows());
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java
index 650652d62fe9a922c434276f89ec427d628236be..7b02192b7ed0209bae55614808e5c236d03da6ef 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java
@@ -100,7 +100,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find database with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find database: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Username", "X-Password", "X-Host", "X-Port", "X-Type");
+        final List<String> expectedHeaders = List.of("X-Username", "X-Password");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all  database headers");
             log.debug("expected headers: {}", expectedHeaders);
@@ -112,12 +112,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             throw new MetadataServiceException("Failed to find database with id " + id + ": body is empty");
         }
         final DatabaseDto database = response.getBody();
-        database.setJdbcMethod(response.getHeaders().get("X-Type").get(0));
-        database.setUsername(response.getHeaders().get("X-Username").get(0));
-        database.setPassword(response.getHeaders().get("X-Password").get(0));
-        database.setDatabase(database.getInternalName());
-        database.setHost(response.getHeaders().get("X-Host").get(0));
-        database.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0)));
+        database.getContainer().setUsername(response.getHeaders().get("X-Username").get(0));
+        database.getContainer().setPassword(response.getHeaders().get("X-Password").get(0));
         database.setLastRetrieved(Instant.now());
         return database;
     }
@@ -141,7 +137,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find table with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find table: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-Table", "X-Type");
+        final List<String> expectedHeaders = List.of("X-Username", "X-Password");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all  table headers");
             log.debug("expected headers: {}", expectedHeaders);
@@ -153,13 +149,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             throw new MetadataServiceException("Failed to find table with id " + id + ": body is empty");
         }
         final TableDto table = metadataMapper.tableDtoToTableDto(response.getBody());
-        table.setJdbcMethod(response.getHeaders().get("X-Type").get(0));
-        table.setHost(response.getHeaders().get("X-Host").get(0));
-        table.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0)));
-        table.setUsername(response.getHeaders().get("X-Username").get(0));
-        table.setPassword(response.getHeaders().get("X-Password").get(0));
-        table.setDatabase(response.getHeaders().get("X-Database").get(0));
-        table.setInternalName(response.getHeaders().get("X-Table").get(0));
+        table.getDatabase().getContainer().setUsername(response.getHeaders().get("X-Username").get(0));
+        table.getDatabase().getContainer().setPassword(response.getHeaders().get("X-Password").get(0));
         table.setLastRetrieved(Instant.now());
         return table;
     }
@@ -183,7 +174,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find view with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find view: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-View", "X-Type");
+        final List<String> expectedHeaders = List.of("X-Username", "X-Password");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all  view headers");
             log.debug("expected headers: {}", expectedHeaders);
@@ -195,13 +186,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             throw new MetadataServiceException("Failed to find view with id " + id + ": body is empty");
         }
         final ViewDto view = metadataMapper.viewDtoToViewDto(response.getBody());
-        view.setJdbcMethod(response.getHeaders().get("X-Type").get(0));
-        view.setHost(response.getHeaders().get("X-Host").get(0));
-        view.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0)));
-        view.setUsername(response.getHeaders().get("X-Username").get(0));
-        view.setPassword(response.getHeaders().get("X-Password").get(0));
-        view.setDatabase(response.getHeaders().get("X-Database").get(0));
-        view.setInternalName(response.getHeaders().get("X-View").get(0));
+        view.getDatabase().getContainer().setUsername(response.getHeaders().get("X-Username").get(0));
+        view.getDatabase().getContainer().setPassword(response.getHeaders().get("X-Password").get(0));
         view.setLastRetrieved(Instant.now());
         return view;
     }
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java
index b74c491abe0af3e02eb4aaa533b72ad6a772e112..636e12ceb687cb3c6ce9d3988931caea676ef7ad 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java
@@ -17,14 +17,13 @@ public interface TableService {
     /**
      * Generate table statistic for a given table. Only numerical columns are calculated.
      *
-     * @param database The database.
      * @param table The table.
      * @return The table statistic, if successful.
      * @throws SQLException            Failed to parse SQL query, contains invalid syntax.
      * @throws TableMalformedException The table statistic generation was unsuccessful, likely due to a bug in the mapping.
      * @throws TableNotFoundException  The table could not be inspected in the data database.
      */
-    TableStatisticDto getStatistics(DatabaseDto database, TableDto table) throws SQLException, TableMalformedException,
+    TableStatisticDto getStatistics(TableDto table) throws SQLException, TableMalformedException,
             TableNotFoundException;
 
     /**
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java
index 16ace6dc9e68adf96762f8b5ef66fc1c02ad17af..be049663b7eb0e3ff2e0f10ccee8e3ee2fc5b759 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java
@@ -17,7 +17,7 @@ import java.sql.SQLException;
 
 @Log4j2
 @Service
-public class AccessServiceMariaDbImpl extends DataConnector<DatabaseDto> implements AccessService {
+public class AccessServiceMariaDbImpl extends DataConnector implements AccessService {
 
     @Value("${dbrepo.grant.default.read}")
     private String grantDefaultRead;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java
index fc9b2d97c3a4a88342eaa44f5c9995a4b9f537e3..aedba1aed2902b35b424832d117e200dcc02aca9 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceMariaDbImpl.java
@@ -19,7 +19,7 @@ import java.sql.SQLException;
 
 @Log4j2
 @Service
-public class ContainerServiceMariaDbImpl extends DataConnector<ContainerDto> implements ContainerService {
+public class ContainerServiceMariaDbImpl extends DataConnector implements ContainerService {
 
     private final RabbitConfig rabbitConfig;
     private final MariaDbMapper mariaDbMapper;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java
index 3a54b399d47e69263b355afb730e2800ca90a526..c21d37721b051bf4109b6062a1ffad493c503850 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java
@@ -1,20 +1,22 @@
 package at.tuwien.service.impl;
 
-import at.tuwien.api.CacheableDto;
+import at.tuwien.api.container.ContainerDto;
+import at.tuwien.api.database.DatabaseDto;
+import at.tuwien.api.database.ViewDto;
+import at.tuwien.api.database.table.TableDto;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.stereotype.Service;
 
 @Log4j2
 @Service
-public abstract class DataConnector<T extends CacheableDto> {
+public abstract class DataConnector {
 
-    public ComboPooledDataSource getDataSource(T entity) {
+    public ComboPooledDataSource getDataSource(ContainerDto container, String databaseName) {
         final ComboPooledDataSource dataSource = new ComboPooledDataSource();
-        dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(),
-                entity.getDatabase()));
-        dataSource.setUser(entity.getUsername());
-        dataSource.setPassword(entity.getPassword());
+        dataSource.setJdbcUrl(getJdbcUrl(container, databaseName));
+        dataSource.setUser(container.getUsername());
+        dataSource.setPassword(container.getPassword());
         dataSource.setInitialPoolSize(5);
         dataSource.setMinPoolSize(5);
         dataSource.setAcquireIncrement(5);
@@ -23,37 +25,48 @@ public abstract class DataConnector<T extends CacheableDto> {
         return dataSource;
     }
 
-    public ComboPooledDataSource getDataSource(T entity, String databaseName) {
-        final ComboPooledDataSource dataSource = new ComboPooledDataSource();
-        dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), databaseName));
-        dataSource.setUser(entity.getUsername());
-        dataSource.setPassword(entity.getPassword());
-        dataSource.setInitialPoolSize(5);
-        dataSource.setMinPoolSize(5);
-        dataSource.setAcquireIncrement(5);
-        dataSource.setMaxPoolSize(20);
-        dataSource.setMaxStatements(100);
-        return dataSource;
+    public ComboPooledDataSource getDataSource(ViewDto view) {
+        return getDataSource(view.getDatabase().getContainer(), null);
+    }
+
+    public ComboPooledDataSource getDataSource(TableDto table) {
+        return getDataSource(table.getDatabase().getContainer(), null);
     }
 
-    public String getSparkUrl(String jdbcMethod, String host, Integer port, String databaseName) {
-        final StringBuilder sb = new StringBuilder(getJdbcUrl(jdbcMethod, host, port, databaseName))
+    public ComboPooledDataSource getDataSource(ContainerDto container) {
+        return getDataSource(container, null);
+    }
+
+    public ComboPooledDataSource getDataSource(DatabaseDto database) {
+        return getDataSource(database.getContainer(), database.getInternalName());
+    }
+
+    public String getSparkUrl(ContainerDto container, String databaseName) {
+        final StringBuilder sb = new StringBuilder(getJdbcUrl(container, databaseName))
                 .append("?sessionVariables=sql_mode='ANSI_QUOTES'");
         log.trace("mapped container to spark url: {}", sb.toString());
         return sb.toString();
     }
 
-    public String getSparkUrl(T entity) {
-        return getSparkUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), entity.getDatabase());
+    public String getSparkUrl(TableDto table) {
+        return getSparkUrl(table.getDatabase().getContainer(), null);
+    }
+
+    public String getSparkUrl(DatabaseDto databaseDto) {
+        return getSparkUrl(databaseDto.getContainer(), null);
+    }
+
+    public String getSparkUrl(ContainerDto container) {
+        return getSparkUrl(container, null);
     }
 
-    public String getJdbcUrl(String jdbcMethod, String host, Integer port, String databaseName) {
+    public String getJdbcUrl(ContainerDto container, String databaseName) {
         final StringBuilder stringBuilder = new StringBuilder("jdbc:")
-                .append(jdbcMethod)
+                .append(container.getImage().getJdbcMethod())
                 .append("://")
-                .append(host)
+                .append(container.getHost())
                 .append(":")
-                .append(port);
+                .append(container.getPort());
         if (databaseName != null) {
             stringBuilder.append("/")
                     .append(databaseName);
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
index cfe43d8f8fdadbdc8e4eb3d1e316806681e47b74..c4afe44287abbb5c184fa6ec0f8873d17cf9edcb 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
@@ -29,7 +29,7 @@ import java.util.List;
 
 @Log4j2
 @Service
-public class DatabaseServiceMariaDbImpl extends DataConnector<DatabaseDto> implements DatabaseService {
+public class DatabaseServiceMariaDbImpl extends DataConnector implements DatabaseService {
 
     private final DataMapper dataMapper;
     private final QueryConfig queryConfig;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java
index 1a26a84ef68fb6e0626ece50dff129a8fb449135..4db29335fbfc4cbdbb8086a2009cb588613d1969 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java
@@ -18,7 +18,7 @@ import java.util.Optional;
 
 @Log4j2
 @Service
-public class QueueServiceRabbitMqImpl extends DataConnector<TableDto> implements QueueService {
+public class QueueServiceRabbitMqImpl extends DataConnector implements QueueService {
 
     private final DataMapper dataMapper;
     private final MetadataMapper metadataMapper;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java
index 62b7c77a845d6d1ed6e317d43bbc1a18ae9943d7..0a208b2890e8702228fb07ca31654625a17b0dd2 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java
@@ -13,7 +13,6 @@ import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.service.DatabaseService;
 import at.tuwien.service.SubsetService;
 import at.tuwien.service.TableService;
-import at.tuwien.service.ViewService;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import lombok.extern.log4j.Log4j2;
 import org.apache.spark.sql.Dataset;
@@ -29,10 +28,9 @@ import java.util.UUID;
 
 @Log4j2
 @Service
-public class SubsetServiceMariaDbImpl extends DataConnector<DatabaseDto> implements SubsetService {
+public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetService {
 
     private final DataMapper dataMapper;
-    private final ViewService viewService;
     private final TableService tableService;
     private final MariaDbMapper mariaDbMapper;
     private final MetadataMapper metadataMapper;
@@ -40,11 +38,10 @@ public class SubsetServiceMariaDbImpl extends DataConnector<DatabaseDto> impleme
     private final MetadataServiceGateway metadataServiceGateway;
 
     @Autowired
-    public SubsetServiceMariaDbImpl(DataMapper dataMapper, ViewService viewService, TableService tableService,
-                                    MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper,
-                                    DatabaseService databaseService, MetadataServiceGateway metadataServiceGateway) {
+    public SubsetServiceMariaDbImpl(DataMapper dataMapper, TableService tableService, MariaDbMapper mariaDbMapper,
+                                    MetadataMapper metadataMapper, DatabaseService databaseService,
+                                    MetadataServiceGateway metadataServiceGateway) {
         this.dataMapper = dataMapper;
-        this.viewService = viewService;
         this.tableService = tableService;
         this.mariaDbMapper = mariaDbMapper;
         this.metadataMapper = metadataMapper;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java
index 482f874624dc2694d305d7fcac7d2b32cc971b26..4d4121f06049251cadebe498ebb32ef9f6a4d409 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java
@@ -33,7 +33,7 @@ import java.util.Properties;
 
 @Log4j2
 @Service
-public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements TableService {
+public class TableServiceMariaDbImpl extends DataConnector implements TableService {
 
     private final DataMapper dataMapper;
     private final SparkSession sparkSession;
@@ -52,7 +52,7 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
     }
 
     @Override
-    public TableStatisticDto getStatistics(DatabaseDto database, TableDto table) throws SQLException, TableMalformedException,
+    public TableStatisticDto getStatistics(TableDto table) throws SQLException, TableMalformedException,
             TableNotFoundException {
         final ComboPooledDataSource dataSource = getDataSource(table);
         final Connection connection = dataSource.getConnection();
@@ -62,14 +62,14 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
             final long start = System.currentTimeMillis();
             final String query = mariaDbMapper.tableColumnStatisticsSelectRawQuery(table.getColumns(), table.getInternalName());
             if (query == null) {
-                log.debug("table {}.{} does not have columns that can be analysed for statistical properties (i.e. no numeric columns)", database.getInternalName(), table.getInternalName());
+                log.debug("table {}.{} does not have columns that can be analysed for statistical properties (i.e. no numeric columns)", table.getDatabase().getInternalName(), table.getInternalName());
                 statistic = null;
             } else {
                 final ResultSet resultSet = connection.prepareStatement(query)
                         .executeQuery();
                 log.trace("executed statement in {} ms", System.currentTimeMillis() - start);
                 statistic = dataMapper.resultSetToTableStatistic(resultSet);
-                final TableDto tmpTable = databaseService.inspectTable(database, table.getInternalName());
+                final TableDto tmpTable = databaseService.inspectTable(table.getDatabase(), table.getInternalName());
                 statistic.setAvgRowLength(tmpTable.getAvgRowLength());
                 statistic.setDataLength(tmpTable.getDataLength());
                 statistic.setMaxDataLength(tmpTable.getMaxDataLength());
@@ -95,7 +95,7 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
     @Override
     public void updateTable(TableDto table, TableUpdateDto data) throws SQLException,
             TableMalformedException {
-        final ComboPooledDataSource dataSource = getDataSource(table);
+        final ComboPooledDataSource dataSource = getDataSource(table.getDatabase());
         final Connection connection = dataSource.getConnection();
         try {
             /* create table if not exists */
@@ -122,7 +122,7 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
 
     @Override
     public void delete(TableDto table) throws SQLException, QueryMalformedException {
-        final ComboPooledDataSource dataSource = getDataSource(table);
+        final ComboPooledDataSource dataSource = getDataSource(table.getDatabase());
         final Connection connection = dataSource.getConnection();
         try {
             /* create table if not exists */
@@ -144,14 +144,14 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
     @Override
     public List<TableHistoryDto> history(TableDto table, Long size) throws SQLException,
             TableNotFoundException {
-        final ComboPooledDataSource dataSource = getDataSource(table);
+        final ComboPooledDataSource dataSource = getDataSource(table.getDatabase());
         final Connection connection = dataSource.getConnection();
         final List<TableHistoryDto> history;
         try {
             /* find table data */
             final long start = System.currentTimeMillis();
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectHistoryRawQuery(
-                            table.getDatabase(), table.getInternalName(), size))
+                            table.getDatabase().getInternalName(), table.getInternalName(), size))
                     .executeQuery();
             log.trace("executed statement in {} ms", System.currentTimeMillis() - start);
             history = dataMapper.resultSetToTableHistory(resultSet);
@@ -170,14 +170,14 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
     @Override
     public Long getCount(TableDto table, Instant timestamp) throws SQLException,
             QueryMalformedException {
-        final ComboPooledDataSource dataSource = getDataSource(table);
+        final ComboPooledDataSource dataSource = getDataSource(table.getDatabase());
         final Connection connection = dataSource.getConnection();
         final Long queryResult;
         try {
             /* find table data */
             final long start = System.currentTimeMillis();
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery(
-                            table.getDatabase(), table.getInternalName(), timestamp))
+                            table.getDatabase().getInternalName(), table.getInternalName(), timestamp))
                     .executeQuery();
             log.trace("executed statement in {} ms", System.currentTimeMillis() - start);
             queryResult = mariaDbMapper.resultSetToNumber(resultSet);
@@ -204,8 +204,8 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
         final Dataset<Row> dataset = storageService.loadDataset(columns, data.getLocation(),
                 String.valueOf(data.getSeparator()), data.getHeader());
         final Properties properties = new Properties();
-        properties.setProperty("user", table.getUsername());
-        properties.setProperty("password", table.getPassword());
+        properties.setProperty("user", table.getDatabase().getContainer().getUsername());
+        properties.setProperty("password", table.getDatabase().getContainer().getPassword());
         final String temporaryTable = table.getInternalName() + "_tmp";
         try {
             log.trace("import dataset to temporary table: {}", temporaryTable);
@@ -375,10 +375,9 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
         try {
             return sparkSession.read()
                     .format("jdbc")
-                    .option("user", database.getUsername())
-                    .option("password", database.getPassword())
-                    .option("url", getSparkUrl(database.getJdbcMethod(), database.getHost(), database.getPort(),
-                            database.getInternalName()))
+                    .option("user", database.getContainer().getUsername())
+                    .option("password", database.getContainer().getPassword())
+                    .option("url", getSparkUrl(database))
                     .option("query", mariaDbMapper.defaultRawSelectQuery(database.getInternalName(), tableOrView,
                             timestamp, page, size))
                     .load();
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java
index 3224c371a34774978b72bd58f6acaadb8081af99..fff524047e10b575f773fe23656f86944514843a 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java
@@ -17,7 +17,7 @@ import java.time.Instant;
 
 @Log4j2
 @Service
-public class ViewServiceMariaDbImpl extends DataConnector<ViewDto> implements ViewService {
+public class ViewServiceMariaDbImpl extends DataConnector implements ViewService {
 
     private final MariaDbMapper mariaDbMapper;
 
@@ -57,7 +57,7 @@ public class ViewServiceMariaDbImpl extends DataConnector<ViewDto> implements Vi
             /* find view data */
             final long start = System.currentTimeMillis();
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery(
-                            view.getDatabase(), view.getInternalName(), timestamp))
+                            view.getDatabase().getInternalName(), view.getInternalName(), timestamp))
                     .executeQuery();
             log.trace("executed statement in {} ms", System.currentTimeMillis() - start);
             queryResult = mariaDbMapper.resultSetToNumber(resultSet);
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java
index 4ff6f699d68d8b26ec576e6be1d40134722b0640..e947ece6320820e926a3674834310c785042603d 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/CacheableDto.java
@@ -1,6 +1,5 @@
 package at.tuwien.api;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.EqualsAndHashCode;
@@ -20,28 +19,4 @@ public abstract class CacheableDto {
     @Schema(example = "2025-01-23T12:09:01")
     private Instant lastRetrieved;
 
-    @ToString.Exclude
-    @Schema(example = "mariadb")
-    private String jdbcMethod;
-
-    @ToString.Exclude
-    @Schema(example = "data-db")
-    private String host;
-
-    @ToString.Exclude
-    @Schema(example = "3306")
-    private Integer port;
-
-    @ToString.Exclude
-    @Schema(example = "username")
-    private String username;
-
-    @ToString.Exclude
-    @JsonIgnore
-    private String password;
-
-    @ToString.Exclude
-    @Schema(example = "air_quality")
-    private String database;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
index 56d0df315f3875ac93e07e3e9a80b94179586c9b..913ab26d9d4469fb3335d5dc1da8463c9afc0bd6 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
@@ -2,7 +2,6 @@ package at.tuwien.api.container;
 
 import at.tuwien.api.CacheableDto;
 import at.tuwien.api.container.image.ImageDto;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
@@ -35,6 +34,12 @@ public class ContainerDto extends CacheableDto {
     @Schema(example = "air_quality")
     private String internalName;
 
+    @Schema(example = "data-db")
+    private String host;
+
+    @Schema(example = "3306")
+    private Integer port;
+
     @JsonProperty("ui_host")
     @Schema(example = "example.com")
     private String uiHost;
@@ -54,34 +59,18 @@ public class ContainerDto extends CacheableDto {
     @Schema(example = "10")
     private Long count;
 
-    /* lombok limitations prevent from convenient builder functions */
-
-    @JsonProperty("last_retrieved")
-    @Schema(example = "2025-01-23T12:09:01")
-    private Instant lastRetrieved;
-
-    @ToString.Exclude
-    @Schema(example = "mariadb")
-    private String jdbcMethod;
-
-    @ToString.Exclude
-    @Schema(example = "data-db")
-    private String host;
-
-    @ToString.Exclude
-    @Schema(example = "3306")
-    private Integer port;
-
     @ToString.Exclude
     @Schema(example = "username")
     private String username;
 
     @ToString.Exclude
-    @JsonIgnore
+    @Schema(example = "p4ssw0rd")
     private String password;
 
-    @ToString.Exclude
-    @Schema(example = "air_quality")
-    private String database;
+    /* lombok limitations prevent from convenient builder functions */
+
+    @JsonProperty("last_retrieved")
+    @Schema(example = "2025-01-23T12:09:01")
+    private Instant lastRetrieved;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
index c6866c494b179db858875e555f87aa761dd3e5db..d6ea2bff9e2203439891e3a1a6aec6f17afc86a6 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
@@ -5,7 +5,6 @@ import at.tuwien.api.container.ContainerDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.user.UserBriefDto;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
@@ -67,7 +66,6 @@ public class DatabaseDto extends CacheableDto {
     @Schema(example = "true")
     private Boolean isSchemaPublic;
 
-    @NotNull
     private ContainerDto container;
 
     @NotNull
@@ -94,28 +92,4 @@ public class DatabaseDto extends CacheableDto {
     @Schema(example = "2025-01-23T12:09:01")
     private Instant lastRetrieved;
 
-    @ToString.Exclude
-    @Schema(example = "mariadb")
-    private String jdbcMethod;
-
-    @ToString.Exclude
-    @Schema(example = "data-db")
-    private String host;
-
-    @ToString.Exclude
-    @Schema(example = "3306")
-    private Integer port;
-
-    @ToString.Exclude
-    @Schema(example = "username")
-    private String username;
-
-    @ToString.Exclude
-    @JsonIgnore
-    private String password;
-
-    @ToString.Exclude
-    @Schema(example = "air_quality")
-    private String database;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
index 2785cf71075f3f254986290bacc184954b3d10bf..5f9373bb12148777dfadbceae94f1a97dc7dcb78 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
@@ -3,7 +3,6 @@ package at.tuwien.api.database;
 import at.tuwien.api.CacheableDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.user.UserBriefDto;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
@@ -66,6 +65,8 @@ public class ViewDto extends CacheableDto {
     @Schema(example = "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916")
     private String queryHash;
 
+    private DatabaseDto database;
+
     @NotNull
     private UserBriefDto owner;
 
@@ -78,28 +79,4 @@ public class ViewDto extends CacheableDto {
     @Schema(example = "2025-01-23T12:09:01")
     private Instant lastRetrieved;
 
-    @ToString.Exclude
-    @Schema(example = "mariadb")
-    private String jdbcMethod;
-
-    @ToString.Exclude
-    @Schema(example = "data-db")
-    private String host;
-
-    @ToString.Exclude
-    @Schema(example = "3306")
-    private Integer port;
-
-    @ToString.Exclude
-    @Schema(example = "username")
-    private String username;
-
-    @ToString.Exclude
-    @JsonIgnore
-    private String password;
-
-    @ToString.Exclude
-    @Schema(example = "air_quality")
-    private String database;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
index ba80f473b8f248c2295359b2e8162c987324a3f4..e456908ed620d7883ee4287f09063ed9171e5c19 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
@@ -1,6 +1,8 @@
 package at.tuwien.api.database.table;
 
 import at.tuwien.api.CacheableDto;
+import at.tuwien.api.container.ContainerDto;
+import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.api.database.table.constraints.ConstraintsDto;
 import at.tuwien.api.identifier.IdentifierDto;
@@ -105,6 +107,8 @@ public class TableDto extends CacheableDto {
     @NotNull
     private List<ColumnDto> columns;
 
+    private DatabaseDto database;
+
     @NotNull
     private ConstraintsDto constraints;
 
@@ -114,28 +118,4 @@ public class TableDto extends CacheableDto {
     @Schema(example = "2025-01-23T12:09:01")
     private Instant lastRetrieved;
 
-    @ToString.Exclude
-    @Schema(example = "mariadb")
-    private String jdbcMethod;
-
-    @ToString.Exclude
-    @Schema(example = "data-db")
-    private String host;
-
-    @ToString.Exclude
-    @Schema(example = "3306")
-    private Integer port;
-
-    @ToString.Exclude
-    @Schema(example = "username")
-    private String username;
-
-    @ToString.Exclude
-    @JsonIgnore
-    private String password;
-
-    @ToString.Exclude
-    @Schema(example = "air_quality")
-    private String database;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
index 26192f460f011b493056cd9778aa76e0f056c4ae..e7367e2fb4e513a9681783dfdec89b55e57519e0 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/user/UserDto.java
@@ -1,7 +1,6 @@
 package at.tuwien.api.user;
 
 import at.tuwien.api.CacheableDto;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
@@ -28,6 +27,15 @@ public class UserDto extends CacheableDto {
     @Schema(example = "Josiah Carberry")
     private String name;
 
+    @NotNull
+    @Schema(example = "username")
+    private String username;
+
+    @NotNull
+    @ToString.Exclude
+    @Schema(example = "p4ssw0rd")
+    private String password;
+
     @JsonProperty("qualified_name")
     @Schema(example = "Josiah Carberry — @jcarberry")
     private String qualifiedName;
@@ -49,28 +57,4 @@ public class UserDto extends CacheableDto {
     @Schema(example = "2025-01-23T12:09:01")
     private Instant lastRetrieved;
 
-    @ToString.Exclude
-    @Schema(example = "mariadb")
-    private String jdbcMethod;
-
-    @ToString.Exclude
-    @Schema(example = "data-db")
-    private String host;
-
-    @ToString.Exclude
-    @Schema(example = "3306")
-    private Integer port;
-
-    @ToString.Exclude
-    @Schema(example = "username")
-    private String username;
-
-    @ToString.Exclude
-    @JsonIgnore
-    private String password;
-
-    @ToString.Exclude
-    @Schema(example = "air_quality")
-    private String database;
-
 }
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 75f589e4c5dba7f08f2a0e799f4f6238569eb38b..cd0b90f9f6458d4c921347586d99ada986f988d0 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
@@ -2,8 +2,8 @@ package at.tuwien.mapper;
 
 import at.tuwien.api.auth.SignupRequestDto;
 import at.tuwien.api.container.ContainerBriefDto;
-import at.tuwien.api.container.CreateContainerDto;
 import at.tuwien.api.container.ContainerDto;
+import at.tuwien.api.container.CreateContainerDto;
 import at.tuwien.api.container.image.DataTypeDto;
 import at.tuwien.api.container.image.ImageBriefDto;
 import at.tuwien.api.container.image.ImageCreateDto;
@@ -833,9 +833,6 @@ public interface MetadataMapper {
                 .trim();
     }
 
-    @Mappings({
-            @Mapping(target = "database", ignore = true)
-    })
     ViewDto viewToViewDto(View data);
 
     @Mappings({
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java
index 4779a6428e33bde6be581921a9d15bd81a25c5b6..7ec1471f4d1f110e9d6eefff902b6190a4dbde5b 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java
@@ -1,10 +1,8 @@
 package at.tuwien.endpoints;
 
+import at.tuwien.api.container.ContainerDto;
 import at.tuwien.api.user.UserDetailsDto;
-import at.tuwien.exception.UserNotFoundException;
-import at.tuwien.service.UserService;
 import org.springframework.security.core.Authentication;
-import org.springframework.security.core.userdetails.User;
 
 import java.security.Principal;
 import java.util.UUID;
@@ -45,4 +43,11 @@ public abstract class AbstractEndpoint {
         throw new IllegalArgumentException("Unknown principal instance: " + authentication.getPrincipal().getClass());
     }
 
+    public void removeInternalData(ContainerDto container) {
+        container.setPassword(null);
+        container.setUsername(null);
+        container.setHost(null);
+        container.setPort(null);
+    }
+
 }
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 194f79d2554748750eac2ee90d01846f1ca64a8f..44d3c10c744ab7282186939444cd9fb7692307ed 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
@@ -549,10 +549,9 @@ public class DatabaseEndpoint extends AbstractEndpoint {
         if (isSystem(principal)) {
             headers.set("X-Username", database.getContainer().getPrivilegedUsername());
             headers.set("X-Password", database.getContainer().getPrivilegedPassword());
-            headers.set("X-Host", database.getContainer().getHost());
-            headers.set("X-Port", "" + database.getContainer().getPort());
-            headers.set("X-Type", database.getContainer().getImage().getJdbcMethod());
-            headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port");
+            headers.set("Access-Control-Expose-Headers", "X-Username X-Password");
+        } else {
+            removeInternalData(dto.getContainer());
         }
         return ResponseEntity.status(HttpStatus.OK)
                 .headers(headers)
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 39d7f614608534c5252bcfe92cd749b251660ddb..61ba0d53e74c921ab3b21e3d850b32a8917b6a4b 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
@@ -358,9 +358,9 @@ public class TableEndpoint extends AbstractEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<TableDto> create(@NotNull @PathVariable("databaseId") Long databaseId,
-                                           @NotNull @Valid @RequestBody TableCreateDto data,
-                                           @NotNull Principal principal) throws NotAllowedException, MalformedException,
+    public ResponseEntity<TableBriefDto> create(@NotNull @PathVariable("databaseId") Long databaseId,
+                                                @NotNull @Valid @RequestBody TableCreateDto data,
+                                                @NotNull Principal principal) throws NotAllowedException, MalformedException,
             DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, UserNotFoundException,
             AccessNotFoundException, TableNotFoundException, TableExistsException, SearchServiceException,
             SearchServiceConnectionException, OntologyNotFoundException, SemanticEntityNotFoundException {
@@ -370,7 +370,7 @@ public class TableEndpoint extends AbstractEndpoint {
         endpointValidator.validateOnlyAccess(database, principal, true);
         endpointValidator.validateColumnCreateConstraints(data);
         return ResponseEntity.status(HttpStatus.CREATED)
-                .body(metadataMapper.tableToTableDto(
+                .body(metadataMapper.tableToTableBriefDto(
                         tableService.createTable(database, data, principal)));
     }
 
@@ -413,10 +413,10 @@ public class TableEndpoint extends AbstractEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<TableDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
-                                           @NotNull @PathVariable("tableId") Long tableId,
-                                           @NotNull @Valid @RequestBody TableUpdateDto data,
-                                           @NotNull Principal principal) throws NotAllowedException,
+    public ResponseEntity<TableBriefDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
+                                                @NotNull @PathVariable("tableId") Long tableId,
+                                                @NotNull @Valid @RequestBody TableUpdateDto data,
+                                                @NotNull Principal principal) throws NotAllowedException,
             DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException,
             SearchServiceException, SearchServiceConnectionException {
         log.debug("endpoint update table, databaseId={}, data.is_public={}, data.is_schema_public={}, principal.name={}",
@@ -428,7 +428,7 @@ public class TableEndpoint extends AbstractEndpoint {
             throw new NotAllowedException("Failed to update table: not owner");
         }
         return ResponseEntity.accepted()
-                .body(metadataMapper.tableToTableDto(
+                .body(metadataMapper.tableToTableBriefDto(
                         tableService.updateTable(table, data)));
     }
 
@@ -443,11 +443,6 @@ public class TableEndpoint extends AbstractEndpoint {
                     description = "Find table successfully",
                     headers = {@Header(name = "X-Username", description = "The authentication username", schema = @Schema(implementation = String.class)),
                             @Header(name = "X-Password", description = "The authentication password", schema = @Schema(implementation = String.class)),
-                            @Header(name = "X-Host", description = "The database hostname", schema = @Schema(implementation = String.class)),
-                            @Header(name = "X-Port", description = "The database port number", schema = @Schema(implementation = Integer.class)),
-                            @Header(name = "X-Type", description = "The JDBC connection type", schema = @Schema(implementation = String.class)),
-                            @Header(name = "X-Database", description = "The database internal name", schema = @Schema(implementation = String.class)),
-                            @Header(name = "X-Table", description = "The table internal name", schema = @Schema(implementation = String.class)),
                             @Header(name = "Access-Control-Expose-Headers", description = "Expose custom headers", schema = @Schema(implementation = String.class))},
                     content = {@Content(
                             mediaType = "application/json",
@@ -500,20 +495,18 @@ public class TableEndpoint extends AbstractEndpoint {
             table.setColumns(List.of());
             table.setConstraints(null);
         }
+        final TableDto dto = metadataMapper.tableToTableDto(table);
         final HttpHeaders headers = new HttpHeaders();
         if (isSystem(principal)) {
             headers.set("X-Username", table.getDatabase().getContainer().getPrivilegedUsername());
             headers.set("X-Password", table.getDatabase().getContainer().getPrivilegedPassword());
-            headers.set("X-Host", table.getDatabase().getContainer().getHost());
-            headers.set("X-Port", "" + table.getDatabase().getContainer().getPort());
-            headers.set("X-Type", table.getDatabase().getContainer().getImage().getJdbcMethod());
-            headers.set("X-Database", table.getDatabase().getInternalName());
-            headers.set("X-Table", table.getInternalName());
-            headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-Table");
+            headers.set("Access-Control-Expose-Headers", "X-Username X-Password");
+        } else {
+            removeInternalData(dto.getDatabase().getContainer());
         }
         return ResponseEntity.ok()
                 .headers(headers)
-                .body(metadataMapper.tableToTableDto(table));
+                .body(dto);
     }
 
     @DeleteMapping("/{tableId}")
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 5a349ff3782f1c94a4aea6f4d609f3402437b9c0..da979b34f183d25a3696aaad4f2ca606fc8d76a5 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
@@ -139,14 +139,14 @@ public class UserEndpoint extends AbstractEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<UserDto> create(@NotNull @Valid @RequestBody SignupRequestDto data)
+    public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody SignupRequestDto data)
             throws UserExistsException, EmailExistsException, AuthServiceException, AuthServiceConnectionException,
             UserNotFoundException, CredentialsInvalidException {
         log.debug("endpoint create user, data.username={}", data.getUsername());
         userService.validateUsernameNotExists(data.getUsername());
         userService.validateEmailNotExists(data.getEmail());
         return ResponseEntity.status(HttpStatus.CREATED)
-                .body(userMapper.userToUserDto(
+                .body(userMapper.userToUserBriefDto(
                         userService.create(data, authenticationService.create(data).getAttributes().getLdapId()[0])));
     }
 
@@ -328,7 +328,7 @@ public class UserEndpoint extends AbstractEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<UserDto> modify(@NotNull @PathVariable("userId") UUID userId,
+    public ResponseEntity<UserBriefDto> modify(@NotNull @PathVariable("userId") UUID userId,
                                           @NotNull @Valid @RequestBody UserUpdateDto data,
                                           @NotNull Principal principal) throws NotAllowedException,
             UserNotFoundException, DatabaseNotFoundException {
@@ -339,7 +339,7 @@ public class UserEndpoint extends AbstractEndpoint {
             throw new NotAllowedException("Failed to modify user: not current user " + user.getId());
         }
         return ResponseEntity.accepted()
-                .body(userMapper.userToUserDto(
+                .body(userMapper.userToUserBriefDto(
                         userService.modify(user, data)));
     }
 
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 8a4a087da20e4578a40801ac670a7ed5a3826521..abfbdb5d366f289c2d93fd07194241ce1b31a8d4 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
@@ -202,9 +202,13 @@ public class ViewEndpoint extends AbstractEndpoint {
             headers.set("X-View", view.getInternalName());
             headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-View");
         }
+        final ViewDto dto = metadataMapper.viewToViewDto(view);
+        if (!isSystem(principal)) {
+            removeInternalData(dto.getDatabase().getContainer());
+        }
         return ResponseEntity.status(HttpStatus.OK)
                 .headers(headers)
-                .body(metadataMapper.viewToViewDto(view));
+                .body(dto);
     }
 
     @DeleteMapping("/{viewId}")
@@ -248,9 +252,9 @@ public class ViewEndpoint extends AbstractEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId,
-                                    @NotNull @PathVariable("viewId") Long viewId,
-                                    @NotNull Principal principal) throws NotAllowedException, DataServiceException,
+    public ResponseEntity<Void> delete(@NotNull @PathVariable("databaseId") Long databaseId,
+                                       @NotNull @PathVariable("viewId") Long viewId,
+                                       @NotNull Principal principal) throws NotAllowedException, DataServiceException,
             DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException,
             SearchServiceConnectionException, UserNotFoundException {
         log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId);
@@ -301,10 +305,10 @@ public class ViewEndpoint extends AbstractEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<ViewDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
-                                          @NotNull @PathVariable("viewId") Long viewId,
-                                          @NotNull @Valid @RequestBody ViewUpdateDto data,
-                                          @NotNull Principal principal) throws NotAllowedException,
+    public ResponseEntity<ViewBriefDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
+                                               @NotNull @PathVariable("viewId") Long viewId,
+                                               @NotNull @Valid @RequestBody ViewUpdateDto data,
+                                               @NotNull Principal principal) throws NotAllowedException,
             DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException,
             SearchServiceConnectionException, UserNotFoundException {
         log.debug("endpoint update view, databaseId={}, viewId={}", databaseId, viewId);
@@ -315,7 +319,7 @@ public class ViewEndpoint extends AbstractEndpoint {
             throw new NotAllowedException("Failed to update view: not the database- or view owner");
         }
         return ResponseEntity.accepted()
-                .body(metadataMapper.viewToViewDto(
+                .body(metadataMapper.viewToViewBriefDto(
                         viewService.update(database, view, data)));
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java
index ef06d7f37fd01373df24be3c27f95919850b9fae..9cc0c4cc8baa09e15116a1048a95312f2e954ae6 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/TableEndpointUnitTest.java
@@ -1040,7 +1040,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* test */
-        final ResponseEntity<TableDto> response = generic_update(request, USER_1_PRINCIPAL);
+        final ResponseEntity<TableBriefDto> response = generic_update(request, USER_1_PRINCIPAL);
         assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
         assertNotNull(response.getBody());
     }
@@ -1147,7 +1147,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
         return tableEndpoint.list(databaseId, principal);
     }
 
-    protected ResponseEntity<TableDto> generic_create(Long databaseId, Database database, TableCreateDto data,
+    protected ResponseEntity<TableBriefDto> generic_create(Long databaseId, Database database, TableCreateDto data,
                                                       Principal principal, User user, DatabaseAccess access)
             throws MalformedException, NotAllowedException, DataServiceException, DataServiceConnectionException,
             UserNotFoundException, DatabaseNotFoundException, AccessNotFoundException, TableNotFoundException,
@@ -1273,7 +1273,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
         return tableEndpoint.updateColumn(databaseId, tableId, columnId, data, principal);
     }
 
-    protected ResponseEntity<TableDto> generic_update(TableUpdateDto data, Principal caller)
+    protected ResponseEntity<TableBriefDto> generic_update(TableUpdateDto data, Principal caller)
             throws TableNotFoundException, SearchServiceException, NotAllowedException, DataServiceException,
             DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException {
 
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 be0ea28c496d9c3bd65df14f8a312af5c9003069..8b653f9356b7814add62faa42636bbcfe5640aed 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
@@ -458,9 +458,9 @@ public class UserEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(userDto);
 
         /* test */
-        final ResponseEntity<UserDto> response = userEndpoint.create(data);
+        final ResponseEntity<UserBriefDto> response = userEndpoint.create(data);
         assertEquals(HttpStatus.CREATED, response.getStatusCode());
-        final UserDto body = response.getBody();
+        final UserBriefDto body = response.getBody();
         assertNotNull(body);
     }
 
@@ -496,9 +496,9 @@ public class UserEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(user);
 
         /* test */
-        final ResponseEntity<UserDto> response = userEndpoint.modify(userId, data, principal);
+        final ResponseEntity<UserBriefDto> response = userEndpoint.modify(userId, data, principal);
         assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
-        final UserDto body = response.getBody();
+        final UserBriefDto body = response.getBody();
         assertNotNull(body);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java
index 2815dd6c0557a31490dff959bcff7f60e559b805..4cd9296425a6e56c32f5f380a52d79e8945900e6 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ViewEndpointUnitTest.java
@@ -571,7 +571,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(VIEW_1);
 
         /* test */
-        final ResponseEntity<ViewDto> response = viewEndpoint.update(DATABASE_1_ID, VIEW_1_ID, request, principal);
+        final ResponseEntity<ViewBriefDto> response = viewEndpoint.update(DATABASE_1_ID, VIEW_1_ID, request, principal);
         assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
         assertNotNull(response.getBody());
     }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java
index 725d956f570e7ed6678047b4bb9d7baf85cbe33b..dc77ff263b37406845afb93e80a5afc27f59f380 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java
@@ -132,7 +132,7 @@ public class ImageServiceUnitTest extends AbstractUnitTest {
         when(imageRepository.save(any()))
                 .thenReturn(IMAGE_1);
         when(mockImageService.update(IMAGE_1, request))
-                .thenReturn(CONTAINER_1_IMAGE);
+                .thenReturn(IMAGE_1);
 
         /* test */
         final ContainerImage response = mockImageService.update(IMAGE_1, request);
@@ -153,7 +153,7 @@ public class ImageServiceUnitTest extends AbstractUnitTest {
         when(imageRepository.save(any()))
                 .thenReturn(IMAGE_1);
         when(mockImageService.update(IMAGE_1, request))
-                .thenReturn(CONTAINER_1_IMAGE);
+                .thenReturn(IMAGE_1);
 
         /* test */
         final ContainerImage response = mockImageService.update(IMAGE_1, request);
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 232b4cd28020819bba79b10f689f47352b797c42..9d5ab6b3d7648053236637bdae20e016af25167b 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
@@ -42,6 +42,8 @@ public abstract class AbstractUnitTest extends BaseTest {
         TABLE_1.setColumns(new LinkedList<>(TABLE_1_COLUMNS));
         TABLE_1.setConstraints(TABLE_1_CONSTRAINTS);
         TABLE_1_DTO.setColumns(new LinkedList<>(TABLE_1_COLUMNS_DTO));
+        TABLE_1_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO);
+        TABLE_2_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO);
         VIEW_1_DTO.setIdentifiers(VIEW_1_DTO_IDENTIFIERS);
         DATABASE_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4)));
         IDENTIFIER_1.setDatabase(DATABASE_1);
@@ -76,10 +78,13 @@ public abstract class AbstractUnitTest extends BaseTest {
         VIEW_1.setDatabase(DATABASE_1);
         VIEW_1.setColumns(new LinkedList<>(VIEW_1_COLUMNS));
         VIEW_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_3)));
+        VIEW_1_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO);
         VIEW_2.setDatabase(DATABASE_1);
         VIEW_2.setColumns(new LinkedList<>(VIEW_2_COLUMNS));
+        VIEW_2_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO);
         VIEW_3.setDatabase(DATABASE_1);
         VIEW_3.setColumns(new LinkedList<>(VIEW_3_COLUMNS));
+        VIEW_3_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO);
         IDENTIFIER_1.setDatabase(DATABASE_1);
         IDENTIFIER_2.setDatabase(DATABASE_1);
         IDENTIFIER_3.setDatabase(DATABASE_1);
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 d732a35843dd28784b03335d1c626fd210f75f8f..85999836878d6c0b8e930b07bad8ca91b70a79e0 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
@@ -133,7 +133,7 @@ import static java.time.temporal.ChronoUnit.MINUTES;
  * <li>Identifier 6 (Title=en, Description=en, Query=3)</li>
  * </ul>
  * <p>
- * Database 4 (Public Data, Public Schema, User 4) -> Container 4
+ * Database 4 (Public Data, Public Schema, User 4) -> Container 2
  * <li>Table 9</li>
  * <li>Identifier 7</li>
  * <li>Query 7</li>
@@ -548,17 +548,6 @@ public abstract class BaseTest {
                     .build())
             .build();
 
-    public final static UserDto USER_1_PRIVILEGED_DTO = UserDto.builder()
-            .id(USER_1_ID)
-            .username(USER_1_USERNAME)
-            .password(USER_1_PASSWORD)
-            .attributes(USER_1_ATTRIBUTES_DTO)
-            .firstname(USER_1_FIRSTNAME)
-            .lastname(USER_1_LASTNAME)
-            .qualifiedName(USER_1_QUALIFIED_NAME)
-            .lastRetrieved(Instant.now())
-            .build();
-
     public final static User USER_1 = User.builder()
             .id(USER_1_ID)
             .username(USER_1_USERNAME)
@@ -736,17 +725,6 @@ public abstract class BaseTest {
             .tags(new String[]{})
             .build();
 
-    public final static UserDto USER_2_PRIVILEGED_DTO = UserDto.builder()
-            .id(USER_2_ID)
-            .username(USER_2_USERNAME)
-            .password(USER_2_PASSWORD)
-            .attributes(USER_2_ATTRIBUTES_DTO)
-            .firstname(USER_2_FIRSTNAME)
-            .lastname(USER_2_LASTNAME)
-            .qualifiedName(USER_2_QUALIFIED_NAME)
-            .lastRetrieved(Instant.now())
-            .build();
-
     public final static Principal USER_2_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_2_DETAILS,
             USER_2_PASSWORD, USER_2_DETAILS.getAuthorities());
 
@@ -838,17 +816,6 @@ public abstract class BaseTest {
             .tags(new String[]{})
             .build();
 
-    public final static UserDto USER_3_PRIVILEGED_DTO = UserDto.builder()
-            .id(USER_3_ID)
-            .username(USER_3_USERNAME)
-            .password(USER_3_PASSWORD)
-            .attributes(USER_3_ATTRIBUTES_DTO)
-            .firstname(USER_3_FIRSTNAME)
-            .lastname(USER_3_LASTNAME)
-            .qualifiedName(USER_3_QUALIFIED_NAME)
-            .lastRetrieved(Instant.now())
-            .build();
-
     public final static UUID USER_4_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0");
     public final static UUID USER_4_LDAP_ID = UUID.fromString("791d58c5-bfab-4520-b4fc-b44d4ab9feb0");
     public final static String USER_4_USERNAME = "junit4";
@@ -920,17 +887,6 @@ public abstract class BaseTest {
     public final static Principal USER_4_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_4_DETAILS,
             USER_4_PASSWORD, USER_4_DETAILS.getAuthorities());
 
-    public final static UserDto USER_4_PRIVILEGED_DTO = UserDto.builder()
-            .id(USER_4_ID)
-            .username(USER_4_USERNAME)
-            .password(USER_4_PASSWORD)
-            .attributes(USER_4_ATTRIBUTES_DTO)
-            .firstname(USER_4_FIRSTNAME)
-            .lastname(USER_4_LASTNAME)
-            .qualifiedName(USER_4_QUALIFIED_NAME)
-            .lastRetrieved(Instant.now())
-            .build();
-
     public final static UUID USER_5_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630");
     public final static UUID USER_5_LDAP_ID = UUID.fromString("28ff851d-d7bc-4422-959c-edd7a5b15630");
     public final static String USER_5_USERNAME = "nobody";
@@ -968,17 +924,6 @@ public abstract class BaseTest {
             .attributes(USER_5_ATTRIBUTES_DTO)
             .build();
 
-    public final static UserDto USER_5_PRIVILEGED_DTO = UserDto.builder()
-            .id(USER_5_ID)
-            .username(USER_5_USERNAME)
-            .firstname(USER_5_FIRSTNAME)
-            .lastname(USER_5_LASTNAME)
-            .qualifiedName(USER_5_QUALIFIED_NAME)
-            .password(USER_5_PASSWORD)
-            .attributes(USER_5_ATTRIBUTES_DTO)
-            .lastRetrieved(Instant.now())
-            .build();
-
     public final static UserBriefDto USER_5_BRIEF_DTO = UserBriefDto.builder()
             .id(USER_5_ID)
             .username(USER_5_USERNAME)
@@ -1132,8 +1077,6 @@ public abstract class BaseTest {
                     .build()));
 
     public final static Long CONTAINER_1_ID = 1L;
-    public final static ContainerImage CONTAINER_1_IMAGE = IMAGE_1;
-    public final static ImageDto CONTAINER_1_IMAGE_DTO = IMAGE_1_DTO;
     public final static String CONTAINER_1_NAME = "u01";
     public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-u01";
     public final static String CONTAINER_1_UI_HOST = "localhost";
@@ -1152,7 +1095,7 @@ public abstract class BaseTest {
             .id(CONTAINER_1_ID)
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
-            .image(CONTAINER_1_IMAGE)
+            .image(IMAGE_1)
             .created(CONTAINER_1_CREATED)
             .host(CONTAINER_1_HOST)
             .port(CONTAINER_1_PORT)
@@ -1168,7 +1111,7 @@ public abstract class BaseTest {
             .id(CONTAINER_1_ID)
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
-            .image(CONTAINER_1_IMAGE_DTO)
+            .image(IMAGE_1_DTO)
             .host(CONTAINER_1_HOST)
             .port(CONTAINER_1_PORT)
             .build();
@@ -1186,12 +1129,12 @@ public abstract class BaseTest {
             .id(CONTAINER_1_ID)
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
-            .image(CONTAINER_1_IMAGE_DTO)
+            .image(IMAGE_1_DTO)
             .host(CONTAINER_1_HOST)
             .port(CONTAINER_1_PORT)
+            .lastRetrieved(Instant.now())
             .username(CONTAINER_1_PRIVILEGED_USERNAME)
             .password(CONTAINER_1_PRIVILEGED_PASSWORD)
-            .lastRetrieved(Instant.now())
             .build();
 
     public final static Long CONTAINER_2_ID = 2L;
@@ -1245,9 +1188,9 @@ public abstract class BaseTest {
             .image(CONTAINER_2_IMAGE_DTO)
             .host(CONTAINER_2_HOST)
             .port(CONTAINER_2_PORT)
+            .lastRetrieved(Instant.now())
             .username(CONTAINER_2_PRIVILEGED_USERNAME)
             .password(CONTAINER_2_PRIVILEGED_PASSWORD)
-            .lastRetrieved(Instant.now())
             .build();
 
     public final static Long CONTAINER_3_ID = 3L;
@@ -1390,6 +1333,21 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>()) /* IDENTIFIER_6_DTO */
             .build();
 
+    public final static DatabaseDto DATABASE_3_PRIVILEGED_DTO = DatabaseDto.builder()
+            .id(DATABASE_3_ID)
+            .isPublic(DATABASE_3_PUBLIC)
+            .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC)
+            .name(DATABASE_3_NAME)
+            .internalName(DATABASE_3_INTERNALNAME)
+            .owner(USER_3_BRIEF_DTO)
+            .container(CONTAINER_1_PRIVILEGED_DTO)
+            .exchangeName(DATABASE_3_EXCHANGE)
+            .tables(new LinkedList<>()) /* TABLE_8_DTO */
+            .views(new LinkedList<>()) /* VIEW_5_DTO */
+            .identifiers(new LinkedList<>()) /* IDENTIFIER_6_DTO */
+            .lastRetrieved(Instant.now())
+            .build();
+
     public final static DatabaseBriefDto DATABASE_3_BRIEF_DTO = DatabaseBriefDto.builder()
             .id(DATABASE_3_ID)
             .isPublic(DATABASE_3_PUBLIC)
@@ -1434,6 +1392,7 @@ public abstract class BaseTest {
             .isPublic(DATABASE_4_PUBLIC)
             .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC)
             .name(DATABASE_4_NAME)
+            .container(CONTAINER_2_DTO)
             .description(DATABASE_4_DESCRIPTION)
             .internalName(DATABASE_4_INTERNALNAME)
             .exchangeName(DATABASE_4_EXCHANGE)
@@ -1443,6 +1402,22 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>()) /* IDENTIFIER_7_DTO */
             .build();
 
+    public final static DatabaseDto DATABASE_4_PRIVILEGED_DTO = DatabaseDto.builder()
+            .id(DATABASE_4_ID)
+            .isPublic(DATABASE_4_PUBLIC)
+            .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC)
+            .name(DATABASE_4_NAME)
+            .container(CONTAINER_2_PRIVILEGED_DTO)
+            .description(DATABASE_4_DESCRIPTION)
+            .internalName(DATABASE_4_INTERNALNAME)
+            .exchangeName(DATABASE_4_EXCHANGE)
+            .owner(USER_4_BRIEF_DTO)
+            .tables(new LinkedList<>()) /* TABLE_9_DTO */
+            .views(new LinkedList<>())
+            .identifiers(new LinkedList<>()) /* IDENTIFIER_7_DTO */
+            .lastRetrieved(Instant.now())
+            .build();
+
     public final static TableCreateDto TABLE_0_CREATE_DTO = TableCreateDto.builder()
             .name("full")
             .description("full example")
@@ -1650,6 +1625,7 @@ public abstract class BaseTest {
             .dataLength(TABLE_1_DATA_LENGTH)
             .maxDataLength(TABLE_1_MAX_DATA_LENGTH)
             .lastRetrieved(Instant.now())
+            .database(null) /* DATABASE_1_PRIVILEGED_DTO */
             .build();
 
     public final static Table TABLE_1 = Table.builder()
@@ -1863,6 +1839,7 @@ public abstract class BaseTest {
             .dataLength(TABLE_2_DATA_LENGTH)
             .maxDataLength(TABLE_2_MAX_DATA_LENGTH)
             .lastRetrieved(Instant.now())
+            .database(null) /* DATABASE_1_PRIVILEGED_DTO */
             .build();
 
     public final static TableDto TABLE_2_DTO = TableDto.builder()
@@ -5169,6 +5146,7 @@ public abstract class BaseTest {
             .queryHash(VIEW_1_QUERY_HASH)
             .columns(VIEW_1_COLUMNS_DTO)
             .lastRetrieved(Instant.now())
+            .database(null) /* DATABASE_1_PRIVILEGED_DTO */
             .build();
 
     public final static ViewBriefDto VIEW_1_BRIEF_DTO = ViewBriefDto.builder()
@@ -5331,6 +5309,7 @@ public abstract class BaseTest {
             .queryHash(VIEW_2_QUERY_HASH)
             .columns(VIEW_2_COLUMNS_DTO)
             .lastRetrieved(Instant.now())
+            .database(null) /* DATABASE_1_PRIVILEGED_DTO */
             .build();
 
     public final static ViewBriefDto VIEW_2_BRIEF_DTO = ViewBriefDto.builder()
@@ -5431,6 +5410,7 @@ public abstract class BaseTest {
             .queryHash(VIEW_3_QUERY_HASH)
             .columns(VIEW_3_COLUMNS_DTO)
             .lastRetrieved(Instant.now())
+            .database(null) /* DATABASE_1_PRIVILEGED_DTO */
             .build();
 
     public final static List<ViewColumn> VIEW_3_COLUMNS = List.of(
@@ -7564,6 +7544,20 @@ public abstract class BaseTest {
             .views(new LinkedList<>(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)))
             .build();
 
+    public final static DatabaseDto DATABASE_1_PRIVILEGED_DTO = DatabaseDto.builder()
+            .id(DATABASE_1_ID)
+            .isPublic(DATABASE_1_PUBLIC)
+            .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC)
+            .name(DATABASE_1_NAME)
+            .container(CONTAINER_1_PRIVILEGED_DTO)
+            .internalName(DATABASE_1_INTERNALNAME)
+            .exchangeName(DATABASE_1_EXCHANGE)
+            .identifiers(new LinkedList<>(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO)))
+            .tables(new LinkedList<>(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO)))
+            .views(new LinkedList<>(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)))
+            .lastRetrieved(Instant.now())
+            .build();
+
     public final static DatabaseBriefDto DATABASE_1_BRIEF_DTO = DatabaseBriefDto.builder()
             .id(DATABASE_1_ID)
             .isPublic(DATABASE_1_PUBLIC)
@@ -7705,6 +7699,21 @@ public abstract class BaseTest {
             .build();
 
     public final static DatabaseDto DATABASE_2_DTO = DatabaseDto.builder()
+            .id(DATABASE_2_ID)
+            .isPublic(DATABASE_2_PUBLIC)
+            .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC)
+            .name(DATABASE_2_NAME)
+            .container(CONTAINER_1_DTO)
+            .internalName(DATABASE_2_INTERNALNAME)
+            .exchangeName(DATABASE_2_EXCHANGE)
+            .identifiers(new LinkedList<>(List.of(IDENTIFIER_5_DTO)))
+            .tables(new LinkedList<>(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO)))
+            .views(new LinkedList<>(List.of(VIEW_4_DTO)))
+            .owner(USER_2_BRIEF_DTO)
+            .lastRetrieved(Instant.now())
+            .build();
+
+    public final static DatabaseDto DATABASE_2_PRIVILEGED_DTO = DatabaseDto.builder()
             .id(DATABASE_2_ID)
             .isPublic(DATABASE_2_PUBLIC)
             .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC)
diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py
index 1f9f778a84460f018f8463153f14fb13533bb8a7..78861ffd048edaf9d451a02cab8cbf591acd3a21 100644
--- a/lib/python/dbrepo/RestClient.py
+++ b/lib/python/dbrepo/RestClient.py
@@ -252,7 +252,7 @@ class RestClient:
                                 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:
+                    affiliation: str = None, orcid: str = None) -> UserBrief:
         """
         Updates a user with given user id.
 
@@ -277,7 +277,7 @@ class RestClient:
                                                     lastname=lastname, affiliation=affiliation, orcid=orcid))
         if response.status_code == 202:
             body = response.json()
-            return User.model_validate(body)
+            return UserBrief.model_validate(body)
         if response.status_code == 400:
             raise MalformedError(f'Failed to update user: {response.text}')
         if response.status_code == 403:
@@ -287,15 +287,13 @@ class RestClient:
         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:
+    def update_user_password(self, user_id: str, password: str) -> None:
         """
         Updates the password of a user with given user id.
 
         :param user_id: The user id of the user that should be updated.
         :param password: The updated user password.
 
-        :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.
@@ -306,8 +304,7 @@ class RestClient:
         url = f'/api/user/{user_id}/password'
         response = self._wrapper(method="put", url=url, force_auth=True, payload=UpdateUserPassword(password=password))
         if response.status_code == 202:
-            body = response.json()
-            return User.model_validate(body)
+            return None
         if response.status_code == 400:
             raise MalformedError(f'Failed to update user password: {response.text}')
         if response.status_code == 403:
@@ -617,7 +614,7 @@ class RestClient:
 
     def create_table(self, database_id: int, name: str, is_public: bool, is_schema_public: bool,
                      columns: List[CreateTableColumn], constraints: CreateTableConstraints,
-                     description: str = None) -> Table:
+                     description: str = None) -> TableBrief:
         """
         Updates the database owner of a database with given database id.
 
@@ -645,7 +642,7 @@ class RestClient:
                                                      description=description, columns=columns, constraints=constraints))
         if response.status_code == 201:
             body = response.json()
-            return Table.model_validate(body)
+            return TableBrief.model_validate(body)
         if response.status_code == 400:
             raise MalformedError(f'Failed to create table: {response.text}')
         if response.status_code == 403:
@@ -871,7 +868,7 @@ class RestClient:
         raise ResponseCodeError(f'Failed to find view: response code: {response.status_code} is not '
                                 f'200 (OK): {response.text}')
 
-    def update_view(self, database_id: int, view_id: int, is_public: bool) -> View:
+    def update_view(self, database_id: int, view_id: int, is_public: bool) -> ViewBrief:
         """
         Get a view of a database with given database id and view id.
 
@@ -889,7 +886,7 @@ class RestClient:
         response = self._wrapper(method="put", url=url, payload=UpdateView(is_public=is_public))
         if response.status_code == 202:
             body = response.json()
-            return View.model_validate(body)
+            return ViewBrief.model_validate(body)
         if response.status_code == 403:
             raise ForbiddenError(f'Failed to update view: not allowed')
         if response.status_code == 404: