diff --git a/pom.xml b/pom.xml
index 1ac34c171e325ccea378cf62d835cbfa0314e526..22df26f5a2ece718bdff3027ef0ae9865625b4e6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,6 +74,7 @@
         <vanilla-picker.version>2.12.1</vanilla-picker.version>
         <jacoco-maven-plugin.version>0.8.8</jacoco-maven-plugin.version>
         <dependency-check-maven.version>6.5.3</dependency-check-maven.version>
+        <testcontainer.version>1.16.3</testcontainer.version>
 
         <app.versionDate>${maven.build.timestamp}</app.versionDate>
         <maven.build.timestamp.format>dd.MM.yy</maven.build.timestamp.format>
@@ -253,6 +254,19 @@
             <artifactId>mockito-inline</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>${testcontainer.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>${testcontainer.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java
index 987558e5faf26a9d3493529d6512c808229b1f08..5861dea82bb760091aeb88b93f2692754e8a0402 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java
@@ -17,7 +17,7 @@ public class DatabaseConfigurationProperties
 
 	@Min(1)
 	@Max(65536)
-	private int port;
+	private Integer port;
 
 	@NotBlank
 	private String databaseName;
@@ -48,12 +48,12 @@ public class DatabaseConfigurationProperties
 		this.hostname = hostname;
 	}
 
-	public int getPort()
+	public Integer getPort()
 	{
 		return port;
 	}
 
-	public void setPort(int port)
+	public void setPort(Integer port)
 	{
 		this.port = port;
 	}
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/EnsureAllIconizableHaveAnIconInstanceTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/EnsureAllIconizableHaveAnIconInstanceTest.java
index 2f790b17f151a6cebd900800d3b9e015a441b0c8..9f96e87e51c3bbeaac11776261fec031266edae3 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/EnsureAllIconizableHaveAnIconInstanceTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/EnsureAllIconizableHaveAnIconInstanceTest.java
@@ -30,7 +30,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 @SpringBootTest(classes = Main.class)
 @Import(EnsureAllIconizableHaveAnIconInstanceTest.TestDatabaseConfiguration.class)
 @ActiveProfiles("test")
-@SeleniumTest
 @Transactional
 class EnsureAllIconizableHaveAnIconInstanceTest
 {
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestBase.java b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestBase.java
index cab15704c65752f1015f8d0da0c6907b6f0a20f5..cea7734e109fddc22f3ad28b7f84c81981b25602 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestBase.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestBase.java
@@ -1,45 +1,63 @@
 package de.deadlocker8.budgetmaster.integration.helpers;
 
 import de.deadlocker8.budgetmaster.Main;
-import org.junit.jupiter.api.*;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.BeforeEach;
 import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.firefox.FirefoxDriver;
-import org.openqa.selenium.firefox.FirefoxOptions;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
 
+
+@Testcontainers
 @SpringBootTest(classes = Main.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-@ExtendWith(SeleniumTestWatcher.class)
 @DirtiesContext
 @SeleniumTest
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-public class SeleniumTestBase
+@ActiveProfiles("test")
+public abstract class SeleniumTestBase
 {
+	@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+	@Autowired
 	protected WebDriver driver;
 
 	@LocalServerPort
 	protected int port;
 
-	@Order(1)
-	@BeforeAll
-	public void init()
-	{
-		FirefoxOptions options = new FirefoxOptions();
-		options.setHeadless(false);
-		options.addPreference("devtools.console.stdout.content", true);
-		driver = new FirefoxDriver(options);
-		driver.manage().window().maximize();
-	}
+	private static boolean isDatabaseAlreadyImported = false;
+
+	@Container
+	static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2")
+			.withDatabaseName("budgetmaster-tests-db")
+			.withUsername("budgetmaster")
+			.withPassword("BudgetMaster");
+
 
-	@AfterAll
-	public void afterAll() {
-		driver.quit();
+	@DynamicPropertySource
+	static void properties(DynamicPropertyRegistry registry)
+	{
+		registry.add("spring.datasource.url", postgresDB::getJdbcUrl);
+		registry.add("spring.datasource.username", postgresDB::getUsername);
+		registry.add("spring.datasource.password", postgresDB::getPassword);
 	}
 
-	public WebDriver getDriver()
+	@BeforeEach
+	public void beforeEach()
 	{
-		return driver;
+		if(isDatabaseAlreadyImported)
+		{
+			return;
+		}
+
+		importDatabaseOnce();
+
+		isDatabaseAlreadyImported = true;
 	}
+
+	protected abstract void importDatabaseOnce();
 }
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java
index 6e47428c68c70d399dae32deb13181e08c8bcd65..8cac01aade650f5d0d6270712baf1c57ade85f08 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java
@@ -1,18 +1,20 @@
 package de.deadlocker8.budgetmaster.integration.helpers;
 
-import de.thecodelabs.utils.util.Localization;
-import de.thecodelabs.utils.util.SystemUtils;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.firefox.FirefoxOptions;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.core.Ordered;
 import org.springframework.test.context.TestContext;
 import org.springframework.test.context.support.AbstractTestExecutionListener;
 
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
 
 public class SeleniumTestExecutionListener extends AbstractTestExecutionListener
 {
+	private WebDriver driver;
+
 	@Override
 	public int getOrder()
 	{
@@ -26,19 +28,45 @@ public class SeleniumTestExecutionListener extends AbstractTestExecutionListener
 		{
 			throw new RuntimeException("Test profile not activated. Skipping tests. (Set -DtestProfile=true in your VM arguments)");
 		}
+
+		if(driver != null)
+		{
+			return;
+		}
+
+		// allow driver to be Autowired
+		final ApplicationContext context = testContext.getApplicationContext();
+		if(context instanceof final ConfigurableApplicationContext configurableApplicationContext)
+		{
+			FirefoxOptions options = new FirefoxOptions();
+			options.setHeadless(false);
+			options.addPreference("devtools.console.stdout.content", true);
+			driver = new FirefoxDriver(options);
+			driver.manage().window().maximize();
+
+			ConfigurableListableBeanFactory factory = configurableApplicationContext.getBeanFactory();
+			factory.registerResolvableDependency(WebDriver.class, driver);
+		}
 	}
 
 	@Override
 	public void afterTestClass(TestContext testContext)
 	{
-		final Path path = SystemUtils.getApplicationSupportDirectoryPath(Localization.getString("folder"), "test", "budgetmaster.mv.db");
-		try
+		if(driver != null)
 		{
-			Files.deleteIfExists(path);
+			driver.quit();
 		}
-		catch(IOException e)
+	}
+
+	@Override
+	public void afterTestMethod(TestContext testContext)
+	{
+		final boolean isSuccess = testContext.getTestException() == null;
+		if(isSuccess)
 		{
-			e.printStackTrace();
+			return;
 		}
+
+		IntegrationTestHelper.saveScreenshots(driver, testContext.getTestMethod().getName(), testContext.getTestClass().getSimpleName());
 	}
 }
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestWatcher.java b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestWatcher.java
deleted file mode 100644
index be160519b52a2e0c1f72a1fbbeca7fef67def736..0000000000000000000000000000000000000000
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestWatcher.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.deadlocker8.budgetmaster.integration.helpers;
-
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.api.extension.TestWatcher;
-import org.openqa.selenium.WebDriver;
-
-public class SeleniumTestWatcher implements TestWatcher
-{
-	@Override
-	public void testFailed(ExtensionContext context, Throwable cause)
-	{
-		final WebDriver driver = getDriver(context);
-		IntegrationTestHelper.saveScreenshots(driver, context.getRequiredTestMethod().getName(), context.getRequiredTestClass().getSimpleName());
-	}
-
-	private WebDriver getDriver(ExtensionContext context)
-	{
-		final SeleniumTestBase testInstance = (SeleniumTestBase) context.getRequiredTestInstance();
-		return testInstance.getDriver();
-	}
-}
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java
index 6e157e18097d760851f8b8e5139fd6f740e4f91c..a2046e61caaf31c403db30dd091dae893b473ad8 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/AccountTest.java
@@ -8,7 +8,6 @@ import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTestBase;
 import de.deadlocker8.budgetmaster.integration.helpers.TransactionTestHelper;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.openqa.selenium.By;
 import org.openqa.selenium.JavascriptExecutor;
@@ -24,12 +23,13 @@ import java.util.stream.Collectors;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+
 class AccountTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
@@ -37,7 +37,7 @@ class AccountTest extends SeleniumTestBase
 		helper.hideBackupReminder();
 		helper.hideWhatsNewDialog();
 
-		String path = getClass().getClassLoader().getResource("AccountDatabase.json").getFile().replace("/", File.separator);
+		String path = Account.class.getClassLoader().getResource("AccountDatabase.json").getFile().replace("/", File.separator);
 
 		final Account account1 = new Account("DefaultAccount0815", AccountType.CUSTOM);
 		final Account account2 = new Account("sfsdf", AccountType.CUSTOM);
@@ -79,7 +79,6 @@ class AccountTest extends SeleniumTestBase
 		}
 	}
 
-
 	@Test
 	void test_newAccount_cancel()
 	{
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CategorySelectTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CategorySelectTest.java
index a9d6698e73fa65084f6506f70884dda093b3d246..f10ceaf05374738e5ea81c953e696597c698fc11 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CategorySelectTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/CategorySelectTest.java
@@ -5,7 +5,6 @@ import de.deadlocker8.budgetmaster.accounts.AccountType;
 import de.deadlocker8.budgetmaster.authentication.UserService;
 import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTestBase;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.openqa.selenium.By;
@@ -23,10 +22,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class CategorySelectTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChangeTransactionTypeTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChangeTransactionTypeTest.java
index d7240a35b29f821730bf365ff1b5e11265c71eea..b90cd5e35e7dd1ec5b01c3cf59b3bd335c45a1a6 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChangeTransactionTypeTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChangeTransactionTypeTest.java
@@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 class ChangeTransactionTypeTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
 	private void openTransferTypeModal(int transactionID)
 	{
@@ -52,8 +52,8 @@ class ChangeTransactionTypeTest extends SeleniumTestBase
 		assertThat(driver.findElement(By.id("modalChangeTransactionType")).isDisplayed()).isTrue();
 	}
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChartTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChartTest.java
index d6a4adffa48fdb1668d6ae169219241561618cdb..9174c3d423eb22ab84727f8dcd454100ce2686da 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChartTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ChartTest.java
@@ -29,10 +29,10 @@ class ChartTest extends SeleniumTestBase
 	private final String SELECTOR_VISIBLE_CHART_PREVIEWS = ".chart-preview-column:not(.hidden)";
 	private final String SELECTOR_ACTIVE_CHART_PREVIEWS = ".chart-preview.active";
 
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FirstUseTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FirstUseTest.java
index 9280101949f78594b37fba0687611ad588ff662f..cb7ea85af95638700697294fca4b1d506aa252b8 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FirstUseTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/FirstUseTest.java
@@ -15,10 +15,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class FirstUseTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void prepare()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/HotkeyTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/HotkeyTest.java
index 14b6770ed29574963b28e51958dfee82573c58b3..48abdb7d198382d7cd9b12f92369ef4027e44567 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/HotkeyTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/HotkeyTest.java
@@ -28,10 +28,10 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
 
 class HotkeyTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void prepare()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ImportTest.java
deleted file mode 100644
index 13622fe6e84c63be7600e0ac7b95f16d53837fc2..0000000000000000000000000000000000000000
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/ImportTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package de.deadlocker8.budgetmaster.integration.selenium;
-
-import de.deadlocker8.budgetmaster.accounts.Account;
-import de.deadlocker8.budgetmaster.accounts.AccountType;
-import de.deadlocker8.budgetmaster.authentication.UserService;
-import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
-import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTestBase;
-import org.junit.jupiter.api.Test;
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebElement;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ImportTest extends SeleniumTestBase
-{
-	@Test
-	void requestImport()
-	{
-		IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
-		helper.start();
-		helper.login(UserService.DEFAULT_PASSWORD);
-		helper.hideBackupReminder();
-		helper.hideWhatsNewDialog();
-
-		String path = getClass().getClassLoader().getResource("SearchDatabase.json").getFile().replace("/", File.separator);
-		List<String> sourceAccounts = Arrays.asList("DefaultAccount0815", "sfsdf");
-		final Account account1 = new Account("DefaultAccount0815", AccountType.CUSTOM);
-		final Account account2 = new Account("Account2", AccountType.CUSTOM);
-		helper.uploadDatabase(path, sourceAccounts, List.of(account1, account2));
-
-		// assert
-		driver.get(helper.getUrl() + "/accounts");
-		List<WebElement> accountRows = driver.findElements(By.cssSelector(".account-container tr"));
-		assertThat(accountRows).hasSize(3);
-	}
-}
\ No newline at end of file
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
index b12bd58e540fc670a3cd3c87becff4d253e4beaa..0b3bdfb8af214e9e8a6eeb2d84a64bed70400691 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
@@ -18,6 +18,13 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class LoginControllerTest extends SeleniumTestBase
 {
+	private static IntegrationTestHelper helper;
+
+	@Override
+	protected void importDatabaseOnce()
+	{
+	}
+
 	@Test
 	void test_getLoginPage()
 	{
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java
index 67d47041e1854f03ae23eec8ec6c9ddd3597ade9..79f7f8e1069e50c4ef67905b6a35ffcce77e47b8 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/MediaTest.java
@@ -23,10 +23,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class MediaTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java
index ccad71306fa01479505856e8e7207762e63e304b..34931249fe36fb7d0a691f79eec1ddbe7cf9b45f 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java
@@ -24,10 +24,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class NewTransactionFromExistingOneTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromTemplateTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromTemplateTest.java
index 21d125159b191ed6945e58732dd7cd9fcf11bbd9..78c9dee872008aaebb49fdc62f2606cff58ad846 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromTemplateTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromTemplateTest.java
@@ -24,10 +24,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class NewTransactionFromTemplateTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java
index ff6a77a1b4e79611378495c1d811e061c7ed9b99..aac60ef3a8fe131104e96131560fa614a96a7c49 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java
@@ -26,10 +26,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class NewTransactionNormalTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java
index 894dc4cf750d6a6c1a9a6c0c2601bf48c3108913..2a0149ff54a93e0ecfda19e902f936827e690ec9 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java
@@ -27,10 +27,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class NewTransactionRecurringTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeALl()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java
index b02047e0c8ae6e807536b88b072bb94c45005c83..09de62e76648366140fd45584213a6bfbab6ae7d 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java
@@ -28,10 +28,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 class NewTransactionTransferTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void prepare()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/SearchTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/SearchTest.java
index 1c9064330c7eed7789520596c8e427c04798d473..bc733b0abb0c7cd70a3679a4dd40fd94cfc36bcc 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/SearchTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/SearchTest.java
@@ -21,8 +21,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class SearchTest extends SeleniumTestBase
 {
-	@BeforeAll
-	public void prepare()
+	private static IntegrationTestHelper helper;
+
+	@Override
+	protected void importDatabaseOnce()
 	{
 		IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/TagTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/TagTest.java
index 40f63a8c06fa0477f733c03966cbb11c9a91b528..ea028e26f6ce03da4c233a31e4930c75d951e15a 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/TagTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/TagTest.java
@@ -19,10 +19,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class TagTest extends SeleniumTestBase
 {
-	private IntegrationTestHelper helper;
+	private static IntegrationTestHelper helper;
 
-	@BeforeAll
-	public void beforeAll()
+	@Override
+	protected void importDatabaseOnce()
 	{
 		helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/WhatsNewTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/WhatsNewTest.java
index 2cd3316de6516727eef72e5722beb161ba0f3ef7..24612969056dd2e0294b89883a87b5b7d71bbd96 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/WhatsNewTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/WhatsNewTest.java
@@ -15,8 +15,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class WhatsNewTest extends SeleniumTestBase
 {
-	@BeforeAll
-	public void prepare()
+	private static IntegrationTestHelper helper;
+
+	@Override
+	protected void importDatabaseOnce()
 	{
 		IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
 		helper.start();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
index 2338726d6d959a43562a4333830139cd31e0c0aa..4055c139d234353815a1ad9f92e9c6508435db10 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
@@ -6,8 +6,11 @@ import de.deadlocker8.budgetmaster.accounts.AccountType;
 import de.deadlocker8.budgetmaster.filter.FilterConfiguration;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTest;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
+import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
 import de.deadlocker8.budgetmaster.transactions.TransactionService;
 import de.deadlocker8.budgetmaster.utils.DateHelper;
+import de.thecodelabs.utils.util.SystemUtils;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
@@ -23,8 +26,10 @@ import org.springframework.core.io.Resource;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.EntityManager;
 import javax.sql.DataSource;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.time.LocalDate;
 import java.util.List;
 
@@ -33,7 +38,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 @SpringBootTest(classes = Main.class)
 @Import(TransactionServiceDatabaseTest.TestDatabaseConfiguration.class)
 @ActiveProfiles("test")
-@SeleniumTest
 @Transactional
 class TransactionServiceDatabaseTest
 {
@@ -59,6 +63,9 @@ class TransactionServiceDatabaseTest
 	@Autowired
 	private AccountRepository accountRepository;
 
+	@Autowired
+	DataSource dataSource;
+
 	@Test
 	void test_deleteAll()
 	{
diff --git a/src/test/resources/repeating_with_tags.mv.db b/src/test/resources/repeating_with_tags.mv.db
index a412f66a685ceaf5a5c6990e38798e1ca0c3f139..773368dcd7040eee3822562ee75236b3036ea45b 100644
Binary files a/src/test/resources/repeating_with_tags.mv.db and b/src/test/resources/repeating_with_tags.mv.db differ