diff --git a/.gitignore b/.gitignore
index ae91f72929d3edca467a68702753e6a8bdcebe87..a3f7c058fb3c7b891c9a28efde06d27ac96daa75 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,6 @@ bin/
 target/
 certs/
 
+*.db
+
 build/[0-9]*.[0-9]*.[0-9]*
\ No newline at end of file
diff --git a/BudgetMasterServer/pom.xml b/BudgetMasterServer/pom.xml
index d6804dc29c70e0dd5bfaa9a7ada52eb63ff2dfc5..b3a9bffdae599cd06b11cba02255e73b622bf952 100644
--- a/BudgetMasterServer/pom.xml
+++ b/BudgetMasterServer/pom.xml
@@ -40,7 +40,7 @@
 						</goals>
 					</execution>
 				</executions>
-			</plugin>			
+			</plugin>
 		</plugins>
 	</build>
 
@@ -73,7 +73,7 @@
 		<dependency>
 			<groupId>de.deadlocker8</groupId>
 			<artifactId>tools</artifactId>
-			<version>1.0.0</version>			
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>de.deadlocker8</groupId>
@@ -86,5 +86,10 @@
 			<version>4.12</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.xerial</groupId>
+			<artifactId>sqlite-jdbc</artifactId>
+			<version>3.21.0</version>
+		</dependency>
 	</dependencies>
 </project>
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java
index 821531725dcb7c8f81ddbd9061dd996d052f135e..fe2227c3fe6bd06b27b41d149dd45cee50d04ffc 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java
@@ -2,6 +2,7 @@ package de.deadlocker8.budgetmasterserver.logic;
 
 public class Settings
 {
+	private String databaseType;
 	private String databaseUrl;
 	private String databaseName;
 	private String databaseUsername;
@@ -16,6 +17,16 @@ public class Settings
 
 	}
 
+	public String getDatabaseType()
+	{
+		return databaseType;
+	}
+
+	public void setDatabaseType(String databaseType)
+	{
+		this.databaseType = databaseType;
+	}
+
 	public String getDatabaseUrl()
 	{
 		return databaseUrl;
@@ -99,8 +110,25 @@ public class Settings
 	@Override
 	public String toString()
 	{
-		return "Settings [databaseUrl=" + databaseUrl + ", databaseName=" + databaseName + ", databaseUsername=" + databaseUsername + ", databasePassword=" + databasePassword + ", serverPort=" + serverPort + ", serverSecret=" + serverSecret + ", keystorePath=" + keystorePath + ", keystorePassword="
-				+ keystorePassword + "]";
+		return "Settings [databaseType=" + databaseType + ", databaseUrl=" + databaseUrl + ", databaseName=" + databaseName + ", databaseUsername=" + databaseUsername + ", databasePassword=" + databasePassword + ", serverPort=" + serverPort + ", serverSecret=" + serverSecret + ", keystorePath="
+				+ keystorePath + ", keystorePassword=" + keystorePassword + "]";
+	}
+
+	@Override
+	public int hashCode()
+	{
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((databaseName == null) ? 0 : databaseName.hashCode());
+		result = prime * result + ((databasePassword == null) ? 0 : databasePassword.hashCode());
+		result = prime * result + ((databaseType == null) ? 0 : databaseType.hashCode());
+		result = prime * result + ((databaseUrl == null) ? 0 : databaseUrl.hashCode());
+		result = prime * result + ((databaseUsername == null) ? 0 : databaseUsername.hashCode());
+		result = prime * result + ((keystorePassword == null) ? 0 : keystorePassword.hashCode());
+		result = prime * result + ((keystorePath == null) ? 0 : keystorePath.hashCode());
+		result = prime * result + serverPort;
+		result = prime * result + ((serverSecret == null) ? 0 : serverSecret.hashCode());
+		return result;
 	}
 
 	@Override
@@ -127,6 +155,13 @@ public class Settings
 		}
 		else if(!databasePassword.equals(other.databasePassword))
 			return false;
+		if(databaseType == null)
+		{
+			if(other.databaseType != null)
+				return false;
+		}
+		else if(!databaseType.equals(other.databaseType))
+			return false;
 		if(databaseUrl == null)
 		{
 			if(other.databaseUrl != null)
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java
index 265ab169df0cec23bb18cc16c6ebd9e87a9fa639..3b8f6ac01a3e19cc8f6f03811297613f1af1c6d4 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java
@@ -1,11 +1,26 @@
 package de.deadlocker8.budgetmasterserver.logic;
 
 import java.io.IOException;
+import java.io.Writer;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
 
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.MysqlDatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.SqliteDatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.MysqlDatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.SqliteDatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.MysqlDatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.SqliteDatabaseTagHandler;
 
 public class Utils
 {
@@ -20,4 +35,61 @@ public class Utils
 		settings = gson.fromJson(settingsJSON, Settings.class);	
 		return settings;		
 	}
+	
+	public static void saveSettings(Settings settings) throws IOException, URISyntaxException
+	{
+		Gson gson = new GsonBuilder().setPrettyPrinting().create();
+		String jsonString = gson.toJson(settings);
+		Writer writer = Files.newBufferedWriter(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json"));
+		writer.write(jsonString);
+		writer.close();
+	}
+	
+	public static Connection getDatabaseConnection(Settings settings) throws SQLException
+	{
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return DriverManager.getConnection("jdbc:mysql://" + settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
+		}
+		else		
+		{
+			return DriverManager.getConnection("jdbc:sqlite://" + settings.getDatabaseUrl());
+		}
+	}
+	
+	public static DatabaseCreator getDatabaseCreator(Connection connection, Settings settings)
+	{
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return new MysqlDatabaseCreator(connection, settings);
+		}
+		else		
+		{
+			return new SqliteDatabaseCreator(connection, settings);
+		}
+	}
+	
+	public static DatabaseHandler getDatabaseHandler(Settings settings)
+	{
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return new MysqlDatabaseHandler(settings);
+		}
+		else		
+		{
+			return new SqliteDatabaseHandler(settings);
+		}
+	}
+	
+	public static DatabaseTagHandler getDatabaseTagHandler(Settings settings)
+	{
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return new MysqlDatabaseTagHandler(settings);
+		}
+		else		
+		{
+			return new SqliteDatabaseTagHandler(settings);
+		}
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java
index 2213d91003b903824193d41803d4afa0f96daf6e..fb0dc3277e444078ec989a9d48910f2c60273a55 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java
@@ -1,7 +1,6 @@
 package de.deadlocker8.budgetmasterserver.logic.database;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -15,6 +14,7 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.tag.TagMatch;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
 import logger.Logger;
 
 public class DatabaseExporter
@@ -25,7 +25,7 @@ public class DatabaseExporter
     {
         try
         {
-            this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin", settings.getDatabaseUsername(), settings.getDatabasePassword());
+            this.connection = Utils.getDatabaseConnection(settings); 
         }
         catch(Exception e)
         {
@@ -200,7 +200,6 @@ public class DatabaseExporter
                 int tagID = rs.getInt("Tag_ID");
                 int paymentID = rs.getInt("Payment_ID");
                 int repeatingPaymentID = rs.getInt("RepeatingPayment_ID");                             
-            
                 results.add(new TagMatch(tagID, paymentID, repeatingPaymentID));
             }
         }
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java
index 3070bf67b655552cb6d552d0c3824ce12808b2c0..091440c113937302906d18ecb2144da6c15f8cf7 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java
@@ -9,6 +9,8 @@ import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.tag.TagMatch;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 
 public class DatabaseImporter
 {
@@ -96,7 +98,7 @@ public class DatabaseImporter
         		updateTagMatchesByTagID(tagID, existingTag.getID());
         	}
         }
-        
+
         tagMatches.addAll(changedTagMatches);
         importTagMatches(tagMatches);
 	}
@@ -117,7 +119,7 @@ public class DatabaseImporter
 				 * 			call 2 = replace ID 3 with 4
 				 * --> would replace category IDs in payments where category ID has already been replaced 
 				 * --> would lead to wrong import
-				 * --> remove payment from list but add to "changedPayments" in order not to loose the payment completly
+				 * --> remove payment from list but add to "changedPayments" in order not to loose the payment completely
 				 * --> remaining payments in list and all payments from "changedPayments" will be merged after all categories are imported
 				 */				
 				changedNormalPayments.add(currentPayment);
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..2fef700c27eb32a763cc2c21fe02a9cbb43b501e
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java
@@ -0,0 +1,73 @@
+package de.deadlocker8.budgetmasterserver.logic.database.creator;
+
+import java.sql.Connection;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public abstract class DatabaseCreator
+{
+	Connection connection;
+	Settings settings;
+
+	public DatabaseCreator(Connection connection, Settings settings)
+	{
+		this.connection = connection;
+		this.settings = settings;		
+	}
+	
+	public void createTables()
+	{
+		Logger.info("Checking tables...");
+		createTables(getExistingTables());	
+		Logger.info("Checking tables [DONE]");
+	}
+
+	public abstract ArrayList<String> getExistingTables();	
+	
+	private void createTables(ArrayList<String> existingTables)
+	{
+		if(!existingTables.contains("category"))
+		{
+			createTableCategory();
+		}
+		
+		if(!existingTables.contains("payment"))
+		{
+			createTablePayment();
+		}
+		
+		if(!existingTables.contains("repeating_payment"))
+		{
+			createTableRepeatingPayment();
+		}
+		
+		if(!existingTables.contains("repeating_entry"))
+		{
+			createTableRepeatingEntry();
+		}
+		
+		if(!existingTables.contains("tag"))
+		{
+			createTableTag();
+		}
+		
+		if(!existingTables.contains("tag_match"))
+		{
+			createTableTagMatch();
+		}
+	}
+	
+	public abstract void createTableCategory();
+	
+	public abstract void createTablePayment();
+	
+	public abstract void createTableRepeatingEntry();
+	
+	public abstract void createTableRepeatingPayment();
+	
+	public abstract void createTableTag();
+	
+	public abstract void createTableTagMatch();
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java
similarity index 84%
rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java
index 81350a988fbacb3bf8bd2742fc3f5b77cb6889c9..7c73373c7df95cf01e5c68955f9d843e85ff33ae 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmasterserver.logic.database;
+package de.deadlocker8.budgetmasterserver.logic.database.creator;
 
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
@@ -10,21 +10,15 @@ import java.util.ArrayList;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import logger.Logger;
 
-public class DatabaseCreator
+public class MysqlDatabaseCreator extends DatabaseCreator
 {
-	private Connection connection;
-	private Settings settings;
-
-	public DatabaseCreator(Connection connection, Settings settings)
+	public MysqlDatabaseCreator(Connection connection, Settings settings)
 	{
-		this.connection = connection;
-		this.settings = settings;
-		Logger.info("Checking tables...");
-		createTables(getExistingTables());	
-		Logger.info("Checking tables [DONE]");
+		super(connection, settings);
 	}
 
-	private ArrayList<String> getExistingTables()
+	@Override
+	public ArrayList<String> getExistingTables()
 	{
 		ArrayList<String> tables = new ArrayList<>();
 		try
@@ -41,42 +35,10 @@ public class DatabaseCreator
 			Logger.error(e);
 		}
 		return tables;
-	}
-	
-	private void createTables(ArrayList<String> existingTables)
-	{
-		if(!existingTables.contains("category"))
-		{
-			createTableCategory();
-		}
-		
-		if(!existingTables.contains("payment"))
-		{
-			createTablePayment();
-		}
-		
-		if(!existingTables.contains("repeating_payment"))
-		{
-			createTableRepeatingPayment();
-		}
-		
-		if(!existingTables.contains("repeating_entry"))
-		{
-			createTableRepeatingEntry();
-		}
-		
-		if(!existingTables.contains("tag"))
-		{
-			createTableTag();
-		}
-		
-		if(!existingTables.contains("tag_match"))
-		{
-			createTableTagMatch();
-		}
-	}
+	}	
 	
-	private void createTableCategory()
+	@Override
+	public void createTableCategory()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `category` (`ID` int(11) NOT NULL COMMENT 'ID'," +
@@ -115,7 +77,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTablePayment()
+	@Override
+	public void createTablePayment()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `payment` (" +
@@ -156,7 +119,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableRepeatingEntry()
+	@Override
+	public void createTableRepeatingEntry()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `repeating_entry` (" +
@@ -196,7 +160,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableRepeatingPayment()
+	@Override
+	public void createTableRepeatingPayment()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `repeating_payment` (" +
@@ -240,7 +205,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableTag()
+	@Override
+	public void createTableTag()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `tag` (`ID` int(11) NOT NULL COMMENT 'ID'," + 
@@ -276,7 +242,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableTagMatch()
+	@Override
+	public void createTableTagMatch()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `tag_match` (`Tag_ID` int(11) NOT NULL," + 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e869e60c48b7fe9db3663fdbaa008acb4c1de1d
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java
@@ -0,0 +1,248 @@
+package de.deadlocker8.budgetmasterserver.logic.database.creator;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class SqliteDatabaseCreator extends DatabaseCreator
+{
+	public SqliteDatabaseCreator(Connection connection, Settings settings)
+	{
+		super(connection, settings);
+	}
+
+	@Override
+	public ArrayList<String> getExistingTables()
+	{
+		ArrayList<String> tables = new ArrayList<>();
+		try
+		{
+			DatabaseMetaData meta = connection.getMetaData();
+			ResultSet res = meta.getTables(settings.getDatabaseName(), null, "", new String[] { "TABLE" });
+			while(res.next())
+			{
+				tables.add(res.getString("TABLE_NAME"));
+			}			
+		}
+		catch(Exception e)
+		{
+			Logger.error(e);
+		}
+		return tables;
+	}	
+	
+	@Override
+	public void createTableCategory()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `category` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT DEFAULT NULL, `Color` TEXT NOT NULL);";		
+		String query2 = "INSERT INTO `category` (`ID`, `Name`, `Color`) VALUES(1, 'NONE', '#FFFFFF'),(2, 'Übertrag', '#FFFF00');";		
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			stmt.execute(query2);
+			Logger.info("Successfully created table category");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTablePayment()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `payment` (" + 
+				"`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + 
+				"`Name` TEXT DEFAULT NULL," + 
+				"`CategoryID` INTEGER DEFAULT NULL," + 
+				"`Amount` INTEGER DEFAULT NULL," + 
+				"`Date` TEXT DEFAULT NULL," + 
+				"`Description` TEXT DEFAULT NULL);";		
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table payment");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableRepeatingEntry()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `repeating_entry` (" + 
+				"`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + 
+				"`RepeatingPaymentID` INTEGER NOT NULL," + 
+				"`Date` TEXT NOT NULL," + 
+				"FOREIGN KEY (RepeatingPaymentID) REFERENCES repeating_payment(ID) ON DELETE CASCADE ON UPDATE CASCADE);";			
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table repeating_entry");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableRepeatingPayment()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `repeating_payment` (\r\n" + 
+				"`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\r\n" + 
+				"`Name` TEXT DEFAULT NULL,\r\n" + 
+				"`CategoryID` INTEGER DEFAULT NULL,\r\n" + 
+				"`Amount` INTEGER DEFAULT NULL,\r\n" + 
+				"`Date` TEXT DEFAULT NULL,\r\n" + 
+				"`Description` TEXT DEFAULT NULL,\r\n" + 
+				"`RepeatInterval` INTEGER DEFAULT NULL,\r\n" + 
+				"`RepeatEndDate` TEXT DEFAULT NULL,\r\n" + 
+				"`RepeatMonthDay` INTEGER DEFAULT NULL);";			
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table repeating_payment");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableTag()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `tag` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT NOT NULL);";
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table tag");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableTagMatch()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `tag_match` (`Tag_ID` INTEGER NOT NULL," + 
+				"`Payment_ID` INTEGER NOT NULL," + 
+				"`RepeatingPayment_ID` INTEGER NOT NULL);"; 
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table tag_match");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java
similarity index 70%
rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java
index 5f471c46008c5da65f360f845d88778c9c376194..d211841f2be15da2fe5a7391995fa01df568e8d3 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java
@@ -1,7 +1,6 @@
-package de.deadlocker8.budgetmasterserver.logic.database;
+package de.deadlocker8.budgetmasterserver.logic.database.handler;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -19,18 +18,18 @@ import de.deadlocker8.budgetmaster.logic.payment.Payment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
 import logger.Logger;
 
-public class DatabaseHandler
+public abstract class DatabaseHandler
 {
-	private Connection connection;
-	private Settings settings;
-	private final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
+	Connection connection;
+	Settings settings;
+	final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
 
 	public DatabaseHandler(Settings settings) throws IllegalStateException
 	{
 		this.settings = settings;
-		connect();
 	}
 	
 	public void connect()
@@ -39,7 +38,7 @@ public class DatabaseHandler
 		{
 			if(connection == null || connection.isClosed())
 			{				
-				connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
+				connection = Utils.getDatabaseConnection(settings);
 			}
 		}
 		catch(Exception e)
@@ -61,7 +60,7 @@ public class DatabaseHandler
 		}
 	}
 	
-	private void closeStatement(Statement statement)
+	void closeStatement(Statement statement)
 	{
 		if(statement != null)
 		{
@@ -78,33 +77,8 @@ public class DatabaseHandler
 	/*
 	 * GET
 	 */
-	public int getLastInsertID()
-	{
-		PreparedStatement stmt = null;
-		int lastInsertID = 0;
-		try
-		{
-			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
-			}
-			rs.close();
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-
-		return lastInsertID;
-	}
-	
+	public abstract int getLastInsertID();
+		
 	public DateTime getFirstNormalPaymentDate()
 	{
 		PreparedStatement stmt = null;
@@ -430,161 +404,13 @@ public class DatabaseHandler
 		return results;
 	}
 
-	public ArrayList<NormalPayment> getPayments(int year, int month)
-	{
-		PreparedStatement stmt = null;
-
-		ArrayList<NormalPayment> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT * FROM payment WHERE YEAR(Date) = ? AND  MONTH(Date) = ?;");
-			stmt.setInt(1, year);
-			stmt.setInt(2, month);
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");
-				String name = rs.getString("Name");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");
-				int categoryID = rs.getInt("CategoryID");
-				String description = rs.getString("Description");
-
-				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
-			}
-			rs.close();
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-
-		return results;
-	}
+	public abstract ArrayList<NormalPayment> getPayments(int year, int month);
 	
-	public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate)
-	{	
-		PreparedStatement stmt = null;
-
-		ArrayList<NormalPayment> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT * FROM payment WHERE DATE(Date) BETWEEN ? AND ?;");
-			stmt.setString(1, startDate);
-			stmt.setString(2, endDate);			
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");				
-				String name = rs.getString("Name");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");				
-				int categoryID = rs.getInt("CategoryID");
-				String description = rs.getString("Description");
-			
-				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
-			}
-			rs.close();
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-
-		return results;
-	}
-
-	public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
-	{
-		PreparedStatement stmt = null;
-
-		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = ? AND MONTH(repeating_entry.Date) = ?;");
-			stmt.setInt(1, year);
-			stmt.setInt(2, month);			
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");
-				int repeatingPaymentID = rs.getInt("repeatingPaymentID");
-				String name = rs.getString("Name");
-				String description = rs.getString("Description");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");
-				int categoryID = rs.getInt("CategoryID");
-				int repeatInterval = rs.getInt("RepeatInterval");
-				String repeatEndDate = rs.getString("RepeatEndDate");
-				int repeatMonthDay = rs.getInt("RepeatMonthDay");
-
-				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
-			}
-			rs.close();
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-
-		return results;
-	}
+	public abstract ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate);
 	
-	public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate)
-	{
-		PreparedStatement stmt = null;
-
-		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND DATE(repeating_entry.Date) BETWEEN ? AND ?;");
-			stmt.setString(1, startDate);
-			stmt.setString(2,  endDate);
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");
-				int repeatingPaymentID = rs.getInt("repeatingPaymentID");				
-				String name = rs.getString("Name");
-				String description = rs.getString("Description");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");				
-				int categoryID = rs.getInt("CategoryID");
-				int repeatInterval = rs.getInt("RepeatInterval");
-				String repeatEndDate = rs.getString("RepeatEndDate");
-				int repeatMonthDay = rs.getInt("RepeatMonthDay");		
-			
-				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
-			}
-			rs.close();
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-
-		return results;
-	}
+	public abstract ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month);	
+	
+	public abstract ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate);
 
 	public ArrayList<RepeatingPayment> getAllRepeatingPayments()
 	{
@@ -807,42 +633,7 @@ public class DatabaseHandler
 		}
 	}
 
-	public void deleteDatabase()
-	{
-		Statement stmt = null;
-		String tableCategory = "DROP TABLE IF EXISTS category;";
-		String tablePayment = "DROP TABLE IF EXISTS payment;";
-		String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;";
-		String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;";
-		String tableTag = "DROP TABLE IF EXISTS tag;";
-		String tableTagMatch = "DROP TABLE IF EXISTS tag_match;";
-		try
-		{
-			stmt = connection.createStatement();
-			stmt.execute("SET FOREIGN_KEY_CHECKS = 0;");
-			stmt.execute(tableCategory);
-			Logger.info("Deleted table: category");
-			stmt.execute(tablePayment);
-			Logger.info("Deleted table: payment");
-			stmt.execute(tableRepeatingPayment);
-			Logger.info("Deleted table: repeating_payment");
-			stmt.execute(tableRepeatingEntry);
-			Logger.info("Deleted table: repeating_entry");
-			stmt.execute(tableTag);
-			Logger.info("Deleted table: tag");
-			stmt.execute(tableTagMatch);
-			Logger.info("Deleted table: tag_match");
-			stmt.execute("SET FOREIGN_KEY_CHECKS = 1;");
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-	}
+	public abstract void deleteDatabase();
 
 	/*
 	 * ADD
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2c8e92b994416230be328b23fa86e561bd684c2
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java
@@ -0,0 +1,247 @@
+package de.deadlocker8.budgetmasterserver.logic.database.handler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
+import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class MysqlDatabaseHandler extends DatabaseHandler
+{
+	public MysqlDatabaseHandler(Settings settings) throws IllegalStateException
+	{
+		super(settings);
+		connect();
+	}
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE YEAR(Date) = ? AND  MONTH(Date) = ?;");
+			stmt.setInt(1, year);
+			stmt.setInt(2, month);
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = ? AND MONTH(repeating_entry.Date) = ?;");
+			stmt.setInt(1, year);
+			stmt.setInt(2, month);			
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");
+
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate)
+	{	
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE DATE(Date) BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);			
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");				
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+			
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND DATE(repeating_entry.Date) BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");				
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");		
+			
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public void deleteDatabase()
+	{
+		Statement stmt = null;
+		String tableCategory = "DROP TABLE IF EXISTS category;";
+		String tablePayment = "DROP TABLE IF EXISTS payment;";
+		String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;";
+		String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;";
+		String tableTag = "DROP TABLE IF EXISTS tag;";
+		String tableTagMatch = "DROP TABLE IF EXISTS tag_match;";
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute("SET FOREIGN_KEY_CHECKS = 0;");
+			stmt.execute(tableCategory);
+			Logger.info("Deleted table: category");
+			stmt.execute(tablePayment);
+			Logger.info("Deleted table: payment");
+			stmt.execute(tableRepeatingPayment);
+			Logger.info("Deleted table: repeating_payment");
+			stmt.execute(tableRepeatingEntry);
+			Logger.info("Deleted table: repeating_entry");
+			stmt.execute(tableTag);
+			Logger.info("Deleted table: tag");
+			stmt.execute(tableTagMatch);
+			Logger.info("Deleted table: tag_match");
+			stmt.execute("SET FOREIGN_KEY_CHECKS = 1;");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..139b20dff3bcc44e08da074c40301cef425c1a93
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java
@@ -0,0 +1,245 @@
+package de.deadlocker8.budgetmasterserver.logic.database.handler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
+import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class SqliteDatabaseHandler extends DatabaseHandler
+{
+	public SqliteDatabaseHandler(Settings settings) throws IllegalStateException
+	{
+		super(settings);
+		connect();
+	}
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT last_insert_rowid() as `ID`");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("ID");				
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE strftime('%Y', Date) = ? AND strftime('%m', Date) = ?;");
+			stmt.setString(1, String.format("%02d", year));
+			stmt.setString(2, String.format("%02d", month));
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND strftime('%Y', repeating_entry.Date) = ? AND strftime('%m', repeating_entry.Date) = ?;");
+			stmt.setString(1, String.format("%02d", year));
+			stmt.setString(2, String.format("%02d", month));		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");
+
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate)
+	{	
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE Date BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);			
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");				
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+			
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND repeating_entry.Date BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");				
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");		
+			
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public void deleteDatabase()
+	{
+		Statement stmt = null;
+		String tableCategory = "DROP TABLE IF EXISTS category;";
+		String tablePayment = "DROP TABLE IF EXISTS payment;";
+		String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;";
+		String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;";
+		String tableTag = "DROP TABLE IF EXISTS tag;";
+		String tableTagMatch = "DROP TABLE IF EXISTS tag_match;";
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(tableCategory);
+			Logger.info("Deleted table: category");
+			stmt.execute(tablePayment);
+			Logger.info("Deleted table: payment");
+			stmt.execute(tableRepeatingPayment);
+			Logger.info("Deleted table: repeating_payment");
+			stmt.execute(tableRepeatingEntry);
+			Logger.info("Deleted table: repeating_entry");
+			stmt.execute(tableTag);
+			Logger.info("Deleted table: tag");
+			stmt.execute(tableTagMatch);
+			Logger.info("Deleted table: tag_match");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java
similarity index 89%
rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java
index 2a0844fcbed652a541c1c49857556cd25189e4d3..4b65d91329fc409ebcdd4835c63209bda5bba1a0 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java
@@ -1,7 +1,6 @@
-package de.deadlocker8.budgetmasterserver.logic.database;
+package de.deadlocker8.budgetmasterserver.logic.database.taghandler;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -10,17 +9,17 @@ import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
 import logger.Logger;
 
-public class DatabaseTagHandler
+public abstract class DatabaseTagHandler
 {
-	private Connection connection;
-	private Settings settings;
+	Connection connection;
+	Settings settings;
 	
 	public DatabaseTagHandler(Settings settings) throws IllegalStateException
     {
 		this.settings = settings;
-        connect();
     }
 	
 	public void connect()
@@ -29,7 +28,7 @@ public class DatabaseTagHandler
 		{
 			if(connection == null || connection.isClosed())
 			{				
-				this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
+				this.connection = Utils.getDatabaseConnection(settings); 
 			}
 		}
 		catch(Exception e)
@@ -51,7 +50,7 @@ public class DatabaseTagHandler
 		}
 	}
 	
-	private void closeStatement(Statement statement)
+	void closeStatement(Statement statement)
 	{
 		if(statement != null)
 		{
@@ -65,31 +64,7 @@ public class DatabaseTagHandler
 		}
 	}
 	
-	public int getLastInsertID()
-	{
-		PreparedStatement stmt = null;
-		int lastInsertID = 0;
-		try
-		{
-			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
-			}
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeStatement(stmt);
-		}
-
-		return lastInsertID;
-	}
+	public abstract int getLastInsertID();
 	
 	public ArrayList<Tag> getAllTags()
 	{	   
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..70b319a02a894763d907bfac904ce61563688c64
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java
@@ -0,0 +1,45 @@
+package de.deadlocker8.budgetmasterserver.logic.database.taghandler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class MysqlDatabaseTagHandler extends DatabaseTagHandler
+{
+	public MysqlDatabaseTagHandler(Settings settings) throws IllegalStateException
+    {
+		super(settings);
+        connect();
+    }
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
+			}
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3e3fcba629a9d10f84e03bc75388457fe4459a8
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java
@@ -0,0 +1,46 @@
+package de.deadlocker8.budgetmasterserver.logic.database.taghandler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class SqliteDatabaseTagHandler extends DatabaseTagHandler
+{
+	public SqliteDatabaseTagHandler(Settings settings) throws IllegalStateException
+    {
+		super(settings);
+        connect();
+    }
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT last_insert_rowid() as `ID`");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("ID");				
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java
index eb3a19f902e893737a2313c3b84d29a3d87e0731..6083c46fefc9700a5de59b90022c9667cc755012 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java
@@ -46,6 +46,7 @@ public class Main
 			
 			if(!Files.exists(settingsPath))
 			{
+				Logger.warning("No settings file found! Creating default settings file...");
 				try
 				{
 					Files.copy(SparkServer.class.getClassLoader().getResourceAsStream("de/deadlocker8/budgetmasterserver/settings.json"), settingsPath);
@@ -60,6 +61,39 @@ public class Main
 			try
 			{
 				settings = Utils.loadSettings();
+				boolean settingsChanged = false;
+				if(settings.getDatabaseType() == null)
+				{
+					settings.setDatabaseType("mysql");
+					settingsChanged = true;
+				}
+				
+				if(!settings.getDatabaseType().equals("mysql") && !settings.getDatabaseType().equals("sqlite"))
+				{
+					Logger.error(settings.getDatabaseType() + " is no valid database type! (allowed types are: mysql and sqlite)");
+					return;
+				}
+				
+				if(settings.getDatabaseType().equals("sqlite") && (settings.getDatabaseUrl() == null || settings.getDatabaseUrl().equals("")))
+				{
+					Logger.warning("There is no save path  specified for the sqlite database file. It will be saved as \"BudgetMaster.db\" in current directory.");
+					settings.setDatabaseUrl(System.getProperty("user.dir").replace("\\", "/") + "/BudgetMaster.db");
+					settingsChanged = true;
+				}
+				
+				if(settings.getDatabaseUrl().contains("jdbc"))
+				{
+					settings.setDatabaseUrl(settings.getDatabaseUrl().replace("jdbc:mysql://", ""));
+					settingsChanged = true;
+				}
+				
+				
+				if(settingsChanged)
+				{
+					Logger.warning("Settings file is not up to date! Updated settings to new version.");
+					Utils.saveSettings(settings);
+				}
+				
 				VersionInformation versionInfo = new VersionInformation();
 				versionInfo.setVersionCode(Integer.parseInt(Localization.getString("version.code")));
 				versionInfo.setVersionName(Localization.getString("version.name"));
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index 3a0f1d91b1c1d4ed851e676f01ca34e28fd18adf..5ff516091fb8490d558beb75b0cfb94d42e7703b 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -12,7 +12,6 @@ import static spark.Spark.secure;
 
 import java.io.File;
 import java.sql.Connection;
-import java.sql.DriverManager;
 
 import org.joda.time.DateTime;
 
@@ -22,9 +21,9 @@ import com.google.gson.GsonBuilder;
 import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseCreator;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryAdd;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryDelete;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryGet;
@@ -109,11 +108,14 @@ public class SparkServer
 		
 		RouteOverview.enableRouteOverview();
 		
+		Logger.info("Trying to connect to database (jdbc:" + settings.getDatabaseType() + "://" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")");
+		
 		try
 		{
-			Connection connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
-			new DatabaseCreator(connection, settings);
-			Logger.info("Successfully initialized database (" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")");
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			Logger.info("Successfully initialized database (jdbc:" + settings.getDatabaseType() + "://" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")");
 			connection.close();
 		}
 		catch(Exception e)
@@ -131,72 +133,72 @@ public class SparkServer
 				halt(401, "Unauthorized");
 			}
 
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			RepeatingPaymentUpdater paymentUpdater = new RepeatingPaymentUpdater(handler);
 			paymentUpdater.updateRepeatingPayments(DateTime.now());
 			handler.closeConnection();
 		});
 
 		// Category
-		get("/category", new CategoryGetAll(new DatabaseHandler(settings), gson));
-		get("/category/single", new CategoryGet(new DatabaseHandler(settings), gson));
-		post("/category", new CategoryAdd(new DatabaseHandler(settings)));
-		put("/category", new CategoryUpdate(new DatabaseHandler(settings)));
-		delete("/category", new CategoryDelete(new DatabaseHandler(settings)));
+		get("/category", new CategoryGetAll(Utils.getDatabaseHandler(settings), gson));
+		get("/category/single", new CategoryGet(Utils.getDatabaseHandler(settings), gson));
+		post("/category", new CategoryAdd(Utils.getDatabaseHandler(settings)));
+		put("/category", new CategoryUpdate(Utils.getDatabaseHandler(settings)));
+		delete("/category", new CategoryDelete(Utils.getDatabaseHandler(settings)));
 
 		// Payment
-		get("/payment/search", new PaymentSearch(new DatabaseHandler(settings), new DatabaseTagHandler(settings)));
-		get("/payment/search/maxAmount", new PaymentMaxAmount(new DatabaseHandler(settings), gson));
+		get("/payment/search", new PaymentSearch(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings)));
+		get("/payment/search/maxAmount", new PaymentMaxAmount(Utils.getDatabaseHandler(settings), gson));
 		// Normal
-		get("/payment", new PaymentGet(new DatabaseHandler(settings), gson));
-		post("/payment", new PaymentAdd(new DatabaseHandler(settings), gson));
-		put("/payment", new PaymentUpdate(new DatabaseHandler(settings)));
-		delete("/payment", new PaymentDelete(new DatabaseHandler(settings), new DatabaseTagHandler(settings)));
+		get("/payment", new PaymentGet(Utils.getDatabaseHandler(settings), gson));
+		post("/payment", new PaymentAdd(Utils.getDatabaseHandler(settings), gson));
+		put("/payment", new PaymentUpdate(Utils.getDatabaseHandler(settings)));
+		delete("/payment", new PaymentDelete(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings)));
 
 		// Repeating
-		get("/repeatingpayment/single", new RepeatingPaymentGet(new DatabaseHandler(settings), gson));
-		get("/repeatingpayment", new RepeatingPaymentGetAll(new DatabaseHandler(settings), gson));
-		post("/repeatingpayment", new RepeatingPaymentAdd(new DatabaseHandler(settings), gson));
-		delete("/repeatingpayment", new RepeatingPaymentDelete(new DatabaseHandler(settings), new DatabaseTagHandler(settings)));
+		get("/repeatingpayment/single", new RepeatingPaymentGet(Utils.getDatabaseHandler(settings), gson));
+		get("/repeatingpayment", new RepeatingPaymentGetAll(Utils.getDatabaseHandler(settings), gson));
+		post("/repeatingpayment", new RepeatingPaymentAdd(Utils.getDatabaseHandler(settings), gson));
+		delete("/repeatingpayment", new RepeatingPaymentDelete(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings)));
 		
 		// CategoryBudget
-		get("/categorybudget", new CategoryBudgetGet(new DatabaseHandler(settings), gson));
+		get("/categorybudget", new CategoryBudgetGet(Utils.getDatabaseHandler(settings), gson));
 		
 		// Rest
-		get("/rest", new RestGet(new DatabaseHandler(settings), gson));		
+		get("/rest", new RestGet(Utils.getDatabaseHandler(settings), gson));		
 
 		// charts
-		get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(new DatabaseHandler(settings), gson));
-		get("/charts/monthInOutSum", new MonthInOutSum(new DatabaseHandler(settings), gson));
+		get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(Utils.getDatabaseHandler(settings), gson));
+		get("/charts/monthInOutSum", new MonthInOutSum(Utils.getDatabaseHandler(settings), gson));
 		
 		// tag
-		get("/tag/single", new TagGet(new DatabaseTagHandler(settings), gson));
-		get("/tag/single/byName", new TagGetByName(new DatabaseTagHandler(settings), gson));
-		get("/tag", new TagGetAll(new DatabaseTagHandler(settings), gson));
-		post("/tag", new TagAdd(new DatabaseTagHandler(settings)));
-		delete("/tag", new TagDelete(new DatabaseTagHandler(settings)));
+		get("/tag/single", new TagGet(Utils.getDatabaseTagHandler(settings), gson));
+		get("/tag/single/byName", new TagGetByName(Utils.getDatabaseTagHandler(settings), gson));
+		get("/tag", new TagGetAll(Utils.getDatabaseTagHandler(settings), gson));
+		post("/tag", new TagAdd(Utils.getDatabaseTagHandler(settings)));
+		delete("/tag", new TagDelete(Utils.getDatabaseTagHandler(settings)));
 		
 		// tag match
-		get("/tag/match/all/normal", new TagMatchGetAllForPayment(new DatabaseTagHandler(settings), gson));
-		get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(new DatabaseTagHandler(settings), gson));
-		get("/tag/match/normal", new TagMatchExistingForPayment(new DatabaseTagHandler(settings), gson));
-		get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(new DatabaseTagHandler(settings), gson));
-		post("/tag/match/normal", new TagMatchAddForPayment(new DatabaseTagHandler(settings)));
-		post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(new DatabaseTagHandler(settings)));
-		delete("/tag/match/normal", new TagMatchDeleteForPayment(new DatabaseTagHandler(settings)));
-		delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(new DatabaseTagHandler(settings)));
+		get("/tag/match/all/normal", new TagMatchGetAllForPayment(Utils.getDatabaseTagHandler(settings), gson));
+		get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(Utils.getDatabaseTagHandler(settings), gson));
+		get("/tag/match/normal", new TagMatchExistingForPayment(Utils.getDatabaseTagHandler(settings), gson));
+		get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(Utils.getDatabaseTagHandler(settings), gson));
+		post("/tag/match/normal", new TagMatchAddForPayment(Utils.getDatabaseTagHandler(settings)));
+		post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(Utils.getDatabaseTagHandler(settings)));
+		delete("/tag/match/normal", new TagMatchDeleteForPayment(Utils.getDatabaseTagHandler(settings)));
+		delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(Utils.getDatabaseTagHandler(settings)));
 
 		// Database
 		get("/database", new DatabaseExport(settings, gson));
-		post("/database", new DatabaseImport(new DatabaseHandler(settings), new DatabaseTagHandler(settings), gson));
-		delete("/database", new DatabaseDelete(new DatabaseHandler(settings), settings));
+		post("/database", new DatabaseImport(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings), gson));
+		delete("/database", new DatabaseDelete(Utils.getDatabaseHandler(settings), settings));
 		
 		get("/info", new InformationGet(gson, versionInfo, settings));
 		get("/version", new VersionGet(gson, versionInfo));
 		delete("/log", new LogDelete());
 
 		after((request, response) -> {
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			RepeatingPaymentUpdater paymentUpdater = new RepeatingPaymentUpdater(handler);
 			paymentUpdater.updateRepeatingPayments(DateTime.now());
 			handler.closeConnection();
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java
index 80b4673cbc1df94bdeda5d4bac7fc521374ed9a5..4a5e3fa258a2bdd2ff3c5fb1f18a7e4b439e13ab 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.category;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
@@ -11,7 +11,7 @@ public class CategoryAdd implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	
-	public CategoryAdd( DatabaseHandler handler)
+	public CategoryAdd(DatabaseHandler handler)
 	{	
 		this.handler = handler;
 	}
@@ -19,6 +19,7 @@ public class CategoryAdd implements AdvancedRoute
 	@Override
 	public void before()
 	{
+		handler.connect();
 	}
 
 	@Override
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java
index e8c137e639f4b47b45ddd41b5d051cd794a5fe56..e1b80572c702584a7e63b41e35754f579c273fc4 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.category;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java
index c33e5f3b82861ba1fa026b9166a371f0416a2ad7..1fd8abe32f79a99dbc0205d81961865d13898438 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java
@@ -6,7 +6,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.category.Category;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java
index 27f7c5ae479a4b0327e8553e4d09e8fb4ede982d..1e6af5f18d3bb93134e76ca200c25dc5c22f427c 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java
@@ -9,7 +9,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.category.Category;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java
index a5ab6addbe7b1e90930f7ab8aae02ce933097356..8f651e484a685143788ee9a128d275771aeed184 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.category;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
index 08f9b94b3144d112bd4dc378fd5557fa3025ad5d..545365e594dbbf0bf95a647de9093e62e75acae2 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
@@ -13,7 +13,7 @@ import de.deadlocker8.budgetmaster.logic.category.Category;
 import de.deadlocker8.budgetmaster.logic.category.CategoryBudget;
 import de.deadlocker8.budgetmaster.logic.payment.Payment;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java
index 36c9d654e5e30d36e58f0634ac0b36cad9729522..6aad5ea8afdfbdfb497b8e66247a26a3ced7a84b 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java
@@ -10,7 +10,7 @@ import de.deadlocker8.budgetmaster.logic.category.Category;
 import de.deadlocker8.budgetmaster.logic.charts.CategoryInOutSum;
 import de.deadlocker8.budgetmaster.logic.payment.Payment;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java
index 05c059e3e1ff724de86ad8f8eb98e36be6e3d7fd..292fae1f31afa02f271be7ef1406c5587de8a96a 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java
@@ -12,7 +12,7 @@ import de.deadlocker8.budgetmaster.logic.category.Category;
 import de.deadlocker8.budgetmaster.logic.charts.CategoryInOutSum;
 import de.deadlocker8.budgetmaster.logic.payment.Payment;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java
index 33014e1c74efb3e1a6a6e847ac036f6eab19c962..e6a5f5ced5935bf653632800019affe044d34fb0 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseDelete.java
@@ -3,13 +3,13 @@ package de.deadlocker8.budgetmasterserver.server.database;
 import static spark.Spark.halt;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.SQLException;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseCreator;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import logger.Logger;
 import spark.Request;
 import spark.Response;
@@ -37,8 +37,9 @@ public class DatabaseDelete implements AdvancedRoute
 		try
 		{							
 			handler.deleteDatabase();
-			Connection connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
-			new DatabaseCreator(connection, settings);
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
 			Logger.info("Successfully initialized database (" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")");
 	
 			return "";
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java
index ef4612be1a9eed5a3cdb441432e705bb12a27ab4..65800d25ddff4083fccc56b147893bb58b8f65f2 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java
@@ -6,9 +6,9 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.database.Database;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseImporter;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import logger.Logger;
 import spark.Request;
 import spark.Response;
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
index d4a2dd0f3cfc7b58daeb32dcedb74a474320b190..b6bc9fd85da4272e16e8d2d0f8ce07673ed8a191 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
@@ -5,7 +5,7 @@ import static spark.Spark.halt;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
index 45a593f1e981cf6bf874e33cc39c8c610a0138b3..fe70574aa24ff13f1d01908331426bf316588bb5 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
@@ -5,8 +5,8 @@ import static spark.Spark.halt;
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java
index 545d4ccd292278ae84dec0b607683f4d4a0afcd0..d82b8842b3a37c968785968711fb2981e0867f8b 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java
@@ -10,7 +10,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.server.updater.RepeatingPaymentUpdater;
 import spark.Request;
 import spark.Response;
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java
index 355b6c9eb35798ff2e7a416adfc6a995fd867307..e0e94e52d9e2bbdb7f5a81e53188486d625759fd 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
index aafc7d566897a9831c3817a440e2588e709a70b2..05c1bd614d6f3b557f97cdc7f78148acda90c5fa 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
@@ -5,7 +5,7 @@ import static spark.Spark.halt;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
index a407409323b3f26fa73c28206bcfbd9c3777a389..1ba52b1a2c90a42603eb733e8f2fcd1cc14c93f6 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
@@ -5,8 +5,8 @@ import static spark.Spark.halt;
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java
index b904925396301f0d14e9dab3fbea97ec702d3438..f1ef2b2a38d0be9f6f710e9eb3e46f3d7089c1ab 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java
@@ -6,7 +6,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java
index 4a5aa61f4d6b49baff59d198f1250f9d5c382114..88dbe39ffb5c270158febc78ceeed0a20c084985 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java
@@ -10,7 +10,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.server.updater.RepeatingPaymentUpdater;
 import spark.Request;
 import spark.Response;
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java
index cd6bc68558adf379fb62c094f866f55c0275ec79..e64331e253b10ebaa7d919b8fd431a4224101912 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java
@@ -5,7 +5,7 @@ import static spark.Spark.halt;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java
index 3feb937d920bef42beb3c1d8b1f6f96451d5b127..4c9a8987e82bdf727f7e067661d1c683cd1e2b27 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java
@@ -13,8 +13,8 @@ import de.deadlocker8.budgetmaster.logic.payment.PaymentJSONSerializer;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java
index b1a1e00838a405b633f8f626a49bfccf47f4d5c8..03e26be3425bf53cf418cd7aa6956a1e635bc6b2 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java
@@ -5,7 +5,7 @@ import static spark.Spark.halt;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java
index ade52651680ed8750b4606cbe85288bf092f513c..85533edccee9ded42a02bb95ca0edcd3f65dcd8f 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java
index 58dd6ce2d4346a80548cc0ee2204e3447eea6d7e..f82989dce43ad5d3f20d99d31d7822ef0f410fcd 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
index fa472b60e59f4bc117222bc569ccb182a22a41cc..b607b3fc8a475e88bd1298c850b69d6983e2bbef 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import de.deadlocker8.budgetmasterserver.server.updater.TagUpdater;
 import spark.Request;
 import spark.Response;
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
index 1573d495e6e8ef155ba1d4ffc7d3c717e954b803..e8d9b4dd61a70d470c03207e57680bd3d3e4cbf3 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import de.deadlocker8.budgetmasterserver.server.updater.TagUpdater;
 import spark.Request;
 import spark.Response;
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java
index 5ebc766c70c5c457bd6c5c0ee2d7b0060a2c9f96..c14317c7e6318de787c50ddedcf476d0880f8619 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java
@@ -5,7 +5,7 @@ import static spark.Spark.halt;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java
index e44eca84437c788d90edc8b77eea8bd94e43b875..6bc8dd8a2d84d8eb7ce2b0767d572c9dce76597c 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java
@@ -5,7 +5,7 @@ import static spark.Spark.halt;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
index e558cc36cd4dbfe32702a9a8dab065feace17ab2..dcea960f421f1115b3eb11f1aa6b3b71abe93b52 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
@@ -8,7 +8,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java
index 2dc02afaa5b43362da92b816417890ced3bed878..45d3ec84f142eeb61b8d433bdf36d9a4093fccbe 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java
@@ -8,7 +8,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java
index 18c892ccc16cf402ff49ff5c7e5d5ca94570fe0e..03dddec883199737478b354444cc5fcfbddbd250 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.tag;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java
index 3b08cee137404b6a84d1487f167513538518c6ee..df498f1d5260d39867692ce4f39133708e228d79 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.tag.tag;
 import static spark.Spark.halt;
 
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
index 4d1704b9a22d6e4e4f11016c3e9560ff00c2d2f7..1a6f419b191e2c762250d394449550c18b9885b9 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
@@ -6,7 +6,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java
index 9cac86976375fe579197ba05fbc92c2f7c0640c6..3fc9d143729c636eb20a22cd58a76a4e50807e46 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java
@@ -8,7 +8,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
index 7e2816d1686eaef98165d7cfa7117378090c6eba..c2d834a1b04e30820f5d305eb2fd89dcb9e87e9f 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
@@ -6,7 +6,7 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java
index 5c22f4c42ffd5a3ac7a5a0b85960f756c2fed21a..6baa1a309ee9fa16db207ec8692bec8bead0089e 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java
@@ -8,7 +8,7 @@ import org.joda.time.Months;
 
 import de.deadlocker8.budgetmaster.logic.payment.LatestRepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import logger.Logger;
 
 public class RepeatingPaymentUpdater
@@ -82,8 +82,8 @@ public class RepeatingPaymentUpdater
 		if(payment.getRepeatInterval() != 0)
 		{			
 			int numberOfDays = Days.daysBetween(startDate, now).getDays();			
-			int occurrences = numberOfDays / payment.getRepeatInterval();				
-			for(int i = 0; i <= occurrences + 1; i++)
+			int occurrences = numberOfDays / payment.getRepeatInterval();
+			for(int i = 0; i <= occurrences; i++)
 			{
 				dates.add(startDate.plusDays(i * payment.getRepeatInterval()));
 			}
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
index 1263871aee24650744f3cf742506dbf93505bca9..1776c9be0d3ed3367181b8b5e588750c93b1b841 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.updater;
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 
 public class TagUpdater
 {
diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json
index fa065f988324083afb1c194089be199d78abf367..4de1cf29b1942c6d0fab4778daf28fe5573f7eca 100644
--- a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json
+++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json
@@ -1,5 +1,6 @@
 {
-	"databaseUrl": "jdbc:mysql://localhost:3306/",
+	"databaseType": "mysql",
+	"databaseUrl": "localhost:3306/",
 	"databaseName": "budgetmaster",
 	"databaseUsername": "root",
 	"databasePassword": "",
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java
index bf5afebfac2a509c3b5f770922cdddcf7ff6b5ff..4014f6c7925a10bd958d85cb4c36586842a08788 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseHandlerTest.java
@@ -8,7 +8,6 @@ import static org.junit.Assert.fail;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Locale;
@@ -24,8 +23,8 @@ import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.Utils;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseCreator;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import tools.Localization;
 
 public class DatabaseHandlerTest
@@ -40,13 +39,14 @@ public class DatabaseHandlerTest
 			//init
 			Settings settings = Utils.loadSettings();
 			System.out.println(settings);
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			handler.deleteDatabase();
 			handler.closeConnection();
-			Connection connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
-			new DatabaseCreator(connection, settings);
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
 			connection.close();
-			databaseHandler = new DatabaseHandler(settings);
+			databaseHandler = Utils.getDatabaseHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
@@ -75,7 +75,7 @@ public class DatabaseHandlerTest
 		Category expected = new Category("123 Tü+?est Category", "#FF0000");
 		databaseHandler.addCategory(expected.getName(), expected.getColor());
 		//3 because "NONE" and "Übertrag" has already been inserted at database creation	
-		assertEquals(3, databaseHandler.getLastInsertID());		
+		assertEquals(3, databaseHandler.getLastInsertID());
 	}
 	
 	@Test
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java
index 8a811f873d4a75938d6195e7bc30d726501e4808..f3d334296576c27bd1c96ad8ea6286fbb7ee507e 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseImportExportTest.java
@@ -9,7 +9,6 @@ import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Locale;
@@ -29,11 +28,11 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.Utils;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseCreator;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseExporter;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseImporter;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import tools.Localization;
 
 public class DatabaseImportExportTest
@@ -50,14 +49,15 @@ public class DatabaseImportExportTest
 			//init
 			settings = Utils.loadSettings();
 			System.out.println(settings);
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			handler.deleteDatabase();
 			handler.closeConnection();
-			Connection connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
-			new DatabaseCreator(connection, settings);
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
 			connection.close();
-			databaseHandler = new DatabaseHandler(settings);
-			tagHandler = new DatabaseTagHandler(settings);
+			databaseHandler = Utils.getDatabaseHandler(settings);
+			tagHandler = Utils.getDatabaseTagHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
@@ -136,10 +136,11 @@ public class DatabaseImportExportTest
 		{
 			databaseHandler.deleteDatabase();
 			databaseHandler.closeConnection();
-			Connection connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
-			new DatabaseCreator(connection, settings);
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
 			connection.close();			
-			databaseHandler = new DatabaseHandler(settings);
+			databaseHandler = Utils.getDatabaseHandler(settings);;
 			
 			File file = Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json").toFile();
 			Database database = FileHelper.loadDatabaseJSON(file);			
@@ -152,7 +153,6 @@ public class DatabaseImportExportTest
 			Gson gson = new GsonBuilder().setPrettyPrinting().create();
 			String databaseJSON = gson.toJson(exporter.exportDatabase()).replaceAll("\n", "");
 			FileHelper.saveDatabaseJSON(file, databaseJSON);
-			FileHelper.saveDatabaseJSON(new File("C:/Users/ROGO2/Desktop/123.json"), databaseJSON);
 			
 			String expectedJSON = new String(Files.readAllBytes(Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json")));
 			String exportedJSON = new String(Files.readAllBytes(Paths.get("src/test/resources/de/deadlocker8/budgetmaster/export.json")));		
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java
index aa8270b536c1150206fb27f5c6a2b7d0c4a39ea1..49d8a5fef10046b726a37488946e5d1495b9c6c4 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java
@@ -9,7 +9,6 @@ import static org.junit.Assert.fail;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Locale;
@@ -22,9 +21,9 @@ import org.junit.Test;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.Utils;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseCreator;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import tools.Localization;
 
 public class DatabaseTagHandlerTest
@@ -39,13 +38,14 @@ public class DatabaseTagHandlerTest
 			//init
 			Settings settings = Utils.loadSettings();
 			System.out.println(settings);
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			handler.deleteDatabase();
 			handler.closeConnection();
-			Connection connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
-			new DatabaseCreator(connection, settings);
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
 			connection.close();
-			tagHandler = new DatabaseTagHandler(settings);
+			tagHandler = Utils.getDatabaseTagHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java
index cd660fadeff8ab2b817352d3015b707c77277490..7a9329b642561f3b5ac477d8c3b5dc73f83a538c 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java
@@ -21,14 +21,15 @@ public class SettingsTest
 			Settings settings = Utils.loadSettings();
 			
 			Settings expectedSettings = new Settings();
-			expectedSettings.setDatabaseName("b");
-			expectedSettings.setDatabaseUrl("jdbc:mysql://localhost:3306/");
+			expectedSettings.setDatabaseType("mysql");
+			expectedSettings.setDatabaseName("budgetmaster");
+			expectedSettings.setDatabaseUrl("localhost:3306/");
 			expectedSettings.setDatabaseUsername("root");
 			expectedSettings.setDatabasePassword("");
 			expectedSettings.setServerPort(9000);
 			expectedSettings.setServerSecret("geheim");
-			expectedSettings.setKeystorePath("C:/Programmierung/eclipse/workspace/BudgetMaster/certs/keystore_self_signed.jks");
-			expectedSettings.setKeystorePassword("geheim");			
+			expectedSettings.setKeystorePath("default");
+			expectedSettings.setKeystorePassword("BudgetMaster");	
 			
 			assertEquals(expectedSettings, settings);
 		}