diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java
index 784bd814ace6fe6f31d2916a1a7bd536bfa3a39c..67209c484ada1ae4005deaa4b3e18139e76c3184 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java
@@ -17,7 +17,7 @@ public class DatabaseParser
 	final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
 
 	private static final int MINIMUM_VERSION = 4;
-	private static final int LATEST_VERSION = 6;
+	public static final int LATEST_VERSION = 6;
 
 	private final String jsonString;
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
index d861b00206010f8f96215ac030dd448e54f0886b..3e0648db995343192961f9b61bec836d66f14c23 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
@@ -150,7 +150,7 @@ public class DatabaseExportTest
 		JsonObject root = JsonParser.parseString(fileContent).getAsJsonObject();
 
 		assertThat(root.get("TYPE").getAsString()).isEqualTo(JSONIdentifier.BUDGETMASTER_DATABASE.toString());
-		assertThat(root.get("VERSION").getAsInt()).isEqualTo(5);
+		assertThat(root.get("VERSION").getAsInt()).isEqualTo(DatabaseParser.LATEST_VERSION);
 	}
 
 	@Test
@@ -158,7 +158,9 @@ public class DatabaseExportTest
 	{
 		// categories
 		Category categoryNone = new Category("NONE", "#000000", CategoryType.NONE);
+		categoryNone.setID(1);
 		Category categoryCustom = new Category("my First Category", "#FF0000", CategoryType.CUSTOM);
+		categoryCustom.setID(2);
 		Mockito.when(categoryService.getAllEntitiesAsc()).thenReturn(List.of(categoryNone, categoryCustom));
 
 		// accounts
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java
index 1b591fe95c0b6c6de5034feddfe3ae9d99894b67..18db73ff43e48096629cc9213d78965dc6b20205 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v5Test.java
@@ -1,25 +1,20 @@
 package de.deadlocker8.budgetmaster.unit.database;
 
-import de.deadlocker8.budgetmaster.accounts.Account;
+import de.deadlocker8.budgetmaster.accounts.AccountState;
 import de.deadlocker8.budgetmaster.accounts.AccountType;
-import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.categories.CategoryType;
-import de.deadlocker8.budgetmaster.charts.Chart;
 import de.deadlocker8.budgetmaster.charts.ChartType;
-import de.deadlocker8.budgetmaster.database.InternalDatabase;
 import de.deadlocker8.budgetmaster.database.DatabaseParser_v5;
-import de.deadlocker8.budgetmaster.images.Image;
+import de.deadlocker8.budgetmaster.database.model.v4.BackupRepeatingEndOption_v4;
+import de.deadlocker8.budgetmaster.database.model.v4.BackupRepeatingModifier_v4;
+import de.deadlocker8.budgetmaster.database.model.v4.BackupRepeatingOption_v4;
+import de.deadlocker8.budgetmaster.database.model.v4.BackupTag_v4;
+import de.deadlocker8.budgetmaster.database.model.v5.*;
 import de.deadlocker8.budgetmaster.images.ImageFileExtension;
-import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays;
-import de.deadlocker8.budgetmaster.tags.Tag;
-import de.deadlocker8.budgetmaster.templates.Template;
-import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.thecodelabs.utils.util.Localization;
 import de.thecodelabs.utils.util.Localization.LocalizationDelegate;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -63,10 +58,9 @@ public class DatabaseParser_v5Test
 		{
 			String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI())));
 			DatabaseParser_v5 importer = new DatabaseParser_v5(json);
-			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
+			BackupDatabase_v5 database = importer.parseDatabaseFromJSON();
 
-			final Chart chart = new Chart("The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7);
-			chart.setID(9);
+			final BackupChart_v5 chart = new BackupChart_v5(9, "The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7);
 
 			assertThat(database.getCharts()).hasSize(1)
 					.contains(chart);
@@ -84,10 +78,9 @@ public class DatabaseParser_v5Test
 		{
 			String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI())));
 			DatabaseParser_v5 importer = new DatabaseParser_v5(json);
-			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
+			BackupDatabase_v5 database = importer.parseDatabaseFromJSON();
 
-			final Category category = new Category("0815", "#ffcc00", CategoryType.CUSTOM, "fas fa-icons");
-			category.setID(3);
+			final BackupCategory_v5 category = new BackupCategory_v5(3, "0815", "#ffcc00", CategoryType.CUSTOM, "fas fa-icons");
 
 			assertThat(database.getCategories()).hasSize(3)
 					.contains(category);
@@ -105,12 +98,10 @@ public class DatabaseParser_v5Test
 		{
 			String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI())));
 			DatabaseParser_v5 importer = new DatabaseParser_v5(json);
-			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
+			BackupDatabase_v5 database = importer.parseDatabaseFromJSON();
 
-			final Image accountImage = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
-			accountImage.setID(1);
-			final Account account = new Account("Second Account", AccountType.CUSTOM, accountImage);
-			account.setID(3);
+			final BackupImage_v5 accountImage = new BackupImage_v5(1, new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
+			final BackupAccount_v5 account = new BackupAccount_v5(3, "Second Account", AccountState.FULL_ACCESS, AccountType.CUSTOM, accountImage);
 
 			assertThat(database.getAccounts()).hasSize(3)
 					.contains(account);
@@ -131,10 +122,7 @@ public class DatabaseParser_v5Test
 		{
 			String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI())));
 			DatabaseParser_v5 importer = new DatabaseParser_v5(json);
-			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
-
-			final Image image = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
-			image.setID(1);
+			BackupDatabase_v5 database = importer.parseDatabaseFromJSON();
 
 			assertThat(database.getImages()).hasSize(1);
 			assertThat(database.getImages().get(0)).hasFieldOrPropertyWithValue("fileExtension", ImageFileExtension.PNG);
@@ -155,13 +143,13 @@ public class DatabaseParser_v5Test
 		{
 			String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI())));
 			DatabaseParser_v5 importer = new DatabaseParser_v5(json);
-			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
+			BackupDatabase_v5 database = importer.parseDatabaseFromJSON();
+
+			BackupImage_v5 templateImage = new BackupImage_v5(1, new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
 
-			final Image templateImage = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
-			templateImage.setID(1);
-			final Template template = new Template();
+			BackupTemplate_v5 template = new BackupTemplate_v5();
 			template.setTemplateName("Template with icon");
-			template.setIsExpenditure(true);
+			template.setExpenditure(true);
 			template.setIcon(templateImage);
 			template.setTags(List.of());
 
@@ -184,82 +172,71 @@ public class DatabaseParser_v5Test
 		{
 			String json = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("DatabaseParser_v5Test.json").toURI())));
 			DatabaseParser_v5 importer = new DatabaseParser_v5(json);
-			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
+			BackupDatabase_v5 database = importer.parseDatabaseFromJSON();
 
-			Account account1 = new Account("Default", AccountType.CUSTOM);
-			account1.setID(2);
+			BackupAccount_v5 account1 = new BackupAccount_v5(2, "Default", AccountState.FULL_ACCESS, AccountType.CUSTOM, null);
 
-			Image image = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
-			image.setID(1);
+			BackupImage_v5 image = new BackupImage_v5(1, new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
 
-			Account account2 = new Account("Second Account", AccountType.CUSTOM);
-			account2.setIcon(image);
-			account2.setID(3);
+			BackupAccount_v5 account2 = new BackupAccount_v5(3, "Second Account", AccountState.FULL_ACCESS, AccountType.CUSTOM, image);
 
-			Category categoryNone = new Category("Keine Kategorie", "#FFFFFF", CategoryType.NONE);
-			categoryNone.setID(1);
+			BackupCategory_v5 categoryNone = new BackupCategory_v5(1, "Keine Kategorie", "#FFFFFF", CategoryType.NONE, null);
 
-			Category category3 = new Category("0815", "#ffcc00", CategoryType.CUSTOM);
-			category3.setIcon("fas fa-icons");
-			category3.setID(3);
+			BackupCategory_v5 category3 = new BackupCategory_v5(3, "0815", "#ffcc00", CategoryType.CUSTOM, "fas fa-icons");
 
-			Transaction normalTransaction_1 = new Transaction();
+			BackupTransaction_v5 normalTransaction_1 = new BackupTransaction_v5();
 			normalTransaction_1.setAmount(35000);
-			DateTime normalTransactionDate = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			normalTransactionDate = normalTransactionDate.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
-			normalTransaction_1.setDate(normalTransactionDate);
+			normalTransaction_1.setDate("2018-03-13");
 			normalTransaction_1.setCategory(categoryNone);
 			normalTransaction_1.setName("Income");
 			normalTransaction_1.setDescription("Lorem Ipsum");
 			normalTransaction_1.setTags(new ArrayList<>());
 			normalTransaction_1.setAccount(account1);
-			normalTransaction_1.setIsExpenditure(false);
+			normalTransaction_1.setExpenditure(false);
 
-			Transaction normalTransaction_2 = new Transaction();
+			BackupTransaction_v5 normalTransaction_2 = new BackupTransaction_v5();
 			normalTransaction_2.setAmount(-2000);
-			DateTime normalTransaction_2Date = DateTime.parse("2018-06-15", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			normalTransaction_2Date = normalTransaction_2Date.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
-			normalTransaction_2.setDate(normalTransaction_2Date);
+			normalTransaction_2.setDate("2018-06-15");
 			normalTransaction_2.setName("Simple");
 			normalTransaction_2.setDescription("");
 			normalTransaction_2.setAccount(account2);
 			normalTransaction_2.setCategory(category3);
-			normalTransaction_2.setIsExpenditure(true);
+			normalTransaction_2.setExpenditure(true);
 
-			List<Tag> tags = new ArrayList<>();
-			Tag tag = new Tag("0815");
+			List<BackupTag_v4> tags = new ArrayList<>();
+			BackupTag_v4 tag = new BackupTag_v4("0815");
 			tags.add(tag);
 			normalTransaction_2.setTags(tags);
 
-			Transaction repeatingTransaction_1 = new Transaction();
+			BackupTransaction_v5 repeatingTransaction_1 = new BackupTransaction_v5();
 			repeatingTransaction_1.setAmount(-12300);
-			DateTime repeatingTransaction_1Date = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			repeatingTransaction_1Date = repeatingTransaction_1Date.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+			String repeatingTransaction_1Date = "2018-03-13";
 			repeatingTransaction_1.setDate(repeatingTransaction_1Date);
 			repeatingTransaction_1.setCategory(categoryNone);
 			repeatingTransaction_1.setName("Test");
 			repeatingTransaction_1.setDescription("");
 			repeatingTransaction_1.setAccount(account1);
-			RepeatingOption repeatingOption_1 = new RepeatingOption();
-			repeatingOption_1.setModifier(new RepeatingModifierDays(10));
+			BackupRepeatingOption_v4 repeatingOption_1 = new BackupRepeatingOption_v4();
+			repeatingOption_1.setModifier(new BackupRepeatingModifier_v4(10, new RepeatingModifierDays(10).getLocalizationKey()));
 			repeatingOption_1.setStartDate(repeatingTransaction_1Date);
-			repeatingOption_1.setEndOption(new RepeatingEndAfterXTimes(2));
+			BackupRepeatingEndOption_v4 endOption = new BackupRepeatingEndOption_v4();
+			endOption.setTimes(2);
+			endOption.setLocalizationKey(new RepeatingEndAfterXTimes(2).getLocalizationKey());
+			repeatingOption_1.setEndOption(endOption);
 			repeatingTransaction_1.setRepeatingOption(repeatingOption_1);
 			repeatingTransaction_1.setTags(new ArrayList<>());
-			repeatingTransaction_1.setIsExpenditure(true);
+			repeatingTransaction_1.setExpenditure(true);
 
-		    Transaction transferTransaction = new Transaction();
+			BackupTransaction_v5 transferTransaction = new BackupTransaction_v5();
 			transferTransaction.setAmount(-250);
-			DateTime transferTransactionDate = DateTime.parse("2018-06-15", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			transferTransactionDate = transferTransactionDate.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
-			transferTransaction.setDate(transferTransactionDate);
+			transferTransaction.setDate("2018-06-15");
 			transferTransaction.setName("Transfer");
 			transferTransaction.setDescription("");
 			transferTransaction.setAccount(account2);
 			transferTransaction.setTransferAccount(account1);
 			transferTransaction.setCategory(category3);
 			transferTransaction.setTags(new ArrayList<>());
-			transferTransaction.setIsExpenditure(true);
+			transferTransaction.setExpenditure(true);
 
 			assertThat(database.getTransactions()).hasSize(4)
 					.contains(normalTransaction_1,
diff --git a/src/test/resources/DatabaseParser_v5Test.json b/src/test/resources/DatabaseParser_v5Test.json
index 0fa0d2429c965dd9a5ca4871be8f3625845847cc..c75ebdf6bdd29508967c7e18ca4d8390231171ba 100644
--- a/src/test/resources/DatabaseParser_v5Test.json
+++ b/src/test/resources/DatabaseParser_v5Test.json
@@ -12710,6 +12710,7 @@
             "ID": 8,
             "templateName": "Template with icon",
             "tags": [],
+            "isExpenditure": true,
             "icon": {
                 "ID": 1,
                 "image": [