diff --git a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java b/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java
deleted file mode 100644
index 370972f192629619377fc89faea976524a9bbccf..0000000000000000000000000000000000000000
--- a/dbrepo-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationElasticTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package at.tuwien.service;
-
-import at.tuwien.BaseUnitTest;
-import at.tuwien.api.database.DatabaseCreateDto;
-import at.tuwien.api.database.DatabaseDto;
-import at.tuwien.config.*;
-import at.tuwien.entities.database.Database;
-import at.tuwien.repository.elastic.DatabaseIdxRepository;
-import at.tuwien.repository.jpa.ContainerRepository;
-import at.tuwien.repository.jpa.DatabaseRepository;
-import at.tuwien.repository.jpa.ImageRepository;
-import at.tuwien.repository.jpa.UserRepository;
-import at.tuwien.service.impl.MariaDbServiceImpl;
-import at.tuwien.test.BaseTest;
-import com.rabbitmq.client.Channel;
-import lombok.extern.log4j.Log4j2;
-import org.apache.http.auth.BasicUserPrincipal;
-import org.junit.jupiter.api.*;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-import java.io.File;
-import java.security.Principal;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
-@Log4j2
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-@ExtendWith(SpringExtension.class)
-@SpringBootTest
-public class DatabaseServiceIntegrationElasticTest extends BaseUnitTest {
-
-    @MockBean
-    private ReadyConfig readyConfig;
-
-    @MockBean
-    private Channel channel;
-
-    @MockBean
-    private IndexConfig indexConfig;
-
-    @MockBean
-    private DatabaseIdxRepository databaseIdxRepository;
-
-    @Autowired
-    private ContainerRepository containerRepository;
-
-    @Autowired
-    private UserRepository userRepository;
-
-    @Autowired
-    private ImageRepository imageRepository;
-
-    @Autowired
-    private MariaDbServiceImpl databaseService;
-
-    @Autowired
-    private H2Utils h2Utils;
-
-    private final static String BIND = new File("../../dbrepo-metadata-db/test/src/test/resources/weather").toPath().toAbsolutePath() + ":/docker-entrypoint-initdb.d";
-
-    @BeforeAll
-    public static void beforeAll() {
-        afterAll();
-        DockerConfig.createAllNetworks();
-    }
-
-    @AfterAll
-    public static void afterAll() {
-        DockerConfig.removeAllContainers();
-        DockerConfig.removeAllNetworks();
-    }
-
-    @BeforeEach
-    public void beforeEach() {
-        afterEach();
-        /* metadata database */
-        h2Utils.runScript("schema.sql");
-        imageRepository.save(IMAGE_1);
-        userRepository.save(USER_1_SIMPLE);
-    }
-
-    @AfterEach
-    public void afterEach() {
-        DockerConfig.removeAllContainers();
-    }
-
-    @Test
-    public void create_elasticSearch_succeeds() throws Exception {
-
-        /* mock */
-        DockerConfig.createContainer(null, CONTAINER_ELASTIC, CONTAINER_ELASTIC_ENV);
-        DockerConfig.startContainer(CONTAINER_ELASTIC);
-        DockerConfig.createContainer(BIND, CONTAINER_1_SIMPLE, CONTAINER_1_ENV);
-        DockerConfig.startContainer(CONTAINER_1_SIMPLE);
-        when(databaseIdxRepository.save(any(DatabaseDto.class)))
-                .thenReturn(DATABASE_1_DTO);
-
-        /* test */
-        generic_create(CONTAINER_1_ID, DATABASE_1_CREATE, DATABASE_1);
-    }
-
-    /* ################################################################################################### */
-    /* ## GENERIC TEST CASES                                                                            ## */
-    /* ################################################################################################### */
-
-    protected void generic_create(Long containerId, DatabaseCreateDto createDto, Database database)
-            throws Exception {
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        containerRepository.save(CONTAINER_1_SIMPLE);
-        containerRepository.save(CONTAINER_2_SIMPLE);
-        containerRepository.save(CONTAINER_3_SIMPLE);
-
-        /* test */
-        final Database response = databaseService.create(containerId, createDto, principal);
-        assertEquals(database.getName(), response.getName());
-        assertEquals(containerId, database.getId());
-    }
-
-}
diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
index 609b2bb0c0d76334ba3a99b43f23048c8643e031..fab253577ab409fb0eef7e81140ca2517be45721 100644
--- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
+++ b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
@@ -4,10 +4,14 @@ import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.api.identifier.IdentifierCreateDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.identifier.IdentifierTypeDto;
+import at.tuwien.entities.database.DatabaseAccess;
 import at.tuwien.entities.identifier.Identifier;
+import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.mapper.IdentifierMapper;
+import at.tuwien.service.AccessService;
 import at.tuwien.service.IdentifierService;
+import at.tuwien.service.UserService;
 import io.micrometer.core.annotation.Timed;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Content;
@@ -36,11 +40,16 @@ import java.util.stream.Collectors;
 @RequestMapping("/api/identifier")
 public class IdentifierEndpoint {
 
+    private final UserService userService;
+    private final AccessService accessService;
     private final IdentifierMapper identifierMapper;
     private final IdentifierService identifierService;
 
     @Autowired
-    public IdentifierEndpoint(IdentifierMapper identifierMapper, IdentifierService identifierService) {
+    public IdentifierEndpoint(UserService userService, AccessService accessService, IdentifierMapper identifierMapper,
+                              IdentifierService identifierService) {
+        this.userService = userService;
+        this.accessService = accessService;
         this.identifierMapper = identifierMapper;
         this.identifierService = identifierService;
     }
@@ -125,7 +134,7 @@ public class IdentifierEndpoint {
                                                 @NotNull @RequestHeader(name = "Authorization") String authorization,
                                                 @NotNull Principal principal)
             throws IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException,
-            RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, IdentifierRequestException {
+            RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, IdentifierRequestException, AccessDeniedException {
         log.debug("endpoint create identifier, data={}, authorization={}, principal={}", data, authorization, principal);
         if (data.getType().equals(IdentifierTypeDto.SUBSET) && data.getQid() == null) {
             log.error("Identifier of type subset need to have a qid present");
@@ -134,6 +143,8 @@ public class IdentifierEndpoint {
             log.error("Identifier of type database must not have a qid present");
             throw new IdentifierRequestException("Identifier of type database must not have a qid present");
         }
+        final User user = userService.findByUsername(principal.getName());
+        final DatabaseAccess access = accessService.find(data.getDbid(), user.getId());
         final Identifier identifier = identifierService.create(data, principal, authorization);
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(identifierMapper.identifierToIdentifierDto(identifier));
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/auth/AuthTokenFilterTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/auth/AuthTokenFilterTest.java
deleted file mode 100644
index c15afaef64ba04f31deb103d954e5ac5df5d1a20..0000000000000000000000000000000000000000
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/auth/AuthTokenFilterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package at.tuwien.auth;
-
-import at.tuwien.BaseUnitTest;
-import at.tuwien.config.H2Utils;
-import at.tuwien.config.IndexInitializer;
-import at.tuwien.config.ReadyConfig;
-import at.tuwien.repository.jpa.UserRepository;
-import lombok.extern.log4j.Log4j2;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.mock.web.MockHttpServletRequest;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-@Log4j2
-@SpringBootTest
-@ExtendWith(SpringExtension.class)
-public class AuthTokenFilterTest extends BaseUnitTest {
-
-    @MockBean
-    private IndexInitializer indexInitializer;
-
-    @MockBean
-    private ReadyConfig readyConfig;
-
-    @MockBean
-    private UserRepository userRepository;
-
-    @Autowired
-    private AuthTokenFilter authTokenFilter;
-
-    @Autowired
-    private H2Utils h2Utils;
-
-    @BeforeEach
-    public void beforeEach() {
-        h2Utils.runScript("view.sql");
-    }
-
-    @Test
-    public void parseJwt_fails() {
-        final MockHttpServletRequest request = new MockHttpServletRequest();
-        request.addHeader("Authorization", "Basic dXNlcjpwYXNz");
-
-        /* test */
-        final String response = authTokenFilter.parseJwt(request);
-        assertNull(response);
-    }
-
-    @Test
-    public void parseJwt_noAuthenticationHeader_fails() {
-        final MockHttpServletRequest request = new MockHttpServletRequest();
-
-        /* test */
-        final String response = authTokenFilter.parseJwt(request);
-        assertNull(response);
-    }
-
-}
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java
index e513e30cda5fa34d34fb8c3179473c6ce2cc4f27..138ce5ce9ca56df82d2245160a8dbf26f951be8d 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java
@@ -18,6 +18,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.test.context.support.WithAnonymousUser;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.annotation.DirtiesContext;
@@ -54,38 +55,30 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     @Autowired
     private ContainerRepository containerRepository;
 
+    @Autowired
+    private RealmRepository realmRepository;
+
+    @Autowired
+    private AccessRepository accessRepository;
+
     @Autowired
     private IdentifierEndpoint identifierEndpoint;
 
     @BeforeEach
     public void beforeEach() {
         imageRepository.save(IMAGE_1);
+        realmRepository.save(REALM_DBREPO);
         userRepository.save(USER_1);
         userRepository.save(USER_2);
-        containerRepository.save(CONTAINER_1);
-        containerRepository.save(CONTAINER_2);
-        databaseRepository.save(DATABASE_1);
-        databaseRepository.save(DATABASE_2);
-    }
-
-    @Test
-    public void list_anonymous_succeeds() throws IdentifierNotFoundException {
-
-        /* mock */
-        identifierRepository.save(IDENTIFIER_1);
-
-        /* test */
-        final List<IdentifierDto> response = this.generic_list(null, null, null);
-        assertEquals(1, response.size());
-        final IdentifierDto identifier = response.get(0);
-        assertEquals(IDENTIFIER_1_ID, identifier.getId());
-        assertEquals(IDENTIFIER_1_TITLE, identifier.getTitle());
-        assertEquals(IDENTIFIER_1_DESCRIPTION, identifier.getDescription());
+        containerRepository.save(CONTAINER_1_SIMPLE);
+        containerRepository.save(CONTAINER_2_SIMPLE);
+        databaseRepository.save(DATABASE_1_SIMPLE);
+        databaseRepository.save(DATABASE_2_SIMPLE);
     }
 
     @Test
     @WithAnonymousUser
-    public void list_anonymous2_succeeds() throws IdentifierNotFoundException {
+    public void list_anonymous_succeeds() {
 
         /* test */
         final List<IdentifierDto> response = this.generic_list(null, null, null);
@@ -93,11 +86,11 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void list_researcher_succeeds() throws IdentifierNotFoundException {
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"list-identifiers"})
+    public void list_hasRole_succeeds() {
 
         /* mock */
-        identifierRepository.save(IDENTIFIER_1);
+        identifierRepository.save(IDENTIFIER_1_SIMPLE);
 
         /* test */
         final List<IdentifierDto> response = this.generic_list(null, null, null);
@@ -109,27 +102,11 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void list_researcherDatabaseId_succeeds() throws IdentifierNotFoundException {
-
-        /* mock */
-        identifierRepository.save(IDENTIFIER_1);
-
-        /* test */
-        final List<IdentifierDto> response = this.generic_list(DATABASE_1_ID, null, null);
-        assertEquals(1, response.size());
-        final IdentifierDto identifier = response.get(0);
-        assertEquals(IDENTIFIER_1_ID, identifier.getId());
-        assertEquals(IDENTIFIER_1_TITLE, identifier.getTitle());
-        assertEquals(IDENTIFIER_1_DESCRIPTION, identifier.getDescription());
-    }
-
-    @Test
-    @WithMockUser(username = USER_2_USERNAME, roles = {"DEVELOPER"})
-    public void list_developer_succeeds() throws IdentifierNotFoundException {
+    @WithMockUser(username = USER_1_USERNAME)
+    public void list_noRole_succeeds() {
 
         /* mock */
-        identifierRepository.save(IDENTIFIER_1);
+        identifierRepository.save(IDENTIFIER_1_SIMPLE);
 
         /* test */
         final List<IdentifierDto> response = this.generic_list(null, null, null);
@@ -141,14 +118,14 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"})
-    public void list_dataSteward_succeeds() throws IdentifierNotFoundException {
+    @WithMockUser(username = USER_1_USERNAME)
+    public void list_databaseId_succeeds() {
 
         /* mock */
-        identifierRepository.save(IDENTIFIER_1);
+        identifierRepository.save(IDENTIFIER_1_SIMPLE);
 
         /* test */
-        final List<IdentifierDto> response = this.generic_list(null, null, null);
+        final List<IdentifierDto> response = this.generic_list(DATABASE_1_ID, null, null);
         assertEquals(1, response.size());
         final IdentifierDto identifier = response.get(0);
         assertEquals(IDENTIFIER_1_ID, identifier.getId());
@@ -157,28 +134,34 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    @Disabled("Creator constraint")
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void list_researcherDatabaseIdAndType_succeeds() throws IdentifierNotFoundException {
+    @WithMockUser(username = USER_1_USERNAME)
+    public void list_databaseIdAndType_succeeds() {
 
         /* mock */
-        identifierRepository.save(IDENTIFIER_2);
+        containerRepository.save(CONTAINER_3_SIMPLE);
+        containerRepository.save(CONTAINER_4_SIMPLE);
+        databaseRepository.save(DATABASE_3_SIMPLE);
+        databaseRepository.save(DATABASE_4_SIMPLE);
+        identifierRepository.save(IDENTIFIER_1_SIMPLE);
+        identifierRepository.save(IDENTIFIER_2_SIMPLE);
+        identifierRepository.save(IDENTIFIER_3_SIMPLE);
+        identifierRepository.save(IDENTIFIER_4_SIMPLE);
 
         /* test */
-        final List<IdentifierDto> response = this.generic_list(DATABASE_2_ID, null, IdentifierTypeDto.DATABASE);
+        final List<IdentifierDto> response = this.generic_list(DATABASE_4_ID, null, IdentifierTypeDto.DATABASE);
         assertEquals(1, response.size());
         final IdentifierDto identifier = response.get(0);
-        assertEquals(IDENTIFIER_2_ID, identifier.getId());
-        assertEquals(IDENTIFIER_2_TITLE, identifier.getTitle());
-        assertEquals(IDENTIFIER_2_DESCRIPTION, identifier.getDescription());
+        assertEquals(IDENTIFIER_4_ID, identifier.getId());
+        assertEquals(IDENTIFIER_4_TITLE, identifier.getTitle());
+        assertEquals(IDENTIFIER_4_DESCRIPTION, identifier.getDescription());
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void list_researcherSubsetIdAndType_succeeds() throws IdentifierNotFoundException {
+    @WithMockUser(username = USER_1_USERNAME)
+    public void list_subsetIdAndType_succeeds() {
 
         /* mock */
-        identifierRepository.save(IDENTIFIER_1);
+        identifierRepository.save(IDENTIFIER_1_SIMPLE);
 
         /* test */
         final List<IdentifierDto> response = this.generic_list(DATABASE_1_ID, QUERY_1_ID, IdentifierTypeDto.SUBSET);
@@ -190,15 +173,26 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void create_researcherDatabaseNotExists_fails() {
+    @WithMockUser(username = USER_1_USERNAME)
+    public void create_noRole_fails() {
+
+        /* test */
+        assertThrows(AccessDeniedException.class, () -> {
+            identifierEndpoint.create(IDENTIFIER_2_DTO_REQUEST, "ABC", USER_1_PRINCIPAL);
+        });
+    }
+
+    @Test
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"})
+    public void create_accessNotExists_fails() {
 
         /* mock */
-        containerRepository.save(CONTAINER_2);
+        containerRepository.save(CONTAINER_3_SIMPLE);
+        databaseRepository.save(DATABASE_3_SIMPLE);
 
         /* test */
-        assertThrows(NotAllowedException.class, () -> {
-            identifierEndpoint.create(IDENTIFIER_2_DTO_REQUEST, "ABC", USER_1_PRINCIPAL);
+        assertThrows(at.tuwien.exception.AccessDeniedException.class, () -> {
+            identifierEndpoint.create(IDENTIFIER_3_DTO_REQUEST, "ABC", USER_1_PRINCIPAL);
         });
     }
 
@@ -206,7 +200,7 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
     /* ## GENERIC TEST CASES                                                                            ## */
     /* ################################################################################################### */
 
-    protected List<IdentifierDto> generic_list(Long databaseId, Long queryId, IdentifierTypeDto type) throws IdentifierNotFoundException {
+    protected List<IdentifierDto> generic_list(Long databaseId, Long queryId, IdentifierTypeDto type) {
 
         /* test */
         final ResponseEntity<List<IdentifierDto>> response = identifierEndpoint.list(databaseId, queryId, type);
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java
index 8ad52e70ba3bd5fe30900d7a635e4fd0ee0f7c09..0d1f7ce1cc92381d4f3de24101a43c44f851fd51 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java
@@ -15,10 +15,7 @@ import at.tuwien.entities.identifier.RelatedIdentifier;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.QueryServiceGateway;
-import at.tuwien.repository.jpa.DatabaseRepository;
-import at.tuwien.repository.jpa.IdentifierRepository;
-import at.tuwien.repository.jpa.RelatedIdentifierRepository;
-import at.tuwien.repository.jpa.UserRepository;
+import at.tuwien.repository.jpa.*;
 import at.tuwien.service.IdentifierService;
 import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.api.Test;
@@ -31,6 +28,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
+import org.springframework.security.test.context.support.WithAnonymousUser;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
@@ -70,6 +68,9 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
     @MockBean
     private RelatedIdentifierRepository relatedIdentifierRepository;
 
+    @MockBean
+    private AccessRepository accessRepository;
+
     @MockBean
     private QueryServiceGateway queryServiceGateway;
 
@@ -152,57 +153,56 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void create_creatorResearcherDatabase_succeeds() throws IdentifierAlreadyExistsException,
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"})
+    public void create_hasRoleDatabase_succeeds() throws IdentifierAlreadyExistsException,
             UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException,
-            IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException {
+            IdentifierPublishingNotAllowedException, IdentifierRequestException, at.tuwien.exception.AccessDeniedException {
+
+        /* mock */
+        when(accessRepository.findByHdbidAndHuserid(DATABASE_1_ID, USER_1_ID))
+                .thenReturn(Optional.of(DATABASE_1_RESEARCHER_READ_ACCESS));
 
         /* test */
         generic_create(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_1_PRINCIPAL, USER_1_USERNAME, USER_1);
     }
 
     @Test
-    @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"})
-    public void create_nonCreatorResearcherDatabase_fails() {
+    @WithMockUser(username = USER_2_USERNAME, authorities = {"create-identifier"})
+    public void create_hasRoleDatabaseNoAccess_fails() {
 
         /* test */
-        assertThrows(NotAllowedException.class, () -> {
+        assertThrows(at.tuwien.exception.AccessDeniedException.class, () -> {
             generic_create(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_2_PRINCIPAL, USER_2_USERNAME, USER_2);
         });
     }
 
     @Test
-    @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"})
-    public void create_nonCreatorDataStewardDatabase_succeeds() throws IdentifierAlreadyExistsException,
-            UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException,
-            IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException {
-
-        /* test */
-        generic_create(CONTAINER_1_ID, DATABASE_1_ID, DATABASE_1, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_3_PRINCIPAL, USER_3_USERNAME, USER_3);
-    }
-
-    @Test
+    @WithAnonymousUser
     public void create_anonymousQuery_fails() {
 
         /* test */
-        assertThrows(AuthenticationCredentialsNotFoundException.class, () -> {
+        assertThrows(AccessDeniedException.class, () -> {
             generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, null, null, null);
         });
     }
 
     @Test
-    @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"})
-    public void create_creatorResearcherQuery_succeeds() throws IdentifierAlreadyExistsException,
+    @WithMockUser(username = USER_2_USERNAME, authorities = {"create-identifier"})
+    public void create_hasRoleReadAccessQuery_succeeds() throws IdentifierAlreadyExistsException,
             UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException,
-            IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException {
+            IdentifierPublishingNotAllowedException, IdentifierRequestException, at.tuwien.exception.AccessDeniedException {
+
+        /* mock */
+        when(accessRepository.findByHdbidAndHuserid(DATABASE_2_ID, USER_2_ID))
+                .thenReturn(Optional.of(DATABASE_2_RESEARCHER_READ_ACCESS));
 
         /* test */
         generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_2_PRINCIPAL, USER_2_USERNAME, USER_2);
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void create_creatorResearcherInvalidSubset_fails() {
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"})
+    public void create_invalidSubset_fails() {
         final IdentifierCreateDto request = IdentifierCreateDto.builder()
                 .qid(null)  // <--
                 .cid(IDENTIFIER_1_CONTAINER_ID)
@@ -224,8 +224,8 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void create_creatorResearcherInvalidDatabase_fails() {
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"})
+    public void create_invalidDatabase_fails() {
         final IdentifierCreateDto request = IdentifierCreateDto.builder()
                 .qid(IDENTIFIER_1_QUERY_ID) // <--
                 .cid(IDENTIFIER_1_CONTAINER_ID)
@@ -248,25 +248,15 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void create_nonCreatorResearcherQuery_fails() {
+    @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"})
+    public void create_query_fails() {
 
         /* test */
-        assertThrows(NotAllowedException.class, () -> {
+        assertThrows(at.tuwien.exception.AccessDeniedException.class, () -> {
             generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_1_PRINCIPAL, USER_1_USERNAME, USER_1);
         });
     }
 
-    @Test
-    @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"})
-    public void create_nonCreatorDataStewardQuery_succeeds() throws IdentifierAlreadyExistsException,
-            UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException,
-            IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException {
-
-        /* test */
-        generic_create(CONTAINER_2_ID, DATABASE_2_ID, DATABASE_2, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_3_PRINCIPAL, USER_3_USERNAME, USER_3);
-    }
-
     @Test
     public void update_anonymous_fails() {
 
@@ -275,24 +265,16 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
     }
 
     @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void update_creatorResearcher_fails() {
+    @WithMockUser(username = USER_1_USERNAME, authorities = {})
+    public void update_noRole_fails() {
 
         /* test */
         assertThrows(AccessDeniedException.class, this::generic_update);
     }
 
     @Test
-    @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"})
-    public void update_nonCreatorResearcher_fails() {
-
-        /* test */
-        assertThrows(AccessDeniedException.class, this::generic_update);
-    }
-
-    @Test
-    @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"})
-    public void update_dataSteward_succeeds() throws IdentifierPublishingNotAllowedException,
+    @WithMockUser(username = USER_3_USERNAME, authorities = {"update-identifier"})
+    public void update_hasRole_succeeds() throws IdentifierPublishingNotAllowedException,
             IdentifierNotFoundException, IdentifierRequestException {
 
         /* test */
@@ -300,34 +282,27 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
     }
 
     @Test
+    @WithAnonymousUser
     public void delete_anonymous_fails() {
 
-        /* test */
-        assertThrows(AuthenticationCredentialsNotFoundException.class, this::generic_delete);
-    }
-
-    @Test
-    @WithMockUser(username = USER_1_USERNAME, roles = {"RESEARCHER"})
-    public void delete_creatorResearcher_fails() {
-
         /* test */
         assertThrows(AccessDeniedException.class, this::generic_delete);
     }
 
     @Test
-    @WithMockUser(username = USER_2_USERNAME, roles = {"RESEARCHER"})
-    public void delete_nonCreatorResearcher_fails() {
+    @WithMockUser(username = USER_1_USERNAME, authorities = {})
+    public void delete_noRole_fails() {
 
         /* test */
         assertThrows(AccessDeniedException.class, this::generic_delete);
     }
 
     @Test
-    @WithMockUser(username = USER_3_USERNAME, roles = {"DATA_STEWARD"})
-    public void delete_dataSteward_succeeds() throws IdentifierNotFoundException, NotAllowedException {
+    @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-identifier"})
+    public void delete_hasRole_succeeds() throws NotAllowedException, IdentifierNotFoundException {
 
         /* test */
-        generic_delete();
+        this.generic_delete();
     }
 
     /* ################################################################################################### */
@@ -339,7 +314,7 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
             throws QueryNotFoundException, RemoteUnavailableException,
             IdentifierAlreadyExistsException,
             UserNotFoundException, DatabaseNotFoundException, IdentifierPublishingNotAllowedException,
-            IdentifierRequestException, NotAllowedException {
+            IdentifierRequestException, at.tuwien.exception.AccessDeniedException {
 
         /* mock */
         when(databaseRepository.findById(databaseId))
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java
index 491b3eb7c574a0222ec07b5c56ecaf182dd5cbe4..0fe8adf13fae63b6aec2f3a2d92ee30c2453d1bb 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java
@@ -13,6 +13,7 @@ import at.tuwien.exception.QueryNotFoundException;
 import at.tuwien.exception.RemoteUnavailableException;
 import at.tuwien.gateway.QueryServiceGateway;
 import at.tuwien.repository.jpa.IdentifierRepository;
+import at.tuwien.repository.jpa.RealmRepository;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java
index 4fd01d25093e0ca7389804ee5063946010a4c9af..7167767c8b3940c35c78569385a68449aa363ed7 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java
@@ -12,6 +12,7 @@ import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpEntity;
@@ -41,6 +42,7 @@ public class QueryServiceGatewayUnitTest extends BaseUnitTest {
     private ReadyConfig readyConfig;
 
     @MockBean
+    @Qualifier("restTemplate")
     private RestTemplate restTemplate;
 
     @MockBean
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java
index 60c4bd45b4d0de8b2379c9564b66fd52b9646dab..36e265abbadfc726a5f3498f068bd44d819f8009 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java
@@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Answers;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.web.client.RestTemplateBuilder;
@@ -71,6 +72,7 @@ public class DataCiteIdentifierServiceUnitTest extends BaseUnitTest {
     private IdentifierRepository identifierRepository;
 
     @MockBean
+    @Qualifier("restTemplate")
     private RestTemplate restTemplate;
 
     @MockBean(answer = Answers.RETURNS_SELF)
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
index 4133a24409469526e74a2a87bfca541f73dd4e07..423c014e503edaa826f147ec0302479906af71f9 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
@@ -15,6 +15,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpEntity;
@@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
 
 import java.util.List;
+import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
@@ -48,6 +50,7 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest {
     private QueryServiceGateway queryServiceGateway;
 
     @MockBean
+    @Qualifier("restTemplate")
     private RestTemplate restTemplate;
 
     @Autowired
@@ -68,11 +71,15 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest {
     @Autowired
     private UserRepository userRepository;
 
+    @Autowired
+    private RealmRepository realmRepository;
+
     @BeforeEach
     public void beforeEach() {
+        imageRepository.save(IMAGE_1);
+        realmRepository.save(REALM_DBREPO);
         userRepository.save(USER_1);
         userRepository.save(USER_2);
-        imageRepository.save(IMAGE_1);
         containerRepository.save(CONTAINER_1);
         databaseRepository.save(DATABASE_1);
         containerRepository.save(CONTAINER_2);
diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java
index 9301bd73535d5491fa766f23e728118abff59f22..4eaff8493e39161e29140f89a53a6473357de654 100644
--- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java
+++ b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java
@@ -14,6 +14,7 @@ import org.apache.http.auth.BasicUserPrincipal;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.core.io.InputStreamResource;
@@ -49,6 +50,7 @@ public class IdentifierServiceUnitTest extends BaseUnitTest {
     private DatabaseService databaseService;
 
     @MockBean
+    @Qualifier("restTemplate")
     private RestTemplate restTemplate;
 
     @MockBean
@@ -204,7 +206,6 @@ public class IdentifierServiceUnitTest extends BaseUnitTest {
 
     @Test
     public void update_notVisibleByEveryone_fails() {
-
         Identifier identifier = Identifier.builder().id(IDENTIFIER_1_ID).build();
         IdentifierDto identifierDto = IdentifierDto.builder().id(IDENTIFIER_1_ID).visibility(VisibilityTypeDto.TRUSTED).build();
         IDENTIFIER_1_DTO.setVisibility(VisibilityTypeDto.TRUSTED);
@@ -224,7 +225,6 @@ public class IdentifierServiceUnitTest extends BaseUnitTest {
             throws DatabaseNotFoundException, UserNotFoundException, IdentifierAlreadyExistsException,
             QueryNotFoundException, IdentifierPublishingNotAllowedException, RemoteUnavailableException,
             IdentifierRequestException {
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
         final String bearer = "Bearer abcxyz";
 
         /* mock */
@@ -241,13 +241,12 @@ public class IdentifierServiceUnitTest extends BaseUnitTest {
 
 
         /* test */
-        identifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer);
+        identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer);
     }
 
     @Test
     public void create_existsSubset_fails()
             throws DatabaseNotFoundException {
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
         final String bearer = "Bearer abcxyz";
 
         /* mock */
@@ -259,14 +258,13 @@ public class IdentifierServiceUnitTest extends BaseUnitTest {
 
         /* test */
         assertThrows(IdentifierAlreadyExistsException.class, () -> {
-            identifierService.create(IDENTIFIER_2_DTO_REQUEST, principal, bearer);
+            identifierService.create(IDENTIFIER_2_DTO_REQUEST, USER_1_PRINCIPAL, bearer);
         });
     }
 
     @Test
     public void create_existsDatabase_fails()
             throws DatabaseNotFoundException {
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
         final String bearer = "Bearer abcxyz";
 
         /* mock */
@@ -278,7 +276,7 @@ public class IdentifierServiceUnitTest extends BaseUnitTest {
 
         /* test */
         assertThrows(IdentifierAlreadyExistsException.class, () -> {
-            identifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer);
+            identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer);
         });
     }
 
diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt
index 1d79dc4dfbaeddd7ead4a97cf1a2dd687567fec9..35a5374403f5de61697a0eaab9910352b4aed9a2 100644
--- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt
+++ b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt
@@ -1 +1 @@
-[1] “Sweden weather data“, Swedish Government, 2022, doi: http://localhost:3000/pid/4.
\ No newline at end of file
+[1] “Sweden weather data“, Swedish Government, 2022, Available: http://localhost:3000/pid/4.
\ No newline at end of file
diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt
index 5ae90052d725298c58895ff917990a652665bc07..909031b2db36b3f9696af84ae423e33f1ffde199 100644
--- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt
+++ b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt
@@ -1 +1 @@
-[1] M. Mustermann and M. Mustermann, “Australian weather data“, Australian Government, 2022, doi: http://localhost:3000/pid/2.
\ No newline at end of file
+[1] M. Mustermann and M. Mustermann, “Australian weather data“, Australian Government, 2022, Available: http://localhost:3000/pid/2.
\ No newline at end of file
diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..84169f32e08a9580d23b3590bb7a5691dcfe3975
--- /dev/null
+++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java
@@ -0,0 +1,23 @@
+package at.tuwien.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import java.io.IOException;
+
+@ResponseStatus(code = HttpStatus.FORBIDDEN)
+public class AccessDeniedException extends IOException {
+
+    public AccessDeniedException(String msg) {
+        super(msg);
+    }
+
+    public AccessDeniedException(String msg, Throwable thr) {
+        super(msg, thr);
+    }
+
+    public AccessDeniedException(Throwable thr) {
+        super(thr);
+    }
+
+}
diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/AccessRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/AccessRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..2795450ea714602c41b8be03d62cbfc1853aa967
--- /dev/null
+++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/jpa/AccessRepository.java
@@ -0,0 +1,16 @@
+
+package at.tuwien.repository.jpa;
+
+import at.tuwien.entities.database.DatabaseAccess;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+import java.util.UUID;
+
+@Repository
+public interface AccessRepository extends JpaRepository<DatabaseAccess, Long> {
+
+    Optional<DatabaseAccess> findByHdbidAndHuserid(Long databaseId, UUID userId);
+
+}
diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java
new file mode 100644
index 0000000000000000000000000000000000000000..37e5ae1603714ff54e0240f89cfffb3983e5f694
--- /dev/null
+++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java
@@ -0,0 +1,11 @@
+package at.tuwien.service;
+
+import at.tuwien.entities.database.DatabaseAccess;
+import at.tuwien.exception.AccessDeniedException;
+
+import java.util.UUID;
+
+public interface AccessService {
+
+    DatabaseAccess find(Long databaseId, UUID userId) throws AccessDeniedException;
+}
diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f23467c3af5f7302b60a32fae0d300a668af8114
--- /dev/null
+++ b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
@@ -0,0 +1,34 @@
+package at.tuwien.service.impl;
+
+import at.tuwien.entities.database.DatabaseAccess;
+import at.tuwien.exception.AccessDeniedException;
+import at.tuwien.repository.jpa.AccessRepository;
+import at.tuwien.service.AccessService;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+import java.util.UUID;
+
+@Log4j2
+@Service
+public class AccessServiceImpl implements AccessService {
+
+    private final AccessRepository accessRepository;
+
+    @Autowired
+    public AccessServiceImpl(AccessRepository accessRepository) {
+        this.accessRepository = accessRepository;
+    }
+
+    @Override
+    public DatabaseAccess find(Long databaseId, UUID userId) throws AccessDeniedException {
+        final Optional<DatabaseAccess> optional = accessRepository.findByHdbidAndHuserid(databaseId, userId);
+        if (optional.isEmpty()) {
+            log.error("Failed to find access for user with id {}", userId);
+            throw new AccessDeniedException("Failed to find access");
+        }
+        return optional.get();
+    }
+}
diff --git a/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java
index d6a515b3974c5a06a1ba62359a90d04163c184f8..64137ee49a6b18bed22b3e9814aa773c3a689da6 100644
--- a/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-db/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -928,6 +928,19 @@ public abstract class BaseTest {
             .owner(USER_4)
             .build();
 
+    public final static Container CONTAINER_4_SIMPLE = Container.builder()
+            .id(CONTAINER_4_ID)
+            .name(CONTAINER_4_NAME)
+            .internalName(CONTAINER_4_INTERNALNAME)
+            .imageId(IMAGE_1_ID)
+            .image(CONTAINER_4_IMAGE)
+            .hash(CONTAINER_4_HASH)
+            .created(CONTAINER_4_CREATED)
+            .ipAddress(CONTAINER_4_IP)
+            .creator(null /* for jpa */)
+            .owner(null /* for jpa */)
+            .build();
+
     public final static Long CONTAINER_BROKER_ID = 5L;
     public final static String CONTAINER_BROKER_NAME = "dbrepo-broker-service";
     public final static String CONTAINER_BROKER_INTERNAL_NAME = "dbrepo-broker-service";
@@ -1355,6 +1368,24 @@ public abstract class BaseTest {
             .views(List.of())
             .build();
 
+    public final static Database DATABASE_4_SIMPLE = Database.builder()
+            .id(DATABASE_4_ID)
+            .created(Instant.now().minus(4, HOURS))
+            .lastModified(Instant.now())
+            .isPublic(DATABASE_4_PUBLIC)
+            .name(DATABASE_4_NAME)
+            .description(DATABASE_4_DESCRIPTION)
+            .container(CONTAINER_4)
+            .internalName(DATABASE_4_INTERNALNAME)
+            .exchangeName(DATABASE_4_EXCHANGE)
+            .created(DATABASE_4_CREATED)
+            .lastModified(DATABASE_4_LAST_MODIFIED)
+            .creator(null /* for jpa */)
+            .owner(null /* for jpa */)
+            .tables(List.of() /* for jpa */)
+            .views(List.of() /* for jpa */)
+            .build();
+
     public final static DatabaseAccess DATABASE_4_RESEARCHER_READ_ACCESS = DatabaseAccess.builder()
             .type(AccessType.READ)
             .hdbid(DATABASE_4_ID)
@@ -3912,9 +3943,35 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_1_RESULT_NUMBER)
             .publisher(IDENTIFIER_1_PUBLISHER)
             .type(IDENTIFIER_1_TYPE)
+            .creator(USER_1)
             .creators(List.of(IDENTIFIER_1_CREATOR_1))
             .build();
 
+    public final static Identifier IDENTIFIER_1_SIMPLE = Identifier.builder()
+            .id(IDENTIFIER_1_ID)
+            .containerId(IDENTIFIER_1_CONTAINER_ID)
+            .databaseId(IDENTIFIER_1_DATABASE_ID)
+            .queryId(IDENTIFIER_1_QUERY_ID)
+            .description(IDENTIFIER_1_DESCRIPTION)
+            .title(IDENTIFIER_1_TITLE)
+            .doi(IDENTIFIER_1_DOI)
+            .visibility(IDENTIFIER_1_VISIBILITY)
+            .created(IDENTIFIER_1_CREATED)
+            .lastModified(IDENTIFIER_1_MODIFIED)
+            .execution(IDENTIFIER_1_EXECUTION)
+            .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR)
+            .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH)
+            .queryHash(IDENTIFIER_1_QUERY_HASH)
+            .resultHash(IDENTIFIER_1_RESULT_HASH)
+            .query(IDENTIFIER_1_QUERY)
+            .queryNormalized(IDENTIFIER_1_NORMALIZED)
+            .resultNumber(IDENTIFIER_1_RESULT_NUMBER)
+            .publisher(IDENTIFIER_1_PUBLISHER)
+            .type(IDENTIFIER_1_TYPE)
+            .creator(null /* for jpa */)
+            .creators(List.of() /* for jpa */)
+            .build();
+
     public final static Identifier IDENTIFIER_1_WITH_DOI = Identifier.builder()
             .id(IDENTIFIER_1_ID)
             .containerId(IDENTIFIER_1_CONTAINER_ID)
@@ -4073,6 +4130,32 @@ public abstract class BaseTest {
             .creators(List.of(IDENTIFIER_2_CREATOR_1, IDENTIFIER_2_CREATOR_2))
             .build();
 
+    public final static Identifier IDENTIFIER_2_SIMPLE = Identifier.builder()
+            .id(IDENTIFIER_2_ID)
+            .containerId(IDENTIFIER_2_CONTAINER_ID)
+            .databaseId(IDENTIFIER_2_DATABASE_ID)
+            .queryId(IDENTIFIER_2_QUERY_ID)
+            .description(IDENTIFIER_2_DESCRIPTION)
+            .title(IDENTIFIER_2_TITLE)
+            .doi(IDENTIFIER_2_DOI)
+            .visibility(IDENTIFIER_2_VISIBILITY)
+            .created(IDENTIFIER_2_CREATED)
+            .lastModified(IDENTIFIER_2_MODIFIED)
+            .execution(IDENTIFIER_2_EXECUTION)
+            .publicationDay(IDENTIFIER_2_PUBLICATION_DAY)
+            .publicationMonth(IDENTIFIER_2_PUBLICATION_MONTH)
+            .publicationYear(IDENTIFIER_2_PUBLICATION_YEAR)
+            .queryHash(IDENTIFIER_2_QUERY_HASH)
+            .resultHash(IDENTIFIER_2_RESULT_HASH)
+            .query(IDENTIFIER_2_QUERY)
+            .queryNormalized(IDENTIFIER_2_NORMALIZED)
+            .resultNumber(IDENTIFIER_2_RESULT_NUMBER)
+            .publisher(IDENTIFIER_2_PUBLISHER)
+            .type(IDENTIFIER_2_TYPE)
+            .creator(null /* for jpa */)
+            .creators(List.of() /* for jpa */)
+            .build();
+
     public final static IdentifierDto IDENTIFIER_2_DTO = IdentifierDto.builder()
             .id(IDENTIFIER_2_ID)
             .containerId(IDENTIFIER_2_CONTAINER_ID)
@@ -4247,6 +4330,7 @@ public abstract class BaseTest {
     public final static IdentifierCreateDto IDENTIFIER_2_DTO_REQUEST = IdentifierCreateDto.builder()
             .qid(IDENTIFIER_2_QUERY_ID)
             .cid(IDENTIFIER_2_CONTAINER_ID)
+            .qid(IDENTIFIER_2_QUERY_ID)
             .dbid(IDENTIFIER_2_DATABASE_ID)
             .description(IDENTIFIER_2_DESCRIPTION)
             .title(IDENTIFIER_2_TITLE)
@@ -4360,6 +4444,32 @@ public abstract class BaseTest {
             .creators(List.of(IDENTIFIER_3_CREATOR_1, IDENTIFIER_3_CREATOR_2, IDENTIFIER_3_CREATOR_3))
             .build();
 
+    public final static Identifier IDENTIFIER_3_SIMPLE = Identifier.builder()
+            .id(IDENTIFIER_3_ID)
+            .containerId(IDENTIFIER_3_CONTAINER_ID)
+            .databaseId(IDENTIFIER_3_DATABASE_ID)
+            .queryId(IDENTIFIER_3_QUERY_ID)
+            .description(IDENTIFIER_3_DESCRIPTION)
+            .title(IDENTIFIER_3_TITLE)
+            .doi(IDENTIFIER_3_DOI)
+            .visibility(IDENTIFIER_3_VISIBILITY)
+            .created(IDENTIFIER_3_CREATED)
+            .lastModified(IDENTIFIER_3_MODIFIED)
+            .execution(IDENTIFIER_3_EXECUTION)
+            .publicationDay(IDENTIFIER_3_PUBLICATION_DAY)
+            .publicationMonth(IDENTIFIER_3_PUBLICATION_MONTH)
+            .publicationYear(IDENTIFIER_3_PUBLICATION_YEAR)
+            .queryHash(IDENTIFIER_3_QUERY_HASH)
+            .resultHash(IDENTIFIER_3_RESULT_HASH)
+            .query(IDENTIFIER_3_QUERY)
+            .queryNormalized(IDENTIFIER_3_NORMALIZED)
+            .resultNumber(IDENTIFIER_3_RESULT_NUMBER)
+            .publisher(IDENTIFIER_3_PUBLISHER)
+            .type(IDENTIFIER_3_TYPE)
+            .creator(null /* for jpa */)
+            .creators(List.of() /* for jpa */)
+            .build();
+
     public final static IdentifierDto IDENTIFIER_3_DTO = IdentifierDto.builder()
             .id(IDENTIFIER_3_ID)
             .containerId(IDENTIFIER_3_CONTAINER_ID)
@@ -4389,6 +4499,7 @@ public abstract class BaseTest {
     public final static IdentifierCreateDto IDENTIFIER_3_DTO_REQUEST = IdentifierCreateDto.builder()
             .cid(IDENTIFIER_3_CONTAINER_ID)
             .dbid(IDENTIFIER_3_DATABASE_ID)
+            .qid(IDENTIFIER_3_QUERY_ID)
             .description(IDENTIFIER_3_DESCRIPTION)
             .title(IDENTIFIER_3_TITLE)
             .relatedIdentifiers(List.of())
@@ -4471,6 +4582,31 @@ public abstract class BaseTest {
             .creators(List.of())
             .build();
 
+    public final static Identifier IDENTIFIER_4_SIMPLE = Identifier.builder()
+            .id(IDENTIFIER_4_ID)
+            .containerId(IDENTIFIER_4_CONTAINER_ID)
+            .databaseId(IDENTIFIER_4_DATABASE_ID)
+            .description(IDENTIFIER_4_DESCRIPTION)
+            .title(IDENTIFIER_4_TITLE)
+            .doi(IDENTIFIER_4_DOI)
+            .visibility(IDENTIFIER_4_VISIBILITY)
+            .created(IDENTIFIER_4_CREATED)
+            .lastModified(IDENTIFIER_4_MODIFIED)
+            .execution(IDENTIFIER_4_EXECUTION)
+            .publicationDay(IDENTIFIER_4_PUBLICATION_DAY)
+            .publicationMonth(IDENTIFIER_4_PUBLICATION_MONTH)
+            .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR)
+            .queryHash(IDENTIFIER_4_QUERY_HASH)
+            .resultHash(IDENTIFIER_4_RESULT_HASH)
+            .query(IDENTIFIER_4_QUERY)
+            .queryNormalized(IDENTIFIER_4_NORMALIZED)
+            .resultNumber(IDENTIFIER_4_RESULT_NUMBER)
+            .publisher(IDENTIFIER_4_PUBLISHER)
+            .type(IDENTIFIER_4_TYPE)
+            .creator(null /* for jpa */)
+            .creators(List.of() /* for jpa */)
+            .build();
+
     public final static String VIRTUAL_HOST_NAME = "fda";
     public final static String VIRTUAL_HOST_DESCRIPTION = "FAIR Data Austria";
     public final static String VIRTUAL_HOST_TAGS = "";