diff --git a/pom.xml b/pom.xml
index 7171a69f22bd6570cca29fa865ec5ae5357aa52d..fee0e286908f96732d52fe82567d1d3f4891e761 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,5 +57,10 @@
     	<artifactId>joda-time</artifactId>
     	<version>2.9.7</version>
 	</dependency>
+	<dependency>
+	    <groupId>com.itextpdf</groupId>
+	    <artifactId>itextpdf</artifactId>
+    	<version>5.0.6</version>
+	</dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnFilter.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf722850917b0d79e28735d4763cf26981940fff
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnFilter.java
@@ -0,0 +1,45 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+import java.util.HashSet;
+
+public class ColumnFilter
+{
+	private HashSet<ColumnType> columns;
+
+	public ColumnFilter()
+	{
+		columns = new HashSet<ColumnType>();
+	}
+	
+	public void addColumn(ColumnType column)
+	{
+		columns.add(column);
+	}
+	
+	public void removeColumn(ColumnType column)
+	{
+		columns.remove(column);
+	}
+	
+	public void toggleColumn(ColumnType column, boolean add)
+	{
+		if(add)
+		{
+			columns.add(column);
+		}
+		else
+		{
+			columns.remove(column);
+		}
+	}
+	
+	public HashSet<ColumnType> getColumns()
+	{
+		return columns;
+	}
+	
+	public boolean containsColumn(ColumnType column)
+	{
+		return columns.contains(column);
+	}
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java
new file mode 100644
index 0000000000000000000000000000000000000000..62aaeb9e254c5237a0ea5cb2b1a88d1eba435ef7
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java
@@ -0,0 +1,23 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+import java.util.ArrayList;
+
+public class ColumnOrder
+{
+	private ArrayList<ColumnType> columns;
+
+	public ColumnOrder()
+	{
+		columns = new ArrayList<ColumnType>();
+	}
+
+	public ArrayList<ColumnType> getColumns()
+	{
+		return columns;
+	}
+	
+	public void addColumn(ColumnType column)
+	{
+		columns.add(column);
+	}
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java
new file mode 100644
index 0000000000000000000000000000000000000000..22d5fae4a3669e76ab33d3d457b49619c39b68e0
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java
@@ -0,0 +1,6 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+public enum ColumnType
+{
+	POSITION, DATE, REPEATING, CATEGORY, NAME, DESCRIPTION, RATING, AMOUNT
+}
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/HeaderFooterPageEvent.java b/src/de/deadlocker8/budgetmaster/logic/report/HeaderFooterPageEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..9835447d1a281711e50d9882638a5bcd3014e2b0
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/HeaderFooterPageEvent.java
@@ -0,0 +1,25 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+import org.joda.time.DateTime;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.pdf.ColumnText;
+import com.itextpdf.text.pdf.PdfPageEventHelper;
+import com.itextpdf.text.pdf.PdfWriter;
+
+public class HeaderFooterPageEvent extends PdfPageEventHelper
+{
+	public void onStartPage(PdfWriter writer, Document document)
+	{
+		
+	}
+
+	public void onEndPage(PdfWriter writer, Document document)
+	{
+		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("BudgetMaster Monatsbericht"), 100, 25, 0);
+		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Seite " + document.getPageNumber()), 300, 25, 0);
+		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(DateTime.now().toString("dd.MM.YYYY")), 500, 25, 0);
+	}
+}
\ 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
new file mode 100644
index 0000000000000000000000000000000000000000..e832b411f6f3115f15ad2b8013d33a7ac0c2089a
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
@@ -0,0 +1,130 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+import java.awt.Color;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+
+import org.joda.time.DateTime;
+
+import com.itextpdf.text.BaseColor;
+import com.itextpdf.text.Chapter;
+import com.itextpdf.text.Chunk;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.Font.FontFamily;
+import com.itextpdf.text.Paragraph;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.pdf.GrayColor;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+
+import de.deadlocker8.budgetmaster.logic.Helpers;
+
+public class ReportGenerator
+{
+	private ArrayList<ReportItem> reportItems;
+	private ColumnOrder columnOrder;
+	private boolean splitTable;
+	private boolean includeCategoryBudgets;
+	private boolean descending;
+	private File savePath;
+	private String currency;
+	private DateTime date;
+
+	public ReportGenerator(ArrayList<ReportItem> reportItems, ColumnOrder columnOrder, boolean splitTable, boolean includeCategoryBudgets, boolean descending, File savePath, String currency, DateTime date)
+	{
+		this.reportItems = reportItems;
+		this.columnOrder = columnOrder;
+		this.splitTable = splitTable;
+		this.includeCategoryBudgets = includeCategoryBudgets;
+		this.descending = descending;
+		this.savePath = savePath;
+		this.currency = currency;
+		this.date = date;
+	}
+
+	public void generate() throws FileNotFoundException, DocumentException
+	{
+		Document document = new Document();
+		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(savePath));
+		writer.setPageEvent(new HeaderFooterPageEvent());
+		document.open();
+		
+		//header
+		Font chapterFont = new Font(FontFamily.HELVETICA, 16, Font.BOLDITALIC);
+        Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL);
+        Chunk chunk = new Chunk("Monatsbericht - " + date.toString("MMMM yyyy"), chapterFont);
+        Chapter chapter = new Chapter(new Paragraph(chunk), 1);
+        chapter.setNumberDepth(0);
+        chapter.add(Chunk.NEWLINE);
+        chapter.add(new Paragraph("Buchungen", paragraphFont));
+        document.add(chapter);
+        document.add(Chunk.NEWLINE);
+		
+        //table
+		int numberOfColumns = columnOrder.getColumns().size();
+		if(numberOfColumns > 0)
+		{
+			PdfPTable table = new PdfPTable(numberOfColumns);
+			table.setWidthPercentage(100);
+			Font font = new Font(FontFamily.HELVETICA, 8, Font.NORMAL, GrayColor.BLACK);
+
+			for(ColumnType column : columnOrder.getColumns())
+			{
+				// TODO get string for enum type
+				PdfPCell cell = new PdfPCell(new Phrase(column.toString(), font));
+				cell.setBackgroundColor(GrayColor.LIGHT_GRAY);
+				cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+				table.addCell(cell);
+			}
+			
+			
+			for(ReportItem currentItem : reportItems)
+			{
+				for(ColumnType column : columnOrder.getColumns())
+				{
+					PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font));
+					cell.setBackgroundColor(new BaseColor(Color.WHITE));
+					cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+					table.addCell(cell);
+				}
+			}
+
+			
+			document.add(table);
+		}
+        
+		document.close();
+	}
+
+	private String getProperty(ReportItem reportItem, ColumnType columnType)
+	{
+		switch(columnType)
+		{
+			case AMOUNT:
+				return String.valueOf(Helpers.NUMBER_FORMAT.format(reportItem.getAmount() / 100.0).replace(".", ",")) + " " + currency;
+			case CATEGORY:
+				return reportItem.getCategory().getName();			
+			case DATE:
+				return reportItem.getDate();				
+			case DESCRIPTION:
+				return reportItem.getDescription();
+			case NAME:
+				return reportItem.getName();
+			case POSITION:
+				return String.valueOf(reportItem.getPosition());
+			case RATING:
+				return reportItem.getAmount() > 0 ? "+" : "-";
+			case REPEATING:
+				//TODO icon
+				return String.valueOf(reportItem.getRepeating());
+			default:
+				return null;
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/ReportItem.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportItem.java
similarity index 93%
rename from src/de/deadlocker8/budgetmaster/logic/ReportItem.java
rename to src/de/deadlocker8/budgetmaster/logic/report/ReportItem.java
index 2090e787a5a3a8ae325f9964f317e10c1b9eceeb..d155a69481267a722b24355ae233374f3acc8ea1 100644
--- a/src/de/deadlocker8/budgetmaster/logic/ReportItem.java
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportItem.java
@@ -1,4 +1,6 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.report;
+
+import de.deadlocker8.budgetmaster.logic.Category;
 
 public class ReportItem
 {
diff --git a/src/de/deadlocker8/budgetmaster/ui/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/ReportController.java
index 902a7c51c026c9924ef9aab74ddc2a142c09a228..6ebeaf74918d3b1d34ec437ce4a6ea777a926bba 100644
--- a/src/de/deadlocker8/budgetmaster/ui/ReportController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/ReportController.java
@@ -1,18 +1,26 @@
 package de.deadlocker8.budgetmaster.ui;
 
+import java.awt.Desktop;
+import java.io.File;
 import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 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.ReportItem;
+import de.deadlocker8.budgetmaster.logic.report.ColumnFilter;
+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 fontAwesome.FontIcon;
 import fontAwesome.FontIconType;
+import javafx.application.Platform;
 import javafx.beans.property.SimpleStringProperty;
 import javafx.beans.property.StringProperty;
 import javafx.beans.value.ObservableValue;
@@ -23,7 +31,10 @@ import javafx.fxml.FXMLLoader;
 import javafx.geometry.Pos;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
 import javafx.scene.control.CheckBox;
 import javafx.scene.control.Label;
 import javafx.scene.control.TableCell;
@@ -37,6 +48,8 @@ import javafx.stage.Modality;
 import javafx.stage.Stage;
 import javafx.util.Callback;
 import logger.Logger;
+import tools.AlertGenerator;
+import tools.Worker;
 
 public class ReportController implements Refreshable
 {
@@ -44,13 +57,14 @@ public class ReportController implements Refreshable
 	@FXML private Label labelPayments;
 	@FXML private Label labelFilterActive;
 	@FXML private CheckBox checkBoxSplitTable;
-	@FXML private CheckBox checkBoxIncludeChart;
+	@FXML private CheckBox checkBoxIncludeCategoryBudgets;
 	@FXML private CheckBox checkBoxDescending;
 	@FXML private Button buttonFilter;
 	@FXML private Button buttonGenerate;
 	@FXML private TableView<ReportItem> tableView;
 
 	private Controller controller;
+	private ColumnFilter columnFilter;
 
 	public void init(Controller controller)
 	{
@@ -79,7 +93,7 @@ public class ReportController implements Refreshable
 		buttonFilter.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");
 		buttonGenerate.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;");
 		checkBoxSplitTable.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;");
-		checkBoxIncludeChart.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;");
+		checkBoxIncludeCategoryBudgets.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;");
 		checkBoxDescending.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;");
 
 		refresh();
@@ -87,24 +101,33 @@ public class ReportController implements Refreshable
 
 	private void initTable()
 	{
+		columnFilter = new ColumnFilter();
+		for(ColumnType type : ColumnType.values())
+		{
+			columnFilter.addColumn(type);
+		}
+		
 		Label labelPlaceholder = new Label("Keine Daten verfügbar");
 		labelPlaceholder.setStyle("-fx-font-size: 16");
 		tableView.setPlaceholder(labelPlaceholder);
 
 		TableColumn<ReportItem, Integer> columnPosition = new TableColumn<>("Nr.");
+		columnPosition.setUserData(ColumnType.POSITION);
 		columnPosition.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("position"));
 		columnPosition.setStyle("-fx-alignment: CENTER;");
 		CheckBox checkBoxPositions = new CheckBox();
 		checkBoxPositions.setSelected(true);
 		checkBoxPositions.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnPosition.setStyle(style);			
+			columnPosition.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.POSITION, c);
 		});
 		columnPosition.setGraphic(checkBoxPositions);
 		columnPosition.setSortable(false);
 		tableView.getColumns().add(columnPosition);
 
 		TableColumn<ReportItem, String> columnDate = new TableColumn<>("Datum");
+		columnDate.setUserData(ColumnType.DATE);
 		columnDate.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>()
 		{
 			@Override
@@ -131,13 +154,15 @@ public class ReportController implements Refreshable
 		checkBoxDate.setSelected(true);
 		checkBoxDate.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnDate.setStyle(style);			
+			columnDate.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.DATE, c);
 		});
 		columnDate.setGraphic(checkBoxDate);
 		columnDate.setSortable(false);
 		tableView.getColumns().add(columnDate);
 
 		TableColumn<ReportItem, Boolean> columnIsRepeating = new TableColumn<>("Wiederholend");
+		columnIsRepeating.setUserData(ColumnType.REPEATING);
 		columnIsRepeating.setCellValueFactory(new PropertyValueFactory<ReportItem, Boolean>("repeating"));
 		columnIsRepeating.setCellFactory(new Callback<TableColumn<ReportItem, Boolean>, TableCell<ReportItem, Boolean>>()
 		{
@@ -176,13 +201,15 @@ public class ReportController implements Refreshable
 		checkBoxRepeating.setSelected(true);
 		checkBoxRepeating.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnIsRepeating.setStyle(style);			
+			columnIsRepeating.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.REPEATING, c);
 		});
 		columnIsRepeating.setGraphic(checkBoxRepeating);
 		columnIsRepeating.setSortable(false);
 		tableView.getColumns().add(columnIsRepeating);
 
 		TableColumn<ReportItem, String> columnCategory = new TableColumn<>("Kategorie");
+		columnCategory.setUserData(ColumnType.CATEGORY);
 		columnCategory.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>()
 		{
 			@Override
@@ -201,39 +228,45 @@ public class ReportController implements Refreshable
 		checkBoxCategory.setSelected(true);
 		checkBoxCategory.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnCategory.setStyle(style);			
+			columnCategory.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.CATEGORY, c);
 		});
 		columnCategory.setGraphic(checkBoxCategory);
 		columnCategory.setSortable(false);
 		tableView.getColumns().add(columnCategory);
 
 		TableColumn<ReportItem, Integer> columnName = new TableColumn<>("Name");
+		columnName.setUserData(ColumnType.NAME);
 		columnName.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("name"));
 		columnName.setStyle("-fx-alignment: CENTER;");
 		CheckBox checkBoxName = new CheckBox();
 		checkBoxName.setSelected(true);
 		checkBoxName.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnName.setStyle(style);			
+			columnName.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.NAME, c);
 		});
 		columnName.setGraphic(checkBoxName);
 		columnName.setSortable(false);
 		tableView.getColumns().add(columnName);
 
 		TableColumn<ReportItem, Integer> columnDescription = new TableColumn<>("Notiz");
+		columnDescription.setUserData(ColumnType.DESCRIPTION);
 		columnDescription.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("description"));
 		columnDescription.setStyle("-fx-alignment: CENTER;");
 		CheckBox checkBoxDescription = new CheckBox();
 		checkBoxDescription.setSelected(true);
 		checkBoxDescription.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnDescription.setStyle(style);			
+			columnDescription.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.DESCRIPTION, c);
 		});
 		columnDescription.setGraphic(checkBoxDescription);
 		columnDescription.setSortable(false);
 		tableView.getColumns().add(columnDescription);
 		
 		TableColumn<ReportItem, Integer> columnRating = new TableColumn<>("Bewertung");
+		columnRating.setUserData(ColumnType.RATING);
 		columnRating.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("amount"));
 		columnRating.setCellFactory(new Callback<TableColumn<ReportItem, Integer>, TableCell<ReportItem, Integer>>()
 		{
@@ -271,13 +304,15 @@ public class ReportController implements Refreshable
 		checkBoxRating.setSelected(true);
 		checkBoxRating.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnRating.setStyle(style);			
+			columnRating.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.RATING, c);
 		});
 		columnRating.setGraphic(checkBoxRating);
 		columnRating.setSortable(false);
 		tableView.getColumns().add(columnRating);
 
 		TableColumn<ReportItem, String> columnAmount = new TableColumn<>("Betrag");
+		columnAmount.setUserData(ColumnType.AMOUNT);
 		columnAmount.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>()
 		{
 			@Override
@@ -294,7 +329,8 @@ public class ReportController implements Refreshable
 		checkBoxAmount.setSelected(true);
 		checkBoxAmount.selectedProperty().addListener((a, b, c)->{
 			String style = c ? "" : "-fx-background-color: salmon";			
-			columnAmount.setStyle(style);			
+			columnAmount.setStyle(style);
+			columnFilter.toggleColumn(ColumnType.AMOUNT, c);
 		});
 		columnAmount.setGraphic(checkBoxAmount);
 		columnAmount.setSortable(false);
@@ -360,9 +396,108 @@ public class ReportController implements Refreshable
 		}
 	}
 
+	@SuppressWarnings("rawtypes")
 	public void generate()
 	{
+		ColumnOrder columnOrder = new ColumnOrder();
+		for(TableColumn currentColumn : tableView.getColumns())
+		{
+			ColumnType currentType = (ColumnType)currentColumn.getUserData();			
+			if(columnFilter.containsColumn(currentType))
+			{
+				columnOrder.addColumn(currentType);
+			}
+		}
 		
+		//DEBUG
+//		FileChooser fileChooser = new FileChooser();
+//		fileChooser.setTitle("Bericht speichern");
+//		FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PDF (*.pdf)", "*.pdf");
+//		fileChooser.getExtensionFilters().add(extFilter);
+//		File file = fileChooser.showSaveDialog(controller.getStage());
+		File file = new File("C:/Users/ROGO2/Desktop/123.pdf");
+		if(file != null)
+		{		
+			ReportGenerator reportGenerator = new ReportGenerator(new ArrayList<ReportItem>(tableView.getItems()),																
+																columnOrder,
+																checkBoxSplitTable.isSelected(), 
+																checkBoxIncludeCategoryBudgets.isSelected(), 
+																checkBoxDescending.isSelected(), 
+																file,
+																controller.getSettings().getCurrency(),
+																controller.getCurrentDate());
+			
+			Stage modalStage = Helpers.showModal("Vorgang läuft", "Der Monatsbericht wird erstellt, bitte warten...", controller.getStage(), controller.getIcon());
+
+			Worker.runLater(() -> {
+				try
+				{
+					reportGenerator.generate();					
+
+					Platform.runLater(() -> {
+						if(modalStage != null)
+						{
+							modalStage.close();
+						}
+						
+						controller.showNotification("Bericht erfolgreich gespeichert");	
+						
+						Alert alert = new Alert(AlertType.INFORMATION);
+						alert.setTitle("Erfolgreich erstellt");
+						alert.setHeaderText("");
+						alert.setContentText("Der Monatsbericht wurde erfolgreich erstellt");			
+						Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
+						dialogStage.getIcons().add(controller.getIcon());						
+						
+						ButtonType buttonTypeOne = new ButtonType("Ordner öffnen");
+						ButtonType buttonTypeTwo = new ButtonType("Bericht öffnen");
+						ButtonType buttonTypeThree = new ButtonType("OK");						
+						alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree);
+						
+						Optional<ButtonType> result = alert.showAndWait();						
+						if (result.get() == buttonTypeOne)
+						{
+							try
+							{
+								Desktop.getDesktop().open(new File(file.getParent().replace("\\", "/")));
+							}
+							catch(IOException e1)
+							{
+								Logger.error(e1);
+								AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Der Ordner konnte nicht geöffnet werden\n\n" + e1.getMessage(), controller.getIcon(), controller.getStage(), null, false);
+							}
+						}
+						else if (result.get() == buttonTypeTwo)
+						{
+							try
+							{
+								Desktop.getDesktop().open(new File(file.getAbsolutePath().replace("\\", "/")));
+							}
+							catch(IOException e1)
+							{
+								Logger.error(e1);
+								AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Der Bericht konnte nicht geöffnet werden\n\n" + e1.getMessage(), controller.getIcon(), controller.getStage(), null, false);
+							}
+						}
+						else
+						{
+							alert.close();
+						}
+					});
+				}
+				catch(Exception e)
+				{
+					Logger.error(e);
+					Platform.runLater(() -> {
+						if(modalStage != null)
+						{
+							modalStage.close();
+						}
+						AlertGenerator.showAlert(AlertType.ERROR, "Fehler", "", "Beim Erstellen des Monatsberichts ist ein Fehler aufgetreten:\n\n" + e.getMessage(), controller.getIcon(), controller.getStage(), null, false);
+					});
+				}
+			});			
+		}
 	}
 
 	public Controller getController()
diff --git a/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml b/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml
index 3d84c457b23c76a3cd270f30d242b6744b946507..f0d20b88c933e60553324b03e59243058d015939 100644
--- a/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml
+++ b/src/de/deadlocker8/budgetmaster/ui/ReportTab.fxml
@@ -12,7 +12,7 @@
 
 <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.budgetmaster.ui.ReportController">
    <children>
-      <VBox alignment="TOP_CENTER" layoutY="24.0" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="25.0">
+      <VBox alignment="TOP_CENTER" layoutY="24.0" prefHeight="562.0" prefWidth="772.0" spacing="20.0" AnchorPane.bottomAnchor="35.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="25.0">
          <children>
             <HBox alignment="CENTER" prefHeight="11.0" prefWidth="772.0">
                <children>
@@ -40,11 +40,14 @@
                   <VBox spacing="10.0">
                      <children>
                         <CheckBox fx:id="checkBoxSplitTable" mnemonicParsing="false" text="Einnahmen und Ausgaben als getrennte Tabellen" />
-                        <CheckBox fx:id="checkBoxIncludeChart" mnemonicParsing="false" text="Diagramm hinzufügen" />
+                        <CheckBox fx:id="checkBoxIncludeCategoryBudgets" mnemonicParsing="false" text="Verbrauch nach Kategorien hizufügen" />
                         <CheckBox fx:id="checkBoxDescending" mnemonicParsing="false" text="Neuestes Datum zuerst" />
                      </children>
                   </VBox>
                </children>
+               <VBox.margin>
+                  <Insets />
+               </VBox.margin>
             </HBox>
             <TableView fx:id="tableView" prefHeight="270.0" prefWidth="772.0" VBox.vgrow="ALWAYS">
                <columnResizePolicy>
@@ -62,6 +65,9 @@
                      </children>
                   </VBox>
                </children>
+               <VBox.margin>
+                  <Insets top="15.0" />
+               </VBox.margin>
             </HBox>
          </children>
       </VBox>