diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java b/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java
index d0832eeee764b025b3ae4f7b125bd2c476119763..4f96ea1fe712ab19107c5c37da78107ab2b11872 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java
@@ -2,7 +2,9 @@ package de.deadlocker8.budgetmaster.charts;
 
 import com.google.gson.annotations.Expose;
 
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 import java.util.Objects;
@@ -27,14 +29,16 @@ public class Chart
 	private int version;
 
 	private ChartDisplayType displayType;
+	private ChartGroupType groupType;
 
-	public Chart(String name, String script, ChartType type, int version, ChartDisplayType displayType)
+	public Chart(String name, String script, ChartType type, int version, ChartDisplayType displayType, ChartGroupType groupType)
 	{
 		this.name = name;
 		this.script = script;
 		this.type = type;
 		this.version = version;
 		this.displayType = displayType;
+		this.groupType = groupType;
 	}
 
 	public Chart()
@@ -101,6 +105,16 @@ public class Chart
 		this.displayType = displayType;
 	}
 
+	public ChartGroupType getGroupType()
+	{
+		return groupType;
+	}
+
+	public void setGroupType(ChartGroupType chartGroupType)
+	{
+		this.groupType = chartGroupType;
+	}
+
 	@Override
 	public String toString()
 	{
@@ -111,6 +125,7 @@ public class Chart
 				", type=" + type +
 				", version=" + version +
 				", displayType=" + displayType +
+				", chartGroupType=" + groupType +
 				'}';
 	}
 
@@ -120,12 +135,12 @@ public class Chart
 		if(this == o) return true;
 		if(o == null || getClass() != o.getClass()) return false;
 		Chart chart = (Chart) o;
-		return version == chart.version && Objects.equals(ID, chart.ID) && Objects.equals(name, chart.name) && Objects.equals(script, chart.script) && type == chart.type && displayType == chart.displayType;
+		return version == chart.version && Objects.equals(ID, chart.ID) && Objects.equals(name, chart.name) && Objects.equals(script, chart.script) && type == chart.type && displayType == chart.displayType && groupType == chart.groupType;
 	}
 
 	@Override
 	public int hashCode()
 	{
-		return Objects.hash(ID, name, script, type, version, displayType);
+		return Objects.hash(ID, name, script, type, version, displayType, groupType);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
index e2e8b06a66b061d49c033bb54398bd3b628e2fa3..5618486561500bb2d5d9ce8b26f9693327c3e7d4 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
@@ -124,15 +124,9 @@ public class ChartController extends BaseController
 		ChartValidator userValidator = new ChartValidator();
 		userValidator.validate(chart, bindingResult);
 
-		if(chart.getType() == null)
-		{
-			chart.setType(ChartType.CUSTOM);
-		}
-
-		if(chart.getDisplayType() == null)
-		{
-			chart.setDisplayType(ChartDisplayType.CUSTOM);
-		}
+		chart.setType(ChartType.CUSTOM);
+		chart.setDisplayType(ChartDisplayType.CUSTOM);
+		chart.setGroupType(ChartGroupType.NONE);
 
 		if(bindingResult.hasErrors())
 		{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartGroupType.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartGroupType.java
new file mode 100644
index 0000000000000000000000000000000000000000..578f173c3f098b9f0899cd2abceb63e88ec0f8aa
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartGroupType.java
@@ -0,0 +1,8 @@
+package de.deadlocker8.budgetmaster.charts;
+
+public enum ChartGroupType
+{
+	NONE,
+	MONTH,
+	YEAR
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java
index b1431f9729d11a3598801f2b6c834b87bcf74e62..e479e0f2b2bfc1ebf5952330148c728ed57602da 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java
@@ -72,6 +72,7 @@ public class ChartService implements Resettable, AccessAllEntities<Chart>
 				currentChart.setVersion(chart.getVersion());
 				currentChart.setScript(chart.getScript());
 				currentChart.setDisplayType(chart.getDisplayType());
+				currentChart.setGroupType(chart.getGroupType());
 				chartRepository.save(currentChart);
 			}
 		}
@@ -89,6 +90,13 @@ public class ChartService implements Resettable, AccessAllEntities<Chart>
 	}
 
 	private void updateUserCharts()
+	{
+		updateContainerIdUsage();
+
+		updateMissingAttributes();
+	}
+
+	private void updateContainerIdUsage()
 	{
 		final List<Chart> userCharts = getRepository().findAllByType(ChartType.CUSTOM);
 		for(Chart userChart : userCharts)
@@ -96,7 +104,7 @@ public class ChartService implements Resettable, AccessAllEntities<Chart>
 			String script = userChart.getScript();
 			if(script.contains(PATTERN_OLD_CONTAINER_ID))
 			{
-				LOGGER.debug(MessageFormat.format("Updating user chart ''{0}'' with ID {1}", userChart.getName(), userChart.getID()));
+				LOGGER.debug(MessageFormat.format("Updating container id usage for user chart ''{0}'' with ID {1}", userChart.getName(), userChart.getID()));
 				script = script.replace(PATTERN_OLD_CONTAINER_ID, PATTERN_DYNAMIC_CONTAINER_ID);
 				userChart.setScript(script);
 				getRepository().save(userChart);
@@ -104,6 +112,31 @@ public class ChartService implements Resettable, AccessAllEntities<Chart>
 		}
 	}
 
+	private void updateMissingAttributes()
+	{
+		final List<Chart> userCharts = getRepository().findAllByType(ChartType.CUSTOM);
+		for(Chart userChart : userCharts)
+		{
+			boolean changed = false;
+			if(userChart.getDisplayType() == null)
+			{
+				userChart.setDisplayType(ChartDisplayType.CUSTOM);
+				changed = true;
+			}
+			if(userChart.getGroupType() == null)
+			{
+				userChart.setGroupType(ChartGroupType.NONE);
+				changed = true;
+			}
+
+			if(changed)
+			{
+				LOGGER.debug(MessageFormat.format("Updating missing attributes for user chart ''{0}'' with ID {1}", userChart.getName(), userChart.getID()));
+				getRepository().save(userChart);
+			}
+		}
+	}
+
 	@Override
 	public List<Chart> getAllEntitiesAsc()
 	{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
index e7b357f008c2683b4b0db31f3f5462a3853e1a19..40838aa2e87cfcd566714078817f8f5ad0219a68 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
@@ -16,39 +16,39 @@ public class DefaultCharts
 
 	public static final Chart CHART_DEFAULT = new Chart(null,
 			getChartFromFile("charts/Default.js"),
-			ChartType.CUSTOM, -1, ChartDisplayType.CUSTOM);
+			ChartType.CUSTOM, -1, ChartDisplayType.CUSTOM, ChartGroupType.NONE);
 
 	private static final Chart CHART_ACCOUNT_SUM_PER_DAY = new Chart("charts.default.accountSumPerDay",
 			getChartFromFile("charts/AccountSumPerDay.js"),
-			ChartType.DEFAULT, 8, ChartDisplayType.LINE);
+			ChartType.DEFAULT, 10, ChartDisplayType.LINE, ChartGroupType.NONE);
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BAR = new Chart("charts.default.incomesAndExpendituresPerMonthBar",
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthBar.js"),
-			ChartType.DEFAULT, 8, ChartDisplayType.BAR);
+			ChartType.DEFAULT, 10, ChartDisplayType.BAR, ChartGroupType.MONTH);
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_LINE = new Chart("charts.default.incomesAndExpendituresPerMonthLine",
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthLine.js"),
-			ChartType.DEFAULT, 8, ChartDisplayType.LINE);
+			ChartType.DEFAULT, 10, ChartDisplayType.LINE, ChartGroupType.MONTH);
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_BAR = new Chart("charts.default.incomesAndExpendituresByCategoryBar",
 			getChartFromFile("charts/IncomesAndExpendituresByCategoryBar.js"),
-			ChartType.DEFAULT, 3, ChartDisplayType.BAR);
+			ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.NONE);
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_PIE = new Chart("charts.default.incomesAndExpendituresByCategoryPie",
 			getChartFromFile("charts/IncomesAndExpendituresByCategoryPie.js"),
-			ChartType.DEFAULT, 4, ChartDisplayType.PIE);
+			ChartType.DEFAULT, 6, ChartDisplayType.PIE, ChartGroupType.NONE);
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BY_CATEGORIES = new Chart("charts.default.incomesAndExpendituresPerMonthByCategories",
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthByCategories.js"),
-			ChartType.DEFAULT, 18, ChartDisplayType.BAR);
+			ChartType.DEFAULT, 20, ChartDisplayType.BAR, ChartGroupType.MONTH);
 
 	private static final Chart CHART_REST_PER_MONTH = new Chart("charts.default.restPerMonth",
 			getChartFromFile("charts/RestPerMonth.js"),
-			ChartType.DEFAULT, 4, ChartDisplayType.BAR);
+			ChartType.DEFAULT, 6, ChartDisplayType.BAR, ChartGroupType.MONTH);
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_YEAR_BAR = new Chart("charts.default.incomesAndExpendituresPerYearBar",
 			getChartFromFile("charts/IncomesAndExpendituresPerYearBar.js"),
-			ChartType.DEFAULT, 3, ChartDisplayType.BAR);
+			ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.YEAR);
 
 	private DefaultCharts()
 	{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java
index a2dddcfa40202cd0dc5c544f64b7b69d21b91841..fb0bf54e3d008979d0b0ce76675747e9cd6b585d 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java
@@ -2,6 +2,7 @@ package de.deadlocker8.budgetmaster.database.model.converter;
 
 import de.deadlocker8.budgetmaster.charts.Chart;
 import de.deadlocker8.budgetmaster.charts.ChartDisplayType;
+import de.deadlocker8.budgetmaster.charts.ChartGroupType;
 import de.deadlocker8.budgetmaster.database.model.Converter;
 import de.deadlocker8.budgetmaster.database.model.v5.BackupChart_v5;
 
@@ -21,6 +22,7 @@ public class ChartConverter implements Converter<Chart, BackupChart_v5>
 		chart.setVersion(backupChart.getVersion());
 		chart.setScript(backupChart.getScript());
 		chart.setDisplayType(ChartDisplayType.CUSTOM);
+		chart.setGroupType(ChartGroupType.NONE);
 		return chart;
 	}
 
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
index b3bfee969ceffcb3b45a6143b20c450741e77b70..6174a6655790f4e05ca3987f6fbf748720aa9a4d 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
@@ -242,6 +242,7 @@ class DatabaseExportTest
 		chart.setVersion(7);
 		chart.setScript("/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n");
 		chart.setDisplayType(ChartDisplayType.CUSTOM);
+		chart.setGroupType(ChartGroupType.NONE);
 
 		ChartRepository chartRepositoryMock = Mockito.mock(ChartRepository.class);
 		Mockito.when(chartRepositoryMock.findAllByType(Mockito.any())).thenReturn(List.of(chart));
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java
index 532319e80c0660bb29891a8e31ecf4564f0f1644..e1d829406f91c839ac9d461469f588860c17c963 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java
@@ -6,6 +6,7 @@ import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.categories.CategoryType;
 import de.deadlocker8.budgetmaster.charts.Chart;
 import de.deadlocker8.budgetmaster.charts.ChartDisplayType;
+import de.deadlocker8.budgetmaster.charts.ChartGroupType;
 import de.deadlocker8.budgetmaster.charts.ChartType;
 import de.deadlocker8.budgetmaster.database.DatabaseParser_v7;
 import de.deadlocker8.budgetmaster.database.InternalDatabase;
@@ -67,7 +68,7 @@ class DatabaseParser_v7_convertToInternalTest
 			DatabaseParser_v7 importer = new DatabaseParser_v7(json);
 			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
 
-			final Chart chart = new Chart("The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7, ChartDisplayType.CUSTOM);
+			final Chart chart = new Chart("The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7, ChartDisplayType.CUSTOM, ChartGroupType.NONE);
 			chart.setID(9);
 
 			assertThat(database.getCharts()).hasSize(1)