diff --git a/.gitignore b/.gitignore
index ae91f72929d3edca467a68702753e6a8bdcebe87..a3f7c058fb3c7b891c9a28efde06d27ac96daa75 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,6 @@ bin/
 target/
 certs/
 
+*.db
+
 build/[0-9]*.[0-9]*.[0-9]*
\ No newline at end of file
diff --git a/BudgetMasterClient/pom.xml b/BudgetMasterClient/pom.xml
index 0a0d153d7cf0e647f26c69d19c020193662daa46..4670c84085b337379957f991b1dc51f714b4a9cb 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.1</version>
+	<version>1.8.0</version>
 	<name>BudgetMasterClient</name>
 	<build>
 		<plugins>
@@ -105,7 +105,7 @@
 		<dependency>
 			<groupId>de.deadlocker8</groupId>
 			<artifactId>tools</artifactId>
-			<version>0.0.1-SNAPSHOT</version>
+			<version>1.0.0</version>
 		</dependency>
 	</dependencies>
 </project>
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java
index 0931c1111789c583f1a412046d00c46919277132..774cc3c8bb09291e3ed6d01274511514ff966a81 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/main/Main.java
@@ -6,6 +6,7 @@ import java.util.Locale;
 import de.deadlocker8.budgetmaster.logic.Settings;
 import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.ShutdownHandler;
 import de.deadlocker8.budgetmasterclient.ui.controller.SplashScreenController;
 import javafx.application.Application;
 import javafx.scene.image.Image;
@@ -30,9 +31,11 @@ public class Main extends Application
 		{
 			Localization.loadLanguage(settings.getLanguage().getLocale());
 		}
+		
+		ShutdownHandler shutdownHandler = new ShutdownHandler();
 
 		Image icon = new Image("/de/deadlocker8/budgetmaster/icon.png");
-		new SplashScreenController(stage, icon, getParameters().getNamed().get("update") != null);
+		new SplashScreenController(stage, icon, getParameters().getNamed().get("update") != null, shutdownHandler);
 	}
 
 	@Override
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java
index 34db5c8f2d9fe417a95f4c5863e71acdb22471a2..faa92647c4d44772c9c0ebbc8b8361ab3ce574f4 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/RestartHandler.java
@@ -62,12 +62,12 @@ public class RestartHandler
 			Optional<ButtonType> result = alert.showAndWait();						
 			if (result.get() == buttonTypeOne)
 			{				
-				controller.getStage().close();				
+				controller.getStage().close();
 				
 				Localization.loadLanguage(controller.getSettings().getLanguage().getLocale());
 				
 			    Image icon = new Image("/de/deadlocker8/budgetmaster/icon.png");
-				new SplashScreenController(Main.primaryStage, icon, false);			
+				new SplashScreenController(Main.primaryStage, icon, false, controller.getShutdownHandler());			
 			}
 			else
 			{
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/ShutdownHandler.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/ShutdownHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..616beec09c3d5a5e6ee2a4b95a2d229a44a4e724
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/ShutdownHandler.java
@@ -0,0 +1,49 @@
+package de.deadlocker8.budgetmasterclient.ui;
+
+import de.deadlocker8.budgetmaster.logic.ServerType;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
+import logger.Logger;
+import tools.Worker;
+
+public class ShutdownHandler
+{
+	private Thread shutdownThread;
+	private Controller controller;
+	
+	public ShutdownHandler()
+	{
+		shutdownThread = new Thread(() -> {
+			shutdown();
+		});
+	}
+	
+	public Thread getShutdownThread()
+	{
+		return shutdownThread;
+	}	
+	
+	public void setController(Controller controller)
+	{
+		this.controller = controller;
+	}
+
+	public void shutdown()
+	{
+		if(controller.getSettings().getServerType().equals(ServerType.LOCAL))
+		{
+			Logger.debug("Stopping local BudgetMasterServer...");
+			try
+			{
+				ServerConnection connection = new ServerConnection(controller.getSettings());
+				connection.shutdownServer();
+			}
+			catch(Exception e)
+			{
+				Logger.error(e);
+			}
+		}
+		Worker.shutdown();
+		System.exit(0);
+	}
+}
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java
index 908c651ebf7e790a02e610907a1f19f498b29c7b..71d1842051e3fe76a17ae5fdadfb7105ca48296f 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/CategoryCell.java
@@ -3,9 +3,9 @@ package de.deadlocker8.budgetmasterclient.ui.cells;
 import java.util.Optional;
 
 import de.deadlocker8.budgetmaster.logic.category.Category;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.controller.CategoryController;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
@@ -64,7 +64,7 @@ public class CategoryCell extends ListCell<Category>
 			HBox.setHgrow(r, Priority.ALWAYS);
 			
 			Button buttonEdit = new Button();			
-			buttonEdit.setGraphic(Helpers.getFontIcon(FontIconType.PENCIL, 16, Color.web("#212121")));
+			buttonEdit.setGraphic(new FontIcon(FontIconType.PENCIL, 16, Color.web("#212121")));
 			buttonEdit.setPrefHeight(HEIGHT);					
 			buttonEdit.getStyleClass().add("greylabel");
 			buttonEdit.setStyle("-fx-background-color: transparent");
@@ -75,7 +75,7 @@ public class CategoryCell extends ListCell<Category>
 			HBox.setMargin(buttonEdit, new Insets(0, 0, 0, 25));
 			
 			Button buttonDelete = new Button();			
-			buttonDelete.setGraphic(Helpers.getFontIcon(FontIconType.TRASH, 16, Color.web("#212121")));
+			buttonDelete.setGraphic(new FontIcon(FontIconType.TRASH, 16, Color.web("#212121")));
 			buttonDelete.setPrefHeight(HEIGHT);					
 			buttonDelete.getStyleClass().add("greylabel");
 			buttonDelete.setStyle("-fx-background-color: transparent");
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java
index 6219baf6ba69c2689393c6ba768729efd08d6d54..cb20223ae5585a4d795ccb6e41c82308d5dc2867 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/PaymentCell.java
@@ -15,6 +15,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.controller.PaymentController;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.animation.FadeTransition;
 import javafx.geometry.Insets;
@@ -23,13 +24,13 @@ import javafx.scene.Node;
 import javafx.scene.control.Alert;
 import javafx.scene.control.Button;
 import javafx.scene.control.ButtonBar.ButtonData;
-import javafx.scene.input.KeyCode;
-import javafx.scene.input.KeyEvent;
 import javafx.scene.control.ButtonType;
 import javafx.scene.control.DialogPane;
 import javafx.scene.control.Label;
 import javafx.scene.control.ListCell;
 import javafx.scene.control.Tooltip;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.Region;
@@ -86,11 +87,11 @@ public class PaymentCell extends ListCell<Payment>
 			Label labelRepeating = new Label();
 			if(item instanceof RepeatingPaymentEntry)
 			{				
-				labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.web("#212121")));
+				labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.web("#212121")));
 			}
 			else
 			{
-			    labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT));
+			    labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT));
 			}
 			labelRepeating.setPrefHeight(HEIGHT);
 			labelRepeating.setStyle("-fx-font-size: 15; -fx-text-fill: #212121");
@@ -158,7 +159,7 @@ public class PaymentCell extends ListCell<Payment>
 			}
 			
 			Button buttonDelete = new Button();			
-			buttonDelete.setGraphic(Helpers.getFontIcon(FontIconType.TRASH, 16, Color.web("#212121")));
+			buttonDelete.setGraphic(new FontIcon(FontIconType.TRASH, 16, Color.web("#212121")));
 			buttonDelete.setPrefHeight(HEIGHT);
 			buttonDelete.getStyleClass().add("greylabel");
 			buttonDelete.setStyle("-fx-background-color: transparent");			
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java
index a639e3f8c343cd0f825d81aa7f2fdf2a70de938a..9500ffcc09ae4734f80789f96d5dc532d1c46a29 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/SearchCell.java
@@ -14,6 +14,7 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterclient.ui.controller.SearchController;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
@@ -74,11 +75,11 @@ public class SearchCell extends ListCell<Payment>
 			Label labelRepeating = new Label();
 			if(item instanceof RepeatingPayment)
 			{				
-				labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.web("#212121")));
+				labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.web("#212121")));
 			}
 			else
 			{
-			    labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT));
+			    labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 18, Color.TRANSPARENT));
 			}
 			labelRepeating.setPrefHeight(HEIGHT);
 			labelRepeating.setStyle("-fx-font-size: 15; -fx-text-fill: #212121");
@@ -146,7 +147,7 @@ public class SearchCell extends ListCell<Payment>
 			}
 
 			Button buttonGoto = new Button();			
-			buttonGoto.setGraphic(Helpers.getFontIcon(FontIconType.EXTERNAL_LINK_SQUARE, 16, Color.web("#212121")));
+			buttonGoto.setGraphic(new FontIcon(FontIconType.EXTERNAL_LINK_SQUARE, 16, Color.web("#212121")));
 			buttonGoto.setPrefHeight(HEIGHT);
 			buttonGoto.getStyleClass().add("greylabel");
 			buttonGoto.setStyle("-fx-background-color: transparent");			
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java
index 3131ef8d89a920fc03653f9305a2bd6bb3e24db6..e8bda03afe9ba7ef6bb51d10626b7c0bcaae8db1 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRatingCell.java
@@ -2,7 +2,7 @@ package de.deadlocker8.budgetmasterclient.ui.cells.report.table;
 
 import de.deadlocker8.budgetmaster.logic.report.ReportItem;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.geometry.Pos;
 import javafx.scene.control.Label;
@@ -18,11 +18,11 @@ public class ReportTableRatingCell extends TableCell<ReportItem, Integer>
             Label labelRepeating = new Label();
             if(item > 0)
             {
-                labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.PLUS, 14, Colors.TEXT));
+                labelRepeating.setGraphic(new FontIcon(FontIconType.PLUS, 14, Colors.TEXT));
             }
             else
             {
-                labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.MINUS, 14, Colors.TEXT));
+                labelRepeating.setGraphic(new FontIcon(FontIconType.MINUS, 14, Colors.TEXT));
             }
             labelRepeating.setStyle("-fx-font-weight: bold; -fx-font-size: 14; -fx-text-fill: #212121");
             labelRepeating.setAlignment(Pos.CENTER);
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java
index c608583eca9323eeceaeed85077a76f8f3124f4b..a9841bc98a6abf6b30440c81a12c559150db21bd 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/cells/report/table/ReportTableRepeatingCell.java
@@ -2,7 +2,7 @@ package de.deadlocker8.budgetmasterclient.ui.cells.report.table;
 
 import de.deadlocker8.budgetmaster.logic.report.ReportItem;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.geometry.Pos;
 import javafx.scene.control.Label;
@@ -19,11 +19,11 @@ public class ReportTableRepeatingCell extends TableCell<ReportItem, Boolean>
              Label labelRepeating = new Label();
              if(item)
              {
-                 labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 16, Colors.TEXT));
+                 labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 16, Colors.TEXT));
              }
              else
              {
-                 labelRepeating.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR, 16, Color.TRANSPARENT));
+                 labelRepeating.setGraphic(new FontIcon(FontIconType.CALENDAR, 16, Color.TRANSPARENT));
              }                            
              labelRepeating.setStyle("-fx-font-weight: bold; -fx-font-size: 14; -fx-text-fill: #212121");
              labelRepeating.setAlignment(Pos.CENTER);
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java
index a4c587b2fceeecd418c2b72e82f8fedae0659b1f..7c58c7dd231a80f00b587ce542a55d3550d7ce84 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/CategoryController.java
@@ -7,11 +7,11 @@ import de.deadlocker8.budgetmaster.logic.category.Category;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Refreshable;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.cells.CategoryCell;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.beans.value.ChangeListener;
@@ -118,7 +118,7 @@ public class CategoryController extends BaseController implements Refreshable, S
 	@Override
 	public void applyStyle()
 	{
-		buttonCategory.setGraphic(Helpers.getFontIcon(FontIconType.PLUS, 18, Color.WHITE));
+		buttonCategory.setGraphic(new FontIcon(FontIconType.PLUS, 18, Color.WHITE));
 		
 		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));
 		buttonCategory.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");		
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java
index 8ddc953455a4a15eb6bda5a23e34eb98b40f8454..0dbc75472000dc13bfe4966a41d26aad801d7523 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ChartController.java
@@ -21,7 +21,8 @@ import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Refreshable;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
-import de.deadlocker8.budgetmasterclient.utils.UIHelpers;
+import de.deadlocker8.budgetmasterclient.utils.LoadingModal;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.collections.FXCollections;
@@ -38,7 +39,6 @@ import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
-import javafx.stage.Stage;
 import logger.Logger;
 import tools.AlertGenerator;
 import tools.ConvertTo;
@@ -248,7 +248,7 @@ public class ChartController implements Refreshable, Styleable
 	@Override
 	public void refresh()
 	{
-		Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_CHARTS), controller.getStage(), controller.getIcon());
+		LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_CHARTS), controller.getStage(), controller.getIcon());
 
 		// prepare chart categories
 		LocalDate startDate = LocalDate.parse(controller.getCurrentDate().withDayOfMonth(1).toString("yyyy-MM-dd"));
@@ -269,10 +269,7 @@ public class ChartController implements Refreshable, Styleable
 			chartMonthShow();
 
 			Platform.runLater(() -> {
-				if(modalStage != null)
-				{
-					modalStage.close();
-				}
+				LoadingModal.closeModal();
 			});
 		});
 	}
@@ -286,15 +283,15 @@ public class ChartController implements Refreshable, Styleable
 		vboxChartMonth.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));
 		
 		buttonChartCategoriesShow.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE));
-		buttonChartCategoriesShow.setGraphic(Helpers.getFontIcon(FontIconType.CHECK, 16, Color.WHITE));
+		buttonChartCategoriesShow.setGraphic(new FontIcon(FontIconType.CHECK, 16, Color.WHITE));
 
 		buttonChartCategoriesExport.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE));
-		buttonChartCategoriesExport.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 16, Color.WHITE));
+		buttonChartCategoriesExport.setGraphic(new FontIcon(FontIconType.SAVE, 16, Color.WHITE));
 
 		buttonChartMonthShow.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE));
-		buttonChartMonthShow.setGraphic(Helpers.getFontIcon(FontIconType.CHECK, 16, Color.WHITE));
+		buttonChartMonthShow.setGraphic(new FontIcon(FontIconType.CHECK, 16, Color.WHITE));
 
 		buttonChartMonthExport.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE));
-		buttonChartMonthExport.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 16, Color.WHITE));		
+		buttonChartMonthExport.setGraphic(new FontIcon(FontIconType.SAVE, 16, Color.WHITE));		
 	}
 }
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java
index 25da0855bf8ab5817adb7aba1e54ce6087517b64..068b72c5f9d690da5a3c65e9173d501efbe91094 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java
@@ -14,6 +14,7 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import de.deadlocker8.budgetmaster.logic.FilterSettings;
+import de.deadlocker8.budgetmaster.logic.ServerType;
 import de.deadlocker8.budgetmaster.logic.Settings;
 import de.deadlocker8.budgetmaster.logic.category.CategoryBudget;
 import de.deadlocker8.budgetmaster.logic.category.CategoryHandler;
@@ -27,11 +28,14 @@ import de.deadlocker8.budgetmaster.logic.tag.TagHandler;
 import de.deadlocker8.budgetmaster.logic.updater.Updater;
 import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.ShutdownHandler;
 import de.deadlocker8.budgetmasterclient.ui.commandLine.CommandBundle;
 import de.deadlocker8.budgetmasterclient.ui.commandLine.CommandLine;
-import de.deadlocker8.budgetmasterclient.utils.UIHelpers;
+import de.deadlocker8.budgetmasterclient.ui.controller.settings.LocalServerSettingsController;
+import de.deadlocker8.budgetmasterclient.ui.controller.settings.SettingsController;
+import de.deadlocker8.budgetmasterclient.utils.LoadingModal;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.animation.FadeTransition;
 import javafx.animation.SequentialTransition;
@@ -97,6 +101,7 @@ public class Controller extends BaseController
 
 	private Image icon = new Image("de/deadlocker8/budgetmaster/icon.png");	
 	private Settings settings;
+	private ShutdownHandler shutdownHandler;
 	private DateTime currentDate;
 	private ArrayList<CategoryBudget> categoryBudgets;
 	private PaymentHandler paymentHandler;
@@ -110,9 +115,10 @@ public class Controller extends BaseController
 	private boolean alertIsShowing = false;
 	private static DateTimeFormatter DATE_FORMAT;
 	
-	public Controller(Settings settings)
+	public Controller(Settings settings, ShutdownHandler shutdownHandler)
 	{
-		this.settings = settings;	
+		this.settings = settings;
+		this.shutdownHandler = shutdownHandler;
 		DATE_FORMAT = DateTimeFormat.forPattern("MMMM yyyy").withLocale(this.settings.getLanguage().getLocale());
 		load("/de/deadlocker8/budgetmaster/ui/fxml/GUI.fxml", Localization.getBundle());
 		getStage().show();
@@ -130,15 +136,31 @@ public class Controller extends BaseController
 		stage.setMinHeight(650);
 		stage.getScene().getStylesheets().add("/de/deadlocker8/budgetmaster/ui/style.css");
 	}
-
+	
 	@Override
 	public void init()
-	{		
+	{
+		this.shutdownHandler.setController(this);
+		
 		getStage().setOnCloseRequest((event)->{
-			Worker.shutdown();
-			System.exit(0);
+			Runtime.getRuntime().removeShutdownHook(shutdownHandler.getShutdownThread());
+			shutdownHandler.shutdown();
 		});
 		
+		try
+		{
+			Runtime.getRuntime().addShutdownHook(shutdownHandler.getShutdownThread());
+		}
+		catch(IllegalArgumentException e)
+		{
+		}
+		
+		if(settings.getServerType() == null)
+		{
+			settings.setServerType(ServerType.ONLINE);
+		}
+		Logger.info("Running with ServerType: " + settings.getServerType());
+		
 		currentDate = DateTime.now();
 		buttonDate.setText(currentDate.toString(DATE_FORMAT));
 		
@@ -186,7 +208,7 @@ public class Controller extends BaseController
 	{
 		FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fileName));
 		fxmlLoader.setResources(Localization.getBundle());
-		Parent nodeTab = (Parent)fxmlLoader.load();		
+		Parent nodeTab = (Parent)fxmlLoader.load();
 		tab.setContent(nodeTab);
 		return fxmlLoader.getController();
 	}
@@ -222,8 +244,7 @@ public class Controller extends BaseController
 				}
 			});
 			
-			settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml", tabSettings);
-			settingsController.init(this);		
+			loadSettingsTab();
 		}
 		catch(IOException e)
 		{
@@ -233,10 +254,10 @@ public class Controller extends BaseController
 			});			
 		}
 		
-		buttonLeft.setGraphic(Helpers.getFontIcon(FontIconType.CHEVRON_LEFT, 20, Colors.TEXT));
-		buttonRight.setGraphic(Helpers.getFontIcon(FontIconType.CHEVRON_RIGHT, 20, Colors.TEXT));		
-		buttonToday.setGraphic(Helpers.getFontIcon(FontIconType.CALENDAR_ALT, 20, Colors.TEXT));		
-		buttonAbout.setGraphic(Helpers.getFontIcon(FontIconType.INFO, 20, Colors.TEXT));
+		buttonLeft.setGraphic(new FontIcon(FontIconType.CHEVRON_LEFT, 20, Colors.TEXT));
+		buttonRight.setGraphic(new FontIcon(FontIconType.CHEVRON_RIGHT, 20, Colors.TEXT));		
+		buttonToday.setGraphic(new FontIcon(FontIconType.CALENDAR_ALT, 20, Colors.TEXT));		
+		buttonAbout.setGraphic(new FontIcon(FontIconType.INFO, 20, Colors.TEXT));
 
 		// apply theme
 		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_MAIN));
@@ -256,7 +277,35 @@ public class Controller extends BaseController
 		
 		buttonAbout.setStyle("-fx-background-color: transparent;");
 		buttonAbout.getStyleClass().add("button-hoverable");
-		
+	}
+	
+	public void loadSettingsTab()
+	{
+		try 
+		{
+			if(settings.getServerType().equals(ServerType.ONLINE))
+			{
+				settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml", tabSettings);
+				settingsController.init(this);
+			}
+			else
+			{
+				settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml", tabSettings);
+				settingsController.init(this);
+			}
+			
+		}
+		catch(IOException e)
+		{
+			Logger.error(e);
+			Platform.runLater(() -> {
+				AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_CREATE_UI), icon, getStage(), null, false);
+			});			
+		}
+	}
+	
+	public boolean checkSettings()
+	{
 		if(!settings.isComplete())
 		{			
 			Platform.runLater(() -> {
@@ -264,11 +313,9 @@ public class Controller extends BaseController
 				tabPane.getSelectionModel().select(tabSettings);
 				AlertGenerator.showAlert(AlertType.INFORMATION, Localization.getString(Strings.TITLE_INFO), "", Localization.getString(Strings.INFO_FIRST_START), icon, getStage(), null, false);
 			});
+			return false;
 		}
-		else
-		{
-			refresh(filterSettings);
-		}
+		return true;
 	}
 
 	public Image getIcon()
@@ -285,6 +332,11 @@ public class Controller extends BaseController
 	{
 		this.settings = settings;
 	}
+	
+	public ShutdownHandler getShutdownHandler()
+	{
+		return shutdownHandler;
+	}
 
 	public void showNotification(String text)
 	{
@@ -348,6 +400,12 @@ public class Controller extends BaseController
 	{
 		new DatePickerController(getStage(), this, currentDate);
 	}
+	
+	public void forceSettingsTab()
+	{
+		toggleAllTabsExceptSettings(true);
+		tabPane.getSelectionModel().select(tabSettings);
+	}
 
 	public void showConnectionErrorAlert(String errorMessage)
 	{		
@@ -571,32 +629,26 @@ public class Controller extends BaseController
 		Optional<ButtonType> result = alert.showAndWait();						
 		if (result.get() == buttonTypeOne)
 		{					
-			Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), getStage(), icon);
+			LoadingModal.showModal(this, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), getStage(), icon);
 			
 			Worker.runLater(() -> {
 				try 
 				{
 					updater.downloadLatestVersion();
 					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}							
+						LoadingModal.closeModal();						
 					});
 				}
 				catch(Exception ex)
 				{
 					Logger.error(ex);
 					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-							AlertGenerator.showAlert(AlertType.ERROR, 
-													Localization.getString(Strings.TITLE_ERROR),
-													"", 
-													Localization.getString(Strings.ERROR_UPDATER_DOWNLOAD_LATEST_VERSION, ex.getMessage()), 
-													icon, getStage(), null, true);
-						}							
+						LoadingModal.closeModal();
+						AlertGenerator.showAlert(AlertType.ERROR, 
+												Localization.getString(Strings.TITLE_ERROR),
+												"", 
+												Localization.getString(Strings.ERROR_UPDATER_DOWNLOAD_LATEST_VERSION, ex.getMessage()), 
+												icon, getStage(), null, true);													
 					});
 				}
 			});
@@ -741,7 +793,10 @@ public class Controller extends BaseController
 	
 	public void refresh(FilterSettings newFilterSettings)
 	{
-		Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATA), getStage(), icon);
+		Logger.debug("Starting main refresh...");
+		Platform.runLater(()->{
+			LoadingModal.showModal(this, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATA), getStage(), icon);
+		});
 
 		Worker.runLater(() -> {
 			try
@@ -751,39 +806,53 @@ public class Controller extends BaseController
 				//check if server is compatible with client
 				try
 				{
+					Logger.debug("Checking server compatibility...");
 					VersionInformation serverVersion = connection.getServerVersion();
 					if(serverVersion.getVersionCode() < Integer.parseInt(Localization.getString(Strings.VERSION_CODE)))
 					{
-						Platform.runLater(()->{
-							AlertGenerator.showAlert(AlertType.WARNING,
-													Localization.getString(Strings.TITLE_WARNING), 
-													"",
-													Localization.getString(Strings.WARNING_SERVER_VERSION, serverVersion.getVersionName(), Localization.getString(Strings.VERSION_NAME)), 
-													icon, getStage(), null, false);				
-						
-							if(modalStage != null)
-							{
-								modalStage.close();
-							};
-							categoryHandler = new CategoryHandler(null);				
-							toggleAllTabsExceptSettings(true);
-							tabPane.getSelectionModel().select(tabSettings);	
-						});
+						Logger.debug("Server (versionCode: " + serverVersion.getVersionCode() + ") is incompatible with client (versionCode: " + Localization.getString(Strings.VERSION_CODE) + ")");
+						if(settings.getServerType().equals(ServerType.ONLINE))
+						{					
+							Platform.runLater(()->{
+								AlertGenerator.showAlert(AlertType.WARNING,
+														Localization.getString(Strings.TITLE_WARNING), 
+														"",
+														Localization.getString(Strings.WARNING_SERVER_VERSION, serverVersion.getVersionName(), Localization.getString(Strings.VERSION_NAME)), 
+														icon, getStage(), null, false);				
+							
+								LoadingModal.closeModal();
+								categoryHandler = new CategoryHandler(null);			
+								toggleAllTabsExceptSettings(true);
+								tabPane.getSelectionModel().select(tabSettings);	
+							});
+						}
+						else
+						{
+							Platform.runLater(()->{
+								LoadingModal.closeModal();
+								categoryHandler = new CategoryHandler(null);			
+								toggleAllTabsExceptSettings(true);
+								tabPane.getSelectionModel().select(tabSettings);
+								((LocalServerSettingsController)settingsController).handleIncompatibleServer();
+							});
+						}
 						return;
 					}
+					else
+					{
+						Logger.debug("Found compatible server (versionCode: " + serverVersion.getVersionCode() + ")");
+					}
 				}
 				catch(Exception e1)
 				{
 					Logger.error(e1);
 					Platform.runLater(()->{
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}
+						LoadingModal.closeModal();
 					});
 					
 					if(e1.getMessage().contains("404"))
 					{
+						Logger.debug("Server version is incompatible with current client version (" + Localization.getString(Strings.VERSION_CODE) + ")");
 						//old server
 						Platform.runLater(()->{
 							AlertGenerator.showAlert(AlertType.WARNING,
@@ -805,6 +874,8 @@ public class Controller extends BaseController
 					return;
 				}
 				
+				Logger.debug("Connected");
+				
 				paymentHandler = new PaymentHandler();
 				paymentHandler.getPayments().addAll(connection.getPayments(currentDate.getYear(), currentDate.getMonthOfYear()));
 				paymentHandler.getPayments().addAll(connection.getRepeatingPayments(currentDate.getYear(), currentDate.getMonthOfYear()));			
@@ -820,12 +891,10 @@ public class Controller extends BaseController
 				
 				categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear());	
 				paymentHandler.filter(newFilterSettings, new TagHandler(settings));
+				Logger.debug("Main refresh done");
 
 				Platform.runLater(() -> {
-					if(modalStage != null)
-					{
-						modalStage.close();
-					}
+					LoadingModal.closeModal();
 					toggleAllTabsExceptSettings(false);
 					refreshAllTabs();
 				});
@@ -834,11 +903,7 @@ public class Controller extends BaseController
 			{
 				Logger.error(e);
 				Platform.runLater(() -> {
-					if(modalStage != null)
-					{
-						modalStage.close();
-					}
-					Logger.error(e);
+					LoadingModal.closeModal();
 					categoryHandler = new CategoryHandler(null);	
 					showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
 					refreshAllTabs();
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java
index 7de27b30b12246dd740a86ebdd42373146a5106d..8420aba70be1cf53902b2f5aa7abdfc9736f1307 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/DatePickerController.java
@@ -7,6 +7,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.fxml.FXML;
 import javafx.scene.control.Alert.AlertType;
@@ -114,8 +115,8 @@ public class DatePickerController extends BaseController implements Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE));		
-		buttonConfirm.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 17, Color.WHITE));
+		buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE));		
+		buttonConfirm.setGraphic(new FontIcon(FontIconType.SAVE, 17, Color.WHITE));
 
 		buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;");
 		buttonConfirm.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;");
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java
index 43ebe49ac556a87a80aa14b2475a33f824ea7748..8ef7e2be2afc81f503ea92d4b8268e1fd37cbe60 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ExportChartController.java
@@ -9,9 +9,9 @@ import javax.imageio.ImageIO;
 
 import de.deadlocker8.budgetmaster.logic.charts.ChartExportable;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.embed.swing.SwingFXUtils;
 import javafx.fxml.FXML;
@@ -225,7 +225,7 @@ public class ExportChartController extends BaseController implements Styleable
 			alert.setTitle(Localization.getString(Strings.INFO_TITLE_CHART_EXPORT));
 			alert.initOwner(controller.getController().getStage());
 			alert.setHeaderText("");
-			alert.setContentText(Localization.getString(Strings.INFO_TEXT_CHART_EXPORT));			
+			alert.setContentText(Localization.getString(Strings.INFO_TEXT_CHART_EXPORT));
 			Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
 			dialogStage.getIcons().add(controller.getController().getIcon());						
 			
@@ -315,12 +315,12 @@ public class ExportChartController extends BaseController implements Styleable
 		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));		
 		
 		buttonChooseFile.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
-		buttonChooseFile.setGraphic(Helpers.getFontIcon(FontIconType.FOLDER_OPEN, 14, Color.WHITE));
+		buttonChooseFile.setGraphic(new FontIcon(FontIconType.FOLDER_OPEN, 14, Color.WHITE));
 		
 		buttonExport.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
-		buttonExport.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 14, Color.WHITE));
+		buttonExport.setGraphic(new FontIcon(FontIconType.SAVE, 14, Color.WHITE));
 
 		buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
-		buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 14, Color.WHITE));		
+		buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 14, Color.WHITE));		
 	}
 }
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java
index 870246f417cedc957e94c2779856288873d61b93..c092a851c31ab9b5359cd9b6c4dd8555ea8c2bbf 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/FilterController.java
@@ -8,9 +8,9 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.fxml.FXML;
 import javafx.scene.Node;
@@ -253,9 +253,9 @@ public class FilterController extends BaseController implements Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE));
-		buttonReset.setGraphic(Helpers.getFontIcon(FontIconType.UNDO, 17, Color.WHITE));		
-		buttonFilter.setGraphic(Helpers.getFontIcon(FontIconType.FILTER, 17, Color.WHITE));		
+		buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE));
+		buttonReset.setGraphic(new FontIcon(FontIconType.UNDO, 17, Color.WHITE));		
+		buttonFilter.setGraphic(new FontIcon(FontIconType.FILTER, 17, Color.WHITE));		
 
 		scrollPane.setStyle("-fx-background-color: transparent");
 		
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java
index b173d805b38430363d7c586fb8ad6380c3347408..24545fc527f779015893d6de00850a10934efaa4 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ModalController.java
@@ -1,18 +1,75 @@
 package de.deadlocker8.budgetmasterclient.ui.controller;
 
+import java.util.Optional;
+
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import javafx.fxml.FXML;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
+import javafx.scene.control.DialogPane;
 import javafx.scene.control.Label;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.stage.Modality;
 import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
+import logger.Logger;
+import tools.Localization;
 
 public class ModalController
 {
 	@FXML private Label labelMessage;	
+	private Alert alert;
 	
-	public void init(Stage stage, String message)
+	public void init(Controller controller, Stage stage, String message)
 	{
 		labelMessage.setText(message);
 		stage.setOnCloseRequest((e)->{
+			alert = new Alert(AlertType.CONFIRMATION);
+			alert.setTitle(Localization.getString(Strings.INFO_TITLE_SHUTDOWN));
+			alert.initModality(Modality.APPLICATION_MODAL);
+			alert.initOwner(controller.getStage());
+			alert.setHeaderText("");
+			alert.setContentText(Localization.getString(Strings.INFO_TEXT_SHUTDOWN));
+			Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
+			dialogStage.getIcons().add(controller.getIcon());						
+			
+			ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.CANCEL));
+			ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.OK));						
+			alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo);
+			
+			DialogPane dialogPane = alert.getDialogPane();
+			dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> {
+				if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button)
+				{
+					((Button)event.getTarget()).fire();
+				}
+			}));
+			
+			Optional<ButtonType> result = alert.showAndWait();						
+			if (result.get() == buttonTypeTwo)
+			{
+				Logger.debug("Shutting down during operation due to client request...");
+				controller.getStage().fireEvent(new WindowEvent(controller.getStage(), WindowEvent.WINDOW_CLOSE_REQUEST));
+			}			
+			
 			e.consume();
 		});
 	}
+	
+	public void setMessage(String message)
+	{
+		labelMessage.setText(message);
+	}
+	
+	public void closeAlert()
+	{
+		if(alert != null && alert.isShowing())
+		{
+			Button cancelButton = ( Button ) alert.getDialogPane().lookupButton(alert.getButtonTypes().get(0));
+			cancelButton.fire();
+		}
+	}
 }
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java
index d5a37d753dc62b57d631d34e32f5f9ee619d4752..91dfbd525809f8c4f2eb9a69864015c518f425aa 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewCategoryController.java
@@ -13,6 +13,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.colorPick.ColorView;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.fxml.FXML;
 import javafx.scene.control.Alert.AlertType;
@@ -203,8 +204,8 @@ public class NewCategoryController extends BaseController implements Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE));		
-		buttonSave.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 17, Color.WHITE));
+		buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE));		
+		buttonSave.setGraphic(new FontIcon(FontIconType.SAVE, 17, Color.WHITE));
 
 		buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;");
 		buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;");
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java
index e2e5f75e823feea28abe183f4d821bcb36d54b25..66a16cd4aec8cda175ca78542d1d79bbb3ab7279 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/NewPaymentController.java
@@ -1,5 +1,6 @@
 package de.deadlocker8.budgetmasterclient.ui.controller;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.ArrayList;
 
@@ -22,6 +23,7 @@ import de.deadlocker8.budgetmasterclient.ui.cells.ButtonCategoryCell;
 import de.deadlocker8.budgetmasterclient.ui.cells.RepeatingDayCell;
 import de.deadlocker8.budgetmasterclient.ui.cells.SmallCategoryCell;
 import de.deadlocker8.budgetmasterclient.ui.tagField.TagField;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.fxml.FXML;
 import javafx.geometry.Insets;
@@ -70,6 +72,7 @@ public class NewPaymentController extends BaseController implements Styleable
 	@FXML private TextArea textArea;
 	@FXML private HBox hboxTags;
 	@FXML private Button buttonTagsHelp;
+	@FXML private CheckBox checkBoxEndDate;
 
 	private Stage parentStage;
 	private Controller controller;
@@ -247,6 +250,10 @@ public class NewPaymentController extends BaseController implements Styleable
 				}
 			}
 		});
+		
+		checkBoxEndDate.selectedProperty().addListener((obs, oldValue, newValue)->{
+			datePickerEnddate.setDisable(!newValue);
+		});
 	}
 	
 	private void initSpinnerRepeatingPeriod()
@@ -333,6 +340,8 @@ public class NewPaymentController extends BaseController implements Styleable
 						toggleRepeatingArea(true);
 						comboBoxRepeatingDay.getSelectionModel().select(currentPayment.getRepeatMonthDay()-1);
 					}
+					
+					checkBoxEndDate.setSelected(currentPayment.getRepeatEndDate() != null);
 					if(currentPayment.getRepeatEndDate() != null)
 					{
 						datePickerEnddate.setValue(LocalDate.parse(currentPayment.getRepeatEndDate()));
@@ -389,7 +398,7 @@ public class NewPaymentController extends BaseController implements Styleable
 		}
 
 		String amountText = textFieldAmount.getText();
-		if(!amountText.matches("^-?\\d+(,\\d+)*(\\.\\d+(e\\d+)?)?$"))
+		if(!amountText.matches("^-?\\d+(,\\d+)?(\\.\\d+)?$"))
 		{
 			showWarning(Localization.getString(Strings.WARNING_PAYMENT_AMOUNT));
 			return;
@@ -403,7 +412,7 @@ public class NewPaymentController extends BaseController implements Styleable
 		}
 
 		int amount = 0;
-		amount = (int)(Double.parseDouble(amountText.replace(",", ".")) * 100);
+		amount = new BigDecimal(amountText.replace(",", ".")).multiply(new BigDecimal(100)).toBigInteger().intValue();
 		if(isPayment)
 		{
 			amount = -amount;
@@ -412,7 +421,7 @@ public class NewPaymentController extends BaseController implements Styleable
 		String description = textArea.getText();
 		if(description != null)
 		{
-			if(description.length() > 150)
+			if(description.length() > 200)
 			{
 				showWarning(Localization.getString(Strings.WARNING_DESCRIPTION_CHARACTER_LIMIT_REACHED_150));				
 				return;
@@ -444,17 +453,18 @@ public class NewPaymentController extends BaseController implements Styleable
 				return;
 			}
 
-			if(datePickerEnddate.getValue() != null && datePickerEnddate.getValue().isBefore(date))
+			if(checkBoxEndDate.isSelected() && datePickerEnddate.getValue() != null && datePickerEnddate.getValue().isBefore(date))
 			{
 				showWarning(Localization.getString(Strings.WARNING_ENDDATE_BEFORE_STARTDATE));				
 				return;
 			}			
 
 			if(edit)
-			{				
+			{
 				try
-				{		
-					RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval, Helpers.getDateString(datePickerEnddate.getValue()), repeatingDay);
+				{
+					LocalDate endDate = checkBoxEndDate.isSelected() ? datePickerEnddate.getValue() : null;
+					RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval, Helpers.getDateString(endDate), repeatingDay);
 							
 					ServerConnection connection = new ServerConnection(controller.getSettings());
 					if(payment instanceof NormalPayment)
@@ -480,7 +490,8 @@ public class NewPaymentController extends BaseController implements Styleable
 			}
 			else
 			{
-				RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval,Helpers.getDateString(datePickerEnddate.getValue()), repeatingDay);
+				LocalDate endDate = checkBoxEndDate.isSelected() ? datePickerEnddate.getValue() : null;
+				RepeatingPayment newPayment = new RepeatingPayment(-1, amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description, repeatingInterval, Helpers.getDateString(endDate), repeatingDay);
 				try
 				{
 					ServerConnection connection = new ServerConnection(controller.getSettings());
@@ -598,7 +609,8 @@ public class NewPaymentController extends BaseController implements Styleable
 			spinnerRepeatingPeriod.setDisable(!selected);
 			comboBoxRepeatingDay.setDisable(!selected);
 		}
-		datePickerEnddate.setDisable(!selected);
+		checkBoxEndDate.setDisable(!selected);
+		datePickerEnddate.setDisable(!selected || !checkBoxEndDate.isSelected());
 		radioButtonPeriod.setDisable(!selected);
 		radioButtonDay.setDisable(!selected);
 		labelText1.setDisable(!selected);
@@ -679,9 +691,9 @@ public class NewPaymentController extends BaseController implements Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonTagsHelp.setGraphic(Helpers.getFontIcon(FontIconType.QUESTION, 13, Colors.TEXT));
-		buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE));
-		buttonSave.setGraphic(Helpers.getFontIcon(FontIconType.SAVE, 17, Color.WHITE));
+		buttonTagsHelp.setGraphic(new FontIcon(FontIconType.QUESTION, 13, Colors.TEXT));
+		buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE));
+		buttonSave.setGraphic(new FontIcon(FontIconType.SAVE, 17, Color.WHITE));
 
 		scrollPane.setStyle("-fx-background-color: transparent");
 		buttonTagsHelp.setStyle("-fx-background-color: transparent; -fx-border-radius: 50%; -fx-border-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java
index c489114a84a5498c9fc8b417b2abe22c752185b2..c05c1822a5f1053b5331f109ba465859d93758f8 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/PaymentController.java
@@ -16,6 +16,7 @@ import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Refreshable;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.cells.PaymentCell;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.beans.value.ChangeListener;
@@ -205,11 +206,11 @@ public class PaymentController implements Refreshable, Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonNewIncome.setGraphic(Helpers.getFontIcon(FontIconType.DOWNLOAD, 18, Color.WHITE));
-		buttonFilter.setGraphic(Helpers.getFontIcon(FontIconType.FILTER, 18, Color.WHITE));
-		buttonNewPayment.setGraphic(Helpers.getFontIcon(FontIconType.UPLOAD, 18, Color.WHITE));
-		labelFilterActive.setGraphic(Helpers.getFontIcon(FontIconType.WARNING, 13, Colors.TEXT));
-		buttonSearch.setGraphic(Helpers.getFontIcon(FontIconType.SEARCH, 18, Color.WHITE));
+		buttonNewIncome.setGraphic(new FontIcon(FontIconType.DOWNLOAD, 18, Color.WHITE));
+		buttonFilter.setGraphic(new FontIcon(FontIconType.FILTER, 18, Color.WHITE));
+		buttonNewPayment.setGraphic(new FontIcon(FontIconType.UPLOAD, 18, Color.WHITE));
+		labelFilterActive.setGraphic(new FontIcon(FontIconType.WARNING, 13, Colors.TEXT));
+		buttonSearch.setGraphic(new FontIcon(FontIconType.SEARCH, 18, Color.WHITE));
 
 		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));
 		labelIncome.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java
index a99a28ee7b3f6ae657f70273fcabfbf49deee779..e9fb0cd84fdb15adef6cadef08153758a7532801 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/ReportController.java
@@ -28,14 +28,14 @@ import de.deadlocker8.budgetmaster.logic.report.ReportSorting;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.tag.TagHandler;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Refreshable;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.cells.report.table.ReportTableRatingCell;
 import de.deadlocker8.budgetmasterclient.ui.cells.report.table.ReportTableRepeatingCell;
-import de.deadlocker8.budgetmasterclient.utils.UIHelpers;
+import de.deadlocker8.budgetmasterclient.utils.LoadingModal;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.beans.property.SimpleStringProperty;
@@ -67,6 +67,7 @@ import logger.Logger;
 import tools.AlertGenerator;
 import tools.ConvertTo;
 import tools.Localization;
+import tools.ObjectJSONHandler;
 import tools.Worker;
 
 public class ReportController implements Refreshable, Styleable
@@ -196,9 +197,9 @@ public class ReportController implements Refreshable, Styleable
 	
 	private void applyReportPreferences()
 	{
-		tableView.getColumns().clear();		
+		tableView.getColumns().clear();
 		
-		Object loadedObject = FileHelper.loadObjectFromJSON("reportPreferences", new ReportPreferences());
+		Object loadedObject = ObjectJSONHandler.loadObjectFromJSON(Localization.getString(Strings.FOLDER), "reportPreferences", new ReportPreferences());
 		if(loadedObject != null)
 		{
 			reportPreferences = (ReportPreferences)loadedObject;
@@ -613,7 +614,7 @@ public class ReportController implements Refreshable, Styleable
 	{
 		try
 		{
-			FileHelper.saveObjectToJSON("reportPreferences", reportPreferences);
+			ObjectJSONHandler.saveObjectToJSON(Localization.getString(Strings.FOLDER), "reportPreferences", reportPreferences);
 		}
 		catch(IOException e)
 		{
@@ -652,7 +653,7 @@ public class ReportController implements Refreshable, Styleable
 																controller.getCurrentDate(),
 																budget);
 			
-			Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT), controller.getStage(), controller.getIcon());
+			LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT), controller.getStage(), controller.getIcon());
 
 			Worker.runLater(() -> {
 				try
@@ -660,10 +661,7 @@ public class ReportController implements Refreshable, Styleable
 					reportGenerator.generate();					
 
 					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}
+						LoadingModal.closeModal();
 						
 						controller.showNotification(Localization.getString(Strings.NOTIFICATION_REPORT_SAVE));	
 						
@@ -737,10 +735,7 @@ public class ReportController implements Refreshable, Styleable
 				{
 					Logger.error(e);
 					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}
+						LoadingModal.closeModal();
 						AlertGenerator.showAlert(AlertType.ERROR, 
 												Localization.getString(Strings.TITLE_ERROR), 
 												"", 
@@ -763,7 +758,7 @@ public class ReportController implements Refreshable, Styleable
 	@Override
 	public void refresh()
 	{
-		Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT_TAB), controller.getStage(), controller.getIcon());
+		LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_REPORT_TAB), controller.getStage(), controller.getIcon());
 		
 		if(controller.getFilterSettings().equals(new FilterSettings()))
 		{
@@ -787,11 +782,7 @@ public class ReportController implements Refreshable, Styleable
 			refreshTableView();
 
 			Platform.runLater(() -> {
-				if(modalStage != null)
-				{
-					modalStage.close();
-				}
-				
+				LoadingModal.closeModal();				
 				applyReportPreferences();
 				tableView.refresh();
 			});
@@ -801,9 +792,9 @@ public class ReportController implements Refreshable, Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonFilter.setGraphic(Helpers.getFontIcon(FontIconType.FILTER, 18, Color.WHITE));		
-		buttonGenerate.setGraphic(Helpers.getFontIcon(FontIconType.COGS, 18, Color.WHITE));	
-		labelFilterActive.setGraphic(Helpers.getFontIcon(FontIconType.WARNING, 16, Colors.TEXT));
+		buttonFilter.setGraphic(new FontIcon(FontIconType.FILTER, 18, Color.WHITE));		
+		buttonGenerate.setGraphic(new FontIcon(FontIconType.COGS, 18, Color.WHITE));	
+		labelFilterActive.setGraphic(new FontIcon(FontIconType.WARNING, 16, Colors.TEXT));
 		
 		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));
 		labelFilterActive.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java
index 1fab017b8c4b1537d727d2b6798dcc4e0f380c50..930d015ae397027f02532bc5fd8beceeb41f4435 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SearchController.java
@@ -9,11 +9,11 @@ import de.deadlocker8.budgetmaster.logic.search.SearchPreferences;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.cells.SearchCell;
-import de.deadlocker8.budgetmasterclient.utils.UIHelpers;
+import de.deadlocker8.budgetmasterclient.utils.LoadingModal;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.beans.value.ChangeListener;
@@ -98,10 +98,11 @@ public class SearchController extends BaseController implements Styleable
 						if(cell.getItem().getCategoryID() != 2)
 						{
 							controller.getPaymentController().payment(!cell.getItem().isIncome(), true, cell.getItem());
+							search();
 						}
 					}
 				});
-				cell.prefWidthProperty().bind(listView.widthProperty().subtract(2));
+				cell.prefWidthProperty().bind(listView.widthProperty().subtract(4));
 				return cell;
 			}
 		});
@@ -261,7 +262,7 @@ public class SearchController extends BaseController implements Styleable
 		searchPreferences.setMinAmount((int)rangeSlider.getLowValue());
 		searchPreferences.setMaxAmount((int)rangeSlider.getHighValue());
 		
-		Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_SEARCH), getStage(), controller.getIcon());
+		LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_SEARCH), getStage(), controller.getIcon());
 		
 		Worker.runLater(() -> {
 			try 
@@ -283,20 +284,14 @@ public class SearchController extends BaseController implements Styleable
 						listView.getItems().setAll(payments);
 					}
 				
-					if(modalStage != null)
-					{
-						modalStage.close();
-					}							
+					LoadingModal.closeModal();							
 				});
 			}
 			catch(Exception e)
 			{
 				Logger.error(e);
 				Platform.runLater(() -> {
-					if(modalStage != null)
-					{
-						modalStage.close();
-					}
+					LoadingModal.closeModal();
 					controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
 				});
 			}
@@ -323,8 +318,8 @@ public class SearchController extends BaseController implements Styleable
 		labelSeparator.setMinHeight(1);
 		labelSeparator.setMaxHeight(1);
 		
-		buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE));	
-		buttonSearch.setGraphic(Helpers.getFontIcon(FontIconType.SEARCH, 17, Color.WHITE));
+		buttonCancel.setGraphic(new FontIcon(FontIconType.TIMES, 17, Color.WHITE));	
+		buttonSearch.setGraphic(new FontIcon(FontIconType.SEARCH, 17, Color.WHITE));
 
 		buttonCancel.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;");
 		buttonSearch.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 15;");
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java
index 28071b5355d3ce73337c65457637e12afd880ad5..2bc64ec98de85fad20ace075f99e63af86f418d8 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SplashScreenController.java
@@ -7,8 +7,10 @@ import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.ShutdownHandler;
 import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.customAlert.CustomAlertController;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.fxml.FXML;
@@ -40,12 +42,14 @@ public class SplashScreenController extends BaseController implements Styleable
 	private Settings settings;
 	private boolean isFirstStart;
 	private boolean isStartingAfterUpdate;
+	private ShutdownHandler shutdownHandler;
 	
-	public SplashScreenController(Stage parentStage, Image icon, boolean isStartingAfterUpdate)
+	public SplashScreenController(Stage parentStage, Image icon, boolean isStartingAfterUpdate, ShutdownHandler shutdownHandler)
 	{
 		this.parentStage = parentStage;
 		this.icon = icon;
 		this.isStartingAfterUpdate = isStartingAfterUpdate;
+		this.shutdownHandler = shutdownHandler;
 		load("/de/deadlocker8/budgetmaster/ui/fxml/SplashScreen.fxml", Localization.getBundle());
 		getStage().show();
 	}
@@ -177,7 +181,7 @@ public class SplashScreenController extends BaseController implements Styleable
 	
 	private void openBudgetMaster()
 	{
-		new Controller(settings);
+		new Controller(settings, shutdownHandler);
 	}
 	
 	public Image getIcon()
@@ -188,7 +192,7 @@ public class SplashScreenController extends BaseController implements Styleable
 	@Override
 	public void applyStyle()
 	{
-		buttonLogin.setGraphic(Helpers.getFontIcon(FontIconType.SIGN_IN, 18, Color.WHITE));
+		buttonLogin.setGraphic(new FontIcon(FontIconType.SIGN_IN, 18, Color.WHITE));
 		buttonLogin.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");
 		buttonLogin.setPadding(new Insets(3, 7, 3, 7));		
 	}
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java
new file mode 100644
index 0000000000000000000000000000000000000000..edba3b99cff975d088cea5cfe6bb4c3ecce74f5c
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/LocalServerSettingsController.java
@@ -0,0 +1,406 @@
+package de.deadlocker8.budgetmasterclient.ui.controller.settings;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.ServerType;
+import de.deadlocker8.budgetmaster.logic.Settings;
+import de.deadlocker8.budgetmaster.logic.localserver.LocalServerException;
+import de.deadlocker8.budgetmaster.logic.localserver.LocalServerHandler;
+import de.deadlocker8.budgetmaster.logic.localserver.LocalServerStatus;
+import de.deadlocker8.budgetmaster.logic.updater.Updater;
+import de.deadlocker8.budgetmaster.logic.utils.Colors;
+import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.LanguageType;
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.RestartHandler;
+import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
+import de.deadlocker8.budgetmasterclient.utils.LoadingModal;
+import javafx.application.Platform;
+import javafx.fxml.FXML;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.RadioButton;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.TextField;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.HBox;
+import logger.Logger;
+import tools.AlertGenerator;
+import tools.ConvertTo;
+import tools.HashUtils;
+import tools.Localization;
+import tools.Worker;
+
+public class LocalServerSettingsController extends SettingsController
+{
+	@FXML private AnchorPane anchorPaneMain;
+	@FXML private ScrollPane scrollPane;
+	@FXML private HBox hboxSettings;
+	@FXML private ToggleButton toggleButtonOnline;
+	@FXML private ToggleButton toggleButtonLocal;
+	@FXML private Label labelStatus;
+	@FXML private Label labelLocalServerStatus;
+	@FXML private Button buttonLocalServerAction;
+	@FXML private Label labelClientSecret;
+	@FXML private TextField textFieldClientSecret;
+	@FXML private TextField textFieldCurrency;
+	@FXML private Label labelCurrency;
+	@FXML private Button buttonSave;
+	@FXML private Button buttonExportDB;
+	@FXML private Button buttonImportDB;
+	@FXML private Button buttonDeleteDB;
+	@FXML private RadioButton radioButtonRestActivated;
+	@FXML private RadioButton radioButtonRestDeactivated;
+	@FXML private ComboBox<LanguageType> comboBoxLanguage;
+	@FXML private CheckBox checkboxEnableAutoUpdate;
+	@FXML private Button buttonSearchUpdates;
+	@FXML private Label labelCurrentVersion;
+	@FXML private Label labelLatestVersion;
+
+	private LanguageType previousLanguage;
+	
+	private final int MILLIS_UNTIL_NEXT_RETRY = 2000;
+	private final int MAX_NUMBER_OF_RETRIES = 5;
+
+	@Override
+	public void init(Controller controller)
+	{
+		super.controller = controller;
+
+		ToggleGroup toggleGroupServerType = new ToggleGroup();
+		toggleButtonOnline.setToggleGroup(toggleGroupServerType);
+		toggleButtonLocal.setToggleGroup(toggleGroupServerType);
+		toggleButtonOnline.setOnAction((event) -> {
+			controller.getSettings().setServerType(ServerType.ONLINE);
+			controller.loadSettingsTab();
+		});
+
+		textFieldClientSecret.setText("******");
+
+		comboBoxLanguage.setCellFactory((view) -> {
+			return new LanguageCell(true);
+		});
+
+		comboBoxLanguage.getItems().addAll(LanguageType.values());
+		comboBoxLanguage.setButtonCell(new LanguageCell(false));
+		comboBoxLanguage.setValue(LanguageType.ENGLISH);
+		previousLanguage = LanguageType.ENGLISH;
+		checkboxEnableAutoUpdate.setSelected(true);
+
+		applyStyle();
+
+		textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER));
+
+		ToggleGroup toggleGroup = new ToggleGroup();
+		radioButtonRestActivated.setToggleGroup(toggleGroup);
+		radioButtonRestDeactivated.setToggleGroup(toggleGroup);
+
+		hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25));
+
+		refreshLabelsUpdate();
+		prefill();
+		checkServerStatus();
+	}
+
+	@Override
+	public void prefill()
+	{
+		textFieldCurrency.setText(controller.getSettings().getCurrency());
+
+		if(controller.getSettings().isRestActivated())
+		{
+			radioButtonRestActivated.setSelected(true);
+		}
+		else
+		{
+			radioButtonRestDeactivated.setSelected(true);
+		}
+
+		if(controller.getSettings().getLanguage() != null)
+		{
+			LanguageType language = controller.getSettings().getLanguage();
+			comboBoxLanguage.setValue(language);
+			previousLanguage = language;
+		}
+
+		checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled());
+	}
+
+	private void checkServerStatus()
+	{
+		LocalServerHandler serverHandler = new LocalServerHandler();
+		switch(serverHandler.getServerStatus())
+		{
+			case ACTIVE:
+				labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_OK));
+				buttonLocalServerAction.setVisible(false);				
+				refreshLabelsUpdate();
+				save();
+				break;
+			case INACTIVE:
+				Platform.runLater(()->{
+					LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon());
+				});
+				labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_NOT_STARTED));
+				buttonLocalServerAction.setVisible(false);
+				Worker.runLater(() -> {
+					try
+					{
+						Logger.debug("Starting local Server...");
+						serverHandler.createServerSettingsIfNotExists();
+						serverHandler.startServer();
+						
+						Logger.debug("Trying to connect to local server...");
+						Platform.runLater(()->{LoadingModal.setMessage(Localization.getString(Strings.LOAD_LOCAL_SERVER_CONNECT));});
+						int retryCount = 1;
+						while(retryCount <= MAX_NUMBER_OF_RETRIES)
+						{
+							final int retries = retryCount;
+							boolean isActive = serverHandler.getServerStatus().equals(LocalServerStatus.ACTIVE);
+							if(isActive)
+							{
+								Logger.debug("Connected to local server");
+								break;
+							}
+								
+							if(retryCount == MAX_NUMBER_OF_RETRIES)
+							{
+								Logger.debug("Couldn't connect to local server. Giving up after " + retryCount + " retries.");
+								throw new LocalServerException("");
+							}
+							else
+							{
+								Logger.debug("Couldn't connect to local server. Retry " + retryCount + "/" + MAX_NUMBER_OF_RETRIES + ". Next Retry in " + MILLIS_UNTIL_NEXT_RETRY/1000 + " Seconds...");							
+								Platform.runLater(()->{LoadingModal.setMessage(Localization.getString(Strings.LOAD_LOCAL_SERVER_RETRY, retries, MAX_NUMBER_OF_RETRIES));});
+								retryCount++;
+								try
+								{
+									Thread.sleep(MILLIS_UNTIL_NEXT_RETRY);
+								}
+								catch(InterruptedException e)
+								{
+								}
+							}							
+						}
+					}
+					catch(IOException e)
+					{
+						Logger.debug("Error while starting local server");
+						Logger.error(e);
+						Platform.runLater(()->{
+							LoadingModal.closeModal();
+							AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_START, e.getMessage()), controller.getIcon(), controller.getStage(), null, false);
+							controller.forceSettingsTab();
+						});
+						return;
+					}
+					catch(LocalServerException ex)
+					{
+						Logger.debug("Error while starting local server");
+						Platform.runLater(()->{
+							LoadingModal.closeModal();
+							AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_START, ""), controller.getIcon(), controller.getStage(), null, false);
+							controller.refresh(controller.getFilterSettings());
+							buttonLocalServerAction.setText(Localization.getString(Strings.LOCAL_SERVER_ACTION_NOT_STARTED));
+							buttonLocalServerAction.setVisible(true);
+							buttonLocalServerAction.setDisable(false);
+
+							buttonLocalServerAction.setOnAction((event) -> {
+								buttonLocalServerAction.setDisable(true);
+								checkServerStatus();
+							});						
+						});
+						return;
+					}
+					
+					Platform.runLater(()->{
+						checkServerStatus();
+						LoadingModal.closeModal();
+					});
+				});
+				break;
+			case MISSING:
+				controller.forceSettingsTab();
+				labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_NOT_PRESENT));
+				buttonLocalServerAction.setText(Localization.getString(Strings.LOCAL_SERVER_ACTION_NOT_PRESENT));
+				buttonLocalServerAction.setVisible(true);
+				buttonLocalServerAction.setDisable(false);
+
+				buttonLocalServerAction.setOnAction((event) -> {
+					buttonLocalServerAction.setDisable(true);
+					LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon());
+
+					Worker.runLater(() -> {
+						try
+						{							
+							serverHandler.downloadServer(Localization.getString(Strings.VERSION_NAME));
+							serverHandler.createServerSettingsIfNotExists();
+							Platform.runLater(()->{
+								checkServerStatus();
+								LoadingModal.closeModal();
+							});
+						}
+						catch(Exception e)
+						{
+							Logger.error(e);
+							Platform.runLater(()->{
+								LoadingModal.closeModal();
+								AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_DOWNLOAD, e.getMessage()), controller.getIcon(), controller.getStage(), null, false);
+								buttonLocalServerAction.setDisable(false);
+							});
+						}
+					});
+				});
+				break;
+			default:
+				break;
+		}
+	}
+
+	@Override
+	void refreshLabelsUpdate()
+	{
+		Updater updater = controller.getUpdater();
+		labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME));
+		labelLatestVersion.setText(updater.getLatestVersion().getVersionName());
+	}
+
+	@Override
+	public void save()
+	{
+		String clientSecret = textFieldClientSecret.getText();
+		String currency = textFieldCurrency.getText();
+		
+		if(clientSecret == null || clientSecret.trim().equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), "", Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT), controller.getIcon(), controller.getStage(), null, false);
+			return;
+		}
+		clientSecret = clientSecret.trim();
+
+		if(currency == null || currency.trim().equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, Localization.getString(Strings.TITLE_WARNING), "", Localization.getString(Strings.WARNING_EMPTY_CURRENCY), controller.getIcon(), controller.getStage(), null, false);
+			return;
+		}
+		currency = currency.trim();
+
+		if(controller.getSettings().isComplete())
+		{
+			if(!clientSecret.equals("******"))
+			{
+				controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT));
+			}
+
+			controller.getSettings().setCurrency(currency);
+			controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected());
+			controller.getSettings().setLanguage(comboBoxLanguage.getValue());
+			controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected());
+		}
+		else
+		{
+			Settings settings = new Settings();
+
+			if(!clientSecret.equals("******"))
+			{
+				settings.setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT));
+			}
+			else
+			{
+				settings.setClientSecret(controller.getSettings().getClientSecret());
+			}
+
+			settings.setCurrency(currency);
+			settings.setRestActivated(radioButtonRestActivated.isSelected());
+			settings.setLanguage(comboBoxLanguage.getValue());
+			settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected());
+			controller.setSettings(settings);
+		}
+
+		controller.getSettings().setServerType(ServerType.LOCAL);
+		controller.getSettings().setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT));
+		controller.getSettings().setUrl("https://localhost:9000");
+		ArrayList<String> trustedHosts = new ArrayList<>();
+		trustedHosts.add("localhost");
+		controller.getSettings().setTrustedHosts(trustedHosts);
+
+		try
+		{
+			FileHelper.saveSettings(controller.getSettings());
+		}
+		catch(IOException e)
+		{
+			Logger.error(e);
+			AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_SETTINGS_SAVE), controller.getIcon(), controller.getStage(), null, false);
+		}
+
+		textFieldClientSecret.setText("******");
+
+		RestartHandler restartHandler = new RestartHandler(controller);
+		restartHandler.handleRestart(previousLanguage);
+		refreshLabelsUpdate();
+	}
+	
+	public void handleIncompatibleServer()
+	{
+		labelLocalServerStatus.setText(Localization.getString(Strings.LOCAL_SERVER_STATUS_INCOMPATIBLE));
+		buttonLocalServerAction.setText(Localization.getString(Strings.LOCAL_SERVER_ACTION_INCOMPATIBLE));
+		buttonLocalServerAction.setVisible(true);
+		buttonLocalServerAction.setDisable(false);
+
+		buttonLocalServerAction.setOnAction((event) -> {
+			buttonLocalServerAction.setDisable(true);
+			LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DOWNLOAD_LOCAL_SERVER), controller.getStage(), controller.getIcon());
+
+			Worker.runLater(() -> {
+				try
+				{					
+					LocalServerHandler serverHandler = new LocalServerHandler();
+					serverHandler.shutdownServer();
+					Thread.sleep(3000);
+					serverHandler.downloadServer(Localization.getString(Strings.VERSION_NAME));
+					serverHandler.createServerSettingsIfNotExists();
+					Platform.runLater(()->{
+						checkServerStatus();
+						LoadingModal.closeModal();
+					});
+				}
+				catch(Exception e)
+				{
+					Logger.error(e);
+					Platform.runLater(()->{
+						LoadingModal.closeModal();
+						AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_LOCAL_SERVER_DOWNLOAD, e.getMessage()), controller.getIcon(), controller.getStage(), null, false);
+						buttonLocalServerAction.setDisable(false);
+					});
+				}
+			});
+		});
+	}
+
+	@Override
+	public void applyStyle()
+	{
+		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));
+		scrollPane.setStyle("-fx-background-color: transparent");
+		labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
+		labelStatus.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
+		labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
+		toggleButtonOnline.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 3 0 0 3");
+		toggleButtonLocal.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_DARK_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 0 3 3 0; -fx-effect: innershadow(gaussian, rgba(0,0,0,0.7), 10,0,0,0);");
+		buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");
+		buttonLocalServerAction.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
+		buttonExportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
+		buttonImportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
+		buttonDeleteDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_RED) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
+		buttonSearchUpdates.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;");
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/OnlineServerSettingsController.java
similarity index 51%
rename from BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java
rename to BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/OnlineServerSettingsController.java
index c481192e7f8166d22821f9f7096090dfa7fa2770..44665753d8c9e3ea86025300c8eef8aa7fc882a3 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/OnlineServerSettingsController.java
@@ -1,14 +1,10 @@
-package de.deadlocker8.budgetmasterclient.ui.controller;
+package de.deadlocker8.budgetmasterclient.ui.controller.settings;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Optional;
 
+import de.deadlocker8.budgetmaster.logic.ServerType;
 import de.deadlocker8.budgetmaster.logic.Settings;
-import de.deadlocker8.budgetmaster.logic.database.Database;
-import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
-import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
 import de.deadlocker8.budgetmaster.logic.updater.Updater;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
@@ -16,46 +12,35 @@ import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.LanguageType;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.RestartHandler;
-import de.deadlocker8.budgetmasterclient.ui.Styleable;
 import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell;
-import de.deadlocker8.budgetmasterclient.utils.UIHelpers;
-import javafx.application.Platform;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
 import javafx.fxml.FXML;
-import javafx.scene.control.Alert;
 import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
-import javafx.scene.control.ButtonBar.ButtonData;
-import javafx.scene.control.ButtonType;
 import javafx.scene.control.CheckBox;
 import javafx.scene.control.ComboBox;
-import javafx.scene.control.DialogPane;
 import javafx.scene.control.Label;
 import javafx.scene.control.RadioButton;
 import javafx.scene.control.ScrollPane;
 import javafx.scene.control.TextArea;
 import javafx.scene.control.TextField;
-import javafx.scene.control.TextInputDialog;
+import javafx.scene.control.ToggleButton;
 import javafx.scene.control.ToggleGroup;
-import javafx.scene.input.KeyCode;
-import javafx.scene.input.KeyEvent;
 import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.HBox;
-import javafx.stage.FileChooser;
-import javafx.stage.Stage;
 import logger.Logger;
 import tools.AlertGenerator;
-import tools.BASE58Type;
 import tools.ConvertTo;
 import tools.HashUtils;
 import tools.Localization;
-import tools.RandomCreations;
-import tools.Worker;
 
-public class SettingsController implements Styleable
+public class OnlineServerSettingsController extends SettingsController
 {
 	@FXML private AnchorPane anchorPaneMain;
 	@FXML private ScrollPane scrollPane;
 	@FXML private HBox hboxSettings;
+	@FXML private ToggleButton toggleButtonOnline;
+	@FXML private ToggleButton toggleButtonLocal;
 	@FXML private Label labelClientSecret;
 	@FXML private TextField textFieldClientSecret;
 	@FXML private TextField textFieldURL;
@@ -77,12 +62,20 @@ public class SettingsController implements Styleable
 	@FXML private Label labelCurrentVersion;
 	@FXML private Label labelLatestVersion;
 
-	private Controller controller;
 	private LanguageType previousLanguage;
 
+	@Override
 	public void init(Controller controller)
 	{
-		this.controller = controller;
+		super.controller = controller;
+		
+		ToggleGroup toggleGroupServerType = new ToggleGroup();
+		toggleButtonOnline.setToggleGroup(toggleGroupServerType);
+		toggleButtonLocal.setToggleGroup(toggleGroupServerType);
+		toggleButtonLocal.setOnAction((event)->{
+			controller.getSettings().setServerType(ServerType.LOCAL);
+			controller.loadSettingsTab();
+		});
 		
 		textFieldClientSecret.setText("******");		
 		
@@ -111,15 +104,21 @@ public class SettingsController implements Styleable
 		hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25));
 		
 		refreshLabelsUpdate();
+		
+		if(controller.checkSettings())
+		{
+			controller.refresh(controller.getFilterSettings());
+		}
 	}
 	
+	@Override
 	public void prefill()
 	{
 		if(controller.getSettings().isComplete())
 		{
 			textFieldURL.setText(controller.getSettings().getUrl());
 			textFieldSecret.setText("******");
-			textFieldCurrency.setText(controller.getSettings().getCurrency());		
+			textFieldCurrency.setText(controller.getSettings().getCurrency());	
 		}
 		
 		if(controller.getSettings().isRestActivated())
@@ -141,7 +140,8 @@ public class SettingsController implements Styleable
 		checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled());
 	}
 	
-	private void refreshLabelsUpdate()
+	@Override
+	void refreshLabelsUpdate()
 	{
 		Updater updater = controller.getUpdater();
 		labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME));
@@ -166,14 +166,15 @@ public class SettingsController implements Styleable
 		}
 	}
 
+	@Override
 	public void save()
 	{
-		String clientSecret = textFieldClientSecret.getText().trim();
-		String url = textFieldURL.getText().trim();
-		String secret = textFieldSecret.getText().trim();
-		String currency = textFieldCurrency.getText().trim();
+		String clientSecret = textFieldClientSecret.getText();
+		String url = textFieldURL.getText();
+		String secret = textFieldSecret.getText();
+		String currency = textFieldCurrency.getText();
 		
-		if(clientSecret == null || clientSecret.equals(""))
+		if(clientSecret == null || clientSecret.trim().equals(""))
 		{
 			AlertGenerator.showAlert(AlertType.WARNING, 
 									Localization.getString(Strings.TITLE_WARNING), 
@@ -185,8 +186,9 @@ public class SettingsController implements Styleable
 									false);
 			return;
 		}
+		clientSecret = clientSecret.trim();
 		
-		if(url == null || url.equals(""))
+		if(url == null || url.trim().equals(""))
 		{
 			AlertGenerator.showAlert(AlertType.WARNING, 
 									Localization.getString(Strings.TITLE_WARNING), 
@@ -198,8 +200,9 @@ public class SettingsController implements Styleable
 									false);
 			return;
 		}
+		url = url.trim();
 
-		if(secret == null || secret.equals(""))
+		if(secret == null || secret.trim().equals(""))
 		{
 			AlertGenerator.showAlert(AlertType.WARNING, 
 									Localization.getString(Strings.TITLE_WARNING), 
@@ -211,8 +214,9 @@ public class SettingsController implements Styleable
 									false);
 			return;
 		}
+		secret = secret.trim();
 
-		if(currency == null || currency.equals(""))
+		if(currency == null || currency.trim().equals(""))
 		{
 			AlertGenerator.showAlert(AlertType.WARNING, 
 									Localization.getString(Strings.TITLE_WARNING), 
@@ -224,6 +228,7 @@ public class SettingsController implements Styleable
 									false);
 			return;
 		}
+		currency = currency.trim();
 
 		ArrayList<String> trustedHosts = new ArrayList<>();
 		String trustedHostText = textAreaTrustedHosts.getText();
@@ -255,6 +260,7 @@ public class SettingsController implements Styleable
 			controller.getSettings().setTrustedHosts(trustedHosts);
 			controller.getSettings().setLanguage(comboBoxLanguage.getValue());
 			controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected());
+			controller.getSettings().setServerType(ServerType.ONLINE);
 		}
 		else
 		{
@@ -283,6 +289,7 @@ public class SettingsController implements Styleable
 			settings.setTrustedHosts(trustedHosts);
 			settings.setLanguage(comboBoxLanguage.getValue());
 			settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected());
+			settings.setServerType(ServerType.ONLINE);
 			controller.setSettings(settings);
 		}
 
@@ -311,261 +318,13 @@ public class SettingsController implements Styleable
 		refreshLabelsUpdate();
 	}
 
-	public void exportDB()
-	{
-		FileChooser fileChooser = new FileChooser();
-		fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_EXPORT));
-		FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json");
-		fileChooser.getExtensionFilters().add(extFilter);
-		File file = fileChooser.showSaveDialog(controller.getStage());
-		if(file != null)
-		{
-			Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon());
-
-			Worker.runLater(() -> {
-				try
-				{
-					ServerConnection connection = new ServerConnection(controller.getSettings());
-					String databaseJSON = connection.exportDatabase();
-					FileHelper.saveDatabaseJSON(file, databaseJSON);
-
-					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}
-						AlertGenerator.showAlert(AlertType.INFORMATION, 
-												Localization.getString(Strings.INFO_TITLE_DATABASE_EXPORT), 
-												"", 
-												Localization.getString(Strings.INFO_TEXT_DATABASE_EXPORT), 
-												controller.getIcon(), 
-												controller.getStage(), 
-												null, 
-												false);
-					});
-				}
-				catch(Exception e)
-				{
-					Logger.error(e);
-					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}
-						controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));						
-					});
-				}
-			});
-		}
-	}
-	
-	private void importDatabase()
-	{
-		FileChooser fileChooser = new FileChooser();
-		fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_IMPORT));
-		FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json");
-		fileChooser.getExtensionFilters().add(extFilter);
-		File file = fileChooser.showOpenDialog(controller.getStage());
-		if(file != null)
-		{
-			Database database;
-			try
-			{
-				database = FileHelper.loadDatabaseJSON(file);
-				System.out.println(database);
-				if(database.getCategories() == null 
-					|| database.getNormalPayments() == null 
-					|| database.getRepeatingPayments() == null
-					|| database.getTags() == null
-					|| database.getTagMatches() == null)
-				{
-					AlertGenerator.showAlert(AlertType.ERROR, 
-											Localization.getString(Strings.TITLE_ERROR), 
-											"", 
-											Localization.getString(Strings.ERROR_DATABASE_IMPORT_WRONG_FILE), 
-											controller.getIcon(), 
-											controller.getStage(), 
-											null, 
-											false);
-					return;
-				}
-			}
-			catch(IOException e1)
-			{
-				Logger.error(e1);
-				AlertGenerator.showAlert(AlertType.ERROR, 
-										Localization.getString(Strings.TITLE_ERROR), 
-										"", 
-										Localization.getString(Strings.ERROR_DATABASE_IMPORT), 
-										controller.getIcon(), 
-										controller.getStage(), 
-										null, 
-										false);
-				return;
-			}
-
-			Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon());
-
-			Worker.runLater(() -> {
-				try
-				{
-					ServerConnection connection = new ServerConnection(controller.getSettings());
-					connection.importDatabase(database);
-
-					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}						
-						
-						AlertGenerator.showAlert(AlertType.INFORMATION, 
-												Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT), 
-												"", 
-												Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT), 
-												controller.getIcon(), 
-												controller.getStage(), 
-												null, 
-												false);
-						
-						controller.refresh(controller.getFilterSettings());
-					});
-				}
-				catch(Exception e)
-				{
-					Logger.error(e);
-					Platform.runLater(() -> {
-						if(modalStage != null)
-						{
-							modalStage.close();
-						}
-						controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
-					});
-				}
-			});
-		}
-		else
-		{
-			controller.refresh(controller.getFilterSettings());
-		}
-	}
-
-	public void importDB()
-	{
-		Alert alert = new Alert(AlertType.CONFIRMATION);
-		alert.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT_DIALOG));
-		alert.setHeaderText("");		
-		alert.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG));
-		Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
-		dialogStage.getIcons().add(controller.getIcon());
-		dialogStage.initOwner(controller.getStage());
-
-		ButtonType buttonTypeDelete = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_DELETE));
-		ButtonType buttonTypeAppend = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_APPEND));
-		ButtonType buttonTypeCancel = new ButtonType(Localization.getString(Strings.CANCEL), ButtonData.CANCEL_CLOSE);
-		alert.getButtonTypes().setAll(buttonTypeDelete, buttonTypeAppend, buttonTypeCancel);
-		
-		DialogPane dialogPane = alert.getDialogPane();
-		dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> {
-			if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button)
-			{
-				((Button)event.getTarget()).fire();
-			}
-		}));
-		
-		Optional<ButtonType> result = alert.showAndWait();
-		if(result.get() == buttonTypeDelete)
-		{
-			deleteDatabase(true);
-		}	
-		else if(result.get() == buttonTypeAppend)
-		{	
-			importDatabase();
-		}		
-	}
-	
-	public void deleteDB()
-	{
-		deleteDatabase(false);
-	}
-
-	public void deleteDatabase(boolean importPending)
-	{
-		String verificationCode = ConvertTo.toBase58(RandomCreations.generateRandomMixedCaseString(4, true), true, BASE58Type.UPPER);
-
-		TextInputDialog dialog = new TextInputDialog();
-		dialog.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_DELETE));
-		dialog.setHeaderText(Localization.getString(Strings.INFO_HEADER_TEXT_DATABASE_DELETE));
-		dialog.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_DELETE, verificationCode));
-		Stage dialogStage = (Stage)dialog.getDialogPane().getScene().getWindow();
-		dialogStage.getIcons().add(controller.getIcon());
-		dialogStage.initOwner(controller.getStage());
-
-		Optional<String> result = dialog.showAndWait();
-		if(result.isPresent())
-		{
-			if(result.get().equals(verificationCode))
-			{
-				Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon());
-
-				Worker.runLater(() -> {
-					try
-					{
-						ServerConnection connection = new ServerConnection(controller.getSettings());
-						connection.deleteDatabase();
-						Platform.runLater(() -> {							
-							if(modalStage != null)
-							{
-								modalStage.close();
-								if(importPending)
-								{
-									importDatabase();
-								}
-								else
-								{
-									controller.refresh(controller.getFilterSettings());
-								}
-							}
-						});
-					}
-					catch(Exception e)
-					{
-						Logger.error(e);
-						Platform.runLater(() -> {
-							if(modalStage != null)
-							{
-								modalStage.close();
-							}
-							controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
-						});
-					}
-				});
-			}
-			else
-			{
-				AlertGenerator.showAlert(AlertType.WARNING, 
-										Localization.getString(Strings.TITLE_WARNING), 
-										"", 
-										Localization.getString(Strings.WARNING_WRONG_VERIFICATION_CODE), 
-										controller.getIcon(), 
-										controller.getStage(), 
-										null, 
-										false);
-				deleteDatabase(importPending);
-			}
-		}
-	}
-	
-	public void checkForUpdates()
-	{
-		controller.checkForUpdates(true);		
-		refreshLabelsUpdate();
-	}
-
 	@Override
 	public void applyStyle()
 	{
 		anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND));
 		scrollPane.setStyle("-fx-background-color: transparent");
+		toggleButtonOnline.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_DARK_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 3 0 0 3; -fx-effect: innershadow(gaussian, rgba(0,0,0,0.7), 10,0,0,0);");
+		toggleButtonLocal.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 0 3 3 0");
 		labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
 		labelSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
 		labelURL.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/SettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/SettingsController.java
new file mode 100644
index 0000000000000000000000000000000000000000..43dd3187ea2fa6d1850109c146be462ad70a35bb
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/settings/SettingsController.java
@@ -0,0 +1,44 @@
+package de.deadlocker8.budgetmasterclient.ui.controller.settings;
+
+import de.deadlocker8.budgetmasterclient.ui.Styleable;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
+import de.deadlocker8.budgetmasterclient.utils.DatabaseDeleter;
+import de.deadlocker8.budgetmasterclient.utils.DatabaseExporter;
+import de.deadlocker8.budgetmasterclient.utils.DatabaseImporter;
+
+public abstract class SettingsController implements Styleable
+{
+	Controller controller;
+
+	public abstract void init(Controller controller);
+	
+	public abstract void prefill();
+	
+	abstract void refreshLabelsUpdate();
+
+	public abstract void save();
+
+	public void exportDB()
+	{
+		DatabaseExporter exporter = new DatabaseExporter(controller);
+		exporter.exportDatabase();
+	}
+
+	public void importDB()
+	{
+		DatabaseImporter importer = new DatabaseImporter(controller);
+		importer.importDatabase();	
+	}
+	
+	public void deleteDB()
+	{
+		DatabaseDeleter deleter = new DatabaseDeleter(controller);
+		deleter.deleteDatabase(false);
+	}
+
+	public void checkForUpdates()
+	{
+		controller.checkForUpdates(true);		
+		refreshLabelsUpdate();
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java
index 536a52cdcf4cd1c33542a1170e4ad3895a4b64ea..82b3728e3081507a29bd4a7f17666925412bdbb5 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/tagField/TagField.java
@@ -8,9 +8,9 @@ import org.controlsfx.control.textfield.TextFields;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
-import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmasterclient.ui.controller.NewPaymentController;
+import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
@@ -69,6 +69,11 @@ public class TagField extends VBox
             }
 	    });
 		
+		textField.setOnMousePressed((event)->{
+			textField.setText(" ");
+        	textField.setText("");
+		});
+		
 		TextFields.bindAutoCompletion(textField, new Callback<AutoCompletionBinding.ISuggestionRequest, Collection<String>>()
 		{
 			@Override
@@ -210,7 +215,7 @@ public class TagField extends VBox
 		hboxTag.getChildren().add(labelTagName);
 		
 		Button buttonDelete = new Button();
-		buttonDelete.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 13, Colors.TEXT));
+		buttonDelete.setGraphic(new FontIcon(FontIconType.TIMES, 13, Colors.TEXT));
 		buttonDelete.setStyle("-fx-background-color: transparent;");
 		buttonDelete.getStyleClass().add("button-hoverable");
 		buttonDelete.setOnAction((event)->{
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java
new file mode 100644
index 0000000000000000000000000000000000000000..83474efdfbe9aaf1c41eb834b0d581a624d62fe8
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java
@@ -0,0 +1,91 @@
+package de.deadlocker8.budgetmasterclient.utils;
+
+import java.util.Optional;
+
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
+import javafx.application.Platform;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.TextInputDialog;
+import javafx.stage.Stage;
+import logger.Logger;
+import tools.AlertGenerator;
+import tools.BASE58Type;
+import tools.ConvertTo;
+import tools.Localization;
+import tools.RandomCreations;
+import tools.Worker;
+
+public class DatabaseDeleter
+{
+	private Controller controller;
+	
+	public DatabaseDeleter(Controller controller)
+	{
+		this.controller = controller;
+	}
+	
+	public void deleteDatabase(boolean importPending)
+	{
+		String verificationCode = ConvertTo.toBase58(RandomCreations.generateRandomMixedCaseString(4, true), true, BASE58Type.UPPER);
+
+		TextInputDialog dialog = new TextInputDialog();
+		dialog.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_DELETE));
+		dialog.setHeaderText(Localization.getString(Strings.INFO_HEADER_TEXT_DATABASE_DELETE));
+		dialog.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_DELETE, verificationCode));
+		Stage dialogStage = (Stage)dialog.getDialogPane().getScene().getWindow();
+		dialogStage.getIcons().add(controller.getIcon());
+		dialogStage.initOwner(controller.getStage());
+
+		Optional<String> result = dialog.showAndWait();
+		if(result.isPresent())
+		{
+			if(result.get().equals(verificationCode))
+			{
+				LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon());
+
+				Worker.runLater(() -> {
+					try
+					{
+						ServerConnection connection = new ServerConnection(controller.getSettings());
+						connection.deleteDatabase();
+						Platform.runLater(() -> {							
+							LoadingModal.closeModal();
+							if(importPending)
+							{
+								DatabaseImporter importer = new DatabaseImporter(controller);
+								importer.importDB();
+							}
+							else
+							{
+								controller.refresh(controller.getFilterSettings());
+							}
+						});
+					}
+					catch(Exception e)
+					{
+						Logger.error(e);
+						Platform.runLater(() -> {
+							LoadingModal.closeModal();
+							controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
+						});
+					}
+				});
+			}
+			else
+			{
+				AlertGenerator.showAlert(AlertType.WARNING, 
+										Localization.getString(Strings.TITLE_WARNING), 
+										"", 
+										Localization.getString(Strings.WARNING_WRONG_VERIFICATION_CODE), 
+										controller.getIcon(), 
+										controller.getStage(), 
+										null, 
+										false);
+				deleteDatabase(importPending);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a92711fc41b4daaa7ff32f334a8b584a284ac1b
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java
@@ -0,0 +1,69 @@
+package de.deadlocker8.budgetmasterclient.utils;
+
+import java.io.File;
+
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
+import javafx.application.Platform;
+import javafx.scene.control.Alert.AlertType;
+import javafx.stage.FileChooser;
+import logger.Logger;
+import tools.AlertGenerator;
+import tools.Localization;
+import tools.Worker;
+
+public class DatabaseExporter
+{
+	private Controller controller;
+	
+	public DatabaseExporter(Controller controller)
+	{
+		this.controller = controller;
+	}
+	
+	public void exportDatabase()
+	{
+		FileChooser fileChooser = new FileChooser();
+		fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_EXPORT));
+		FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json");
+		fileChooser.getExtensionFilters().add(extFilter);
+		File file = fileChooser.showSaveDialog(controller.getStage());
+		if(file != null)
+		{
+			LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon());
+
+			Worker.runLater(() -> {
+				try
+				{
+					ServerConnection connection = new ServerConnection(controller.getSettings());
+					String databaseJSON = connection.exportDatabase();
+					FileHelper.saveDatabaseJSON(file, databaseJSON);
+
+					Platform.runLater(() -> {
+						LoadingModal.closeModal();
+						AlertGenerator.showAlert(AlertType.INFORMATION, 
+												Localization.getString(Strings.INFO_TITLE_DATABASE_EXPORT), 
+												"", 
+												Localization.getString(Strings.INFO_TEXT_DATABASE_EXPORT), 
+												controller.getIcon(), 
+												controller.getStage(), 
+												null, 
+												false);
+					});
+				}
+				catch(Exception e)
+				{
+					Logger.error(e);
+					Platform.runLater(() -> {
+						LoadingModal.closeModal();
+						controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));						
+					});
+				}
+			});
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d6ac00ff20aeb98668fcad0e8edca6792ae43d3
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java
@@ -0,0 +1,155 @@
+package de.deadlocker8.budgetmasterclient.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Optional;
+
+import de.deadlocker8.budgetmaster.logic.database.Database;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
+import javafx.application.Platform;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonBar.ButtonData;
+import javafx.scene.control.ButtonType;
+import javafx.scene.control.DialogPane;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import logger.Logger;
+import tools.AlertGenerator;
+import tools.Localization;
+import tools.Worker;
+
+public class DatabaseImporter
+{
+	private Controller controller;
+	
+	public DatabaseImporter(Controller controller)
+	{
+		this.controller = controller;
+	}
+	
+	public void importDatabase() 
+	{
+		Alert alert = new Alert(AlertType.CONFIRMATION);
+		alert.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT_DIALOG));
+		alert.setHeaderText("");		
+		alert.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG));
+		Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
+		dialogStage.getIcons().add(controller.getIcon());
+		dialogStage.initOwner(controller.getStage());
+
+		ButtonType buttonTypeDelete = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_DELETE));
+		ButtonType buttonTypeAppend = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_APPEND));
+		ButtonType buttonTypeCancel = new ButtonType(Localization.getString(Strings.CANCEL), ButtonData.CANCEL_CLOSE);
+		alert.getButtonTypes().setAll(buttonTypeDelete, buttonTypeAppend, buttonTypeCancel);
+		
+		DialogPane dialogPane = alert.getDialogPane();
+		dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> {
+			if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button)
+			{
+				((Button)event.getTarget()).fire();
+			}
+		}));
+		
+		Optional<ButtonType> result = alert.showAndWait();
+		if(result.get() == buttonTypeDelete)
+		{
+			DatabaseDeleter deleter = new DatabaseDeleter(controller);
+			deleter.deleteDatabase(true);
+		}	
+		else if(result.get() == buttonTypeAppend)
+		{	
+			importDB();
+		}
+	}
+	
+	public void importDB()
+	{
+		FileChooser fileChooser = new FileChooser();
+		fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_IMPORT));
+		FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json");
+		fileChooser.getExtensionFilters().add(extFilter);
+		File file = fileChooser.showOpenDialog(controller.getStage());
+		if(file != null)
+		{
+			Database database;
+			try
+			{
+				database = FileHelper.loadDatabaseJSON(file);
+				if(database.getCategories() == null 
+					|| database.getNormalPayments() == null 
+					|| database.getRepeatingPayments() == null
+					|| database.getTags() == null
+					|| database.getTagMatches() == null)
+				{
+					AlertGenerator.showAlert(AlertType.ERROR, 
+											Localization.getString(Strings.TITLE_ERROR), 
+											"", 
+											Localization.getString(Strings.ERROR_DATABASE_IMPORT_WRONG_FILE), 
+											controller.getIcon(), 
+											controller.getStage(), 
+											null, 
+											false);
+					return;
+				}
+			}
+			catch(IOException e1)
+			{
+				Logger.error(e1);
+				AlertGenerator.showAlert(AlertType.ERROR, 
+										Localization.getString(Strings.TITLE_ERROR), 
+										"", 
+										Localization.getString(Strings.ERROR_DATABASE_IMPORT), 
+										controller.getIcon(), 
+										controller.getStage(), 
+										null, 
+										false);
+				return;
+			}
+
+			LoadingModal.showModal(controller, Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon());
+
+			Worker.runLater(() -> {
+				try
+				{
+					ServerConnection connection = new ServerConnection(controller.getSettings());
+					connection.importDatabase(database);
+
+					Platform.runLater(() -> {
+						LoadingModal.closeModal();					
+						
+						AlertGenerator.showAlert(AlertType.INFORMATION, 
+												Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT), 
+												"", 
+												Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT), 
+												controller.getIcon(), 
+												controller.getStage(), 
+												null, 
+												false);
+						
+						controller.refresh(controller.getFilterSettings());
+					});
+				}
+				catch(Exception e)
+				{
+					Logger.error(e);
+					Platform.runLater(() -> {
+						LoadingModal.closeModal();	
+						controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
+					});
+				}
+			});
+		}
+		else
+		{
+			controller.refresh(controller.getFilterSettings());
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/UIHelpers.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java
similarity index 50%
rename from BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/UIHelpers.java
rename to BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java
index 88035fcb1da69d55f23adf6570343466f034dc26..748c5ee5e3c9144f5a62db145b0670a1b64a60e3 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/UIHelpers.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/LoadingModal.java
@@ -3,6 +3,7 @@ package de.deadlocker8.budgetmasterclient.utils;
 import java.io.IOException;
 
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
+import de.deadlocker8.budgetmasterclient.ui.controller.Controller;
 import de.deadlocker8.budgetmasterclient.ui.controller.ModalController;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
@@ -13,9 +14,42 @@ import javafx.stage.Stage;
 import logger.Logger;
 import tools.Localization;
 
-public class UIHelpers
+public class LoadingModal
 {
-	public static Stage showModal(String title, String message, Stage owner, Image icon)
+	private static Stage modalStage;
+	private static ModalController modalController;
+	
+	public static void showModal(Controller controller, String title, String message, Stage owner, Image icon)
+	{
+		closeModal();
+		modalStage = createModal(controller, title, message, owner, icon);
+	}
+	
+	public static void setMessage(String message)
+	{
+		if(modalController != null)
+		{
+			modalController.setMessage(message);
+		}
+	}
+	
+	public static void closeModal()
+	{
+		if(modalStage != null)
+		{
+			modalController.closeAlert();
+			modalStage.close();
+			modalStage = null;
+			modalController = null;
+		}
+	}
+	
+	public static boolean isShowing()
+	{
+		return modalStage != null && modalStage.isShowing();
+	}
+	
+	private static Stage createModal(Controller controller, String title, String message, Stage owner, Image icon)
 	{
 		try
 		{
@@ -29,8 +63,8 @@ public class UIHelpers
 			newStage.setScene(new Scene(root));
 			newStage.getIcons().add(icon);
 			newStage.setResizable(false);
-			ModalController newController = fxmlLoader.getController();
-			newController.init(newStage, message);
+			modalController = fxmlLoader.getController();
+			modalController.init(controller, newStage, message);
 			newStage.show();
 
 			return newStage;
@@ -41,4 +75,4 @@ public class UIHelpers
 			return null;
 		}
 	}
-}
\ No newline at end of file
+}
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 81951d930556fffb50b58fd5fa42cef0e9c0b73a..ec351e3a352c2b0d027e065f23f7b2b8ba21b261 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
@@ -1,10 +1,10 @@
 # DEFAULT
 app.name=BudgetMaster
-version.code=12
-version.name=1.7.1
-version.date=07.11.17
+version.code=13
+version.name=1.8.0
+version.date=17.12.17
 author=Robert Goldmann
-credits=L�nderflaggen von Freepik auf https://www.flaticon.com\nVerwendete Schriftarten: OpenSans
+credits=L�nderflaggen von Freepik auf https://www.flaticon.com\nVerwendete Schriftarten: OpenSans\nVerwendete Bibliotheken:\ngson 2.8.1\njoda-time 2.9.7\nitextpdf 5.0.6\nlaunch4j-maven-plugin 1.7.21\nspark-core 2.5.4\nslf4j 1.7.21\nmysql-connector 6.0.5\njunit 4.12\nsqlite-jdbc 3.21.0
 
 folder=Deadlocker/BudgetMaster
 roadmap.url=https://deadlocker.thecodelabs.de/roadmap/php/index.php?id=1
@@ -47,6 +47,10 @@ load.database.import=Die Datenbank wird importiert, bitte warten...
 load.database.delete=Die Datenbank wird gel�scht, bitte warten...
 load.update=Update wird heruntergeladen, bitte warten...
 load.search=Buchungen werden gesucht, bitte warten...
+load.local.server=Starte lokalen Server, bitte warten...
+load.download.local.server=Lade lokalen Server herunter, bitte warten...
+load.local.server.connect=Verbinde mit lokalem Server, bitte warten...
+load.local.server.retry=Verbinde mit lokalem Server... (Versuch {0}/{1})
 
 # MISC
 category.none=Keine Kategorie
@@ -67,6 +71,13 @@ trusted.hosts.placeholder=z.B. localhost
 undefined=unbekannt
 tagfield.placeholder=Neuen Tag hier eingeben
 shortcut.dev.console=F12
+local.server.status.ok=Server ist gestartet.
+local.server.status.not.started=Server konnte nicht gestartet werden.
+local.server.action.not.started=Starten
+local.server.status.not.present=Server nicht gefunden.
+local.server.action.not.present=Herunterladen
+local.server.status.incompatible=Server nicht kompatibel.
+local.server.action.incompatible=Aktualisieren
 
 # REPORT
 report.position=Nr.
@@ -155,8 +166,10 @@ info.text.update.available.show.changes.detailed=(detaillierte Infos auf GitHub.
 info.text.update.available.now=Jetzt updaten
 info.title.start.after.update=Update erfolgreich
 info.header.text.start.after.update=BudgetMaster wurde erfolgreich auf Version {0} aktualisiert
-info.text.start.after.update=Hinweis: Der BudgetMasterServer muss manuell von dir geupdated werden!
+info.text.start.after.update=Hinweis: Der BudgetMasterServer muss manuell von dir geupdated werden, sofern es sich um keinen lokalen Server handelt!
 info.tags=Es erscheinen Vorschl�ge basierend auf bereits verwendeten Tags sobald du zu tippen beginnst.\n\nEnter - F�gt den Inhalt des Eingabefelds als neuen Tag hinzu.\nPfeil nach unten - �ffnet die Vorschl�ge, wenn das Eingabefeld leer ist.
+info.title.shutdown=BudgetMaster beenden
+info.text.shutdown=M�chtest du BudgetMaster wirklich beenden?\nDies kann w�hrend der Ausf�hrung von Aufgaben zu unvorhersebaren Konsequenzen f�hren.
 
 # WARNING
 warning.enddate.before.startdate=Das Enddatum darf zeitlich nicht vor dem Startdatum liegen.
@@ -169,7 +182,7 @@ warning.empty.category.name=Das Feld f
 warning.empty.payment.name=Das Feld f�r den Namen darf nicht leer sein.
 warning.name.character.limit.reached.45=Der Name darf maximal 45 Zeichen lang sein.
 warning.name.character.limit.reached.150=Der Name darf maximal 150 Zeichen lang sein.
-warning.description.character.limit.reached.150=Die Notiz darf maximal 150 Zeichen lang sein.
+warning.description.character.limit.reached.200=Die Notiz darf maximal 200 Zeichen lang sein.
 warning.tag.character.limit.reached.45=Der Name eines Tags darf maximal 45 Zeichen lang sein.
 warning.payment.amount=Gib eine g�ltige Zahl f�r den Betrag ein.
 warning.empty.payment.date=Bitte w�hle ein Datum aus.
@@ -208,6 +221,8 @@ error.password.save=Beim Speichern des Passworts ist ein Fehler aufgetreten.
 error.updater.get.latest.version=Beim �berpr�fen auf Updates ist ein Fehler aufgetreten. Informationen zu neuen Versionen konnten nicht abgerufen werden. Versuche es sp�ter noch einmal.
 error.updater.download.latest.version=Beim Herunterladen des Updates ist ein Fehler aufgetreten.\n\n{0}
 error.open.browser=Beim �ffnen des Standardwebbrowsers ist ein Fehler aufgetreten.
+error.local.server.start=Beim Starten des BudgetMasterServers ist ein Fehler aufgetreten.\n\n{0}
+error.local.server.download=Beim Herunterladen des BudgetMasterServers ist ein Fehler aufgetreten.\n\n{0}
 
 # UI
 categorytab.button.category.new=\ Neue Kategorie
@@ -267,7 +282,8 @@ category.new.label.color=Farbe:
 category.new.button.save=Speichern
 
 payment.new.label.name=Name:
-payment.new.label.max.characters=(max. 150 Zeichen)
+payment.new.label.max.characters.name=(max. 150 Zeichen)
+payment.new.label.max.characters.description=(max. 200 Zeichen)
 payment.new.label.amount=Betrag:
 payment.new.label.category=Kategorie:
 payment.new.label.date=Datum:
@@ -277,7 +293,7 @@ payment.new.label.repeating=Wiederholung:
 payment.new.label.repeating.all=Alle
 payment.new.label.repeating.days=Tage
 payment.new.label.repeating.monthday=jeden Monat am:
-payment.new.label.enddate=Enddatum
+payment.new.label.enddate=Enddatum:
 payment.new.button.save=Speichern
 
 paymenttab.button.new.income=\ Neue Einnahme
@@ -294,6 +310,7 @@ reporttab.checkbox.inclue.categorybudgets=Verbrauch nach Kategorien hinzuf
 reporttab.button.generate.report=Bericht erzeugen
 
 settingstab.label.secret.client=Client Passwort:
+settingstab.label.status=Status:
 settingstab.label.url=Server URL:
 settingstab.label.secret.server=Server Passwort:
 settingstab.label.currency=W�hrung:
@@ -312,7 +329,9 @@ settingstab.button.updates.search=Suchen
 settingstab.button.updates.automatic=Automatisch suchen
 settingstab.label.updates.current.version=Installiert:
 settingstab.label.updates.latest.version=Verf�gbar:
-settings.tab.button.save=Speichern
+settingstab.button.save=Speichern
+settingstab.button.server.online=Online Server
+settingstab.button.server.local=Lokaler Server
 
 splashscreen.label.password=Passwort:
 
@@ -325,7 +344,7 @@ about=
 about.roadmap.link=Roadmap �ffnen
 about.version=Version:
 about.date=Datum:
-about.author=Author:
+about.author=Autor:
 about.roadmap=Roadmap:
 about.sourcecode=Quellcode:
 about.credits=Credits:
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 a796625baa65663bd8257e251732a05e62a98fe0..4157b60f9dac6646fcfd11697aba3b693336f15a 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
@@ -1,10 +1,10 @@
 # DEFAULT
 app.name=BudgetMaster
-version.code=12
-version.name=1.7.1
-version.date=07.11.17
+version.code=13
+version.name=1.8.0
+version.date=17.12.17
 author=Robert Goldmann
-credits=Flags by Freepik on https://www.flaticon.com\nFonts used: OpenSans
+credits=Flags by Freepik on https://www.flaticon.com\nFonts used: OpenSans\nLibraries used:\ngson 2.8.1\njoda-time 2.9.7\nitextpdf 5.0.6\nlaunch4j-maven-plugin 1.7.21\nspark-core 2.5.4\nslf4j 1.7.21\nmysql-connector 6.0.5\njunit 4.12\nsqlite-jdbc 3.21.0
 
 folder=Deadlocker/BudgetMaster
 roadmap.url=https://deadlocker.thecodelabs.de/roadmap/php/index.php?id=2
@@ -47,6 +47,10 @@ load.database.import=Please wait while the database is being imported...
 load.database.delete=Please wait while the database is being deleted...
 load.update=Please wait while the update is being downloaded...
 load.search=Please wait while payments are being searched...
+load.local.server=Please wait while the local server is being started...
+load.download.local.server=Please wait while the local server is being downloaded...
+load.local.server.connect=Connecting to local server...
+load.local.server.retry=Connecting to local server... (Retry {0}/{1})
 
 # MISC
 category.none=No Category
@@ -67,6 +71,13 @@ trusted.hosts.placeholder=e.g. localhost
 undefined=undefined
 tagfield.placeholder=Enter new Tag here
 shortcut.dev.console=F12
+local.server.status.ok=Server is running.
+local.server.status.not.started=Server couldn't be started.
+local.server.action.not.started=Start
+local.server.status.not.present=Server not found.
+local.server.action.not.present=Download
+local.server.status.incompatible=Server is incompatible.
+local.server.action.incompatible=Update
 
 # REPORT
 report.position=No.
@@ -153,10 +164,12 @@ info.text.update.available=An update is available.\nNew version: {0}\n\n
 info.text.update.available.show.changes=Show Changes (opens web browsers)
 info.text.update.available.show.changes.detailed=(detailed information on GitHub.com)
 info.text.update.available.now=Update Now
-info.title.start.after.update=Update successfull
+info.title.start.after.update=Update successful
 info.header.text.start.after.update=Successfully updated BudgetMaster to version {0}
-info.text.start.after.update=Note: You have to update the BudgetMasterServer manually!
+info.text.start.after.update=Note: You have to update the BudgetMasterServer manually, if it's no local server!
 info.tags=Suggestions based on already used tags will show up once you start typing.\n\nEnter - Appends the current input field content as a new tag.\nArrow Down - Opens the suggestions if the input field is empty.
+info.title.shutdown=Shutdown BudgetMaster
+info.text.shutdown=Do you really want to shutdown BudgetMaster? This could lead to unforeseen consequences during running tasks.
 
 # WARNING
 warning.enddate.before.startdate=The end date can not be earlier than the start date.
@@ -169,7 +182,7 @@ warning.empty.category.name=The field for the name can not be empty.
 warning.empty.payment.name=The field for the name can not be empty.
 warning.name.character.limit.reached.45=The name must not exceed 45 characters in length.
 warning.name.character.limit.reached.150=The name must not exceed 150 characters in length.
-warning.description.character.limit.reached.150=The description must not exceed 150 characters in length.
+warning.description.character.limit.reached.200=The description must not exceed 200 characters in length.
 warning.tag.character.limit.reached.45=A tag name must not exceed 45 characters in length.
 warning.payment.amount=Please enter a valid number in the amount field.
 warning.empty.payment.date=Please select a date.
@@ -208,6 +221,8 @@ error.password.save=An error occurred while saving the password.
 error.updater.get.latest.version=An error occurred while checking for updates. Information about latest versions could not be retrieved. Please try again later.
 error.updater.download.latest.version=An error occurred while downloading the update.\n\n{0}
 error.open.browser=An error occurred while opening the default web browser.
+error.local.server.start=An error occurred while starting the BudgetMasterServer.\n\n{0}
+error.local.server.download=An error occurred while downloading the BudgetMasterServer.\n\n{0}
 
 # UI
 categorytab.button.category.new=\ New Category
@@ -267,7 +282,8 @@ category.new.label.color=Color:
 category.new.button.save=Save
 
 payment.new.label.name=Name:
-payment.new.label.max.characters=(up to 150 characters)
+payment.new.label.max.characters.name=(up to 150 characters)
+payment.new.label.max.characters.description=(up to 200 characters)
 payment.new.label.amount=Amount:
 payment.new.label.category=Category:
 payment.new.label.date=Date:
@@ -277,7 +293,7 @@ payment.new.label.repeating=Repeating:
 payment.new.label.repeating.all=every
 payment.new.label.repeating.days=days
 payment.new.label.repeating.monthday=every month at:
-payment.new.label.enddate=Enddate
+payment.new.label.enddate=Enddate:
 payment.new.button.save=Save
 
 paymenttab.button.new.income=\ New Income
@@ -294,6 +310,7 @@ reporttab.checkbox.inclue.categorybudgets=Include consumption by categories
 reporttab.button.generate.report=Create Report
 
 settingstab.label.secret.client=Client Password:
+settingstab.label.status=Status:
 settingstab.label.url=Server URL:
 settingstab.label.secret.server=Server Password:
 settingstab.label.currency=Currency:
@@ -312,7 +329,9 @@ settingstab.button.updates.search=Search
 settingstab.button.updates.automatic=Automatic search
 settingstab.label.updates.current.version=Current Version:
 settingstab.label.updates.latest.version=Latest Version:
-settings.tab.button.save=Save
+settingstab.button.save=Save
+settingstab.button.server.online=Online Server
+settingstab.button.server.local=Local Server
 
 splashscreen.label.password=Password:
 
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml
index a387c946ed7d6510e40e3d1630f61220b53fd1b5..3035ad10f079602fa1eff6efa1a6dc966af80919 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/ChartTab.fxml
@@ -96,8 +96,8 @@
                                                 <Font name="System Bold" size="16.0" />
                                              </font>
                                           </Label>
-                                          <ComboBox fx:id="comboBoxStartMonth" prefHeight="25.0" prefWidth="110.0" />
-                                          <ComboBox fx:id="comboBoxStartYear" prefWidth="70.0" />
+                                          <ComboBox fx:id="comboBoxStartMonth" prefHeight="25.0" prefWidth="115.0" />
+                                          <ComboBox fx:id="comboBoxStartYear" prefWidth="100.0" HBox.hgrow="ALWAYS" />
                                        </children>
                                     </HBox>
                                     <HBox alignment="CENTER_LEFT" spacing="10.0">
@@ -107,8 +107,8 @@
                                                 <Font name="System Bold" size="16.0" />
                                              </font>
                                           </Label>
-                                          <ComboBox fx:id="comboBoxEndMonth" prefWidth="110.0" />
-                                          <ComboBox fx:id="comboBoxEndYear" prefWidth="70.0" />
+                                          <ComboBox fx:id="comboBoxEndMonth" prefWidth="115.0" />
+                                          <ComboBox fx:id="comboBoxEndYear" prefWidth="100.0" />
                                        </children>
                                     </HBox>
                                  </children>
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml
index 77b86bc0a1dc9b58c5bec77965f3fbcbdb01f77e..822227df871ae698269f5400859ade651801cb7c 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/Modal.fxml
@@ -6,7 +6,7 @@
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.text.Font?>
 
-<AnchorPane fx:id="anchorPaneMain" prefHeight="100.0" prefWidth="375.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.ModalController">
+<AnchorPane fx:id="anchorPaneMain" prefHeight="100.0" prefWidth="450.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.ModalController">
    <children>
       <HBox alignment="CENTER_LEFT" spacing="10.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0">
          <children>
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml
index caffbf8e6bc624e604153a6bbe9a71f18a02541c..fc79d7620bd15adae658ba5f490b8edb948caeb1 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/NewPaymentGUI.fxml
@@ -32,7 +32,7 @@
                                     <Font name="System Bold" size="14.0" />
                                  </font>
                               </Label>
-                              <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters">
+                              <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters.name">
                                  <font>
                                     <Font size="11.0" />
                                  </font>
@@ -95,7 +95,7 @@
                                     <Font name="System Bold" size="14.0" />
                                  </font>
                               </Label>
-                              <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters">
+                              <Label prefHeight="29.0" prefWidth="125.0" text="%payment.new.label.max.characters.description">
                                  <font>
                                     <Font size="11.0" />
                                  </font>
@@ -190,6 +190,7 @@
                                     <Font name="System Bold" size="14.0" />
                                  </font>
                               </Label>
+                              <CheckBox fx:id="checkBoxEndDate" mnemonicParsing="false" />
                               <DatePicker fx:id="datePickerEnddate" maxWidth="1.7976931348623157E308" prefHeight="29.0" HBox.hgrow="ALWAYS" />
                            </children>
                         </HBox>
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml
deleted file mode 100644
index c853b86e2034c064b80f6435fc5bd2381fd02d5d..0000000000000000000000000000000000000000
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml
+++ /dev/null
@@ -1,224 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Button?>
-<?import javafx.scene.control.CheckBox?>
-<?import javafx.scene.control.ComboBox?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.control.RadioButton?>
-<?import javafx.scene.control.ScrollPane?>
-<?import javafx.scene.control.TextArea?>
-<?import javafx.scene.control.TextField?>
-<?import javafx.scene.layout.AnchorPane?>
-<?import javafx.scene.layout.HBox?>
-<?import javafx.scene.layout.Region?>
-<?import javafx.scene.layout.VBox?>
-<?import javafx.scene.text.Font?>
-
-<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.SettingsController">
-   <children>
-      <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0">
-         <children>
-            <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS">
-               <content>
-                  <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0">
-                     <children>
-                        <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0">
-                           <children>
-                              <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                              </Label>
-                              <Label fx:id="labelURL" prefHeight="25.0" text="%settingstab.label.url">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets />
-                                 </VBox.margin>
-                              </Label>
-                              <Label fx:id="labelSecret" prefHeight="25.0" text="%settingstab.label.secret.server">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                              </Label>
-                              <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                              </Label>
-                              <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                              </Label>
-                              <Label fx:id="labelSecret111" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" minHeight="60.0" prefWidth="158.0" text="%settingstab.label.trusted.hosts" textAlignment="RIGHT" wrapText="true">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="-7.0" />
-                                 </VBox.margin>
-                              </Label>
-                              <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS">
-                                 <font>
-                                    <Font size="14.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="-20.0" />
-                                 </VBox.margin>
-                              </Label>
-                              <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="50.0" />
-                                 </VBox.margin>
-                              </Label>
-                              <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="5.0" />
-                                 </VBox.margin>
-                              </Label>
-                              <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="5.0" />
-                                 </VBox.margin>
-                              </Label>
-                              <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true">
-                                 <font>
-                                    <Font name="System Bold" size="16.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="15.0" />
-                                 </VBox.margin>
-                              </Label>
-                              <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" />
-                           </children>
-                           <HBox.margin>
-                              <Insets right="25.0" />
-                           </HBox.margin>
-                        </VBox>
-                        <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS">
-                           <children>
-                              <TextField fx:id="textFieldClientSecret" />
-                              <TextField fx:id="textFieldURL" />
-                              <TextField fx:id="textFieldSecret" />
-                              <TextField fx:id="textFieldCurrency" />
-                              <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0">
-                                 <children>
-                                    <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated">
-                                       <font>
-                                          <Font size="14.0" />
-                                       </font>
-                                       <HBox.margin>
-                                          <Insets />
-                                       </HBox.margin>
-                                    </RadioButton>
-                                    <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS">
-                                       <font>
-                                          <Font size="14.0" />
-                                       </font>
-                                    </RadioButton>
-                                 </children>
-                              </HBox>
-                              <TextArea fx:id="textAreaTrustedHosts" maxHeight="122.0" minHeight="122.0" prefHeight="122.0" prefWidth="539.0">
-                                 <VBox.margin>
-                                    <Insets />
-                                 </VBox.margin>
-                              </TextArea>
-                              <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" />
-                              <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0">
-                                 <children>
-                                    <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export">
-                                       <font>
-                                          <Font name="System Bold" size="14.0" />
-                                       </font>
-                                    </Button>
-                                    <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import">
-                                       <font>
-                                          <Font name="System Bold" size="14.0" />
-                                       </font>
-                                    </Button>
-                                    <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete">
-                                       <font>
-                                          <Font name="System Bold" size="14.0" />
-                                       </font>
-                                    </Button>
-                                 </children>
-                                 <VBox.margin>
-                                    <Insets />
-                                 </VBox.margin>
-                              </HBox>
-                              <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0">
-                                 <children>
-                                    <VBox minWidth="210.0" spacing="10.0" HBox.hgrow="ALWAYS">
-                                       <children>
-                                          <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" />
-                                          <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic">
-                                             <font>
-                                                <Font size="13.0" />
-                                             </font>
-                                          </CheckBox>
-                                       </children>
-                                    </VBox>
-                                    <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS">
-                                       <children>
-                                          <Label fx:id="labelSecret11111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true">
-                                             <font>
-                                                <Font name="System Bold" size="13.0" />
-                                             </font>
-                                          </Label>
-                                          <Label fx:id="labelSecret111111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true">
-                                             <font>
-                                                <Font name="System Bold" size="13.0" />
-                                             </font>
-                                             <VBox.margin>
-                                                <Insets />
-                                             </VBox.margin>
-                                          </Label>
-                                       </children>
-                                    </VBox>
-                                    <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS">
-                                       <children>
-                                          <Label fx:id="labelCurrentVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true">
-                                             <font>
-                                                <Font size="13.0" />
-                                             </font>
-                                          </Label>
-                                          <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true">
-                                             <font>
-                                                <Font size="13.0" />
-                                             </font>
-                                          </Label>
-                                       </children>
-                                    </VBox>
-                                 </children>
-                              </HBox>
-                              <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settings.tab.button.save">
-                                 <font>
-                                    <Font name="System Bold" size="14.0" />
-                                 </font>
-                                 <VBox.margin>
-                                    <Insets top="15.0" />
-                                 </VBox.margin>
-                              </Button>
-                              <Region prefWidth="158.0" VBox.vgrow="ALWAYS" />
-                           </children>
-                        </VBox>
-                     </children>
-                  </HBox>
-               </content>
-            </ScrollPane>
-         </children>
-      </VBox>
-   </children>
-</AnchorPane>
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..effda26ce6112e3705520d9762a2544708a2221b
--- /dev/null
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.CheckBox?>
+<?import javafx.scene.control.ComboBox?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.RadioButton?>
+<?import javafx.scene.control.ScrollPane?>
+<?import javafx.scene.control.TextField?>
+<?import javafx.scene.control.ToggleButton?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.Region?>
+<?import javafx.scene.layout.VBox?>
+<?import javafx.scene.text.Font?>
+
+<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.settings.LocalServerSettingsController">
+   <children>
+      <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0">
+         <children>
+            <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS">
+               <content>
+                  <VBox spacing="14.0">
+                     <children>
+                        <HBox alignment="TOP_CENTER">
+                           <children>
+                              <ToggleButton fx:id="toggleButtonOnline" mnemonicParsing="false" text="%settingstab.button.server.online" />
+                              <ToggleButton fx:id="toggleButtonLocal" mnemonicParsing="false" text="%settingstab.button.server.local" />
+                           </children>
+                        </HBox>
+                        <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0">
+                           <children>
+                              <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0">
+                                 <children>
+                                    <Label fx:id="labelStatus" prefHeight="25.0" text="%settingstab.label.status">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="5.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="5.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="15.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" />
+                                 </children>
+                                 <HBox.margin>
+                                    <Insets right="25.0" />
+                                 </HBox.margin>
+                                 <padding>
+                                    <Insets top="3.0" />
+                                 </padding>
+                              </VBox>
+                              <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS">
+                                 <children>
+                                    <HBox alignment="CENTER_LEFT" spacing="10.0">
+                                       <children>
+                                          <Label fx:id="labelLocalServerStatus" prefHeight="25.0">
+                                             <font>
+                                                <Font size="14.0" />
+                                             </font>
+                                          </Label>
+                                          <Button fx:id="buttonLocalServerAction" mnemonicParsing="false">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                       </children>
+                                    </HBox>
+                                    <TextField fx:id="textFieldClientSecret" />
+                                    <TextField fx:id="textFieldCurrency" />
+                                    <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0">
+                                       <children>
+                                          <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated">
+                                             <font>
+                                                <Font size="14.0" />
+                                             </font>
+                                             <HBox.margin>
+                                                <Insets />
+                                             </HBox.margin>
+                                          </RadioButton>
+                                          <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS">
+                                             <font>
+                                                <Font size="14.0" />
+                                             </font>
+                                          </RadioButton>
+                                       </children>
+                                    </HBox>
+                                    <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" />
+                                    <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0">
+                                       <children>
+                                          <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                          <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                          <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                       </children>
+                                       <VBox.margin>
+                                          <Insets />
+                                       </VBox.margin>
+                                    </HBox>
+                                    <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0">
+                                       <children>
+                                          <VBox spacing="10.0" HBox.hgrow="ALWAYS">
+                                             <children>
+                                                <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" />
+                                                <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic">
+                                                   <font>
+                                                      <Font size="13.0" />
+                                                   </font>
+                                                </CheckBox>
+                                             </children>
+                                          </VBox>
+                                          <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS">
+                                             <children>
+                                                <Label contentDisplay="CENTER" minHeight="30.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font name="System Bold" size="13.0" />
+                                                   </font>
+                                                </Label>
+                                                <Label alignment="TOP_LEFT" contentDisplay="CENTER" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font name="System Bold" size="13.0" />
+                                                   </font>
+                                                   <VBox.margin>
+                                                      <Insets />
+                                                   </VBox.margin>
+                                                </Label>
+                                             </children>
+                                          </VBox>
+                                          <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS">
+                                             <children>
+                                                <Label fx:id="labelCurrentVersion" contentDisplay="CENTER" minHeight="30.0" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font size="13.0" />
+                                                   </font>
+                                                </Label>
+                                                <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font size="13.0" />
+                                                   </font>
+                                                </Label>
+                                             </children>
+                                          </VBox>
+                                       </children>
+                                    </HBox>
+                                    <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settingstab.button.save">
+                                       <font>
+                                          <Font name="System Bold" size="14.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="15.0" />
+                                       </VBox.margin>
+                                    </Button>
+                                    <Region prefWidth="158.0" VBox.vgrow="ALWAYS" />
+                                 </children>
+                              </VBox>
+                           </children>
+                        </HBox>
+                     </children>
+                  </VBox>
+               </content>
+            </ScrollPane>
+         </children>
+      </VBox>
+   </children>
+</AnchorPane>
diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..69d8a1e129035349e20592a74ab7b44cb55cebdc
--- /dev/null
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.CheckBox?>
+<?import javafx.scene.control.ComboBox?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.RadioButton?>
+<?import javafx.scene.control.ScrollPane?>
+<?import javafx.scene.control.TextArea?>
+<?import javafx.scene.control.TextField?>
+<?import javafx.scene.control.ToggleButton?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.Region?>
+<?import javafx.scene.layout.VBox?>
+<?import javafx.scene.text.Font?>
+
+<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.settings.OnlineServerSettingsController">
+   <children>
+      <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0">
+         <children>
+            <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS">
+               <content>
+                  <VBox spacing="14.0">
+                     <children>
+                        <HBox alignment="TOP_CENTER">
+                           <children>
+                              <ToggleButton fx:id="toggleButtonOnline" mnemonicParsing="false" text="%settingstab.button.server.online" />
+                              <ToggleButton fx:id="toggleButtonLocal" mnemonicParsing="false" text="%settingstab.button.server.local" />
+                           </children>
+                        </HBox>
+                        <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0">
+                           <children>
+                              <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0">
+                                 <children>
+                                    <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelURL" prefHeight="25.0" text="%settingstab.label.url">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret" prefHeight="25.0" text="%settingstab.label.secret.server">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                    </Label>
+                                    <Label fx:id="labelSecret111" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" minHeight="60.0" prefWidth="158.0" text="%settingstab.label.trusted.hosts" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="-7.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS">
+                                       <font>
+                                          <Font size="14.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="-20.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="50.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="5.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="5.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true">
+                                       <font>
+                                          <Font name="System Bold" size="16.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="15.0" />
+                                       </VBox.margin>
+                                    </Label>
+                                    <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" />
+                                 </children>
+                                 <HBox.margin>
+                                    <Insets right="25.0" />
+                                 </HBox.margin>
+                              </VBox>
+                              <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS">
+                                 <children>
+                                    <TextField fx:id="textFieldClientSecret" />
+                                    <TextField fx:id="textFieldURL" />
+                                    <TextField fx:id="textFieldSecret" />
+                                    <TextField fx:id="textFieldCurrency" />
+                                    <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0">
+                                       <children>
+                                          <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated">
+                                             <font>
+                                                <Font size="14.0" />
+                                             </font>
+                                             <HBox.margin>
+                                                <Insets />
+                                             </HBox.margin>
+                                          </RadioButton>
+                                          <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS">
+                                             <font>
+                                                <Font size="14.0" />
+                                             </font>
+                                          </RadioButton>
+                                       </children>
+                                    </HBox>
+                                    <TextArea fx:id="textAreaTrustedHosts" maxHeight="122.0" minHeight="122.0" prefHeight="122.0" prefWidth="539.0">
+                                       <VBox.margin>
+                                          <Insets />
+                                       </VBox.margin>
+                                    </TextArea>
+                                    <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" />
+                                    <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0">
+                                       <children>
+                                          <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                          <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                          <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete">
+                                             <font>
+                                                <Font name="System Bold" size="14.0" />
+                                             </font>
+                                          </Button>
+                                       </children>
+                                       <VBox.margin>
+                                          <Insets />
+                                       </VBox.margin>
+                                    </HBox>
+                                    <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0">
+                                       <children>
+                                          <VBox spacing="10.0" HBox.hgrow="ALWAYS">
+                                             <children>
+                                                <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" />
+                                                <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic">
+                                                   <font>
+                                                      <Font size="13.0" />
+                                                   </font>
+                                                </CheckBox>
+                                             </children>
+                                          </VBox>
+                                          <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS">
+                                             <children>
+                                                <Label contentDisplay="CENTER" minHeight="30.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font name="System Bold" size="13.0" />
+                                                   </font>
+                                                </Label>
+                                                <Label alignment="TOP_LEFT" contentDisplay="CENTER" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font name="System Bold" size="13.0" />
+                                                   </font>
+                                                   <VBox.margin>
+                                                      <Insets />
+                                                   </VBox.margin>
+                                                </Label>
+                                             </children>
+                                          </VBox>
+                                          <VBox prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS">
+                                             <children>
+                                                <Label fx:id="labelCurrentVersion" contentDisplay="CENTER" minHeight="30.0" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font size="13.0" />
+                                                   </font>
+                                                </Label>
+                                                <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" textAlignment="CENTER" wrapText="true">
+                                                   <font>
+                                                      <Font size="13.0" />
+                                                   </font>
+                                                </Label>
+                                             </children>
+                                          </VBox>
+                                       </children>
+                                    </HBox>
+                                    <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settingstab.button.save">
+                                       <font>
+                                          <Font name="System Bold" size="14.0" />
+                                       </font>
+                                       <VBox.margin>
+                                          <Insets top="15.0" />
+                                       </VBox.margin>
+                                    </Button>
+                                    <Region prefWidth="158.0" VBox.vgrow="ALWAYS" />
+                                 </children>
+                              </VBox>
+                           </children>
+                        </HBox>
+                     </children>
+                  </VBox>
+               </content>
+            </ScrollPane>
+         </children>
+      </VBox>
+   </children>
+</AnchorPane>
diff --git a/BudgetMasterCore/pom.xml b/BudgetMasterCore/pom.xml
index 378e55ce7636d2d06a38be2dacd30be6a3d3dae1..73e1ad26d5b81d6e1d7e7a5b67b9a7826db301e6 100644
--- a/BudgetMasterCore/pom.xml
+++ b/BudgetMasterCore/pom.xml
@@ -37,7 +37,7 @@
 		<dependency>
 			<groupId>de.deadlocker8</groupId>
 			<artifactId>tools</artifactId>
-			<version>1.0</version>
+			<version>1.0.0</version>
 			<scope>system</scope>
 			<systemPath>${basedir}/../lib/Tools.jar</systemPath>
 		</dependency>
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java
new file mode 100644
index 0000000000000000000000000000000000000000..9db45810d8bf6e7bbb5569e4b0eea0f87383d701
--- /dev/null
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java
@@ -0,0 +1,6 @@
+package de.deadlocker8.budgetmaster.logic;
+
+public enum ServerType
+{
+	ONLINE, LOCAL;
+}
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java
index a0dbe9f2ae1bfa96612bde1769ea1b7d2f492e62..dd115b4e200e52e761e7a6c934a6a3324f582fbd 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java
@@ -13,11 +13,14 @@ public class Settings
 	 * --> 1
 	 * initial
 	 * 
+	 * --> 2
+	 * added field for "serverType"
+	 * 
 	 */	
 	
-	@SuppressWarnings("unused")
 	private final String TYPE = SaveFileType.BUDGETMASTER_SETTINGS.toString();
-	private final int VERSION = 1;	
+	private final int VERSION = 2;
+	private ServerType serverType;
 	private String clientSecret;
 	private String url;
 	private String secret;
@@ -30,7 +33,17 @@ public class Settings
 	public Settings()
 	{
 		
-	}	
+	}
+
+	public ServerType getServerType()
+	{
+		return serverType;
+	}
+
+	public void setServerType(ServerType serverType)
+	{
+		this.serverType = serverType;
+	}
 
 	public String getClientSecret()
 	{
@@ -132,7 +145,7 @@ public class Settings
 	@Override
 	public String toString()
 	{
-		return "Settings [TYPE=" + TYPE + ", VERSION=" + VERSION + ", clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language + ", autoUpdateCheckEnabled="
-				+ autoUpdateCheckEnabled + "]";
+		return "Settings [TYPE=" + TYPE + ", VERSION=" + VERSION + ", serverType=" + serverType + ", clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language
+				+ ", autoUpdateCheckEnabled=" + autoUpdateCheckEnabled + "]";
 	}
 }
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerException.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerException.java
new file mode 100644
index 0000000000000000000000000000000000000000..13c3778cb70c92e56936aa3a834a75ea0920b0a7
--- /dev/null
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerException.java
@@ -0,0 +1,11 @@
+package de.deadlocker8.budgetmaster.logic.localserver;
+
+public class LocalServerException extends Exception
+{
+	private static final long serialVersionUID = 3925464782915168752L;
+
+	public LocalServerException(String message)
+	{
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerHandler.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e438320b1f83747feeaf48f4650a6eea7b28b75
--- /dev/null
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerHandler.java
@@ -0,0 +1,144 @@
+package de.deadlocker8.budgetmaster.logic.localserver;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.Settings;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import logger.Logger;
+import tools.HashUtils;
+import tools.Localization;
+import tools.PathUtils;
+
+public class LocalServerHandler
+{
+	private static final String BUILD_FOLDER = "https://github.com/deadlocker8/BudgetMaster/raw/{}/build/";
+	
+	public LocalServerHandler()
+	{
+		
+	}
+	
+	public boolean isServerPresent()
+	{
+		File file = new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMasterServer.jar");
+		return file.exists();
+	}
+	
+	public boolean isServerRunning()
+	{
+		try
+		{
+			Settings settings = new Settings();
+			settings.setUrl("https://localhost:9000");
+			settings.setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT));
+			ArrayList<String> trustedHosts = new ArrayList<>();
+			trustedHosts.add("localhost");
+			settings.setTrustedHosts(trustedHosts);		
+			ServerConnection connection = new ServerConnection(settings);
+			connection.getServerInfo();
+			
+			return true;
+		}
+		catch(Exception e)
+		{
+			Logger.debug(e);
+			return false;
+		}
+	}
+	
+	public void shutdownServer() throws Exception
+	{
+		Settings settings = new Settings();
+		settings.setUrl("https://localhost:9000");
+		settings.setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT));
+		ArrayList<String> trustedHosts = new ArrayList<>();
+		trustedHosts.add("localhost");
+		settings.setTrustedHosts(trustedHosts);		
+		ServerConnection connection = new ServerConnection(settings);
+		connection.shutdownServer();
+	}
+	
+	public void createServerSettingsIfNotExists() throws FileNotFoundException
+	{
+		File settingsFile = new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/settings.json");
+		if(settingsFile.exists())
+		{
+			return;
+		}
+		Logger.debug("Creating settings file for local server...");
+		
+		String databasePath = PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMaster.db";
+		String settings = "{\"databaseType\": \"sqlite\"," + 
+							"\"databaseUrl\": \"" + databasePath.replace("\\", "/") + "\"," + 
+							"\"databaseName\": \"budgetmaster\"," + 
+							"\"databaseUsername\": \"root\"," + 
+							"\"databasePassword\": \"\"," + 
+							"\"serverPort\": 9000," + 
+							"\"serverSecret\": \"BudgetMaster\"," + 
+							"\"keystorePath\": \"default\"," + 
+							"\"keystorePassword\": \"BudgetMaster\"}";
+		PrintWriter writer = new PrintWriter(settingsFile);
+		writer.println(settings);
+		writer.close();
+	}
+	
+	public void downloadServer(String versionName) throws Exception
+	{
+		Logger.debug("Downloading BudgetMasterServer from " + BUILD_FOLDER.replace("{}", "v" + versionName));
+		PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer"));
+		
+		//download into temp directory and file
+		Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMasterServer.jar");
+		download(BUILD_FOLDER.replace("{}", "v" + "1.7.0") + "BudgetMasterServer.jar", target);			
+		Logger.debug("Successfully downloaded BudgetMasterServer " + versionName);
+	}
+	
+	private void download(String url, Path target) throws IOException
+	{
+		URL website = new URL(url);
+		InputStream in = website.openStream();
+		Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
+	}
+	
+	public Process startServer() throws IOException
+	{
+		ProcessBuilder pb = new ProcessBuilder("java", "-jar", Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/localServer/BudgetMasterServer.jar").toString()); 				
+		return pb.start();		
+	}
+	
+	public LocalServerStatus getServerStatus()
+	{
+		LocalServerHandler serverHandler = new LocalServerHandler();
+		if(serverHandler.isServerPresent())
+		{
+			Logger.debug("Local server found");
+			if(serverHandler.isServerRunning())
+			{
+				Logger.debug("Local server is running");
+				return LocalServerStatus.ACTIVE;
+			}
+			else
+			{
+				Logger.debug("Local server is NOT running");
+				return LocalServerStatus.INACTIVE;
+			}
+		}
+		else
+		{
+			Logger.debug("Local server NOT found");
+			return LocalServerStatus.MISSING;
+		}		
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerStatus.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f36dcd26e0a4cb093f2783293089044c82dd86f
--- /dev/null
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/localserver/LocalServerStatus.java
@@ -0,0 +1,6 @@
+package de.deadlocker8.budgetmaster.logic.localserver;
+
+public enum LocalServerStatus
+{
+	ACTIVE, INACTIVE, MISSING;
+}
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
index 780c74199c5d76709ea2667640cf462e138574b5..73166530c9db3bce34c556496334264efbbe85d2 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
@@ -87,6 +87,7 @@ public class ReportGenerator
 				PdfPCell cell = new PdfPCell(new Phrase(column.getName(), font));
 				cell.setBackgroundColor(GrayColor.LIGHT_GRAY);
 				cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+				cell.setVerticalAlignment(Element.ALIGN_MIDDLE);				
 				table.addCell(cell);
 			}
 
@@ -114,6 +115,7 @@ public class ReportGenerator
 					PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font));
 					cell.setBackgroundColor(new BaseColor(Color.WHITE));
 					cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+					cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
 					table.addCell(cell);
 				}
 			}
@@ -141,6 +143,7 @@ public class ReportGenerator
 			cellTotal.setBackgroundColor(new BaseColor(Color.WHITE));
 			cellTotal.setColspan(numberOfColumns);
 			cellTotal.setHorizontalAlignment(Element.ALIGN_RIGHT);
+			cellTotal.setVerticalAlignment(Element.ALIGN_MIDDLE);
 			table.addCell(cellTotal);
 
 			return table;
@@ -245,11 +248,13 @@ public class ReportGenerator
 			PdfPCell cellName = new PdfPCell(new Phrase(budget.getCategory().getName(), font));
 			cellName.setBackgroundColor(new BaseColor(Color.WHITE));
 			cellName.setHorizontalAlignment(Element.ALIGN_CENTER);
+			cellName.setVerticalAlignment(Element.ALIGN_MIDDLE);
 			table.addCell(cellName);
 			
 			PdfPCell cellAmount = new PdfPCell(new Phrase(Helpers.getCurrencyString(budget.getBudget() / 100.0, currency), font));
 			cellAmount.setBackgroundColor(new BaseColor(Color.WHITE));
 			cellAmount.setHorizontalAlignment(Element.ALIGN_CENTER);
+			cellAmount.setVerticalAlignment(Element.ALIGN_MIDDLE);
 			table.addCell(cellAmount);
 		}
 		
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
index cd04ca5d70863a407fd6ca139a189ea4eb86570d..92ea3b1cfd035e865888bd082df97b96900eace6 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
@@ -3,9 +3,11 @@ package de.deadlocker8.budgetmaster.logic.serverconnection;
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.lang.reflect.Type;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 
@@ -492,7 +494,7 @@ public class ServerConnection
 		httpsCon.setRequestProperty("Accept", "application/json");		
 		httpsCon.setDoInput(true);
 		httpsCon.setDoOutput(true);
-		PrintWriter writer = new PrintWriter(httpsCon.getOutputStream());
+		PrintWriter writer = new PrintWriter(new OutputStreamWriter(httpsCon.getOutputStream(), StandardCharsets.UTF_8));
 		writer.write(databaseJSON);
 		writer.flush();
 		writer.close();
@@ -614,6 +616,24 @@ public class ServerConnection
 		else
 		{
 			throw new ServerConnectionException(String.valueOf(httpsCon.getResponseCode()));
-		}		
+		}
+	}
+	
+	public void shutdownServer() throws Exception
+	{
+		URL url = new URL(settings.getUrl() + "/shutdown?secret=" + Helpers.getURLEncodedString(settings.getSecret()));
+		HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection();
+		httpsCon.setRequestMethod("GET");
+		httpsCon.setDoInput(true);
+		if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK)
+		{
+			InputStream stream = httpsCon.getInputStream();
+			BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+			reader.close();
+		}
+		else
+		{
+			throw new ServerConnectionException(String.valueOf(httpsCon.getResponseCode()));
+		}
 	}
 }
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java
new file mode 100644
index 0000000000000000000000000000000000000000..12638c224f8de8328e058b3024f7849c46b726c9
--- /dev/null
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java
@@ -0,0 +1,67 @@
+package de.deadlocker8.budgetmaster.logic.tag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import de.deadlocker8.budgetmaster.logic.payment.Payment;
+import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
+
+public class TagCache
+{
+	private HashMap<Integer, ArrayList<Tag>> normalPaymentTagCache;
+	private HashMap<Integer, ArrayList<Tag>> repeatingPaymentTagCache;
+	
+	public TagCache()
+	{
+		clear();
+	}
+	
+	public void clear()
+	{
+		normalPaymentTagCache = new HashMap<>();
+		repeatingPaymentTagCache = new HashMap<>();
+	}
+	
+	public void addTags(Payment payment, ArrayList<Tag> tags)
+	{
+		if(payment instanceof RepeatingPaymentEntry)
+		{
+			repeatingPaymentTagCache.put(((RepeatingPaymentEntry)payment).getRepeatingPaymentID(), tags);
+		}
+		else
+		{
+			normalPaymentTagCache.put(payment.getID(), tags);
+		}
+	}
+	
+	public ArrayList<Tag> getTags(Payment payment)
+	{
+		if(payment instanceof RepeatingPaymentEntry)
+		{
+			RepeatingPaymentEntry repeatingPayment = (RepeatingPaymentEntry)payment;
+			if(repeatingPaymentTagCache.containsKey(repeatingPayment.getRepeatingPaymentID()))
+			{
+				return repeatingPaymentTagCache.get(repeatingPayment.getRepeatingPaymentID());
+			}
+		}
+		else
+		{
+			if(normalPaymentTagCache.containsKey(payment.getID()))
+			{
+				return normalPaymentTagCache.get(payment.getID());
+			}			
+		}
+		
+		return null;
+	}
+
+	public HashMap<Integer, ArrayList<Tag>> getNormalPaymentTagCache()
+	{
+		return normalPaymentTagCache;
+	}
+
+	public HashMap<Integer, ArrayList<Tag>> getRepeatingPaymentTagCache()
+	{
+		return repeatingPaymentTagCache;
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java
index d4f0f17311eadfa9020c542847211701d7fcb40b..a6fb9dfe3b538dffc630e4a5d30fcd5fe1833686 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java
@@ -11,15 +11,22 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection;
 public class TagHandler
 {
 	private Settings settings;
+	private TagCache tagCache;
 	
 	public TagHandler(Settings settings)
 	{
 		this.settings = settings;
+		this.tagCache = new TagCache();
 	}
 
 	public ArrayList<Tag> getTags(Payment payment) throws Exception
 	{
 		ArrayList<Tag> tags = new ArrayList<>();
+		ArrayList<Tag> cachedTags = tagCache.getTags(payment);
+		if(cachedTags != null)
+		{
+			return cachedTags;
+		}
 		
 		ServerTagConnection connection = new ServerTagConnection(settings);
 		
@@ -32,6 +39,8 @@ public class TagHandler
 			tags.addAll(connection.getAllTagsForRepeatingPayment(((RepeatingPaymentEntry)payment).getRepeatingPaymentID()));
 		}
 		
+		tagCache.addTags(payment, tags);
+		
 		return tags;
 	}
 	
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java
index 7d394d24822956a1d04fd86912a643e6419d25c0..1403601fb0f381e4136bb805b2ca01509c52da98 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java
@@ -11,6 +11,7 @@ public class Colors
     public static final Color BACKGROUND = Color.web("#F4F4F4");
     public static final Color BACKGROUND_MAIN = Color.web("#DDDDDD");
     public static final Color BACKGROUND_BUTTON_BLUE = Color.web("#2E79B9");
+    public static final Color BACKGROUND_BUTTON_DARK_BLUE = Color.web("#246091");
     public static final Color BACKGROUND_BUTTON_RED = Color.web("#FF5047");
     public static final Color BACKGROUND_NOTIFICATION = Color.web("#323232");
     public static final Color BACKGROUND_REPORT_TABLE_HEADER_DISABLED = Color.SALMON;
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
index e5fc1cdd230014cb5b65fb3debe0c2a26a5e3492..b6f809e40b2bb71e03a897ecad488896064ceb98 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
@@ -102,31 +102,5 @@ public class FileHelper
 		Writer writer = Files.newBufferedWriter(Paths.get(file.getAbsolutePath()), Charset.forName("UTF-8"));
 		writer.write(databaseJSON);
 		writer.close();
-	}
-
-	public static Object loadObjectFromJSON(String fileName, Object objectype)
-	{
-		try
-		{
-			Gson gson = new Gson();
-			Reader reader = Files.newBufferedReader(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8"));
-			Object preferences = gson.fromJson(reader, objectype.getClass());
-			reader.close();
-			return preferences;
-		}
-		catch(IOException e)
-		{
-			return null;
-		}
-	}
-
-	public static void saveObjectToJSON(String fileName, Object objectToSave) throws IOException
-	{
-		Gson gson = new Gson();
-		String jsonString = gson.toJson(objectToSave);
-		PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER)));
-		Writer writer = Files.newBufferedWriter(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8"));
-		writer.write(jsonString);
-		writer.close();
-	}
+	}	
 }
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java
index 9f031cf910a597139a59065ca9a8956a98b938f2..6bd8a0a6c8f9cbd371ff0bf5b893c9c28fdd0e8c 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Helpers.java
@@ -7,8 +7,6 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 
-import fontAwesome.FontIcon;
-import fontAwesome.FontIconType;
 import javafx.scene.paint.Color;
 import tools.Localization;
 
@@ -98,16 +96,7 @@ public class Helpers
         colors.add(Colors.CATEGORIES_DARK_GREEN);    
         
         return colors;
-	}
-	
-	public static FontIcon getFontIcon(FontIconType type, int size, Color color)
-	{
-	    FontIcon icon = new FontIcon(type);
-	    icon.setSize(size);
-	    icon.setColor(color);
-	    
-	    return icon;
-	}
+	}	
 	
 	/**
 	 * Replaces line breaks and tabs with spaces
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java
index ebbd78bc29c9c42ba37fcc655f86c5bb7bad19fd..f972c712be2f5f9f468811e9f1fa4a1a3bdf68c5 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Strings.java
@@ -49,6 +49,11 @@ public class Strings
     public static final String LOAD_DATABASE_DELETE = "load.database.delete";
     public static final String LOAD_UPDATE = "load.update";
     public static final String LOAD_SEARCH = "load.search";
+    public static final String LOAD_LOCAL_SERVER = "load.local.server";
+    public static final String LOAD_DOWNLOAD_LOCAL_SERVER = "load.download.local.server";
+    public static final String LOAD_LOCAL_SERVER_CONNECT = "load.local.server.connect";
+    public static final String LOAD_LOCAL_SERVER_RETRY = "load.local.server.retry";
+    
     
     //MISC
     public static final String CATEGORY_NONE = "category.none";
@@ -70,6 +75,13 @@ public class Strings
     public static final String UNDEFINED = "undefined";
     public static final String TAGFIELD_PLACEHOLDER = "tagfield.placeholder";
     public static final String SHORTCUT_DEV_CONSOLE = "shortcut.dev.console";
+    public static final String LOCAL_SERVER_STATUS_OK = "local.server.status.ok";
+    public static final String LOCAL_SERVER_STATUS_NOT_STARTED = "local.server.status.not.started";
+    public static final String LOCAL_SERVER_ACTION_NOT_STARTED = "local.server.action.not.started";
+    public static final String LOCAL_SERVER_STATUS_NOT_PRESENT = "local.server.status.not.present";
+    public static final String LOCAL_SERVER_ACTION_NOT_PRESENT = "local.server.action.not.present";
+    public static final String LOCAL_SERVER_STATUS_INCOMPATIBLE = "local.server.status.incompatible";
+    public static final String LOCAL_SERVER_ACTION_INCOMPATIBLE = "local.server.action.incompatible";
     
     //REPORT
     public static final String REPORT_POSITION = "report.position";
@@ -160,6 +172,8 @@ public class Strings
     public static final String INFO_HEADER_TEXT_START_AFTER_UPDATE = "info.header.text.start.after.update";
     public static final String INFO_TEXT_START_AFTER_UPDATE = "info.text.start.after.update";
     public static final String INFO_TAGS = "info.tags";
+    public static final String INFO_TITLE_SHUTDOWN = "info.title.shutdown";
+    public static final String INFO_TEXT_SHUTDOWN = "info.text.shutdown";
         
     //WARNING
     public static final String WARNING_ENDDATE_BEFORE_STARTDATE = "warning.enddate.before.startdate";
@@ -177,7 +191,7 @@ public class Strings
     public static final String WARNING_PAYMENT_AMOUNT = "warning.payment.amount";
     public static final String WARNING_EMPTY_PAYMENT_DATE = "warning.empty.payment.date";
     public static final String WARNING_PAYMENT_REPEATING = "warning.payment.repeating";    
-    public static final String WARNING_EMPTY_SECRET_CLIENT = " warning.empty.secret.client";
+    public static final String WARNING_EMPTY_SECRET_CLIENT = "warning.empty.secret.client";
     public static final String WARNING_EMPTY_URL = "warning.empty.url";
     public static final String WARNING_EMPTY_SECRET_SERVER = "warning.empty.secret.server";
     public static final String WARNING_EMPTY_CURRENCY = "warning.empty.currency";
@@ -211,6 +225,8 @@ public class Strings
     public static final String ERROR_UPDATER_GET_LATEST_VERSION = "error.updater.get.latest.version";
     public static final String ERROR_UPDATER_DOWNLOAD_LATEST_VERSION = "error.updater.download.latest.version";
     public static final String ERROR_OPEN_BROWSER = "error.open.browser";
+    public static final String ERROR_LOCAL_SERVER_START = "error.local.server.start";
+    public static final String ERROR_LOCAL_SERVER_DOWNLOAD = "error.local.server.download";
     
     //ABOUT
     public static final String ABOUT = "about";
diff --git a/BudgetMasterServer/pom.xml b/BudgetMasterServer/pom.xml
index 48d780210f0be7d9ce5c6fd5e50d13203ff66f2a..b3a9bffdae599cd06b11cba02255e73b622bf952 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.1</version>
+	<version>1.8.0</version>
 	<name>BudgetMasterServer</name>
 	<build>
 		<plugins>
@@ -40,7 +40,7 @@
 						</goals>
 					</execution>
 				</executions>
-			</plugin>			
+			</plugin>
 		</plugins>
 	</build>
 
@@ -73,7 +73,7 @@
 		<dependency>
 			<groupId>de.deadlocker8</groupId>
 			<artifactId>tools</artifactId>
-			<version>0.0.1-SNAPSHOT</version>			
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>de.deadlocker8</groupId>
@@ -86,5 +86,10 @@
 			<version>4.12</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.xerial</groupId>
+			<artifactId>sqlite-jdbc</artifactId>
+			<version>3.21.0</version>
+		</dependency>
 	</dependencies>
 </project>
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/AdvancedRoute.java
new file mode 100644
index 0000000000000000000000000000000000000000..898188ab93f524f557a02a756856f7d5007f7092
--- /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/Settings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java
index 821531725dcb7c8f81ddbd9061dd996d052f135e..fe2227c3fe6bd06b27b41d149dd45cee50d04ffc 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Settings.java
@@ -2,6 +2,7 @@ package de.deadlocker8.budgetmasterserver.logic;
 
 public class Settings
 {
+	private String databaseType;
 	private String databaseUrl;
 	private String databaseName;
 	private String databaseUsername;
@@ -16,6 +17,16 @@ public class Settings
 
 	}
 
+	public String getDatabaseType()
+	{
+		return databaseType;
+	}
+
+	public void setDatabaseType(String databaseType)
+	{
+		this.databaseType = databaseType;
+	}
+
 	public String getDatabaseUrl()
 	{
 		return databaseUrl;
@@ -99,8 +110,25 @@ public class Settings
 	@Override
 	public String toString()
 	{
-		return "Settings [databaseUrl=" + databaseUrl + ", databaseName=" + databaseName + ", databaseUsername=" + databaseUsername + ", databasePassword=" + databasePassword + ", serverPort=" + serverPort + ", serverSecret=" + serverSecret + ", keystorePath=" + keystorePath + ", keystorePassword="
-				+ keystorePassword + "]";
+		return "Settings [databaseType=" + databaseType + ", databaseUrl=" + databaseUrl + ", databaseName=" + databaseName + ", databaseUsername=" + databaseUsername + ", databasePassword=" + databasePassword + ", serverPort=" + serverPort + ", serverSecret=" + serverSecret + ", keystorePath="
+				+ keystorePath + ", keystorePassword=" + keystorePassword + "]";
+	}
+
+	@Override
+	public int hashCode()
+	{
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((databaseName == null) ? 0 : databaseName.hashCode());
+		result = prime * result + ((databasePassword == null) ? 0 : databasePassword.hashCode());
+		result = prime * result + ((databaseType == null) ? 0 : databaseType.hashCode());
+		result = prime * result + ((databaseUrl == null) ? 0 : databaseUrl.hashCode());
+		result = prime * result + ((databaseUsername == null) ? 0 : databaseUsername.hashCode());
+		result = prime * result + ((keystorePassword == null) ? 0 : keystorePassword.hashCode());
+		result = prime * result + ((keystorePath == null) ? 0 : keystorePath.hashCode());
+		result = prime * result + serverPort;
+		result = prime * result + ((serverSecret == null) ? 0 : serverSecret.hashCode());
+		return result;
 	}
 
 	@Override
@@ -127,6 +155,13 @@ public class Settings
 		}
 		else if(!databasePassword.equals(other.databasePassword))
 			return false;
+		if(databaseType == null)
+		{
+			if(other.databaseType != null)
+				return false;
+		}
+		else if(!databaseType.equals(other.databaseType))
+			return false;
 		if(databaseUrl == null)
 		{
 			if(other.databaseUrl != null)
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java
index 265ab169df0cec23bb18cc16c6ebd9e87a9fa639..0a0b2adabe7520255a6644b918521784883d103d 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/Utils.java
@@ -1,11 +1,26 @@
 package de.deadlocker8.budgetmasterserver.logic;
 
 import java.io.IOException;
+import java.io.Writer;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
 
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.MysqlDatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.SqliteDatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.MysqlDatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.SqliteDatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.MysqlDatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.SqliteDatabaseTagHandler;
 
 public class Utils
 {
@@ -13,11 +28,74 @@ public class Utils
 	{
 		String settingsJSON;
 		Settings settings;
-		
+
 		Gson gson = new Gson();
+
+		settingsJSON = new String(Files.readAllBytes(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json")));
+		settings = gson.fromJson(settingsJSON, Settings.class);
+		return settings;
+	}
+
+	public static void saveSettings(Settings settings) throws IOException, URISyntaxException
+	{
+		Gson gson = new GsonBuilder().setPrettyPrinting().create();
+		String jsonString = gson.toJson(settings);
+		Writer writer = Files.newBufferedWriter(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json"));
+		writer.write(jsonString);
+		writer.close();
+	}
+
+	public static Connection getDatabaseConnection(Settings settings) throws SQLException, ClassNotFoundException
+	{
+		Class.forName("org.sqlite.JDBC");
+		
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return DriverManager.getConnection("jdbc:mysql://" + settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin&autoReconnect=true&wait_timeout=86400", settings.getDatabaseUsername(), settings.getDatabasePassword());
+		}
+		else		
+		{
+			return DriverManager.getConnection("jdbc:sqlite://" + settings.getDatabaseUrl());
+		}
+	}
+
+	public static DatabaseCreator getDatabaseCreator(Connection connection, Settings settings)
+	{
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return new MysqlDatabaseCreator(connection, settings);
+		}
+		else
+		{
+			return new SqliteDatabaseCreator(connection, settings);
+		}
+	}
+
+	public static DatabaseHandler getDatabaseHandler(Settings settings) throws ClassNotFoundException
+	{
+		Class.forName("org.sqlite.JDBC");
+		
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return new MysqlDatabaseHandler(settings);
+		}
+		else
+		{
+			return new SqliteDatabaseHandler(settings);
+		}
+	}
+
+	public static DatabaseTagHandler getDatabaseTagHandler(Settings settings) throws ClassNotFoundException
+	{
+		Class.forName("org.sqlite.JDBC");
 		
-		settingsJSON = new String(Files.readAllBytes(Paths.get(Settings.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent().resolve("settings.json")));		
-		settings = gson.fromJson(settingsJSON, Settings.class);	
-		return settings;		
+		if(settings.getDatabaseType().equals("mysql"))
+		{
+			return new MysqlDatabaseTagHandler(settings);
+		}
+		else
+		{
+			return new SqliteDatabaseTagHandler(settings);
+		}
 	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java
index 2213d91003b903824193d41803d4afa0f96daf6e..fb0dc3277e444078ec989a9d48910f2c60273a55 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseExporter.java
@@ -1,7 +1,6 @@
 package de.deadlocker8.budgetmasterserver.logic.database;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -15,6 +14,7 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.tag.TagMatch;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
 import logger.Logger;
 
 public class DatabaseExporter
@@ -25,7 +25,7 @@ public class DatabaseExporter
     {
         try
         {
-            this.connection = DriverManager.getConnection(settings.getDatabaseUrl() + settings.getDatabaseName() + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin", settings.getDatabaseUsername(), settings.getDatabasePassword());
+            this.connection = Utils.getDatabaseConnection(settings); 
         }
         catch(Exception e)
         {
@@ -200,7 +200,6 @@ public class DatabaseExporter
                 int tagID = rs.getInt("Tag_ID");
                 int paymentID = rs.getInt("Payment_ID");
                 int repeatingPaymentID = rs.getInt("RepeatingPayment_ID");                             
-            
                 results.add(new TagMatch(tagID, paymentID, repeatingPaymentID));
             }
         }
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java
index 3070bf67b655552cb6d552d0c3824ce12808b2c0..091440c113937302906d18ecb2144da6c15f8cf7 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseImporter.java
@@ -9,6 +9,8 @@ import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.tag.TagMatch;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 
 public class DatabaseImporter
 {
@@ -96,7 +98,7 @@ public class DatabaseImporter
         		updateTagMatchesByTagID(tagID, existingTag.getID());
         	}
         }
-        
+
         tagMatches.addAll(changedTagMatches);
         importTagMatches(tagMatches);
 	}
@@ -117,7 +119,7 @@ public class DatabaseImporter
 				 * 			call 2 = replace ID 3 with 4
 				 * --> would replace category IDs in payments where category ID has already been replaced 
 				 * --> would lead to wrong import
-				 * --> remove payment from list but add to "changedPayments" in order not to loose the payment completly
+				 * --> remove payment from list but add to "changedPayments" in order not to loose the payment completely
 				 * --> remaining payments in list and all payments from "changedPayments" will be merged after all categories are imported
 				 */				
 				changedNormalPayments.add(currentPayment);
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..2fef700c27eb32a763cc2c21fe02a9cbb43b501e
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/DatabaseCreator.java
@@ -0,0 +1,73 @@
+package de.deadlocker8.budgetmasterserver.logic.database.creator;
+
+import java.sql.Connection;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public abstract class DatabaseCreator
+{
+	Connection connection;
+	Settings settings;
+
+	public DatabaseCreator(Connection connection, Settings settings)
+	{
+		this.connection = connection;
+		this.settings = settings;		
+	}
+	
+	public void createTables()
+	{
+		Logger.info("Checking tables...");
+		createTables(getExistingTables());	
+		Logger.info("Checking tables [DONE]");
+	}
+
+	public abstract ArrayList<String> getExistingTables();	
+	
+	private void createTables(ArrayList<String> existingTables)
+	{
+		if(!existingTables.contains("category"))
+		{
+			createTableCategory();
+		}
+		
+		if(!existingTables.contains("payment"))
+		{
+			createTablePayment();
+		}
+		
+		if(!existingTables.contains("repeating_payment"))
+		{
+			createTableRepeatingPayment();
+		}
+		
+		if(!existingTables.contains("repeating_entry"))
+		{
+			createTableRepeatingEntry();
+		}
+		
+		if(!existingTables.contains("tag"))
+		{
+			createTableTag();
+		}
+		
+		if(!existingTables.contains("tag_match"))
+		{
+			createTableTagMatch();
+		}
+	}
+	
+	public abstract void createTableCategory();
+	
+	public abstract void createTablePayment();
+	
+	public abstract void createTableRepeatingEntry();
+	
+	public abstract void createTableRepeatingPayment();
+	
+	public abstract void createTableTag();
+	
+	public abstract void createTableTagMatch();
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java
similarity index 84%
rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java
index 81350a988fbacb3bf8bd2742fc3f5b77cb6889c9..7c73373c7df95cf01e5c68955f9d843e85ff33ae 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseCreator.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/MysqlDatabaseCreator.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmasterserver.logic.database;
+package de.deadlocker8.budgetmasterserver.logic.database.creator;
 
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
@@ -10,21 +10,15 @@ import java.util.ArrayList;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import logger.Logger;
 
-public class DatabaseCreator
+public class MysqlDatabaseCreator extends DatabaseCreator
 {
-	private Connection connection;
-	private Settings settings;
-
-	public DatabaseCreator(Connection connection, Settings settings)
+	public MysqlDatabaseCreator(Connection connection, Settings settings)
 	{
-		this.connection = connection;
-		this.settings = settings;
-		Logger.info("Checking tables...");
-		createTables(getExistingTables());	
-		Logger.info("Checking tables [DONE]");
+		super(connection, settings);
 	}
 
-	private ArrayList<String> getExistingTables()
+	@Override
+	public ArrayList<String> getExistingTables()
 	{
 		ArrayList<String> tables = new ArrayList<>();
 		try
@@ -41,42 +35,10 @@ public class DatabaseCreator
 			Logger.error(e);
 		}
 		return tables;
-	}
-	
-	private void createTables(ArrayList<String> existingTables)
-	{
-		if(!existingTables.contains("category"))
-		{
-			createTableCategory();
-		}
-		
-		if(!existingTables.contains("payment"))
-		{
-			createTablePayment();
-		}
-		
-		if(!existingTables.contains("repeating_payment"))
-		{
-			createTableRepeatingPayment();
-		}
-		
-		if(!existingTables.contains("repeating_entry"))
-		{
-			createTableRepeatingEntry();
-		}
-		
-		if(!existingTables.contains("tag"))
-		{
-			createTableTag();
-		}
-		
-		if(!existingTables.contains("tag_match"))
-		{
-			createTableTagMatch();
-		}
-	}
+	}	
 	
-	private void createTableCategory()
+	@Override
+	public void createTableCategory()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `category` (`ID` int(11) NOT NULL COMMENT 'ID'," +
@@ -115,7 +77,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTablePayment()
+	@Override
+	public void createTablePayment()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `payment` (" +
@@ -156,7 +119,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableRepeatingEntry()
+	@Override
+	public void createTableRepeatingEntry()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `repeating_entry` (" +
@@ -196,7 +160,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableRepeatingPayment()
+	@Override
+	public void createTableRepeatingPayment()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `repeating_payment` (" +
@@ -240,7 +205,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableTag()
+	@Override
+	public void createTableTag()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `tag` (`ID` int(11) NOT NULL COMMENT 'ID'," + 
@@ -276,7 +242,8 @@ public class DatabaseCreator
 		}
 	}
 	
-	private void createTableTagMatch()
+	@Override
+	public void createTableTagMatch()
 	{
 		Statement stmt = null;
 		String query = "CREATE TABLE `tag_match` (`Tag_ID` int(11) NOT NULL," + 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e869e60c48b7fe9db3663fdbaa008acb4c1de1d
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/creator/SqliteDatabaseCreator.java
@@ -0,0 +1,248 @@
+package de.deadlocker8.budgetmasterserver.logic.database.creator;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class SqliteDatabaseCreator extends DatabaseCreator
+{
+	public SqliteDatabaseCreator(Connection connection, Settings settings)
+	{
+		super(connection, settings);
+	}
+
+	@Override
+	public ArrayList<String> getExistingTables()
+	{
+		ArrayList<String> tables = new ArrayList<>();
+		try
+		{
+			DatabaseMetaData meta = connection.getMetaData();
+			ResultSet res = meta.getTables(settings.getDatabaseName(), null, "", new String[] { "TABLE" });
+			while(res.next())
+			{
+				tables.add(res.getString("TABLE_NAME"));
+			}			
+		}
+		catch(Exception e)
+		{
+			Logger.error(e);
+		}
+		return tables;
+	}	
+	
+	@Override
+	public void createTableCategory()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `category` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT DEFAULT NULL, `Color` TEXT NOT NULL);";		
+		String query2 = "INSERT INTO `category` (`ID`, `Name`, `Color`) VALUES(1, 'NONE', '#FFFFFF'),(2, 'Übertrag', '#FFFF00');";		
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			stmt.execute(query2);
+			Logger.info("Successfully created table category");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTablePayment()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `payment` (" + 
+				"`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + 
+				"`Name` TEXT DEFAULT NULL," + 
+				"`CategoryID` INTEGER DEFAULT NULL," + 
+				"`Amount` INTEGER DEFAULT NULL," + 
+				"`Date` TEXT DEFAULT NULL," + 
+				"`Description` TEXT DEFAULT NULL);";		
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table payment");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableRepeatingEntry()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `repeating_entry` (" + 
+				"`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + 
+				"`RepeatingPaymentID` INTEGER NOT NULL," + 
+				"`Date` TEXT NOT NULL," + 
+				"FOREIGN KEY (RepeatingPaymentID) REFERENCES repeating_payment(ID) ON DELETE CASCADE ON UPDATE CASCADE);";			
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table repeating_entry");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableRepeatingPayment()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `repeating_payment` (\r\n" + 
+				"`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\r\n" + 
+				"`Name` TEXT DEFAULT NULL,\r\n" + 
+				"`CategoryID` INTEGER DEFAULT NULL,\r\n" + 
+				"`Amount` INTEGER DEFAULT NULL,\r\n" + 
+				"`Date` TEXT DEFAULT NULL,\r\n" + 
+				"`Description` TEXT DEFAULT NULL,\r\n" + 
+				"`RepeatInterval` INTEGER DEFAULT NULL,\r\n" + 
+				"`RepeatEndDate` TEXT DEFAULT NULL,\r\n" + 
+				"`RepeatMonthDay` INTEGER DEFAULT NULL);";			
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table repeating_payment");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableTag()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `tag` (`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT NOT NULL);";
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table tag");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+	
+	@Override
+	public void createTableTagMatch()
+	{
+		Statement stmt = null;
+		String query = "CREATE TABLE `tag_match` (`Tag_ID` INTEGER NOT NULL," + 
+				"`Payment_ID` INTEGER NOT NULL," + 
+				"`RepeatingPayment_ID` INTEGER NOT NULL);"; 
+		
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(query);
+			Logger.info("Successfully created table tag_match");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			if(stmt != null)
+			{
+				try
+				{
+					stmt.close();
+				}
+				catch(SQLException e)
+				{
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java
similarity index 66%
rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java
index b9f91615a2ae2d9364fcb28da120e20a8047371a..d211841f2be15da2fe5a7391995fa01df568e8d3 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/DatabaseHandler.java
@@ -1,7 +1,6 @@
-package de.deadlocker8.budgetmasterserver.logic.database;
+package de.deadlocker8.budgetmasterserver.logic.database.handler;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -19,20 +18,28 @@ import de.deadlocker8.budgetmaster.logic.payment.Payment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
 import logger.Logger;
 
-public class DatabaseHandler
+public abstract class DatabaseHandler
 {
-	private Connection connection;
-	private final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
+	Connection connection;
+	Settings settings;
+	final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
 
 	public DatabaseHandler(Settings settings) throws IllegalStateException
+	{
+		this.settings = settings;
+	}
+	
+	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 = Utils.getDatabaseConnection(settings);
+			}
 		}
 		catch(Exception e)
 		{
@@ -41,7 +48,19 @@ public class DatabaseHandler
 		}
 	}
 	
-	private void closeConnection(Statement statement)
+	public void closeConnection()
+	{
+		try
+		{
+			connection.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+	}
+	
+	void closeStatement(Statement statement)
 	{
 		if(statement != null)
 		{
@@ -58,32 +77,8 @@ public class DatabaseHandler
 	/*
 	 * GET
 	 */
-	public int getLastInsertID()
-	{
-		PreparedStatement stmt = null;
-		int lastInsertID = 0;
-		try
-		{
-			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
-			}
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeConnection(stmt);
-		}
-
-		return lastInsertID;
-	}
-	
+	public abstract int getLastInsertID();
+		
 	public DateTime getFirstNormalPaymentDate()
 	{
 		PreparedStatement stmt = null;
@@ -105,6 +100,7 @@ public class DatabaseHandler
 					dateTime = formatter.parseDateTime(rs.getString("min"));
 				}
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -112,7 +108,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return dateTime;
@@ -139,6 +135,7 @@ public class DatabaseHandler
 					dateTime = formatter.parseDateTime(rs.getString("min"));
 				}
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -146,7 +143,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return dateTime;
@@ -229,6 +226,7 @@ public class DatabaseHandler
 
 				results.add(new Category(id, name, color));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -236,7 +234,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -259,6 +257,7 @@ public class DatabaseHandler
 
 				result = new Category(id, name, color);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -266,7 +265,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return result;
@@ -291,6 +290,7 @@ public class DatabaseHandler
 
 				result = new Category(id, categoryName, categoryColor);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -298,7 +298,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return result;
@@ -320,6 +320,7 @@ public class DatabaseHandler
 					exists = true;
 				}
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -327,7 +328,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return exists;
@@ -350,9 +351,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 +362,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return null;
@@ -388,6 +390,7 @@ public class DatabaseHandler
 
 				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -395,163 +398,19 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
 	}
 
-	public ArrayList<NormalPayment> getPayments(int year, int month)
-	{
-		PreparedStatement stmt = null;
-
-		ArrayList<NormalPayment> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT * FROM payment WHERE YEAR(Date) = ? AND  MONTH(Date) = ?;");
-			stmt.setInt(1, year);
-			stmt.setInt(2, month);
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");
-				String name = rs.getString("Name");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");
-				int categoryID = rs.getInt("CategoryID");
-				String description = rs.getString("Description");
-
-				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
-			}
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeConnection(stmt);
-		}
-
-		return results;
-	}
+	public abstract ArrayList<NormalPayment> getPayments(int year, int month);
 	
-	public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate)
-	{	
-		PreparedStatement stmt = null;
-
-		ArrayList<NormalPayment> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT * FROM payment WHERE DATE(Date) BETWEEN ? AND ?;");
-			stmt.setString(1, startDate);
-			stmt.setString(2, endDate);			
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");				
-				String name = rs.getString("Name");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");				
-				int categoryID = rs.getInt("CategoryID");
-				String description = rs.getString("Description");
-			
-				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
-			}
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeConnection(stmt);
-		}
-
-		return results;
-	}
-
-	public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
-	{
-		PreparedStatement stmt = null;
-
-		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = ? AND MONTH(repeating_entry.Date) = ?;");
-			stmt.setInt(1, year);
-			stmt.setInt(2, month);			
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");
-				int repeatingPaymentID = rs.getInt("repeatingPaymentID");
-				String name = rs.getString("Name");
-				String description = rs.getString("Description");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");
-				int categoryID = rs.getInt("CategoryID");
-				int repeatInterval = rs.getInt("RepeatInterval");
-				String repeatEndDate = rs.getString("RepeatEndDate");
-				int repeatMonthDay = rs.getInt("RepeatMonthDay");
-
-				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
-			}
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeConnection(stmt);
-		}
-
-		return results;
-	}
+	public abstract ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate);
 	
-	public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate)
-	{
-		PreparedStatement stmt = null;
-
-		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
-		try
-		{
-			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND DATE(repeating_entry.Date) BETWEEN ? AND ?;");
-			stmt.setString(1, startDate);
-			stmt.setString(2,  endDate);
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				int resultID = rs.getInt("ID");
-				int repeatingPaymentID = rs.getInt("repeatingPaymentID");				
-				String name = rs.getString("Name");
-				String description = rs.getString("Description");
-				int amount = rs.getInt("amount");
-				String date = rs.getString("Date");				
-				int categoryID = rs.getInt("CategoryID");
-				int repeatInterval = rs.getInt("RepeatInterval");
-				String repeatEndDate = rs.getString("RepeatEndDate");
-				int repeatMonthDay = rs.getInt("RepeatMonthDay");		
-			
-				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
-			}
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeConnection(stmt);
-		}
-
-		return results;
-	}
+	public abstract ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month);	
+	
+	public abstract ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate);
 
 	public ArrayList<RepeatingPayment> getAllRepeatingPayments()
 	{
@@ -577,6 +436,7 @@ public class DatabaseHandler
 
 				results.add(new RepeatingPayment(resultID, amount, date, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -584,7 +444,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -608,6 +468,7 @@ public class DatabaseHandler
 
 				results.add(new LatestRepeatingPayment(resultID, repeatingPaymentID, date));
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -615,7 +476,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return results;
@@ -644,6 +505,7 @@ public class DatabaseHandler
 
 				result = new RepeatingPayment(id, amount, date, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay);
 			}
+			rs.close();
 		}
 		catch(SQLException e)
 		{
@@ -651,7 +513,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return result;
@@ -666,8 +528,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 +540,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return -1;
@@ -690,8 +555,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 +567,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 
 		return -1;
@@ -723,7 +591,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -742,7 +610,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -761,46 +629,11 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
-	public void deleteDatabase()
-	{
-		Statement stmt = null;
-		String tableCategory = "DROP TABLE IF EXISTS category;";
-		String tablePayment = "DROP TABLE IF EXISTS payment;";
-		String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;";
-		String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;";
-		String tableTag = "DROP TABLE IF EXISTS tag;";
-		String tableTagMatch = "DROP TABLE IF EXISTS tag_match;";
-		try
-		{
-			stmt = connection.createStatement();
-			stmt.execute("SET FOREIGN_KEY_CHECKS = 0;");
-			stmt.execute(tableCategory);
-			Logger.info("Deleted table: category");
-			stmt.execute(tablePayment);
-			Logger.info("Deleted table: payment");
-			stmt.execute(tableRepeatingPayment);
-			Logger.info("Deleted table: repeating_payment");
-			stmt.execute(tableRepeatingEntry);
-			Logger.info("Deleted table: repeating_entry");
-			stmt.execute(tableTag);
-			Logger.info("Deleted table: tag");
-			stmt.execute(tableTagMatch);
-			Logger.info("Deleted table: tag_match");
-			stmt.execute("SET FOREIGN_KEY_CHECKS = 1;");
-		}
-		catch(SQLException e)
-		{
-			Logger.error(e);
-		}
-		finally
-		{
-			closeConnection(stmt);
-		}
-	}
+	public abstract void deleteDatabase();
 
 	/*
 	 * ADD
@@ -821,7 +654,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -842,7 +675,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -863,8 +696,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 +708,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return -1;
@@ -904,8 +740,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 +752,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return -1;
@@ -936,7 +775,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -960,7 +799,7 @@ public class DatabaseHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 
@@ -984,7 +823,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/handler/MysqlDatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2c8e92b994416230be328b23fa86e561bd684c2
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/MysqlDatabaseHandler.java
@@ -0,0 +1,247 @@
+package de.deadlocker8.budgetmasterserver.logic.database.handler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
+import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class MysqlDatabaseHandler extends DatabaseHandler
+{
+	public MysqlDatabaseHandler(Settings settings) throws IllegalStateException
+	{
+		super(settings);
+		connect();
+	}
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE YEAR(Date) = ? AND  MONTH(Date) = ?;");
+			stmt.setInt(1, year);
+			stmt.setInt(2, month);
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND YEAR(repeating_entry.Date) = ? AND MONTH(repeating_entry.Date) = ?;");
+			stmt.setInt(1, year);
+			stmt.setInt(2, month);			
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");
+
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate)
+	{	
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE DATE(Date) BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);			
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");				
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+			
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND DATE(repeating_entry.Date) BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");				
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");		
+			
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public void deleteDatabase()
+	{
+		Statement stmt = null;
+		String tableCategory = "DROP TABLE IF EXISTS category;";
+		String tablePayment = "DROP TABLE IF EXISTS payment;";
+		String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;";
+		String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;";
+		String tableTag = "DROP TABLE IF EXISTS tag;";
+		String tableTagMatch = "DROP TABLE IF EXISTS tag_match;";
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute("SET FOREIGN_KEY_CHECKS = 0;");
+			stmt.execute(tableCategory);
+			Logger.info("Deleted table: category");
+			stmt.execute(tablePayment);
+			Logger.info("Deleted table: payment");
+			stmt.execute(tableRepeatingPayment);
+			Logger.info("Deleted table: repeating_payment");
+			stmt.execute(tableRepeatingEntry);
+			Logger.info("Deleted table: repeating_entry");
+			stmt.execute(tableTag);
+			Logger.info("Deleted table: tag");
+			stmt.execute(tableTagMatch);
+			Logger.info("Deleted table: tag_match");
+			stmt.execute("SET FOREIGN_KEY_CHECKS = 1;");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..139b20dff3bcc44e08da074c40301cef425c1a93
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/handler/SqliteDatabaseHandler.java
@@ -0,0 +1,245 @@
+package de.deadlocker8.budgetmasterserver.logic.database.handler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
+import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class SqliteDatabaseHandler extends DatabaseHandler
+{
+	public SqliteDatabaseHandler(Settings settings) throws IllegalStateException
+	{
+		super(settings);
+		connect();
+	}
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT last_insert_rowid() as `ID`");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("ID");				
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE strftime('%Y', Date) = ? AND strftime('%m', Date) = ?;");
+			stmt.setString(1, String.format("%02d", year));
+			stmt.setString(2, String.format("%02d", month));
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPayments(int year, int month)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND strftime('%Y', repeating_entry.Date) = ? AND strftime('%m', repeating_entry.Date) = ?;");
+			stmt.setString(1, String.format("%02d", year));
+			stmt.setString(2, String.format("%02d", month));		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");
+
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description, repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<NormalPayment> getPaymentsBetween(String startDate, String endDate)
+	{	
+		PreparedStatement stmt = null;
+
+		ArrayList<NormalPayment> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT * FROM payment WHERE Date BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);			
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");				
+				String name = rs.getString("Name");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				String description = rs.getString("Description");
+			
+				results.add(new NormalPayment(resultID, amount, date, categoryID, name, description));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public ArrayList<RepeatingPaymentEntry> getRepeatingPaymentsBetween(String startDate, String endDate)
+	{
+		PreparedStatement stmt = null;
+
+		ArrayList<RepeatingPaymentEntry> results = new ArrayList<>();
+		try
+		{
+			stmt = connection.prepareStatement("SELECT repeating_entry.ID, repeating_entry.RepeatingPaymentID, repeating_entry.Date, repeating_payment.Name, repeating_payment.CategoryID, repeating_payment.Amount, repeating_payment.RepeatInterval, repeating_payment.RepeatEndDate, repeating_payment.RepeatMonthDay, repeating_payment.Description FROM repeating_entry, repeating_payment WHERE repeating_entry.RepeatingPaymentID = repeating_payment.ID AND repeating_entry.Date BETWEEN ? AND ?;");
+			stmt.setString(1, startDate);
+			stmt.setString(2, endDate);
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				int resultID = rs.getInt("ID");
+				int repeatingPaymentID = rs.getInt("repeatingPaymentID");				
+				String name = rs.getString("Name");
+				String description = rs.getString("Description");
+				int amount = rs.getInt("amount");
+				String date = rs.getString("Date");				
+				int categoryID = rs.getInt("CategoryID");
+				int repeatInterval = rs.getInt("RepeatInterval");
+				String repeatEndDate = rs.getString("RepeatEndDate");
+				int repeatMonthDay = rs.getInt("RepeatMonthDay");		
+			
+				results.add(new RepeatingPaymentEntry(resultID, repeatingPaymentID, date, amount, categoryID, name, description,repeatInterval, repeatEndDate, repeatMonthDay));
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return results;
+	}
+	
+	@Override
+	public void deleteDatabase()
+	{
+		Statement stmt = null;
+		String tableCategory = "DROP TABLE IF EXISTS category;";
+		String tablePayment = "DROP TABLE IF EXISTS payment;";
+		String tableRepeatingPayment = "DROP TABLE IF EXISTS repeating_payment;";
+		String tableRepeatingEntry = "DROP TABLE IF EXISTS repeating_entry;";
+		String tableTag = "DROP TABLE IF EXISTS tag;";
+		String tableTagMatch = "DROP TABLE IF EXISTS tag_match;";
+		try
+		{
+			stmt = connection.createStatement();
+			stmt.execute(tableCategory);
+			Logger.info("Deleted table: category");
+			stmt.execute(tablePayment);
+			Logger.info("Deleted table: payment");
+			stmt.execute(tableRepeatingPayment);
+			Logger.info("Deleted table: repeating_payment");
+			stmt.execute(tableRepeatingEntry);
+			Logger.info("Deleted table: repeating_entry");
+			stmt.execute(tableTag);
+			Logger.info("Deleted table: tag");
+			stmt.execute(tableTagMatch);
+			Logger.info("Deleted table: tag_match");
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java
similarity index 84%
rename from BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
rename to BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java
index 562e2b20fe13dd7e71fc4f734e65d498e587b0a9..4b65d91329fc409ebcdd4835c63209bda5bba1a0 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/DatabaseTagHandler.java
@@ -1,7 +1,6 @@
-package de.deadlocker8.budgetmasterserver.logic.database;
+package de.deadlocker8.budgetmasterserver.logic.database.taghandler;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -10,65 +9,63 @@ import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
 import logger.Logger;
 
-public class DatabaseTagHandler
+public abstract class DatabaseTagHandler
 {
-	private Connection connection;
+	Connection connection;
+	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;
+    }
 	
-	private void closeConnection(Statement statement)
+	public void connect()
 	{
-		if(statement != null)
+		try
 		{
-			try
-			{
-				statement.close();
-			}
-			catch(SQLException e)
-			{
+			if(connection == null || connection.isClosed())
+			{				
+				this.connection = Utils.getDatabaseConnection(settings); 
 			}
 		}
+		catch(Exception e)
+		{
+			Logger.error(e);
+			throw new IllegalStateException("Cannot connect the database!", e);
+		}
 	}
 	
-	public int getLastInsertID()
+	public void closeConnection()
 	{
-		PreparedStatement stmt = null;
-		int lastInsertID = 0;
 		try
 		{
-			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
-			ResultSet rs = stmt.executeQuery();
-
-			while(rs.next())
-			{
-				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
-			}
+			connection.close();
 		}
 		catch(SQLException e)
 		{
 			Logger.error(e);
 		}
-		finally
+	}
+	
+	void closeStatement(Statement statement)
+	{
+		if(statement != null)
 		{
-			closeConnection(stmt);
+			try
+			{
+				statement.close();
+			}
+			catch(SQLException e)
+			{
+			}
 		}
-
-		return lastInsertID;
 	}
 	
+	public abstract int getLastInsertID();
+	
 	public ArrayList<Tag> getAllTags()
 	{	   
         PreparedStatement stmt = null;
@@ -91,7 +88,7 @@ public class DatabaseTagHandler
         }
         finally
         {
-            closeConnection(stmt);
+            closeStatement(stmt);
         }
 
         return results;    
@@ -121,7 +118,7 @@ public class DatabaseTagHandler
         }
         finally
         {
-           closeConnection(stmt);
+           closeStatement(stmt);
         }
 
         return tag;
@@ -151,7 +148,7 @@ public class DatabaseTagHandler
         }
         finally
         {
-           closeConnection(stmt);
+           closeStatement(stmt);
         }
 
         return tag;
@@ -172,7 +169,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -191,7 +188,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -216,7 +213,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return false;
@@ -243,7 +240,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return false;
@@ -271,7 +268,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return tagIDs;
@@ -299,7 +296,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return tagIDs;
@@ -322,7 +319,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -343,7 +340,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -363,7 +360,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -383,7 +380,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 	}
 	
@@ -407,7 +404,7 @@ public class DatabaseTagHandler
 		}
 		finally
 		{
-			closeConnection(stmt);
+			closeStatement(stmt);
 		}
 		
 		return false;
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..70b319a02a894763d907bfac904ce61563688c64
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/MysqlDatabaseTagHandler.java
@@ -0,0 +1,45 @@
+package de.deadlocker8.budgetmasterserver.logic.database.taghandler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class MysqlDatabaseTagHandler extends DatabaseTagHandler
+{
+	public MysqlDatabaseTagHandler(Settings settings) throws IllegalStateException
+    {
+		super(settings);
+        connect();
+    }
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT LAST_INSERT_ID();");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("LAST_INSERT_ID()");				
+			}
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3e3fcba629a9d10f84e03bc75388457fe4459a8
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/logic/database/taghandler/SqliteDatabaseTagHandler.java
@@ -0,0 +1,46 @@
+package de.deadlocker8.budgetmasterserver.logic.database.taghandler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import de.deadlocker8.budgetmasterserver.logic.Settings;
+import logger.Logger;
+
+public class SqliteDatabaseTagHandler extends DatabaseTagHandler
+{
+	public SqliteDatabaseTagHandler(Settings settings) throws IllegalStateException
+    {
+		super(settings);
+        connect();
+    }
+	
+	@Override
+	public int getLastInsertID()
+	{
+		PreparedStatement stmt = null;
+		int lastInsertID = 0;
+		try
+		{
+			stmt = connection.prepareStatement("SELECT last_insert_rowid() as `ID`");		
+			ResultSet rs = stmt.executeQuery();
+
+			while(rs.next())
+			{
+				lastInsertID = rs.getInt("ID");				
+			}
+			rs.close();
+		}
+		catch(SQLException e)
+		{
+			Logger.error(e);
+		}
+		finally
+		{
+			closeStatement(stmt);
+		}
+
+		return lastInsertID;
+	}
+	
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java
index eb3a19f902e893737a2313c3b84d29a3d87e0731..6083c46fefc9700a5de59b90022c9667cc755012 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/main/Main.java
@@ -46,6 +46,7 @@ public class Main
 			
 			if(!Files.exists(settingsPath))
 			{
+				Logger.warning("No settings file found! Creating default settings file...");
 				try
 				{
 					Files.copy(SparkServer.class.getClassLoader().getResourceAsStream("de/deadlocker8/budgetmasterserver/settings.json"), settingsPath);
@@ -60,6 +61,39 @@ public class Main
 			try
 			{
 				settings = Utils.loadSettings();
+				boolean settingsChanged = false;
+				if(settings.getDatabaseType() == null)
+				{
+					settings.setDatabaseType("mysql");
+					settingsChanged = true;
+				}
+				
+				if(!settings.getDatabaseType().equals("mysql") && !settings.getDatabaseType().equals("sqlite"))
+				{
+					Logger.error(settings.getDatabaseType() + " is no valid database type! (allowed types are: mysql and sqlite)");
+					return;
+				}
+				
+				if(settings.getDatabaseType().equals("sqlite") && (settings.getDatabaseUrl() == null || settings.getDatabaseUrl().equals("")))
+				{
+					Logger.warning("There is no save path  specified for the sqlite database file. It will be saved as \"BudgetMaster.db\" in current directory.");
+					settings.setDatabaseUrl(System.getProperty("user.dir").replace("\\", "/") + "/BudgetMaster.db");
+					settingsChanged = true;
+				}
+				
+				if(settings.getDatabaseUrl().contains("jdbc"))
+				{
+					settings.setDatabaseUrl(settings.getDatabaseUrl().replace("jdbc:mysql://", ""));
+					settingsChanged = true;
+				}
+				
+				
+				if(settingsChanged)
+				{
+					Logger.warning("Settings file is not up to date! Updated settings to new version.");
+					Utils.saveSettings(settings);
+				}
+				
 				VersionInformation versionInfo = new VersionInformation();
 				versionInfo.setVersionCode(Integer.parseInt(Localization.getString("version.code")));
 				versionInfo.setVersionName(Localization.getString("version.name"));
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index 2e4d55abf7d2113c3ada2fe859f6d97ac484f2ae..d1c397ea7b1a79ee1e581841c16b165d43597491 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,7 @@ import static spark.Spark.put;
 import static spark.Spark.secure;
 
 import java.io.File;
+import java.sql.Connection;
 
 import org.joda.time.DateTime;
 
@@ -20,8 +21,9 @@ import com.google.gson.GsonBuilder;
 import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryAdd;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryDelete;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryGet;
@@ -47,6 +49,7 @@ import de.deadlocker8.budgetmasterserver.server.payment.repeating.RepeatingPayme
 import de.deadlocker8.budgetmasterserver.server.payment.search.PaymentMaxAmount;
 import de.deadlocker8.budgetmasterserver.server.payment.search.PaymentSearch;
 import de.deadlocker8.budgetmasterserver.server.rest.RestGet;
+import de.deadlocker8.budgetmasterserver.server.shutdown.Shutdown;
 import de.deadlocker8.budgetmasterserver.server.tag.match.TagMatchAddForPayment;
 import de.deadlocker8.budgetmasterserver.server.tag.match.TagMatchAddForRepeatingPayment;
 import de.deadlocker8.budgetmasterserver.server.tag.match.TagMatchDeleteForPayment;
@@ -69,8 +72,7 @@ import tools.HashUtils;
 public class SparkServer
 {	
 	private Gson gson;
-	private DatabaseHandler handler;
-	private DatabaseTagHandler tagHandler;
+	private boolean shutdownInProgress = false;
 	
 	public SparkServer(Settings settings, VersionInformation versionInfo)
 	{
@@ -87,8 +89,17 @@ public class SparkServer
 			{
 				throw new Exception("empty string is no valid keystorePath");
 			}
-			File keystoreFile = new File(filePath);		
-			secure(keystoreFile.getAbsolutePath(), settings.getKeystorePassword(), null, null);						
+			else if(settings.getKeystorePath().equals("default"))
+			{
+				Logger.info("Connections are secured with default keystore");
+				Logger.warning("The Server is running with the default keystore. This is only recommended if the server is running in a local area network and is not exposed to the internet. Please check if this is intended.");
+				secure(SparkServer.class.getClassLoader().getResource("de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks").toString(), settings.getKeystorePassword(), null, null);
+			}
+			else
+			{
+				Logger.info("Connections are secured with custom keystore");
+				secure(new File(filePath).getAbsolutePath(), settings.getKeystorePassword(), null, null);
+			}
 		}
 		catch(Exception e)
 		{
@@ -99,81 +110,108 @@ public class SparkServer
 		
 		RouteOverview.enableRouteOverview();
 		
-		handler = new DatabaseHandler(settings);
-		tagHandler = new DatabaseTagHandler(settings);
-
+		Logger.info("Trying to connect to database (jdbc:" + settings.getDatabaseType() + "://" + settings.getDatabaseUrl() + ", databaseName: " + settings.getDatabaseName() + ")");
+		
+		try
+		{
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			Logger.info("Successfully initialized database (jdbc:" + settings.getDatabaseType() + "://" + settings.getDatabaseUrl() + ", databaseName: " + 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();
 
 			if(clientSecret == null || !clientSecret.equals(HashUtils.hash(settings.getServerSecret(), Helpers.SALT)))
 			{
+				Logger.debug("Unauthorized request from " + request.ip());
 				halt(401, "Unauthorized");
 			}
 
-			new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now());
+			DatabaseHandler handler = Utils.getDatabaseHandler(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));
-
-		// Payment
-		get("/payment/search", new PaymentSearch(handler, tagHandler));
-		get("/payment/search/maxAmount", new PaymentMaxAmount(handler, 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));
-
-		// 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));
-		
-		// CategoryBudget
-		get("/categorybudget", new CategoryBudgetGet(handler, gson));
-		
-		// Rest
-		get("/rest", new RestGet(handler, gson));		
-
-		// charts
-		get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(handler, gson));
-		get("/charts/monthInOutSum", new MonthInOutSum(handler, 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));
-		
-		// 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));
-
-		// Database
-		get("/database", new DatabaseExport(settings, gson));
-		post("/database", new DatabaseImport(handler, tagHandler, gson));
-		delete("/database", new DatabaseDelete(handler, settings));
-		
-		get("/info", new InformationGet(gson, versionInfo, settings));
-		get("/version", new VersionGet(gson, versionInfo));
-		delete("/log", new LogDelete());
+		try
+		{	
+			// Category
+			get("/category", new CategoryGetAll(Utils.getDatabaseHandler(settings), gson));
+			get("/category/single", new CategoryGet(Utils.getDatabaseHandler(settings), gson));
+			post("/category", new CategoryAdd(Utils.getDatabaseHandler(settings)));
+			put("/category", new CategoryUpdate(Utils.getDatabaseHandler(settings)));
+			delete("/category", new CategoryDelete(Utils.getDatabaseHandler(settings)));
+	
+			// Payment
+			get("/payment/search", new PaymentSearch(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings)));
+			get("/payment/search/maxAmount", new PaymentMaxAmount(Utils.getDatabaseHandler(settings), gson));
+			// Normal
+			get("/payment", new PaymentGet(Utils.getDatabaseHandler(settings), gson));
+			post("/payment", new PaymentAdd(Utils.getDatabaseHandler(settings), gson));
+			put("/payment", new PaymentUpdate(Utils.getDatabaseHandler(settings)));
+			delete("/payment", new PaymentDelete(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings)));
+	
+			// Repeating
+			get("/repeatingpayment/single", new RepeatingPaymentGet(Utils.getDatabaseHandler(settings), gson));
+			get("/repeatingpayment", new RepeatingPaymentGetAll(Utils.getDatabaseHandler(settings), gson));
+			post("/repeatingpayment", new RepeatingPaymentAdd(Utils.getDatabaseHandler(settings), gson));
+			delete("/repeatingpayment", new RepeatingPaymentDelete(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings)));
+			
+			// CategoryBudget
+			get("/categorybudget", new CategoryBudgetGet(Utils.getDatabaseHandler(settings), gson));
+			
+			// Rest
+			get("/rest", new RestGet(Utils.getDatabaseHandler(settings), gson));		
+	
+			// charts
+			get("/charts/categoryInOutSum", new CategoryInOutSumForMonth(Utils.getDatabaseHandler(settings), gson));
+			get("/charts/monthInOutSum", new MonthInOutSum(Utils.getDatabaseHandler(settings), gson));
+			
+			// tag
+			get("/tag/single", new TagGet(Utils.getDatabaseTagHandler(settings), gson));
+			get("/tag/single/byName", new TagGetByName(Utils.getDatabaseTagHandler(settings), gson));
+			get("/tag", new TagGetAll(Utils.getDatabaseTagHandler(settings), gson));
+			post("/tag", new TagAdd(Utils.getDatabaseTagHandler(settings)));
+			delete("/tag", new TagDelete(Utils.getDatabaseTagHandler(settings)));
+			
+			// tag match
+			get("/tag/match/all/normal", new TagMatchGetAllForPayment(Utils.getDatabaseTagHandler(settings), gson));
+			get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(Utils.getDatabaseTagHandler(settings), gson));
+			get("/tag/match/normal", new TagMatchExistingForPayment(Utils.getDatabaseTagHandler(settings), gson));
+			get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(Utils.getDatabaseTagHandler(settings), gson));
+			post("/tag/match/normal", new TagMatchAddForPayment(Utils.getDatabaseTagHandler(settings)));
+			post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(Utils.getDatabaseTagHandler(settings)));
+			delete("/tag/match/normal", new TagMatchDeleteForPayment(Utils.getDatabaseTagHandler(settings)));
+			delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(Utils.getDatabaseTagHandler(settings)));
+	
+			// Database
+			get("/database", new DatabaseExport(settings, gson));
+			post("/database", new DatabaseImport(Utils.getDatabaseHandler(settings), Utils.getDatabaseTagHandler(settings), gson));
+			delete("/database", new DatabaseDelete(Utils.getDatabaseHandler(settings), settings));
+			
+			get("/info", new InformationGet(gson, versionInfo, settings));
+			get("/version", new VersionGet(gson, versionInfo));
+			delete("/log", new LogDelete());
+			get("/shutdown", new Shutdown(shutdownInProgress));
+		}
+		catch(ClassNotFoundException e)
+		{
+			Logger.error(e);
+		}
 
 		after((request, response) -> {
-			new RepeatingPaymentUpdater(handler).updateRepeatingPayments(DateTime.now());
+			DatabaseHandler handler = Utils.getDatabaseHandler(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 e1c68a1fab74995e212a9f5cd6cf124aee5282ad..4a5e3fa258a2bdd2ff3c5fb1f18a7e4b439e13ab 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java
@@ -2,22 +2,28 @@ package de.deadlocker8.budgetmasterserver.server.category;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class CategoryAdd implements Route
+public class CategoryAdd implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	
-	public CategoryAdd( DatabaseHandler handler)
+	public CategoryAdd(DatabaseHandler handler)
 	{	
 		this.handler = handler;
 	}
 
 	@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("name") || !req.queryParams().contains("color"))
 		{
@@ -41,4 +47,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 134d68b26d999055b676952670d6983856bf54a0..e1b80572c702584a7e63b41e35754f579c273fc4 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.category;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 bda73e67ae850a08732b72b94c8a556ae53c5bd1..1fd8abe32f79a99dbc0205d81961865d13898438 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 2cb97062a8b66480191e522c4e118f9d106f2494..1e6af5f18d3bb93134e76ca200c25dc5c22f427c 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 0b55664fac5968338e3091e57f149186fb104d4b..8f651e484a685143788ee9a128d275771aeed184 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.category;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 7ae44cb599ef970c44e2a2c5aeb9f33c5cc8d9ba..545365e594dbbf0bf95a647de9093e62e75acae2 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 a83a7a50964ad81606f4591aa2b90512a40a9b1e..6aad5ea8afdfbdfb497b8e66247a26a3ced7a84b 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/CategoryInOutSumForMonth.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 8a4f43f1883fde9e47fd9c922b393e645f0273ab..292fae1f31afa02f271be7ef1406c5587de8a96a 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/charts/MonthInOutSum.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 f82a3e082089ca5be357b63c757bc3a4ca69a9ae..c9a6c13791fe99da67c8f0b4a43577ff3144a7ac 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.SQLException;
+
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.Utils;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import logger.Logger;
 import spark.Request;
 import spark.Response;
-import spark.Route;
 
-public class DatabaseDelete implements Route
+public class DatabaseDelete implements AdvancedRoute
 {
 	private DatabaseHandler handler;
 	private Settings settings;
@@ -20,20 +26,35 @@ 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 = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			Logger.info("Successfully initialized database (" + settings.getDatabaseUrl() + settings.getDatabaseName() + ")");
 	
 			return "";
 		}
-		catch(IllegalStateException ex)
+		catch(IllegalStateException | SQLException | ClassNotFoundException 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 c9d88f6a72ec94205461d8c33146e7663192e151..a108686d4996aa3f6306fdfcbcbfe98ea3e02f2a 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 fa3e9b13a2f7012aed495d03f5919ac58efb2e72..65800d25ddff4083fccc56b147893bb58b8f65f2 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/database/DatabaseImport.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseImporter;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import logger.Logger;
 import spark.Request;
 import spark.Response;
-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 199b19a2a283a7bce75bb9352d6af8d62489b679..93abe986555c5fe59b2a5e45b18d93de12de9527 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 eb77c8cbc3f574f2818093c2289864e174fa62bf..c2720a593ae67495768dfcff6e79985cb0716354 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 366973c54cdcafb79a0cff444bd926da7ba45f28..daf3cd9488a9f12fc1d4ba38a9a9ddfcd80c39fb 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 86a78819e0481f958bd4eaaef065f52b53519d11..b6bc9fd85da4272e16e8d2d0f8ce07673ed8a191 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 f0a059d1cb7fb0f628006ca844a2bdbb679ebde2..fe70574aa24ff13f1d01908331426bf316588bb5 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
@@ -4,13 +4,13 @@ import static spark.Spark.halt;
 
 import java.util.ArrayList;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 da8e0818163a5d99f5174c41543b740f4c2c66cb..d82b8842b3a37c968785968711fb2981e0867f8b 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 6c4215e4abb046abb0781f2458017858b2ccf57d..e0e94e52d9e2bbdb7f5a81e53188486d625759fd 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 72111cbffa878a2a8a1be9f6db7a03d4c8132cb8..05c1bd614d6f3b557f97cdc7f78148acda90c5fa 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
@@ -4,73 +4,78 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 0df80498598d4b81e4736201d11a44ba34f5481d..1ba52b1a2c90a42603eb733e8f2fcd1cc14c93f6 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
@@ -4,13 +4,13 @@ import static spark.Spark.halt;
 
 import java.util.ArrayList;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 5349848f24246bb03affc36ad554638fab1efbe3..f1ef2b2a38d0be9f6f710e9eb3e46f3d7089c1ab 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 ce617830abc32782ed64ca81ce56af1e03472576..88dbe39ffb5c270158febc78ceeed0a20c084985 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java
@@ -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.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 a8f40253bb8fb229128ca313bc0ecb10e29156f2..e64331e253b10ebaa7d919b8fd431a4224101912 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentMaxAmount.java
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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 9c7f3b639ded27953e5531f5d04c5823f125f87a..4c9a8987e82bdf727f7e067661d1c683cd1e2b27 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/payment/search/PaymentSearch.java
@@ -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.database.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 1ebdf5004b4a8bb8959018692b795aed4bd9cfd4..03e26be3425bf53cf418cd7aa6956a1e635bc6b2 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/rest/RestGet.java
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.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/shutdown/Shutdown.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/shutdown/Shutdown.java
new file mode 100644
index 0000000000000000000000000000000000000000..9befe246b7dd6b51c0da296e04479b13ba6a8efe
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/shutdown/Shutdown.java
@@ -0,0 +1,57 @@
+package de.deadlocker8.budgetmasterserver.server.shutdown;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import logger.Logger;
+import spark.Request;
+import spark.Response;
+
+public class Shutdown implements AdvancedRoute
+{	
+	private boolean shutdownInProgress;
+	
+	public Shutdown(boolean shutdownInProgress)
+	{
+		this.shutdownInProgress = shutdownInProgress;
+	}
+
+	@Override
+	public void before()
+	{
+	}
+
+	@Override
+	public Object handleRequest(Request req, Response res)
+	{
+		Logger.info("Shutting down server due to client request");
+		if(!shutdownInProgress)
+		{
+			shutdownInProgress = true;
+			TimerTask task = new TimerTask() 
+			{
+				@Override
+				public void run()
+				{
+					Logger.info("Shutdown DONE");
+					System.exit(0);		
+				}
+			};
+			
+			Timer timer = new Timer();
+			timer.schedule(task, 2000);
+			return "";
+		}
+		else
+		{
+			Logger.info("Shutdown is already scheduled");
+			return "";
+		}
+	}
+
+	@Override
+	public void after()
+	{
+	}
+}
\ 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 64b71a28e54300a9fd748761310f92bbbf5cdff4..85533edccee9ded42a02bb95ca0edcd3f65dcd8f 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForPayment.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 3eb1871ca76dde351b40491be4e862d1d6545eea..f82989dce43ad5d3f20d99d31d7822ef0f410fcd 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchAddForRepeatingPayment.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 9f676c0e8252312921ce688c2fb8ee95f2625dbb..b607b3fc8a475e88bd1298c850b69d6983e2bbef 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForPayment.java
@@ -2,13 +2,13 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 ab0e5a1c6fbac0c1eb5e2265513f2ee62fd93baf..e8d9b4dd61a70d470c03207e57680bd3d3e4cbf3 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchDeleteForRepeatingPayment.java
@@ -2,13 +2,13 @@ package de.deadlocker8.budgetmasterserver.server.tag.match;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 9d1bb98528bd1324a2b01e8b2ed4f9eadf690432..c14317c7e6318de787c50ddedcf476d0880f8619 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForPayment.java
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 5b6fda13a934ea9030b1eb3cffa970db02ab232b..6bc8dd8a2d84d8eb7ce2b0767d572c9dce76597c 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchExistingForRepeatingPayment.java
@@ -4,12 +4,12 @@ import static spark.Spark.halt;
 
 import com.google.gson.Gson;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 08a93ad9b39d992c4fd7d3efce79529266e37c9a..dcea960f421f1115b3eb11f1aa6b3b71abe93b52 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
@@ -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.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 7f8b4465060aacc42b46a88ce0054d82b1927a0b..45d3ec84f142eeb61b8d433bdf36d9a4093fccbe 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForRepeatingPayment.java
@@ -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.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 edd44ab77f1e03d4d1c19f640910a4e395ab5ab2..03dddec883199737478b354444cc5fcfbddbd250 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagAdd.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.tag;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 75d45f927b3601069b422cadd0ff2221d1d57069..df498f1d5260d39867692ce4f39133708e228d79 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagDelete.java
@@ -2,12 +2,12 @@ package de.deadlocker8.budgetmasterserver.server.tag.tag;
 
 import static spark.Spark.halt;
 
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 782df0b96bd7b4ba78fc064aa3eced912a45cf58..1a6f419b191e2c762250d394449550c18b9885b9 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
@@ -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.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 46f52361320184f834fa7d1e9b4d76797378bcf2..3fc9d143729c636eb20a22cd58a76a4e50807e46 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetAll.java
@@ -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.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 a4e7a898978ff76953b2d73bb199d7653e3a0059..c2d834a1b04e30820f5d305eb2fd89dcb9e87e9f 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
@@ -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.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.AdvancedRoute;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.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 0ad4e5f8836e6cbb69c6cae0cc16164e87351928..6baa1a309ee9fa16db207ec8692bec8bead0089e 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java
@@ -8,7 +8,7 @@ import org.joda.time.Months;
 
 import de.deadlocker8.budgetmaster.logic.payment.LatestRepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import logger.Logger;
 
 public class RepeatingPaymentUpdater
@@ -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)
@@ -82,8 +82,8 @@ public class RepeatingPaymentUpdater
 		if(payment.getRepeatInterval() != 0)
 		{			
 			int numberOfDays = Days.daysBetween(startDate, now).getDays();			
-			int occurrences = numberOfDays / payment.getRepeatInterval();				
-			for(int i = 0; i <= occurrences + 1; i++)
+			int occurrences = numberOfDays / payment.getRepeatInterval();
+			for(int i = 0; i <= occurrences; i++)
 			{
 				dates.add(startDate.plusDays(i * payment.getRepeatInterval()));
 			}
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
index 1263871aee24650744f3cf742506dbf93505bca9..1776c9be0d3ed3367181b8b5e588750c93b1b841 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmasterserver/server/updater/TagUpdater.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmasterserver.server.updater;
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 
 public class TagUpdater
 {
diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/_en.properties
index 5cb7f01cc467be6ffc386715960412e28a2df9c3..18fa55ffc20c2327236e5cd4c09f4e2676eb9dfc 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=13
+version.name=1.8.0
+version.date=17.12.17
 author=Robert Goldmann
 
 category.none=No Category
diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_certificate.crt b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_certificate.crt
new file mode 100644
index 0000000000000000000000000000000000000000..e64160ce6c2abbf275469868fcd6ecd512009fef
--- /dev/null
+++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_certificate.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDHjCCAgYCCQDMkgYSh6618zANBgkqhkiG9w0BAQsFADBQMQswCQYDVQQGEwJE
+RTEUMBIGA1UECgwLZGVhZGxvY2tlcjgxFTATBgNVBAsMDEJ1ZGdldE1hc3RlcjEU
+MBIGA1UEAwwLZGVhZGxvY2tlcjgwIBcNMTcxMTI1MTAwMzM3WhgPMjA4NTEyMTIx
+MDAzMzdaMFAxCzAJBgNVBAYTAkRFMRQwEgYDVQQKDAtkZWFkbG9ja2VyODEVMBMG
+A1UECwwMQnVkZ2V0TWFzdGVyMRQwEgYDVQQDDAtkZWFkbG9ja2VyODCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALzI08zIpuoK2zbgbOtAAEfwYxRZTeJr
+d0+iFAYPoCgDruh2ldO6BXGpanw1QYh0dFkW/o+DhfuYnFknpwxQrBWmlG/hjFbz
+QdT+5zefc1q6rX7tOJMFUY1Qj5s3l1ZFHAuD4kOUr8lgDQqoc4l4B+WTXiXPYnJh
++DcTH6oBHJVu40YXsTyGwBW+DDBn5VvkrhNkqqfedL/qQ0Nl41UTLOSG5Lg7hezP
+DQiG3mEbpugGbqWV5t2CgyPr0eZMQKKo2srKPm+aIDp0kWyOIR3B7Bv9Onp70/QM
+etMyLa9QWJyaGHaFkl7xwBwCl2L209iTYmJSC1GZQ252uT701VwIX70CAwEAATAN
+BgkqhkiG9w0BAQsFAAOCAQEAZSH6BN4J7vLhBnZAVXrqVv/+ALEuKOpWG9pk8jfF
+k1DWvH6NwIjrgrY13e6iEai/YbplGrb3U90bDF+kSH3fCu+9DueoSRlZ/pPmMDGT
+1hFXU0QNNV8rjWYlttndpzaHqnxitJ4ERBcts4sFLUFq+aIQdGYR5/gpQQcXmk10
+l3suT7O8NeSM7QGFO5rMm6k6XdLOBVvzaFwzuOwxOSvxV5dFwuRFuMxYddCnBGYH
+kyPom4WfRKCvcbNT6RvJWQvBX5YOjIXpOV4gmwVtBbmhxrkSQvE56zrc2mewH6MN
+dDTJmV5ZYlA4hXxSELOvmNqPE1SPtK3rNjtH55BtXuqvQQ==
+-----END CERTIFICATE-----
diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks
new file mode 100644
index 0000000000000000000000000000000000000000..5850e6d1244ed95c4abe60eaed0faee3ca80f247
Binary files /dev/null and b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/certificate/default_keystore.jks differ
diff --git a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json
index d2281ffa1e99ec74bc91d8b444c3a43dcf93f26b..bbe6f030a7ca760d8308ba046d6068565acf28e1 100644
--- a/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json
+++ b/BudgetMasterServer/src/main/resources/de/deadlocker8/budgetmasterserver/settings.json
@@ -1,10 +1,11 @@
 {
-	"databaseUrl": "jdbc:mysql://localhost:3306/",
+	"databaseType": "mysql",
+	"databaseUrl": "localhost:3306/",
 	"databaseName": "budgetmaster",
 	"databaseUsername": "root",
 	"databasePassword": "",
 	"serverPort": 9000,
-	"serverSecret": "geheim",
-	"keystorePath": "",
-	"keystorePassword": ""
+	"serverSecret": "BudgetMaster",
+	"keystorePath": "default",
+	"keystorePassword": "BudgetMaster"
 }
\ No newline at end of file
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 80f6b7c660425c26beea47feca4489dc9e2f64a2..216c65fc477c7f2bbb08dd09953a98d604225343 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,13 @@ import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
+import java.sql.Connection;
+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,7 +23,8 @@ import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.Utils;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
 import tools.Localization;
 
 public class DatabaseHandlerTest
@@ -34,27 +39,43 @@ public class DatabaseHandlerTest
 			//init
 			Settings settings = Utils.loadSettings();
 			System.out.println(settings);
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);			
-			databaseHandler = handler;
+			handler.closeConnection();
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			connection.close();
+			databaseHandler = Utils.getDatabaseHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
 		}
-		catch(IOException | URISyntaxException e)
+		catch(IOException | URISyntaxException | SQLException | ClassNotFoundException 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	
-		assertEquals(3, databaseHandler.getLastInsertID());		
+		assertEquals(3, databaseHandler.getLastInsertID());
 	}
 	
 	@Test
@@ -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 6414890b6acbe6bf4295bfe24ca998c3112e60ab..ad8214ff31ff313e87f87c9af999b24008256c7c 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,13 @@ 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.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;
 
@@ -25,9 +29,10 @@ 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.DatabaseExporter;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseImporter;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
 import tools.Localization;
 
 public class DatabaseImportExportTest
@@ -42,21 +47,40 @@ public class DatabaseImportExportTest
 		try
 		{
 			//init
-			settings = Utils.loadSettings();			
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			settings = Utils.loadSettings();
+			System.out.println(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);			
-			databaseHandler = handler;
-			tagHandler = new DatabaseTagHandler(settings);
+			handler.closeConnection();
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			connection.close();
+			databaseHandler = Utils.getDatabaseHandler(settings);
+			tagHandler = Utils.getDatabaseTagHandler(settings);
 			
 			Localization.init("de/deadlocker8/budgetmaster/");
 			Localization.loadLanguage(Locale.ENGLISH);
 		}
-		catch(IOException | URISyntaxException e)
+		catch(IOException | URISyntaxException | SQLException | ClassNotFoundException 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,7 +135,12 @@ public class DatabaseImportExportTest
 		try
 		{
 			databaseHandler.deleteDatabase();
-			databaseHandler = new DatabaseHandler(settings);
+			databaseHandler.closeConnection();
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			connection.close();			
+			databaseHandler = Utils.getDatabaseHandler(settings);;
 			
 			File file = Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json").toFile();
 			Database database = FileHelper.loadDatabaseJSON(file);			
@@ -124,7 +153,6 @@ public class DatabaseImportExportTest
 			Gson gson = new GsonBuilder().setPrettyPrinting().create();
 			String databaseJSON = gson.toJson(exporter.exportDatabase()).replaceAll("\n", "");
 			FileHelper.saveDatabaseJSON(file, databaseJSON);
-			FileHelper.saveDatabaseJSON(new File("C:/Users/ROGO2/Desktop/123.json"), databaseJSON);
 			
 			String expectedJSON = new String(Files.readAllBytes(Paths.get("src/test/resources/de/deadlocker8/budgetmaster/import.json")));
 			String exportedJSON = new String(Files.readAllBytes(Paths.get("src/test/resources/de/deadlocker8/budgetmaster/export.json")));		
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/database/DatabaseTagHandlerTest.java
index 475c0f7f4bd1c9076dcfdccdc335ebaec7b38c88..5a6520d6adca0f95bee5b059a64608b1c3341a27 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,23 @@ import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
+import java.sql.Connection;
+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.DatabaseHandler;
-import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.creator.DatabaseCreator;
+import de.deadlocker8.budgetmasterserver.logic.database.handler.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.taghandler.DatabaseTagHandler;
+import tools.Localization;
 
 public class DatabaseTagHandlerTest
 {			
@@ -31,17 +38,36 @@ public class DatabaseTagHandlerTest
 			//init
 			Settings settings = Utils.loadSettings();
 			System.out.println(settings);
-			DatabaseHandler handler = new DatabaseHandler(settings);
+			DatabaseHandler handler = Utils.getDatabaseHandler(settings);
 			handler.deleteDatabase();
-			handler = new DatabaseHandler(settings);			
-			tagHandler = new DatabaseTagHandler(settings);
+			handler.closeConnection();
+			Connection connection = Utils.getDatabaseConnection(settings);
+			DatabaseCreator creator = Utils.getDatabaseCreator(connection, settings);
+			creator.createTables();
+			connection.close();
+			tagHandler = Utils.getDatabaseTagHandler(settings);
+			
+			Localization.init("de/deadlocker8/budgetmaster/");
+			Localization.loadLanguage(Locale.ENGLISH);
 		}
-		catch(IOException | URISyntaxException e)
+		catch(IOException | URISyntaxException | SQLException | ClassNotFoundException e)
 		{
 			fail(e.getMessage());
 		}		
 	}
 	
+	@Before
+	public void before()
+	{
+		tagHandler.connect();
+	}
+	
+	@After
+	public void after()
+	{
+		tagHandler.closeConnection();
+	}
+	
 	@Test
 	public void testTag()
 	{
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java
index cd660fadeff8ab2b817352d3015b707c77277490..7a9329b642561f3b5ac477d8c3b5dc73f83a538c 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/tests/settings/SettingsTest.java
@@ -21,14 +21,15 @@ public class SettingsTest
 			Settings settings = Utils.loadSettings();
 			
 			Settings expectedSettings = new Settings();
-			expectedSettings.setDatabaseName("b");
-			expectedSettings.setDatabaseUrl("jdbc:mysql://localhost:3306/");
+			expectedSettings.setDatabaseType("mysql");
+			expectedSettings.setDatabaseName("budgetmaster");
+			expectedSettings.setDatabaseUrl("localhost:3306/");
 			expectedSettings.setDatabaseUsername("root");
 			expectedSettings.setDatabasePassword("");
 			expectedSettings.setServerPort(9000);
 			expectedSettings.setServerSecret("geheim");
-			expectedSettings.setKeystorePath("C:/Programmierung/eclipse/workspace/BudgetMaster/certs/keystore_self_signed.jks");
-			expectedSettings.setKeystorePassword("geheim");			
+			expectedSettings.setKeystorePath("default");
+			expectedSettings.setKeystorePassword("BudgetMaster");	
 			
 			assertEquals(expectedSettings, settings);
 		}
diff --git a/build/BudgetMaster.exe b/build/BudgetMaster.exe
index bf497806ee234597f91f0a3891f68e4c836c2285..6a6aa0f40879d9242e99776ec26ed2d4d2c1a1ff 100644
Binary files a/build/BudgetMaster.exe and b/build/BudgetMaster.exe differ
diff --git a/build/BudgetMasterClient.jar b/build/BudgetMasterClient.jar
index 2e38f51f849170e6c250a4b5fd10b95f0e274c84..51e41361cd4853255cc5d2bd66b309fd7cfc4b7a 100644
Binary files a/build/BudgetMasterClient.jar and b/build/BudgetMasterClient.jar differ
diff --git a/build/BudgetMasterServer.jar b/build/BudgetMasterServer.jar
index ec795a859b7993f3c0d6f012267de94560c6ff2b..18575b4177c1204c5aaa15a46ddce38b810aa2a3 100644
Binary files a/build/BudgetMasterServer.jar and b/build/BudgetMasterServer.jar differ
diff --git a/build/screenshots/de/einstellungen.png b/build/screenshots/de/einstellungen.png
deleted file mode 100644
index 8cff2ca926eb6c2b01f4434a4e243453baa9273c..0000000000000000000000000000000000000000
Binary files a/build/screenshots/de/einstellungen.png and /dev/null differ
diff --git a/build/screenshots/de/einstellungen_lokal.png b/build/screenshots/de/einstellungen_lokal.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ae0fe9bfc2a6490ab8e62362c4f472fee5cec8f
Binary files /dev/null and b/build/screenshots/de/einstellungen_lokal.png differ
diff --git a/build/screenshots/de/einstellungen_online.png b/build/screenshots/de/einstellungen_online.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d4cc15d436da341724632dbba5cc8dc5c5b8e99
Binary files /dev/null and b/build/screenshots/de/einstellungen_online.png differ
diff --git a/build/screenshots/en/einstellungen.png b/build/screenshots/en/einstellungen.png
deleted file mode 100644
index 532309227190e95a023c423f02bc50881a93254a..0000000000000000000000000000000000000000
Binary files a/build/screenshots/en/einstellungen.png and /dev/null differ
diff --git a/build/screenshots/en/einstellungen_lokal.png b/build/screenshots/en/einstellungen_lokal.png
new file mode 100644
index 0000000000000000000000000000000000000000..86b742c3a4c01d676e3c96f17cf3b4313e16a2b4
Binary files /dev/null and b/build/screenshots/en/einstellungen_lokal.png differ
diff --git a/build/screenshots/en/einstellungen_online.png b/build/screenshots/en/einstellungen_online.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a1b014f3451356d7f173679aa4e383db208fab8
Binary files /dev/null and b/build/screenshots/en/einstellungen_online.png differ
diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
index 3114aeb823a7934bbb0e852186f8f2a45ed35f6f..8f048a4c16783481359e7af4e4162ba9efd09023 100644
--- a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
+++ b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
@@ -1,4 +1,4 @@
 app.name=BudgetMaster
-version.code=11
-version.name=1.7.0
-version.date=26.10.17
\ No newline at end of file
+version.code=13
+version.name=1.8.0
+version.date=17.12.17
\ No newline at end of file