diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java
index 1d5e35a41d78b4b812c792b176c447dd00f10da6..adf674f1b2e2cd83e9192e57bdc6d4015e721053 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java
@@ -6,6 +6,7 @@ import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.query.QueryPersistDto;
 import at.tuwien.endpoints.SubsetEndpoint;
 import at.tuwien.exception.*;
+import at.tuwien.gateway.MetadataServiceGateway;
 import at.tuwien.service.CredentialService;
 import at.tuwien.service.SchemaService;
 import at.tuwien.service.StorageService;
@@ -55,6 +56,9 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
     @MockBean
     private SchemaService schemaService;
 
+    @MockBean
+    private MetadataServiceGateway metadataServiceGateway;
+
     @MockBean
     private HttpServletRequest httpServletRequest;
 
@@ -74,7 +78,22 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithAnonymousUser
-    public void list_succeeds() throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException,
+    public void list_publicDataPrivateSchemaAnonymous_fails() throws QueryNotFoundException, DatabaseNotFoundException,
+            RemoteUnavailableException, SQLException, MetadataServiceException {
+
+        /* mock */
+        when(subsetService.findAll(DATABASE_3_PRIVILEGED_DTO, null))
+                .thenReturn(List.of(QUERY_1_DTO, QUERY_2_DTO, QUERY_3_DTO, QUERY_4_DTO, QUERY_5_DTO, QUERY_6_DTO));
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_3_USERNAME)
+    public void list_publicDataPrivateSchema_succeeds() throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException,
             DatabaseNotFoundException, RemoteUnavailableException, SQLException, MetadataServiceException {
 
         /* mock */
@@ -82,7 +101,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(List.of(QUERY_1_DTO, QUERY_2_DTO, QUERY_3_DTO, QUERY_4_DTO, QUERY_5_DTO, QUERY_6_DTO));
 
         /* test */
-        final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null);
+        final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, USER_3_PRINCIPAL);
         assertEquals(6, response.size());
     }
 
@@ -97,8 +116,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
     }
 
     @Test
-    @WithAnonymousUser
-    public void list_unavailable_fails() throws SQLException, QueryNotFoundException, DatabaseNotFoundException,
+    @WithMockUser(username = USER_3_USERNAME)
+    public void list_publicDataAndPrivateSchemaUnavailable_fails() throws SQLException, QueryNotFoundException, DatabaseNotFoundException,
             RemoteUnavailableException, MetadataServiceException {
 
         /* mock */
@@ -110,13 +129,45 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
-            generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null);
+            generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, USER_3_PRINCIPAL);
         });
     }
 
     @Test
     @WithAnonymousUser
-    public void findById_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
+    public void findById_privateDataPrivateSchemaAnonymous_fails() throws DatabaseNotFoundException, SQLException,
+            RemoteUnavailableException, UserNotFoundException, QueryNotFoundException, MetadataServiceException {
+
+        /* mock */
+        when(credentialService.getDatabase(DATABASE_1_ID))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID))
+                .thenReturn(QUERY_1_DTO);
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            generic_findById(DATABASE_1_ID, QUERY_1_ID, "application/json", null, null);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void findById_privateDataPrivateSchema_succeeds() throws DatabaseNotFoundException, SQLException,
+            RemoteUnavailableException, UserNotFoundException, QueryNotFoundException, MetadataServiceException, DatabaseUnavailableException, TableNotFoundException, StorageUnavailableException, NotAllowedException, ViewMalformedException, QueryMalformedException, FormatNotAvailableException {
+
+        /* mock */
+        when(credentialService.getDatabase(DATABASE_1_ID))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID))
+                .thenReturn(QUERY_1_DTO);
+
+        /* test */
+        generic_findById(DATABASE_1_ID, QUERY_1_ID, "application/json", null, USER_1_PRINCIPAL);
+    }
+
+    @Test
+    @WithMockUser(username = USER_3_USERNAME)
+    public void findById_publicDataPrivateSchema_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
             DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotFoundException,
             FormatNotAvailableException, TableNotFoundException, MetadataServiceException, SQLException,
             ViewMalformedException, NotAllowedException {
@@ -128,7 +179,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(QUERY_5_DTO);
 
         /* test */
-        generic_findById(QUERY_5_ID, "application/json", null, null);
+        generic_findById(DATABASE_3_ID, QUERY_5_ID, "application/json", null, USER_3_PRINCIPAL);
     }
 
     @Test
@@ -137,29 +188,29 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
             UserNotFoundException, QueryNotFoundException, MetadataServiceException {
 
         /* mock */
-        when(credentialService.getDatabase(DATABASE_3_ID))
-                .thenReturn(DATABASE_3_PRIVILEGED_DTO);
-        when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID))
-                .thenReturn(QUERY_5_DTO);
+        when(credentialService.getDatabase(DATABASE_4_ID))
+                .thenReturn(DATABASE_4_PRIVILEGED_DTO);
+        when(subsetService.findById(DATABASE_4_PRIVILEGED_DTO, QUERY_7_ID))
+                .thenReturn(QUERY_7_DTO);
 
         /* test */
         assertThrows(FormatNotAvailableException.class, () -> {
-            generic_findById(QUERY_5_ID, "application/pdf", null, null);
+            generic_findById(DATABASE_4_ID, QUERY_7_ID, "application/pdf", null, null);
         });
     }
 
     @Test
-    @WithAnonymousUser
-    public void findById_acceptCsv_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
+    @WithMockUser(username = USER_1_USERNAME)
+    public void findById_privateDataPrivateSchemaAcceptCsv_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
             UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException,
             QueryNotFoundException, FormatNotAvailableException, SQLException, MetadataServiceException,
             TableNotFoundException, ViewMalformedException, NotAllowedException {
         final Dataset<Row> mock = sparkSession.emptyDataFrame();
 
         /* mock */
-        when(credentialService.getDatabase(DATABASE_3_ID))
-                .thenReturn(DATABASE_3_PRIVILEGED_DTO);
-        when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID))
+        when(credentialService.getDatabase(DATABASE_1_ID))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID))
                 .thenReturn(QUERY_5_DTO);
         when(storageService.transformDataset(any(Dataset.class)))
                 .thenReturn(EXPORT_RESOURCE_DTO);
@@ -167,15 +218,15 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(mock);
 
         /* test */
-        generic_findById(QUERY_5_ID,"text/csv", null, null);
+        generic_findById(DATABASE_1_ID, QUERY_1_ID, "text/csv", null, USER_1_PRINCIPAL);
     }
 
     @Test
     @WithAnonymousUser
-    public void findById_timestamp_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
-            UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException,
-            QueryNotFoundException, FormatNotAvailableException, SQLException, MetadataServiceException,
-            TableNotFoundException, ViewMalformedException, NotAllowedException {
+    public void findById_publicDataPrivateSchemaAnonymous_fails() throws DatabaseNotFoundException,
+            RemoteUnavailableException, UserNotFoundException, StorageUnavailableException, QueryMalformedException,
+            QueryNotFoundException, SQLException, MetadataServiceException, TableNotFoundException,
+            ViewMalformedException {
         final Dataset<Row> mock = sparkSession.emptyDataFrame();
 
         /* mock */
@@ -189,7 +240,32 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(EXPORT_RESOURCE_DTO);
 
         /* test */
-        generic_findById(QUERY_5_ID, "text/csv", Instant.now(), null);
+        assertThrows(NotAllowedException.class, () -> {
+            generic_findById(DATABASE_3_ID, QUERY_5_ID, "text/csv", Instant.now(), null);
+        });
+    }
+
+    @Test
+    @WithAnonymousUser
+    public void findById_publicDataPublicSchemaAnonymous_fails() throws DatabaseNotFoundException, SQLException,
+            RemoteUnavailableException, UserNotFoundException, QueryMalformedException, StorageUnavailableException,
+            QueryNotFoundException, MetadataServiceException, TableNotFoundException, ViewMalformedException {
+        final Dataset<Row> mock = sparkSession.emptyDataFrame();
+
+        /* mock */
+        when(credentialService.getDatabase(DATABASE_3_ID))
+                .thenReturn(DATABASE_3_PRIVILEGED_DTO);
+        when(subsetService.findById(DATABASE_4_PRIVILEGED_DTO, QUERY_5_ID))
+                .thenReturn(QUERY_5_DTO);
+        when(subsetService.getData(any(PrivilegedDatabaseDto.class), any(QueryDto.class), eq(null), eq(null)))
+                .thenReturn(mock);
+        when(storageService.transformDataset(any(Dataset.class)))
+                .thenReturn(EXPORT_RESOURCE_DTO);
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            generic_findById(DATABASE_3_ID, QUERY_5_ID, "text/csv", Instant.now(), null);
+        });
     }
 
     @Test
@@ -203,13 +279,13 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
-            generic_findById(QUERY_5_ID, "application/json", null, null);
+            generic_findById(DATABASE_3_ID, QUERY_5_ID, "application/json", null, null);
         });
     }
 
     @Test
-    @WithAnonymousUser
-    public void findById_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException,
+    @WithMockUser(username = USER_3_USERNAME)
+    public void findById_publicDataAndPrivateSchemaUnavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException,
             MetadataServiceException, SQLException, UserNotFoundException, QueryNotFoundException {
 
         /* mock */
@@ -221,13 +297,13 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
-            generic_findById(QUERY_5_ID, "application/json", null, null);
+            generic_findById(DATABASE_3_ID, QUERY_5_ID, "application/json", null, USER_3_PRINCIPAL);
         });
     }
 
     @Test
-    @WithAnonymousUser
-    public void findById_unavailableExport_fails() throws DatabaseNotFoundException, RemoteUnavailableException,
+    @WithMockUser(username = USER_1_USERNAME)
+    public void findById_publicDataPrivateSchemaUnavailableExport_fails() throws DatabaseNotFoundException, RemoteUnavailableException,
             MetadataServiceException, SQLException, QueryMalformedException, UserNotFoundException,
             QueryNotFoundException, TableNotFoundException, ViewMalformedException, StorageUnavailableException {
 
@@ -244,7 +320,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseUnavailableException.class, () -> {
-            generic_findById(QUERY_5_ID, "text/csv", null, null);
+            generic_findById(DATABASE_3_ID, QUERY_5_ID, "text/csv", null, USER_1_PRINCIPAL);
         });
     }
 
@@ -326,7 +402,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
     @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"})
     public void create_unavailable_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
             SQLException, MetadataServiceException, QueryMalformedException, TableNotFoundException,
-            ViewMalformedException, UserNotFoundException, QueryNotFoundException, QueryStoreInsertException {
+            ViewMalformedException, UserNotFoundException, QueryNotFoundException, QueryStoreInsertException,
+            NotAllowedException {
         final ExecuteStatementDto request = ExecuteStatementDto.builder()
                 .statement(QUERY_5_STATEMENT)
                 .build();
@@ -339,6 +416,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(null), eq(null));
         when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong()))
                 .thenReturn(QUERY_5_DTO);
+        when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID))
+                .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO);
         doThrow(SQLException.class)
                 .when(subsetService)
                 .create(eq(DATABASE_3_PRIVILEGED_DTO), eq(QUERY_5_STATEMENT), any(Instant.class), eq(USER_1_ID));
@@ -402,7 +481,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithAnonymousUser
-    public void create_anonymous_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
+    public void create_publicDataPublicSchemaAnonymous_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
             MetadataServiceException, UserNotFoundException, QueryStoreInsertException, TableMalformedException,
             NotAllowedException, SQLException, QueryNotFoundException, DatabaseUnavailableException,
             StorageUnavailableException, QueryMalformedException, QueryNotSupportedException, PaginationException,
@@ -413,19 +492,75 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* mock */
-        when(credentialService.getDatabase(DATABASE_3_ID))
-                .thenReturn(DATABASE_3_PRIVILEGED_DTO);
-        when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong()))
+        when(credentialService.getDatabase(DATABASE_4_ID))
+                .thenReturn(DATABASE_4_PRIVILEGED_DTO);
+        when(subsetService.findById(eq(DATABASE_4_PRIVILEGED_DTO), anyLong()))
                 .thenReturn(QUERY_5_DTO);
-        when(subsetService.getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L)))
+        when(subsetService.getData(eq(DATABASE_4_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L)))
                 .thenReturn(mock);
-        when(schemaService.inspectView(eq(DATABASE_3_PRIVILEGED_DTO), anyString()))
+        when(schemaService.inspectView(eq(DATABASE_4_PRIVILEGED_DTO), anyString()))
                 .thenReturn(VIEW_5_DTO);
         when(httpServletRequest.getMethod())
                 .thenReturn("POST");
 
         /* test */
-        subsetEndpoint.create(DATABASE_3_ID, request, null, httpServletRequest, null, null, null);
+        subsetEndpoint.create(DATABASE_4_ID, request, null, httpServletRequest, null, null, null);
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME)
+    public void create_privateDataPrivateSchema_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException,
+            MetadataServiceException, UserNotFoundException, QueryStoreInsertException, TableMalformedException,
+            NotAllowedException, SQLException, QueryNotFoundException, DatabaseUnavailableException,
+            StorageUnavailableException, QueryMalformedException, QueryNotSupportedException, PaginationException,
+            StorageNotFoundException, TableNotFoundException, ViewMalformedException, ViewNotFoundException {
+        final Dataset<Row> mock = sparkSession.emptyDataFrame();
+        final ExecuteStatementDto request = ExecuteStatementDto.builder()
+                .statement(QUERY_1_STATEMENT)
+                .build();
+
+        /* mock */
+        when(credentialService.getDatabase(DATABASE_1_ID))
+                .thenReturn(DATABASE_1_PRIVILEGED_DTO);
+        when(subsetService.findById(eq(DATABASE_1_PRIVILEGED_DTO), anyLong()))
+                .thenReturn(QUERY_1_DTO);
+        when(subsetService.getData(eq(DATABASE_1_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L)))
+                .thenReturn(mock);
+        when(schemaService.inspectView(eq(DATABASE_1_PRIVILEGED_DTO), anyString()))
+                .thenReturn(VIEW_1_DTO);
+        when(httpServletRequest.getMethod())
+                .thenReturn("POST");
+
+        /* test */
+        subsetEndpoint.create(DATABASE_1_ID, request, USER_1_PRINCIPAL, httpServletRequest, null, null, null);
+    }
+
+    @Test
+    @WithAnonymousUser
+    public void create_privateDataPublicSchemaAnonymous_fails() throws DatabaseNotFoundException, SQLException,
+            MetadataServiceException, UserNotFoundException, QueryNotFoundException, QueryMalformedException,
+            TableNotFoundException, ViewMalformedException, ViewNotFoundException, RemoteUnavailableException {
+        final Dataset<Row> mock = sparkSession.emptyDataFrame();
+        final ExecuteStatementDto request = ExecuteStatementDto.builder()
+                .statement(QUERY_5_STATEMENT)
+                .build();
+
+        /* mock */
+        when(credentialService.getDatabase(DATABASE_2_ID))
+                .thenReturn(DATABASE_2_PRIVILEGED_DTO);
+        when(subsetService.findById(eq(DATABASE_2_PRIVILEGED_DTO), anyLong()))
+                .thenReturn(QUERY_2_DTO);
+        when(subsetService.getData(eq(DATABASE_2_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L)))
+                .thenReturn(mock);
+        when(schemaService.inspectView(eq(DATABASE_2_PRIVILEGED_DTO), anyString()))
+                .thenReturn(VIEW_4_DTO);
+        when(httpServletRequest.getMethod())
+                .thenReturn("POST");
+
+        /* test */
+        assertThrows(NotAllowedException.class, () -> {
+            subsetEndpoint.create(DATABASE_2_ID, request, null, httpServletRequest, null, null, null);
+        });
     }
 
     @Test
@@ -707,14 +842,14 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
         return response.getBody();
     }
 
-    protected void generic_findById(Long subsetId, String accept, Instant timestamp, Principal principal)
-            throws UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException,
-            NotAllowedException, QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException,
-            RemoteUnavailableException, FormatNotAvailableException, MetadataServiceException, TableNotFoundException,
-            ViewMalformedException {
+    protected void generic_findById(Long databaseId, Long subsetId, String accept, Instant timestamp,
+                                    Principal principal) throws UserNotFoundException, DatabaseUnavailableException,
+            StorageUnavailableException, NotAllowedException, QueryMalformedException, QueryNotFoundException,
+            DatabaseNotFoundException, RemoteUnavailableException, FormatNotAvailableException,
+            MetadataServiceException, TableNotFoundException, ViewMalformedException {
 
         /* test */
-        final ResponseEntity<?> response = subsetEndpoint.findById(DATABASE_3_ID, subsetId, accept, timestamp, principal);
+        final ResponseEntity<?> response = subsetEndpoint.findById(databaseId, subsetId, accept, timestamp, principal);
         assertEquals(HttpStatus.OK, response.getStatusCode());
         assertNotNull(response.getBody());
     }
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 f1d8e0f9fc3e19aea2e4f435c0051e629b1a892a..f65de0707eec016f502d66f45e8f52b5811f042f 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
@@ -31,8 +31,7 @@ import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.when;
 
@@ -45,6 +44,10 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     @Qualifier("restTemplate")
     private RestTemplate restTemplate;
 
+    @MockBean
+    @Qualifier("internalRestTemplate")
+    private RestTemplate internalRestTemplate;
+
     @Autowired
     private MetadataServiceGateway metadataServiceGateway;
 
@@ -66,7 +69,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Table", TABLE_1_INTERNAL_NAME);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.OK)
                         .headers(headers)
                         .body(TABLE_1_DTO));
@@ -87,7 +90,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class));
 
         /* test */
@@ -101,7 +104,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.ServiceUnavailable.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class));
 
         /* test */
@@ -114,7 +117,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getTableById_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .body(TABLE_1_DTO));
 
@@ -134,7 +137,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
                 headers.add(customHeaders.get(j), "");
             }
             /* mock */
-            when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
+            when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
                     .thenReturn(ResponseEntity.status(HttpStatus.OK)
                             .headers(headers)
                             .body(TABLE_1_DTO));
@@ -157,7 +160,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Table", TABLE_1_INTERNAL_NAME);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.OK)
                         .headers(headers)
                         .build());
@@ -178,7 +181,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Port", "" + CONTAINER_1_PORT);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .headers(headers)
                         .body(DATABASE_1_PRIVILEGED_DTO));
@@ -193,7 +196,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class));
 
         /* test */
@@ -207,7 +210,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class));
 
         /* test */
@@ -220,7 +223,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getDatabaseById_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -237,7 +240,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.OK)
                         .headers(headers)
                         .build());
@@ -258,7 +261,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
                 headers.add(customHeaders.get(j), "");
             }
             /* mock */
-            when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
+            when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
                     .thenReturn(ResponseEntity.status(HttpStatus.OK)
                             .headers(headers)
                             .build());
@@ -276,7 +279,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .headers(headers)
                         .body(CONTAINER_1_DTO));
@@ -291,7 +294,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class));
 
         /* test */
@@ -305,7 +308,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class));
 
         /* test */
@@ -318,7 +321,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getContainerById_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -338,7 +341,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
                 headers.add(customHeaders.get(j), "");
             }
             /* mock */
-            when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
+            when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
                     .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                             .build());
 
@@ -356,7 +359,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ContainerDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.OK)
                         .headers(headers)
                         .build());
@@ -379,7 +382,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-View", VIEW_1_INTERNAL_NAME);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(ViewDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .headers(headers)
                         .body(VIEW_1_DTO));
@@ -394,7 +397,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class));
 
         /* test */
@@ -408,7 +411,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class));
 
         /* test */
@@ -421,7 +424,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getViewById_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -441,7 +444,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
                 headers.add(customHeaders.get(j), "");
             }
             /* mock */
-            when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
+            when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
                     .thenReturn(ResponseEntity.status(HttpStatus.OK)
                             .build());
 
@@ -463,7 +466,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Database", DATABASE_1_INTERNALNAME);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(ViewDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .headers(headers)
                         .build());
@@ -478,7 +481,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getUserById_succeeds() throws RemoteUnavailableException, UserNotFoundException, MetadataServiceException {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .body(USER_1_DTO));
 
@@ -492,7 +495,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class));
 
         /* test */
@@ -506,7 +509,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class));
 
         /* test */
@@ -519,7 +522,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getUserById_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -533,7 +536,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getUserById_emptyBody_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .build());
 
@@ -551,7 +554,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .headers(headers)
                         .body(USER_1_DTO));
@@ -568,7 +571,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class));
 
         /* test */
@@ -582,7 +585,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class));
 
         /* test */
@@ -595,7 +598,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getPrivilegedUserById_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -615,7 +618,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
                 headers.add(customHeaders.get(j), "");
             }
             /* mock */
-            when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+            when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                     .thenReturn(ResponseEntity.status(HttpStatus.OK)
                             .build());
 
@@ -633,7 +636,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(UserDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .headers(headers)
                         .build());
@@ -648,7 +651,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getAccess_succeeds() throws RemoteUnavailableException, NotAllowedException, MetadataServiceException {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .body(DATABASE_1_USER_1_READ_ACCESS_DTO));
 
@@ -661,7 +664,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class));
 
         /* test */
@@ -675,7 +678,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.Forbidden.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class));
 
         /* test */
@@ -689,7 +692,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class));
 
         /* test */
@@ -702,7 +705,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getAccess_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -716,7 +719,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getAccess_emptyBody_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(DatabaseAccessDto.class)))
                 .thenReturn(ResponseEntity.ok()
                         .build());
 
@@ -730,7 +733,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getIdentifiers_witSubset_succeeds() throws RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
                 .thenReturn(ResponseEntity.ok()
                         .body(new IdentifierBriefDto[]{IDENTIFIER_1_BRIEF_DTO}));
 
@@ -743,7 +746,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getIdentifiers_succeeds() throws RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
                 .thenReturn(ResponseEntity.ok()
                         .body(new IdentifierBriefDto[]{IDENTIFIER_1_BRIEF_DTO}));
 
@@ -757,7 +760,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class));
 
         /* test */
@@ -771,7 +774,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
+                .when(internalRestTemplate)
                 .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class));
 
         /* test */
@@ -784,7 +787,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getIdentifiers_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
@@ -798,7 +801,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void getIdentifiers_emptyBody_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(IdentifierBriefDto[].class)))
                 .thenReturn(ResponseEntity.ok()
                         .build());
 
@@ -809,10 +812,11 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     }
 
     @Test
-    public void updateTableStatistics_succeeds() throws RemoteUnavailableException, MetadataServiceException, TableNotFoundException {
+    public void updateTableStatistics_succeeds() throws RemoteUnavailableException, MetadataServiceException,
+            TableNotFoundException {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.PUT), eq(HttpEntity.EMPTY), eq(Void.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class)))
                 .thenReturn(ResponseEntity.accepted()
                         .build());
 
@@ -825,8 +829,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
-                .exchange(anyString(), eq(HttpMethod.PUT), eq(HttpEntity.EMPTY), eq(Void.class));
+                .when(internalRestTemplate)
+                .exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class));
 
         /* test */
         assertThrows(RemoteUnavailableException.class, () -> {
@@ -839,8 +843,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
 
         /* mock */
         doThrow(HttpClientErrorException.NotFound.class)
-                .when(restTemplate)
-                .exchange(anyString(), eq(HttpMethod.PUT), eq(HttpEntity.EMPTY), eq(Void.class));
+                .when(internalRestTemplate)
+                .exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class));
 
         /* test */
         assertThrows(TableNotFoundException.class, () -> {
@@ -852,7 +856,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
     public void updateTableStatistics_statusCode_fails() {
 
         /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.PUT), eq(HttpEntity.EMPTY), eq(Void.class)))
+        when(internalRestTemplate.exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), eq(Void.class)))
                 .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT)
                         .build());
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java
index 6a3851b445cf83b74eaccf1b6a3b86bf61ec03d8..158c6743a4e7bac049cae0211fe764030ab4a3f0 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java
@@ -37,7 +37,7 @@ public class SubsetEndpointMvcTest extends AbstractUnitTest {
     private MockMvc mockMvc;
 
     @Test
-    public void findById_noAcceptHeader_succeeds() throws Exception {
+    public void findById_noAcceptHeader_fails() throws Exception {
 
         /* mock */
         when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID))
@@ -48,11 +48,11 @@ public class SubsetEndpointMvcTest extends AbstractUnitTest {
         /* test */
         this.mockMvc.perform(get("/api/database/" + DATABASE_3_ID + "/subset/" + QUERY_5_ID))
                 .andDo(print())
-                .andExpect(status().isOk());
+                .andExpect(status().isBadRequest());
     }
 
     @Test
-    public void findById_jsonAcceptHeader_succeeds() throws Exception {
+    public void findById_privateDataPublicSchema_jsonAcceptHeader_fails() throws Exception {
 
         /* mock */
         when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID))
@@ -64,6 +64,22 @@ public class SubsetEndpointMvcTest extends AbstractUnitTest {
         this.mockMvc.perform(get("/api/database/" + DATABASE_3_ID + "/subset/" + QUERY_5_ID)
                         .accept(MediaType.APPLICATION_JSON))
                 .andDo(print())
+                .andExpect(status().isForbidden());
+    }
+
+    @Test
+    public void findById_publicDataPublicSchema_jsonAcceptHeader_succeeds() throws Exception {
+
+        /* mock */
+        when(metadataServiceGateway.getDatabaseById(DATABASE_4_ID))
+                .thenReturn(DATABASE_4_PRIVILEGED_DTO);
+        when(subsetService.findById(DATABASE_4_PRIVILEGED_DTO, QUERY_7_ID))
+                .thenReturn(QUERY_5_DTO);
+
+        /* test */
+        this.mockMvc.perform(get("/api/database/" + DATABASE_4_ID + "/subset/" + QUERY_7_ID)
+                        .accept(MediaType.APPLICATION_JSON))
+                .andDo(print())
                 .andExpect(status().isOk());
     }
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
index d5cf6dd22e3cbe341ebe612d246bb716ff5c9f6a..2a0ad624dbbb8399cf9d360148c96bd0524c8453 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
@@ -358,7 +358,6 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals("not_in_metadata_db2", response.getInternalName());
         assertEquals("not_in_metadata_db2", response.getName());
         assertEquals(DATABASE_1_ID, response.getVdbid());
-        assertEquals(DATABASE_1_ID, response.getDatabase().getId());
         assertEquals(DATABASE_1_OWNER, response.getOwner().getId());
         assertFalse(response.getIsInitialView());
         assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
@@ -383,20 +382,18 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals(DATABASE_1_ID, column3.getDatabaseId());
     }
 
-    protected static void assertViewColumn(ViewColumnDto column, Long id, Long databaseId, String name,
-                                           String internalName, ColumnTypeDto type, Long size, Long d,
-                                           Boolean nullAllowed, String description) {
-        log.trace("assert column: {}", internalName);
+    protected static void assertViewColumn(ViewColumnDto column, ViewColumnDto other) {
         assertNotNull(column);
-        assertEquals(id, column.getId());
-        assertEquals(databaseId, column.getDatabaseId());
-        assertEquals(name, column.getName());
-        assertEquals(internalName, column.getInternalName());
-        assertEquals(type, column.getColumnType());
-        assertEquals(size, column.getSize());
-        assertEquals(d, column.getD());
-        assertEquals(nullAllowed, column.getIsNullAllowed());
-        assertEquals(description, column.getDescription());
+        assertNotNull(other);
+        assertEquals(column.getId(), other.getId());
+        assertEquals(column.getDatabaseId(), other.getDatabaseId());
+        assertEquals(column.getName(), other.getName());
+        assertEquals(column.getInternalName(), other.getInternalName());
+        assertEquals(column.getColumnType(), other.getColumnType());
+        assertEquals(column.getSize(), other.getSize());
+        assertEquals(column.getD(), other.getD());
+        assertEquals(column.getIsNullAllowed(), other.getIsNullAllowed());
+        assertEquals(column.getDescription(), other.getDescription());
     }
 
     protected static void assertColumn(ColumnDto column, Long id, Long tableId, Long databaseId, String name,
@@ -407,8 +404,6 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals(id, column.getId());
         assertEquals(tableId, column.getTableId());
         assertEquals(databaseId, column.getDatabaseId());
-        assertNotNull(column.getTable());
-        assertEquals(tableId, column.getTable().getId());
         assertEquals(name, column.getName());
         assertEquals(internalName, column.getInternalName());
         assertEquals(type, column.getColumnType());
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
index 5bfaa043d1ded11c26797b94d0ff2cf0d9e509ba..b5555611c666f60f0af6e2d8a122dc11ec3264dd 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
@@ -55,21 +55,7 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest {
     public void create_succeeds() throws SQLException, ViewMalformedException {
 
         /* test */
-        final ViewDto response = viewService.create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO);
-        assertEquals(VIEW_1_NAME, response.getName());
-        assertEquals(VIEW_1_INTERNAL_NAME, response.getInternalName());
-        assertEquals(VIEW_1_QUERY, response.getQuery());
-        assertNotNull(response.getQueryHash());
-        assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
-        final List<ViewColumnDto> columns = response.getColumns();
-        assertEquals(VIEW_1_COLUMNS.size(), columns.size());
-        ViewColumnDto ref = VIEW_1_COLUMNS_DTO.get(0);
-        SchemaServiceIntegrationTest.assertViewColumn(columns.get(0), null, ref.getDatabaseId(), ref.getName(), ref.getInternalName(), ref.getColumnType(), ref.getSize(), ref.getD(), ref.getIsNullAllowed(), ref.getDescription());
-        ref = VIEW_1_COLUMNS_DTO.get(1);
-        SchemaServiceIntegrationTest.assertViewColumn(columns.get(1), null, ref.getDatabaseId(), ref.getName(), ref.getInternalName(), ref.getColumnType(), ref.getSize(), ref.getD(), ref.getIsNullAllowed(), ref.getDescription());
-        ref = VIEW_1_COLUMNS_DTO.get(2);
-        SchemaServiceIntegrationTest.assertViewColumn(columns.get(2), null, ref.getDatabaseId(), ref.getName(), ref.getInternalName(), ref.getColumnType(), ref.getSize(), ref.getD(), ref.getIsNullAllowed(), ref.getDescription());
-
+        viewService.create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO);
     }
 
     @Test
@@ -81,7 +67,6 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest {
         assertEquals("not_in_metadata_db2", view0.getName());
         assertEquals("not_in_metadata_db2", view0.getInternalName());
         assertEquals(DATABASE_1_ID, view0.getVdbid());
-        assertEquals(DATABASE_1_ID, view0.getDatabase().getId());
         assertEquals(DATABASE_1_OWNER, view0.getOwner().getId());
         assertFalse(view0.getIsInitialView());
         assertEquals(DATABASE_1_PUBLIC, view0.getIsPublic());
diff --git a/dbrepo-data-service/rest-service/src/test/resources/init/weather_at.sql b/dbrepo-data-service/rest-service/src/test/resources/init/weather_at.sql
new file mode 100644
index 0000000000000000000000000000000000000000..050ad3fb54db0e86b25f487423c8e648f2bd8e39
--- /dev/null
+++ b/dbrepo-data-service/rest-service/src/test/resources/init/weather_at.sql
@@ -0,0 +1,11 @@
+CREATE
+DATABASE weather_at;
+USE
+weather_at;
+
+CREATE TABLE mfcc
+(
+    location VARCHAR(255) PRIMARY KEY,
+    lat      DOUBLE PRECISION NULL,
+    lng      DOUBLE PRECISION NULL
+) WITH SYSTEM VERSIONING COMMENT 'Hello mfcc';
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-data-service/services/src/main/java/at/tuwien/config/GatewayConfig.java
index 4bdb9cb89f9d93d14c34bb318667882e299f0201..c511f2b511ff3cd66d52f63a55ca8ca73ce2a6c9 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/config/GatewayConfig.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/config/GatewayConfig.java
@@ -36,7 +36,7 @@ public class GatewayConfig {
     }
 
     @Bean
-    public RestTemplate restTemplate() {
+    public RestTemplate internalRestTemplate() {
         final RestTemplate restTemplate = new RestTemplate();
         restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(metadataEndpoint));
         restTemplate.getInterceptors()
@@ -44,4 +44,9 @@ public class GatewayConfig {
         return restTemplate;
     }
 
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+
 }
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 a39b93ef1d8133e9e27d14eeb6c0875d3b1ce280..7d834992cc73b689bc990b6639061ae1ca2ddb71 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
@@ -1,6 +1,7 @@
 package at.tuwien.gateway.impl;
 
 import at.tuwien.api.container.ContainerDto;
+import at.tuwien.api.container.image.ImageDto;
 import at.tuwien.api.container.internal.PrivilegedContainerDto;
 import at.tuwien.api.database.DatabaseAccessDto;
 import at.tuwien.api.database.ViewDto;
@@ -18,6 +19,7 @@ import at.tuwien.mapper.MetadataMapper;
 import jakarta.validation.constraints.NotNull;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.HttpClientErrorException;
@@ -35,13 +37,16 @@ import java.util.UUID;
 public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
 
     private final RestTemplate restTemplate;
+    private final RestTemplate internalRestTemplate;
     private final GatewayConfig gatewayConfig;
     private final MetadataMapper metadataMapper;
 
     @Autowired
-    public MetadataServiceGatewayImpl(RestTemplate restTemplate, GatewayConfig gatewayConfig,
+    public MetadataServiceGatewayImpl(@Qualifier("internalRestTemplate") RestTemplate internalRestTemplate,
+                                      RestTemplate restTemplate, GatewayConfig gatewayConfig,
                                       MetadataMapper metadataMapper) {
         this.restTemplate = restTemplate;
+        this.internalRestTemplate = internalRestTemplate;
         this.gatewayConfig = gatewayConfig;
         this.metadataMapper = metadataMapper;
     }
@@ -53,7 +58,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/container/" + containerId;
         log.debug("get privileged container info from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY,
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY,
                     ContainerDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find container with id {}: {}", containerId, e.getMessage());
@@ -91,7 +96,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/database/" + id;
         log.debug("get privileged database info from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, PrivilegedDatabaseDto.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, PrivilegedDatabaseDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find database with id {}: {}", id, e.getMessage());
             throw new RemoteUnavailableException("Failed to find database: " + e.getMessage(), e);
@@ -130,7 +135,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/database/" + databaseId + "/table/" + id;
         log.debug("get privileged table info from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, TableDto.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, TableDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find table with id {}: {}", id, e.getMessage());
             throw new RemoteUnavailableException("Failed to find table: " + e.getMessage(), e);
@@ -172,7 +177,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/database/" + databaseId + "/view/" + id;
         log.debug("get privileged view info from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, ViewDto.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, ViewDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find view with id {}: {}", id, e.getMessage());
             throw new RemoteUnavailableException("Failed to find view: " + e.getMessage(), e);
@@ -196,12 +201,18 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             throw new MetadataServiceException("Failed to find view with id " + id + ": body is empty");
         }
         final PrivilegedViewDto view = metadataMapper.viewDtoToPrivilegedViewDto(response.getBody());
-        view.getDatabase().getContainer().getImage().setJdbcMethod(response.getHeaders().get("X-Type").get(0));
-        view.getDatabase().getContainer().setHost(response.getHeaders().get("X-Host").get(0));
-        view.getDatabase().getContainer().setPort(Integer.parseInt(response.getHeaders().get("X-Port").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.getDatabase().setInternalName(response.getHeaders().get("X-Database").get(0));
+        view.setDatabase(PrivilegedDatabaseDto.builder()
+                .internalName(response.getHeaders().get("X-Database").get(0))
+                .container(PrivilegedContainerDto.builder()
+                        .host(response.getHeaders().get("X-Host").get(0))
+                        .port(Integer.parseInt(response.getHeaders().get("X-Port").get(0)))
+                        .username(response.getHeaders().get("X-Username").get(0))
+                        .password(response.getHeaders().get("X-Password").get(0))
+                        .image(ImageDto.builder()
+                                .jdbcMethod(response.getHeaders().get("X-Type").get(0))
+                                .build())
+                        .build())
+                .build());
         view.setInternalName(response.getHeaders().get("X-View").get(0));
         view.setLastRetrieved(Instant.now());
         return view;
@@ -214,7 +225,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/user/" + userId;
         log.debug("get user info from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, UserDto.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, UserDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find user with id {}: {}", userId, e.getMessage());
             throw new RemoteUnavailableException("Failed to find user: " + e.getMessage(), e);
@@ -240,7 +251,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/user/" + userId;
         log.debug("get privileged user info from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, UserDto.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, UserDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find user with id {}: {}", userId, e.getMessage());
             throw new RemoteUnavailableException("Failed to find user: " + e.getMessage(), e);
@@ -277,7 +288,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/database/" + databaseId + "/access/" + userId;
         log.debug("get database access from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, DatabaseAccessDto.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, DatabaseAccessDto.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find database access for user with id {}: {}", userId, e.getMessage());
             throw new RemoteUnavailableException("Failed to find database access: " + e.getMessage(), e);
@@ -303,7 +314,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final String url = "/api/identifier?dbid=" + databaseId + (subsetId != null ? ("&qid=" + subsetId) : "");
         log.debug("get identifiers from metadata service: {}", url);
         try {
-            response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, IdentifierBriefDto[].class);
+            response = internalRestTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, IdentifierBriefDto[].class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to find identifiers for database with id {} and subset with id {}: {}", databaseId, subsetId, e.getMessage());
             throw new RemoteUnavailableException("Failed to find identifiers: " + e.getMessage(), e);
@@ -328,12 +339,11 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final ResponseEntity<Void> response;
         final String url = "/api/database/" + databaseId + "/table/" + tableId + "/statistic";
         log.debug("update table statistics in metadata service: {}", url);
-        final RestTemplate restTemplate = new RestTemplate();
-        restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayConfig.getMetadataEndpoint()));
+        internalRestTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayConfig.getMetadataEndpoint()));
         final HttpHeaders headers = new HttpHeaders();
         headers.set("Authorization", authorization);
         try {
-            response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(null, headers), Void.class);
+            response = internalRestTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(null, headers), Void.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
             log.error("Failed to update table statistic for table with id {}: {}", tableId, e.getMessage());
             throw new RemoteUnavailableException("Failed to update table statistic: " + e.getMessage(), e);
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
index b89e6b9c0feb3a282c38afbf39f07ef2d85fb546..5b96a5934b83e2c4636590f7515f70c04aef5826 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
@@ -33,7 +33,10 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.sql.*;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -87,14 +90,13 @@ public interface DataMapper {
      * @param database  The database.
      * @param resultSet The inspected schema.
      * @return The database containing the updated view/table.
-     * @throws SQLException
+     * @throws SQLException If the result set does not contain the requested parameter.
      */
     default ViewDto schemaResultSetToView(DatabaseDto database, ResultSet resultSet) throws SQLException {
         return ViewDto.builder()
                 .name(resultSet.getString(1))
                 .internalName(resultSet.getString(1))
                 .vdbid(database.getId())
-                .database(database)
                 .isInitialView(false)
                 .isPublic(database.getIsPublic())
                 .query(resultSet.getString(9))
@@ -124,7 +126,7 @@ public interface DataMapper {
         return statistic;
     }
 
-    default TableDto resultSetToTable(ResultSet resultSet, TableDto table, QueryConfig queryConfig) throws SQLException {
+    default TableDto resultSetToTable(ResultSet resultSet, TableDto table) throws SQLException {
         final ColumnDto column = ColumnDto.builder()
                 .ordinalPosition(resultSet.getInt(1) - 1) /* start at zero */
                 .isNullAllowed(resultSet.getString(3).equals("YES"))
@@ -132,7 +134,6 @@ public interface DataMapper {
                 .d(resultSet.getString(7) != null ? resultSet.getLong(7) : null)
                 .name(resultSet.getString(10))
                 .internalName(resultSet.getString(10))
-                .table(table)
                 .tableId(table.getId())
                 .databaseId(table.getTdbid())
                 .description(resultSet.getString(11))
@@ -181,7 +182,7 @@ public interface DataMapper {
                 .d(resultSet.getString(7) != null ? resultSet.getLong(7) : null)
                 .name(resultSet.getString(10))
                 .internalName(resultSet.getString(10))
-                .databaseId(view.getDatabase().getId())
+                .databaseId(view.getVdbid())
                 .build();
         /* fix boolean and set size for others */
         if (resultSet.getString(8).equalsIgnoreCase("tinyint(1)")) {
@@ -193,7 +194,7 @@ public interface DataMapper {
         }
         view.getColumns()
                 .add(column);
-        log.trace("parsed view {}.{} column: {}", view.getDatabase().getInternalName(), view.getInternalName(), column.getInternalName());
+        log.trace("parsed view column: {}.{}", view.getInternalName(), column.getInternalName());
         return view;
     }
 
@@ -320,7 +321,7 @@ public interface DataMapper {
         if (!resultSet.next()) {
             throw new TableNotFoundException("Failed to find table in the information schema");
         }
-        final TableDto table = TableDto.builder()
+        return TableDto.builder()
                 .name(resultSet.getString(1))
                 .internalName(resultSet.getString(1))
                 .isVersioned(resultSet.getString(2).equals("SYSTEM VERSIONED"))
@@ -343,7 +344,6 @@ public interface DataMapper {
                         .build())
                 .isPublic(database.getIsPublic())
                 .build();
-        return table;
     }
 
     default void prepareStatementWithColumnTypeObject(PreparedStatement ps, ColumnTypeDto columnType, int idx, Object value) throws SQLException {
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java
index dc073e855d7505d3bdf9d269040af58040d07174..e2b0c984e0f53c68bf9d384a301ab62ad67bbff7 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java
@@ -5,7 +5,6 @@ import at.tuwien.api.database.ViewDto;
 import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.database.table.constraints.unique.UniqueDto;
-import at.tuwien.config.QueryConfig;
 import at.tuwien.exception.TableNotFoundException;
 import at.tuwien.exception.ViewNotFoundException;
 import at.tuwien.mapper.DataMapper;
@@ -28,15 +27,12 @@ import java.util.LinkedList;
 public class SchemaServiceMariaDbImpl extends HibernateConnector implements SchemaService {
 
     private final DataMapper dataMapper;
-    private final QueryConfig queryConfig;
     private final MariaDbMapper mariaDbMapper;
     private final MetadataMapper metadataMapper;
 
     @Autowired
-    public SchemaServiceMariaDbImpl(DataMapper dataMapper, QueryConfig queryConfig, MariaDbMapper mariaDbMapper,
-                                    MetadataMapper metadataMapper) {
+    public SchemaServiceMariaDbImpl(DataMapper dataMapper, MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper) {
         this.dataMapper = dataMapper;
-        this.queryConfig = queryConfig;
         this.mariaDbMapper = mariaDbMapper;
         this.metadataMapper = metadataMapper;
     }
@@ -65,7 +61,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
             final ResultSet resultSet2 = statement2.executeQuery();
             log.trace("executed statement in {} ms", System.currentTimeMillis() - start);
             while (resultSet2.next()) {
-                table = dataMapper.resultSetToTable(resultSet2, table, queryConfig);
+                table = dataMapper.resultSetToTable(resultSet2, table);
             }
             /* obtain check constraints metadata */
             start = System.currentTimeMillis();
@@ -97,10 +93,8 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
                     final TableDto tmpTable = table;
                     uk.getColumns()
                             .forEach(column -> {
-                                column.setTable(tmpTable);
                                 column.setTableId(tmpTable.getId());
                                 column.setDatabaseId(database.getId());
-                                column.setIsPublic(database.getIsPublic());
                             });
                 }
             }
@@ -109,7 +103,6 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
             final TableDto tmpTable = table;
             tmpTable.getColumns()
                     .forEach(column -> {
-                        column.setTable(tmpTable);
                         column.setTableId(tmpTable.getId());
                         column.setDatabaseId(database.getId());
                     });
@@ -139,7 +132,6 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
                 throw new ViewNotFoundException("Failed to find view in the information schema");
             }
             ViewDto view = dataMapper.schemaResultSetToView(database, resultSet1);
-            view.setDatabase(database);
             view.setVdbid(database.getId());
             view.setOwner(database.getOwner());
             /* obtain view columns */
@@ -154,7 +146,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
                     .columns(new LinkedList<>())
                     .build();
             while (resultSet2.next()) {
-                tmp = dataMapper.resultSetToTable(resultSet2, tmp, queryConfig);
+                tmp = dataMapper.resultSetToTable(resultSet2, tmp);
             }
             view.setColumns(tmp.getColumns()
                     .stream()
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 989fe4e1a1de03502616d02e74e5aba99e6544af..d85bdc53ac235a3a95bb8b3543bddcfdd143dc6d 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
@@ -141,7 +141,6 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe
                 .identifiers(new LinkedList<>())
                 .isInitialView(false)
                 .vdbid(database.getId())
-                .database(metadataMapper.privilegedDatabaseDtoToDatabaseDto(database))
                 .columns(new LinkedList<>())
                 .build();
         try {
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 61121a4b04791955834744ecb05204841551fa12..91936adaf8f27c87dbd4019b4ee6ce8a67e118a5 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
@@ -32,7 +32,8 @@ public abstract class AbstractUnitTest extends BaseTest {
         TABLE_1_COLUMNS.get(0).setConcept(null);
         DATABASE_1.setOwner(USER_1);
         DATABASE_1.setSubsets(new LinkedList<>());
-        DATABASE_1.setIsPublic(false);
+        DATABASE_1.setIsPublic(DATABASE_1_PUBLIC);
+        DATABASE_1.setIsSchemaPublic(DATABASE_1_SCHEMA_PUBLIC);
         DATABASE_1_USER_1_READ_ACCESS.setType(AccessType.READ);
         DATABASE_1.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS, DATABASE_1_USER_2_WRITE_OWN_ACCESS, DATABASE_1_USER_3_WRITE_ALL_ACCESS)));
         DATABASE_1_PRIVILEGED_DTO.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS_DTO, DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO, DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO)));
@@ -50,6 +51,7 @@ public abstract class AbstractUnitTest extends BaseTest {
         IDENTIFIER_4.setDatabase(DATABASE_1);
         DATABASE_1.setTables(new LinkedList<>(List.of(TABLE_1, TABLE_2, TABLE_3, TABLE_4)));
         DATABASE_1.setViews(new LinkedList<>(List.of(VIEW_1, VIEW_2, VIEW_3)));
+        DATABASE_1_PRIVILEGED_DTO.setContainer(CONTAINER_1_PRIVILEGED_DTO);
         DATABASE_1_PRIVILEGED_DTO.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO)));
         DATABASE_1_PRIVILEGED_DTO.setTables(new LinkedList<>(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO)));
         DATABASE_1_PRIVILEGED_DTO.setViews(new LinkedList<>(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)));
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 9980b6dd2ba49cc0149d1acc2f6e26e1c25a5e31..765bde6242175c05d9e6cb68d5cc544dd7a34236 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
@@ -140,7 +140,8 @@ import static java.time.temporal.ChronoUnit.MINUTES;
  * <p>
  * Database 4 (Public Data, Public Schema, User 4) -> Container 4
  * <li>Table 9</li>
- * <li>Identifier 7 (Database=4)</li>
+ * <li>Identifier 7</li>
+ * <li>Query 7</li>
  * <ul>
  * </ul>
  * <br />
@@ -2978,8 +2979,31 @@ public abstract class BaseTest {
             .isPersisted(QUERY_3_PERSISTED)
             .resultNumber(2L)
             .build();
-
+    
+    public final static Long QUERY_7_ID = 7L;
     public final static String QUERY_7_STATEMENT = "SELECT id, date, a.location, lat, lng FROM weather_aus a JOIN weather_location l on a.location = l.location WHERE date = '2008-12-01'";
+    public final static String QUERY_7_QUERY_HASH = "df7da3801dfb5c191ff6711d79ce6455f3c09ec8323ce1ff7208ab85387263f5";
+    public final static String QUERY_7_RESULT_HASH = "ff4f7cbe1b96d496957f6e49e55b8b1b577fa4d405d4795af99594cfd40cb80d";
+    public final static Instant QUERY_7_CREATED = Instant.now().minus(4, MINUTES);
+    public final static Instant QUERY_7_EXECUTION = Instant.now().minus(1, MINUTES);
+    public final static Instant QUERY_7_LAST_MODIFIED = Instant.ofEpochSecond(1541588454L);
+    public final static Long QUERY_7_RESULT_NUMBER = 6L;
+    public final static Long QUERY_7_RESULT_ID = 4L;
+    public final static Boolean QUERY_7_PERSISTED = false;
+
+    public final static QueryDto QUERY_7_DTO = QueryDto.builder()
+            .id(QUERY_7_ID)
+            .databaseId(DATABASE_4_ID)
+            .query(QUERY_7_STATEMENT)
+            .queryNormalized(QUERY_7_STATEMENT)
+            .resultNumber(QUERY_7_RESULT_NUMBER)
+            .resultHash(QUERY_7_RESULT_HASH)
+            .owner(USER_1_BRIEF_DTO)
+            .queryHash(QUERY_7_QUERY_HASH)
+            .execution(QUERY_7_EXECUTION)
+            .isPersisted(QUERY_7_PERSISTED)
+            .resultNumber(2L)
+            .build();
 
     public final static Long QUERY_4_ID = 4L;
     public final static String QUERY_4_STATEMENT = "SELECT `id`, `value` FROM `mfcc`";
@@ -7505,6 +7529,7 @@ public abstract class BaseTest {
     public final static PrivilegedDatabaseDto DATABASE_1_PRIVILEGED_DTO = PrivilegedDatabaseDto.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)
@@ -7650,6 +7675,7 @@ public abstract class BaseTest {
     public final static PrivilegedDatabaseDto DATABASE_2_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
             .id(DATABASE_2_ID)
             .isPublic(DATABASE_2_PUBLIC)
+            .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC)
             .name(DATABASE_2_NAME)
             .container(CONTAINER_1_PRIVILEGED_DTO)
             .internalName(DATABASE_2_INTERNALNAME)
@@ -7901,6 +7927,7 @@ public abstract class BaseTest {
     public final static PrivilegedDatabaseDto DATABASE_3_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
             .id(DATABASE_3_ID)
             .isPublic(DATABASE_3_PUBLIC)
+            .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC)
             .name(DATABASE_3_NAME)
             .container(CONTAINER_1_PRIVILEGED_DTO)
             .internalName(DATABASE_3_INTERNALNAME)
@@ -7958,6 +7985,21 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>())
             .build();
 
+    public final static PrivilegedDatabaseDto DATABASE_4_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
+            .id(DATABASE_4_ID)
+            .isPublic(DATABASE_4_PUBLIC)
+            .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC)
+            .name(DATABASE_4_NAME)
+            .container(CONTAINER_1_PRIVILEGED_DTO)
+            .internalName(DATABASE_4_INTERNALNAME)
+            .exchangeName(DATABASE_4_EXCHANGE)
+            .identifiers(new LinkedList<>(List.of(IDENTIFIER_7_DTO)))
+            .tables(new LinkedList<>(List.of(TABLE_9_DTO)))
+            .views(new LinkedList<>(List.of()))
+            .owner(USER_3_BRIEF_DTO)
+            .lastRetrieved(Instant.now())
+            .build();
+
     public final static DatabaseAccess DATABASE_4_USER_1_READ_ACCESS = DatabaseAccess.builder()
             .type(AccessType.READ)
             .hdbid(DATABASE_4_ID)