From 0177991394ccc0b1a38cfec8e8994aa0c0e3ceb5 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 26 Nov 2017 15:58:48 +0100
Subject: [PATCH] #235 - prepared second settings ui, cleaned
 SettingsController, updated Settings

---
 .../ui/controller/Controller.java             |  38 +-
 .../LocalServerSettingsController.java        | 243 ++++++++
 .../OnlineServerSettingsController.java       | 326 ++++++++++
 .../ui/controller/SettingsController.java     | 565 +-----------------
 .../utils/DatabaseDeleter.java                |  97 +++
 .../utils/DatabaseExporter.java               |  77 +++
 .../utils/DatabaseImporter.java               | 162 +++++
 .../budgetmaster/languages/_de.properties     |   5 +-
 .../budgetmaster/languages/_en.properties     |   5 +-
 .../budgetmaster/ui/fxml/SettingsTab.fxml     | 224 -------
 .../ui/fxml/SettingsTabLocalServer.fxml       | 217 +++++++
 .../ui/fxml/SettingsTabOnlineServer.fxml      | 235 ++++++++
 .../budgetmaster/logic/ServerType.java        |   6 +
 .../budgetmaster/logic/Settings.java          |  23 +-
 .../budgetmaster/logic/utils/Colors.java      |   1 +
 15 files changed, 1439 insertions(+), 785 deletions(-)
 create mode 100644 BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java
 create mode 100644 BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java
 create mode 100644 BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java
 create mode 100644 BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java
 create mode 100644 BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java
 delete mode 100644 BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml
 create mode 100644 BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml
 create mode 100644 BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml
 create mode 100644 BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java

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 f349f5f2e..f5902dac3 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;
@@ -112,7 +113,7 @@ public class Controller extends BaseController
 	
 	public Controller(Settings settings)
 	{
-		this.settings = settings;	
+		this.settings = settings;
 		DATE_FORMAT = DateTimeFormat.forPattern("MMMM yyyy").withLocale(this.settings.getLanguage().getLocale());
 		load("/de/deadlocker8/budgetmaster/ui/fxml/GUI.fxml", Localization.getBundle());
 		getStage().show();
@@ -139,6 +140,11 @@ public class Controller extends BaseController
 			System.exit(0);
 		});
 		
+		if(settings.getServerType() == null)
+		{
+			settings.setServerType(ServerType.ONLINE);
+		}
+		
 		currentDate = DateTime.now();
 		buttonDate.setText(currentDate.toString(DATE_FORMAT));
 		
@@ -186,7 +192,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 +228,7 @@ public class Controller extends BaseController
 				}
 			});
 			
-			settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml", tabSettings);
-			settingsController.init(this);		
+			loadSettingsTab();
 		}
 		catch(IOException e)
 		{
@@ -270,6 +275,31 @@ public class Controller extends BaseController
 			refresh(filterSettings);
 		}
 	}
+	
+	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 Image getIcon()
 	{
diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java
new file mode 100644
index 000000000..1f5350ea3
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java
@@ -0,0 +1,243 @@
+package de.deadlocker8.budgetmasterclient.ui.controller;
+
+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.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 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;
+
+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;
+
+	@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);
+		
+		prefill();
+		
+		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();
+	}
+	
+	public void prefill()
+	{
+		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());
+	}
+	
+	@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().trim();
+		String currency = textFieldCurrency.getText().trim();
+		
+		if(clientSecret == null || clientSecret.equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, 
+									Localization.getString(Strings.TITLE_WARNING), 
+									"",
+									Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT),
+									controller.getIcon(), 
+									controller.getStage(), 
+									null, 
+									false);
+			return;
+		}
+
+		if(currency == null || currency.equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, 
+									Localization.getString(Strings.TITLE_WARNING), 
+									"", 
+									Localization.getString(Strings.WARNING_EMPTY_CURRENCY),
+									controller.getIcon(), 
+									controller.getStage(), 
+									null, 
+									false);
+			return;
+		}
+
+		//TODO
+		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().setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT));
+		controller.getSettings().setUrl("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();
+	}
+
+	@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;");
+		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/OnlineServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java
new file mode 100644
index 000000000..5d6f616d3
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java
@@ -0,0 +1,326 @@
+package de.deadlocker8.budgetmasterclient.ui.controller;
+
+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.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 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.TextArea;
+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;
+
+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;
+	@FXML private Label labelURL;
+	@FXML private TextField textFieldSecret;
+	@FXML private Label labelSecret;
+	@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 TextArea textAreaTrustedHosts;
+	@FXML private ComboBox<LanguageType> comboBoxLanguage;
+	@FXML private CheckBox checkboxEnableAutoUpdate;
+	@FXML private Button buttonSearchUpdates;
+	@FXML private Label labelCurrentVersion;
+	@FXML private Label labelLatestVersion;
+
+	private LanguageType previousLanguage;
+
+	@Override
+	public void init(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("******");		
+		
+		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);
+		
+		prefill();
+		
+		applyStyle();
+
+		textFieldURL.setPromptText(Localization.getString(Strings.URL_PLACEHOLDER));
+		textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER));
+		textAreaTrustedHosts.setPromptText(Localization.getString(Strings.TRUSTED_HOSTS_PLACEHOLDER));
+
+		ToggleGroup toggleGroup = new ToggleGroup();
+		radioButtonRestActivated.setToggleGroup(toggleGroup);
+		radioButtonRestDeactivated.setToggleGroup(toggleGroup);
+		
+		hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25));
+		
+		refreshLabelsUpdate();
+	}
+	
+	@Override
+	public void prefill()
+	{
+		if(controller.getSettings().isComplete())
+		{
+			textFieldURL.setText(controller.getSettings().getUrl());
+			textFieldSecret.setText("******");
+			textFieldCurrency.setText(controller.getSettings().getCurrency());		
+		}
+		
+		if(controller.getSettings().isRestActivated())
+		{
+			radioButtonRestActivated.setSelected(true);
+		}
+		else
+		{
+			radioButtonRestDeactivated.setSelected(true);
+		}		
+		setTextAreaTrustedHosts(controller.getSettings().getTrustedHosts());
+		if(controller.getSettings().getLanguage() != null)
+		{
+			LanguageType language = controller.getSettings().getLanguage();
+			comboBoxLanguage.setValue(language);
+			previousLanguage = language;
+		}
+		
+		checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled());
+	}
+	
+	@Override
+	void refreshLabelsUpdate()
+	{
+		Updater updater = controller.getUpdater();
+		labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME));
+		labelLatestVersion.setText(updater.getLatestVersion().getVersionName());
+	}
+
+	private void setTextAreaTrustedHosts(ArrayList<String> trustedHosts)
+	{
+		StringBuilder trustedHostsString = new StringBuilder();
+		if(trustedHosts != null)
+		{
+			for(String currentHost : trustedHosts)
+			{
+				trustedHostsString.append(currentHost);
+				trustedHostsString.append("\n");
+			}
+			textAreaTrustedHosts.setText(trustedHostsString.toString());
+		}
+		else
+		{
+			textAreaTrustedHosts.setText("");
+		}
+	}
+
+	@Override
+	public void save()
+	{
+		String clientSecret = textFieldClientSecret.getText().trim();
+		String url = textFieldURL.getText().trim();
+		String secret = textFieldSecret.getText().trim();
+		String currency = textFieldCurrency.getText().trim();
+		
+		if(clientSecret == null || clientSecret.equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, 
+									Localization.getString(Strings.TITLE_WARNING), 
+									"",
+									Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT),
+									controller.getIcon(), 
+									controller.getStage(), 
+									null, 
+									false);
+			return;
+		}
+		
+		if(url == null || url.equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, 
+									Localization.getString(Strings.TITLE_WARNING), 
+									"", 
+									Localization.getString(Strings.WARNING_EMPTY_URL),
+									controller.getIcon(), 
+									controller.getStage(),
+									null, 
+									false);
+			return;
+		}
+
+		if(secret == null || secret.equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, 
+									Localization.getString(Strings.TITLE_WARNING), 
+									"", 
+									Localization.getString(Strings.WARNING_EMPTY_SECRET_SERVER), 
+									controller.getIcon(), 
+									controller.getStage(), 
+									null, 
+									false);
+			return;
+		}
+
+		if(currency == null || currency.equals(""))
+		{
+			AlertGenerator.showAlert(AlertType.WARNING, 
+									Localization.getString(Strings.TITLE_WARNING), 
+									"", 
+									Localization.getString(Strings.WARNING_EMPTY_CURRENCY),
+									controller.getIcon(), 
+									controller.getStage(), 
+									null, 
+									false);
+			return;
+		}
+
+		ArrayList<String> trustedHosts = new ArrayList<>();
+		String trustedHostText = textAreaTrustedHosts.getText();
+		String[] trustedHostsArray = trustedHostText.split("\n");
+		for(String currentHost : trustedHostsArray)
+		{
+			currentHost = currentHost.trim();
+			if(!currentHost.equals(""))
+			{
+				trustedHosts.add(currentHost);
+			}
+		}
+		setTextAreaTrustedHosts(trustedHosts);
+
+		if(controller.getSettings().isComplete())
+		{
+			if(!clientSecret.equals("******"))
+			{
+				controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT));
+			}
+			
+			if(!secret.equals("******"))
+			{
+				controller.getSettings().setSecret(HashUtils.hash(secret, Helpers.SALT));
+			}
+			controller.getSettings().setUrl(url);
+			controller.getSettings().setCurrency(currency);
+			controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected());
+			controller.getSettings().setTrustedHosts(trustedHosts);
+			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());
+			}
+			
+			if(!secret.equals("******"))
+			{
+				settings.setSecret(HashUtils.hash(secret, Helpers.SALT));
+			}
+			else
+			{
+				settings.setSecret(controller.getSettings().getSecret());
+			}
+			settings.setUrl(url);			
+			settings.setCurrency(currency);
+			settings.setRestActivated(radioButtonRestActivated.isSelected());
+			settings.setTrustedHosts(trustedHosts);
+			settings.setLanguage(comboBoxLanguage.getValue());
+			settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected());
+			controller.setSettings(settings);
+		}
+
+		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("******");
+		textFieldSecret.setText("******");
+
+		RestartHandler restartHandler = new RestartHandler(controller);
+		restartHandler.handleRestart(previousLanguage);
+		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));
+		labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
+		buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");
+		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/SettingsController.java
index 21f167626..05bedc47d 100644
--- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java
@@ -1,578 +1,43 @@
 package de.deadlocker8.budgetmasterclient.ui.controller;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Optional;
-
-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;
-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 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.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;
+import de.deadlocker8.budgetmasterclient.utils.DatabaseDeleter;
+import de.deadlocker8.budgetmasterclient.utils.DatabaseExporter;
+import de.deadlocker8.budgetmasterclient.utils.DatabaseImporter;
 
-public class SettingsController implements Styleable
+public abstract class SettingsController implements Styleable
 {
-	@FXML private AnchorPane anchorPaneMain;
-	@FXML private ScrollPane scrollPane;
-	@FXML private HBox hboxSettings;
-	@FXML private Label labelClientSecret;
-	@FXML private TextField textFieldClientSecret;
-	@FXML private TextField textFieldURL;
-	@FXML private Label labelURL;
-	@FXML private TextField textFieldSecret;
-	@FXML private Label labelSecret;
-	@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 TextArea textAreaTrustedHosts;
-	@FXML private ComboBox<LanguageType> comboBoxLanguage;
-	@FXML private CheckBox checkboxEnableAutoUpdate;
-	@FXML private Button buttonSearchUpdates;
-	@FXML private Label labelCurrentVersion;
-	@FXML private Label labelLatestVersion;
-
-	private Controller controller;
-	private LanguageType previousLanguage;
-
-	public void init(Controller controller)
-	{
-		this.controller = controller;
-		
-		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);
-		
-		prefill();
-		
-		applyStyle();
-
-		textFieldURL.setPromptText(Localization.getString(Strings.URL_PLACEHOLDER));
-		textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER));
-		textAreaTrustedHosts.setPromptText(Localization.getString(Strings.TRUSTED_HOSTS_PLACEHOLDER));
+	Controller controller;
 
-		ToggleGroup toggleGroup = new ToggleGroup();
-		radioButtonRestActivated.setToggleGroup(toggleGroup);
-		radioButtonRestDeactivated.setToggleGroup(toggleGroup);
-		
-		hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25));
-		
-		refreshLabelsUpdate();
-	}
+	public abstract void init(Controller controller);
 	
-	public void prefill()
-	{
-		if(controller.getSettings().isComplete())
-		{
-			textFieldURL.setText(controller.getSettings().getUrl());
-			textFieldSecret.setText("******");
-			textFieldCurrency.setText(controller.getSettings().getCurrency());		
-		}
-		
-		if(controller.getSettings().isRestActivated())
-		{
-			radioButtonRestActivated.setSelected(true);
-		}
-		else
-		{
-			radioButtonRestDeactivated.setSelected(true);
-		}		
-		setTextAreaTrustedHosts(controller.getSettings().getTrustedHosts());
-		if(controller.getSettings().getLanguage() != null)
-		{
-			LanguageType language = controller.getSettings().getLanguage();
-			comboBoxLanguage.setValue(language);
-			previousLanguage = language;
-		}
-		
-		checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled());
-	}
+	public abstract void prefill();
 	
-	private void refreshLabelsUpdate()
-	{
-		Updater updater = controller.getUpdater();
-		labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME));
-		labelLatestVersion.setText(updater.getLatestVersion().getVersionName());
-	}
-
-	private void setTextAreaTrustedHosts(ArrayList<String> trustedHosts)
-	{
-		StringBuilder trustedHostsString = new StringBuilder();
-		if(trustedHosts != null)
-		{
-			for(String currentHost : trustedHosts)
-			{
-				trustedHostsString.append(currentHost);
-				trustedHostsString.append("\n");
-			}
-			textAreaTrustedHosts.setText(trustedHostsString.toString());
-		}
-		else
-		{
-			textAreaTrustedHosts.setText("");
-		}
-	}
-
-	public void save()
-	{
-		String clientSecret = textFieldClientSecret.getText().trim();
-		String url = textFieldURL.getText().trim();
-		String secret = textFieldSecret.getText().trim();
-		String currency = textFieldCurrency.getText().trim();
-		
-		if(clientSecret == null || clientSecret.equals(""))
-		{
-			AlertGenerator.showAlert(AlertType.WARNING, 
-									Localization.getString(Strings.TITLE_WARNING), 
-									"",
-									Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT),
-									controller.getIcon(), 
-									controller.getStage(), 
-									null, 
-									false);
-			return;
-		}
-		
-		if(url == null || url.equals(""))
-		{
-			AlertGenerator.showAlert(AlertType.WARNING, 
-									Localization.getString(Strings.TITLE_WARNING), 
-									"", 
-									Localization.getString(Strings.WARNING_EMPTY_URL),
-									controller.getIcon(), 
-									controller.getStage(),
-									null, 
-									false);
-			return;
-		}
-
-		if(secret == null || secret.equals(""))
-		{
-			AlertGenerator.showAlert(AlertType.WARNING, 
-									Localization.getString(Strings.TITLE_WARNING), 
-									"", 
-									Localization.getString(Strings.WARNING_EMPTY_SECRET_SERVER), 
-									controller.getIcon(), 
-									controller.getStage(), 
-									null, 
-									false);
-			return;
-		}
-
-		if(currency == null || currency.equals(""))
-		{
-			AlertGenerator.showAlert(AlertType.WARNING, 
-									Localization.getString(Strings.TITLE_WARNING), 
-									"", 
-									Localization.getString(Strings.WARNING_EMPTY_CURRENCY),
-									controller.getIcon(), 
-									controller.getStage(), 
-									null, 
-									false);
-			return;
-		}
-
-		ArrayList<String> trustedHosts = new ArrayList<>();
-		String trustedHostText = textAreaTrustedHosts.getText();
-		String[] trustedHostsArray = trustedHostText.split("\n");
-		for(String currentHost : trustedHostsArray)
-		{
-			currentHost = currentHost.trim();
-			if(!currentHost.equals(""))
-			{
-				trustedHosts.add(currentHost);
-			}
-		}
-		setTextAreaTrustedHosts(trustedHosts);
-
-		if(controller.getSettings().isComplete())
-		{
-			if(!clientSecret.equals("******"))
-			{
-				controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT));
-			}
-			
-			if(!secret.equals("******"))
-			{
-				controller.getSettings().setSecret(HashUtils.hash(secret, Helpers.SALT));
-			}
-			controller.getSettings().setUrl(url);
-			controller.getSettings().setCurrency(currency);
-			controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected());
-			controller.getSettings().setTrustedHosts(trustedHosts);
-			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());
-			}
-			
-			if(!secret.equals("******"))
-			{
-				settings.setSecret(HashUtils.hash(secret, Helpers.SALT));
-			}
-			else
-			{
-				settings.setSecret(controller.getSettings().getSecret());
-			}
-			settings.setUrl(url);			
-			settings.setCurrency(currency);
-			settings.setRestActivated(radioButtonRestActivated.isSelected());
-			settings.setTrustedHosts(trustedHosts);
-			settings.setLanguage(comboBoxLanguage.getValue());
-			settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected());
-			controller.setSettings(settings);
-		}
-
-		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);
-		}
+	abstract void refreshLabelsUpdate();
 
-		textFieldClientSecret.setText("******");
-		textFieldSecret.setText("******");
-
-		RestartHandler restartHandler = new RestartHandler(controller);
-		restartHandler.handleRestart(previousLanguage);
-		refreshLabelsUpdate();
-	}
+	public abstract void save();
 
 	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);
-				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());
-		}
+		DatabaseExporter exporter = new DatabaseExporter(controller);
+		exporter.exportDatabase();
 	}
 
 	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();
-		}		
+		DatabaseImporter importer = new DatabaseImporter(controller);
+		importer.importDatabase();	
 	}
 	
 	public void deleteDB()
 	{
-		deleteDatabase(false);
+		DatabaseDeleter deleter = new DatabaseDeleter(controller);
+		deleter.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");
-		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));
-		labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT));
-		buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");
-		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/utils/DatabaseDeleter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java
new file mode 100644
index 000000000..b750a8bf0
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java
@@ -0,0 +1,97 @@
+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))
+			{
+				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)
+								{
+									DatabaseImporter importer = new DatabaseImporter(controller);
+									importer.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);
+			}
+		}
+	}
+}
\ 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 000000000..43ebbd852
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java
@@ -0,0 +1,77 @@
+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 de.deadlocker8.budgetmasterclient.utils.UIHelpers;
+import javafx.application.Platform;
+import javafx.scene.control.Alert.AlertType;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+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)
+		{
+			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));						
+					});
+				}
+			});
+		}
+
+	}
+}
\ 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 000000000..1213adb50
--- /dev/null
+++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java
@@ -0,0 +1,162 @@
+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 de.deadlocker8.budgetmasterclient.utils.UIHelpers;
+import javafx.application.Platform;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
+import javafx.scene.control.DialogPane;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.ButtonBar.ButtonData;
+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();
+		}
+	}
+	
+	private 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;
+			}
+
+			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());
+		}
+	}
+}
\ 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 d9136a90a..9408c7b3c 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties
@@ -294,6 +294,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 +313,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:
 
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 c392f9d75..d5b062fb3 100644
--- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties
@@ -294,6 +294,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 +313,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/SettingsTab.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml
deleted file mode 100644
index c853b86e2..000000000
--- 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 000000000..b696f8b9d
--- /dev/null
+++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml
@@ -0,0 +1,217 @@
+<?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.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>
+                              </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 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="%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 000000000..2c5721982
--- /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.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 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="%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/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 000000000..9db45810d
--- /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 a0dbe9f2a..dd115b4e2 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/utils/Colors.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java
index 7d394d248..1403601fb 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;
-- 
GitLab