diff --git a/BudgetMasterServer/pom.xml b/BudgetMasterServer/pom.xml
index 982d787d386a12ec1c5dbe3cdb9be28917a80ff6..658ae891c65ae3eaf80e70fc0396bce5136fcf88 100644
--- a/BudgetMasterServer/pom.xml
+++ b/BudgetMasterServer/pom.xml
@@ -26,19 +26,21 @@
     <properties>
         <jlibs.version>3.2.0</jlibs.version>
         <versionizer.version>3.0.1</versionizer.version>
-        <webjars-locator.version>0.42</webjars-locator.version>
+        <webjars-locator.version>0.45</webjars-locator.version>
         <jquery.version>3.6.0</jquery.version>
         <materializecss.version>1.0.0</materializecss.version>
-        <fontawesome.version>6.0.0</fontawesome.version>
+        <fontawesome.version>6.1.0</fontawesome.version>
         <sortablejs.version>1.14.0</sortablejs.version>
         <mousetrap.version>1.6.5</mousetrap.version>
         <codemirror.version>5.62.2</codemirror.version>
-        <selenium.version>4.1.2</selenium.version>
-        <jgit.version>6.0.0.202111291000-r</jgit.version>
+        <selenium.version>4.1.3</selenium.version>
+        <assertj-core.version>3.22.0</assertj-core.version>
+        <jgit.version>6.1.0.202203080745-r</jgit.version>
         <natorder.version>1.1.2</natorder.version>
-        <itextpdf.version>5.5.13.2</itextpdf.version>
+        <h2database.version>1.4.199</h2database.version>
+        <itextpdf.version>5.5.13.3</itextpdf.version>
         <vanilla-picker.version>2.12.1</vanilla-picker.version>
-        <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version>
+        <jacoco-maven-plugin.version>0.8.8</jacoco-maven-plugin.version>
         <dependency-check-maven.version>6.5.3</dependency-check-maven.version>
 
         <project.outputDirectory>build/${project.version}</project.outputDirectory>
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/AccountImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/CategoryImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ChartImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/IconImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ImageImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/ItemImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TagImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateGroupImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TemplateImporter.java
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java
similarity index 100%
rename from src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/importer/TransactionImporter.java
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
index f6802ec3993518b8c1caf6c49a38ea39da8f5461..b32b09ce91128268bf789de87954063b745fef24 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
@@ -35,6 +35,7 @@ import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
 import de.deadlocker8.budgetmaster.utils.Strings;
 import de.thecodelabs.utils.util.Localization;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,14 +43,21 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.SpyBean;
 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.springframework.transaction.annotation.Transactional;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
 
+import javax.persistence.EntityManager;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.text.MessageFormat;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
@@ -59,9 +67,38 @@ import static org.assertj.core.api.Assertions.assertThat;
 @SpringBootTest(classes = Main.class)
 @ActiveProfiles("test")
 @Transactional
+@Testcontainers
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 class ImportServiceTest
 {
+	@Container
+	static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2")
+			.withDatabaseName("budgetmaster-tests-db")
+			.withUsername("budgetmaster")
+			.withPassword("BudgetMaster");
+
+	@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);
+	}
+
+	@BeforeEach
+	void beforeEach()
+	{
+		final List<String> tableNames = List.of("template");
+		for(String tableName : tableNames)
+		{
+			entityManager.createNativeQuery(MessageFormat.format("ALTER SEQUENCE {0}_id_seq RESTART WITH 1", tableName))
+					.executeUpdate();
+		}
+	}
+
+	@Autowired
+	private EntityManager entityManager;
+
 	@Autowired
 	private CategoryRepository categoryRepository;
 
@@ -466,8 +503,6 @@ class ImportServiceTest
 		defaultGroup.setName(Localization.getString(Strings.TEMPLATE_GROUP_DEFAULT));
 		defaultGroup.setType(TemplateGroupType.DEFAULT);
 
-		Mockito.verify(templateGroupRepository, Mockito.times(1)).save(defaultGroup);
-
 		Template expectedTemplate = new Template();
 		expectedTemplate.setID(1);
 		expectedTemplate.setTemplateName("myTemplate");
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java
similarity index 93%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java
index 10c6ec4a433b28e32baef8660983ad94a30ca85b..6a6247c2e86648e315f7807001465a25336f8798 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/AccountImporterTest.java
@@ -11,21 +11,20 @@ import de.deadlocker8.budgetmaster.icon.IconRepository;
 import de.deadlocker8.budgetmaster.services.EntityType;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class AccountImporterTest
+class AccountImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("account");
+	}
+
 	@Autowired
 	private IconRepository iconRepository;
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java
similarity index 89%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java
index de51e3ed32a6ce5bc71c5f1f24ef12c45623e167..27ee178ae071f5e3b1987573810ca05a7224a1f1 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/CategoryImporterTest.java
@@ -9,21 +9,20 @@ import de.deadlocker8.budgetmaster.icon.IconRepository;
 import de.deadlocker8.budgetmaster.services.EntityType;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class CategoryImporterTest
+class CategoryImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("category");
+	}
+
 	@Autowired
 	private CategoryRepository categoryRepository;
 
@@ -83,7 +82,7 @@ class CategoryImporterTest
 	@Test
 	void test_importCategories_skipExisting_custom()
 	{
-		final Category categoryExisting= new Category("Category1", "#ff0000", CategoryType.CUSTOM);
+		final Category categoryExisting = new Category("Category1", "#ff0000", CategoryType.CUSTOM);
 		categoryExisting.setID(3);
 
 		final Category categoryToImport = new Category("Category1", "#ff0000", CategoryType.CUSTOM);
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java
similarity index 80%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java
index c2d5eb9b73dd9ee7834b0bba88798a5ac65e25f4..a53ffe578f941d33c5efad575159db829005e2b9 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ChartImporterTest.java
@@ -1,36 +1,50 @@
 package de.deadlocker8.budgetmaster.unit.database.importer;
 
 import de.deadlocker8.budgetmaster.Main;
-import de.deadlocker8.budgetmaster.categories.Category;
-import de.deadlocker8.budgetmaster.categories.CategoryType;
 import de.deadlocker8.budgetmaster.charts.Chart;
 import de.deadlocker8.budgetmaster.charts.ChartService;
 import de.deadlocker8.budgetmaster.charts.ChartType;
-import de.deadlocker8.budgetmaster.database.importer.CategoryImporter;
 import de.deadlocker8.budgetmaster.database.importer.ChartImporter;
-import de.deadlocker8.budgetmaster.database.importer.ImageImporter;
-import de.deadlocker8.budgetmaster.images.Image;
-import de.deadlocker8.budgetmaster.images.ImageFileExtension;
-import de.deadlocker8.budgetmaster.images.ImageRepository;
 import de.deadlocker8.budgetmaster.services.EntityType;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.springframework.transaction.annotation.Transactional;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 @SpringBootTest(classes = Main.class)
+@ActiveProfiles("test")
+@Transactional
+@Testcontainers
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 class ChartImporterTest
 {
+	@Container
+	static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2")
+			.withDatabaseName("budgetmaster-tests-db")
+			.withUsername("budgetmaster")
+			.withPassword("BudgetMaster");
+
+	@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);
+	}
+
 	@Autowired
 	private ChartService chartService;
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java
similarity index 83%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java
index 3b30ace7ee777b9e514baf74e9f5f30d49204aae..d1a9b4d164bb49863e168e649ceefa9b37665c63 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/IconImporterTest.java
@@ -9,21 +9,20 @@ import de.deadlocker8.budgetmaster.images.ImageRepository;
 import de.deadlocker8.budgetmaster.services.EntityType;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class IconImporterTest
+class IconImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("icon");
+	}
+
 	@Autowired
 	private ImageRepository imageRepository;
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java
similarity index 82%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java
index 9b4254ba730cde17883d23ef44cb2b3d9d5f25ad..ffd17a3bbce321379cc1600027aaee722ef4c70f 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImageImporterTest.java
@@ -7,21 +7,20 @@ import de.deadlocker8.budgetmaster.images.ImageRepository;
 import de.deadlocker8.budgetmaster.services.EntityType;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class ImageImporterTest
+class ImageImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("image");
+	}
+
 	@Autowired
 	private ImageRepository imageRepository;
 
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..8413d4bddd1e7b78a76696f8831e7f648dbf1e08
--- /dev/null
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/ImporterTestBase.java
@@ -0,0 +1,55 @@
+package de.deadlocker8.budgetmaster.unit.database.importer;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import javax.persistence.EntityManager;
+import java.text.MessageFormat;
+import java.util.List;
+
+@ExtendWith(SpringExtension.class)
+@DataJpaTest
+@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
+@Testcontainers
+abstract class ImporterTestBase
+{
+	@Container
+	static PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>("postgres:14.2")
+			.withDatabaseName("budgetmaster-tests-db")
+			.withUsername("budgetmaster")
+			.withPassword("BudgetMaster");
+
+	@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);
+	}
+
+	@BeforeEach
+	void beforeEach()
+	{
+		for(String tableName : getTableNamesToResetSequence())
+		{
+			entityManager.createNativeQuery(MessageFormat.format("ALTER SEQUENCE {0}_id_seq RESTART WITH 1", tableName))
+					.executeUpdate();
+		}
+	}
+
+	abstract List<String> getTableNamesToResetSequence();
+
+	@Autowired
+	private EntityManager entityManager;
+}
\ No newline at end of file
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java
similarity index 85%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java
index b9332d26fcb17d59cfc535254338030d6dcf8c36..63a0ec9aa61c3cb8df396480e2ad1fab9b1813de 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateGroupImporterTest.java
@@ -6,22 +6,22 @@ import de.deadlocker8.budgetmaster.services.ImportResultItem;
 import de.deadlocker8.budgetmaster.templategroup.TemplateGroup;
 import de.deadlocker8.budgetmaster.templategroup.TemplateGroupRepository;
 import de.deadlocker8.budgetmaster.templategroup.TemplateGroupType;
+import org.assertj.core.api.Assertions;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class TemplateGroupImporterTest
+class TemplateGroupImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("template_group");
+	}
+
 	@Autowired
 	private TemplateGroupRepository templateGroupRepository;
 
@@ -38,7 +38,7 @@ class TemplateGroupImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<TemplateGroup> templateGroups = templateGroupRepository.findAll();
-		assertThat(templateGroups)
+		Assertions.assertThat(templateGroups)
 				.hasSize(1)
 				.containsExactly(defaultTemplateGroup);
 	}
@@ -56,7 +56,7 @@ class TemplateGroupImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<TemplateGroup> templateGroups = templateGroupRepository.findAll();
-		assertThat(templateGroups)
+		Assertions.assertThat(templateGroups)
 				.hasSize(1)
 				.containsExactly(templateGroup);
 	}
@@ -75,7 +75,7 @@ class TemplateGroupImporterTest
 		final TemplateGroup expectedTemplateGroup = new TemplateGroup(1, "My group", TemplateGroupType.CUSTOM);
 
 		final List<TemplateGroup> templateGroups = templateGroupRepository.findAll();
-		assertThat(templateGroups)
+		Assertions.assertThat(templateGroups)
 				.hasSize(1)
 				.containsExactly(expectedTemplateGroup);
 	}
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java
similarity index 94%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java
index 2217f5b394022abd8856f68d96f5e98bb211939f..b26a60e35aa51842c3fa8ff67125a720ff142f45 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TemplateImporterTest.java
@@ -19,22 +19,22 @@ import de.deadlocker8.budgetmaster.templategroup.TemplateGroupRepository;
 import de.deadlocker8.budgetmaster.templategroup.TemplateGroupType;
 import de.deadlocker8.budgetmaster.templates.Template;
 import de.deadlocker8.budgetmaster.templates.TemplateRepository;
+import org.assertj.core.api.Assertions;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class TemplateImporterTest
+class TemplateImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("template", "account", "category", "tag", "icon", "template_group");
+	}
+
 	@Autowired
 	private AccountRepository accountRepository;
 
@@ -92,7 +92,7 @@ class TemplateImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Template> templates = templateRepository.findAll();
-		assertThat(templates).hasSize(1);
+		Assertions.assertThat(templates).hasSize(1);
 		final Template actualTemplate = templates.get(0);
 		assertThat(actualTemplate)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -150,7 +150,7 @@ class TemplateImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Template> templates = templateRepository.findAll();
-		assertThat(templates).hasSize(1);
+		Assertions.assertThat(templates).hasSize(1);
 		final Template actualTemplate = templates.get(0);
 		assertThat(actualTemplate)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -196,7 +196,7 @@ class TemplateImporterTest
 		template.setTags(List.of());
 		template.setDescription("Lorem Ipsum");
 		template.setIconReference(icon);
-		template.setTags(List.of( new Tag("0815"), new Tag("Apple Pie")));
+		template.setTags(List.of(new Tag("0815"), new Tag("Apple Pie")));
 
 		final Template template2 = new Template();
 		template2.setID(16);
@@ -205,7 +205,7 @@ class TemplateImporterTest
 		template2.setTags(List.of());
 		template2.setDescription("Lorem Ipsum");
 		template2.setIconReference(icon);
-		template2.setTags(List.of( new Tag("0815")));
+		template2.setTags(List.of(new Tag("0815")));
 
 		TemplateGroup defaultTemplateGroup = new TemplateGroup("Default group", TemplateGroupType.DEFAULT);
 		defaultTemplateGroup = templateGroupRepository.save(defaultTemplateGroup);
@@ -218,7 +218,7 @@ class TemplateImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Template> templates = templateRepository.findAll();
-		assertThat(templates).hasSize(2);
+		Assertions.assertThat(templates).hasSize(2);
 		final Template actualTemplate = templates.get(0);
 		assertThat(actualTemplate)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -268,7 +268,7 @@ class TemplateImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Template> templates = templateRepository.findAll();
-		assertThat(templates).hasSize(1);
+		Assertions.assertThat(templates).hasSize(1);
 		final Template actualTemplate = templates.get(0);
 		assertThat(actualTemplate)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -301,7 +301,7 @@ class TemplateImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Template> templates = templateRepository.findAll();
-		assertThat(templates).hasSize(1);
+		Assertions.assertThat(templates).hasSize(1);
 		final Template actualTemplate = templates.get(0);
 		assertThat(actualTemplate)
 				.hasFieldOrPropertyWithValue("ID", 1)
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java
similarity index 90%
rename from src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java
rename to BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java
index 959cf44fb75995f5e5639aa7fc3c9d8c909ab5af..22d63f916dfb2207ce2d41e3687a5f868309b3b6 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/importer/TransactionImporterTest.java
@@ -6,14 +6,8 @@ import de.deadlocker8.budgetmaster.accounts.AccountType;
 import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.categories.CategoryRepository;
 import de.deadlocker8.budgetmaster.categories.CategoryType;
-import de.deadlocker8.budgetmaster.database.importer.IconImporter;
 import de.deadlocker8.budgetmaster.database.importer.TagImporter;
 import de.deadlocker8.budgetmaster.database.importer.TransactionImporter;
-import de.deadlocker8.budgetmaster.icon.Icon;
-import de.deadlocker8.budgetmaster.icon.IconRepository;
-import de.deadlocker8.budgetmaster.images.Image;
-import de.deadlocker8.budgetmaster.images.ImageFileExtension;
-import de.deadlocker8.budgetmaster.images.ImageRepository;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays;
@@ -23,24 +17,23 @@ import de.deadlocker8.budgetmaster.tags.Tag;
 import de.deadlocker8.budgetmaster.tags.TagRepository;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
+import org.assertj.core.api.Assertions;
 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.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.time.LocalDate;
 import java.util.List;
 
-import static org.assertj.core.api.Assertions.as;
 import static org.assertj.core.api.Assertions.assertThat;
 
-@ExtendWith(SpringExtension.class)
-@DataJpaTest
-@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
-class TransactionImporterTest
+class TransactionImporterTest extends ImporterTestBase
 {
+	@Override
+	List<String> getTableNamesToResetSequence()
+	{
+		return List.of("transaction", "account", "category", "tag");
+	}
+
 	@Autowired
 	private AccountRepository accountRepository;
 
@@ -81,7 +74,7 @@ class TransactionImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Transaction> transactions = transactionRepository.findAll();
-		assertThat(transactions).hasSize(1);
+		Assertions.assertThat(transactions).hasSize(1);
 		final Transaction actualTransaction = transactions.get(0);
 		assertThat(actualTransaction)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -91,7 +84,7 @@ class TransactionImporterTest
 				.hasFieldOrPropertyWithValue("category", category)
 				.hasFieldOrPropertyWithValue("account", account)
 				.hasFieldOrPropertyWithValue("date", LocalDate.of(2022, 3, 30))
-				.hasFieldOrPropertyWithValue("description","Lorem Ipsum")
+				.hasFieldOrPropertyWithValue("description", "Lorem Ipsum")
 				.hasFieldOrPropertyWithValue("repeatingOption", null)
 				.hasFieldOrPropertyWithValue("transferAccount", null);
 		assertThat(actualTransaction.getTags()).isEmpty();
@@ -129,7 +122,7 @@ class TransactionImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Transaction> transactions = transactionRepository.findAll();
-		assertThat(transactions).hasSize(1);
+		Assertions.assertThat(transactions).hasSize(1);
 		final Transaction actualTransaction = transactions.get(0);
 		assertThat(actualTransaction)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -139,7 +132,7 @@ class TransactionImporterTest
 				.hasFieldOrPropertyWithValue("category", category)
 				.hasFieldOrPropertyWithValue("account", account)
 				.hasFieldOrPropertyWithValue("date", LocalDate.of(2022, 3, 30))
-				.hasFieldOrPropertyWithValue("description","Lorem Ipsum")
+				.hasFieldOrPropertyWithValue("description", "Lorem Ipsum")
 				.hasFieldOrPropertyWithValue("repeatingOption", null)
 				.hasFieldOrPropertyWithValue("transferAccount", transferAccount);
 		assertThat(actualTransaction.getTags()).isEmpty();
@@ -177,7 +170,7 @@ class TransactionImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Transaction> transactions = transactionRepository.findAll();
-		assertThat(transactions).hasSize(1);
+		Assertions.assertThat(transactions).hasSize(1);
 		final Transaction actualTransaction = transactions.get(0);
 		assertThat(actualTransaction)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -187,7 +180,7 @@ class TransactionImporterTest
 				.hasFieldOrPropertyWithValue("category", category)
 				.hasFieldOrPropertyWithValue("account", account)
 				.hasFieldOrPropertyWithValue("date", date)
-				.hasFieldOrPropertyWithValue("description","Lorem Ipsum")
+				.hasFieldOrPropertyWithValue("description", "Lorem Ipsum")
 				.hasFieldOrPropertyWithValue("repeatingOption", repeatingOption)
 				.hasFieldOrPropertyWithValue("transferAccount", null);
 		assertThat(actualTransaction.getTags()).isEmpty();
@@ -225,7 +218,7 @@ class TransactionImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Transaction> transactions = transactionRepository.findAll();
-		assertThat(transactions).hasSize(1);
+		Assertions.assertThat(transactions).hasSize(1);
 		final Transaction actualTransaction = transactions.get(0);
 		assertThat(actualTransaction)
 				.hasFieldOrPropertyWithValue("ID", 1)
@@ -235,7 +228,7 @@ class TransactionImporterTest
 				.hasFieldOrPropertyWithValue("category", category)
 				.hasFieldOrPropertyWithValue("account", account)
 				.hasFieldOrPropertyWithValue("date", LocalDate.of(2022, 3, 30))
-				.hasFieldOrPropertyWithValue("description","Lorem Ipsum")
+				.hasFieldOrPropertyWithValue("description", "Lorem Ipsum")
 				.hasFieldOrPropertyWithValue("repeatingOption", null)
 				.hasFieldOrPropertyWithValue("transferAccount", null);
 
@@ -285,7 +278,7 @@ class TransactionImporterTest
 		assertThat(resultItem).isEqualTo(expected);
 
 		final List<Transaction> transactions = transactionRepository.findAll();
-		assertThat(transactions).hasSize(2);
+		Assertions.assertThat(transactions).hasSize(2);
 		final Transaction actualTransaction = transactions.get(0);
 		assertThat(actualTransaction)
 				.hasFieldOrPropertyWithValue("ID", 1)