From b844d271baebdf4ad9b7a3d76b31f37f1baf8a3e Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 3 Nov 2017 15:09:39 +0100
Subject: [PATCH] Fixed #225 - database connection error after long idle time

---
 BudgetMasterClient/pom.xml                    |   2 +-
 .../budgetmaster/languages/_de.properties     |   6 +-
 .../budgetmaster/languages/_en.properties     |   6 +-
 BudgetMasterServer/pom.xml                    |   2 +-
 .../logic/AdvancedRoute.java                  |  19 +++
 .../logic/database/DatabaseHandler.java       | 124 ++++++++++++------
 .../logic/database/DatabaseTagHandler.java    |  74 +++++++----
 .../server/SparkServer.java                   |  99 ++++++++------
 .../server/category/CategoryAdd.java          |  17 ++-
 .../server/category/CategoryDelete.java       |  18 ++-
 .../server/category/CategoryGet.java          |  18 ++-
 .../server/category/CategoryGetAll.java       |  22 +++-
 .../server/category/CategoryUpdate.java       |  18 ++-
 .../categorybudget/CategoryBudgetGet.java     |  67 ++++++----
 .../charts/CategoryInOutSumForMonth.java      |  18 ++-
 .../server/charts/MonthInOutSum.java          |  18 ++-
 .../server/database/DatabaseDelete.java       |  32 ++++-
 .../server/database/DatabaseExport.java       |  16 ++-
 .../server/database/DatabaseImport.java       |  30 +++--
 .../server/info/InformationGet.java           |  16 ++-
 .../server/info/VersionGet.java               |  16 ++-
 .../server/log/LogDelete.java                 |  18 ++-
 .../server/payment/normal/PaymentAdd.java     |  82 +++++++-----
 .../server/payment/normal/PaymentDelete.java  |  19 ++-
 .../server/payment/normal/PaymentGet.java     |  20 ++-
 .../server/payment/normal/PaymentUpdate.java  |  96 ++++++++------
 .../repeating/RepeatingPaymentAdd.java        |  67 +++++-----
 .../repeating/RepeatingPaymentDelete.java     |  20 ++-
 .../repeating/RepeatingPaymentGet.java        |  18 ++-
 .../repeating/RepeatingPaymentGetAll.java     |  18 ++-
 .../payment/search/PaymentMaxAmount.java      |  18 ++-
 .../server/payment/search/PaymentSearch.java  | 104 ++++++++-------
 .../server/rest/RestGet.java                  |  18 ++-
 .../tag/match/TagMatchAddForPayment.java      |  18 ++-
 .../match/TagMatchAddForRepeatingPayment.java |  18 ++-
 .../tag/match/TagMatchDeleteForPayment.java   |  18 ++-
 .../TagMatchDeleteForRepeatingPayment.java    |  18 ++-
 .../tag/match/TagMatchExistingForPayment.java |  18 ++-
 .../TagMatchExistingForRepeatingPayment.java  |  18 ++-
 .../tag/match/TagMatchGetAllForPayment.java   |  18 ++-
 .../TagMatchGetAllForRepeatingPayment.java    |  18 ++-
 .../server/tag/tag/TagAdd.java                |  18 ++-
 .../server/tag/tag/TagDelete.java             |  18 ++-
 .../server/tag/tag/TagGet.java                |  18 ++-
 .../server/tag/tag/TagGetAll.java             |  18 ++-
 .../server/tag/tag/TagGetByName.java          |  18 ++-
 .../updater/RepeatingPaymentUpdater.java      |   4 +-
 .../budgetmasterserver/_en.properties         |   6 +-
 .../tests/database/DatabaseHandlerTest.java   |  33 ++++-
 .../database/DatabaseImportExportTest.java    |  38 +++++-
 .../database/DatabaseTagHandlerTest.java      |  30 ++++-
 51 files changed, 1059 insertions(+), 422 deletions(-)
 create mode 100644 BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java

diff --git a/BudgetMasterClient/pom.xml b/BudgetMasterClient/pom.xml
index 1d5b244e4..af6a7b9b5 100644
--- a/BudgetMasterClient/pom.xml
+++ b/BudgetMasterClient/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.deadlocker8</groupId>
 	<artifactId>BudgetMasterClient</artifactId>
-	<version>1.7.0</version>
+	<version>1.8.0</version>
 	<name>BudgetMasterClient</name>
 	<build>
 		<plugins>
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
index 3c9a5ea1f..c3d0c4bff 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
@@ -1,8 +1,8 @@
 # DEFAULT
 app.name=BudgetMaster
-version.code=11
-version.name=1.7.0
-version.date=26.10.17
+version.code=12
+version.name=1.8.0_alpha
+version.date=03.11.17
 author=Robert Goldmann
 credits=L�nderflaggen von Freepik auf https://www.flaticon.com\nVerwendete Schriftarten: OpenSans
 
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
index f0cb6b148..04f8fbe66 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
@@ -1,8 +1,8 @@
 # DEFAULT
 app.name=BudgetMaster
-version.code=11
-version.name=1.7.0
-version.date=26.10.17
+version.code=12
+version.name=1.8.0_alpha
+version.date=03.11.17
 author=Robert Goldmann
 credits=Flags by Freepik on https://www.flaticon.com\nFonts used: OpenSans
 
diff --git a/BudgetMasterServer/pom.xml b/BudgetMasterServer/pom.xml
index 0a022441b..2fc7fb501 100644
--- a/BudgetMasterServer/pom.xml
+++ b/BudgetMasterServer/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.deadlocker8</groupId>
 	<artifactId>BudgetMasterServer</artifactId>
-	<version>1.7.0</version>
+	<version>1.8.0</version>
 	<name>BudgetMasterServer</name>
 	<build>
 		<plugins>
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java
new file mode 100644
index 000000000..898188ab9
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java
@@ -0,0 +1,19 @@
+package de.deadlocker8.budgetmasterserver.logic;
+
+import spark.Request;
+import spark.Response;
+import spark.Route;
+
+public interface AdvancedRoute extends Route
+{
+	void before();
+	Object handleRequest(Request req, Response res);
+	void after();
+	default Object handle(Request request, Response response) throws Exception
+	{
+		before();
+		Object value = handleRequest(request, response);
+		after();
+		return value;
+	}
+}
\ 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/DatabaseHandler.java
index b9f91615a..5f471c460 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
@@ -24,15 +24,23 @@ import logger.Logger;
 public class DatabaseHandler
 {
 	private Connection connection;
+	private Settings settings;
 	private final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
 
 	public DatabaseHandler(Settings settings) throws IllegalStateException
+	{
+		this.settings = settings;
+		connect();
+	}
+	
+	public void connect()
 	{
 		try
 		{
-			this.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() + ")");
+			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());
+			}
 		}
 		catch(Exception e)
 		{
@@ -41,7 +49,19 @@ public class DatabaseHandler
 		}
 	}
 	
-	private void closeConnection(Statement statement)
+	public void closeConnection()
+	{
+		try
+		{
+			connection.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+	}
+	
+	private void closeStatement(Statement statement)
 	{
 		if(statement != null)
 		{
@@ -71,6 +91,7 @@ public class DatabaseHandler
 			{
 				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -78,7 +99,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return lastInsertID;
@@ -105,6 +126,7 @@ public class DatabaseHandler
 					dateTime = formatter.parseDateTime(rs.getString("min"));
 				}
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -112,7 +134,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return dateTime;
@@ -139,6 +161,7 @@ public class DatabaseHandler
 					dateTime = formatter.parseDateTime(rs.getString("min"));
 				}
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -146,7 +169,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return dateTime;
@@ -229,6 +252,7 @@ public class DatabaseHandler
 
 				results.add(new Category(id, name, color));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -236,7 +260,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -259,6 +283,7 @@ public class DatabaseHandler
 
 				result = new Category(id, name, color);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -266,7 +291,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return result;
@@ -291,6 +316,7 @@ public class DatabaseHandler
 
 				result = new Category(id, categoryName, categoryColor);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -298,7 +324,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return result;
@@ -320,6 +346,7 @@ public class DatabaseHandler
 					exists = true;
 				}
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -327,7 +354,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return exists;
@@ -350,9 +377,10 @@ public class DatabaseHandler
 				String date = rs.getString("Date");
 				int categoryID = rs.getInt("CategoryID");
 				String description = rs.getString("Description");
-
+				rs.close();
 				return new NormalPayment(resultID, amount, date, categoryID, name, description);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -360,7 +388,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return null;
@@ -388,6 +416,7 @@ public class DatabaseHandler
 
 				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -395,7 +424,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -424,6 +453,7 @@ public class DatabaseHandler
 
 				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -431,7 +461,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -460,6 +490,7 @@ public class DatabaseHandler
 			
 				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -467,7 +498,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -500,6 +531,7 @@ public class DatabaseHandler
 
 				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -507,7 +539,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -540,6 +572,7 @@ public class DatabaseHandler
 			
 				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -547,7 +580,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -577,6 +610,7 @@ public class DatabaseHandler
 
 				results.add(new RepeatingPayment(resultID, amount, date, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -584,7 +618,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -608,6 +642,7 @@ public class DatabaseHandler
 
 				results.add(new LatestRepeatingPayment(resultID, repeatingPaymentID, date));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -615,7 +650,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -644,6 +679,7 @@ public class DatabaseHandler
 
 				result = new RepeatingPayment(id, amount, date, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -651,7 +687,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return result;
@@ -666,8 +702,11 @@ public class DatabaseHandler
 			ResultSet rs = stmt.executeQuery();
 			while(rs.next())
 			{
-				return rs.getInt("max");			
+				int result = rs.getInt("max");
+				rs.close();
+				return result;
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -675,7 +714,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return -1;
@@ -690,8 +729,11 @@ public class DatabaseHandler
 			ResultSet rs = stmt.executeQuery();
 			while(rs.next())
 			{
-				return rs.getInt("max");			
+				int result = rs.getInt("max");
+				rs.close();
+				return result;
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -699,7 +741,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return -1;
@@ -723,7 +765,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -742,7 +784,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -761,7 +803,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -798,7 +840,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -821,7 +863,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -842,7 +884,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -863,8 +905,11 @@ public class DatabaseHandler
 			ResultSet rs = stmt.getGeneratedKeys();
             if(rs.next())
             {
-                return rs.getInt(1);
+            	int result = rs.getInt(1);
+            	rs.close();
+                return result;
             }
+            rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -872,7 +917,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return -1;
@@ -904,8 +949,11 @@ public class DatabaseHandler
 			ResultSet rs = stmt.getGeneratedKeys();
             if(rs.next())
             {
-                return rs.getInt(1);
+            	int result = rs.getInt(1);
+            	rs.close();
+                return result;
             }
+            rs.close();
 		}
 		catch(SQLException e)
 		{			
@@ -913,7 +961,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return -1;
@@ -936,7 +984,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -960,7 +1008,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -984,7 +1032,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			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/DatabaseTagHandler.java
index 562e2b20f..2a0844fcb 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
@@ -15,21 +15,43 @@ import logger.Logger;
 public class DatabaseTagHandler
 {
 	private Connection connection;
+	private Settings settings;
 	
 	public DatabaseTagHandler(Settings settings) throws IllegalStateException
     {
-        try
-        {
-            this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin", settings.getDatabaseUsername(), settings.getDatabasePassword());
-        }
-        catch(Exception e)
-        {
-            Logger.error(e);
-            throw new IllegalStateException("Cannot connect the database!", e);
-        }
-    }	
+		this.settings = settings;
+        connect();
+    }
+	
+	public void connect()
+	{
+		try
+		{
+			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());
+			}
+		}
+		catch(Exception e)
+		{
+			Logger.error(e);
+			throw new IllegalStateException("Cannot connect the database!", e);
+		}
+	}
+	
+	public void closeConnection()
+	{
+		try
+		{
+			connection.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+	}
 	
-	private void closeConnection(Statement statement)
+	private void closeStatement(Statement statement)
 	{
 		if(statement != null)
 		{
@@ -63,7 +85,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return lastInsertID;
@@ -91,7 +113,7 @@ public class DatabaseTagHandler
         }
         finally
         {
-            closeConnection(stmt);
+            closeStatement(stmt);
         }
 
         return results;    
@@ -121,7 +143,7 @@ public class DatabaseTagHandler
         }
         finally
         {
-           closeConnection(stmt);
+           closeStatement(stmt);
         }
 
         return tag;
@@ -151,7 +173,7 @@ public class DatabaseTagHandler
         }
         finally
         {
-           closeConnection(stmt);
+           closeStatement(stmt);
         }
 
         return tag;
@@ -172,7 +194,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -191,7 +213,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -216,7 +238,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return false;
@@ -243,7 +265,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return false;
@@ -271,7 +293,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return tagIDs;
@@ -299,7 +321,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return tagIDs;
@@ -322,7 +344,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -343,7 +365,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -363,7 +385,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -383,7 +405,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -407,7 +429,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return false;
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 2e4d55abf..9f47f2ca5 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -11,6 +11,8 @@ import static spark.Spark.put;
 import static spark.Spark.secure;
 
 import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
 
 import org.joda.time.DateTime;
 
@@ -20,6 +22,7 @@ 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.server.category.CategoryAdd;
@@ -69,8 +72,6 @@ import tools.HashUtils;
 public class SparkServer
 {	
 	private Gson gson;
-	private DatabaseHandler handler;
-	private DatabaseTagHandler tagHandler;
 	
 	public SparkServer(Settings settings, VersionInformation versionInfo)
 	{
@@ -99,9 +100,19 @@ public class SparkServer
 		
 		RouteOverview.enableRouteOverview();
 		
-		handler = new DatabaseHandler(settings);
-		tagHandler = new DatabaseTagHandler(settings);
-
+		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.close();
+		}
+		catch(Exception e)
+		{
+			Logger.error(e);
+			throw new IllegalStateException("Cannot connect the database!", e);
+		}
+		
 		before((request, response) -> {
 
 			String clientSecret = request.queryMap("secret").value();
@@ -111,69 +122,75 @@ public class SparkServer
 				halt(401, "Unauthorized");
 			}
 
-			new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now());
+			DatabaseHandler handler = new DatabaseHandler(settings);
+			RepeatingPaymentUpdater paymentUpdater = new RepeatingPaymentUpdater(handler);
+			paymentUpdater.updateRepeatingPayments(DateTime.now());
+			handler.closeConnection();
 		});
 
 		// Category
-		get("/category", new CategoryGetAll(handler, gson));
-		get("/category/single", new CategoryGet(handler, gson));
-		post("/category", new CategoryAdd(handler));
-		put("/category", new CategoryUpdate(handler));
-		delete("/category", new CategoryDelete(handler));
+		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)));
 
 		// Payment
-		get("/payment/search", new PaymentSearch(handler, tagHandler));
-		get("/payment/search/maxAmount", new PaymentMaxAmount(handler, gson));
+		get("/payment/search", new PaymentSearch(new DatabaseHandler(settings), new DatabaseTagHandler(settings)));
+		get("/payment/search/maxAmount", new PaymentMaxAmount(new DatabaseHandler(settings), gson));
 		// Normal
-		get("/payment", new PaymentGet(handler, gson));
-		post("/payment", new PaymentAdd(handler, gson));
-		put("/payment", new PaymentUpdate(handler));
-		delete("/payment", new PaymentDelete(handler, tagHandler));
+		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)));
 
 		// Repeating
-		get("/repeatingpayment/single", new RepeatingPaymentGet(handler, gson));
-		get("/repeatingpayment", new RepeatingPaymentGetAll(handler, gson));
-		post("/repeatingpayment", new RepeatingPaymentAdd(handler, gson));
-		delete("/repeatingpayment", new RepeatingPaymentDelete(handler, tagHandler));
+		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)));
 		
 		// CategoryBudget
-		get("/categorybudget", new CategoryBudgetGet(handler, gson));
+		get("/categorybudget", new CategoryBudgetGet(new DatabaseHandler(settings), gson));
 		
 		// Rest
-		get("/rest", new RestGet(handler, gson));		
+		get("/rest", new RestGet(new DatabaseHandler(settings), gson));		
 
 		// charts
-		get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(handler, gson));
-		get("/charts/monthInOutSum", new MonthInOutSum(handler, gson));
+		get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(new DatabaseHandler(settings), gson));
+		get("/charts/monthInOutSum", new MonthInOutSum(new DatabaseHandler(settings), gson));
 		
 		// tag
-		get("/tag/single", new TagGet(tagHandler, gson));
-		get("/tag/single/byName", new TagGetByName(tagHandler, gson));
-		get("/tag", new TagGetAll(tagHandler, gson));
-		post("/tag", new TagAdd(tagHandler));
-		delete("/tag", new TagDelete(tagHandler));
+		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)));
 		
 		// tag match
-		get("/tag/match/all/normal", new TagMatchGetAllForPayment(tagHandler, gson));
-		get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(tagHandler, gson));
-		get("/tag/match/normal", new TagMatchExistingForPayment(tagHandler, gson));
-		get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(tagHandler, gson));
-		post("/tag/match/normal", new TagMatchAddForPayment(tagHandler));
-		post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(tagHandler));
-		delete("/tag/match/normal", new TagMatchDeleteForPayment(tagHandler));
-		delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(tagHandler));
+		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)));
 
 		// Database
 		get("/database", new DatabaseExport(settings, gson));
-		post("/database", new DatabaseImport(handler, tagHandler, gson));
-		delete("/database", new DatabaseDelete(handler, settings));
+		post("/database", new DatabaseImport(new DatabaseHandler(settings), new DatabaseTagHandler(settings), gson));
+		delete("/database", new DatabaseDelete(new DatabaseHandler(settings), settings));
 		
 		get("/info", new InformationGet(gson, versionInfo, settings));
 		get("/version", new VersionGet(gson, versionInfo));
 		delete("/log", new LogDelete());
 
 		after((request, response) -> {
-			new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now());
+			DatabaseHandler handler = new DatabaseHandler(settings);
+			RepeatingPaymentUpdater paymentUpdater = new RepeatingPaymentUpdater(handler);
+			paymentUpdater.updateRepeatingPayments(DateTime.now());
+			handler.closeConnection();
 		});
 		
 		Spark.exception(Exception.class, (exception, request, response) -> {
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 e1c68a1fa..80b4673cb 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryAdd implements Route
+public class CategoryAdd implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	
@@ -17,7 +17,12 @@ public class CategoryAdd implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("name") || !req.queryParams().contains("color"))
 		{
@@ -41,4 +46,10 @@ public class CategoryAdd implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();		
+	}
 }
\ No newline at end of file
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 134d68b26..e8c137e63 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryDelete implements Route
+public class CategoryDelete implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	
@@ -17,7 +17,13 @@ public class CategoryDelete implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -53,4 +59,10 @@ public class CategoryDelete implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 bda73e67a..c33e5f3b8 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
@@ -5,12 +5,12 @@ import static spark.Spark.halt;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryGet implements Route
+public class CategoryGet implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -22,7 +22,13 @@ public class CategoryGet implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -58,4 +64,10 @@ public class CategoryGet implements Route
 		}
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 2cb97062a..27f7c5ae4 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
@@ -8,12 +8,12 @@ import java.util.Collections;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryGetAll implements Route
+public class CategoryGetAll implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -25,10 +25,16 @@ public class CategoryGetAll implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		try
-		{	
+		{
 			ArrayList<Category> categories = handler.getCategories();
 			Collections.sort(categories, (c1, c2) -> c1.getName().toLowerCase().compareTo(c2.getName().toLowerCase()));
 
@@ -37,7 +43,13 @@ public class CategoryGetAll implements Route
 		catch(IllegalStateException e)
 		{
 			halt(500, "Internal Server Error");
-		}	
+		}
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 0b55664fa..a5ab6addb 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryUpdate implements Route
+public class CategoryUpdate implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 
@@ -17,7 +17,13 @@ public class CategoryUpdate implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id") ||!req.queryParams().contains("name") || !req.queryParams().contains("color"))
 		{
@@ -53,4 +59,10 @@ public class CategoryUpdate implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();		
+	}
 }
\ No newline at end of file
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 7ae44cb59..08f9b94b3 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
@@ -12,12 +12,12 @@ import com.google.gson.Gson;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryBudgetGet implements Route
+public class CategoryBudgetGet implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -29,65 +29,72 @@ public class CategoryBudgetGet implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("year") || !req.queryParams().contains("month"))
 		{
 			halt(400, "Bad Request");
 		}
-		
+
 		int year = 0;
 		int month = 0;
-		
+
 		try
-		{				
+		{
 			year = Integer.parseInt(req.queryMap("year").value());
 			month = Integer.parseInt(req.queryMap("month").value());
-			
+
 			if(year < 0 || month < 1 || month > 12)
 			{
 				halt(400, "Bad Request");
 			}
-			
+
 			try
-			{	
+			{
 				ArrayList<Payment> payments = new ArrayList<>();
 				payments.addAll(handler.getPayments(year, month));
-				payments.addAll(handler.getRepeatingPayments(year, month));			
-			
+				payments.addAll(handler.getRepeatingPayments(year, month));
+
 				ArrayList<CategoryBudget> budgets = new ArrayList<>();
-				
+
 				for(Category currentCategory : handler.getCategories())
 				{
 					budgets.add(new CategoryBudget(currentCategory, 0));
 					CategoryBudget currentBudget = budgets.get(budgets.size() - 1);
 					for(Payment currentPayment : payments)
-					{					
+					{
 						if(currentCategory.getID() == currentPayment.getCategoryID())
 						{
 							currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount());
-						}						
+						}
 					}
 				}
-				
-				//filter empty categories
+
+				// filter empty categories
 				Iterator<CategoryBudget> iterator = budgets.iterator();
 				while(iterator.hasNext())
-				{		
+				{
 					if(iterator.next().getBudget() == 0)
 					{
 						iterator.remove();
 					}
 				}
-				
-				Collections.sort(budgets, new Comparator<CategoryBudget>() {
-			        @Override
-			        public int compare(CategoryBudget budget1, CategoryBudget budget2)
-			        {
-			            return  Double.compare(budget1.getBudget(), budget2.getBudget());
-			        }
-			    });		
-				
+
+				Collections.sort(budgets, new Comparator<CategoryBudget>()
+				{
+					@Override
+					public int compare(CategoryBudget budget1, CategoryBudget budget2)
+					{
+						return Double.compare(budget1.getBudget(), budget2.getBudget());
+					}
+				});
+
 				return gson.toJson(budgets);
 			}
 			catch(IllegalStateException ex)
@@ -99,7 +106,13 @@ public class CategoryBudgetGet implements Route
 		{
 			halt(400, "Bad Request");
 		}
-		
+
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 a83a7a509..36c9d654e 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
@@ -9,12 +9,12 @@ import com.google.gson.Gson;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryInOutSumForMonth implements Route
+public class CategoryInOutSumForMonth implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -26,7 +26,13 @@ public class CategoryInOutSumForMonth implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("startDate") || !req.queryParams().contains("endDate"))
 		{
@@ -71,4 +77,10 @@ public class CategoryInOutSumForMonth implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 8a4f43f18..05c059e3e 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
@@ -11,12 +11,12 @@ import com.google.gson.Gson;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class MonthInOutSum implements Route
+public class MonthInOutSum implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -28,7 +28,13 @@ public class MonthInOutSum implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("startDate") || !req.queryParams().contains("endDate"))
 		{
@@ -85,4 +91,10 @@ public class MonthInOutSum implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();		
+	}
 }
\ No newline at end of file
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 f82a3e082..33014e1c7 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
@@ -2,13 +2,19 @@ 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 logger.Logger;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class DatabaseDelete implements Route
+public class DatabaseDelete implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Settings settings;
@@ -20,20 +26,34 @@ public class DatabaseDelete implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
-	{		
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
+	{
 		try
 		{							
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);
+			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() + ")");
 	
 			return "";
 		}
-		catch(IllegalStateException ex)
+		catch(IllegalStateException | SQLException ex)
 		{
 			halt(500, "Internal Server Error");
 		}
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java
index c9d88f6a7..a108686d4 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseExport.java
@@ -4,14 +4,14 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseExporter;
 import logger.Logger;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class DatabaseExport implements Route
+public class DatabaseExport implements AdvancedRoute
 {
 	private Settings settings;
 	private Gson gson;
@@ -23,7 +23,12 @@ public class DatabaseExport implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		try
 		{	
@@ -38,4 +43,9 @@ public class DatabaseExport implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+	}
 }
\ No newline at end of file
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 fa3e9b13a..ef4612be1 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
@@ -5,18 +5,18 @@ import static spark.Spark.halt;
 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 logger.Logger;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class DatabaseImport implements Route
+public class DatabaseImport implements AdvancedRoute
 {
 	private DatabaseHandler handler;
-	private DatabaseTagHandler tagHandler; 
+	private DatabaseTagHandler tagHandler;
 	private Gson gson;
 
 	public DatabaseImport(DatabaseHandler handler, DatabaseTagHandler tagHandler, Gson gson)
@@ -27,10 +27,17 @@ public class DatabaseImport implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
-	{	
-		String databaseJSON = req.body();		
-		
+	public void before()
+	{
+		handler.connect();
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
+	{
+		String databaseJSON = req.body();
+
 		try
 		{
 			Database database = gson.fromJson(databaseJSON, Database.class);
@@ -44,7 +51,14 @@ public class DatabaseImport implements Route
 			Logger.error(e);
 			halt(500, "Internal Server Error");
 		}
-		
+
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java
index 199b19a2a..93abe9865 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/InformationGet.java
@@ -4,12 +4,12 @@ import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerInformation;
 import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class InformationGet implements Route
+public class InformationGet implements AdvancedRoute
 {	
 	private Gson gson;
 	private VersionInformation versionInfo;
@@ -23,7 +23,12 @@ public class InformationGet implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		ServerInformation serverInfo = new ServerInformation();
 		serverInfo.setDatabaseUrl(settings.getDatabaseUrl());
@@ -35,4 +40,9 @@ public class InformationGet implements Route
 		
 		return gson.toJson(serverInfo);
 	}
+
+	@Override
+	public void after()
+	{
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java
index eb77c8cbc..c2720a593 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/info/VersionGet.java
@@ -3,11 +3,11 @@ package de.deadlocker8.budgetmasterserver.server.info;
 import com.google.gson.Gson;
 
 import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class VersionGet implements Route
+public class VersionGet implements AdvancedRoute
 {	
 	private Gson gson;
 	private VersionInformation versionInfo;
@@ -19,8 +19,18 @@ public class VersionGet implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		return gson.toJson(versionInfo);
 	}
+
+	@Override
+	public void after()
+	{
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java
index 366973c54..daf3cd948 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/log/LogDelete.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.log;
 
 import static spark.Spark.halt;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import logger.Logger;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class LogDelete implements Route
+public class LogDelete implements AdvancedRoute
 {
 	public LogDelete()
 	{	
@@ -15,8 +15,13 @@ public class LogDelete implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
-	{		
+	public void before()
+	{
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
+	{
 		try
 		{							
 			Logger.clearLogFile();	
@@ -29,4 +34,9 @@ public class LogDelete implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+	}
 }
\ No newline at end of file
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 86a78819e..d4a2dd0f3 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
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class PaymentAdd implements Route
+public class PaymentAdd implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -21,45 +21,57 @@ public class PaymentAdd implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("amount") || 
-			!req.queryParams().contains("date") || 
-			!req.queryParams().contains("categoryID") || 
-			!req.queryParams().contains("name") || 
-			!req.queryParams().contains("description"))
-		{				
-			halt(400, "Bad Request");
-		}	
-			
-		int amount = 0;
-		int categoryID = 0;			
-		
-		try
-		{				
-			amount = Integer.parseInt(req.queryMap("amount").value());
-			categoryID = Integer.parseInt(req.queryMap("categoryID").value());				
+				!req.queryParams().contains("date") || 
+				!req.queryParams().contains("categoryID") || 
+				!req.queryParams().contains("name") || 
+				!req.queryParams().contains("description"))
+			{				
+				halt(400, "Bad Request");
+			}	
+				
+			int amount = 0;
+			int categoryID = 0;			
 			
 			try
-			{			
-				Integer id = handler.addNormalPayment(amount, 
-													  req.queryMap("date").value(),
-													  categoryID, 
-													  req.queryMap("name").value(), 
-													  req.queryMap("description").value());			
+			{				
+				amount = Integer.parseInt(req.queryMap("amount").value());
+				categoryID = Integer.parseInt(req.queryMap("categoryID").value());				
+				
+				try
+				{			
+					Integer id = handler.addNormalPayment(amount, 
+														  req.queryMap("date").value(),
+														  categoryID, 
+														  req.queryMap("name").value(), 
+														  req.queryMap("description").value());			
 
-				return gson.toJson(id);
+					return gson.toJson(id);
+				}
+				catch(IllegalStateException ex)
+				{				
+					halt(500, "Internal Server Error");
+				}
 			}
-			catch(IllegalStateException ex)
-			{				
-				halt(500, "Internal Server Error");
+			catch(Exception e)
+			{
+				halt(400, "Bad Request");
 			}
-		}
-		catch(Exception e)
-		{
-			halt(400, "Bad Request");
-		}
-		
-		return "";
+			
+			return "";
+	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
 	}
 }
\ No newline at end of file
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 f0a059d1c..45a593f1e 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
@@ -4,13 +4,13 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class PaymentDelete implements Route
+public class PaymentDelete implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private DatabaseTagHandler tagHandler;
@@ -22,7 +22,13 @@ public class PaymentDelete implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -63,4 +69,11 @@ public class PaymentDelete implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 da8e08181..545d4ccd2 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
@@ -9,13 +9,13 @@ import org.joda.time.DateTime;
 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.server.updater.RepeatingPaymentUpdater;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class PaymentGet implements Route
+public class PaymentGet implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -24,10 +24,16 @@ public class PaymentGet implements Route
 	{
 		this.handler = handler;
 		this.gson = gson;
+	}	
+
+	@Override
+	public void before()
+	{
+		handler.connect();
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("year") || !req.queryParams().contains("month"))
 		{
@@ -59,7 +65,7 @@ public class PaymentGet implements Route
 			try
 			{				
 				ArrayList<NormalPayment> payments = new ArrayList<>();				
-				payments.addAll(handler.getPayments(year, month));	
+				payments.addAll(handler.getPayments(year, month));
 				
 				return gson.toJson(payments);
 			}
@@ -75,4 +81,10 @@ public class PaymentGet implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();		
+	}
 }
\ No newline at end of file
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 6c4215e4a..355b6c9eb 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class PaymentUpdate implements Route
+public class PaymentUpdate implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	
@@ -17,54 +17,66 @@ public class PaymentUpdate implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id") ||
-			!req.queryParams().contains("amount") || 
-			!req.queryParams().contains("date") || 
-			!req.queryParams().contains("categoryID") || 
-			!req.queryParams().contains("name") || 
-			!req.queryParams().contains("description"))
-		{
-			halt(400, "Bad Request");
-		}	
-		
-		int id = -1;
-		int amount = 0;
-		int categoryID = -1;
-		
-		try
-		{				
-			id = Integer.parseInt(req.queryMap("id").value());
-			amount = Integer.parseInt(req.queryMap("amount").value());
-			categoryID = Integer.parseInt(req.queryMap("categoryID").value());
-			
-			if(id < 0)
+				!req.queryParams().contains("amount") || 
+				!req.queryParams().contains("date") || 
+				!req.queryParams().contains("categoryID") || 
+				!req.queryParams().contains("name") || 
+				!req.queryParams().contains("description"))
 			{
 				halt(400, "Bad Request");
-			}
+			}	
+			
+			int id = -1;
+			int amount = 0;
+			int categoryID = -1;
 			
 			try
 			{				
-				handler.updateNormalPayment(id, 
-											amount, 
-											req.queryMap("date").value(), 
-											categoryID, 
-											req.queryMap("name").value(), 
-											req.queryMap("description").value());			
+				id = Integer.parseInt(req.queryMap("id").value());
+				amount = Integer.parseInt(req.queryMap("amount").value());
+				categoryID = Integer.parseInt(req.queryMap("categoryID").value());
+				
+				if(id < 0)
+				{
+					halt(400, "Bad Request");
+				}
+				
+				try
+				{				
+					handler.updateNormalPayment(id, 
+												amount, 
+												req.queryMap("date").value(), 
+												categoryID, 
+												req.queryMap("name").value(), 
+												req.queryMap("description").value());			
 
-				return "";
-			}
-			catch(IllegalStateException ex)
-			{				
-				halt(500, "Internal Server Error");
+					return "";
+				}
+				catch(IllegalStateException ex)
+				{				
+					halt(500, "Internal Server Error");
+				}
+			}		
+			catch(Exception e)
+			{
+				halt(400, "Bad Request");
 			}
-		}		
-		catch(Exception e)
-		{
-			halt(400, "Bad Request");
-		}
-		
-		return "";
+			
+			return "";
+	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
 	}
 }
\ No newline at end of file
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 72111cbff..aafc7d566 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
@@ -4,73 +4,78 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class RepeatingPaymentAdd implements Route
+public class RepeatingPaymentAdd implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
-	
+
 	public RepeatingPaymentAdd(DatabaseHandler handler, Gson gson)
-	{		
+	{
 		this.handler = handler;
 		this.gson = gson;
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
-		if(!req.queryParams().contains("amount") ||
-			!req.queryParams().contains("date") || 
-			!req.queryParams().contains("categoryID") || 
-			!req.queryParams().contains("name") || 
-			!req.queryParams().contains("repeatInterval") || 
-			!req.queryParams().contains("repeatEndDate") || 
-			!req.queryParams().contains("repeatMonthDay") || 
-			!req.queryParams().contains("description"))
-		{				
+		if(!req.queryParams().contains("amount") 
+				|| !req.queryParams().contains("date") 
+				|| !req.queryParams().contains("categoryID") 
+				|| !req.queryParams().contains("name") 
+				|| !req.queryParams().contains("repeatInterval") 
+				|| !req.queryParams().contains("repeatEndDate")
+				|| !req.queryParams().contains("repeatMonthDay") 
+				|| !req.queryParams().contains("description"))
+		{
 			halt(400, "Bad Request");
-		}	
-			
+		}
+
 		int amount = 0;
 		int categoryID = 0;
 		int repeatInterval = 0;
 		int repeatMonthDay = 0;
-		
+
 		try
-		{				
+		{
 			amount = Integer.parseInt(req.queryMap("amount").value());
 			categoryID = Integer.parseInt(req.queryMap("categoryID").value());
 			repeatInterval = Integer.parseInt(req.queryMap("repeatInterval").value());
 			repeatMonthDay = Integer.parseInt(req.queryMap("repeatMonthDay").value());
-			
+
 			try
-			{				
-				Integer id = handler.addRepeatingPayment(amount, 
-														req.queryMap("date").value(), 
-														categoryID, 
-														req.queryMap("name").value(), 
-														req.queryMap("description").value(), 
-														repeatInterval, 
-														req.queryMap("repeatEndDate").value(), 
-														repeatMonthDay);			
+			{
+				Integer id = handler.addRepeatingPayment(amount, req.queryMap("date").value(), categoryID, req.queryMap("name").value(), req.queryMap("description").value(), repeatInterval, req.queryMap("repeatEndDate").value(), repeatMonthDay);
 
 				return gson.toJson(id);
 			}
 			catch(IllegalStateException ex)
-			{				
+			{
 				halt(500, "Internal Server Error");
 			}
 		}
 		catch(Exception e)
-		{			
+		{
 			e.printStackTrace();
 			halt(400, "Bad Request");
 		}
-		
+
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 0df804985..a40740932 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
@@ -4,13 +4,13 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class RepeatingPaymentDelete implements Route
+public class RepeatingPaymentDelete implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private DatabaseTagHandler tagHandler;
@@ -22,7 +22,14 @@ public class RepeatingPaymentDelete implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -63,4 +70,11 @@ public class RepeatingPaymentDelete implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 5349848f2..b90492539 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
@@ -5,12 +5,12 @@ import static spark.Spark.halt;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class RepeatingPaymentGet implements Route
+public class RepeatingPaymentGet implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -22,7 +22,13 @@ public class RepeatingPaymentGet implements Route
 	}
 	
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -58,4 +64,10 @@ public class RepeatingPaymentGet implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 ce617830a..4a5aa61f4 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
@@ -9,13 +9,13 @@ import org.joda.time.DateTime;
 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.server.updater.RepeatingPaymentUpdater;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class RepeatingPaymentGetAll implements Route
+public class RepeatingPaymentGetAll implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -27,7 +27,13 @@ public class RepeatingPaymentGetAll implements Route
 	}
 	
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("year") || !req.queryParams().contains("month"))
 		{
@@ -75,4 +81,10 @@ public class RepeatingPaymentGetAll implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 a8f40253b..cd6bc6855 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
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class PaymentMaxAmount implements Route
+public class PaymentMaxAmount implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -21,7 +21,13 @@ public class PaymentMaxAmount implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		try
 		{
@@ -43,4 +49,10 @@ public class PaymentMaxAmount implements Route
 
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+	}
 }
\ No newline at end of file
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 9c7f3b639..3feb937d9 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
@@ -12,13 +12,13 @@ import de.deadlocker8.budgetmaster.logic.payment.Payment;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class PaymentSearch implements Route
+public class PaymentSearch implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private DatabaseTagHandler tagHandler;
@@ -29,49 +29,6 @@ public class PaymentSearch implements Route
 		this.tagHandler = tagHandler;
 	}
 
-	@Override
-	public Object handle(Request req, Response res) throws Exception
-	{
-		try
-		{
-			ArrayList<Payment> payments = new ArrayList<>();
-			ArrayList<NormalPayment> normalPayments = handler.getAllNormalPayments();
-			ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments();
-			for(Payment currentPayment : normalPayments)
-			{
-				if(meetsCriteria(req, currentPayment))
-				{
-					payments.add(currentPayment);
-				}
-			}
-
-			for(Payment currentPayment : repeatingPayments)
-			{
-				if(meetsCriteria(req, currentPayment))
-				{
-					payments.add(currentPayment);
-				}
-			}
-
-			Collections.sort(payments, new Comparator<Payment>()
-			{
-				@Override
-				public int compare(Payment o1, Payment o2)
-				{
-					return o1.getDate().compareTo(o2.getDate());
-				}
-			});
-			
-			return PaymentJSONSerializer.serializePaymentList(payments);
-		}
-		catch(IllegalStateException ex)
-		{
-			halt(500, "Internal Server Error");
-		}
-
-		return null;
-	}	
-
 	private boolean meetsCriteria(Request req, Payment payment)
 	{
 		boolean otherChecksThanAmount = false;
@@ -186,4 +143,61 @@ public class PaymentSearch implements Route
 			
 		return true;		
 	}
+
+	@Override
+	public void before()
+	{
+		handler.connect();
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
+	{
+		try
+		{
+			ArrayList<Payment> payments = new ArrayList<>();
+			ArrayList<NormalPayment> normalPayments = handler.getAllNormalPayments();
+			ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments();
+			for(Payment currentPayment : normalPayments)
+			{
+				if(meetsCriteria(req, currentPayment))
+				{
+					payments.add(currentPayment);
+				}
+			}
+
+			for(Payment currentPayment : repeatingPayments)
+			{
+				if(meetsCriteria(req, currentPayment))
+				{
+					payments.add(currentPayment);
+				}
+			}
+
+			Collections.sort(payments, new Comparator<Payment>()
+			{
+				@Override
+				public int compare(Payment o1, Payment o2)
+				{
+					return o1.getDate().compareTo(o2.getDate());
+				}
+			});
+			
+			return PaymentJSONSerializer.serializePaymentList(payments);
+		}
+		catch(IllegalStateException ex)
+		{
+			halt(500, "Internal Server Error");
+		}
+
+		return null;
+	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 1ebdf5004..b1a1e0083 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
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class RestGet implements Route
+public class RestGet implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Gson gson;
@@ -21,7 +21,13 @@ public class RestGet implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		handler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("year") || !req.queryParams().contains("month"))
 		{
@@ -59,4 +65,10 @@ public class RestGet implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		handler.closeConnection();		
+	}
 }
\ No newline at end of file
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 64b71a28e..ade526516 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchAddForPayment implements Route
+public class TagMatchAddForPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	
@@ -17,7 +17,13 @@ public class TagMatchAddForPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("tagID") || !req.queryParams().contains("paymentID"))
 		{
@@ -49,4 +55,10 @@ public class TagMatchAddForPayment implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 3eb1871ca..58dd6ce2d 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchAddForRepeatingPayment implements Route
+public class TagMatchAddForRepeatingPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	
@@ -17,7 +17,13 @@ public class TagMatchAddForRepeatingPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("tagID") || !req.queryParams().contains("repeatingPaymentID"))
 		{
@@ -49,4 +55,10 @@ public class TagMatchAddForRepeatingPayment implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 9f676c0e8..fa472b60e 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
@@ -2,13 +2,13 @@ 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.server.updater.TagUpdater;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchDeleteForPayment implements Route
+public class TagMatchDeleteForPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	
@@ -18,7 +18,13 @@ public class TagMatchDeleteForPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("tagID") || !req.queryParams().contains("paymentID"))
 		{
@@ -53,4 +59,10 @@ public class TagMatchDeleteForPayment implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 ab0e5a1c6..1573d495e 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
@@ -2,13 +2,13 @@ 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.server.updater.TagUpdater;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchDeleteForRepeatingPayment implements Route
+public class TagMatchDeleteForRepeatingPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	
@@ -18,7 +18,13 @@ public class TagMatchDeleteForRepeatingPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("tagID") || !req.queryParams().contains("repeatingPaymentID"))
 		{
@@ -53,4 +59,10 @@ public class TagMatchDeleteForRepeatingPayment implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 9d1bb9852..5ebc766c7 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
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchExistingForPayment implements Route
+public class TagMatchExistingForPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -21,7 +21,13 @@ public class TagMatchExistingForPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("tagID") || !req.queryParams().contains("paymentID"))
 		{
@@ -51,4 +57,10 @@ public class TagMatchExistingForPayment implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 5b6fda13a..e44eca844 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
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchExistingForRepeatingPayment implements Route
+public class TagMatchExistingForRepeatingPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -21,7 +21,13 @@ public class TagMatchExistingForRepeatingPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("tagID") || !req.queryParams().contains("repeatingPaymentID"))
 		{
@@ -51,4 +57,10 @@ public class TagMatchExistingForRepeatingPayment implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 08a93ad9b..e558cc36c 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
@@ -7,12 +7,12 @@ import java.util.ArrayList;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchGetAllForPayment implements Route
+public class TagMatchGetAllForPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -24,7 +24,13 @@ public class TagMatchGetAllForPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("paymentID"))
 		{
@@ -64,4 +70,10 @@ public class TagMatchGetAllForPayment implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 7f8b44650..2dc02afaa 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
@@ -7,12 +7,12 @@ import java.util.ArrayList;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagMatchGetAllForRepeatingPayment implements Route
+public class TagMatchGetAllForRepeatingPayment implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -24,7 +24,13 @@ public class TagMatchGetAllForRepeatingPayment implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("repeatingPaymentID"))
 		{
@@ -64,4 +70,10 @@ public class TagMatchGetAllForRepeatingPayment implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 edd44ab77..18c892ccc 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagAdd implements Route
+public class TagAdd implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	
@@ -17,7 +17,13 @@ public class TagAdd implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("name"))
 		{
@@ -41,4 +47,10 @@ public class TagAdd implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 75d45f927..3b08cee13 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
@@ -2,12 +2,12 @@ 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagDelete implements Route
+public class TagDelete implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	
@@ -17,7 +17,13 @@ public class TagDelete implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -53,4 +59,10 @@ public class TagDelete implements Route
 		
 		return "";
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 782df0b96..4d1704b9a 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
@@ -5,12 +5,12 @@ import static spark.Spark.halt;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagGet implements Route
+public class TagGet implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -22,7 +22,13 @@ public class TagGet implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("id"))
 		{
@@ -57,4 +63,10 @@ public class TagGet implements Route
 		}
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 46f523613..9cac86976 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
@@ -7,12 +7,12 @@ import java.util.ArrayList;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagGetAll implements Route
+public class TagGetAll implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -24,7 +24,13 @@ public class TagGetAll implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		try
 		{	
@@ -39,4 +45,10 @@ public class TagGetAll implements Route
 		
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
 }
\ No newline at end of file
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 a4e7a8989..7e2816d16 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
@@ -5,12 +5,12 @@ import static spark.Spark.halt;
 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 spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class TagGetByName implements Route
+public class TagGetByName implements AdvancedRoute
 {
 	private DatabaseTagHandler tagHandler;
 	private Gson gson;
@@ -22,7 +22,13 @@ public class TagGetByName implements Route
 	}
 
 	@Override
-	public Object handle(Request req, Response res) throws Exception
+	public void before()
+	{
+		tagHandler.connect();
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
 	{
 		if(!req.queryParams().contains("name"))
 		{
@@ -41,4 +47,10 @@ public class TagGetByName implements Route
 	
 		return null;
 	}
+
+	@Override
+	public void after()
+	{
+		tagHandler.closeConnection();		
+	}
 }
\ No newline at end of file
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 0ad4e5f88..5c22f4c42 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
@@ -24,8 +24,8 @@ public class RepeatingPaymentUpdater
 	public void updateRepeatingPayments(DateTime now)
 	{
 		try
-		{
-			ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments();				
+		{	
+			ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments();
 			ArrayList<LatestRepeatingPayment> latest = handler.getLatestRepeatingPaymentEntries();
 			
 			for(RepeatingPayment currentPayment : repeatingPayments)
diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties
index 5cb7f01cc..59c2f78bb 100644
--- a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties
+++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties
@@ -1,7 +1,7 @@
 app.name=BudgetMasterServer
-version.code=11
-version.name=1.7.0
-version.date=26.10.17
+version.code=12
+version.name=1.8.0_alpha
+version.date=03.11.17
 author=Robert Goldmann
 
 category.none=No Category
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 80f6b7c66..bf5afebfa 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
@@ -7,9 +7,14 @@ 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;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -19,6 +24,7 @@ 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 tools.Localization;
 
@@ -36,21 +42,36 @@ public class DatabaseHandlerTest
 			System.out.println(settings);
 			DatabaseHandler handler = new DatabaseHandler(settings);
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);			
-			databaseHandler = handler;
+			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.close();
+			databaseHandler = new DatabaseHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
 		}
-		catch(IOException | URISyntaxException e)
+		catch(IOException | URISyntaxException | SQLException e)
 		{
 			fail(e.getMessage());
 		}		
-	}	
+	}
+	
+	@Before
+	public void before()
+	{
+		databaseHandler.connect();
+	}
+	
+	@After
+	public void after()
+	{
+		databaseHandler.closeConnection();
+	}
 	
 	@Test
 	public void testLastInsertID()
-	{			
+	{		
 		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	
@@ -252,7 +273,7 @@ public class DatabaseHandlerTest
 										 expectedPayment.getDescription());
 		int idPayment2 = databaseHandler.getLastInsertID();
 		
-		assertEquals(1000, databaseHandler.getRest(2017, 3));		
+		assertEquals(1000, databaseHandler.getRest(2017, 3));
 		assertEquals(200, databaseHandler.getRestForAllPreviousMonths(2017, 4));
 		
 		databaseHandler.deletePayment(idPayment1);
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 6414890b6..8a811f873 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
@@ -8,9 +8,14 @@ import java.io.IOException;
 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;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -24,6 +29,7 @@ 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;
@@ -42,21 +48,39 @@ public class DatabaseImportExportTest
 		try
 		{
 			//init
-			settings = Utils.loadSettings();			
+			settings = Utils.loadSettings();
+			System.out.println(settings);
 			DatabaseHandler handler = new DatabaseHandler(settings);
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);			
-			databaseHandler = handler;
+			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.close();
+			databaseHandler = new DatabaseHandler(settings);
 			tagHandler = new DatabaseTagHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
 		}
-		catch(IOException | URISyntaxException e)
+		catch(IOException | URISyntaxException | SQLException e)
 		{
 			fail(e.getMessage());
-		}		
+		}	
 	}	
+
+	@Before
+	public void before()
+	{
+		databaseHandler.connect();
+		tagHandler.connect();
+	}
+	
+	@After
+	public void after()
+	{
+		databaseHandler.closeConnection();
+		tagHandler.closeConnection();
+	}
 	
 	@Test
 	public void testImport()
@@ -111,6 +135,10 @@ public class DatabaseImportExportTest
 		try
 		{
 			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.close();			
 			databaseHandler = new DatabaseHandler(settings);
 			
 			File file = Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json").toFile();
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 475c0f7f4..aa8270b53 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
@@ -8,16 +8,24 @@ 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;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.BeforeClass;
 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 tools.Localization;
 
 public class DatabaseTagHandlerTest
 {			
@@ -33,15 +41,33 @@ public class DatabaseTagHandlerTest
 			System.out.println(settings);
 			DatabaseHandler handler = new DatabaseHandler(settings);
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);			
+			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.close();
 			tagHandler = new DatabaseTagHandler(settings);
+			
+			Localization.init("de/deadlocker8/budgetmaster/");
+			Localization.loadLanguage(Locale.ENGLISH);
 		}
-		catch(IOException | URISyntaxException e)
+		catch(IOException | URISyntaxException | SQLException e)
 		{
 			fail(e.getMessage());
 		}		
 	}
 	
+	@Before
+	public void before()
+	{
+		tagHandler.connect();
+	}
+	
+	@After
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
+	
 	@Test
 	public void testTag()
 	{
-- 
GitLab