diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java
index 355e1d1487d31a000033a415bef15acbbdb6cda3..6772eee5b7087573b1eeda511f707bc32ecf42ef 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java
@@ -16,6 +16,7 @@ import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.entities.database.table.columns.TableColumnType;
 import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey;
 import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference;
+import at.tuwien.entities.identifier.Identifier;
 import at.tuwien.exception.ImageNotSupportedException;
 import at.tuwien.exception.QueryMalformedException;
 import at.tuwien.exception.QueryStoreException;
@@ -70,6 +71,12 @@ public interface QueryMapper {
     })
     QueryBriefDto queryToQueryBriefDto(Query data);
 
+    @Mappings({
+            @Mapping(target = "id", source = "queryId"),
+            @Mapping(target = "isPersisted", expression = "java(true)"),
+    })
+    Query identifierToQuery(Identifier data);
+
     @Named("internalMapping")
     default String nameToInternalName(String data) {
         if (data == null || data.length() == 0) {
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java
index 7142dbc27ac1a81ce326f1af83af1a9440e12442..7206a5cd9d434cb5b17a0ca7c565e1b1b9d41785 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java
@@ -6,9 +6,11 @@ import at.tuwien.api.database.query.ExecuteStatementDto;
 import at.tuwien.api.database.query.QueryResultDto;
 import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.entities.database.Database;
+import at.tuwien.entities.identifier.Identifier;
 import at.tuwien.exception.*;
 import at.tuwien.querystore.Query;
 import at.tuwien.service.DatabaseService;
+import at.tuwien.service.IdentifierService;
 import at.tuwien.service.QueryService;
 import at.tuwien.service.StoreService;
 import at.tuwien.utils.PrincipalUtil;
@@ -35,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.security.Principal;
+import java.util.List;
 
 @Log4j2
 @RestController
@@ -171,8 +174,8 @@ public class QueryEndpoint {
             AccessDeniedException, QueryNotFoundException {
         log.debug("endpoint re-execute query, databaseId={}, queryId={}, page={}, size={}, sortDirection={}, sortColumn={}, {}",
                 databaseId, queryId, page, size, sortDirection, sortColumn, PrincipalUtil.formatForDebug(principal));
+        final Database database = databaseService.findById(databaseId);
         endpointValidator.validateDataParams(page, size, sortDirection, sortColumn);
-        endpointValidator.validateOnlyAccessOrPublic(databaseId, principal);
         /* execute */
         final Query query = storeService.findOne(databaseId, queryId, principal);
         final Long count = queryService.reExecuteCount(databaseId, query, principal);
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java
index c5751ed5888c849724b18ceab759a21714c6cbb9..408d9a86086ec03deee5c52404f3c712963fed33 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/StoreEndpoint.java
@@ -6,16 +6,15 @@ import at.tuwien.api.database.query.QueryPersistDto;
 import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.user.UserDto;
+import at.tuwien.entities.database.Database;
 import at.tuwien.entities.identifier.Identifier;
+import at.tuwien.entities.identifier.IdentifierType;
 import at.tuwien.exception.*;
 import at.tuwien.mapper.IdentifierMapper;
 import at.tuwien.mapper.QueryMapper;
 import at.tuwien.mapper.UserMapper;
 import at.tuwien.querystore.Query;
-import at.tuwien.service.AccessService;
-import at.tuwien.service.IdentifierService;
-import at.tuwien.service.StoreService;
-import at.tuwien.service.UserService;
+import at.tuwien.service.*;
 import at.tuwien.utils.PrincipalUtil;
 import at.tuwien.utils.UserUtil;
 import at.tuwien.validation.EndpointValidator;
@@ -54,19 +53,21 @@ public class StoreEndpoint {
     private final UserService userService;
     private final StoreService storeService;
     private final AccessService accessService;
+    private final DatabaseService databaseService;
     private final IdentifierMapper identifierMapper;
     private final EndpointValidator endpointValidator;
     private final IdentifierService identifierService;
 
     @Autowired
     public StoreEndpoint(UserMapper userMapper, QueryMapper queryMapper, UserService userService, StoreService storeService,
-                         AccessService accessService, IdentifierMapper identifierMapper,
+                         AccessService accessService, DatabaseService databaseService, IdentifierMapper identifierMapper,
                          EndpointValidator endpointValidator, IdentifierService identifierService) {
         this.userMapper = userMapper;
         this.queryMapper = queryMapper;
         this.userService = userService;
         this.storeService = storeService;
         this.accessService = accessService;
+        this.databaseService = databaseService;
         this.identifierMapper = identifierMapper;
         this.endpointValidator = endpointValidator;
         this.identifierService = identifierService;
@@ -125,14 +126,23 @@ public class StoreEndpoint {
             DatabaseConnectionException, TableMalformedException, UserNotFoundException, NotAllowedException,
             AccessDeniedException {
         log.debug("endpoint list queries, databaseId={}, persisted={}, {}", databaseId, persisted, PrincipalUtil.formatForDebug(principal));
-        endpointValidator.validateOnlyAccessOrPublic(databaseId, principal);
+        final Database database = databaseService.findById(databaseId);
         /* find all from data database */
-        final List<Query> queries = storeService.findAll(databaseId, persisted, principal);
-        /* add identifiers and creator from metadata database */
         final List<IdentifierDto> identifiers = identifierService.findAllSubsetIdentifiers()
                 .stream()
                 .map(identifierMapper::identifierToIdentifierDto)
                 .toList();
+        final List<Query> queries;
+        if (!database.getIsPublic() && principal == null) {
+            queries = identifierService.findAllSubsetIdentifiers()
+                    .stream()
+                    .filter(i -> i.getType().equals(IdentifierType.SUBSET))
+                    .map(queryMapper::identifierToQuery)
+                    .toList();
+        } else {
+            queries = storeService.findAll(databaseId, persisted, principal);
+        }
+        /* add identifiers and creator from metadata database */
         final List<UserDto> users = userService.findAll()
                 .stream()
                 .map(userMapper::userToUserDto)
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 9f9c8f85e357a5d96ef887749ac66340fcdc2ee6..e33b9cb5c8458574584e7c0ebe8425d6fc6f7f2c 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
@@ -291,7 +291,8 @@ public class ViewEndpoint {
         /* check */
         endpointValidator.validateDataParams(page, size);
         final Database database = databaseService.find(databaseId);
-        if (!database.getIsPublic()) {
+        final View view = viewService.findById(databaseId, viewId, principal);
+        if (!database.getIsPublic() && !view.getIsPublic()) {
             if (principal == null) {
                 log.error("Failed to view data of private view: principal is null");
                 throw new NotAllowedException("Failed to view data of private view: principal is null");
@@ -312,7 +313,6 @@ public class ViewEndpoint {
         }
         /* find */
         log.debug("find view data for database with id {}", databaseId);
-        final View view = viewService.findById(databaseId, viewId, principal);
         final Long count = queryService.viewCount(databaseId, view, principal);
         final HttpHeaders headers = new HttpHeaders();
         headers.set("X-Count", "" + count);
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java
index df8df65792718d259b73b91ca75901ff2f20502d..59d69125c3e56c894fb00dba5a2a899e610a63e0 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/StoreServiceImpl.java
@@ -3,6 +3,7 @@ package at.tuwien.service.impl;
 import at.tuwien.api.database.query.ExecuteStatementDto;
 import at.tuwien.api.database.query.QueryPersistDto;
 import at.tuwien.entities.database.Database;
+import at.tuwien.entities.identifier.Identifier;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.mapper.StoreMapper;
diff --git a/dbrepo-ui/components/subset/SubsetToolbar.vue b/dbrepo-ui/components/subset/SubsetToolbar.vue
index aa481ac4921c51ff4396ae5c6f3cf1fca8e2109b..63d325d263c97993ceee56489f9e41889d29eb64 100644
--- a/dbrepo-ui/components/subset/SubsetToolbar.vue
+++ b/dbrepo-ui/components/subset/SubsetToolbar.vue
@@ -66,6 +66,7 @@
             :text="$t('navigation.info')"
             :to="`/database/${$route.params.database_id}/subset/${$route.params.subset_id}/info`" />
           <v-tab
+            v-if="canViewData"
             :text="$t('navigation.data')"
             :to="`/database/${$route.params.database_id}/subset/${$route.params.subset_id}/data`" />
         </v-tabs>
@@ -120,6 +121,12 @@ export default {
       }
       return this.database.subsets.filter(s => s.query_id === Number(this.$route.params.subset_id))
     },
+    canViewData () {
+      if (!this.database) {
+        return false
+      }
+      return this.database.is_public
+    },
     identifier () {
       /* mount pid */
       if (this.pid) {
diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue
index 83850ebf93c12fc6c5c14e260269b8dc16129241..6dc9804315eb3f2354387f9725582b984fa2e782 100644
--- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue
+++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue
@@ -17,6 +17,7 @@
     <v-divider
       v-if="subset && identifier" />
     <v-card
+      v-if="subset"
       variant="flat"
       rounded="0"
       :title="$t('pages.subset.title')">