diff --git a/Makefile b/Makefile
index 1de82865aa2cd00d37ad3879f346d41ab7cab89b..e3c832ef22945416a0d34c70bcfa4ec742c55ef1 100644
--- a/Makefile
+++ b/Makefile
@@ -193,31 +193,31 @@ pull-metadata:
 
 test-backend: test-authentication-service test-container-service test-database-service test-discovery-service test-gateway-service test-query-service test-table-service test-identifier-service test-metadata-service
 
-test-authentication-service:
+test-authentication-service: build-backend-metadata-db
 	mvn -f ./fda-authentication-service/pom.xml clean test verify
 
-test-identifier-service:
+test-identifier-service: build-backend-metadata-db
 	mvn -f ./fda-identifier-service/pom.xml clean test verify
 
-test-container-service:
+test-container-service: build-backend-metadata-db
 	mvn -f ./fda-container-service/pom.xml clean test verify
 
-test-database-service:
+test-database-service: build-backend-metadata-db
 	mvn -f ./fda-database-service/pom.xml clean test verify
 
-test-discovery-service:
+test-discovery-service: build-backend-metadata-db
 	mvn -f ./fda-discovery-service/pom.xml clean test verify
 
-test-gateway-service:
+test-gateway-service: build-backend-metadata-db
 	mvn -f ./fda-gateway-service/pom.xml clean test verify
 
-test-query-service:
+test-query-service: build-backend-metadata-db
 	mvn -f ./fda-query-service/pom.xml clean test verify
 
-test-table-service:
+test-table-service: build-backend-metadata-db
 	mvn -f ./fda-table-service/pom.xml clean test verify
 
-test-metadata-service:
+test-metadata-service: build-backend-metadata-db
 	mvn -f ./fda-metadata-service/pom.xml clean test verify
 
 coverage-frontend: clean build-frontend
diff --git a/fda-authentication-service/rest-service/src/test/resources/application.properties b/fda-authentication-service/rest-service/src/test/resources/application.properties
index 88c58a85e34098a6ef1eddde183d20544dc6fb1c..bcce0036c92b680a401f6973bcc0e8894579cd1a 100644
--- a/fda-authentication-service/rest-service/src/test/resources/application.properties
+++ b/fda-authentication-service/rest-service/src/test/resources/application.properties
@@ -15,4 +15,7 @@ spring.datasource.username=sa
 spring.datasource.password=password
 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
 spring.jpa.hibernate.ddl-auto=create-drop
-spring.jpa.show-sql=false
\ No newline at end of file
+spring.jpa.show-sql=false
+
+# disable mail health check
+management.health.mail.enabled=false
\ No newline at end of file
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
index 2797e45b87ea35e0c8c2530c9e10307ef9186b2b..bca4a202830065e4a2d7018a430f9e3e28db61d1 100644
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
@@ -8,6 +8,8 @@ import at.tuwien.entities.container.image.ContainerImageEnvironmentItem;
 import at.tuwien.entities.container.image.ContainerImageEnvironmentItemType;
 import at.tuwien.entities.user.RoleType;
 import at.tuwien.entities.user.User;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.test.context.TestPropertySource;
 
 import java.time.Instant;
@@ -24,6 +26,7 @@ public abstract class BaseUnitTest {
     public final static Boolean USER_1_THEME_DARK = false;
     public final static String USER_1_PASSWORD = "p455w0rdh45h";
     public final static RoleType USER_1_ROLE_TYPE = RoleType.ROLE_RESEARCHER;
+    public final static GrantedAuthority USER_1_AUTHORITY = new SimpleGrantedAuthority("ROLE_RESEARCHER");
 
     public final static User USER_1 = User.builder()
             .username(USER_1_USERNAME)
@@ -34,6 +37,55 @@ public abstract class BaseUnitTest {
             .roles(List.of(USER_1_ROLE_TYPE))
             .build();
 
+    public final static String USER_2_USERNAME = "dev";
+    public final static String USER_2_EMAIL = "dev@gmail.com";
+    public final static Boolean USER_2_EMAIL_VERIFIED = false;
+    public final static Boolean USER_2_THEME_DARK = false;
+    public final static String USER_2_PASSWORD = "p455w0rdh45";
+    public final static RoleType USER_2_ROLE_TYPE = RoleType.ROLE_DEVELOPER;
+    public final static GrantedAuthority USER_2_AUTHORITY = new SimpleGrantedAuthority("ROLE_DEVELOPER");
+
+    public final static User USER_2 = User.builder()
+            .username(USER_2_USERNAME)
+            .email(USER_2_EMAIL)
+            .emailVerified(USER_2_EMAIL_VERIFIED)
+            .themeDark(USER_2_THEME_DARK)
+            .password(USER_2_PASSWORD)
+            .roles(List.of(USER_2_ROLE_TYPE))
+            .build();
+
+    public final static String USER_3_USERNAME = "steward";
+    public final static String USER_3_EMAIL = "steward@gmail.com";
+    public final static Boolean USER_3_EMAIL_VERIFIED = false;
+    public final static Boolean USER_3_THEME_DARK = false;
+    public final static String USER_3_PASSWORD = "p455w0rdh45";
+    public final static RoleType USER_3_ROLE_TYPE = RoleType.ROLE_DATA_STEWARD;
+    public final static GrantedAuthority USER_3_AUTHORITY = new SimpleGrantedAuthority("ROLE_DATA_STEWARD");
+
+    public final static User USER_3 = User.builder()
+            .username(USER_3_USERNAME)
+            .email(USER_3_EMAIL)
+            .emailVerified(USER_3_EMAIL_VERIFIED)
+            .themeDark(USER_3_THEME_DARK)
+            .password(USER_3_PASSWORD)
+            .roles(List.of(USER_3_ROLE_TYPE))
+            .build();
+
+    public final static String USER_4_USERNAME = "nobody";
+    public final static String USER_4_EMAIL = "nobody@gmail.com";
+    public final static Boolean USER_4_EMAIL_VERIFIED = false;
+    public final static Boolean USER_4_THEME_DARK = false;
+    public final static String USER_4_PASSWORD = "p455w0rdh45";
+
+    public final static User USER_4 = User.builder()
+            .username(USER_4_USERNAME)
+            .email(USER_4_EMAIL)
+            .emailVerified(USER_4_EMAIL_VERIFIED)
+            .themeDark(USER_4_THEME_DARK)
+            .password(USER_4_PASSWORD)
+            .roles(List.of())
+            .build();
+
     public final static Long IMAGE_1_ID = 1L;
     public final static String IMAGE_1_REPOSITORY = "mariadb";
     public final static String IMAGE_1_TAG = "10.5";
@@ -90,10 +142,8 @@ public abstract class BaseUnitTest {
             .jdbcMethod(IMAGE_1_JDBC)
             .dialect(IMAGE_1_DIALECT)
             .driverClass(IMAGE_1_DRIVER)
-            .containers(List.of())
             .compiled(IMAGE_1_BUILT)
             .size(IMAGE_1_SIZE)
-            .environment(IMAGE_1_ENV)
             .defaultPort(IMAGE_1_PORT)
             .build();
 
@@ -141,7 +191,6 @@ public abstract class BaseUnitTest {
             .jdbcMethod(IMAGE_2_JDBC)
             .dialect(IMAGE_2_DIALECT)
             .driverClass(IMAGE_2_DRIVER)
-            .containers(List.of())
             .compiled(IMAGE_2_BUILT)
             .size(IMAGE_2_SIZE)
             .environment(IMAGE_2_ENV)
@@ -151,51 +200,54 @@ public abstract class BaseUnitTest {
     public final static Long CONTAINER_1_ID = 1L;
     public final static String CONTAINER_1_HASH = "deadbeef";
     public final static String CONTAINER_1_NAME = "fda-userdb-u01";
-    public final static String CONTAINER_1_INTERNALNAME = "fda-userdb-u01";
+    public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-fda-userdb-u01";
     public final static String CONTAINER_1_DATABASE = "univie";
     public final static String CONTAINER_1_IP = "172.28.0.5";
     public final static Instant CONTAINER_1_CREATED = Instant.now().minus(1, HOURS);
 
-    public final static Long CONTAINER_2_ID = 2L;
-    public final static String CONTAINER_2_HASH = "deadbeef";
-    public final static String CONTAINER_2_NAME = "fda-userdb-u02";
-    public final static String CONTAINER_2_INTERNALNAME = "fda-userdb-u02";
-    public final static String CONTAINER_2_DATABASE = "univie";
-    public final static String CONTAINER_2_IP = "172.28.0.6";
-    public final static Instant CONTAINER_2_CREATED = Instant.now().minus(2, HOURS);
-
-    public final static Long CONTAINER_3_ID = 3L;
-    public final static String CONTAINER_3_HASH = "deadbeef";
-    public final static String CONTAINER_3_NAME = "fda-userdb-u03";
-    public final static String CONTAINER_3_INTERNALNAME = "fda-userdb-u03";
-    public final static String CONTAINER_3_DATABASE = "u03";
-    public final static String CONTAINER_3_IP = "173.38.0.7";
-    public final static Instant CONTAINER_3_CREATED = Instant.now().minus(2, HOURS);
-
     public final static Container CONTAINER_1 = Container.builder()
             .id(CONTAINER_1_ID)
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
             .image(IMAGE_1)
             .hash(CONTAINER_1_HASH)
+            .ipAddress(CONTAINER_1_IP)
             .created(CONTAINER_1_CREATED)
             .build();
 
+    public final static Long CONTAINER_2_ID = 2L;
+    public final static String CONTAINER_2_HASH = "deadbeef";
+    public final static String CONTAINER_2_NAME = "fda-userdb-u02";
+    public final static String CONTAINER_2_INTERNALNAME = "dbrepo-userdb-fda-userdb-u02";
+    public final static String CONTAINER_2_DATABASE = "univie";
+    public final static String CONTAINER_2_IP = "172.28.0.6";
+    public final static Instant CONTAINER_2_CREATED = Instant.now().minus(2, HOURS);
+
     public final static Container CONTAINER_2 = Container.builder()
             .id(CONTAINER_2_ID)
             .name(CONTAINER_2_NAME)
             .internalName(CONTAINER_2_INTERNALNAME)
             .image(IMAGE_1)
             .hash(CONTAINER_2_HASH)
+            .ipAddress(CONTAINER_2_IP)
             .created(CONTAINER_2_CREATED)
             .build();
 
+    public final static Long CONTAINER_3_ID = 3L;
+    public final static String CONTAINER_3_HASH = "deadbeef";
+    public final static String CONTAINER_3_NAME = "fda-userdb-u03";
+    public final static String CONTAINER_3_INTERNALNAME = "dbrepo-userdb-fda-userdb-u03";
+    public final static String CONTAINER_3_DATABASE = "u03";
+    public final static String CONTAINER_3_IP = "173.38.0.7";
+    public final static Instant CONTAINER_3_CREATED = Instant.now().minus(2, HOURS);
+
     public final static Container CONTAINER_3 = Container.builder()
             .id(CONTAINER_3_ID)
             .name(CONTAINER_3_NAME)
             .internalName(CONTAINER_3_INTERNALNAME)
             .image(IMAGE_1)
             .hash(CONTAINER_3_HASH)
+            .ipAddress(CONTAINER_3_IP)
             .created(CONTAINER_3_CREATED)
             .build();
 
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java b/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java
index f1d082e9bbd2365bddae2d0d927425cab415e2e8..3d2d8fe81e3b2d188e8709cd38950bb7f70fc6aa 100644
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java
@@ -2,7 +2,9 @@ package at.tuwien.config;
 
 import at.tuwien.entities.container.Container;
 import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.CreateContainerResponse;
 import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.model.HostConfig;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
@@ -13,13 +15,27 @@ import java.util.Objects;
 @Configuration
 public class DockerUtil {
 
+    private final HostConfig hostConfig;
     private final DockerClient dockerClient;
 
     @Autowired
-    public DockerUtil(DockerClient dockerClient) {
+    public DockerUtil(HostConfig hostConfig, DockerClient dockerClient) {
+        this.hostConfig = hostConfig;
         this.dockerClient = dockerClient;
     }
 
+    public void createContainer(Container container) {
+        final CreateContainerResponse create = dockerClient.createContainerCmd(container.getImage().getRepository() + ":" + container.getImage().getTag())
+                .withHostConfig(hostConfig.withNetworkMode("fda-userdb"))
+                .withName(container.getInternalName())
+                .withIpv4Address(container.getIpAddress())
+                .withHostName(container.getInternalName())
+                .withEnv("MARIADB_USER=mariadb", "MARIADB_PASSWORD=mariadb", "MARIADB_ROOT_PASSWORD=mariadb", "MARIADB_DATABASE=weather")
+                .exec();
+        container.setHash(create.getId());
+        log.trace("container {} needs to be started", container.getHash());
+    }
+
     public void startContainer(Container container) throws InterruptedException {
         final InspectContainerResponse inspect = dockerClient.inspectContainerCmd(container.getHash())
                 .exec();
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java
deleted file mode 100644
index 8be30d7e90f8f3d8f0dd91e0b39a574996eb8e5e..0000000000000000000000000000000000000000
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java
+++ /dev/null
@@ -1,314 +0,0 @@
-package at.tuwien.endpoint;
-
-import at.tuwien.BaseUnitTest;
-import at.tuwien.api.container.*;
-import at.tuwien.auth.PermissionEvaluatorImpl;
-import at.tuwien.config.ReadyConfig;
-import at.tuwien.endpoints.ContainerEndpoint;
-import at.tuwien.exception.*;
-import at.tuwien.repository.jpa.ImageRepository;
-import at.tuwien.service.impl.ContainerServiceImpl;
-import org.apache.http.auth.BasicUserPrincipal;
-import org.junit.jupiter.api.Disabled;
-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.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.test.context.support.WithMockUser;
-import org.springframework.security.test.context.support.WithUserDetails;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-import javax.persistence.Basic;
-import java.security.Principal;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(SpringExtension.class)
-@SpringBootTest
-public class ContainerEndpointUnitTest extends BaseUnitTest {
-
-    @MockBean
-    private ReadyConfig readyConfig;
-
-    @MockBean
-    private ContainerServiceImpl containerService;
-
-    @MockBean
-    private ImageRepository imageRepository;
-
-    @MockBean
-    private PermissionEvaluatorImpl permissionEvaluator;
-
-    @Autowired
-    private ContainerEndpoint containerEndpoint;
-
-    @Test
-    public void listAllDatabases_succeeds() {
-        when(containerService.getAll())
-                .thenReturn(List.of(CONTAINER_1));
-
-        final ResponseEntity<List<ContainerBriefDto>> response = containerEndpoint.findAll(null);
-
-        /* test */
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals(1, Objects.requireNonNull(response.getBody()).size());
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void create_succeeds() throws ImageNotFoundException, DockerClientException, UserNotFoundException, ContainerAlreadyExistsException {
-        final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
-                .name(CONTAINER_1_NAME)
-                .repository(IMAGE_1.getRepository())
-                .tag(IMAGE_1.getTag())
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        when(containerService.create(request, principal))
-                .thenReturn(CONTAINER_1);
-
-        final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(request, principal);
-
-        /* test */
-        assertEquals(HttpStatus.CREATED, response.getStatusCode());
-        assertEquals(CONTAINER_1_NAME, Objects.requireNonNull(response.getBody()).getName());
-    }
-
-    @Disabled
-    @Test
-    public void create_noImage_fails() throws DockerClientException, ImageNotFoundException, UserNotFoundException, ContainerAlreadyExistsException {
-        final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
-                .name(CONTAINER_1_NAME)
-                .repository("image")
-                .tag("notexisting")
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        when(imageRepository.findByRepositoryAndTag(request.getRepository(), request.getTag()))
-                .thenReturn(Optional.empty());
-
-        final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(request, principal);
-
-        /* test */
-        assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
-    }
-
-    @Disabled
-    @WithMockUser(username = "not3x1st1ng", roles = {"ROLE_RESEARCHER"})
-    @Test
-    public void create_docker_fails() throws DockerClientException, ImageNotFoundException, UserNotFoundException, ContainerAlreadyExistsException {
-        final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
-                .name(CONTAINER_1_NAME)
-                .repository(IMAGE_1.getRepository())
-                .tag(IMAGE_1.getTag())
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        when(imageRepository.findByRepositoryAndTag(request.getRepository(), request.getTag()))
-                .thenReturn(Optional.of(IMAGE_1));
-
-        final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(request, principal);
-
-        /* test */
-        assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
-    }
-
-    @Test
-    public void findById_succeeds() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException {
-        when(containerService.find(CONTAINER_1_ID))
-                .thenReturn(CONTAINER_1);
-
-        /* test */
-        final ResponseEntity<ContainerDto> response = containerEndpoint.findById(CONTAINER_1_ID);
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-    }
-
-    @Test
-    public void findById_notFound_fails() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException {
-        doThrow(ContainerNotFoundException.class)
-                .when(containerService)
-                .inspect(CONTAINER_1_ID);
-
-        /* test */
-        assertThrows(ContainerNotFoundException.class, () -> {
-            containerEndpoint.findById(CONTAINER_1_ID);
-        });
-    }
-
-    @Test
-    public void findById_docker_fails() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException {
-        doThrow(DockerClientException.class)
-                .when(containerService)
-                .inspect(CONTAINER_1_ID);
-
-        /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerEndpoint.findById(CONTAINER_1_ID);
-        });
-    }
-
-    @Test
-    public void findById_notRunning_fails() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException {
-        doThrow(ContainerNotRunningException.class)
-                .when(containerService)
-                .inspect(CONTAINER_1_ID);
-
-        /* test */
-        assertThrows(ContainerNotRunningException.class, () -> {
-            containerEndpoint.findById(CONTAINER_1_ID);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void modify_start_succeeds() throws DockerClientException, ContainerNotFoundException {
-        final ContainerChangeDto request = ContainerChangeDto.builder()
-                .action(ContainerActionTypeDto.START)
-                .build();
-        when(containerService.start(CONTAINER_1_ID))
-                .thenReturn(CONTAINER_1);
-
-        /* test */
-        final ResponseEntity<ContainerBriefDto> response = containerEndpoint.modify(CONTAINER_1_ID, request);
-        assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
-        assertEquals(CONTAINER_1_ID, Objects.requireNonNull(response.getBody()).getId());
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void modify_stop_succeeds() throws DockerClientException, ContainerNotFoundException, ContainerStillRunningException {
-        final ContainerChangeDto request = ContainerChangeDto.builder()
-                .action(ContainerActionTypeDto.STOP)
-                .build();
-        when(containerService.stop(CONTAINER_1_ID))
-                .thenReturn(CONTAINER_1);
-
-        /* test */
-        final ResponseEntity<ContainerBriefDto> response = containerEndpoint.modify(CONTAINER_1_ID, request);
-        assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
-        assertEquals(CONTAINER_1_ID, Objects.requireNonNull(response.getBody()).getId());
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void modify_startDocker_fails() throws DockerClientException, ContainerNotFoundException {
-        final ContainerChangeDto request = ContainerChangeDto.builder()
-                .action(ContainerActionTypeDto.START)
-                .build();
-        when(containerService.start(CONTAINER_1_ID))
-                .thenThrow(DockerClientException.class);
-
-        /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerEndpoint.modify(CONTAINER_1_ID, request);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void modify_stopDocker_fails() throws DockerClientException, ContainerNotFoundException {
-        final ContainerChangeDto request = ContainerChangeDto.builder()
-                .action(ContainerActionTypeDto.STOP)
-                .build();
-        when(containerService.stop(CONTAINER_1_ID))
-                .thenThrow(DockerClientException.class);
-
-        /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerEndpoint.modify(CONTAINER_1_ID, request);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void modify_stopNoContainer_fails() throws DockerClientException, ContainerNotFoundException {
-        final ContainerChangeDto request = ContainerChangeDto.builder()
-                .action(ContainerActionTypeDto.STOP)
-                .build();
-        when(containerService.stop(CONTAINER_1_ID))
-                .thenThrow(ContainerNotFoundException.class);
-
-        /* test */
-        assertThrows(ContainerNotFoundException.class, () -> {
-            containerEndpoint.modify(CONTAINER_1_ID, request);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void delete_noContainer_fails() throws ContainerStillRunningException, DockerClientException, ContainerNotFoundException {
-        doThrow(new ContainerNotFoundException("no container"))
-                .when(containerService)
-                .remove(CONTAINER_1_ID);
-
-        doReturn(true)
-                .when(permissionEvaluator)
-                .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER"));
-
-        /* test */
-        assertThrows(ContainerNotFoundException.class, () -> {
-            containerEndpoint.delete(CONTAINER_1_ID);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void delete_success() throws DockerClientException, ContainerStillRunningException, ContainerNotFoundException {
-        doNothing()
-                .when(containerService)
-                .remove(CONTAINER_1_ID);
-
-        doReturn(true)
-                .when(permissionEvaluator)
-                .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER"));
-
-        /* test */
-        final ResponseEntity<?> response = containerEndpoint.delete(CONTAINER_1_ID);
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void delete_docker_fails() throws ContainerStillRunningException, DockerClientException, ContainerNotFoundException {
-        doThrow(new DockerClientException("docker failed"))
-                .when(containerService)
-                .remove(CONTAINER_1_ID);
-
-        doReturn(true)
-                .when(permissionEvaluator)
-                .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER"));
-
-        /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerEndpoint.delete(CONTAINER_1_ID);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "RESEARCHER")
-    public void delete_dockerStillRunning_fails() throws ContainerStillRunningException, DockerClientException, ContainerNotFoundException {
-        doThrow(new ContainerStillRunningException("container running"))
-                .when(containerService)
-                .remove(CONTAINER_1_ID);
-
-        doReturn(true)
-                .when(permissionEvaluator)
-                .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER"));
-
-        /* test */
-        assertThrows(ContainerStillRunningException.class, () -> {
-            containerEndpoint.delete(CONTAINER_1_ID);
-        });
-    }
-}
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ImageEndpointUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ImageEndpointUnitTest.java
deleted file mode 100644
index a493798a86c5d0b237ece8732324af3347569b1a..0000000000000000000000000000000000000000
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ImageEndpointUnitTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-package at.tuwien.endpoint;
-
-import at.tuwien.BaseUnitTest;
-import at.tuwien.api.container.image.ImageBriefDto;
-import at.tuwien.api.container.image.ImageChangeDto;
-import at.tuwien.api.container.image.ImageCreateDto;
-import at.tuwien.api.container.image.ImageDto;
-import at.tuwien.config.ReadyConfig;
-import at.tuwien.endpoints.ImageEndpoint;
-import at.tuwien.exception.*;
-import at.tuwien.service.impl.ImageServiceImpl;
-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.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.test.context.support.WithMockUser;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-import java.security.Principal;
-import java.util.List;
-import java.util.Objects;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(SpringExtension.class)
-@SpringBootTest
-public class ImageEndpointUnitTest extends BaseUnitTest {
-
-    @MockBean
-    private ReadyConfig readyConfig;
-
-    @MockBean
-    private ImageServiceImpl imageService;
-
-    @Autowired
-    private ImageEndpoint imageEndpoint;
-
-    @Test
-    public void findAll_succeeds() {
-        when(imageService.getAll())
-                .thenReturn(List.of(IMAGE_1));
-
-        /* test */
-        final ResponseEntity<List<ImageBriefDto>> response = imageEndpoint.findAll();
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals(1, Objects.requireNonNull(response.getBody()).size());
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void create_succeeds()
-            throws ImageNotFoundException, DockerClientException, ImageAlreadyExistsException, UserNotFoundException {
-        final ImageCreateDto request = ImageCreateDto.builder()
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .defaultPort(IMAGE_1_PORT)
-                .environment(IMAGE_1_ENV_DTO)
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        when(imageService.create(request, principal))
-                .thenReturn(IMAGE_1);
-
-        /* test */
-        final ResponseEntity<ImageDto> response = imageEndpoint.create(request, principal);
-        assertEquals(HttpStatus.CREATED, response.getStatusCode());
-        assertEquals(IMAGE_1_REPOSITORY, Objects.requireNonNull(response.getBody()).getRepository());
-        assertEquals(IMAGE_1_TAG, Objects.requireNonNull(response.getBody()).getTag());
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void create_duplicate_fails()
-            throws ImageNotFoundException, DockerClientException, ImageAlreadyExistsException, UserNotFoundException {
-        final ImageCreateDto request = ImageCreateDto.builder()
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .defaultPort(IMAGE_1_PORT)
-                .environment(IMAGE_1_ENV_DTO)
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        given(imageService.create(request, principal))
-                .willAnswer(invocation -> {
-                    throw new ImageAlreadyExistsException("duplicate");
-                });
-
-        /* test */
-        assertThrows(ImageAlreadyExistsException.class, () -> {
-            imageEndpoint.create(request, principal);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void create_notExists_fails()
-            throws ImageNotFoundException, DockerClientException, ImageAlreadyExistsException, UserNotFoundException {
-        final ImageCreateDto request = ImageCreateDto.builder()
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .defaultPort(IMAGE_1_PORT)
-                .environment(IMAGE_1_ENV_DTO)
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        given(imageService.create(request, principal))
-                .willAnswer(invocation -> {
-                    throw new ImageNotFoundException("not existing in docker hub");
-                });
-
-        /* test */
-        assertThrows(ImageNotFoundException.class, () -> {
-            imageEndpoint.create(request, principal);
-        });
-    }
-
-    @Test
-    public void findById_succeeds() throws ImageNotFoundException {
-
-        /* mock */
-        when(imageService.find(IMAGE_1_ID))
-                .thenReturn(IMAGE_1);
-
-        /* test */
-        final ResponseEntity<ImageDto> response = imageEndpoint.findById(IMAGE_1_ID);
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-    }
-
-    @Test
-    public void findById_notFound_fails() throws ImageNotFoundException {
-
-        /* mock */
-        given(imageService.find(IMAGE_1_ID))
-                .willAnswer(invocation -> {
-                    throw new ImageNotFoundException("not existing in docker hub");
-                });
-
-        /* test */
-        assertThrows(ImageNotFoundException.class, () -> {
-            imageEndpoint.findById(IMAGE_1_ID);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void delete_success() throws ImageNotFoundException, PersistenceException {
-
-        /* mock */
-        doNothing()
-                .when(imageService)
-                .delete(IMAGE_1_ID);
-
-        /* test */
-        final ResponseEntity<?> response = imageEndpoint.delete(IMAGE_1_ID);
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void delete_fails() throws ImageNotFoundException, PersistenceException {
-
-        /* mock */
-        doThrow(new ImageNotFoundException("not found"))
-                .when(imageService)
-                .delete(IMAGE_1_ID);
-
-        /* test */
-        assertThrows(ImageNotFoundException.class, () -> {
-            imageEndpoint.delete(IMAGE_1_ID);
-        });
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void update_succeeds() throws ImageNotFoundException, DockerClientException {
-        final ImageChangeDto request = ImageChangeDto.builder()
-                .defaultPort(1111)
-                .build();
-
-        /* test */
-        final ResponseEntity<ImageDto> response = imageEndpoint.update(IMAGE_1_ID, request);
-        assertEquals(HttpStatus.ACCEPTED, response.getStatusCode());
-    }
-
-    @Test
-    @WithMockUser(roles = "DEVELOPER")
-    public void update_notFound_fails() throws ImageNotFoundException, DockerClientException {
-        final ImageChangeDto request = ImageChangeDto.builder()
-                .defaultPort(1111)
-                .environment(IMAGE_1_ENV_DTO)
-                .build();
-
-        /* mock */
-        given(imageService.update(IMAGE_1_ID, request))
-                .willAnswer(invocation -> {
-                    throw new ImageNotFoundException("not existing in docker hub");
-                });
-
-        /* test */
-        assertThrows(ImageNotFoundException.class, () -> {
-            imageEndpoint.update(IMAGE_1_ID, request);
-        });
-    }
-}
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/BaseMappingTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/BaseMappingTest.java
deleted file mode 100644
index 0ed93482e34f9262300863a8f9a08e5949ced292..0000000000000000000000000000000000000000
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/BaseMappingTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package at.tuwien.mapper;
-
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import com.github.dockerjava.api.model.ContainerNetwork;
-import com.github.dockerjava.api.model.NetworkSettings;
-import lombok.SneakyThrows;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.test.context.TestPropertySource;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-
-@TestPropertySource(locations = "classpath:application.properties")
-public abstract class BaseMappingTest {
-
-    @Configuration
-    @ComponentScan(basePackages = {"at.tuwien"})
-    public static class BaseMappingContext {
-    }
-
-    final String CONTAINER_ID = "deadbeef";
-    final String CONTAINER_NETWORK_IP = "154.234.88.15";
-
-    @SneakyThrows
-    final InspectContainerResponse mockInspectResponse() {
-        final InspectContainerResponse responseC = new InspectContainerResponse();
-        final Object response = responseC.getClass().getConstructor().newInstance();
-        final Field idField = responseC.getClass().getDeclaredField("id");
-        idField.setAccessible(true);
-        idField.set(response, CONTAINER_ID);
-        final Field networkSettingsField = responseC.getClass().getDeclaredField("networkSettings");
-        networkSettingsField.setAccessible(true);
-
-        // define the network and address
-        final ContainerNetwork networkC = new ContainerNetwork();
-        final Object network = networkC.getClass().getConstructor().newInstance();
-        final Field ipField = networkC.getClass().getDeclaredField("ipAddress");
-        ipField.setAccessible(true);
-        ipField.set(network, CONTAINER_NETWORK_IP);
-        final Map<String, ContainerNetwork> map = Map.of("fda-userdb", (ContainerNetwork) network);
-
-        // add to network settings
-        final NetworkSettings settingsC = new NetworkSettings();
-        final Object settings = settingsC.getClass().getConstructor().newInstance();
-        final Field networksField = settingsC.getClass().getDeclaredField("networks");
-        networksField.setAccessible(true);
-        networksField.set(settings, map);
-        networkSettingsField.set(response, settings);
-
-        return (InspectContainerResponse) response;
-    }
-
-}
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMappingTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMappingTest.java
deleted file mode 100644
index bca70d34b278b97ec933f1a5eaa5e225ed307995..0000000000000000000000000000000000000000
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMappingTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package at.tuwien.mapper;
-
-import at.tuwien.config.ReadyConfig;
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-@ExtendWith(SpringExtension.class)
-@SpringBootTest
-public class ContainerMappingTest extends BaseMappingTest {
-
-    @MockBean
-    private ReadyConfig readyConfig;
-
-    @Test
-    public void inspectContainerResponseToDatabaseContainerMappingTest_succeeds() {
-        final InspectContainerResponse response = mockInspectResponse();
-
-        assertNotNull(response, "response must not be null");
-        assertEquals(CONTAINER_ID, response.getId());
-        assertNotNull(response.getNetworkSettings(), "networkSettings must not be null");
-        assertNotNull(response.getNetworkSettings().getNetworks(), "networkSettings.networks must not be null");
-        assertNotNull(response.getNetworkSettings().getNetworks().get("fda-userdb"), "networkSettings.networks['fda-userdb'] must not be null");
-        assertNotNull(response.getNetworkSettings().getNetworks().get("fda-userdb").getIpAddress(), "networkSettings.networks['fda-userdb'].ipAddress must not be null");
-        assertEquals(CONTAINER_NETWORK_IP, response.getNetworkSettings().getNetworks().get("fda-userdb").getIpAddress());
-    }
-
-}
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
index 7dea52ef1dd0d9ef701dba5f8bf800a924b85f52..ca676c7f5a34b135a408b2bbb040c176024c29e8 100644
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
@@ -5,19 +5,19 @@ import at.tuwien.api.container.ContainerCreateRequestDto;
 import at.tuwien.config.DockerUtil;
 import at.tuwien.config.ReadyConfig;
 import at.tuwien.entities.container.Container;
-import at.tuwien.entities.container.image.ContainerImage;
 import at.tuwien.exception.*;
+import at.tuwien.repository.jpa.ContainerImageEnvironmentItemRepository;
 import at.tuwien.repository.jpa.ContainerRepository;
 import at.tuwien.repository.jpa.ImageRepository;
 import at.tuwien.repository.jpa.UserRepository;
-import at.tuwien.service.impl.ContainerServiceImpl;
 import com.github.dockerjava.api.DockerClient;
-import com.github.dockerjava.api.command.CreateContainerResponse;
 import com.github.dockerjava.api.exception.NotModifiedException;
-import com.github.dockerjava.api.model.*;
+import com.github.dockerjava.api.model.Network;
 import lombok.extern.log4j.Log4j2;
 import org.apache.http.auth.BasicUserPrincipal;
-import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.AfterEach;
+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;
@@ -25,48 +25,45 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import org.springframework.transaction.annotation.Transactional;
-
 import java.security.Principal;
 import java.util.List;
+import java.util.Optional;
 
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+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
+@ExtendWith(SpringExtension.class)
 public class ContainerServiceIntegrationTest extends BaseUnitTest {
 
     @MockBean
     private ReadyConfig readyConfig;
 
     @MockBean
-    private UserService userService;
-
-    @Autowired
-    private UserRepository userRepository;
+    private ContainerRepository containerRepository;
 
     @Autowired
-    private ContainerServiceImpl containerService;
+    private ImageRepository imageRepository;
 
     @Autowired
-    private HostConfig hostConfig;
+    private ContainerImageEnvironmentItemRepository containerImageEnvironmentItemRepository;
 
     @Autowired
     private DockerClient dockerClient;
 
     @Autowired
-    private ImageRepository imageRepository;
+    private ContainerService containerService;
 
     @Autowired
-    private ContainerRepository containerRepository;
+    private DockerUtil dockerUtil;
 
     @Autowired
-    private DockerUtil dockerUtil;
+    private UserRepository userRepository;
 
-    @Transactional
     @BeforeEach
     public void beforeEach() {
         afterEach();
@@ -86,41 +83,14 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
                 .withEnableIpv6(false)
                 .exec();
 
-        /* create weather container */
-        final CreateContainerResponse request = dockerClient.createContainerCmd(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG)
-                .withHostConfig(hostConfig.withNetworkMode("fda-userdb"))
-                .withName(CONTAINER_1_INTERNALNAME)
-                .withIpv4Address(CONTAINER_1_IP)
-                .withHostName(CONTAINER_1_INTERNALNAME)
-                .withEnv("MARIADB_USER=mariadb", "MARIADB_PASSWORD=mariadb", "MARIADB_ROOT_PASSWORD=mariadb", "MARIADB_DATABASE=weather")
-                .exec();
-
-        /* set hash */
-        CONTAINER_1.setHash(request.getId());
-
         /* mock data */
-        log.debug("save image {}", ContainerImage.builder()
-                .id(IMAGE_1_ID)
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .hash(IMAGE_1_HASH)
-                .jdbcMethod(IMAGE_1_JDBC)
-                .dialect(IMAGE_1_DIALECT)
-                .driverClass(IMAGE_1_DRIVER)
-                .containers(List.of())
-                .compiled(IMAGE_1_BUILT)
-                .size(IMAGE_1_SIZE)
-                .environment(IMAGE_1_ENV)
-                .defaultPort(IMAGE_1_PORT)
-                .build());
+        userRepository.save(USER_1);
         imageRepository.save(IMAGE_1);
-        log.debug("save container {}", CONTAINER_1);
-        containerRepository.save(CONTAINER_1);
-        log.debug("save container {}", CONTAINER_2);
-        containerRepository.save(CONTAINER_2);
+        containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV);
+        IMAGE_1.setEnvironment(IMAGE_1_ENV);
+        containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV);
     }
 
-    @Transactional
     @AfterEach
     public void afterEach() {
         /* stop containers and remove them */
@@ -160,7 +130,10 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
         final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
 
         /* mock */
-        userRepository.save(USER_1);
+        when(containerRepository.findByInternalName(CONTAINER_1_INTERNALNAME))
+                .thenReturn(Optional.empty());
+        when(containerRepository.save(any(Container.class)))
+                .thenReturn(CONTAINER_1);
 
         /* test */
         final Container container = containerService.create(request, principal);
@@ -169,45 +142,7 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void create_multiple_succeeds()
-            throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException,
-            UserNotFoundException {
-        final ContainerCreateRequestDto request1 = ContainerCreateRequestDto.builder()
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .name(CONTAINER_1_NAME)
-                .build();
-        final ContainerCreateRequestDto request2 = ContainerCreateRequestDto.builder()
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .name(CONTAINER_2_NAME)
-                .build();
-        final ContainerCreateRequestDto request3 = ContainerCreateRequestDto.builder()
-                .repository(IMAGE_1_REPOSITORY)
-                .tag(IMAGE_1_TAG)
-                .name(CONTAINER_3_NAME)
-                .build();
-        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
-
-        /* mock */
-        userRepository.save(USER_1);
-
-        /* test */
-        final Container container1 = containerService.create(request1, principal);
-        assertEquals(CONTAINER_1_NAME, container1.getName());
-        assertEquals(1, userRepository.findAll().size());
-        final Container container2 = containerService.create(request2, principal);
-        assertEquals(CONTAINER_2_NAME, container2.getName());
-        assertEquals(1, userRepository.findAll().size());
-        final Container container3 = containerService.create(request3, principal);
-        assertEquals(CONTAINER_3_NAME, container3.getName());
-        assertEquals(1, userRepository.findAll().size());
-    }
-
-    @Test
-    public void create_conflictingNames_fails()
-            throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException,
-            UserNotFoundException {
+    public void create_conflictingNames_fails() {
         final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
                 .repository(IMAGE_1_REPOSITORY)
                 .tag(IMAGE_1_TAG)
@@ -216,8 +151,8 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
         final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
 
         /* mock */
-        userRepository.save(USER_1);
-        containerService.create(request, principal);
+        when(containerRepository.findByInternalName(CONTAINER_1_INTERNALNAME))
+                .thenReturn(Optional.of(CONTAINER_1));
 
         /* test */
         assertThrows(ContainerAlreadyExistsException.class, () -> {
@@ -226,38 +161,15 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void remove_hashNotFound_fails() {
-        final Container CONTAINER = Container.builder()
-                .id(CONTAINER_3_ID)
-                .name(CONTAINER_3_NAME)
-                .internalName(CONTAINER_3_INTERNALNAME)
-                .image(IMAGE_1)
-                .hash("deadbeef")
-                .created(CONTAINER_3_CREATED)
-                .build();
-
-        /* mock */
-        final Container container = containerRepository.save(CONTAINER);
-        log.debug("inserted container with id {}", container.getId());
-
-        /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerService.remove(CONTAINER_3_ID);
-        });
-    }
-
-    @Test
-    public void remove_alreadyRemoved_fails() throws DockerClientException, ContainerStillRunningException,
-            ContainerNotFoundException {
+    public void remove_alreadyRemoved_fails() {
 
         /* mock */
-        containerService.remove(CONTAINER_1_ID);
-        final Container container = containerRepository.save(CONTAINER_1);
-        log.debug("re-inserting container with id {}", container.getId());
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.empty());
 
         /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerService.remove(container.getId());
+        assertThrows(ContainerNotFoundException.class, () -> {
+            containerService.remove(CONTAINER_1_ID);
         });
     }
 
@@ -270,6 +182,8 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
                 .build();
         final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
 
+        /* mock */
+
         /* test */
         assertThrows(ImageNotFoundException.class, () -> {
             containerService.create(request, principal);
@@ -280,9 +194,11 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     @Test
     public void findById_notFound_fails() {
 
+        /* mock */
+
         /* test */
         assertThrows(ContainerNotFoundException.class, () -> {
-            containerService.find(CONTAINER_3_ID);
+            containerService.find(CONTAINER_1_ID);
         });
     }
 
@@ -290,7 +206,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void change_start_succeeds() throws DockerClientException, ContainerNotFoundException {
 
         /* mock */
-        dockerUtil.stopContainer(CONTAINER_1);
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
 
         /* test */
         containerService.start(CONTAINER_1_ID);
@@ -300,6 +218,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void change_stop_succeeds() throws DockerClientException, InterruptedException, ContainerNotFoundException {
 
         /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
         dockerUtil.startContainer(CONTAINER_1);
 
         /* test */
@@ -307,17 +228,38 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void change_stop_notFoundDocker_fails() {
+    public void change_startSavedButNotFound_fails() {
+
+        /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+
+        /* test */
+        assertThrows(DockerClientException.class, () -> {
+            containerService.start(CONTAINER_1_ID);
+        });
+    }
+
+    @Test
+    public void change_removeSavedButNotFound_fails() {
+
+        /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
 
         /* test */
         assertThrows(DockerClientException.class, () -> {
-            containerService.stop(CONTAINER_2_ID);
+            containerService.remove(CONTAINER_1_ID);
         });
     }
 
     @Test
     public void getAll_succeeds() {
 
+        /* mock */
+        when(containerRepository.findAll())
+                .thenReturn(List.of(CONTAINER_1, CONTAINER_2));
+
         /* test */
         final List<Container> response = containerService.getAll();
         assertEquals(2, response.size());
@@ -327,6 +269,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void remove_succeeds() throws DockerClientException, ContainerStillRunningException, ContainerNotFoundException {
 
         /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
         dockerUtil.stopContainer(CONTAINER_1);
 
         /* test */
@@ -338,7 +283,7 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
 
         /* test */
         assertThrows(ContainerNotFoundException.class, () -> {
-            containerService.remove(9999999L);
+            containerService.remove(CONTAINER_1_ID);
         });
     }
 
@@ -346,6 +291,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void remove_stillRunning_fails() throws InterruptedException {
 
         /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
         dockerUtil.startContainer(CONTAINER_1);
 
         /* test */
@@ -358,6 +306,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void change_alreadyRunning_fails() throws InterruptedException {
 
         /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
         dockerUtil.startContainer(CONTAINER_1);
 
         /* test */
@@ -370,18 +321,24 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void change_startNotFound_fails() {
 
         /* mock */
-        containerRepository.save(CONTAINER_3);
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.empty());
+        dockerUtil.createContainer(CONTAINER_1);
 
         /* test */
-        assertThrows(DockerClientException.class, () -> {
-            containerService.start(CONTAINER_3_ID);
+        assertThrows(ContainerNotFoundException.class, () -> {
+            containerService.start(CONTAINER_1_ID);
         });
     }
 
     @Test
-    public void change_alreadyStopped_fails() {
+    public void change_alreadyStopped_fails() throws InterruptedException {
 
         /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
+        dockerUtil.startContainer(CONTAINER_1);
         dockerUtil.stopContainer(CONTAINER_1);
 
         /* test */
@@ -391,10 +348,25 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void change_stoppedNotFound_fails() {
+    public void change_stopNeverStarted_fails() {
 
         /* mock */
-        dockerUtil.stopContainer(CONTAINER_1);
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
+
+        /* test */
+        assertThrows(DockerClientException.class, () -> {
+            containerService.stop(CONTAINER_1_ID);
+        });
+    }
+
+    @Test
+    public void change_stopSavedButNotFound_fails() {
+
+        /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
 
         /* test */
         assertThrows(DockerClientException.class, () -> {
@@ -407,6 +379,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
             ContainerNotRunningException {
 
         /* mock */
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
         dockerUtil.startContainer(CONTAINER_1);
 
         /* test */
@@ -420,8 +395,10 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     @Test
     public void inspect_notFound_fails() {
 
+        /* mock */
+
         /* test */
-        assertThrows(DockerClientException.class, () -> {
+        assertThrows(ContainerNotFoundException.class, () -> {
             containerService.inspect(CONTAINER_2_ID);
         });
     }
@@ -430,7 +407,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     public void inspect_notRunning_fails() {
 
         /* mock */
-        dockerUtil.stopContainer(CONTAINER_1);
+        when(containerRepository.findById(CONTAINER_1_ID))
+                .thenReturn(Optional.of(CONTAINER_1));
+        dockerUtil.createContainer(CONTAINER_1);
 
         /* test */
         assertThrows(ContainerNotRunningException.class, () -> {
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
index 6d11f4dbdc131d3d9b971fc2ed83f12325c8eeaa..0eb9ba72ef782b73621335b18481c24acba61e16 100644
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
@@ -4,8 +4,10 @@ import at.tuwien.BaseUnitTest;
 import at.tuwien.api.container.image.ImageCreateDto;
 import at.tuwien.config.ReadyConfig;
 import at.tuwien.exception.*;
+import at.tuwien.repository.jpa.ContainerImageEnvironmentItemRepository;
 import at.tuwien.repository.jpa.ContainerRepository;
 import at.tuwien.repository.jpa.ImageRepository;
+import at.tuwien.repository.jpa.UserRepository;
 import at.tuwien.service.impl.ImageServiceImpl;
 import lombok.extern.log4j.Log4j2;
 import org.apache.http.auth.BasicUserPrincipal;
@@ -38,14 +40,22 @@ public class ImageServiceIntegrationTest extends BaseUnitTest {
     @Autowired
     private ImageRepository imageRepository;
 
+    @Autowired
+    private UserRepository userRepository;
+
+    @Autowired
+    private ContainerImageEnvironmentItemRepository containerImageEnvironmentItemRepository;
+
     @Autowired
     private ContainerRepository containerRepository;
 
-    @Transactional
     @BeforeEach
     public void beforeEach() {
-        log.debug("save container {}", CONTAINER_1);
-        containerRepository.save(CONTAINER_1);
+        userRepository.save(USER_1);
+        imageRepository.save(IMAGE_1);
+        containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV);
+        IMAGE_1.setEnvironment(IMAGE_1_ENV);
+        containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV);
     }
 
     @Test
diff --git a/fda-container-service/rest-service/src/test/resources/application.properties b/fda-container-service/rest-service/src/test/resources/application.properties
index 88c58a85e34098a6ef1eddde183d20544dc6fb1c..9e91f5d06816149f227fac67a310e4074f67c564 100644
--- a/fda-container-service/rest-service/src/test/resources/application.properties
+++ b/fda-container-service/rest-service/src/test/resources/application.properties
@@ -15,4 +15,7 @@ spring.datasource.username=sa
 spring.datasource.password=password
 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
 spring.jpa.hibernate.ddl-auto=create-drop
-spring.jpa.show-sql=false
\ No newline at end of file
+spring.jpa.show-sql=false
+
+# additional logging
+logging.level.org.hibernate.SQL=DEBUG
\ No newline at end of file
diff --git a/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerImageEnvironmentItemRepository.java b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerImageEnvironmentItemRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa1504a292588a11911b831d415bf1f864d9246d
--- /dev/null
+++ b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerImageEnvironmentItemRepository.java
@@ -0,0 +1,10 @@
+package at.tuwien.repository.jpa;
+
+import at.tuwien.entities.container.image.ContainerImageEnvironmentItem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ContainerImageEnvironmentItemRepository extends JpaRepository<ContainerImageEnvironmentItem, Long> {
+
+}
diff --git a/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java
index 6df0ccdf73fd0ad1f7d8af2a5c58acff79d2fee5..37b8abb7735952160ae69ddb85c748441050a575 100644
--- a/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java
+++ b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java
@@ -4,9 +4,13 @@ import at.tuwien.entities.container.Container;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 @Repository
 public interface ContainerRepository extends JpaRepository<Container, Long> {
 
-    Container findByHash(String id);
+    Optional<Container> findByHash(String hash);
+
+    Optional<Container> findByInternalName(String internalName);
 
 }
diff --git a/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java b/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java
index 781da0442724a7de1034711315fd0804c4cf0dae..c5cbc523a9a0b671ce526efb025264f31ace729d 100644
--- a/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java
+++ b/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java
@@ -68,13 +68,19 @@ public class ContainerServiceImpl implements ContainerService {
             log.error("failed to get image with name {}:{}", createDto.getRepository(), createDto.getTag());
             throw new ImageNotFoundException("image was not found in metadata database.");
         }
-        /* save to metadata database */
+        /* entity */
         final Integer availableTcpPort = SocketUtils.findAvailableTcpPort(10000);
         Container container = new Container();
         container.setImage(image.get());
         container.setPort(availableTcpPort);
         container.setName(createDto.getName());
         container.setInternalName(containerMapper.containerToInternalContainerName(container));
+        /* check duplicate */
+        final Optional<Container> optional = containerRepository.findByInternalName(container.getInternalName());
+        if (optional.isPresent()) {
+            log.error("Failed to create container with internal name {}", container.getInternalName());
+            throw new ContainerAlreadyExistsException("Container name already exists");
+        }
         /* create the volume */
         final CreateVolumeResponse response = dockerClient.createVolumeCmd()
                 .withName(container.getInternalName())
diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java
index f67533167f75aebce7f051e46de7407a1c78a967..4997244bf2aeb9735a0cbbbe035185b71016302e 100644
--- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java
+++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java
@@ -1,6 +1,7 @@
 package at.tuwien.service;
 
 import at.tuwien.BaseUnitTest;
+import at.tuwien.config.IndexInitializer;
 import at.tuwien.config.ReadyConfig;
 import at.tuwien.exception.AmqpException;
 import at.tuwien.exception.BrokerVirtualHostCreationException;
@@ -22,6 +23,7 @@ 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.context.annotation.Profile;
+import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
@@ -35,14 +37,14 @@ import static at.tuwien.config.DockerConfig.hostConfig;
 @Log4j2
 @SpringBootTest
 @ExtendWith(SpringExtension.class)
-@ActiveProfiles("test-noelastic")
 public class AmqpServiceIntegrationTest extends BaseUnitTest {
 
-    private static final String AMQP_EXCHANGE = "fda";
-
     @MockBean
     private ReadyConfig readyConfig;
 
+    @MockBean
+    private IndexInitializer indexInitializer;
+
     @Autowired
     private Channel channel;
 
@@ -118,7 +120,7 @@ public class AmqpServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void createExchange_succeeds() throws AmqpException, IOException, BrokerVirtualHostCreationException {
+    public void createExchange_succeeds() throws AmqpException, IOException {
         final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
 
         /* mock */
diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
index fb0c55c42be8ec859f0176891d146fde7f947877..e52d86c4db5beac6907ae014395b9b14197abf3c 100644
--- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
+++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
@@ -3,6 +3,7 @@ package at.tuwien.service;
 import at.tuwien.BaseUnitTest;
 import at.tuwien.api.database.DatabaseCreateDto;
 import at.tuwien.config.DockerConfig;
+import at.tuwien.config.IndexInitializer;
 import at.tuwien.config.ReadyConfig;
 import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.Database;
@@ -45,6 +46,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
     @MockBean
     private ReadyConfig readyConfig;
 
+    @MockBean
+    private IndexInitializer indexInitializer;
+
     @MockBean
     private Channel channel;
 
diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
index eba11700e14884b430a014642f1c1d1ce4eb6eef..32f3229c2242120b37871ae286b5a1aa5146c1d4 100644
--- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
+++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
@@ -2,6 +2,7 @@ package at.tuwien.service;
 
 import at.tuwien.BaseUnitTest;
 import at.tuwien.api.database.DatabaseCreateDto;
+import at.tuwien.config.IndexInitializer;
 import at.tuwien.config.ReadyConfig;
 import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.Database;
@@ -39,12 +40,14 @@ import static org.mockito.Mockito.*;
 @Log4j2
 @SpringBootTest
 @ExtendWith(SpringExtension.class)
-@ActiveProfiles("test-noelastic")
 public class DatabaseServiceUnitTest extends BaseUnitTest {
 
     @MockBean
     private ReadyConfig readyConfig;
 
+    @MockBean
+    private IndexInitializer indexInitializer;
+
     @MockBean
     private Channel channel;
 
diff --git a/fda-database-service/rest-service/src/test/resources/application.properties b/fda-database-service/rest-service/src/test/resources/application.properties
index 727187fbfe6b863eb9dfc2acfc908e55b80d33b5..2040f94bc4b7e511582fe2d0be97a4ef5c0e1af4 100644
--- a/fda-database-service/rest-service/src/test/resources/application.properties
+++ b/fda-database-service/rest-service/src/test/resources/application.properties
@@ -17,7 +17,4 @@ spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
 spring.jpa.hibernate.ddl-auto=create-drop
 spring.jpa.show-sql=false
 
-# disable elasticsearch
-spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration
-
 spring.rabbitmq.host=broker-service
\ No newline at end of file
diff --git a/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java b/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java
index 5c6544af42f09c3f6809edaeefd9d6b02f2fd91e..de9c6663d06bdf7ccfbae7fc8b594d31a924503e 100644
--- a/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java
+++ b/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java
@@ -4,8 +4,6 @@ import at.tuwien.entities.database.Database;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.context.event.EventListener;
-import org.springframework.core.env.Environment;
-import org.springframework.core.env.Profiles;
 import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
 import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
 import org.springframework.stereotype.Component;
@@ -14,19 +12,14 @@ import org.springframework.stereotype.Component;
 @Log4j2
 public class IndexInitializer {
 
-    private final Environment environment;
     private final ElasticsearchOperations elasticsearchOperations;
 
-    public IndexInitializer(Environment environment, ElasticsearchOperations elasticsearchOperations) {
-        this.environment = environment;
+    public IndexInitializer(ElasticsearchOperations elasticsearchOperations) {
         this.elasticsearchOperations = elasticsearchOperations;
     }
 
     @EventListener(ApplicationReadyEvent.class)
     public void initIndex() {
-        if (environment.acceptsProfiles(Profiles.of("test-noelastic"))) {
-            return;
-        }
         log.debug("creating index");
         IndexCoordinates indexCoordinates = IndexCoordinates.of("databaseindex");
         if (!elasticsearchOperations.indexOps(indexCoordinates).exists()) {
diff --git a/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
index 3ce48e11a5e94b3ed2d37f62965e42d26097116d..49818d1e618c88587a8628561810c3c3df84985c 100644
--- a/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
+++ b/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
@@ -235,6 +235,7 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
+    @Transactional(readOnly = true)
     public void update_succeeds() throws IdentifierNotFoundException {
 
         /* test */
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java
index 48a8d47a4b3e23756fdf49ae3160bc0b45d16aba..35f755a7147f5e606f4dded54a78499f3ad87ced 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java
@@ -36,7 +36,7 @@ public class ContainerImageDate {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumn(name = "iid", insertable = false, updatable = false)
     private ContainerImage image;
 
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java
index 809766022d7485645550d56a4582595fcd9a03cf..208c2143cdbe26817ef19ee812eca4ba62c49406 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java
@@ -46,6 +46,13 @@ public class ContainerImageEnvironmentItem {
     @Enumerated(EnumType.STRING)
     private ContainerImageEnvironmentItemType type;
 
+    @org.springframework.data.annotation.Transient
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @JoinColumns({
+            @JoinColumn(name = "iid", referencedColumnName = "id", insertable = false, updatable = false)
+    })
+    private ContainerImage image;
+
     @Column(nullable = false, updatable = false)
     @CreatedDate
     private Instant created;
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java
index 14466a12bd8d992f339a6367f96455fd5a67cae8..056311dedf7ae868176ea99e6d2613cbddd3d8b5 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java
@@ -46,7 +46,7 @@ public class View {
     private User creator;
 
     @org.springframework.data.annotation.Transient
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumn(name = "vdbid", insertable = false, updatable = false)
     private Database database;
 
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java
index c19555325c5f5baa2564deb10b048aba0f33b9d7..3dd66a573cb2f4b4b21acd21d868038e5b7ee07f 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java
@@ -63,11 +63,11 @@ public class Table {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumn(name = "tdbid", insertable = false, updatable = false)
     private Database database;
 
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, mappedBy = "table")
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH, mappedBy = "table")
     @OrderBy("ordinalPosition")
     private List<TableColumn> columns;
 
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
index 18412a2792a1f9f9a37c560a77fc00015de5b437..8ea2472b4bf0c5cd82bcdd21d4129515a38a1d8c 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
@@ -52,13 +52,13 @@ public class TableColumn implements Comparable<TableColumn> {
     private Long dfid;
 
     @ToString.Exclude
-    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumn(name = "dfid", referencedColumnName = "id", insertable = false, updatable = false)
     private ContainerImageDate dateFormat;
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumns({
             @JoinColumn(name = "tid", referencedColumnName = "id", insertable = false, updatable = false),
             @JoinColumn(name = "cdbid", referencedColumnName = "tdbid", insertable = false, updatable = false)
@@ -117,7 +117,7 @@ public class TableColumn implements Comparable<TableColumn> {
     @CreatedDate
     private Instant created;
 
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinTable(name = "mdb_columns_concepts",
             joinColumns = {
                     @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false),
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java
index 733b2c6b146340798d87381f979cc8e433c715b5..01f0334edc5de67f4a7bef976a5a44a2add1a330 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java
@@ -29,7 +29,7 @@ public class Concept {
 
     @org.springframework.data.annotation.Transient
     @ToString.Exclude
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinTable(name = "mdb_columns_concepts",
             joinColumns = @JoinColumn(name = "uri"),
             inverseJoinColumns = {
diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
index 2fd30300602a791c7ea64856564685e496e2a824..14e2762a4d74330a57c1135f4b266c96e14f4408 100644
--- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
+++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
@@ -71,7 +71,7 @@ public class Identifier {
     @Enumerated(EnumType.STRING)
     private LanguageType language;
 
-    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumns({
             @JoinColumn(name = "License", referencedColumnName = "identifier")
     })
@@ -118,7 +118,7 @@ public class Identifier {
     @Enumerated(EnumType.STRING)
     private VisibilityType visibility = VisibilityType.SELF;
 
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumns({
             @JoinColumn(name = "iid", referencedColumnName = "id", insertable = false, updatable = false)
     })
diff --git a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java
index 7e29b0f91ecbd10dd5e9f81a2c5a9d5498d39a5c..3565d547b25dd01edce92ab8203861b2ad26a0fd 100644
--- a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java
+++ b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java
@@ -79,7 +79,7 @@ public class Query implements Serializable {
     @javax.persistence.Column(nullable = false)
     private Long createdBy;
 
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     private List<at.tuwien.querystore.Table> tables;
 
     @javax.persistence.Column(name = "last_modified")
diff --git a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java
index c4628e1185ebbae3eb3cb39d6c45644853668f85..88f672568f499b42102d2ff06d2794d56ad973c0 100644
--- a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java
+++ b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java
@@ -35,7 +35,7 @@ public class Table implements Serializable {
     @javax.persistence.Column(nullable = false)
     private Long dbid;
 
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     private List<at.tuwien.querystore.Column> columns;
 
     @javax.persistence.Column(nullable = false, updatable = false)