diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
index eb87c103be50e7871278e7431395d15e219f19e2..bb6ebd041da0d88faa14201b4080aea4916318a5 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
@@ -2,8 +2,6 @@ package de.deadlocker8.budgetmaster.database;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import com.google.gson.JsonPrimitive;
-import com.google.gson.JsonSerializer;
 import de.deadlocker8.budgetmaster.accounts.Account;
 import de.deadlocker8.budgetmaster.accounts.AccountService;
 import de.deadlocker8.budgetmaster.categories.Category;
@@ -11,6 +9,7 @@ import de.deadlocker8.budgetmaster.categories.CategoryService;
 import de.deadlocker8.budgetmaster.charts.Chart;
 import de.deadlocker8.budgetmaster.charts.ChartService;
 import de.deadlocker8.budgetmaster.charts.ChartType;
+import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5;
 import de.deadlocker8.budgetmaster.images.Image;
 import de.deadlocker8.budgetmaster.images.ImageService;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
@@ -22,7 +21,6 @@ import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionService;
 import de.thecodelabs.utils.io.PathUtils;
 import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,10 +42,7 @@ import java.util.stream.Stream;
 @Service
 public class DatabaseService
 {
-	public static final  Gson GSON = new GsonBuilder()
-			.excludeFieldsWithoutExposeAnnotation()
-			.registerTypeAdapter(DateTime.class, (JsonSerializer<DateTime>) (json, typeOfSrc, context) -> new JsonPrimitive(ISODateTimeFormat.date().print(json)))
-			.create();
+	public static final Gson GSON = new GsonBuilder().create();
 	private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseService.class);
 
 	private final AccountService accountService;
@@ -222,7 +217,7 @@ public class DatabaseService
 	@Transactional
 	public void exportDatabase(Path backupPath)
 	{
-		final Database database = getDatabaseForJsonSerialization();
+		final BackupDatabase_v5 database = getDatabaseForJsonSerialization();
 
 		try(Writer writer = new FileWriter(backupPath.toString()))
 		{
@@ -247,7 +242,7 @@ public class DatabaseService
 		return "BudgetMasterDatabase_" + DateTime.now().toString(formatString) + ".json";
 	}
 
-	public Database getDatabaseForJsonSerialization()
+	public BackupDatabase_v5 getDatabaseForJsonSerialization()
 	{
 		List<Category> categories = categoryService.getAllEntitiesAsc();
 		List<Account> accounts = accountService.getRepository().findAll();
@@ -260,7 +255,10 @@ public class DatabaseService
 
 		Database database = new Database(categories, accounts, filteredTransactions, templates, charts, images);
 		LOGGER.debug(MessageFormat.format("Created database for JSON with {0} transactions, {1} categories, {2} accounts, {3} templates, {4} charts and {5} images", database.getTransactions().size(), database.getCategories().size(), database.getAccounts().size(), database.getTemplates().size(), database.getCharts().size(), database.getImages()));
-		return database;
+
+		BackupDatabase_v5 databaseInExternalForm = BackupDatabase_v5.createFromInternalEntities(database);
+		LOGGER.debug("Converted database to external form");
+		return databaseInExternalForm;
 	}
 
 	private List<Transaction> filterRepeatingTransactions(List<Transaction> transactions)
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
index 2b54747d3ef967434e97300b95992244c983820b..dca501e392cf9db5887eeb49043ba9163683ad04 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
@@ -10,6 +10,7 @@ import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.database.DatabaseParser;
 import de.deadlocker8.budgetmaster.database.DatabaseService;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList;
+import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5;
 import de.deadlocker8.budgetmaster.services.ImportResultItem;
 import de.deadlocker8.budgetmaster.services.ImportService;
 import de.deadlocker8.budgetmaster.services.UpdateCheckService;
@@ -218,7 +219,7 @@ public class SettingsController extends BaseController
 	{
 		LOGGER.debug("Exporting database...");
 
-		final Database databaseForJsonSerialization = databaseService.getDatabaseForJsonSerialization();
+		final BackupDatabase_v5 databaseForJsonSerialization = databaseService.getDatabaseForJsonSerialization();
 		String data = DatabaseService.GSON.toJson(databaseForJsonSerialization);
 		byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java
index f40b97f92bd7747e726f732dd946f489e83643b1..58f0859f8c62e8becea010a351151f869fbe6ebd 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java
@@ -4,10 +4,10 @@ import de.deadlocker8.budgetmaster.backup.AutoBackupStrategy;
 import de.deadlocker8.budgetmaster.backup.BackupStatus;
 import de.deadlocker8.budgetmaster.backup.BackupTask;
 import de.deadlocker8.budgetmaster.backup.LocalGitBackupTask;
-import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.categories.CategoryType;
-import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.database.DatabaseService;
+import de.deadlocker8.budgetmaster.database.model.v5.BackupCategory_v5;
+import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5;
 import de.deadlocker8.budgetmaster.settings.Settings;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
 import de.deadlocker8.budgetmaster.unit.helpers.Helpers;
@@ -103,7 +103,7 @@ public class LocalGitBackupTaskTest
 
 		final Path repositoryFolder = tempFolder.newFolder().toPath().resolve(".git");
 
-		final Database database = new Database();
+		final BackupDatabase_v5 database = new BackupDatabase_v5();
 		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
 		Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
 
@@ -131,7 +131,7 @@ public class LocalGitBackupTaskTest
 
 		final Path repositoryFolder = tempFolder.newFolder().toPath().resolve(".git");
 
-		final Database database = new Database();
+		final BackupDatabase_v5 database = new BackupDatabase_v5();
 		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
 		Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
 
@@ -155,7 +155,7 @@ public class LocalGitBackupTaskTest
 
 		final Path repositoryFolder = tempFolder.newFolder().toPath().resolve(".git");
 
-		final Database database = new Database();
+		final BackupDatabase_v5 database = new BackupDatabase_v5();
 		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
 		Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
 
@@ -163,7 +163,7 @@ public class LocalGitBackupTaskTest
 		localGitBackupTask.setGitFolder(repositoryFolder);
 		localGitBackupTask.run();
 
-		final Database databaseModified = new Database(List.of(new Category("myCategory", "#FF0000", CategoryType.CUSTOM)), List.of(), List.of(), List.of(), List.of(), List.of());
+		final BackupDatabase_v5 databaseModified = new BackupDatabase_v5(List.of(new BackupCategory_v5(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of());
 		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified);
 		localGitBackupTask.run();
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java
index d5978c4742a296f5b323fec325e98842fd23deb3..2af26eb7414abc596177ee0e460c0cdf69b3ff16 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java
@@ -1,10 +1,13 @@
 package de.deadlocker8.budgetmaster.unit.backup;
 
-import de.deadlocker8.budgetmaster.backup.*;
-import de.deadlocker8.budgetmaster.categories.Category;
+import de.deadlocker8.budgetmaster.backup.AutoBackupStrategy;
+import de.deadlocker8.budgetmaster.backup.BackupStatus;
+import de.deadlocker8.budgetmaster.backup.BackupTask;
+import de.deadlocker8.budgetmaster.backup.RemoteGitBackupTask;
 import de.deadlocker8.budgetmaster.categories.CategoryType;
-import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.database.DatabaseService;
+import de.deadlocker8.budgetmaster.database.model.v5.BackupCategory_v5;
+import de.deadlocker8.budgetmaster.database.model.v5.BackupDatabase_v5;
 import de.deadlocker8.budgetmaster.settings.Settings;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
 import de.deadlocker8.budgetmaster.unit.helpers.Helpers;
@@ -21,7 +24,6 @@ import org.mockito.Mockito;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import java.io.IOException;
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 
@@ -215,7 +217,7 @@ public class RemoteGitBackupTaskTest
 		final RemoteGitBackupTask remoteGitBackupTask = createBackupTask(repositoryFolder, fakeServerFolder);
 		remoteGitBackupTask.run();
 
-		final Database databaseModified = new Database(List.of(new Category("myCategory", "#FF0000", CategoryType.CUSTOM)), List.of(), List.of(), List.of(), List.of(), List.of());
+		final BackupDatabase_v5 databaseModified = new BackupDatabase_v5(List.of(new BackupCategory_v5(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of());
 		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified);
 		remoteGitBackupTask.run();
 
@@ -255,7 +257,7 @@ public class RemoteGitBackupTaskTest
 		settings.setAutoBackupGitToken("0815");
 		Mockito.when(settingsService.getSettings()).thenReturn(settings);
 
-		final Database database = new Database();
+		final BackupDatabase_v5 database = new BackupDatabase_v5();
 		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
 		Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
 
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 1c646d0cf28aa5441b5608b99be026444fa9089a..6bf49d2b1308a1961dab731aed8dc5a7f1349ac5 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
@@ -63,7 +63,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);
-			Database database = importer.parseDatabaseFromJSON().convert();
+			Database database = importer.parseDatabaseFromJSON().convertToInternal();
 
 			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);
@@ -84,7 +84,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);
-			Database database = importer.parseDatabaseFromJSON().convert();
+			Database database = importer.parseDatabaseFromJSON().convertToInternal();
 
 			final Category category = new Category("0815", "#ffcc00", CategoryType.CUSTOM, "fas fa-icons");
 			category.setID(3);
@@ -105,7 +105,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);
-			Database database = importer.parseDatabaseFromJSON().convert();
+			Database database = importer.parseDatabaseFromJSON().convertToInternal();
 
 			final Image accountImage = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
 			accountImage.setID(1);
@@ -131,7 +131,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);
-			Database database = importer.parseDatabaseFromJSON().convert();
+			Database database = importer.parseDatabaseFromJSON().convertToInternal();
 
 			final Image image = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
 			image.setID(1);
@@ -155,7 +155,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);
-			Database database = importer.parseDatabaseFromJSON().convert();
+			Database database = importer.parseDatabaseFromJSON().convertToInternal();
 
 			final Image templateImage = new Image(new Byte[0], "awesomeIcon.png", ImageFileExtension.PNG);
 			templateImage.setID(1);
@@ -184,7 +184,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);
-			Database database = importer.parseDatabaseFromJSON().convert();
+			Database database = importer.parseDatabaseFromJSON().convertToInternal();
 
 			Account account1 = new Account("Default", AccountType.CUSTOM);
 			account1.setID(2);