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
new file mode 100644
index 0000000000000000000000000000000000000000..6d11f4dbdc131d3d9b971fc2ed83f12325c8eeaa
--- /dev/null
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
@@ -0,0 +1,134 @@
+package at.tuwien.service;
+
+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.ContainerRepository;
+import at.tuwien.repository.jpa.ImageRepository;
+import at.tuwien.service.impl.ImageServiceImpl;
+import lombok.extern.log4j.Log4j2;
+import org.apache.http.auth.BasicUserPrincipal;
+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.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.security.Principal;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@Log4j2
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
+@ExtendWith(SpringExtension.class)
+@SpringBootTest
+public class ImageServiceIntegrationTest extends BaseUnitTest {
+
+    @MockBean
+    private ReadyConfig readyConfig;
+
+    @Autowired
+    private ImageServiceImpl imageService;
+
+    @Autowired
+    private ImageRepository imageRepository;
+
+    @Autowired
+    private ContainerRepository containerRepository;
+
+    @Transactional
+    @BeforeEach
+    public void beforeEach() {
+        log.debug("save container {}", CONTAINER_1);
+        containerRepository.save(CONTAINER_1);
+    }
+
+    @Test
+    public void create_succeeds()
+            throws ImageAlreadyExistsException, DockerClientException, ImageNotFoundException, UserNotFoundException {
+        final ImageCreateDto request = ImageCreateDto.builder()
+                .repository(IMAGE_2_REPOSITORY)
+                .tag(IMAGE_2_TAG)
+                .dialect(IMAGE_2_DIALECT)
+                .driverClass(IMAGE_2_DRIVER)
+                .jdbcMethod(IMAGE_2_JDBC)
+                .defaultPort(IMAGE_2_PORT)
+                .environment(IMAGE_1_ENV_DTO)
+                .build();
+        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
+
+        /* test */
+        imageService.create(request, principal);
+    }
+
+    @Test
+    public void inspect_notFound_fails() {
+
+        /* test */
+        assertThrows(ImageNotFoundException.class, () -> {
+            imageService.inspect("abcdefu", "999.999");
+        });
+    }
+
+    @Test
+    public void create_notFound_fails() {
+        final ImageCreateDto request = ImageCreateDto.builder()
+                .repository("s0m3th1ng_n0t3x1st1ng")
+                .tag("d3v_h3ll")
+                .dialect(IMAGE_1_DIALECT)
+                .driverClass(IMAGE_1_DRIVER)
+                .jdbcMethod(IMAGE_1_JDBC)
+                .defaultPort(IMAGE_1_PORT)
+                .environment(IMAGE_1_ENV_DTO)
+                .build();
+        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
+
+        /* test */
+        assertThrows(ImageNotFoundException.class, () -> {
+            imageService.create(request, principal);
+        });
+    }
+
+    @Test
+    public void create_duplicate_fails() {
+        final ImageCreateDto request = ImageCreateDto.builder()
+                .repository(IMAGE_1_REPOSITORY)
+                .tag(IMAGE_1_TAG)
+                .defaultPort(IMAGE_1_PORT)
+                .driverClass(IMAGE_1_DRIVER)
+                .jdbcMethod(IMAGE_1_JDBC)
+                .dialect(IMAGE_1_DIALECT)
+                .environment(IMAGE_1_ENV_DTO)
+                .build();
+        final Principal principal = new BasicUserPrincipal(USER_1_USERNAME);
+
+        /* test */
+        assertThrows(ImageAlreadyExistsException.class, () -> {
+            imageService.create(request, principal);
+        });
+    }
+
+    @Test
+    public void delete_hasContainer_succeeds() throws ImageNotFoundException, PersistenceException {
+
+        /* test */
+        imageService.delete(IMAGE_1_ID);
+        assertTrue(imageRepository.findById(IMAGE_1_ID).isEmpty());
+        assertTrue(containerRepository.findById(CONTAINER_1_ID).isPresent()); /* container should NEVER be deletable in the metadata db */
+    }
+
+    @Test
+    public void delete_noContainer_succeeds() throws ImageNotFoundException, PersistenceException {
+        imageRepository.save(IMAGE_1);
+
+        /* test */
+        imageService.delete(IMAGE_1_ID);
+        assertTrue(imageRepository.findById(IMAGE_1_ID).isEmpty());
+    }
+
+}
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1646f96efd2a463771e98eb1dfbfac4240fe3a9
--- /dev/null
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java
@@ -0,0 +1,183 @@
+package at.tuwien.service;
+
+import at.tuwien.BaseUnitTest;
+import at.tuwien.api.container.image.ImageChangeDto;
+import at.tuwien.api.container.image.ImageCreateDto;
+import at.tuwien.config.ReadyConfig;
+import at.tuwien.entities.container.image.ContainerImage;
+import at.tuwien.exception.*;
+import at.tuwien.repository.jpa.ImageRepository;
+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.test.context.junit.jupiter.SpringExtension;
+
+import javax.persistence.EntityNotFoundException;
+import javax.validation.ConstraintViolationException;
+import java.security.Principal;
+import java.util.List;
+import java.util.Optional;
+
+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.*;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest
+public class ImageServiceUnitTest extends BaseUnitTest {
+
+    @MockBean
+    private ReadyConfig readyConfig;
+
+    @Autowired
+    private ImageServiceImpl imageService;
+
+    @MockBean
+    private ImageRepository imageRepository;
+
+    @Test
+    public void getAll_succeeds() {
+
+        /* mock */
+        when(imageRepository.findAll())
+                .thenReturn(List.of(IMAGE_1));
+
+        /* test */
+        final List<ContainerImage> response = imageService.getAll();
+        assertEquals(1, response.size());
+        assertEquals(IMAGE_1_REPOSITORY, response.get(0).getRepository());
+        assertEquals(IMAGE_1_TAG, response.get(0).getTag());
+    }
+
+    @Test
+    public void getById_succeeds() throws ImageNotFoundException {
+
+        /* mock */
+        when(imageRepository.findById(IMAGE_1_ID))
+                .thenReturn(Optional.of(IMAGE_1));
+
+        /* test */
+        final ContainerImage response = imageService.find(IMAGE_1_ID);
+        assertEquals(IMAGE_1_REPOSITORY, response.getRepository());
+        assertEquals(IMAGE_1_TAG, response.getTag());
+    }
+
+    @Test
+    public void getById_notFound_fails() {
+
+        /* mock */
+        when(imageRepository.findById(IMAGE_1_ID))
+                .thenReturn(Optional.empty());
+
+        /* test */
+        assertThrows(ImageNotFoundException.class, () -> {
+            imageService.find(IMAGE_1_ID);
+        });
+    }
+
+    @Test
+    public void create_duplicate_fails() {
+        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(imageRepository.save(any(ContainerImage.class)))
+                .thenThrow(ConstraintViolationException.class);
+
+        /* test */
+        assertThrows(ImageAlreadyExistsException.class, () -> {
+            imageService.create(request, principal);
+        });
+    }
+
+    @Test
+    public void update_succeeds() throws ImageNotFoundException, DockerClientException {
+        final ImageChangeDto request = ImageChangeDto.builder()
+                .environment(IMAGE_1_ENV_DTO)
+                .defaultPort(IMAGE_1_PORT)
+                .build();
+
+        /* mock */
+        when(imageRepository.findById(IMAGE_1_ID))
+                .thenReturn(Optional.of(IMAGE_1));
+        when(imageRepository.save(any()))
+                .thenReturn(IMAGE_1);
+
+        /* test */
+        final ContainerImage response = imageService.update(IMAGE_1_ID, request);
+        assertEquals(IMAGE_1_REPOSITORY, response.getRepository());
+        assertEquals(IMAGE_1_TAG, response.getTag());
+    }
+
+    @Test
+    public void update_port_succeeds() throws ImageNotFoundException, DockerClientException {
+        final ImageChangeDto request = ImageChangeDto.builder()
+                .environment(IMAGE_1_ENV_DTO)
+                .defaultPort(9999)
+                .build();
+
+        /* mock */
+        when(imageRepository.findById(IMAGE_1_ID))
+                .thenReturn(Optional.of(IMAGE_1));
+        when(imageRepository.save(any()))
+                .thenReturn(IMAGE_1);
+
+        /* test */
+        final ContainerImage response = imageService.update(IMAGE_1_ID, request);
+        assertEquals(IMAGE_1_REPOSITORY, response.getRepository());
+        assertEquals(IMAGE_1_TAG, response.getTag());
+    }
+
+    @Test
+    public void update_notFound_fails() {
+        final ImageChangeDto request = ImageChangeDto.builder()
+                .environment(IMAGE_1_ENV_DTO)
+                .defaultPort(IMAGE_1_PORT)
+                .build();
+
+        /* mock */
+        when(imageRepository.findById(IMAGE_1_ID))
+                .thenReturn(Optional.empty());
+
+        /* test */
+        assertThrows(ImageNotFoundException.class, () -> {
+            imageService.update(IMAGE_1_ID, request);
+        });
+    }
+
+    @Test
+    public void delete_succeeds() throws ImageNotFoundException, PersistenceException {
+
+        /* mock */
+        doNothing()
+                .when(imageRepository)
+                .deleteById(IMAGE_1_ID);
+
+        /* test */
+        imageService.delete(IMAGE_1_ID);
+    }
+
+    @Test
+    public void delete_notFound_fails() {
+
+        /* mock */
+        doThrow(EntityNotFoundException.class)
+                .when(imageRepository)
+                .deleteById(IMAGE_1_ID);
+
+        /* test */
+        assertThrows(ImageNotFoundException.class, () -> {
+            imageService.delete(IMAGE_1_ID);
+        });
+    }
+}