diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java
index 62aaeb9e254c5237a0ea5cb2b1a88d1eba435ef7..b049de10d75a6207b0988943d6d4a1347e994940 100644
--- a/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnOrder.java
@@ -20,4 +20,10 @@ public class ColumnOrder
 	{
 		columns.add(column);
 	}
+
+	@Override
+	public String toString()
+	{
+		return "ColumnOrder [columns=" + columns + "]";
+	}
 }
\ 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 f67740ae4e959045076f06b94b7ef08f9737c0cc..60380bd2d412d3c67fb3bd1376e04d880cf190bc 100644
--- a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java
@@ -34,23 +34,17 @@ public class ReportGenerator
 {
 	private ArrayList<ReportItem> reportItems;
 	private ArrayList<CategoryBudget> categoryBudgets;
-	private ColumnOrder columnOrder;
-	private boolean includeBudget;
-	private boolean splitTable;
-	private boolean includeCategoryBudgets;
+	private ReportPreferences reportPreferences;
 	private File savePath;
 	private String currency;
 	private DateTime date;
 	private Budget budget;
 
-	public ReportGenerator(ArrayList<ReportItem> reportItems, ArrayList<CategoryBudget> categoryBudgets, ColumnOrder columnOrder, boolean includeBudget, boolean splitTable, boolean includeCategoryBudgets, File savePath, String currency, DateTime date, Budget budget)
+	public ReportGenerator(ArrayList<ReportItem> reportItems, ArrayList<CategoryBudget> categoryBudgets, ReportPreferences reportPreferences, File savePath, String currency, DateTime date, Budget budget)
 	{	
 		this.reportItems = reportItems;
 		this.categoryBudgets = categoryBudgets;
-		this.columnOrder = columnOrder;
-		this.includeBudget = includeBudget;
-		this.splitTable = splitTable;
-		this.includeCategoryBudgets = includeCategoryBudgets;
+		this.reportPreferences = reportPreferences;
 		this.savePath = savePath;
 		this.currency = currency;
 		this.date = date;
@@ -69,23 +63,23 @@ public class ReportGenerator
 
 	private PdfPTable generateTable(int tableWidth, AmountType amountType)
 	{
-		int numberOfColumns = columnOrder.getColumns().size();
+		int numberOfColumns = reportPreferences.getColumnOrder().getColumns().size();
 		int totalIncome = 0;
 		int totalPayment = 0;
 
 		if(numberOfColumns > 0)
 		{
 			float[] proportions = new float[numberOfColumns];
-			for(int i = 0; i < columnOrder.getColumns().size(); i++)
+			for(int i = 0; i < reportPreferences.getColumnOrder().getColumns().size(); i++)
 			{
-				proportions[i] = columnOrder.getColumns().get(i).getProportion();
+				proportions[i] = reportPreferences.getColumnOrder().getColumns().get(i).getProportion();
 			}
 			
 			PdfPTable table = new PdfPTable(proportions);
 			table.setWidthPercentage(tableWidth);
 			Font font = new Font(FontFamily.HELVETICA, 8, Font.NORMAL, GrayColor.BLACK);
 
-			for(ColumnType column : columnOrder.getColumns())
+			for(ColumnType column : reportPreferences.getColumnOrder().getColumns())
 			{
 				PdfPCell cell = new PdfPCell(new Phrase(column.getName(), font));
 				cell.setBackgroundColor(GrayColor.LIGHT_GRAY);
@@ -112,7 +106,7 @@ public class ReportGenerator
 					}
 				}
 
-				for(ColumnType column : columnOrder.getColumns())
+				for(ColumnType column : reportPreferences.getColumnOrder().getColumns())
 				{
 					PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font));
 					cell.setBackgroundColor(new BaseColor(Color.WHITE));
@@ -164,7 +158,7 @@ public class ReportGenerator
 		document.add(generateHeader());
 		document.add(Chunk.NEWLINE);
 		
-		if(includeBudget)
+		if(reportPreferences.isIncludeBudget())
 		{
 			Font fontGreen = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, new BaseColor(36, 122, 45));
 			Font fontRed = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, BaseColor.RED);
@@ -180,7 +174,7 @@ public class ReportGenerator
 		document.add(new Paragraph(Localization.getString(Strings.REPORT_HEADLINE_PAYMENTS_OVERVIEW), headerFont));
 		document.add(Chunk.NEWLINE);
 
-		if(splitTable)
+		if(reportPreferences.isSplitTable())
 		{
 			document.add(new Paragraph(Localization.getString(Strings.TITLE_INCOMES), smallHeaderFont));
 			document.add(Chunk.NEWLINE);
@@ -210,7 +204,7 @@ public class ReportGenerator
 			}
 		}
 
-		if(includeCategoryBudgets)
+		if(reportPreferences.isIncludeCategoryBudgets())
 		{
 			document.add(Chunk.NEWLINE);
 			document.add(new Paragraph(Localization.getString(Strings.TITLE_CATEGORY_BUDGETS), headerFont));
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportPreferences.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportPreferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f1b89a7b926a360406c5856a25eb72cdfb04362
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportPreferences.java
@@ -0,0 +1,80 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+public class ReportPreferences
+{
+	private ColumnOrder columnOrder;
+	private boolean includeBudget;
+	private boolean splitTable;
+	private boolean includeCategoryBudgets;
+	private ReportSorting reportSorting;
+	
+	public ReportPreferences()
+	{
+	
+	}
+
+	public ReportPreferences(ColumnOrder columnOrder, boolean includeBudget, boolean splitTable, boolean includeCategoryBudgets, ReportSorting reportSorting)
+	{		
+		this.columnOrder = columnOrder;
+		this.includeBudget = includeBudget;
+		this.splitTable = splitTable;
+		this.includeCategoryBudgets = includeCategoryBudgets;
+		this.reportSorting = reportSorting;
+	}
+
+	public ColumnOrder getColumnOrder()
+	{
+		return columnOrder;
+	}
+
+	public void setColumnOrder(ColumnOrder columnOrder)
+	{
+		this.columnOrder = columnOrder;
+	}
+
+	public boolean isIncludeBudget()
+	{
+		return includeBudget;
+	}
+
+	public void setIncludeBudget(boolean includeBudget)
+	{
+		this.includeBudget = includeBudget;
+	}
+
+	public boolean isSplitTable()
+	{
+		return splitTable;
+	}
+
+	public void setSplitTable(boolean splitTable)
+	{
+		this.splitTable = splitTable;
+	}
+
+	public boolean isIncludeCategoryBudgets()
+	{
+		return includeCategoryBudgets;
+	}
+
+	public void setIncludeCategoryBudgets(boolean includeCategoryBudgets)
+	{
+		this.includeCategoryBudgets = includeCategoryBudgets;
+	}
+
+	public ReportSorting getReportSorting()
+	{
+		return reportSorting;
+	}
+
+	public void setReportSorting(ReportSorting reportSorting)
+	{
+		this.reportSorting = reportSorting;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "ReportPreferences [columnOrder=" + columnOrder + ", includeBudget=" + includeBudget + ", splitTable=" + splitTable + ", includeCategoryBudgets=" + includeCategoryBudgets + ", reportSorting=" + reportSorting + "]";
+	}
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportSorting.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportSorting.java
new file mode 100644
index 0000000000000000000000000000000000000000..3607a97e1230569a8fcf5e478bff1782e21f1b65
--- /dev/null
+++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportSorting.java
@@ -0,0 +1,46 @@
+package de.deadlocker8.budgetmaster.logic.report;
+
+import javafx.scene.control.TableColumn.SortType;
+
+public class ReportSorting
+{
+	private ColumnType columnType;
+	private SortType sortType;
+	
+	public ReportSorting()
+	{
+		
+	}
+
+	public ReportSorting(ColumnType columnType, SortType sortType)
+	{
+		this.columnType = columnType;
+		this.sortType = sortType;
+	}
+
+	public ColumnType getColumnType()
+	{
+		return columnType;
+	}
+
+	public void setColumnType(ColumnType columnType)
+	{
+		this.columnType = columnType;
+	}
+
+	public SortType getSortType()
+	{
+		return sortType;
+	}
+
+	public void setSortType(SortType sortType)
+	{
+		this.sortType = sortType;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "ReportSorting [columnType=" + columnType + ", sortType=" + sortType + "]";
+	}
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java b/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
index 0aa0e89e7f43e2bfc0d77ddf25cac2e965c69392..3b0c4da6d85cf27f17078403097d5649d4110f26 100644
--- a/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
+++ b/src/de/deadlocker8/budgetmaster/logic/utils/FileHelper.java
@@ -59,4 +59,30 @@ public class FileHelper
 		writer.write(databaseJSON);
 		writer.close();
 	}
+	
+	public static Object loadObjectFromJSON(String fileName, Object objectype)
+	{		
+		try
+		{
+			Gson gson = new Gson();			
+			Reader reader = Files.newBufferedReader(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8"));
+			Object preferences = gson.fromJson(reader, objectype.getClass());
+			reader.close();
+			return preferences;
+		}
+		catch(IOException e)
+		{
+			return null;
+		}
+	}
+	
+	public static void saveObjectToJSON(String fileName, Object objectToSave) throws IOException
+	{		
+		Gson gson = new Gson();
+		String jsonString = gson.toJson(objectToSave);
+		PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER)));
+		Writer writer = Files.newBufferedWriter(Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/" + fileName + ".json"), Charset.forName("UTF-8"));
+		writer.write(jsonString);
+		writer.close();
+	}
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java
index af57c52c8509fa71620e8a8c737626c6979bb634..d53fa9cea838916d762e41f7418a443076e2b889 100644
--- a/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java
@@ -6,6 +6,7 @@ import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Optional;
 
@@ -22,7 +23,10 @@ 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.report.ReportPreferences;
+import de.deadlocker8.budgetmaster.logic.report.ReportSorting;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
+import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import de.deadlocker8.budgetmaster.logic.utils.Strings;
 import de.deadlocker8.budgetmaster.ui.Refreshable;
@@ -36,6 +40,7 @@ import javafx.collections.ObservableList;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
 import javafx.geometry.Pos;
+import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.scene.control.Alert;
@@ -47,6 +52,7 @@ import javafx.scene.control.Label;
 import javafx.scene.control.TableCell;
 import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableColumn.CellDataFeatures;
+import javafx.scene.control.TableColumn.SortType;
 import javafx.scene.control.TableView;
 import javafx.scene.control.cell.PropertyValueFactory;
 import javafx.scene.layout.AnchorPane;
@@ -77,6 +83,15 @@ public class ReportController implements Refreshable
 	private Controller controller;
 	private ColumnFilter columnFilter;
 	private String initialReportPath;
+	
+	private TableColumn<ReportItem, Integer> columnPosition;
+	private TableColumn<ReportItem, String> columnDate;
+	private TableColumn<ReportItem, Boolean> columnIsRepeating;
+	private TableColumn<ReportItem, String> columnCategory;
+	private TableColumn<ReportItem, Integer> columnName;
+	private TableColumn<ReportItem, String> columnDescription;
+	private TableColumn<ReportItem, Integer> columnRating;
+	private TableColumn<ReportItem, String> columnAmount;
 
 	public void init(Controller controller)
 	{
@@ -96,13 +111,94 @@ public class ReportController implements Refreshable
 		checkBoxIncludeBudget.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT) + "; -fx-font-size: 14;");
 		checkBoxSplitTable.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT) + "; -fx-font-size: 14;");
 		checkBoxIncludeCategoryBudgets.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT) + "; -fx-font-size: 14;");
+		
 
 		refresh();
+		prefill();
 	}
 	
-	private void initColumnPosition()
+	private void initColumn(ColumnType columnType, boolean activated)
 	{
-	    TableColumn<ReportItem, Integer> columnPosition = new TableColumn<>();
+		switch(columnType)
+		{
+			case AMOUNT:
+				initColumnAmount(activated);
+				toggleColumn(columnAmount, activated);
+				break;
+			case CATEGORY:
+				initColumnCategory(activated);
+				toggleColumn(columnCategory, activated);
+				break;
+			case DATE:
+				initColumnDate(activated);
+				toggleColumn(columnDate, activated);
+				break;
+			case DESCRIPTION:
+				initColumnDescription(activated);
+				toggleColumn(columnDescription, activated);
+				break;
+			case NAME:
+				initColumnName(activated);
+				toggleColumn(columnName, activated);
+				break;
+			case POSITION:
+				initColumnPosition(activated);
+				toggleColumn(columnPosition, activated);
+				break;
+			case RATING:
+				initColumnRating(activated);
+				toggleColumn(columnRating, activated);
+				break;
+			case REPEATING:
+				initColumnIsRepeating(activated);
+				toggleColumn(columnIsRepeating, activated);
+				break;
+			default:
+				break;					
+		}
+	}
+	
+	private void prefill()
+	{
+		Object loadedObject = FileHelper.loadObjectFromJSON("reportPreferences", new ReportPreferences());
+		if(loadedObject != null)
+		{
+			ReportPreferences reportPreferences = (ReportPreferences)loadedObject;
+			checkBoxIncludeBudget.setSelected(reportPreferences.isIncludeBudget());
+			checkBoxSplitTable.setSelected(reportPreferences.isSplitTable());
+			checkBoxIncludeCategoryBudgets.setSelected(reportPreferences.isIncludeCategoryBudgets());
+			
+			ArrayList<ColumnType> allColumns = new ArrayList<>(Arrays.asList(ColumnType.values()));			
+						
+			for(ColumnType currentType : reportPreferences.getColumnOrder().getColumns())
+			{
+				initColumn(currentType, true);				
+				allColumns.remove(currentType);
+			}
+			
+			for(ColumnType currentColumn : allColumns)
+			{
+				initColumn(currentColumn, false);
+			}
+			
+			//TODO prefill sorting
+		}
+		else
+		{
+			initColumnPosition(true);
+			initColumnDate(true);
+			initColumnIsRepeating(true);
+			initColumnCategory(true);
+			initColumnName(true);
+			initColumnDescription(true);
+			initColumnRating(true);
+			initColumnAmount(true);
+		}
+	}
+	
+	private void initColumnPosition(boolean activated)
+	{
+		columnPosition = new TableColumn<>();
         columnPosition.setUserData(ColumnType.POSITION);
         columnPosition.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("position"));
         columnPosition.setStyle("-fx-alignment: CENTER;");
@@ -112,24 +208,22 @@ public class ReportController implements Refreshable
         hboxColumnPosition.setSpacing(3);
         
         CheckBox checkBoxPositions = new CheckBox();
-        checkBoxPositions.setSelected(true);
         hboxColumnPosition.getChildren().add(checkBoxPositions);
 
         Label labelColumnPosition = new Label(Localization.getString(Strings.REPORT_POSITION));      
         hboxColumnPosition.getChildren().add(labelColumnPosition);
         
         checkBoxPositions.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnPosition.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.POSITION, c);
+        	 toggleColumn(columnPosition, c);
         });
+        checkBoxPositions.setSelected(activated);
         columnPosition.setGraphic(hboxColumnPosition);
         tableView.getColumns().add(columnPosition);
 	}
 	
-	private void initColumnDate()
+	private void initColumnDate(boolean activated)
 	{
-	    TableColumn<ReportItem, String> columnDate = new TableColumn<>();
+	    columnDate = new TableColumn<>();
         columnDate.setUserData(ColumnType.DATE);
         columnDate.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>()
         {
@@ -159,25 +253,23 @@ public class ReportController implements Refreshable
         hboxColumnDate.setSpacing(3);
         
         CheckBox checkBoxDate = new CheckBox();
-        checkBoxDate.setSelected(true);
         hboxColumnDate.getChildren().add(checkBoxDate);
 
         Label labelComlumnDate = new Label(Localization.getString(Strings.REPORT_DATE));
         hboxColumnDate.getChildren().add(labelComlumnDate);        
         
         checkBoxDate.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnDate.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.DATE, c);
+        	 toggleColumn(columnDate, c);
         });
+        checkBoxDate.setSelected(activated);
         columnDate.setGraphic(hboxColumnDate);
         columnDate.setComparator(new DateComparator());
         tableView.getColumns().add(columnDate);
 	}
 	
-	private void initColumnIsRepeating()
+	private void initColumnIsRepeating(boolean activated)
 	{
-	    TableColumn<ReportItem, Boolean> columnIsRepeating = new TableColumn<>();
+	    columnIsRepeating = new TableColumn<>();
         columnIsRepeating.setUserData(ColumnType.REPEATING);
         columnIsRepeating.setCellValueFactory(new PropertyValueFactory<ReportItem, Boolean>("repeating"));
         columnIsRepeating.setCellFactory(new Callback<TableColumn<ReportItem, Boolean>, TableCell<ReportItem, Boolean>>()
@@ -221,25 +313,23 @@ public class ReportController implements Refreshable
         hboxColumnIsRepeating.setSpacing(3);
         
         CheckBox checkBoxRepeating = new CheckBox();
-        checkBoxRepeating.setSelected(true);
         hboxColumnIsRepeating.getChildren().add(checkBoxRepeating);
         
         Label labelColumnIsRepeating = new Label(Localization.getString(Strings.REPORT_REPEATING));
         hboxColumnIsRepeating.getChildren().add(labelColumnIsRepeating);
         
         checkBoxRepeating.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnIsRepeating.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.REPEATING, c);
+        	 toggleColumn(columnIsRepeating, c);
         });
+        checkBoxRepeating.setSelected(activated);
         
         columnIsRepeating.setGraphic(hboxColumnIsRepeating);        
         tableView.getColumns().add(columnIsRepeating);
 	}
 	
-	private void initColumnCategory()
+	private void initColumnCategory(boolean activated)
 	{
-	    TableColumn<ReportItem, String> columnCategory = new TableColumn<>();
+	    columnCategory = new TableColumn<>();
         columnCategory.setUserData(ColumnType.CATEGORY);
         columnCategory.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>()
         {
@@ -256,24 +346,22 @@ public class ReportController implements Refreshable
         hboxColumnCategory.setSpacing(3);
         
         CheckBox checkBoxCategory = new CheckBox();
-        checkBoxCategory.setSelected(true);
         hboxColumnCategory.getChildren().add(checkBoxCategory);
         
         Label labelColumnCategory = new Label(Localization.getString(Strings.REPORT_CATEGORY));
         hboxColumnCategory.getChildren().add(labelColumnCategory);
         
         checkBoxCategory.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnCategory.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.CATEGORY, c);
+        	 toggleColumn(columnCategory, c);
         });
+        checkBoxCategory.setSelected(activated);
         columnCategory.setGraphic(hboxColumnCategory);    
         tableView.getColumns().add(columnCategory);
 	}
 	
-	private void initColumnName()
+	private void initColumnName(boolean activated)
 	{
-	    TableColumn<ReportItem, Integer> columnName = new TableColumn<>();
+	    columnName = new TableColumn<>();
         columnName.setUserData(ColumnType.NAME);
         columnName.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("name"));
         columnName.setStyle("-fx-alignment: CENTER;");
@@ -283,24 +371,22 @@ public class ReportController implements Refreshable
         hboxColumnName.setSpacing(3); 
         
         CheckBox checkBoxName = new CheckBox();
-        checkBoxName.setSelected(true);
         hboxColumnName.getChildren().add(checkBoxName);
         
         Label labelColumnName = new Label(Localization.getString(Strings.REPORT_NAME));
         hboxColumnName.getChildren().add(labelColumnName);        
         
         checkBoxName.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnName.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.NAME, c);
+        	 toggleColumn(columnName, c);
         });
+        checkBoxName.setSelected(activated);
         columnName.setGraphic(hboxColumnName);
         tableView.getColumns().add(columnName);
 	}
 	
-	private void initColumnDescription()
+	private void initColumnDescription(boolean activated)
 	{
-	    TableColumn<ReportItem, String> columnDescription = new TableColumn<>();
+	    columnDescription = new TableColumn<>();
         columnDescription.setUserData(ColumnType.DESCRIPTION);
         columnDescription.setCellValueFactory(new PropertyValueFactory<ReportItem, String>("description"));
         columnDescription.setStyle("-fx-alignment: CENTER;");
@@ -310,24 +396,22 @@ public class ReportController implements Refreshable
         hboxColumnDescription.setSpacing(3); 
         
         CheckBox checkBoxDescription = new CheckBox();
-        checkBoxDescription.setSelected(true);
         hboxColumnDescription.getChildren().add(checkBoxDescription);
         
         Label labelColumnDescription = new Label(Localization.getString(Strings.REPORT_DESCRIPTION));
         hboxColumnDescription.getChildren().add(labelColumnDescription);
         
         checkBoxDescription.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnDescription.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.DESCRIPTION, c);
+        	 toggleColumn(columnDescription, c);
         });
+        checkBoxDescription.setSelected(activated);
         columnDescription.setGraphic(hboxColumnDescription);
         tableView.getColumns().add(columnDescription);
 	}
 	
-	private void initColumnRating()
+	private void initColumnRating(boolean activated)
 	{
-	    TableColumn<ReportItem, Integer> columnRating = new TableColumn<>();
+	    columnRating = new TableColumn<>();
         columnRating.setUserData(ColumnType.RATING);
         columnRating.setCellValueFactory(new PropertyValueFactory<ReportItem, Integer>("amount"));
         columnRating.setCellFactory(new Callback<TableColumn<ReportItem, Integer>, TableCell<ReportItem, Integer>>()
@@ -371,25 +455,34 @@ public class ReportController implements Refreshable
         hboxColumnRating.setSpacing(3);         
         
         CheckBox checkBoxRating = new CheckBox();
-        checkBoxRating.setSelected(true);
         hboxColumnRating.getChildren().add(checkBoxRating);
         
         Label labelColumnRating = new Label(Localization.getString(Strings.REPORT_RATING));
         hboxColumnRating.getChildren().add(labelColumnRating);
         
         checkBoxRating.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);           
-            hboxColumnRating.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.RATING, c);
+        	 toggleColumn(columnRating, c);
         });
+        checkBoxRating.setSelected(activated);
         columnRating.setGraphic(hboxColumnRating);
         columnRating.setComparator(new RatingComparator());
         tableView.getColumns().add(columnRating);
 	}
 	
-	private void initColumnAmount()
+	private void toggleColumn(TableColumn<ReportItem, ?> column, boolean activated)
+	{
+		String style = activated ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);
+		Node graphic = column.getGraphic();
+		if(graphic != null)
+		{
+			graphic.setStyle(style);
+		}
+        columnFilter.toggleColumn((ColumnType)column.getUserData(), activated);
+	}
+	
+	private void initColumnAmount(boolean activated)
 	{
-	    TableColumn<ReportItem, String> columnAmount = new TableColumn<>();
+	    columnAmount = new TableColumn<>();
         columnAmount.setUserData(ColumnType.AMOUNT);
         columnAmount.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ReportItem, String>, ObservableValue<String>>()
         {
@@ -409,19 +502,17 @@ public class ReportController implements Refreshable
         hboxColumnAmount.setSpacing(3);
         
         CheckBox checkBoxAmount = new CheckBox();
-        checkBoxAmount.setSelected(true);
         hboxColumnAmount.getChildren().add(checkBoxAmount);
         
         Label labelColumnAmount = new Label(Localization.getString(Strings.REPORT_AMOUNT));
         hboxColumnAmount.getChildren().add(labelColumnAmount);
         
         checkBoxAmount.selectedProperty().addListener((a, b, c)->{
-            String style = c ? "" : "-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_REPORT_TABLE_HEADER_DISABLED);          
-            hboxColumnAmount.setStyle(style);
-            columnFilter.toggleColumn(ColumnType.AMOUNT, c);
+            toggleColumn(columnAmount, c);
         });
+        checkBoxAmount.setSelected(activated);
         columnAmount.setGraphic(hboxColumnAmount);
-        tableView.getColumns().add(columnAmount);
+        tableView.getColumns().add(columnAmount);               
 	}
 
 	private void initTable()
@@ -438,14 +529,9 @@ public class ReportController implements Refreshable
 
 		tableView.setFixedCellSize(26);
 		
-		initColumnPosition();
-		initColumnDate();
-		initColumnIsRepeating();
-		initColumnCategory();
-		initColumnName();
-		initColumnDescription();
-		initColumnRating();
-		initColumnAmount();
+		tableView.setOnSort((event)->{
+			System.out.println("sort");
+		});
 	}
 
 	public void filter()
@@ -517,6 +603,35 @@ public class ReportController implements Refreshable
 			{
 				columnOrder.addColumn(currentType);
 			}
+		}
+		
+		ReportSorting reportSorting = new ReportSorting();
+		ObservableList<TableColumn<ReportItem, ?>> sortOrder = tableView.getSortOrder();
+		if(sortOrder.size() >  0)
+		{
+			reportSorting.setColumnType((ColumnType)sortOrder.get(0).getUserData());
+			reportSorting.setSortType(sortOrder.get(0).getSortType());
+		}
+		else
+		{
+			reportSorting.setColumnType(ColumnType.DATE);
+			reportSorting.setSortType(SortType.DESCENDING);
+		}		
+		
+		ReportPreferences reportPreferences = new ReportPreferences(columnOrder, 
+																	checkBoxIncludeBudget.isSelected(),
+																	checkBoxSplitTable.isSelected(),
+																	checkBoxIncludeCategoryBudgets.isSelected(),
+																	reportSorting);
+		
+		//save report preferences
+		try
+		{
+			FileHelper.saveObjectToJSON("reportPreferences", reportPreferences);			
+		}
+		catch(IOException e2)
+		{
+			Logger.error(e2);
 		}		
 		
 		FileChooser fileChooser = new FileChooser();
@@ -531,10 +646,7 @@ public class ReportController implements Refreshable
 			
 			ReportGenerator reportGenerator = new ReportGenerator(new ArrayList<ReportItem>(tableView.getItems()),
 																controller.getCategoryBudgets(),
-																columnOrder,
-																checkBoxIncludeBudget.isSelected(),
-																checkBoxSplitTable.isSelected(), 
-																checkBoxIncludeCategoryBudgets.isSelected(),																
+																reportPreferences,														
 																file,
 																controller.getSettings().getCurrency(),
 																controller.getCurrentDate(),