From 39557ef852d16062703b409dac2bb1a4322ce311 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 9 Aug 2017 19:25:51 +0200
Subject: [PATCH] Fixed #136 - export charts with new stage (in correct pixel
 values) reorderd class and package structure

---
 .../chartGenerators/BarChartGenerator.java    | 129 ------------------
 .../logic/chartGenerators/LegendType.java     |   6 -
 .../chartGenerators/PieChartGenerator.java    | 125 -----------------
 .../CategoriesChart.java                      |   6 +-
 .../ChartExportable.java                      |   6 +-
 .../budgetmaster/logic/charts/LegendType.java |   6 +
 .../MonthBarChart.java}                       |  67 ++++++++-
 .../MonthLineChart.java}                      |  42 +++++-
 .../logic/report/ReportGenerator.java         |   2 +-
 .../ExceptionHandler.java                     |   2 +-
 .../ServerConnection.java                     |  11 +-
 .../ServerConnectionException.java            |   2 +-
 .../{Utils.java => utils/FileHelper.java}     |   5 +-
 .../logic/{ => utils}/Helpers.java            |   2 +-
 .../budgetmaster/ui/CategoryController.java   |   4 +-
 .../budgetmaster/ui/ChartController.java      |  92 +++++--------
 .../deadlocker8/budgetmaster/ui/ChartTab.fxml |  10 +-
 .../budgetmaster/ui/Controller.java           |   6 +-
 .../ui/ExportChartController.java             |   6 +-
 .../budgetmaster/ui/HomeController.java       |   2 +-
 .../ui/NewCategoryController.java             |   4 +-
 .../budgetmaster/ui/NewPaymentController.java |   6 +-
 .../budgetmaster/ui/PaymentController.java    |   6 +-
 .../budgetmaster/ui/ReportController.java     |   2 +-
 .../budgetmaster/ui/SettingsController.java   |  14 +-
 .../ui/SplashScreenController.java            |   8 +-
 .../ui/cells/CategoryBudgetCell.java          |   2 +-
 .../budgetmaster/ui/cells/PaymentCell.java    |   2 +-
 .../server/SparkServer.java                   |   2 +-
 .../database/DatabaseImportExportTest.java    |   7 +-
 30 files changed, 211 insertions(+), 373 deletions(-)
 delete mode 100644 src/de/deadlocker8/budgetmaster/logic/chartGenerators/BarChartGenerator.java
 delete mode 100644 src/de/deadlocker8/budgetmaster/logic/chartGenerators/LegendType.java
 delete mode 100644 src/de/deadlocker8/budgetmaster/logic/chartGenerators/PieChartGenerator.java
 rename src/de/deadlocker8/budgetmaster/logic/{chartGenerators => charts}/CategoriesChart.java (98%)
 rename src/de/deadlocker8/budgetmaster/logic/{chartGenerators => charts}/ChartExportable.java (57%)
 create mode 100644 src/de/deadlocker8/budgetmaster/logic/charts/LegendType.java
 rename src/de/deadlocker8/budgetmaster/logic/{chartGenerators/MonthChartGenerator.java => charts/MonthBarChart.java} (71%)
 rename src/de/deadlocker8/budgetmaster/logic/{chartGenerators/LineChartGenerator.java => charts/MonthLineChart.java} (73%)
 rename src/de/deadlocker8/budgetmaster/logic/{ => serverconnection}/ExceptionHandler.java (95%)
 rename src/de/deadlocker8/budgetmaster/logic/{ => serverconnection}/ServerConnection.java (96%)
 rename src/de/deadlocker8/budgetmaster/logic/{ => serverconnection}/ServerConnectionException.java (91%)
 rename src/de/deadlocker8/budgetmaster/logic/{Utils.java => utils/FileHelper.java} (93%)
 rename src/de/deadlocker8/budgetmaster/logic/{ => utils}/Helpers.java (98%)

diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/BarChartGenerator.java b/src/de/deadlocker8/budgetmaster/logic/chartGenerators/BarChartGenerator.java
deleted file mode 100644
index 6517e2613..000000000
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/BarChartGenerator.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Set;
-
-import de.deadlocker8.budgetmaster.logic.Helpers;
-import de.deadlocker8.budgetmaster.logic.MonthInOutSum;
-import javafx.event.EventHandler;
-import javafx.geometry.Point2D;
-import javafx.scene.Node;
-import javafx.scene.chart.BarChart;
-import javafx.scene.chart.CategoryAxis;
-import javafx.scene.chart.NumberAxis;
-import javafx.scene.chart.XYChart;
-import javafx.scene.control.Label;
-import javafx.scene.control.Tooltip;
-import javafx.scene.input.MouseEvent;
-
-@Deprecated
-public class BarChartGenerator
-{
-	private ArrayList<MonthInOutSum> monthInOutSums;
-	private String currency;
-
-	public BarChartGenerator(ArrayList<MonthInOutSum> monthInOutSums, String currency)
-	{
-		this.monthInOutSums = monthInOutSums;
-		this.currency = currency;
-	}
-
-	public BarChart<String, Number> generate()
-	{
-		final CategoryAxis xAxis = new CategoryAxis();
-		final NumberAxis yAxis = new NumberAxis();
-		final BarChart<String, Number> generatedChart = new BarChart<>(xAxis, yAxis);
-		generatedChart.setTitle(null);
-
-		xAxis.setLabel("");
-		yAxis.setLabel("Summe in " + currency);
-
-		XYChart.Series<String, Number> seriesIN = new XYChart.Series<String, Number>();
-		seriesIN.setName("Einnahmen");
-		XYChart.Series<String, Number> seriesOUT = new XYChart.Series<String, Number>();
-		seriesOUT.setName("Ausgaben");
-
-		for(MonthInOutSum currentItem : monthInOutSums)
-		{
-			String label = currentItem.getDate().toString("MMMM YY");
-
-			seriesIN.getData().add(new XYChart.Data<String, Number>(label, currentItem.getBudgetIN()/100.0));
-			seriesOUT.getData().add(new XYChart.Data<String, Number>(label, currentItem.getBudgetOUT()/100.0));
-		}
-
-		generatedChart.getData().add(seriesIN);
-		generatedChart.getData().add(seriesOUT);
-
-		generatedChart.setLegendVisible(true);
-		
-		// add tooltip to every segment
-		generatedChart.getData().stream().forEach(tool -> {
-			for(XYChart.Data<String, Number> data : tool.getData())
-			{
-				Tooltip tooltip = new Tooltip();
-
-				tooltip.setText(Helpers.getCurrencyString(data.getYValue().doubleValue(), currency));
-				Tooltip.install(tool.getNode(), tooltip);
-				Node node = data.getNode();
-				node.setOnMouseEntered(new EventHandler<MouseEvent>()
-				{
-					@Override
-					public void handle(MouseEvent event)
-					{
-						Point2D p = node.localToScreen(event.getX() + 5, event.getY() + 7);
-						tooltip.show(node, p.getX(), p.getY());
-					}
-				});
-				node.setOnMouseExited(new EventHandler<MouseEvent>()
-				{
-
-					@Override
-					public void handle(MouseEvent event)
-					{
-						tooltip.hide();
-					}
-				});
-			}
-		});
-		
-		// style bar for incomes
-		for(Node n : generatedChart.lookupAll(".default-color0.chart-bar"))
-		{
-			n.setStyle("-fx-bar-fill: " + Helpers.COLOR_INCOME + ";");
-		}		
-		
-		// style bar for payments
-		for(Node n : generatedChart.lookupAll(".default-color1.chart-bar"))
-		{
-			n.setStyle("-fx-bar-fill: " + Helpers.COLOR_PAYMENT + ";");
-		}
-		
-		 //style legend item according to color
-		Set<Node> nodes = generatedChart.lookupAll(".chart-legend-item");
-		if(nodes.size() > 0)
-		{        	
-			Iterator<Node> iterator = nodes.iterator();
-			int counter = 0;
-			while(iterator.hasNext())
-			{
-    			Node node = iterator.next();	        			
-    			if(node instanceof Label)
-    			{
-    				Label labelLegendItem = (Label)node;     
-    				if(counter == 0)
-    				{
-    					labelLegendItem.getGraphic().setStyle("-fx-background-color: " + Helpers.COLOR_INCOME + ";");
-    				}
-    				else
-    				{
-    					labelLegendItem.getGraphic().setStyle("-fx-background-color: " + Helpers.COLOR_PAYMENT + ";");
-    				}
-    			}
-    			counter++;
-			}
-		}
-
-		return generatedChart;
-	}
-}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LegendType.java b/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LegendType.java
deleted file mode 100644
index f597aff27..000000000
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LegendType.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
-
-public enum LegendType
-{
-	NONE, NORMAL, FULL;
-}
diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/PieChartGenerator.java b/src/de/deadlocker8/budgetmaster/logic/chartGenerators/PieChartGenerator.java
deleted file mode 100644
index d2b527b77..000000000
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/PieChartGenerator.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Set;
-
-import de.deadlocker8.budgetmaster.logic.CategoryInOutSum;
-import de.deadlocker8.budgetmaster.logic.Helpers;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.event.EventHandler;
-import javafx.geometry.Point2D;
-import javafx.scene.Node;
-import javafx.scene.chart.PieChart;
-import javafx.scene.control.Label;
-import javafx.scene.control.Tooltip;
-import javafx.scene.input.MouseEvent;
-import tools.ConvertTo;
-
-@Deprecated
-public class PieChartGenerator
-{
-    private String title;
-    private ArrayList<CategoryInOutSum> categoryInOutSums;
-    private boolean useBudgetIN;
-    private String currency;
-
-    public PieChartGenerator(String title, ArrayList<CategoryInOutSum> categoryInOutSums, boolean useBudgetIN, String currency)
-    {
-        this.title = title;
-        this.categoryInOutSums = categoryInOutSums;
-        this.useBudgetIN = useBudgetIN;
-        this.currency = currency;
-    }
-  
-    public PieChart generate()
-    {
-        ArrayList<PieChart.Data> data = new ArrayList<>();
-        
-        for(CategoryInOutSum currentItem : categoryInOutSums)
-        {        	
-        	String label = currentItem.getName(); 
-        	if(label.equals("NONE"))
-        	{
-        		label = "Keine Kategorie";
-        	}
-        	
-        	if(useBudgetIN)
-        	{
-        		data.add(new PieChart.Data(label, currentItem.getBudgetIN()/100.0));
-        	}
-        	else
-        	{
-        		data.add(new PieChart.Data(label, -currentItem.getBudgetOUT()/100.0));
-        	}
-        }
-        
-        ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(data);
-
-        final PieChart chart = new PieChart(pieChartData);
-        chart.setTitle(title);
-
-        //add tooltip to every segment that shows percentage as double value
-        chart.getData().stream().forEach(tool ->
-        {
-            Tooltip tooltip = new Tooltip();
-
-            double total = 0;
-            for(int i = 0; i < chart.getData().size(); i++)
-            {
-            	PieChart.Data currentData = chart.getData().get(i);
-                total += currentData.getPieValue();
-                String currentColor = ConvertTo.toRGBHexWithoutOpacity(categoryInOutSums.get(i).getColor());
-                currentData.getNode().setStyle("-fx-pie-color: " + currentColor + ";");
-            }    
-            
-            //style legend item according to color
-    		Set<Node> nodes = chart.lookupAll(".chart-legend-item");
-    		if(nodes.size() > 0)
-    		{        	
-    			Iterator<Node> iterator = nodes.iterator();
-    			int counter = 0;
-    			while(iterator.hasNext())
-    			{
-        			Node node = iterator.next();	        			
-        			if(node instanceof Label)
-        			{
-        				Label labelLegendItem = (Label)node;        				
-        				labelLegendItem.getGraphic().setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(categoryInOutSums.get(counter).getColor()) + ";");
-        			}
-        			counter++;
-    			}
-    		}
-
-            double pieValue = tool.getPieValue();
-            double percentage = (pieValue / total) * 100;
-            String percent = String.valueOf(percentage);
-            percent = percent.substring(0, percent.indexOf(".") + 2);
-
-            tooltip.setText(percent + " %\n" + Helpers.getCurrencyString(pieValue, currency));
-            Tooltip.install(tool.getNode(), tooltip);
-            Node node = tool.getNode();
-            node.setOnMouseEntered(new EventHandler<MouseEvent>()
-            {
-                @Override
-                public void handle(MouseEvent event)
-                {
-                    Point2D p = node.localToScreen(event.getX() + 5, event.getY() + 7);
-                    tooltip.show(node, p.getX(), p.getY());
-                }
-            });
-            node.setOnMouseExited(new EventHandler<MouseEvent>()
-            {
-
-                @Override
-                public void handle(MouseEvent event)
-                {
-                    tooltip.hide();
-                }
-            });
-        });
-
-        return chart;
-    }
-}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/CategoriesChart.java b/src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java
similarity index 98%
rename from src/de/deadlocker8/budgetmaster/logic/chartGenerators/CategoriesChart.java
rename to src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java
index d94618d06..17603ae33 100644
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/CategoriesChart.java
+++ b/src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java
@@ -1,9 +1,9 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
+package de.deadlocker8.budgetmaster.logic.charts;
 
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.CategoryInOutSum;
-import de.deadlocker8.budgetmaster.logic.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
 import javafx.scene.Scene;
@@ -295,7 +295,9 @@ public class CategoriesChart extends VBox implements ChartExportable
 	public WritableImage export(int width, int height)
 	{
 		VBox root = new VBox();
+		root.setStyle("-fx-background-color: transparent;");
 		root.setPadding(new Insets(25));
+		
 		root.getChildren().add(generate(titleIncomes, true));
 		root.getChildren().add(generate(titlePayments, false));
 		
diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/ChartExportable.java b/src/de/deadlocker8/budgetmaster/logic/charts/ChartExportable.java
similarity index 57%
rename from src/de/deadlocker8/budgetmaster/logic/chartGenerators/ChartExportable.java
rename to src/de/deadlocker8/budgetmaster/logic/charts/ChartExportable.java
index 2189d23a2..2077c7b06 100644
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/ChartExportable.java
+++ b/src/de/deadlocker8/budgetmaster/logic/charts/ChartExportable.java
@@ -1,8 +1,12 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
+package de.deadlocker8.budgetmaster.logic.charts;
 
 import javafx.scene.image.WritableImage;
 
 public interface ChartExportable
 {
 	WritableImage export(int width, int height);
+	
+	double getWidth();
+	
+	double getHeight();
 }
diff --git a/src/de/deadlocker8/budgetmaster/logic/charts/LegendType.java b/src/de/deadlocker8/budgetmaster/logic/charts/LegendType.java
new file mode 100644
index 000000000..d9f8e6a41
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/charts/LegendType.java
@@ -0,0 +1,6 @@
+package de.deadlocker8.budgetmaster.logic.charts;
+
+public enum LegendType
+{
+	NONE, NORMAL, FULL;
+}
diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/MonthChartGenerator.java b/src/de/deadlocker8/budgetmaster/logic/charts/MonthBarChart.java
similarity index 71%
rename from src/de/deadlocker8/budgetmaster/logic/chartGenerators/MonthChartGenerator.java
rename to src/de/deadlocker8/budgetmaster/logic/charts/MonthBarChart.java
index dd2a0cdef..cdc88fc93 100644
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/MonthChartGenerator.java
+++ b/src/de/deadlocker8/budgetmaster/logic/charts/MonthBarChart.java
@@ -1,30 +1,39 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
+package de.deadlocker8.budgetmaster.logic.charts;
 
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.CategoryInOutSum;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.MonthInOutSum;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import javafx.geometry.Insets;
 import javafx.geometry.Orientation;
 import javafx.geometry.Pos;
+import javafx.scene.Scene;
+import javafx.scene.SnapshotParameters;
 import javafx.scene.control.Label;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.ScrollPane.ScrollBarPolicy;
 import javafx.scene.control.Separator;
 import javafx.scene.control.Tooltip;
+import javafx.scene.image.WritableImage;
 import javafx.scene.layout.GridPane;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.Priority;
+import javafx.scene.layout.Region;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
 import javafx.scene.text.TextAlignment;
+import javafx.scene.transform.Transform;
+import javafx.stage.Modality;
+import javafx.stage.Stage;
 import tools.ConvertTo;
 
-public class MonthChartGenerator
+public class MonthBarChart extends VBox implements ChartExportable
 {
 	private ArrayList<MonthInOutSum> monthInOutSums;
 	private String currency;
 
-	public MonthChartGenerator(ArrayList<MonthInOutSum> monthInOutSums, String currency)
+	public MonthBarChart(ArrayList<MonthInOutSum> monthInOutSums, String currency)
 	{
 		if(monthInOutSums == null)
 		{
@@ -34,10 +43,24 @@ public class MonthChartGenerator
 		{
 			this.monthInOutSums = monthInOutSums;
 		}
-		this.currency = currency;
+		this.currency = currency;	
+		
+		ScrollPane scrollPane = new ScrollPane();
+        scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);
+        scrollPane.setFocusTraversable(false);
+        scrollPane.setStyle("-fx-background-color: transparent; -fx-background-insets: 0; -fx-border-color: transparent; -fx-border-width: 0; -fx-border-insets: 0;");
+        scrollPane.setPadding(new Insets(0, 0, 10, 0));
+       
+        HBox generatedChart = generate();
+        scrollPane.setContent(generatedChart);
+        generatedChart.prefHeightProperty().bind(scrollPane.heightProperty().subtract(30));
+        this.getChildren().add(scrollPane);
+        VBox.setVgrow(scrollPane, Priority.ALWAYS);
+        
+        this.getChildren().add(generateLegend());
 	}
 
-	public HBox generate()
+	private HBox generate()
 	{
 		HBox generatedChart = new HBox();
 		generatedChart.setAlignment(Pos.TOP_CENTER);
@@ -127,7 +150,7 @@ public class MonthChartGenerator
 		return result;
 	}
 
-	public GridPane generateLegend()
+	private GridPane generateLegend()
 	{
 		GridPane legend = new GridPane();
 		legend.setPadding(new Insets(10));
@@ -225,4 +248,34 @@ public class MonthChartGenerator
 		}
 		return maximum / 100.0;
 	}
+
+    @Override
+    public WritableImage export(int width, int height) 
+    {
+        VBox root = new VBox();
+        root.setStyle("-fx-background-color: transparent;");
+        root.setPadding(new Insets(25));
+        
+        HBox generatedChart = generate();
+        root.getChildren().add(generatedChart);        
+        VBox.setVgrow(generatedChart, Priority.ALWAYS);
+        
+        Region spacer = new Region();
+        spacer.setMinHeight(30);
+		root.getChildren().add(spacer);
+        
+        root.getChildren().add(generateLegend());       
+        
+        Stage newStage = new Stage();
+        newStage.initModality(Modality.NONE);
+        newStage.setScene(new Scene(root, width, height));
+        newStage.setResizable(false);       
+        newStage.show();
+        
+        SnapshotParameters sp = new SnapshotParameters();
+        sp.setTransform(Transform.scale(width / root.getWidth(), height / root.getHeight()));
+        newStage.close();
+        
+        return root.snapshot(sp, null);
+    }
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java b/src/de/deadlocker8/budgetmaster/logic/charts/MonthLineChart.java
similarity index 73%
rename from src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java
rename to src/de/deadlocker8/budgetmaster/logic/charts/MonthLineChart.java
index 8b6bbb704..96419f9b9 100644
--- a/src/de/deadlocker8/budgetmaster/logic/chartGenerators/LineChartGenerator.java
+++ b/src/de/deadlocker8/budgetmaster/logic/charts/MonthLineChart.java
@@ -1,34 +1,45 @@
-package de.deadlocker8.budgetmaster.logic.chartGenerators;
+package de.deadlocker8.budgetmaster.logic.charts;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Set;
 
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.MonthInOutSum;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import javafx.event.EventHandler;
+import javafx.geometry.Insets;
 import javafx.geometry.Point2D;
 import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.SnapshotParameters;
 import javafx.scene.chart.CategoryAxis;
 import javafx.scene.chart.LineChart;
 import javafx.scene.chart.NumberAxis;
 import javafx.scene.chart.XYChart;
 import javafx.scene.control.Label;
 import javafx.scene.control.Tooltip;
+import javafx.scene.image.WritableImage;
 import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.VBox;
+import javafx.scene.transform.Transform;
+import javafx.stage.Modality;
+import javafx.stage.Stage;
 
-public class LineChartGenerator
+public class MonthLineChart extends VBox implements ChartExportable
 {
 	private ArrayList<MonthInOutSum> monthInOutSums;
 	private String currency;
 
-	public LineChartGenerator(ArrayList<MonthInOutSum> monthInOutSums, String currency)
+	public MonthLineChart(ArrayList<MonthInOutSum> monthInOutSums, String currency)
 	{
 		this.monthInOutSums = monthInOutSums;
 		this.currency = currency;
+		
+		this.setSpacing(10);
+		this.getChildren().add(generate());
 	}
 
-	public LineChart<String, Number> generate()
+	private LineChart<String, Number> generate()
 	{
 		final CategoryAxis xAxis = new CategoryAxis();
 		final NumberAxis yAxis = new NumberAxis();
@@ -136,4 +147,25 @@ public class LineChartGenerator
 
 		return generatedChart;
 	}
+
+    @Override
+    public WritableImage export(int width, int height) {
+        VBox root = new VBox();
+        root.setStyle("-fx-background-color: transparent;");
+        root.setPadding(new Insets(25));
+        
+        root.getChildren().add(generate());         
+        
+        Stage newStage = new Stage();
+        newStage.initModality(Modality.NONE);
+        newStage.setScene(new Scene(root, width, height));
+        newStage.setResizable(false);       
+        newStage.show();       
+        
+        SnapshotParameters sp = new SnapshotParameters();
+        sp.setTransform(Transform.scale(width / root.getWidth(), height / root.getHeight()));
+        newStage.close();
+        
+        return root.snapshot(sp, null);
+    }
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
index ef8d3f96e..9ad46eb95 100644
--- a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
@@ -24,7 +24,7 @@ import com.itextpdf.text.pdf.PdfPTable;
 import com.itextpdf.text.pdf.PdfWriter;
 
 import de.deadlocker8.budgetmaster.logic.CategoryBudget;
-import de.deadlocker8.budgetmaster.logic.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 
 public class ReportGenerator
 {
diff --git a/src/de/deadlocker8/budgetmaster/logic/ExceptionHandler.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ExceptionHandler.java
similarity index 95%
rename from src/de/deadlocker8/budgetmaster/logic/ExceptionHandler.java
rename to src/de/deadlocker8/budgetmaster/logic/serverconnection/ExceptionHandler.java
index 9118ffd21..171a7b68a 100644
--- a/src/de/deadlocker8/budgetmaster/logic/ExceptionHandler.java
+++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ExceptionHandler.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.serverconnection;
 
 import java.net.UnknownHostException;
 
diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
similarity index 96%
rename from src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
rename to src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
index 90b430b26..a7edd958d 100644
--- a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
+++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.serverconnection;
 
 import java.io.BufferedReader;
 import java.io.InputStream;
@@ -19,6 +19,15 @@ import org.joda.time.DateTime;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 
+import de.deadlocker8.budgetmaster.logic.Category;
+import de.deadlocker8.budgetmaster.logic.CategoryBudget;
+import de.deadlocker8.budgetmaster.logic.CategoryInOutSum;
+import de.deadlocker8.budgetmaster.logic.MonthInOutSum;
+import de.deadlocker8.budgetmaster.logic.NormalPayment;
+import de.deadlocker8.budgetmaster.logic.RepeatingPayment;
+import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
+import de.deadlocker8.budgetmaster.logic.Settings;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.Database;
 import tools.ConvertTo;
 import tools.Read;
diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnectionException.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnectionException.java
similarity index 91%
rename from src/de/deadlocker8/budgetmaster/logic/ServerConnectionException.java
rename to src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnectionException.java
index c18a1663b..4415d8625 100644
--- a/src/de/deadlocker8/budgetmaster/logic/ServerConnectionException.java
+++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnectionException.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.serverconnection;
 
 public class ServerConnectionException extends Exception
 {
diff --git a/src/de/deadlocker8/budgetmaster/logic/Utils.java b/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
similarity index 93%
rename from src/de/deadlocker8/budgetmaster/logic/Utils.java
rename to src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
index c9af40da5..2e6766f7d 100644
--- a/src/de/deadlocker8/budgetmaster/logic/Utils.java
+++ b/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.utils;
 
 import java.io.File;
 import java.io.IOException;
@@ -12,10 +12,11 @@ import java.util.ResourceBundle;
 
 import com.google.gson.Gson;
 
+import de.deadlocker8.budgetmaster.logic.Settings;
 import de.deadlocker8.budgetmasterserver.logic.Database;
 import tools.PathUtils;
 
-public class Utils
+public class FileHelper
 {
 	private static final ResourceBundle bundle = ResourceBundle.getBundle("de/deadlocker8/budgetmaster/main/", Locale.GERMANY);
 	
diff --git a/src/de/deadlocker8/budgetmaster/logic/Helpers.java b/src/de/deadlocker8/budgetmaster/logic/utils/Helpers.java
similarity index 98%
rename from src/de/deadlocker8/budgetmaster/logic/Helpers.java
rename to src/de/deadlocker8/budgetmaster/logic/utils/Helpers.java
index 70c73e800..79afb7987 100644
--- a/src/de/deadlocker8/budgetmaster/logic/Helpers.java
+++ b/src/de/deadlocker8/budgetmaster/logic/utils/Helpers.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.utils;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
diff --git a/src/de/deadlocker8/budgetmaster/ui/CategoryController.java b/src/de/deadlocker8/budgetmaster/ui/CategoryController.java
index 8a86686a8..1c5e03bcb 100644
--- a/src/de/deadlocker8/budgetmaster/ui/CategoryController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/CategoryController.java
@@ -5,8 +5,8 @@ import java.io.IOException;
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.Category;
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
 import de.deadlocker8.budgetmaster.ui.cells.CategoryCell;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
diff --git a/src/de/deadlocker8/budgetmaster/ui/ChartController.java b/src/de/deadlocker8/budgetmaster/ui/ChartController.java
index 6b96c34d5..0d8ab2d69 100644
--- a/src/de/deadlocker8/budgetmaster/ui/ChartController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/ChartController.java
@@ -9,25 +9,23 @@ import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 
 import de.deadlocker8.budgetmaster.logic.CategoryInOutSum;
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.MonthInOutSum;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
-import de.deadlocker8.budgetmaster.logic.chartGenerators.CategoriesChart;
-import de.deadlocker8.budgetmaster.logic.chartGenerators.ChartExportable;
-import de.deadlocker8.budgetmaster.logic.chartGenerators.LegendType;
-import de.deadlocker8.budgetmaster.logic.chartGenerators.LineChartGenerator;
-import de.deadlocker8.budgetmaster.logic.chartGenerators.MonthChartGenerator;
+import de.deadlocker8.budgetmaster.logic.charts.CategoriesChart;
+import de.deadlocker8.budgetmaster.logic.charts.ChartExportable;
+import de.deadlocker8.budgetmaster.logic.charts.LegendType;
+import de.deadlocker8.budgetmaster.logic.charts.MonthBarChart;
+import de.deadlocker8.budgetmaster.logic.charts.MonthLineChart;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
 import javafx.collections.FXCollections;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
-import javafx.geometry.Insets;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
-import javafx.scene.chart.LineChart;
 import javafx.scene.control.Accordion;
 import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
@@ -35,11 +33,8 @@ import javafx.scene.control.ComboBox;
 import javafx.scene.control.DateCell;
 import javafx.scene.control.DatePicker;
 import javafx.scene.control.RadioButton;
-import javafx.scene.control.ScrollPane;
-import javafx.scene.control.ScrollPane.ScrollBarPolicy;
 import javafx.scene.control.ToggleGroup;
 import javafx.scene.layout.AnchorPane;
-import javafx.scene.layout.HBox;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
@@ -65,15 +60,16 @@ public class ChartController implements Refreshable
 	@FXML private ComboBox<String> comboBoxEndMonth;
 	@FXML private ComboBox<String> comboBoxEndYear;
 	@FXML private Button buttonChartMonthShow;
+	@FXML private Button buttonChartMonthExport;
 	@FXML private RadioButton radioButtonBars;
 	@FXML private RadioButton radioButtonLines;
-	@FXML private HBox hboxChartMonthButtons;
 
 	private Controller controller;
-	private Button buttonChartMonthExport;
 	private File lastExportPath;
 	
 	private CategoriesChart categoriesChart;
+	private MonthLineChart monthLineChart;
+	private MonthBarChart monthBarChart;
 
 	public void init(Controller controller)
 	{
@@ -101,18 +97,12 @@ public class ChartController implements Refreshable
 		buttonChartMonthShow.setStyle("-fx-background-color: #2E79B9;");
 		buttonChartMonthShow.setGraphic(iconShow3);
 
-		buttonChartMonthExport = new Button();
-		//DEBUG
-//		buttonChartMonthExport.setOnAction((event) -> {
-//			export(vboxChartMonth);
-//		});
-
 		FontIcon iconShow4 = new FontIcon(FontIconType.SAVE);
 		iconShow4.setSize(16);
 		iconShow4.setColor(Color.WHITE);
 		buttonChartMonthExport.setStyle("-fx-background-color: #2E79B9;");
-		buttonChartMonthExport.setGraphic(iconShow4);
-
+		buttonChartMonthExport.setGraphic(iconShow4);		
+	
 		datePickerEnd.setDayCellFactory(new Callback<DatePicker, DateCell>()
 		{
 			@Override
@@ -189,6 +179,24 @@ public class ChartController implements Refreshable
 			export(categoriesChart);
 		}
 	}
+	
+	public void chartMonthExport()
+	{
+	    if(radioButtonLines.isSelected())
+        {
+            if(monthLineChart != null)
+            {
+                export(monthLineChart);
+            }
+        }
+        else
+        {
+            if(monthBarChart != null)
+            {
+                export(monthBarChart);
+            }
+        }
+	}
 
 	public void export(ChartExportable chart)
 	{
@@ -219,21 +227,6 @@ public class ChartController implements Refreshable
 
 	public void chartMonthShow()
 	{
-		if(radioButtonLines.isSelected())
-		{
-			if(!hboxChartMonthButtons.getChildren().contains(buttonChartMonthExport))
-			{
-				hboxChartMonthButtons.getChildren().add(buttonChartMonthExport);
-			}
-		}
-		else
-		{
-			if(hboxChartMonthButtons.getChildren().contains(buttonChartMonthExport))
-			{
-				hboxChartMonthButtons.getChildren().remove(buttonChartMonthExport);
-			}
-		}
-
 		Platform.runLater(() -> {
 			vboxChartMonth.getChildren().clear();
 		});
@@ -267,26 +260,15 @@ public class ChartController implements Refreshable
 
 				if(radioButtonBars.isSelected())
 				{
-					ScrollPane scrollPane = new ScrollPane();
-					scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);
-					scrollPane.setFocusTraversable(false);
-					scrollPane.setStyle("-fx-background-color: transparent; -fx-background-insets: 0; -fx-border-color: transparent; -fx-border-width: 0; -fx-border-insets: 0;");
-					scrollPane.setPadding(new Insets(0, 0, 10, 0));
-
-					MonthChartGenerator generator = new MonthChartGenerator(sums, controller.getSettings().getCurrency());
-					HBox generatedChart = generator.generate();
-					scrollPane.setContent(generatedChart);
-					generatedChart.prefHeightProperty().bind(scrollPane.heightProperty().subtract(30));
-					vboxChartMonth.getChildren().add(scrollPane);
-					VBox.setVgrow(scrollPane, Priority.ALWAYS);
-					vboxChartMonth.getChildren().add(generator.generateLegend());
+				    monthBarChart = new MonthBarChart(sums, controller.getSettings().getCurrency());
+				    vboxChartMonth.getChildren().add(monthBarChart);
+				    VBox.setVgrow(monthBarChart, Priority.ALWAYS);
 				}
 				else
 				{
-					LineChartGenerator generator = new LineChartGenerator(sums, controller.getSettings().getCurrency());
-					LineChart<String, Number> chartMonth = generator.generate();
-					vboxChartMonth.getChildren().add(chartMonth);
-					VBox.setVgrow(chartMonth, Priority.ALWAYS);
+					monthLineChart = new MonthLineChart(sums, controller.getSettings().getCurrency());					
+					vboxChartMonth.getChildren().add(monthLineChart);
+					VBox.setVgrow(monthLineChart, Priority.ALWAYS);
 				}
 			});
 		}
diff --git a/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml b/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml
index fbe8fad75..58380127a 100644
--- a/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml
+++ b/src/de/deadlocker8/budgetmaster/ui/ChartTab.fxml
@@ -113,7 +113,7 @@
                                     </HBox>
                                  </children>
                               </VBox>
-                              <HBox fx:id="hboxChartMonthButtons" alignment="CENTER_LEFT" spacing="15.0" HBox.hgrow="ALWAYS">
+                              <HBox alignment="CENTER_LEFT" spacing="15.0" HBox.hgrow="ALWAYS">
                                  <children>
                                     <RadioButton fx:id="radioButtonBars" mnemonicParsing="false" text="Balken">
                                        <font>
@@ -131,6 +131,14 @@
                                           <Insets left="10.0" />
                                        </HBox.margin>
                                     </Button>
+                                    <Button fx:id="buttonChartMonthExport" mnemonicParsing="false" onAction="#chartMonthExport">
+                                       <font>
+                                          <Font name="System Bold" size="12.0" />
+                                       </font>
+                                       <HBox.margin>
+                                          <Insets left="10.0" />
+                                       </HBox.margin>
+                                    </Button>
                                  </children>
                               </HBox>
                            </children>
diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java
index c4d84fcb4..2fa2e5b0f 100644
--- a/src/de/deadlocker8/budgetmaster/ui/Controller.java
+++ b/src/de/deadlocker8/budgetmaster/ui/Controller.java
@@ -8,13 +8,13 @@ import org.joda.time.DateTime;
 
 import de.deadlocker8.budgetmaster.logic.CategoryBudget;
 import de.deadlocker8.budgetmaster.logic.CategoryHandler;
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.FilterSettings;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.PaymentHandler;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
 import de.deadlocker8.budgetmaster.logic.Settings;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.animation.FadeTransition;
diff --git a/src/de/deadlocker8/budgetmaster/ui/ExportChartController.java b/src/de/deadlocker8/budgetmaster/ui/ExportChartController.java
index f054c82ba..793f54a90 100644
--- a/src/de/deadlocker8/budgetmaster/ui/ExportChartController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/ExportChartController.java
@@ -7,7 +7,7 @@ import java.util.Optional;
 
 import javax.imageio.ImageIO;
 
-import de.deadlocker8.budgetmaster.logic.chartGenerators.ChartExportable;
+import de.deadlocker8.budgetmaster.logic.charts.ChartExportable;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.embed.swing.SwingFXUtils;
@@ -54,8 +54,8 @@ public class ExportChartController
 			labelSavePath.setText(savePath.getAbsolutePath());
 		}
 				
-		textFieldWidth.setText("600");
-		textFieldHeight.setText("400");
+		textFieldWidth.setText(String.valueOf((int)chart.getWidth()));
+		textFieldHeight.setText(String.valueOf((int)chart.getHeight()));
 
 		anchorPaneMain.setStyle("-fx-background-color: #F4F4F4;");
 		
diff --git a/src/de/deadlocker8/budgetmaster/ui/HomeController.java b/src/de/deadlocker8/budgetmaster/ui/HomeController.java
index 1cf7c0c4d..feb5c9899 100644
--- a/src/de/deadlocker8/budgetmaster/ui/HomeController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/HomeController.java
@@ -4,7 +4,7 @@ import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.Budget;
 import de.deadlocker8.budgetmaster.logic.CategoryBudget;
-import de.deadlocker8.budgetmaster.logic.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.ui.cells.CategoryBudgetCell;
 import javafx.application.Platform;
 import javafx.beans.value.ChangeListener;
diff --git a/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java b/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java
index 89872beb9..54070e374 100644
--- a/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/NewCategoryController.java
@@ -6,8 +6,8 @@ import org.controlsfx.control.PopOver;
 import org.controlsfx.control.PopOver.ArrowLocation;
 
 import de.deadlocker8.budgetmaster.logic.Category;
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.fxml.FXML;
diff --git a/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java b/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java
index 2fc8cdaaf..2ba2285b1 100644
--- a/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/NewPaymentController.java
@@ -6,13 +6,13 @@ import java.util.ArrayList;
 import org.joda.time.DateTime;
 
 import de.deadlocker8.budgetmaster.logic.Category;
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.Payment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.ui.cells.ButtonCategoryCell;
 import de.deadlocker8.budgetmaster.ui.cells.RepeatingDayCell;
 import de.deadlocker8.budgetmaster.ui.cells.SmallCategoryCell;
diff --git a/src/de/deadlocker8/budgetmaster/ui/PaymentController.java b/src/de/deadlocker8/budgetmaster/ui/PaymentController.java
index a1dc8834c..272e133d7 100644
--- a/src/de/deadlocker8/budgetmaster/ui/PaymentController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/PaymentController.java
@@ -4,14 +4,14 @@ import java.io.IOException;
 import java.util.ArrayList;
 
 import de.deadlocker8.budgetmaster.logic.Budget;
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.FilterSettings;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.Payment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPayment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
+import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.ui.cells.PaymentCell;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
diff --git a/src/de/deadlocker8/budgetmaster/ui/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/ReportController.java
index 36a71134e..a0fe17c09 100644
--- a/src/de/deadlocker8/budgetmaster/ui/ReportController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/ReportController.java
@@ -10,7 +10,6 @@ import java.util.Date;
 import java.util.Optional;
 
 import de.deadlocker8.budgetmaster.logic.FilterSettings;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.Payment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
 import de.deadlocker8.budgetmaster.logic.comparators.DateComparator;
@@ -20,6 +19,7 @@ import de.deadlocker8.budgetmaster.logic.report.ColumnOrder;
 import de.deadlocker8.budgetmaster.logic.report.ColumnType;
 import de.deadlocker8.budgetmaster.logic.report.ReportGenerator;
 import de.deadlocker8.budgetmaster.logic.report.ReportItem;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
diff --git a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java
index 265c3abf5..159c37cc1 100644
--- a/src/de/deadlocker8/budgetmaster/ui/SettingsController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/SettingsController.java
@@ -5,11 +5,11 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Optional;
 
-import de.deadlocker8.budgetmaster.logic.ExceptionHandler;
-import de.deadlocker8.budgetmaster.logic.Helpers;
-import de.deadlocker8.budgetmaster.logic.ServerConnection;
 import de.deadlocker8.budgetmaster.logic.Settings;
-import de.deadlocker8.budgetmaster.logic.Utils;
+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.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.Database;
 import javafx.application.Platform;
 import javafx.fxml.FXML;
@@ -206,7 +206,7 @@ public class SettingsController
 
 		try
 		{
-			Utils.saveSettings(controller.getSettings());
+			FileHelper.saveSettings(controller.getSettings());
 		}
 		catch(IOException e)
 		{
@@ -237,7 +237,7 @@ public class SettingsController
 				{
 					ServerConnection connection = new ServerConnection(controller.getSettings());
 					String databaseJSON = connection.exportDatabase();
-					Utils.saveDatabaseJSON(file, databaseJSON);
+					FileHelper.saveDatabaseJSON(file, databaseJSON);
 
 					Platform.runLater(() -> {
 						if(modalStage != null)
@@ -274,7 +274,7 @@ public class SettingsController
 			Database database;
 			try
 			{
-				database = Utils.loadDatabaseJSON(file);
+				database = FileHelper.loadDatabaseJSON(file);
 				if(database.getCategories() == null || database.getNormalPayments() == null || database.getRepeatingPayments() == null)
 				{
 					AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Die angegebene Datei enthält kein gültiges BudgetMaster-Datenformat und kann daher nicht importiert werden.", controller.getIcon(), controller.getStage(), null, false);
diff --git a/src/de/deadlocker8/budgetmaster/ui/SplashScreenController.java b/src/de/deadlocker8/budgetmaster/ui/SplashScreenController.java
index 4faa8ceb4..b40112b62 100644
--- a/src/de/deadlocker8/budgetmaster/ui/SplashScreenController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/SplashScreenController.java
@@ -3,9 +3,9 @@ package de.deadlocker8.budgetmaster.ui;
 import java.io.IOException;
 import java.util.ResourceBundle;
 
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.Settings;
-import de.deadlocker8.budgetmaster.logic.Utils;
+import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
 import javafx.application.Platform;
@@ -63,7 +63,7 @@ public class SplashScreenController
 			}
 		});
 		
-		settings = Utils.loadSettings();
+		settings = FileHelper.loadSettings();
 		if(settings == null)
 		{	
 			settings = new Settings();
@@ -105,7 +105,7 @@ public class SplashScreenController
 			settings.setClientSecret(HashUtils.hash(password, Helpers.SALT));
 			try
 			{
-				Utils.saveSettings(settings);
+				FileHelper.saveSettings(settings);
 				
 				stage.close();
 				openBudgetMaster();	
diff --git a/src/de/deadlocker8/budgetmaster/ui/cells/CategoryBudgetCell.java b/src/de/deadlocker8/budgetmaster/ui/cells/CategoryBudgetCell.java
index 74b06681c..b06fef967 100644
--- a/src/de/deadlocker8/budgetmaster/ui/cells/CategoryBudgetCell.java
+++ b/src/de/deadlocker8/budgetmaster/ui/cells/CategoryBudgetCell.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.ui.cells;
 
 import de.deadlocker8.budgetmaster.logic.CategoryBudget;
-import de.deadlocker8.budgetmaster.logic.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.ui.HomeController;
 import javafx.geometry.Insets;
 import javafx.geometry.Pos;
diff --git a/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java b/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java
index ce20c31a7..13edac0e3 100644
--- a/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java
+++ b/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java
@@ -7,10 +7,10 @@ import java.util.Date;
 import java.util.Optional;
 
 import de.deadlocker8.budgetmaster.logic.Category;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.Payment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.ui.PaymentController;
 import fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index b2389dd93..29317035b 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -17,7 +17,7 @@ import org.joda.time.DateTime;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
-import de.deadlocker8.budgetmaster.logic.Helpers;
+import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmasterserver.logic.DatabaseHandler;
 import de.deadlocker8.budgetmasterserver.logic.Settings;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryAdd;
diff --git a/tests/de/deadlocker8/budgetmaster/tests/server/database/DatabaseImportExportTest.java b/tests/de/deadlocker8/budgetmaster/tests/server/database/DatabaseImportExportTest.java
index 21eb640fe..f319ff5d5 100644
--- a/tests/de/deadlocker8/budgetmaster/tests/server/database/DatabaseImportExportTest.java
+++ b/tests/de/deadlocker8/budgetmaster/tests/server/database/DatabaseImportExportTest.java
@@ -18,6 +18,7 @@ import com.google.gson.Gson;
 import de.deadlocker8.budgetmaster.logic.Category;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.RepeatingPayment;
+import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmasterserver.logic.Database;
 import de.deadlocker8.budgetmasterserver.logic.DatabaseExporter;
 import de.deadlocker8.budgetmasterserver.logic.DatabaseHandler;
@@ -55,7 +56,7 @@ public class DatabaseImportExportTest
 		try
 		{
 			File file = Paths.get("tests/de/deadlocker8/budgetmaster/tests/resources/import.json").toFile();
-			Database database = de.deadlocker8.budgetmaster.logic.Utils.loadDatabaseJSON(file);			
+			Database database = FileHelper.loadDatabaseJSON(file);			
 			
 			DatabaseImporter importer = new DatabaseImporter(databaseHandler);
 			importer.importDatabase(database);
@@ -105,7 +106,7 @@ public class DatabaseImportExportTest
 			databaseHandler = new DatabaseHandler(settings);
 			
 			File file = Paths.get("tests/de/deadlocker8/budgetmaster/tests/resources/import.json").toFile();
-			Database database = de.deadlocker8.budgetmaster.logic.Utils.loadDatabaseJSON(file);			
+			Database database = FileHelper.loadDatabaseJSON(file);			
 			
 			DatabaseImporter importer = new DatabaseImporter(databaseHandler);
 			importer.importDatabase(database);			
@@ -114,7 +115,7 @@ public class DatabaseImportExportTest
 			DatabaseExporter exporter = new DatabaseExporter(settings);	
 			Gson gson = new Gson();
 			String databaseJSON = gson.toJson(exporter.exportDatabase());
-			de.deadlocker8.budgetmaster.logic.Utils.saveDatabaseJSON(file, databaseJSON);		
+			FileHelper.saveDatabaseJSON(file, databaseJSON);		
 			
 			String expectedJSON = new String(Files.readAllBytes(Paths.get("tests/de/deadlocker8/budgetmaster/tests/resources/import.json")));
 			String exportedJSON = new String(Files.readAllBytes(Paths.get("tests/de/deadlocker8/budgetmaster/tests/resources/export.json")));		
-- 
GitLab