From 1707bae3bdcf2dc15b8759c317597358a828282a Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 20 Feb 2022 16:47:15 +0100
Subject: [PATCH] Fixed #671 - Only save dates to database (instead of date and
 time):

- use LocalDate instead
- remove joda.time
- remove org.jadira.usertype
---
 pom.xml                                       |  20 +--
 .../de/deadlocker8/budgetmaster/Main.java     |   2 -
 .../budgetmaster/backup/GitBackupTask.java    |   3 +-
 .../budgetmaster/charts/ChartController.java  |   6 +-
 .../budgetmaster/charts/ChartSettings.java    |  23 +--
 .../controller/DatePickerController.java      |  14 +-
 .../database/DatabaseService.java             |   3 +-
 .../RepeatingEndOptionConverter.java          |  12 +-
 .../converter/RepeatingOptionConverter.java   |  10 +-
 .../model/converter/TransactionConverter.java |   9 +-
 .../repeating/RepeatingOption.java            |  26 +--
 .../RepeatingTransactionUpdater.java          |  10 +-
 .../repeating/endoption/RepeatingEnd.java     |  10 +-
 .../endoption/RepeatingEndAfterXTimes.java    |  11 +-
 .../repeating/endoption/RepeatingEndDate.java |  17 +-
 .../endoption/RepeatingEndNever.java          |   5 +-
 .../repeating/modifier/RepeatingModifier.java |   8 +-
 .../modifier/RepeatingModifierDays.java       |   9 +-
 .../modifier/RepeatingModifierMonths.java     |   9 +-
 .../modifier/RepeatingModifierYears.java      |   9 +-
 .../reports/HeaderFooterPageEvent.java        |   4 +-
 .../reports/ReportController.java             |  11 +-
 .../reports/ReportGeneratorService.java       |  10 +-
 .../reports/settings/ReportSettings.java      |  13 +-
 .../budgetmaster/services/DateService.java    |  28 ++--
 .../budgetmaster/services/HelpersService.java |   4 +-
 .../budgetmaster/services/ImportService.java  |   4 +-
 .../budgetmaster/settings/Settings.java       |  12 +-
 .../templates/TemplateController.java         |   4 +-
 .../transactions/Transaction.java             |  10 +-
 .../transactions/TransactionController.java   |  34 ++--
 .../transactions/TransactionRepository.java   |  12 +-
 .../transactions/TransactionService.java      |  36 ++---
 .../TransactionSpecifications.java            |   4 +-
 .../transactions/Transaction_.java            |   4 +-
 .../budgetmaster/utils/DateHelper.java        |  14 +-
 src/main/resources/application.properties     |   2 -
 .../resources/languages/base_de.properties    |   2 +-
 .../resources/languages/base_en.properties    |   2 +-
 .../templates/helpers/globalDatePicker.ftl    |   2 +-
 .../selenium/LoginControllerTest.java         |  33 ----
 .../TransactionSearchSpecificationsTest.java  |  15 +-
 .../unit/TransactionServiceDatabaseTest.java  |  36 ++---
 .../unit/TransactionSpecificationsTest.java   |  66 ++++----
 .../unit/backup/LocalGitBackupTaskTest.java   | 125 +++++++--------
 .../unit/backup/RemoteGitBackupTaskTest.java  | 148 +++++++++---------
 .../unit/database/DatabaseExportTest.java     |   6 +-
 ...tabaseParser_v8_convertToInternalTest.java |  18 +--
 .../unit/database/ImportServiceTest.java      |  32 ++--
 .../unit/repeating/RepeatingOptionTest.java   | 104 ++++++------
 50 files changed, 484 insertions(+), 527 deletions(-)

diff --git a/pom.xml b/pom.xml
index 59af88c90..147abf625 100644
--- a/pom.xml
+++ b/pom.xml
@@ -71,8 +71,6 @@
         <natorder.version>1.1.2</natorder.version>
         <h2database.version>1.4.199</h2database.version>
         <itextpdf.version>5.5.13.2</itextpdf.version>
-        <usertype-core.version>7.0.0.CR1</usertype-core.version>
-        <joda-time.version>2.10.13</joda-time.version>
         <vanilla-picker.version>2.12.1</vanilla-picker.version>
         <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version>
         <dependency-check-maven.version>6.5.3</dependency-check-maven.version>
@@ -124,18 +122,6 @@
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>joda-time</groupId>
-            <artifactId>joda-time</artifactId>
-            <version>${joda-time.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jadira.usertype</groupId>
-            <artifactId>usertype.core</artifactId>
-            <version>${usertype-core.version}</version>
-        </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
@@ -256,6 +242,12 @@
             <version>${assertj-core.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-inline</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/de/deadlocker8/budgetmaster/Main.java b/src/main/java/de/deadlocker8/budgetmaster/Main.java
index ed535703a..edbee1b17 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/Main.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/Main.java
@@ -5,7 +5,6 @@ import de.thecodelabs.utils.util.Localization;
 import de.thecodelabs.utils.util.SystemUtils;
 import de.thecodelabs.utils.util.localization.LocalizationMessageFormatter;
 import de.thecodelabs.utils.util.localization.formatter.JavaMessageFormatter;
-import org.joda.time.DateTimeZone;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.ApplicationArguments;
@@ -32,7 +31,6 @@ public class Main extends SpringBootServletInitializer implements ApplicationRun
 
 	static
 	{
-		DateTimeZone.setDefault(DateTimeZone.UTC);
 		prepare(new String[0]);
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java b/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java
index 74232c27b..97062f460 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/backup/GitBackupTask.java
@@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory;
 
 import java.nio.file.Path;
 import java.text.MessageFormat;
+import java.time.format.DateTimeFormatter;
 
 public abstract class GitBackupTask extends BackupTask
 {
@@ -54,7 +55,7 @@ public abstract class GitBackupTask extends BackupTask
 		}
 
 		LOGGER.debug("Committing changes...");
-		GitHelper.commitChanges(git, DateHelper.getCurrentDate().toString(DATE_PATTERN));
+		GitHelper.commitChanges(git, DateHelper.getCurrentDateTime().format(DateTimeFormatter.ofPattern(DATE_PATTERN)));
 		return true;
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
index 37866d98d..7b30e3673 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
@@ -16,8 +16,6 @@ import de.deadlocker8.budgetmaster.utils.WebRequestUtils;
 import de.deadlocker8.budgetmaster.utils.notification.Notification;
 import de.deadlocker8.budgetmaster.utils.notification.NotificationType;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -25,6 +23,8 @@ import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.WebRequest;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -62,7 +62,7 @@ public class ChartController extends BaseController
 	private static final Gson GSON = new GsonBuilder()
 			.excludeFieldsWithoutExposeAnnotation()
 			.setPrettyPrinting()
-			.registerTypeAdapter(DateTime.class, (JsonSerializer<DateTime>) (json, typeOfSrc, context) -> new JsonPrimitive(ISODateTimeFormat.date().print(json)))
+			.registerTypeAdapter(LocalDate.class, (JsonSerializer<LocalDate>) (json, typeOfSrc, context) -> new JsonPrimitive(json.format(DateTimeFormatter.ISO_DATE)))
 			.create();
 
 	private final ChartService chartService;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartSettings.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartSettings.java
index d972cd0fb..5ba28f33a 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartSettings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartSettings.java
@@ -1,10 +1,13 @@
 package de.deadlocker8.budgetmaster.charts;
 
 import de.deadlocker8.budgetmaster.filter.FilterConfiguration;
-import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.time.LocalDate;
+
+import static java.time.temporal.TemporalAdjusters.firstDayOfMonth;
+import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
+
 
 public class ChartSettings
 {
@@ -13,21 +16,21 @@ public class ChartSettings
 
 	private Integer chartID;
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
-	private DateTime startDate;
+	private LocalDate startDate;
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
-	private DateTime endDate;
+	private LocalDate endDate;
 	private FilterConfiguration filterConfiguration;
 
 	public static ChartSettings getDefault(FilterConfiguration filterConfiguration)
 	{
-		return new ChartSettings(ChartDisplayType.BAR, ChartGroupType.MONTH, null, DateHelper.getCurrentDateWithUTC().withDayOfMonth(1), DateHelper.getCurrentDateWithUTC().dayOfMonth().withMaximumValue(), filterConfiguration);
+		return new ChartSettings(ChartDisplayType.BAR, ChartGroupType.MONTH, null, LocalDate.now().with(firstDayOfMonth()), LocalDate.now().with(lastDayOfMonth()), filterConfiguration);
 	}
 
 	public ChartSettings()
 	{
 	}
 
-	public ChartSettings(ChartDisplayType displayType, ChartGroupType groupType, Integer chartID, DateTime startDate, DateTime endDate, FilterConfiguration filterConfiguration)
+	public ChartSettings(ChartDisplayType displayType, ChartGroupType groupType, Integer chartID, LocalDate startDate, LocalDate endDate, FilterConfiguration filterConfiguration)
 	{
 		this.displayType = displayType;
 		this.groupType = groupType;
@@ -67,22 +70,22 @@ public class ChartSettings
 		this.chartID = chartID;
 	}
 
-	public DateTime getStartDate()
+	public LocalDate getStartDate()
 	{
 		return startDate;
 	}
 
-	public void setStartDate(DateTime startDate)
+	public void setStartDate(LocalDate startDate)
 	{
 		this.startDate = startDate;
 	}
 
-	public DateTime getEndDate()
+	public LocalDate getEndDate()
 	{
 		return endDate;
 	}
 
-	public void setEndDate(DateTime endDate)
+	public void setEndDate(LocalDate endDate)
 	{
 		this.endDate = endDate;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java
index 77af76895..8af33f30f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/DatePickerController.java
@@ -4,9 +4,6 @@ import de.deadlocker8.budgetmaster.services.DateFormatStyle;
 import de.deadlocker8.budgetmaster.services.DateService;
 import de.deadlocker8.budgetmaster.settings.Settings;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
-import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.CookieValue;
@@ -15,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 
 @Controller
@@ -36,7 +35,7 @@ public class DatePickerController extends BaseController
 	public String previousMonth(HttpServletResponse response, @CookieValue(COOKIE_NAME) String date, @RequestParam("target") String target)
 	{
 		Settings settings = settingsService.getSettings();
-		DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
+		LocalDate currentDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
 		currentDate = currentDate.minusMonths(1);
 
 		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
@@ -47,7 +46,7 @@ public class DatePickerController extends BaseController
 	public String nextMonth(HttpServletResponse response, @CookieValue(COOKIE_NAME) String date, @RequestParam("target") String target)
 	{
 		Settings settings = settingsService.getSettings();
-		DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
+		LocalDate currentDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
 		currentDate = currentDate.plusMonths(1);
 
 		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
@@ -58,7 +57,7 @@ public class DatePickerController extends BaseController
 	public String setDate(HttpServletResponse response, @CookieValue(COOKIE_NAME) String date, @RequestParam("target") String target)
 	{
 		Settings settings = settingsService.getSettings();
-		DateTime currentDate = DateTime.parse(date, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
+		LocalDate currentDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settings.getLanguage().getLocale()));
 
 		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
 		return "redirect:" + target;
@@ -67,8 +66,7 @@ public class DatePickerController extends BaseController
 	@GetMapping(value = "/today")
 	public String today(HttpServletResponse response, @RequestParam("target") String target)
 	{
-		DateTime currentDate = DateHelper.getCurrentDate();
-		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(currentDate)));
+		response.addCookie(new Cookie(COOKIE_NAME, dateService.getDateStringNormal(LocalDate.now())));
 		return "redirect:" + target;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
index 50f59105b..f9a6a9d0f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseService.java
@@ -39,6 +39,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.text.MessageFormat;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Stream;
@@ -252,7 +253,7 @@ public class DatabaseService
 
 	public static String getExportFileName()
 	{
-		return "BudgetMasterDatabase_" + DateHelper.getCurrentDate().toString(BACKUP_DATE_FORMAT) + ".json";
+		return "BudgetMasterDatabase_" + DateHelper.getCurrentDateTime().format(DateTimeFormatter.ofPattern(BACKUP_DATE_FORMAT)) + ".json";
 	}
 
 	public BackupDatabase getDatabaseForJsonSerialization()
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingEndOptionConverter.java b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingEndOptionConverter.java
index 1465146d6..80bc00b18 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingEndOptionConverter.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingEndOptionConverter.java
@@ -4,8 +4,9 @@ import de.deadlocker8.budgetmaster.database.model.Converter;
 import de.deadlocker8.budgetmaster.database.model.v4.BackupRepeatingEndOption_v4;
 import de.deadlocker8.budgetmaster.repeating.endoption.*;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 public class RepeatingEndOptionConverter implements Converter<RepeatingEnd, BackupRepeatingEndOption_v4>
 {
@@ -28,8 +29,7 @@ public class RepeatingEndOptionConverter implements Converter<RepeatingEnd, Back
 				endOption = new RepeatingEndAfterXTimes(backupItem.getTimes());
 				break;
 			case DATE:
-				DateTime endDate = DateTime.parse(backupItem.getEndDate(), DateTimeFormat.forPattern("yyyy-MM-dd"));
-				endDate = endDate.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+				LocalDate endDate = LocalDate.parse(backupItem.getEndDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 				endOption = new RepeatingEndDate(endDate);
 				break;
 		}
@@ -50,8 +50,8 @@ public class RepeatingEndOptionConverter implements Converter<RepeatingEnd, Back
 
 		if(internalItem instanceof RepeatingEndDate repeatingEndDate)
 		{
-			final DateTime endDate = (DateTime) repeatingEndDate.getValue();
-			repeatingEndOption.setEndDate(endDate.toString(DateTimeFormat.forPattern("yyyy-MM-dd")));
+			final LocalDate endDate = (LocalDate) repeatingEndDate.getValue();
+			repeatingEndOption.setEndDate(endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
 		}
 
 		if(internalItem instanceof RepeatingEndAfterXTimes repeatingEndAfterXTimes)
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingOptionConverter.java b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingOptionConverter.java
index 06ab54dea..18b5ff77c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingOptionConverter.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/RepeatingOptionConverter.java
@@ -3,8 +3,9 @@ package de.deadlocker8.budgetmaster.database.model.converter;
 import de.deadlocker8.budgetmaster.database.model.Converter;
 import de.deadlocker8.budgetmaster.database.model.v4.BackupRepeatingOption_v4;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 public class RepeatingOptionConverter implements Converter<RepeatingOption, BackupRepeatingOption_v4>
 {
@@ -18,8 +19,7 @@ public class RepeatingOptionConverter implements Converter<RepeatingOption, Back
 
 		final RepeatingOption repeatingOption = new RepeatingOption();
 
-		DateTime startDate = DateTime.parse(backupItem.getStartDate(), DateTimeFormat.forPattern("yyyy-MM-dd"));
-		startDate = startDate.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+		LocalDate startDate = LocalDate.parse(backupItem.getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 		repeatingOption.setStartDate(startDate);
 
 		repeatingOption.setModifier(new RepeatingModifierConverter().convertToInternalForm(backupItem.getModifier()));
@@ -36,7 +36,7 @@ public class RepeatingOptionConverter implements Converter<RepeatingOption, Back
 		}
 
 		final BackupRepeatingOption_v4 repeatingOption = new BackupRepeatingOption_v4();
-		repeatingOption.setStartDate(internalItem.getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd")));
+		repeatingOption.setStartDate(internalItem.getStartDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
 		repeatingOption.setModifier(new RepeatingModifierConverter().convertToExternalForm(internalItem.getModifier()));
 		repeatingOption.setEndOption(new RepeatingEndOptionConverter().convertToExternalForm(internalItem.getEndOption()));
 		return repeatingOption;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/TransactionConverter.java b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/TransactionConverter.java
index d923ce5fe..58f60e29b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/TransactionConverter.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/TransactionConverter.java
@@ -7,9 +7,9 @@ import de.deadlocker8.budgetmaster.database.model.v4.BackupTag_v4;
 import de.deadlocker8.budgetmaster.database.model.v6.BackupTransaction_v6;
 import de.deadlocker8.budgetmaster.tags.Tag;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -40,8 +40,7 @@ public class TransactionConverter implements Converter<Transaction, BackupTransa
 		transaction.setAccount(getItemById(availableAccounts, backupTransaction.getAccountID()));
 		transaction.setTransferAccount(getItemById(availableAccounts, backupTransaction.getTransferAccountID()));
 
-		DateTime date = DateTime.parse(backupTransaction.getDate(), DateTimeFormat.forPattern("yyyy-MM-dd"));
-		date = date.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+		LocalDate date = LocalDate.parse(backupTransaction.getDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 		transaction.setDate(date);
 
 		List<Tag> convertedTags = new ArrayList<>();
@@ -77,7 +76,7 @@ public class TransactionConverter implements Converter<Transaction, BackupTransa
 			transaction.setTransferAccountID(internalItem.getTransferAccount().getID());
 		}
 
-		transaction.setDate(internalItem.getDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd")));
+		transaction.setDate(internalItem.getDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
 
 		List<BackupTag_v4> convertedTags = new ArrayList<>();
 		TagConverter tagConverter = new TagConverter();
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOption.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOption.java
index 3b0b0b077..e378b2a2b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOption.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingOption.java
@@ -1,13 +1,13 @@
 package de.deadlocker8.budgetmaster.repeating;
 
 import com.google.gson.annotations.Expose;
-import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEnd;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifier;
-import org.joda.time.DateTime;
+import de.deadlocker8.budgetmaster.transactions.Transaction;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.persistence.*;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -22,7 +22,7 @@ public class RepeatingOption
 
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
 	@Expose
-	private DateTime startDate;
+	private LocalDate startDate;
 
 	@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
 	@Expose
@@ -35,14 +35,16 @@ public class RepeatingOption
 	@OneToMany(cascade = CascadeType.ALL, mappedBy = "repeatingOption", fetch = FetchType.LAZY)
 	private List<Transaction> referringTransactions;
 
-	public RepeatingOption(DateTime startDate, RepeatingModifier modifier, RepeatingEnd endOption)
+	public RepeatingOption(LocalDate startDate, RepeatingModifier modifier, RepeatingEnd endOption)
 	{
 		this.startDate = startDate;
 		this.modifier = modifier;
 		this.endOption = endOption;
 	}
 
-	public RepeatingOption() {}
+	public RepeatingOption()
+	{
+	}
 
 	public Integer getID()
 	{
@@ -54,12 +56,12 @@ public class RepeatingOption
 		this.ID = ID;
 	}
 
-	public DateTime getStartDate()
+	public LocalDate getStartDate()
 	{
 		return startDate;
 	}
 
-	public void setStartDate(DateTime startDate)
+	public void setStartDate(LocalDate startDate)
 	{
 		this.startDate = startDate;
 	}
@@ -94,20 +96,20 @@ public class RepeatingOption
 		this.referringTransactions = referringTransactions;
 	}
 
-	public List<DateTime> getRepeatingDates(DateTime dateFetchLimit)
+	public List<LocalDate> getRepeatingDates(LocalDate dateFetchLimit)
 	{
-		List<DateTime> dates = new ArrayList<>();
+		List<LocalDate> dates = new ArrayList<>();
 		dates.add(startDate);
 		while(!endOption.isEndReached(dates))
 		{
-			DateTime lastDate = dates.get(dates.size() - 1);
-			DateTime nextDate = modifier.getNextDate(lastDate);
+			LocalDate lastDate = dates.get(dates.size() - 1);
+			LocalDate nextDate = modifier.getNextDate(lastDate);
 			if(nextDate.isAfter(dateFetchLimit))
 			{
 				return dates;
 			}
 
-			List<DateTime> temporaryList = new ArrayList<>(dates);
+			List<LocalDate> temporaryList = new ArrayList<>(dates);
 			temporaryList.add(nextDate);
 			if(endOption.isEndReached(temporaryList))
 			{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingTransactionUpdater.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingTransactionUpdater.java
index 67f10eb26..3f86564ea 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingTransactionUpdater.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/RepeatingTransactionUpdater.java
@@ -2,10 +2,10 @@ package de.deadlocker8.budgetmaster.repeating;
 
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionService;
-import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
 import java.util.List;
 
 @Service
@@ -21,14 +21,14 @@ public class RepeatingTransactionUpdater
 		this.repeatingOptionRepository = repeatingOptionRepository;
 	}
 
-	public void updateRepeatingTransactions(DateTime now)
+	public void updateRepeatingTransactions(LocalDate now)
 	{
 		List<RepeatingOption> repeatingOptions = repeatingOptionRepository.findAllByOrderByStartDateAsc();
 		for(RepeatingOption option : repeatingOptions)
 		{
 			List<Transaction> transactions = transactionService.getRepository().findAllByRepeatingOption(option);
-			List<DateTime> correctDates = option.getRepeatingDates(now);
-			for(DateTime currentDate : correctDates)
+			List<LocalDate> correctDates = option.getRepeatingDates(now);
+			for(LocalDate currentDate : correctDates)
 			{
 				if(!containsDate(transactions, currentDate))
 				{
@@ -41,7 +41,7 @@ public class RepeatingTransactionUpdater
 		}
 	}
 
-	private boolean containsDate(List<Transaction> transactions, DateTime date)
+	private boolean containsDate(List<Transaction> transactions, LocalDate date)
 	{
 		for(Transaction currentTransaction : transactions)
 		{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java
index a830b1bb0..fbbb74c74 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java
@@ -1,9 +1,9 @@
 package de.deadlocker8.budgetmaster.repeating.endoption;
 
 import com.google.gson.annotations.Expose;
-import org.joda.time.DateTime;
 
 import javax.persistence.*;
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Objects;
 
@@ -25,7 +25,9 @@ public abstract class RepeatingEnd
 		this.localizationKey = localizationKey;
 	}
 
-	protected RepeatingEnd() {}
+	protected RepeatingEnd()
+	{
+	}
 
 	public Integer getID()
 	{
@@ -47,9 +49,9 @@ public abstract class RepeatingEnd
 		this.localizationKey = localizationKey;
 	}
 
-	public abstract boolean isEndReached(List<DateTime> dates);
+	public abstract boolean isEndReached(List<LocalDate> dates);
 
-	public abstract  Object getValue();
+	public abstract Object getValue();
 
 	@Override
 	public String toString()
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java
index 4dede91d3..c0299bdf8 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java
@@ -1,9 +1,10 @@
 package de.deadlocker8.budgetmaster.repeating.endoption;
 
 import com.google.gson.annotations.Expose;
-import org.joda.time.DateTime;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Objects;
 
@@ -19,11 +20,13 @@ public class RepeatingEndAfterXTimes extends RepeatingEnd
 		this.times = times;
 	}
 
-	public RepeatingEndAfterXTimes() {}
+	public RepeatingEndAfterXTimes()
+	{
+	}
 
 	@Override
 	@Transient
-	public boolean isEndReached(List<DateTime> dates)
+	public boolean isEndReached(List<LocalDate> dates)
 	{
 		return dates.size() - 1 > times;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java
index a7dc605d5..9d606e08c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java
@@ -1,10 +1,11 @@
 package de.deadlocker8.budgetmaster.repeating.endoption;
 
 import com.google.gson.annotations.Expose;
-import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Objects;
 
@@ -13,21 +14,23 @@ public class RepeatingEndDate extends RepeatingEnd
 {
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
 	@Expose
-	private DateTime endDate;
+	private LocalDate endDate;
 
-	public RepeatingEndDate(DateTime endDate)
+	public RepeatingEndDate(LocalDate endDate)
 	{
 		super("repeating.end.key.date");
 		this.endDate = endDate;
 	}
 
-	public RepeatingEndDate() {}
+	public RepeatingEndDate()
+	{
+	}
 
 	@Override
 	@Transient
-	public boolean isEndReached(List<DateTime> dates)
+	public boolean isEndReached(List<LocalDate> dates)
 	{
-		DateTime lastDate = dates.get(dates.size() - 1);
+		LocalDate lastDate = dates.get(dates.size() - 1);
 		return lastDate.isAfter(endDate);
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java
index 95a96d9a7..f3ce9f36b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java
@@ -1,9 +1,8 @@
 package de.deadlocker8.budgetmaster.repeating.endoption;
 
-import org.joda.time.DateTime;
-
 import javax.persistence.Entity;
 import javax.persistence.Transient;
+import java.time.LocalDate;
 import java.util.List;
 
 @Entity
@@ -16,7 +15,7 @@ public class RepeatingEndNever extends RepeatingEnd
 
 	@Override
 	@Transient
-	public boolean isEndReached(List<DateTime> dates)
+	public boolean isEndReached(List<LocalDate> dates)
 	{
 		return false;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifier.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifier.java
index d750eb0ee..00c79caec 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifier.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifier.java
@@ -1,9 +1,9 @@
 package de.deadlocker8.budgetmaster.repeating.modifier;
 
 import com.google.gson.annotations.Expose;
-import org.joda.time.DateTime;
 
 import javax.persistence.*;
+import java.time.LocalDate;
 import java.util.Objects;
 
 @Entity
@@ -28,7 +28,9 @@ public abstract class RepeatingModifier
 		this.localizationKey = localizationKey;
 	}
 
-	protected RepeatingModifier() {}
+	protected RepeatingModifier()
+	{
+	}
 
 	public Integer getID()
 	{
@@ -61,7 +63,7 @@ public abstract class RepeatingModifier
 	}
 
 	@Transient
-	public abstract DateTime getNextDate(DateTime lastDate);
+	public abstract LocalDate getNextDate(LocalDate lastDate);
 
 	@Override
 	public String toString()
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierDays.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierDays.java
index df1fb82b6..41f7d9d61 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierDays.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierDays.java
@@ -1,8 +1,7 @@
 package de.deadlocker8.budgetmaster.repeating.modifier;
 
-import org.joda.time.DateTime;
-
 import javax.persistence.Entity;
+import java.time.LocalDate;
 
 @Entity
 public class RepeatingModifierDays extends RepeatingModifier
@@ -12,10 +11,12 @@ public class RepeatingModifierDays extends RepeatingModifier
 		super(numberOfDays, "repeating.modifier.days");
 	}
 
-	public RepeatingModifierDays() {}
+	public RepeatingModifierDays()
+	{
+	}
 
 	@Override
-	public DateTime getNextDate(DateTime lastDate)
+	public LocalDate getNextDate(LocalDate lastDate)
 	{
 		return lastDate.plusDays(super.quantity);
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierMonths.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierMonths.java
index d29214f9c..90ed0b96c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierMonths.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierMonths.java
@@ -1,8 +1,7 @@
 package de.deadlocker8.budgetmaster.repeating.modifier;
 
-import org.joda.time.DateTime;
-
 import javax.persistence.Entity;
+import java.time.LocalDate;
 
 @Entity
 public class RepeatingModifierMonths extends RepeatingModifier
@@ -12,10 +11,12 @@ public class RepeatingModifierMonths extends RepeatingModifier
 		super(numberOfMonths, "repeating.modifier.months");
 	}
 
-	public RepeatingModifierMonths() {}
+	public RepeatingModifierMonths()
+	{
+	}
 
 	@Override
-	public DateTime getNextDate(DateTime lastDate)
+	public LocalDate getNextDate(LocalDate lastDate)
 	{
 		return lastDate.plusMonths(super.quantity);
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierYears.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierYears.java
index f5140fdc8..c830b3351 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierYears.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/modifier/RepeatingModifierYears.java
@@ -1,8 +1,7 @@
 package de.deadlocker8.budgetmaster.repeating.modifier;
 
-import org.joda.time.DateTime;
-
 import javax.persistence.Entity;
+import java.time.LocalDate;
 
 @Entity
 public class RepeatingModifierYears extends RepeatingModifier
@@ -12,10 +11,12 @@ public class RepeatingModifierYears extends RepeatingModifier
 		super(numberOfYears, "repeating.modifier.years");
 	}
 
-	public  RepeatingModifierYears() {}
+	public RepeatingModifierYears()
+	{
+	}
 
 	@Override
-	public DateTime getNextDate(DateTime lastDate)
+	public LocalDate getNextDate(LocalDate lastDate)
 	{
 		return lastDate.plusYears(super.quantity);
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/HeaderFooterPageEvent.java b/src/main/java/de/deadlocker8/budgetmaster/reports/HeaderFooterPageEvent.java
index ea8bf6ef8..e970727e8 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/HeaderFooterPageEvent.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/HeaderFooterPageEvent.java
@@ -10,6 +10,8 @@ import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.deadlocker8.budgetmaster.utils.Strings;
 import de.thecodelabs.utils.util.Localization;
 
+import java.time.format.DateTimeFormatter;
+
 
 public class HeaderFooterPageEvent extends PdfPageEventHelper
 {
@@ -26,6 +28,6 @@ public class HeaderFooterPageEvent extends PdfPageEventHelper
 
 		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(Localization.getString(Strings.REPORT_FOOTER_LEFT), font), 100, 25, 0);
 		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(Localization.getString(Strings.REPORT_FOOTER_CENTER, document.getPageNumber()), font), 300, 25, 0);
-		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(DateHelper.getCurrentDate().toString(DateFormatStyle.LONG.getKey()), font), 500, 25, 0);
+		ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(DateHelper.getCurrentDate().format(DateTimeFormatter.ofPattern(DateFormatStyle.LONG.getKey())), font), 500, 25, 0);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java
index 24c6823ca..6fa91a5a6 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportController.java
@@ -17,7 +17,6 @@ import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionService;
 import de.deadlocker8.budgetmaster.utils.Mappings;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -28,6 +27,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 
@@ -72,7 +73,7 @@ public class ReportController extends BaseController
 	@GetMapping
 	public String reports(HttpServletRequest request, Model model, @CookieValue(value = "currentDate", required = false) String cookieDate)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 
 		model.addAttribute(ModelAttributes.REPORT_SETTINGS, reportSettingsService.getReportSettings());
 		model.addAttribute(ModelAttributes.CURRENT_DATE, date);
@@ -97,7 +98,7 @@ public class ReportController extends BaseController
 		}
 
 		FilterConfiguration filterConfiguration = filterHelpers.getFilterConfiguration(request);
-		List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(account, reportSettings.getDate().getMonthOfYear(), reportSettings.getDate().getYear(), settingsService.getSettings().isRestActivated(), filterConfiguration);
+		List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(account, reportSettings.getDate().getMonthValue(), reportSettings.getDate().getYear(), settingsService.getSettings().isRestActivated(), filterConfiguration);
 		Budget budget = helpers.getBudget(transactions, account);
 
 		ReportConfiguration reportConfiguration = new ReportConfigurationBuilder()
@@ -108,8 +109,8 @@ public class ReportController extends BaseController
 				.setCategoryBudgets(CategoryBudgetHandler.getCategoryBudgets(transactions, categoryService.getAllEntitiesAsc()))
 				.createReportConfiguration();
 
-		String month = reportSettings.getDate().toString("MM");
-		String year = reportSettings.getDate().toString("YYYY");
+		String month = reportSettings.getDate().format(DateTimeFormatter.ofPattern("MM"));
+		String year = reportSettings.getDate().format(DateTimeFormatter.ofPattern("yyyy"));
 
 		LOGGER.debug(MessageFormat.format("Exporting month report (month: {0}_{1}, account: {2})...", year, month, accountName));
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java
index a6aa558b9..383cf9791 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportGeneratorService.java
@@ -1,7 +1,10 @@
 package de.deadlocker8.budgetmaster.reports;
 
 import com.itextpdf.text.*;
-import com.itextpdf.text.pdf.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
 import de.deadlocker8.budgetmaster.categories.CategoryType;
 import de.deadlocker8.budgetmaster.reports.categoryBudget.CategoryBudget;
 import de.deadlocker8.budgetmaster.reports.columns.ReportColumn;
@@ -17,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.ByteArrayOutputStream;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Locale;
 import java.util.stream.Collectors;
@@ -44,7 +48,7 @@ public class ReportGeneratorService
 	{
 		Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 16, Font.BOLDITALIC, BLACK);
 		Locale locale = settingsService.getSettings().getLanguage().getLocale();
-		Chunk chunk = new Chunk(Localization.getString(Strings.REPORT_HEADLINE, reportConfiguration.getReportSettings().getDate().toString("MMMM yyyy", locale)), font);
+		Chunk chunk = new Chunk(Localization.getString(Strings.REPORT_HEADLINE, reportConfiguration.getReportSettings().getDate().format(DateTimeFormatter.ofPattern("MMMM yyyy", locale))), font);
 		Chapter chapter = new Chapter(new Paragraph(chunk), 1);
 		chapter.setNumberDepth(0);
 
@@ -299,7 +303,7 @@ public class ReportGeneratorService
 			case CATEGORY:
 				return transaction.getCategory().getName();
 			case DATE:
-				return transaction.getDate().toString(DateFormatStyle.NO_YEAR.getKey());
+				return transaction.getDate().format(DateTimeFormatter.ofPattern(DateFormatStyle.NO_YEAR.getKey()));
 			case DESCRIPTION:
 				return transaction.getDescription();
 			case TAGS:
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettings.java b/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettings.java
index e202f527f..43a8d864e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/settings/ReportSettings.java
@@ -1,14 +1,13 @@
 package de.deadlocker8.budgetmaster.reports.settings;
 
 import de.deadlocker8.budgetmaster.reports.columns.ReportColumn;
-import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
@@ -20,7 +19,7 @@ public class ReportSettings
 	private Integer ID;
 
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
-	private DateTime date;
+	private LocalDate date;
 
 	private boolean includeBudget;
 	private boolean splitTables;
@@ -31,10 +30,10 @@ public class ReportSettings
 
 	public static ReportSettings getDefault()
 	{
-		return new ReportSettings(DateHelper.getCurrentDate(), true, true, true);
+		return new ReportSettings(LocalDate.now(), true, true, true);
 	}
 
-	private ReportSettings(DateTime date, boolean includeBudget, boolean splitTables, boolean includeCategoryBudgets)
+	private ReportSettings(LocalDate date, boolean includeBudget, boolean splitTables, boolean includeCategoryBudgets)
 	{
 		this.date = date;
 		this.includeBudget = includeBudget;
@@ -57,12 +56,12 @@ public class ReportSettings
 		this.ID = ID;
 	}
 
-	public DateTime getDate()
+	public LocalDate getDate()
 	{
 		return date;
 	}
 
-	public void setDate(DateTime date)
+	public void setDate(LocalDate date)
 	{
 		this.date = date;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java b/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java
index 0650f9c7e..cfdc8152b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java
@@ -1,12 +1,10 @@
 package de.deadlocker8.budgetmaster.services;
 
 import de.deadlocker8.budgetmaster.settings.SettingsService;
-import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 
@@ -21,51 +19,51 @@ public class DateService
 		this.settingsService = settingsService;
 	}
 
-	public String getDateStringNormal(DateTime date)
+	public String getDateStringNormal(LocalDate date)
 	{
 		return getDateString(date, DateFormatStyle.NORMAL);
 	}
 
-	public String getDateStringWithoutYear(DateTime date)
+	public String getDateStringWithoutYear(LocalDate date)
 	{
 		return getDateString(date, DateFormatStyle.NO_YEAR);
 	}
 
-	public String getLongDateString(DateTime date)
+	public String getLongDateString(LocalDate date)
 	{
 		return getDateString(date, DateFormatStyle.LONG);
 	}
 
-	public String getDateStringWithMonthAndYear(DateTime date)
+	public String getDateStringWithMonthAndYear(LocalDate date)
 	{
 		return getDateString(date, DateFormatStyle.LONG_MONTH_AND_YEAR);
 	}
 
-	public String getDateTimeString(DateTime date)
+	public String getDateTimeString(LocalDate date)
 	{
 		return getDateString(date, DateFormatStyle.DATE_TIME);
 	}
 
-	private String getDateString(DateTime date, DateFormatStyle formatStyle)
+	private String getDateString(LocalDate date, DateFormatStyle formatStyle)
 	{
-		return date.toString(DateTimeFormat.forPattern(formatStyle.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
+		return date.format(DateTimeFormatter.ofPattern(formatStyle.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
 	}
 
-	public DateTime getDateTimeFromCookie(String cookieDate)
+	public LocalDate getDateTimeFromCookie(String cookieDate)
 	{
 		if(cookieDate == null)
 		{
-			return DateHelper.getCurrentDate();
+			return LocalDate.now();
 		}
 		else
 		{
-			return DateTime.parse(cookieDate, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
+			return LocalDate.parse(cookieDate, DateTimeFormatter.ofPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
 		}
 	}
 
-	public DateTime getCurrentDate()
+	public LocalDate getCurrentDate()
 	{
-		return DateHelper.getCurrentDate();
+		return LocalDate.now();
 	}
 
 	public String getDateTimeString(LocalDateTime localDateTime)
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
index 8e1de0511..b2207aa01 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
@@ -24,11 +24,11 @@ import de.deadlocker8.budgetmaster.utils.Colors;
 import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.deadlocker8.budgetmaster.utils.LanguageType;
 import de.thecodelabs.utils.util.ColorUtilsNonJavaFX;
-import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -176,7 +176,7 @@ public class HelpersService
 	public int getAccountBudget()
 	{
 		Account currentAccount = getCurrentAccount();
-		final DateTime endDate = DateHelper.getCurrentDateWithUTC();
+		final LocalDate endDate = DateHelper.getCurrentDate();
 		List<Transaction> transactions = transactionService.getTransactionsForAccountUntilDate(currentAccount, endDate, FilterConfiguration.DEFAULT);
 
 		int sum = 0;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
index 0c7c8a124..67cca8c4a 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
@@ -33,6 +33,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -359,7 +361,7 @@ public class ImportService
 			}
 			catch(Exception e)
 			{
-				final String errorMessage = MessageFormat.format("Error while importing transaction with name \"{0}\" from {1}", transaction.getName(), transaction.getDate().toString(DateFormatStyle.NORMAL.getKey()));
+				final String errorMessage = MessageFormat.format("Error while importing transaction with name \"{0}\" from {1}", transaction.getName(), transaction.getDate().format(DateTimeFormatter.ofPattern(DateFormatStyle.NORMAL.getKey())));
 				LOGGER.error(errorMessage, e);
 				collectedErrorMessages.add(formatErrorMessage(errorMessage, e));
 			}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java b/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java
index 28f7c8a19..0e7fc774f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java
@@ -4,11 +4,11 @@ import de.deadlocker8.budgetmaster.backup.AutoBackupStrategy;
 import de.deadlocker8.budgetmaster.backup.AutoBackupTime;
 import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.deadlocker8.budgetmaster.utils.LanguageType;
-import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import java.time.LocalDate;
 
 @Entity
 public class Settings
@@ -26,7 +26,7 @@ public class Settings
 
 	private Boolean backupReminderActivated;
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
-	private DateTime lastBackupReminderDate;
+	private LocalDate lastBackupReminderDate;
 
 	private Integer searchItemsPerPage;
 
@@ -58,7 +58,7 @@ public class Settings
 		defaultSettings.setShowCategoriesAsCircles(true);
 		defaultSettings.setAutoUpdateCheckEnabled(true);
 		defaultSettings.setBackupReminderActivated(true);
-		defaultSettings.setLastBackupReminderDate(DateHelper.getCurrentDate());
+		defaultSettings.setLastBackupReminderDate(LocalDate.now());
 		defaultSettings.setSearchItemsPerPage(10);
 		defaultSettings.setAutoBackupStrategy(AutoBackupStrategy.NONE);
 		defaultSettings.setAutoBackupDays(1);
@@ -149,12 +149,12 @@ public class Settings
 		this.backupReminderActivated = backupReminderActivated;
 	}
 
-	public DateTime getLastBackupReminderDate()
+	public LocalDate getLastBackupReminderDate()
 	{
 		return lastBackupReminderDate;
 	}
 
-	public void setLastBackupReminderDate(DateTime lastBackupReminderDate)
+	public void setLastBackupReminderDate(LocalDate lastBackupReminderDate)
 	{
 		this.lastBackupReminderDate = lastBackupReminderDate;
 	}
@@ -163,7 +163,7 @@ public class Settings
 	{
 		if(backupReminderActivated)
 		{
-			return lastBackupReminderDate.getMonthOfYear() != DateHelper.getCurrentDate().getMonthOfYear();
+			return lastBackupReminderDate.getMonthValue() != DateHelper.getCurrentDate().getMonthValue();
 		}
 		return false;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
index a1818369f..1592aefe7 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
@@ -15,7 +15,6 @@ import de.deadlocker8.budgetmaster.utils.WebRequestUtils;
 import de.deadlocker8.budgetmaster.utils.notification.Notification;
 import de.deadlocker8.budgetmaster.utils.notification.NotificationType;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Controller;
@@ -25,6 +24,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.WebRequest;
 import org.springframework.web.server.ResponseStatusException;
 
+import java.time.LocalDate;
 import java.util.Optional;
 
 
@@ -158,7 +158,7 @@ public class TemplateController extends BaseController
 			newTransaction.setIsExpenditure(true);
 		}
 
-		final DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		final LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 		transactionService.prepareModelNewOrEdit(model, false, date, false, newTransaction, accountService.getAllActivatedAccountsAsc());
 
 		if(newTransaction.isTransfer())
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java
index b0ab67ef2..8f2a3a650 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java
@@ -8,10 +8,10 @@ import de.deadlocker8.budgetmaster.categories.CategoryType;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.tags.Tag;
 import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.persistence.*;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -32,7 +32,7 @@ public class Transaction implements TransactionBase
 
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
 	@Expose
-	private DateTime date;
+	private LocalDate date;
 
 	@ManyToOne
 	@Expose
@@ -119,12 +119,12 @@ public class Transaction implements TransactionBase
 		isExpenditure = expenditure;
 	}
 
-	public DateTime getDate()
+	public LocalDate getDate()
 	{
 		return date;
 	}
 
-	public void setDate(DateTime date)
+	public void setDate(LocalDate date)
 	{
 		this.date = date;
 	}
@@ -211,7 +211,7 @@ public class Transaction implements TransactionBase
 
 	public boolean isFuture()
 	{
-		return date.isAfter(DateHelper.getCurrentDateWithUTC());
+		return date.isAfter(DateHelper.getCurrentDate());
 	}
 
 	public boolean isEditable()
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
index 6e32077c7..1e5e3b9b5 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
@@ -24,8 +24,6 @@ import de.deadlocker8.budgetmaster.utils.WebRequestUtils;
 import de.deadlocker8.budgetmaster.utils.notification.Notification;
 import de.deadlocker8.budgetmaster.utils.notification.NotificationType;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -36,9 +34,13 @@ import org.springframework.web.context.request.WebRequest;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.MessageFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Optional;
 
+import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
+
 @Controller
 @RequestMapping(Mappings.TRANSACTIONS)
 public class TransactionController extends BaseController
@@ -82,8 +84,8 @@ public class TransactionController extends BaseController
 	@GetMapping
 	public String transactions(HttpServletRequest request, Model model, @CookieValue(value = "currentDate", required = false) String cookieDate)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
-		repeatingTransactionUpdater.updateRepeatingTransactions(date.dayOfMonth().withMaximumValue());
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
+		repeatingTransactionUpdater.updateRepeatingTransactions(date.with(lastDayOfMonth()));
 
 		prepareModelTransactions(filterHelpers.getFilterConfiguration(request), model, date);
 
@@ -98,17 +100,17 @@ public class TransactionController extends BaseController
 			return ReturnValues.REDIRECT_ALL_ENTITIES;
 		}
 
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 		prepareModelTransactions(filterHelpers.getFilterConfiguration(request), model, date);
 		model.addAttribute(TransactionModelAttributes.ENTITY_TO_DELETE, transactionService.getRepository().getById(ID));
 
 		return ReturnValues.DELETE_ENTITY;
 	}
 
-	private void prepareModelTransactions(FilterConfiguration filterConfiguration, Model model, DateTime date)
+	private void prepareModelTransactions(FilterConfiguration filterConfiguration, Model model, LocalDate date)
 	{
 		Account currentAccount = helpers.getCurrentAccount();
-		List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(currentAccount, date.getMonthOfYear(), date.getYear(), settingsService.getSettings().isRestActivated(), filterConfiguration);
+		List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(currentAccount, date.getMonthValue(), date.getYear(), settingsService.getSettings().isRestActivated(), filterConfiguration);
 
 		model.addAttribute(TransactionModelAttributes.ALL_ENTITIES, transactions);
 		model.addAttribute(TransactionModelAttributes.ACCOUNT, currentAccount);
@@ -138,7 +140,7 @@ public class TransactionController extends BaseController
 			return ReturnValues.REDIRECT_ALL_ENTITIES;
 		}
 
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 		Transaction emptyTransaction = new Transaction();
 		emptyTransaction.setCategory(categoryService.findByType(CategoryType.NONE));
 		transactionService.prepareModelNewOrEdit(model, false, date, false, emptyTransaction, accountService.getAllActivatedAccountsAsc());
@@ -156,7 +158,7 @@ public class TransactionController extends BaseController
 					   @RequestParam(value = "repeatingEndValue", required = false) String repeatingEndValue,
 					   @RequestParam(value = "action", required = false) String action)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 
 		handlePreviousType(transaction, isRepeating);
 
@@ -200,7 +202,7 @@ public class TransactionController extends BaseController
 	}
 
 	@SuppressWarnings("ConstantConditions")
-	private RepeatingOption createRepeatingOption(DateTime startDate, int repeatingModifierNumber, String repeatingModifierType, String repeatingEndType, String repeatingEndValue)
+	private RepeatingOption createRepeatingOption(LocalDate startDate, int repeatingModifierNumber, String repeatingModifierType, String repeatingEndType, String repeatingEndValue)
 	{
 		RepeatingModifierType type = RepeatingModifierType.getByLocalization(repeatingModifierType);
 		RepeatingModifier repeatingModifier = RepeatingModifier.fromModifierType(type, repeatingModifierNumber);
@@ -216,7 +218,7 @@ public class TransactionController extends BaseController
 				repeatingEnd = new RepeatingEndAfterXTimes(Integer.parseInt(repeatingEndValue));
 				break;
 			case DATE:
-				DateTime endDate = DateTime.parse(repeatingEndValue, DateTimeFormat.forPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
+				LocalDate endDate = LocalDate.parse(repeatingEndValue, DateTimeFormatter.ofPattern(DateFormatStyle.NORMAL.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
 				repeatingEnd = new RepeatingEndDate(endDate);
 				break;
 		}
@@ -224,7 +226,7 @@ public class TransactionController extends BaseController
 		return new RepeatingOption(startDate, repeatingModifier, repeatingEnd);
 	}
 
-	private String handleRedirect(WebRequest request, Model model, boolean isEdit, @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, DateTime date, String url, boolean isContinueActivated)
+	private String handleRedirect(WebRequest request, Model model, boolean isEdit, @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, LocalDate date, String url, boolean isContinueActivated)
 	{
 		if(bindingResult.hasErrors())
 		{
@@ -270,7 +272,7 @@ public class TransactionController extends BaseController
 			transaction = transaction.getRepeatingOption().getReferringTransactions().get(0);
 		}
 
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 		transactionService.prepareModelNewOrEdit(model, true, date, false, transaction, accountService.getAllActivatedAccountsAsc());
 
 		if(transaction.isTransfer())
@@ -291,7 +293,7 @@ public class TransactionController extends BaseController
 			accountService.selectAccount(transaction.getAccount().getID());
 		}
 
-		repeatingTransactionUpdater.updateRepeatingTransactions(transaction.getDate().dayOfMonth().withMaximumValue());
+		repeatingTransactionUpdater.updateRepeatingTransactions(transaction.getDate().with(lastDayOfMonth()));
 
 		FilterConfiguration filterConfiguration = FilterConfiguration.DEFAULT;
 		filterConfiguration.setFilterCategories(filterHelpers.getFilterCategories());
@@ -357,7 +359,7 @@ public class TransactionController extends BaseController
 				throw new IllegalStateException("Unexpected value: " + newTransactionType);
 		}
 
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 		transactionService.prepareModelNewOrEdit(model, true, date, true, transactionCopy, accountService.getAllActivatedAccountsAsc());
 
 		return redirectUrl;
@@ -380,7 +382,7 @@ public class TransactionController extends BaseController
 			existingTransaction = existingTransaction.getRepeatingOption().getReferringTransactions().get(0);
 		}
 
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		LocalDate date = dateService.getDateTimeFromCookie(cookieDate);
 
 		Transaction newTransaction = new Transaction(existingTransaction);
 		newTransaction.setID(null);
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java
index 073f453e5..467e0d633 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java
@@ -4,19 +4,19 @@ import de.deadlocker8.budgetmaster.accounts.Account;
 import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.tags.Tag;
-import org.joda.time.DateTime;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 
+import java.time.LocalDate;
 import java.util.List;
 
 
 public interface TransactionRepository extends JpaRepository<Transaction, Integer>, JpaSpecificationExecutor<Transaction>
 {
-	List<Transaction> findAllByAccountAndDateBetweenOrderByDateDesc(Account account, DateTime startDate, DateTime endDate);
+	List<Transaction> findAllByAccountAndDateBetweenOrderByDateDesc(Account account, LocalDate startDate, LocalDate endDate);
 
-	List<Transaction> findAllByDateBetweenOrderByDateDesc(DateTime startDate, DateTime endDate);
+	List<Transaction> findAllByDateBetweenOrderByDateDesc(LocalDate startDate, LocalDate endDate);
 
 	List<Transaction> findAllByAccount(Account account);
 
@@ -25,13 +25,13 @@ public interface TransactionRepository extends JpaRepository<Transaction, Intege
 	List<Transaction> findAllByTagsContaining(Tag tag);
 
 	@Query(value = "SELECT SUM(t.amount) FROM Transaction as t WHERE t.account.ID = ?1 AND t.transferAccount.ID IS NULL AND t.date BETWEEN ?2 AND ?3")
-	Integer getRestForNormalAndRepeating(int accountID, DateTime startDate, DateTime endDate);
+	Integer getRestForNormalAndRepeating(int accountID, LocalDate startDate, LocalDate endDate);
 
 	@Query(value = "SELECT SUM(t.amount) FROM Transaction as t WHERE t.account.ID = ?1 AND t.transferAccount.ID IS NOT NULL AND t.date BETWEEN ?2 AND ?3")
-	Integer getRestForTransferSource(int accountID, DateTime startDate, DateTime endDate);
+	Integer getRestForTransferSource(int accountID, LocalDate startDate, LocalDate endDate);
 
 	@Query(value = "SELECT SUM(t.amount) FROM Transaction as t WHERE t.transferAccount.ID = ?1 AND t.date BETWEEN ?2 AND ?3")
-	Integer getRestForTransferDestination(int accountID, DateTime startDate, DateTime endDate);
+	Integer getRestForTransferDestination(int accountID, LocalDate startDate, LocalDate endDate);
 
 	List<Transaction> findAllByTransferAccount(Account account);
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java
index 635d611c4..6e8d3e922 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java
@@ -15,10 +15,8 @@ import de.deadlocker8.budgetmaster.tags.Tag;
 import de.deadlocker8.budgetmaster.tags.TagRepository;
 import de.deadlocker8.budgetmaster.tags.TagService;
 import de.deadlocker8.budgetmaster.templates.Template;
-import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.deadlocker8.budgetmaster.utils.Strings;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,10 +25,13 @@ import org.springframework.stereotype.Service;
 import org.springframework.ui.Model;
 
 import java.text.MessageFormat;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
+import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
+
 @Service
 public class TransactionService implements Resettable
 {
@@ -77,14 +78,15 @@ public class TransactionService implements Resettable
 
 	private List<Transaction> getTransactionsForMonthAndYearWithRest(Account account, int month, int year, FilterConfiguration filterConfiguration)
 	{
-		DateTime startDate = DateHelper.getCurrentDateWithUTC().withYear(year).withMonthOfYear(month).minusMonths(1).dayOfMonth().withMaximumValue();
 		List<Transaction> transactions = getTransactionsForMonthAndYearWithoutRest(account, month, year, filterConfiguration);
 
+		LocalDate endDate = LocalDate.of(year, month, 1).minusMonths(1).with(lastDayOfMonth());
+
 		Transaction transactionRest = new Transaction();
 		transactionRest.setCategory(categoryService.findByType(CategoryType.REST));
 		transactionRest.setName(Localization.getString(Strings.CATEGORY_REST));
-		transactionRest.setDate(DateHelper.getCurrentDateWithUTC().withYear(year).withMonthOfYear(month).withDayOfMonth(1));
-		transactionRest.setAmount(getRest(account, startDate));
+		transactionRest.setDate(LocalDate.of(year, month, 1));
+		transactionRest.setAmount(getRest(account, endDate));
 		transactionRest.setTags(new ArrayList<>());
 		transactions.add(transactionRest);
 
@@ -93,27 +95,19 @@ public class TransactionService implements Resettable
 
 	private List<Transaction> getTransactionsForMonthAndYearWithoutRest(Account account, int month, int year, FilterConfiguration filterConfiguration)
 	{
-		// dayOfMonth = 10 --> arbitrary day not too close to the edges (0 or max day of month)
-		final DateTime referenceTime = new DateTime(year, month, 10, 0, 0, 0, 0);
-
-		final DateTime startDate = referenceTime
-				.dayOfMonth()
-				.withMinimumValue();
-
-		final DateTime endDate = referenceTime
-				.dayOfMonth()
-				.withMaximumValue();
+		final LocalDate startDate = LocalDate.of(year, month, 1);
+		final LocalDate endDate = LocalDate.of(year, month, 1).with(lastDayOfMonth());
 
 		return getTransactionsForAccount(account, startDate, endDate, filterConfiguration);
 	}
 
-	public List<Transaction> getTransactionsForAccountUntilDate(Account account, DateTime date, FilterConfiguration filterConfiguration)
+	public List<Transaction> getTransactionsForAccountUntilDate(Account account, LocalDate date, FilterConfiguration filterConfiguration)
 	{
-		DateTime startDate = DateHelper.getCurrentDateWithUTC().withYear(1900).withMonthOfYear(1).withDayOfMonth(1);
+		LocalDate startDate = LocalDate.of(1900, 1, 1);
 		return getTransactionsForAccount(account, startDate, date, filterConfiguration);
 	}
 
-	public List<Transaction> getTransactionsForAccount(Account account, DateTime startDate, DateTime endDate, FilterConfiguration filterConfiguration)
+	public List<Transaction> getTransactionsForAccount(Account account, LocalDate startDate, LocalDate endDate, FilterConfiguration filterConfiguration)
 	{
 		if(filterConfiguration == null)
 		{
@@ -130,9 +124,9 @@ public class TransactionService implements Resettable
 		return transactionRepository.findAll(spec);
 	}
 
-	private int getRest(Account account, DateTime endDate)
+	private int getRest(Account account, LocalDate endDate)
 	{
-		DateTime startDate = DateHelper.getCurrentDateWithUTC().withYear(2000).withMonthOfYear(1).withDayOfMonth(1);
+		LocalDate startDate = LocalDate.of(2000, 1, 1);
 		Integer restForNormalAndRepeating = transactionRepository.getRestForNormalAndRepeating(account.getID(), startDate, endDate);
 		Integer restForTransferSource = transactionRepository.getRestForTransferSource(account.getID(), startDate, endDate);
 		Integer restForTransferDestination = transactionRepository.getRestForTransferDestination(account.getID(), startDate, endDate);
@@ -297,7 +291,7 @@ public class TransactionService implements Resettable
 		return item;
 	}
 
-	public void prepareModelNewOrEdit(Model model, boolean isEdit, DateTime date, boolean changeTypeInProgress, TransactionBase item, List<Account> accounts)
+	public void prepareModelNewOrEdit(Model model, boolean isEdit, LocalDate date, boolean changeTypeInProgress, TransactionBase item, List<Account> accounts)
 	{
 		model.addAttribute(TransactionModelAttributes.IS_EDIT, isEdit);
 		model.addAttribute(TransactionModelAttributes.CURRENT_DATE, date);
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java
index d29b5fcf0..47a0ba632 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSpecifications.java
@@ -3,12 +3,12 @@ package de.deadlocker8.budgetmaster.transactions;
 import de.deadlocker8.budgetmaster.accounts.Account;
 import de.deadlocker8.budgetmaster.tags.Tag;
 import de.deadlocker8.budgetmaster.tags.Tag_;
-import org.joda.time.DateTime;
 import org.springframework.data.jpa.domain.Specification;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Join;
 import javax.persistence.criteria.Predicate;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -18,7 +18,7 @@ public class TransactionSpecifications
 	{
 	}
 
-	public static Specification<Transaction> withDynamicQuery(final DateTime startDate, final DateTime endDate,
+	public static Specification<Transaction> withDynamicQuery(final LocalDate startDate, final LocalDate endDate,
 															  Account account,
 															  final boolean isIncome, boolean isExpenditure, boolean isTransfer,
 															  final Boolean isRepeating,
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction_.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction_.java
index 5b7faeb0f..f68320d0f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction_.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction_.java
@@ -4,18 +4,18 @@ import de.deadlocker8.budgetmaster.accounts.Account;
 import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.tags.Tag;
-import org.joda.time.DateTime;
 
 import javax.persistence.metamodel.ListAttribute;
 import javax.persistence.metamodel.SingularAttribute;
 import javax.persistence.metamodel.StaticMetamodel;
+import java.time.LocalDate;
 
 @StaticMetamodel(Transaction.class)
 public class Transaction_
 {
 	public static volatile SingularAttribute<Transaction, Integer> ID;
 	public static volatile SingularAttribute<Transaction, Integer> amount;
-	public static volatile SingularAttribute<Transaction, DateTime> date;
+	public static volatile SingularAttribute<Transaction, LocalDate> date;
 	public static volatile SingularAttribute<Transaction, Account> account;
 	public static volatile SingularAttribute<Transaction, Category> category;
 	public static volatile SingularAttribute<Transaction, String> name;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java b/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java
index 397aa7895..87cc9cafa 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/DateHelper.java
@@ -1,9 +1,7 @@
 package de.deadlocker8.budgetmaster.utils;
 
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-
-import java.util.TimeZone;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 
 public class DateHelper
 {
@@ -11,13 +9,13 @@ public class DateHelper
 	{
 	}
 
-	public static DateTime getCurrentDate()
+	public static LocalDate getCurrentDate()
 	{
-		return DateTime.now(DateTimeZone.forTimeZone(TimeZone.getDefault()));
+		return LocalDate.now();
 	}
 
-	public static DateTime getCurrentDateWithUTC()
+	public static LocalDateTime getCurrentDateTime()
 	{
-		return getCurrentDate().toDateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("UTC")));
+		return LocalDateTime.now();
 	}
 }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 1598f07a6..a44ce63f3 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -2,8 +2,6 @@ spring.mvc.log-resolved-exception=false
 
 spring.jpa.hibernate.ddl-auto=update
 
-spring.jpa.properties.jadira.usertype.autoRegisterUserTypes = true
-
 spring.servlet.multipart.max-file-size=100MB
 spring.servlet.multipart.max-request-size=100MB
 
diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties
index 64e2ab807..7997f9529 100644
--- a/src/main/resources/languages/base_de.properties
+++ b/src/main/resources/languages/base_de.properties
@@ -1,7 +1,7 @@
 locale=de
 
 # DEFAULT
-credits=Verwendete Schriftarten: Roboto<br>Verwendete Bibliotheken:<br>spring-boot-starter-parent 2.6.3<br>spring-boot-devtools 2.6.3<br>spring-boot-starter-web 2.6.3<br>spring-boot-starter-test 2.6.3<br>spring-boot-starter-security 2.6.3<br>spring-boot-starter-tomcat 2.6.3<br>spring-boot-starter-freemarker 2.6.3<br>spring-boot-starter-validation 2.6.3<br>h2 1.4.199<br>joda-time 2.10.13<br>usertype.core 7.0.0.CR1<br>maven-surefire-plugin 2.22.2<br>launch4j-maven-plugin 1.7.25<br>jquery 3.6.0<br>materialize 1.0.0<br>fontawesome 6.0.0<br>Google Material Icons<br>Vanilla-picker 2.12.1<br>SortableJS 1.14.0<br>jlibs 3.2.0<br>itextpdf 5.5.13.2<br>mousetrap 1.6.5<br>plotly 2.9.0<br>momentjs 2.29.1<br>codemirror 5.62.2<br>webjars-locator 0.42<br>libUtils 3.2.7<br>libStorage 3.2.3<br>natorder 1.1.2<br>jgit 6.0.0.202111291000-r<br>
+credits=Verwendete Schriftarten: Roboto<br>Verwendete Bibliotheken:<br>spring-boot-starter-parent 2.6.3<br>spring-boot-devtools 2.6.3<br>spring-boot-starter-web 2.6.3<br>spring-boot-starter-test 2.6.3<br>spring-boot-starter-security 2.6.3<br>spring-boot-starter-tomcat 2.6.3<br>spring-boot-starter-freemarker 2.6.3<br>spring-boot-starter-validation 2.6.3<br>h2 1.4.199<br>maven-surefire-plugin 2.22.2<br>launch4j-maven-plugin 1.7.25<br>jquery 3.6.0<br>materialize 1.0.0<br>fontawesome 6.0.0<br>Google Material Icons<br>Vanilla-picker 2.12.1<br>SortableJS 1.14.0<br>jlibs 3.2.0<br>itextpdf 5.5.13.2<br>mousetrap 1.6.5<br>plotly 2.9.0<br>momentjs 2.29.1<br>codemirror 5.62.2<br>webjars-locator 0.42<br>libUtils 3.2.7<br>libStorage 3.2.3<br>natorder 1.1.2<br>jgit 6.0.0.202111291000-r<br>
 folder=Deadlocker/BudgetMaster
 roadmap.url=https://roadmaps.thecodelabs.de/roadmap/1
 github.url=https://github.com/deadlocker8/BudgetMaster
diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties
index a7cd1e751..b5403b03b 100644
--- a/src/main/resources/languages/base_en.properties
+++ b/src/main/resources/languages/base_en.properties
@@ -1,7 +1,7 @@
 locale=en
 
 # DEFAULT
-credits=Fonts used: Roboto<br>Libraries used:<br>spring-boot-starter-parent 2.6.3<br>spring-boot-devtools 2.6.3<br>spring-boot-starter-web 2.6.3<br>spring-boot-starter-test 2.6.3<br>spring-boot-starter-security 2.6.3<br>spring-boot-starter-tomcat 2.6.3<br>spring-boot-starter-freemarker 2.6.3<br>spring-boot-starter-validation 2.6.3<br>h2 1.4.199<br>joda-time 2.10.13<br>usertype.core 7.0.0.CR1<br>maven-surefire-plugin 2.22.2<br>launch4j-maven-plugin 1.7.25<br>jquery 3.6.0<br>materialize 1.0.0<br>fontawesome 6.0.0<br>Google Material Icons<br>Vanilla-picker 2.12.1<br>SortableJS 1.14.0<br>jlibs 3.2.0<br>itextpdf 5.5.13.2<br>mousetrap 1.6.5<br>plotly 2.9.0<br>momentjs 2.29.1<br>codemirror 5.62.2<br>webjars-locator 0.42<br>libUtils 3.2.7<br>libStorage 3.2.3<br>natorder 1.1.0<br>jgit 5.13.0.202109080827-r<br>
+credits=Fonts used: Roboto<br>Libraries used:<br>spring-boot-starter-parent 2.6.3<br>spring-boot-devtools 2.6.3<br>spring-boot-starter-web 2.6.3<br>spring-boot-starter-test 2.6.3<br>spring-boot-starter-security 2.6.3<br>spring-boot-starter-tomcat 2.6.3<br>spring-boot-starter-freemarker 2.6.3<br>spring-boot-starter-validation 2.6.3<br>h2 1.4.199<br>maven-surefire-plugin 2.22.2<br>launch4j-maven-plugin 1.7.25<br>jquery 3.6.0<br>materialize 1.0.0<br>fontawesome 6.0.0<br>Google Material Icons<br>Vanilla-picker 2.12.1<br>SortableJS 1.14.0<br>jlibs 3.2.0<br>itextpdf 5.5.13.2<br>mousetrap 1.6.5<br>plotly 2.9.0<br>momentjs 2.29.1<br>codemirror 5.62.2<br>webjars-locator 0.42<br>libUtils 3.2.7<br>libStorage 3.2.3<br>natorder 1.1.0<br>jgit 5.13.0.202109080827-r<br>
 folder=Deadlocker/BudgetMaster
 roadmap.url=https://roadmaps.thecodelabs.de/roadmap/2
 github.url=https://github.com/deadlocker8/BudgetMaster
diff --git a/src/main/resources/templates/helpers/globalDatePicker.ftl b/src/main/resources/templates/helpers/globalDatePicker.ftl
index 8afcd1e11..240a4e536 100644
--- a/src/main/resources/templates/helpers/globalDatePicker.ftl
+++ b/src/main/resources/templates/helpers/globalDatePicker.ftl
@@ -20,7 +20,7 @@
             <div id="global-datepicker-select-month">
                 <h4>${locale.getString("title.datepicker.month")}</h4>
                 <#assign montList = localizedMonthNames/>
-                <#assign currentMonth = montList[currentDate.getMonthOfYear() - 1]/>
+                <#assign currentMonth = montList[currentDate.getMonthValue() - 1]/>
                 <@datepickerGrid montList currentMonth/>
             </div>
         </div>
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
index e830375e6..b12bd58e5 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/LoginControllerTest.java
@@ -4,8 +4,6 @@ import de.deadlocker8.budgetmaster.authentication.UserService;
 import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTestBase;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.openqa.selenium.*;
@@ -15,7 +13,6 @@ import org.openqa.selenium.support.ui.WebDriverWait;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.util.Date;
-import java.util.TimeZone;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -79,36 +76,6 @@ class LoginControllerTest extends SeleniumTestBase
 		assertThat(driver.manage().getCookies()).contains(expectedCookie);
 	}
 
-	@Test
-	void test_successLogin_cookieShortlyAfterMidnightInSystemTimezone()
-	{
-		// override system time to setup midnight scenario
-		// DateTime.now() will return the time in UTC --> shortly before midnight
-		DateTimeUtils.setCurrentMillisFixed(new DateTime(2021, 10, 24, 23, 10, 0).getMillis());
-
-		try
-		{
-			// system time zone is Berlin --> at least +1 hour --> after midnight
-			TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
-
-			IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
-			helper.start();
-			helper.login(UserService.DEFAULT_PASSWORD);
-			helper.hideBackupReminder();
-			helper.hideWhatsNewDialog();
-
-			WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
-			wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("logo-home")));
-
-			Cookie expectedCookie = new Cookie("currentDate", "25.10.21", "localhost", "/", null, false, false, "None");
-			assertThat(driver.manage().getCookies()).contains(expectedCookie);
-		}
-		finally
-		{
-			DateTimeUtils.setCurrentMillisSystem();
-		}
-	}
-
 	@Test
 	void test_logout()
 	{
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java
index a8e028f04..9ca8b37a9 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java
@@ -17,8 +17,6 @@ import de.deadlocker8.budgetmaster.tags.TagRepository;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
 import de.deadlocker8.budgetmaster.transactions.TransactionSearchSpecifications;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -27,6 +25,7 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -83,7 +82,7 @@ class TransactionSearchSpecificationsTest
 		transaction1.setName("Test");
 		transaction1.setAmount(200);
 		transaction1.setDescription("Random Whatever");
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transaction1.setCategory(category1);
 		transaction1.setAccount(account);
 		ArrayList<Tag> tags = new ArrayList<>();
@@ -94,12 +93,12 @@ class TransactionSearchSpecificationsTest
 		transaction2 = new Transaction();
 		transaction2.setName("lalala");
 		transaction2.setAmount(-525);
-		transaction2.setDate(new DateTime(2018, 11, 3, 12, 0, 0, 0));
+		transaction2.setDate(LocalDate.of(2018, 11, 3));
 		transaction2.setCategory(category2);
 		transaction2.setAccount(account);
 		transaction2 = transactionRepository.save(transaction2);
 
-		DateTime repeatingTransactionDate = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
+		LocalDate repeatingTransactionDate = LocalDate.of(2018, 3, 13);
 		repeatingOption = new RepeatingOption();
 		repeatingOption.setModifier(new RepeatingModifierDays(10));
 		repeatingOption.setStartDate(repeatingTransactionDate);
@@ -122,7 +121,7 @@ class TransactionSearchSpecificationsTest
 		transferTransaction = new Transaction();
 		transferTransaction.setName("TransferTransaction");
 		transferTransaction.setAmount(-500);
-		transferTransaction.setDate(new DateTime(2018, 8, 3, 12, 0, 0, 0));
+		transferTransaction.setDate(LocalDate.of(2018, 8, 3));
 		transferTransaction.setCategory(category2);
 		transferTransaction.setAccount(account);
 		transferTransaction.setTransferAccount(account2);
@@ -131,7 +130,7 @@ class TransactionSearchSpecificationsTest
 		transactionFromHiddenAccount = new Transaction();
 		transactionFromHiddenAccount.setName("inside hidden account");
 		transactionFromHiddenAccount.setAmount(-525);
-		transactionFromHiddenAccount.setDate(new DateTime(2018, 11, 3, 12, 0, 0, 0));
+		transactionFromHiddenAccount.setDate(LocalDate.of(2018, 11, 3));
 		transactionFromHiddenAccount.setCategory(category2);
 		transactionFromHiddenAccount.setAccount(accountHidden);
 		transactionFromHiddenAccount = transactionRepository.save(transactionFromHiddenAccount);
@@ -139,7 +138,7 @@ class TransactionSearchSpecificationsTest
 		transactionWithMultipleTags = new Transaction();
 		transactionWithMultipleTags.setName("I am the TagMaster");
 		transactionWithMultipleTags.setAmount(-525);
-		transactionWithMultipleTags.setDate(new DateTime(2018, 11, 3, 12, 0, 0, 0));
+		transactionWithMultipleTags.setDate(LocalDate.of(2018, 11, 3));
 		transactionWithMultipleTags.setCategory(category1);
 		transactionWithMultipleTags.setAccount(account);
 		transactionWithMultipleTags.setTags(List.of(tag1, tag2));
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
index ba9315566..2338726d6 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
@@ -2,18 +2,15 @@ package de.deadlocker8.budgetmaster.unit;
 
 import de.deadlocker8.budgetmaster.Main;
 import de.deadlocker8.budgetmaster.accounts.AccountRepository;
-import de.deadlocker8.budgetmaster.accounts.AccountService;
 import de.deadlocker8.budgetmaster.accounts.AccountType;
 import de.deadlocker8.budgetmaster.filter.FilterConfiguration;
-import de.deadlocker8.budgetmaster.icon.IconService;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTest;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionService;
 import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeUtils;
-import org.joda.time.format.DateTimeFormat;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.jdbc.DataSourceBuilder;
@@ -28,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.sql.DataSource;
 import java.io.IOException;
+import java.time.LocalDate;
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -72,10 +70,10 @@ class TransactionServiceDatabaseTest
 	@Test
 	void test_getTransactionsForAccount_specificAccount()
 	{
-		DateTime date1 = DateTime.parse("2020-04-30", DateTimeFormat.forPattern("yyyy-MM-dd"));
+		LocalDate date1 = LocalDate.of(2020, 4, 30);
 		FilterConfiguration filterConfiguration = new FilterConfiguration(true, true, true, true, true, null, null, "");
 
-		List<Transaction> transactions = transactionService.getTransactionsForAccount(accountRepository.findByName("Second Account"), date1, DateHelper.getCurrentDate(), filterConfiguration);
+		List<Transaction> transactions = transactionService.getTransactionsForAccount(accountRepository.findByName("Second Account"), date1, LocalDate.now(), filterConfiguration);
 		assertThat(transactions).hasSize(2);
 
 		assertThat(transactions.get(0)).hasFieldOrPropertyWithValue("ID", 9);  // transfer
@@ -85,18 +83,18 @@ class TransactionServiceDatabaseTest
 	@Test
 	void test_getTransactionsForAccount_all()
 	{
-		DateTime date1 = DateTime.parse("2020-04-30", DateTimeFormat.forPattern("yyyy-MM-dd"));
+		LocalDate date1 = LocalDate.of(2020, 4, 30);
 		FilterConfiguration filterConfiguration = new FilterConfiguration(true, true, true, true, true, null, null, "");
 
-		List<Transaction> transactions = transactionService.getTransactionsForAccount(accountRepository.findAllByType(AccountType.ALL).get(0), date1, DateHelper.getCurrentDate(), filterConfiguration);
+		List<Transaction> transactions = transactionService.getTransactionsForAccount(accountRepository.findAllByType(AccountType.ALL).get(0), date1, LocalDate.now(), filterConfiguration);
 		assertThat(transactions).hasSize(8);
 	}
 
 	@Test
 	void test_getTransactionsForAccountUntilDate()
 	{
-		DateTime date1 = DateTime.parse("2020-04-30", DateTimeFormat.forPattern("yyyy-MM-dd"));
-		DateTime date2 = DateTime.parse("2020-05-20", DateTimeFormat.forPattern("yyyy-MM-dd"));
+		LocalDate date1 = LocalDate.of(2020, 4, 30);
+		LocalDate date2 = LocalDate.of(2020, 5, 20);
 		FilterConfiguration filterConfiguration = new FilterConfiguration(true, true, true, true, true, null, null, "");
 
 		List<Transaction> transactions = transactionService.getTransactionsForAccount(accountRepository.findByName("Default Account"), date1, date2, filterConfiguration);
@@ -111,28 +109,22 @@ class TransactionServiceDatabaseTest
 		List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(accountRepository.findByName("Default Account"), 6, 2021, false, filterConfiguration);
 		assertThat(transactions).hasSize(1);
 		assertThat(transactions.get(0).getDate())
-				.isEqualTo(new DateTime(2021, 6, 30, 0, 0, 0, 0));
+				.isEqualTo(LocalDate.of(2021, 6, 30));
 	}
 
 	@Test
 	void test_getTransactionsForMonthAndYear_CloseToMidnight()
 	{
-		// override system time to setup midnight scenario
-		// DateTime.now() will return the time in UTC --> shortly before midnight
-		DateTimeUtils.setCurrentMillisFixed(new DateTime(2021, 2, 5, 21, 45, 0).getMillis());
-
-		try
+		try(MockedStatic<DateHelper> dateHelper = Mockito.mockStatic(DateHelper.class))
 		{
+			dateHelper.when(DateHelper::getCurrentDate).thenReturn(LocalDate.of(2021, 2, 5));
+
 			FilterConfiguration filterConfiguration = new FilterConfiguration(true, true, true, true, true, null, null, "");
 
 			List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(accountRepository.findByName("Default Account"), 6, 2021, false, filterConfiguration);
 			assertThat(transactions).hasSize(1);
 			assertThat(transactions.get(0).getDate())
-					.isEqualTo(new DateTime(2021, 6, 30, 0, 0, 0, 0));
-		}
-		finally
-		{
-			DateTimeUtils.setCurrentMillisSystem();
+					.isEqualTo(LocalDate.of(2021, 6, 30));
 		}
 	}
 }
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java
index 03bf29e0b..d05b137c5 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSpecificationsTest.java
@@ -16,9 +16,6 @@ import de.deadlocker8.budgetmaster.tags.TagRepository;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
 import de.deadlocker8.budgetmaster.transactions.TransactionSpecifications;
-import de.deadlocker8.budgetmaster.utils.DateHelper;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -27,6 +24,7 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -67,7 +65,7 @@ class TransactionSpecificationsTest
 	private RepeatingOptionRepository repeatingOptionRepository;
 	private RepeatingOption repeatingOption;
 
-	private DateTime startDate = new DateTime(2018, 1, 1, 12, 0, 0, 0);
+	private LocalDate startDate = LocalDate.of(2018, 1, 1);
 
 	@BeforeEach
 	public void init()
@@ -88,7 +86,7 @@ class TransactionSpecificationsTest
 		transaction1 = new Transaction();
 		transaction1.setName("Test");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transaction1.setCategory(category1);
 		transaction1.setAccount(account);
 		ArrayList<Tag> tags = new ArrayList<>();
@@ -99,12 +97,12 @@ class TransactionSpecificationsTest
 		transaction2 = new Transaction();
 		transaction2.setName("Test_2");
 		transaction2.setAmount(-525);
-		transaction2.setDate(new DateTime(2018, 12, 3, 12, 0, 0, 0));
+		transaction2.setDate(LocalDate.of(2018, 12, 3));
 		transaction2.setCategory(category2);
 		transaction2.setAccount(account);
 		transaction2 = transactionRepository.save(transaction2);
 
-		DateTime repeatingTransactionDate = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
+		LocalDate repeatingTransactionDate = LocalDate.of(2018, 3, 13);
 		repeatingOption = new RepeatingOption();
 		repeatingOption.setModifier(new RepeatingModifierDays(10));
 		repeatingOption.setStartDate(repeatingTransactionDate);
@@ -127,7 +125,7 @@ class TransactionSpecificationsTest
 		transferTransaction = new Transaction();
 		transferTransaction.setName("TransferTransaction");
 		transferTransaction.setAmount(-500);
-		transferTransaction.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transferTransaction.setDate(LocalDate.of(2018, 10, 3));
 		transferTransaction.setCategory(category2);
 		transferTransaction.setAccount(account);
 		transferTransaction.setTransferAccount(account2);
@@ -136,7 +134,7 @@ class TransactionSpecificationsTest
 		transferTransactionWrongAccount = new Transaction();
 		transferTransactionWrongAccount.setName("Lunch");
 		transferTransactionWrongAccount.setAmount(-1100);
-		transferTransactionWrongAccount.setDate(new DateTime(2018, 9, 18, 12, 0, 0, 0));
+		transferTransactionWrongAccount.setDate(LocalDate.of(2018, 9, 18));
 		transferTransactionWrongAccount.setCategory(category2);
 		transferTransactionWrongAccount.setAccount(account2);
 		transferTransactionWrongAccount.setTransferAccount(account2);
@@ -145,7 +143,7 @@ class TransactionSpecificationsTest
 		transactionInHiddenAccount = new Transaction();
 		transactionInHiddenAccount.setName("Transaction in Hidden Account");
 		transactionInHiddenAccount.setAmount(-1100);
-		transactionInHiddenAccount.setDate(new DateTime(2018, 9, 18, 12, 0, 0, 0));
+		transactionInHiddenAccount.setDate(LocalDate.of(2018, 9, 18));
 		transactionInHiddenAccount.setAccount(accountHidden);
 		transactionInHiddenAccount = transactionRepository.save(transactionInHiddenAccount);
 	}
@@ -153,7 +151,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getIncomesAndExpendituresAndTransfers()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(4)
@@ -166,7 +164,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getIncomesAndExpenditures()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, false, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(3)
@@ -178,7 +176,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getIncomes()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, false, false, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, false, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -188,7 +186,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getExpenditures()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, false, true, false, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, false, true, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -199,7 +197,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getTransfers()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, false, false, true, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, false, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -209,7 +207,7 @@ class TransactionSpecificationsTest
 	@Test
 	void incomesAndExpendituresFalse()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, false, false, false, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, false, false, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(3)
@@ -221,7 +219,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getTransferBackReferences_NoReferences()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, false, true, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -231,7 +229,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getTransferBackReferences()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account2, false, false, true, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account2, false, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -242,7 +240,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getTransferBackReferences_excludeExpenditures()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account2, true, false, true, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account2, true, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -252,7 +250,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getTransferBackReferences_excludeIncomes()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account2, false, true, true, null, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account2, false, true, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -262,8 +260,8 @@ class TransactionSpecificationsTest
 	@Test
 	void getTransferBackReferences_WithStartDate()
 	{
-		DateTime startDate2019 = new DateTime(2019, 1, 1, 12, 0, 0, 0);
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate2019, DateHelper.getCurrentDate(), account2, false, false, true, null, List.of(), List.of(), null);
+		LocalDate startDate2019 = LocalDate.of(2019, 1, 1);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate2019, LocalDate.now(), account2, false, false, true, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).isEmpty();
@@ -272,7 +270,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getRepeating()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, false, true, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, false, true, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -282,7 +280,7 @@ class TransactionSpecificationsTest
 	@Test
 	void noRepeating()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, false, List.of(), List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, false, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(3)
@@ -296,7 +294,7 @@ class TransactionSpecificationsTest
 	{
 		List<Integer> categoryIDs = new ArrayList<>();
 		categoryIDs.add(categoryUnused.getID());
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, categoryIDs, List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, categoryIDs, List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).isEmpty();
@@ -307,7 +305,7 @@ class TransactionSpecificationsTest
 	{
 		List<Integer> categoryIDs = new ArrayList<>();
 		categoryIDs.add(category1.getID());
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, categoryIDs, List.of(), null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, categoryIDs, List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -318,7 +316,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getByFullName()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, List.of(), List.of(), "Repeating");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), List.of(), "Repeating");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -328,7 +326,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getByPartialName()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, List.of(), List.of(), "tin");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), List.of(), "tin");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -338,7 +336,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getByPartialName_ExcludeTransfersWithWrongAccount()
 	{
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account2, true, true, true, null, List.of(), List.of(), "tion");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account2, true, true, true, null, List.of(), List.of(), "tion");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -351,7 +349,7 @@ class TransactionSpecificationsTest
 		List<Integer> tagIDs = new ArrayList<>();
 		tagIDs.add(tag1.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, List.of(), tagIDs, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -365,7 +363,7 @@ class TransactionSpecificationsTest
 		tagIDs.add(tag1.getID());
 		tagIDs.add(tag2.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, List.of(), tagIDs, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(2)
@@ -380,7 +378,7 @@ class TransactionSpecificationsTest
 		List<Integer> tagIDs = new ArrayList<>();
 		tagIDs.add(tagUnused.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, true, true, true, null, List.of(), tagIDs, null);
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).isEmpty();
@@ -396,7 +394,7 @@ class TransactionSpecificationsTest
 		tagIDs.add(tag1.getID());
 		tagIDs.add(tag2.getID());
 
-		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, DateHelper.getCurrentDate(), account, false, true, true, true, categoryIDs, tagIDs, "Repeating");
+		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, false, true, true, true, categoryIDs, tagIDs, "Repeating");
 
 		List<Transaction> results = transactionRepository.findAll(spec);
 		assertThat(results).hasSize(1)
@@ -406,7 +404,7 @@ class TransactionSpecificationsTest
 	@Test
 	void getFromAllAccountsExceptTransfersWithSpecificEndDate()
 	{
-		DateTime endDate = new DateTime(2018, 11, 30, 12, 0, 0, 0);
+		LocalDate endDate = LocalDate.of(2018, 11, 30);
 		Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, null, true, true, false, null, List.of(), List.of(), null);
 
 		List<Transaction> results = transactionRepository.findAll(spec);
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java
index 235e73b61..d02982424 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/LocalGitBackupTaskTest.java
@@ -11,20 +11,20 @@ import de.deadlocker8.budgetmaster.database.model.v7.BackupDatabase_v7;
 import de.deadlocker8.budgetmaster.settings.Settings;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
 import de.deadlocker8.budgetmaster.unit.helpers.Helpers;
+import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.thecodelabs.utils.util.OS;
-import org.joda.time.DateTimeUtils;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.io.TempDir;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.time.LocalDateTime;
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -56,14 +56,6 @@ class LocalGitBackupTaskTest
 		{
 			gitExecutable = "/usr/bin/git";
 		}
-
-		DateTimeUtils.setCurrentMillisFixed(1612004400000L);
-	}
-
-	@AfterAll
-	public static void cleanup()
-	{
-		DateTimeUtils.setCurrentMillisSystem();
 	}
 
 	@Test
@@ -97,29 +89,34 @@ class LocalGitBackupTaskTest
 	@Test
 	void test_runBackup_firstCommit()
 	{
-		final Settings previousSettings = Settings.getDefault();
-		previousSettings.setAutoBackupStrategy(AutoBackupStrategy.GIT_LOCAL);
-
-		final Path repositoryFolder = tempFolder.resolve(".git");
-
-		final BackupDatabase_v7 database = new BackupDatabase_v7();
-		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
-		Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
-
-		final LocalGitBackupTask localGitBackupTask = new LocalGitBackupTask(databaseService, settingsService);
-		localGitBackupTask.setGitFolder(repositoryFolder);
-		localGitBackupTask.run();
-
-		assertThat(localGitBackupTask.getBackupStatus()).isEqualByComparingTo(BackupStatus.OK);
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "rev-list", "--all", "--count"))
-				.isEqualTo("1");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "log", "--pretty=%B", "-1"))
-				.startsWith("2021-01-30");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
-				.contains(BackupTask.DATABASE_FILE_NAME);
+		try(MockedStatic<DateHelper> dateHelper = Mockito.mockStatic(DateHelper.class))
+		{
+			dateHelper.when(DateHelper::getCurrentDateTime).thenReturn(LocalDateTime.of(2021, 1, 30, 12, 0, 0));
+
+			final Settings previousSettings = Settings.getDefault();
+			previousSettings.setAutoBackupStrategy(AutoBackupStrategy.GIT_LOCAL);
+
+			final Path repositoryFolder = tempFolder.resolve(".git");
+
+			final BackupDatabase_v7 database = new BackupDatabase_v7();
+			Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
+			Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
+
+			final LocalGitBackupTask localGitBackupTask = new LocalGitBackupTask(databaseService, settingsService);
+			localGitBackupTask.setGitFolder(repositoryFolder);
+			localGitBackupTask.run();
+
+			assertThat(localGitBackupTask.getBackupStatus()).isEqualByComparingTo(BackupStatus.OK);
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "rev-list", "--all", "--count"))
+					.isEqualTo("1");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "log", "--pretty=%B", "-1"))
+					.startsWith("2021-01-30");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
+					.contains(BackupTask.DATABASE_FILE_NAME);
+		}
 	}
 
 	@Test
@@ -149,33 +146,37 @@ class LocalGitBackupTaskTest
 	@Test
 	void test_runBackup_fileChanged()
 	{
-		final Settings previousSettings = Settings.getDefault();
-		previousSettings.setAutoBackupStrategy(AutoBackupStrategy.GIT_LOCAL);
-
-		final Path repositoryFolder = tempFolder.resolve(".git");
-
-		final BackupDatabase_v7 database = new BackupDatabase_v7();
-		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
-		Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
-
-		final LocalGitBackupTask localGitBackupTask = new LocalGitBackupTask(databaseService, settingsService);
-		localGitBackupTask.setGitFolder(repositoryFolder);
-		localGitBackupTask.run();
-
-		final BackupDatabase_v7 databaseModified = new BackupDatabase_v7(List.of(new BackupCategory_v7(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of(), List.of());
-		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified);
-		localGitBackupTask.run();
-
-		assertThat(localGitBackupTask.getBackupStatus())
-				.isEqualByComparingTo(BackupStatus.OK);
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "rev-list", "--all", "--count"))
-				.isEqualTo("2");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "log", "--pretty=%B", "-1"))
-				.startsWith("2021-01-30");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
-				.contains(BackupTask.DATABASE_FILE_NAME);
+		try(MockedStatic<DateHelper> dateHelper = Mockito.mockStatic(DateHelper.class))
+		{
+			dateHelper.when(DateHelper::getCurrentDateTime).thenReturn(LocalDateTime.of(2021, 1, 30, 12, 0, 0));
+			final Settings previousSettings = Settings.getDefault();
+			previousSettings.setAutoBackupStrategy(AutoBackupStrategy.GIT_LOCAL);
+
+			final Path repositoryFolder = tempFolder.resolve(".git");
+
+			final BackupDatabase_v7 database = new BackupDatabase_v7();
+			Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(database);
+			Mockito.doCallRealMethod().when(databaseService).exportDatabase(Mockito.any());
+
+			final LocalGitBackupTask localGitBackupTask = new LocalGitBackupTask(databaseService, settingsService);
+			localGitBackupTask.setGitFolder(repositoryFolder);
+			localGitBackupTask.run();
+
+			final BackupDatabase_v7 databaseModified = new BackupDatabase_v7(List.of(new BackupCategory_v7(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of(), List.of());
+			Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified);
+			localGitBackupTask.run();
+
+			assertThat(localGitBackupTask.getBackupStatus())
+					.isEqualByComparingTo(BackupStatus.OK);
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "rev-list", "--all", "--count"))
+					.isEqualTo("2");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "log", "--pretty=%B", "-1"))
+					.startsWith("2021-01-30");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
+					.contains(BackupTask.DATABASE_FILE_NAME);
+		}
 	}
 }
\ No newline at end of file
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java
index f9dd50270..96a31cb0d 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/backup/RemoteGitBackupTaskTest.java
@@ -11,20 +11,21 @@ import de.deadlocker8.budgetmaster.database.model.v7.BackupDatabase_v7;
 import de.deadlocker8.budgetmaster.settings.Settings;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
 import de.deadlocker8.budgetmaster.unit.helpers.Helpers;
+import de.deadlocker8.budgetmaster.utils.DateHelper;
 import de.thecodelabs.utils.util.OS;
-import org.joda.time.DateTimeUtils;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.io.TempDir;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.time.LocalDateTime;
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -55,14 +56,6 @@ class RemoteGitBackupTaskTest
 		{
 			gitExecutable = "/usr/bin/git";
 		}
-
-		DateTimeUtils.setCurrentMillisFixed(1612004400000L);
-	}
-
-	@AfterAll
-	public static void cleanup()
-	{
-		DateTimeUtils.setCurrentMillisSystem();
 	}
 
 	@Test
@@ -152,36 +145,41 @@ class RemoteGitBackupTaskTest
 	@Test
 	void test_runBackup_firstCommit() throws IOException
 	{
-		// create fake server
-		final Path fakeServerFolder = Files.createDirectory(tempFolder.resolve("server"));
-		final Path repositoryFolder = Files.createDirectory(tempFolder.resolve("client")).resolve(".git");
-
-		final RemoteGitBackupTask remoteGitBackupTask = createBackupTask(repositoryFolder, fakeServerFolder);
-		remoteGitBackupTask.run();
-
-		// check local git
-		assertThat(remoteGitBackupTask.getBackupStatus()).
-				isEqualByComparingTo(BackupStatus.OK);
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "rev-list", "--all", "--count"))
-				.isEqualTo("1");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "log", "--pretty=%B", "-1"))
-				.startsWith("2021-01-30");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
-				.contains(BackupTask.DATABASE_FILE_NAME);
-
-		// check remote git
-		assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
-				gitExecutable, "rev-list", "--all", "--count"))
-				.isEqualTo("1");
-		assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
-				gitExecutable, "log", "--pretty=%B", "-1"))
-				.startsWith("2021-01-30");
-		assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
-				gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
-				.contains(BackupTask.DATABASE_FILE_NAME);
+		try(MockedStatic<DateHelper> dateHelper = Mockito.mockStatic(DateHelper.class))
+		{
+			dateHelper.when(DateHelper::getCurrentDateTime).thenReturn(LocalDateTime.of(2021, 1, 30, 12, 0, 0));
+
+			// create fake server
+			final Path fakeServerFolder = Files.createDirectory(tempFolder.resolve("server"));
+			final Path repositoryFolder = Files.createDirectory(tempFolder.resolve("client")).resolve(".git");
+
+			final RemoteGitBackupTask remoteGitBackupTask = createBackupTask(repositoryFolder, fakeServerFolder);
+			remoteGitBackupTask.run();
+
+			// check local git
+			assertThat(remoteGitBackupTask.getBackupStatus()).
+					isEqualByComparingTo(BackupStatus.OK);
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "rev-list", "--all", "--count"))
+					.isEqualTo("1");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "log", "--pretty=%B", "-1"))
+					.startsWith("2021-01-30");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
+					.contains(BackupTask.DATABASE_FILE_NAME);
+
+			// check remote git
+			assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
+					gitExecutable, "rev-list", "--all", "--count"))
+					.isEqualTo("1");
+			assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
+					gitExecutable, "log", "--pretty=%B", "-1"))
+					.startsWith("2021-01-30");
+			assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
+					gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
+					.contains(BackupTask.DATABASE_FILE_NAME);
+		}
 	}
 
 	@Test
@@ -211,39 +209,43 @@ class RemoteGitBackupTaskTest
 	@Test
 	void test_runBackup_fileChanged() throws IOException
 	{
-		// create fake server
-		final Path fakeServerFolder = Files.createDirectory(tempFolder.resolve("server"));
-		final Path repositoryFolder = Files.createDirectory(tempFolder.resolve("client")).resolve(".git");
-
-		final RemoteGitBackupTask remoteGitBackupTask = createBackupTask(repositoryFolder, fakeServerFolder);
-		remoteGitBackupTask.run();
-
-		final BackupDatabase_v7 databaseModified = new BackupDatabase_v7(List.of(new BackupCategory_v7(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of(), List.of());
-		Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified);
-		remoteGitBackupTask.run();
-
-		// check local git
-		assertThat(remoteGitBackupTask.getBackupStatus()).isEqualByComparingTo(BackupStatus.OK);
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "rev-list", "--all", "--count"))
-				.isEqualTo("2");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "log", "--pretty=%B", "-1"))
-				.startsWith("2021-01-30");
-		assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
-				gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
-				.contains(BackupTask.DATABASE_FILE_NAME);
-
-		// check remote git
-		assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
-				gitExecutable, "rev-list", "--all", "--count"))
-				.isEqualTo("2");
-		assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
-				gitExecutable, "log", "--pretty=%B", "-1"))
-				.startsWith("2021-01-30");
-		assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
-				gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
-				.contains(BackupTask.DATABASE_FILE_NAME);
+		try(MockedStatic<DateHelper> dateHelper = Mockito.mockStatic(DateHelper.class))
+		{
+			dateHelper.when(DateHelper::getCurrentDateTime).thenReturn(LocalDateTime.of(2021, 1, 30, 12, 0, 0));
+			// create fake server
+			final Path fakeServerFolder = Files.createDirectory(tempFolder.resolve("server"));
+			final Path repositoryFolder = Files.createDirectory(tempFolder.resolve("client")).resolve(".git");
+
+			final RemoteGitBackupTask remoteGitBackupTask = createBackupTask(repositoryFolder, fakeServerFolder);
+			remoteGitBackupTask.run();
+
+			final BackupDatabase_v7 databaseModified = new BackupDatabase_v7(List.of(new BackupCategory_v7(5, "myCategory", "#FF0000", CategoryType.CUSTOM, null)), List.of(), List.of(), List.of(), List.of(), List.of(), List.of());
+			Mockito.when(databaseService.getDatabaseForJsonSerialization()).thenReturn(databaseModified);
+			remoteGitBackupTask.run();
+
+			// check local git
+			assertThat(remoteGitBackupTask.getBackupStatus()).isEqualByComparingTo(BackupStatus.OK);
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "rev-list", "--all", "--count"))
+					.isEqualTo("2");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "log", "--pretty=%B", "-1"))
+					.startsWith("2021-01-30");
+			assertThat(Helpers.runCommand(repositoryFolder.getParent().toFile(),
+					gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
+					.contains(BackupTask.DATABASE_FILE_NAME);
+
+			// check remote git
+			assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
+					gitExecutable, "rev-list", "--all", "--count"))
+					.isEqualTo("2");
+			assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
+					gitExecutable, "log", "--pretty=%B", "-1"))
+					.startsWith("2021-01-30");
+			assertThat(Helpers.runCommand(fakeServerFolder.toFile(),
+					gitExecutable, "show", "--name-only", "--oneline", "HEAD"))
+					.contains(BackupTask.DATABASE_FILE_NAME);
+		}
 	}
 
 	private RemoteGitBackupTask createBackupTask(Path repositoryFolder, Path fakeServerFolder)
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 ba4f82b26..8d720c354 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
@@ -38,7 +38,6 @@ import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
 import de.deadlocker8.budgetmaster.transactions.TransactionService;
 import de.thecodelabs.utils.util.Localization;
-import org.joda.time.DateTime;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -52,6 +51,7 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -204,7 +204,7 @@ class DatabaseExportTest
 		transaction1.setName("ShouldGoInAccount_1");
 		transaction1.setAmount(200);
 		transaction1.setIsExpenditure(false);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transaction1.setTags(tags);
 
 		Transaction transaction2 = new Transaction();
@@ -213,7 +213,7 @@ class DatabaseExportTest
 		transaction2.setName("ImPartOfAccount_2");
 		transaction2.setAmount(-525);
 		transaction2.setIsExpenditure(true);
-		DateTime transaction2Date = new DateTime(2018, 10, 3, 12, 0, 0, 0);
+		LocalDate transaction2Date = LocalDate.of(2018, 10, 3);
 		transaction2.setDate(transaction2Date);
 		transaction2.setTags(new ArrayList<>());
 		RepeatingOption repeatingOption = new RepeatingOption(transaction2Date,
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v8_convertToInternalTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v8_convertToInternalTest.java
index 8cba7d792..147ac69ae 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v8_convertToInternalTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v8_convertToInternalTest.java
@@ -21,8 +21,6 @@ import de.deadlocker8.budgetmaster.templates.Template;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.thecodelabs.utils.util.Localization;
 import de.thecodelabs.utils.util.Localization.LocalizationDelegate;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -30,6 +28,7 @@ import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -231,8 +230,7 @@ class DatabaseParser_v8_convertToInternalTest
 
 			Transaction normalTransaction_1 = new Transaction();
 			normalTransaction_1.setAmount(35000);
-			DateTime normalTransactionDate = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			normalTransactionDate = normalTransactionDate.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+			LocalDate normalTransactionDate = LocalDate.of(2018, 3, 13);
 			normalTransaction_1.setDate(normalTransactionDate);
 			normalTransaction_1.setCategory(categoryNone);
 			normalTransaction_1.setName("Income");
@@ -243,8 +241,7 @@ class DatabaseParser_v8_convertToInternalTest
 
 			Transaction normalTransaction_2 = new Transaction();
 			normalTransaction_2.setAmount(-2000);
-			DateTime normalTransaction_2Date = DateTime.parse("2018-06-15", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			normalTransaction_2Date = normalTransaction_2Date.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+			LocalDate normalTransaction_2Date = LocalDate.of(2018, 6, 15);
 			normalTransaction_2.setDate(normalTransaction_2Date);
 			normalTransaction_2.setName("Simple");
 			normalTransaction_2.setDescription("");
@@ -259,8 +256,7 @@ class DatabaseParser_v8_convertToInternalTest
 
 			Transaction repeatingTransaction_1 = new Transaction();
 			repeatingTransaction_1.setAmount(-12300);
-			DateTime repeatingTransaction_1Date = DateTime.parse("2018-03-13", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			repeatingTransaction_1Date = repeatingTransaction_1Date.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+			LocalDate repeatingTransaction_1Date = LocalDate.of(2018, 3, 13);
 			repeatingTransaction_1.setDate(repeatingTransaction_1Date);
 			repeatingTransaction_1.setCategory(categoryNone);
 			repeatingTransaction_1.setName("Test");
@@ -276,8 +272,7 @@ class DatabaseParser_v8_convertToInternalTest
 
 			Transaction transferTransaction = new Transaction();
 			transferTransaction.setAmount(-250);
-			DateTime transferTransactionDate = DateTime.parse("2018-06-15", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			transferTransactionDate = transferTransactionDate.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+			LocalDate transferTransactionDate = LocalDate.of(2018, 6, 15);
 			transferTransaction.setDate(transferTransactionDate);
 			transferTransaction.setName("Transfer");
 			transferTransaction.setDescription("");
@@ -289,8 +284,7 @@ class DatabaseParser_v8_convertToInternalTest
 
 			Transaction repeatingTransferTransaction = new Transaction();
 			repeatingTransferTransaction.setAmount(-6000);
-			DateTime transferTransactionDate_2 = DateTime.parse("2018-03-15", DateTimeFormat.forPattern("yyyy-MM-dd"));
-			transferTransactionDate_2 = transferTransactionDate_2.withHourOfDay(12).withMinuteOfHour(0).withSecondOfMinute(0);
+			LocalDate transferTransactionDate_2 = LocalDate.of(2018, 3, 15);
 			repeatingTransferTransaction.setDate(transferTransactionDate_2);
 			repeatingTransferTransaction.setCategory(categoryNone);
 			repeatingTransferTransaction.setName("repeat my transfer");
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
index 425c4d95c..af645034e 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
@@ -35,7 +35,6 @@ import de.deadlocker8.budgetmaster.templates.TemplateRepository;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.transactions.TransactionBase;
 import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
-import org.joda.time.DateTime;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
@@ -43,6 +42,7 @@ import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -98,14 +98,14 @@ class ImportServiceTest
 		Transaction transaction1 = new Transaction();
 		transaction1.setName("Test");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transaction1.setCategory(category1);
 		transactionList.add(transaction1);
 
 		Transaction transaction2 = new Transaction();
 		transaction2.setName("Test_2");
 		transaction2.setAmount(-525);
-		transaction2.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction2.setDate(LocalDate.of(2018, 10, 3));
 		transaction2.setCategory(category2);
 		transactionList.add(transaction2);
 
@@ -159,7 +159,7 @@ class ImportServiceTest
 		Transaction transaction1 = new Transaction();
 		transaction1.setName("Test");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transaction1.setCategory(category1);
 		transaction1.setAccount(new Account("Account", AccountType.CUSTOM));
 		transactionList.add(transaction1);
@@ -167,7 +167,7 @@ class ImportServiceTest
 		Transaction transaction2 = new Transaction();
 		transaction2.setName("Test_2");
 		transaction2.setAmount(-525);
-		transaction2.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction2.setDate(LocalDate.of(2018, 10, 3));
 		transaction2.setCategory(category2);
 		transaction2.setAccount(new Account("Account", AccountType.CUSTOM));
 		transactionList.add(transaction2);
@@ -198,14 +198,14 @@ class ImportServiceTest
 		transaction1.setAccount(account1);
 		transaction1.setName("ShouldGoInAccount_1");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transactionList.add(transaction1);
 
 		Transaction transaction2 = new Transaction();
 		transaction2.setAccount(account2);
 		transaction2.setName("ImPartOfAccount_2");
 		transaction2.setAmount(-525);
-		transaction2.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction2.setDate(LocalDate.of(2018, 10, 3));
 		transactionList.add(transaction2);
 
 		List<TransactionBase> updatedTransactions = importService.updateAccountsForItems(transactionList, account1.getID(), destinationAccount);
@@ -230,7 +230,7 @@ class ImportServiceTest
 		transaction.setTransferAccount(transferAccount);
 		transaction.setName("Whatever");
 		transaction.setAmount(-525);
-		transaction.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction.setDate(LocalDate.of(2018, 10, 3));
 		transactionList.add(transaction);
 
 		// expected
@@ -239,7 +239,7 @@ class ImportServiceTest
 		expectedTransaction.setTransferAccount(destinationAccount);
 		expectedTransaction.setName("Whatever");
 		expectedTransaction.setAmount(-525);
-		expectedTransaction.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		expectedTransaction.setDate(LocalDate.of(2018, 10, 3));
 
 		assertThat(importService.updateTransferAccountsForItems(transactionList, transferAccount.getID(), destinationAccount))
 				.hasSize(1)
@@ -328,7 +328,7 @@ class ImportServiceTest
 		transaction1.setAccount(account1);
 		transaction1.setName("ShouldGoInAccount_1");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		List<Tag> tags = new ArrayList<>();
 		tags.add(existingTag);
 		transaction1.setTags(tags);
@@ -355,7 +355,7 @@ class ImportServiceTest
 		transaction1.setAccount(account1);
 		transaction1.setName("ShouldGoInAccount_1");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		List<Tag> tags = new ArrayList<>();
 		tags.add(newTag);
 		transaction1.setTags(tags);
@@ -402,7 +402,7 @@ class ImportServiceTest
 		transaction1.setAccount(sourceAccount1);
 		transaction1.setName("ShouldGoInAccount_1");
 		transaction1.setAmount(200);
-		transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction1.setDate(LocalDate.of(2018, 10, 3));
 		transaction1.setTags(tags);
 		transactions.add(transaction1);
 
@@ -410,7 +410,7 @@ class ImportServiceTest
 		transaction2.setAccount(sourceAccount2);
 		transaction2.setName("ImPartOfAccount_2");
 		transaction2.setAmount(-525);
-		transaction2.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		transaction2.setDate(LocalDate.of(2018, 10, 3));
 		transaction2.setTags(new ArrayList<>());
 		transactions.add(transaction2);
 
@@ -469,14 +469,14 @@ class ImportServiceTest
 		expectedTransaction1.setAccount(destAccount1);
 		expectedTransaction1.setName("ShouldGoInAccount_1");
 		expectedTransaction1.setAmount(200);
-		expectedTransaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		expectedTransaction1.setDate(LocalDate.of(2018, 10, 3));
 		expectedTransaction1.setTags(tags);
 
 		Transaction expectedTransaction2 = new Transaction();
 		expectedTransaction2.setAccount(destAccount2);
 		expectedTransaction2.setName("ImPartOfAccount_2");
 		expectedTransaction2.setAmount(-525);
-		expectedTransaction2.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
+		expectedTransaction2.setDate(LocalDate.of(2018, 10, 3));
 		expectedTransaction2.setTags(new ArrayList<>());
 
 		Template expectedTemplate1 = new Template();
@@ -655,7 +655,7 @@ class ImportServiceTest
 		Mockito.when(iconService.getRepository()).thenReturn(iconRepositoryMock);
 		Mockito.when(iconRepositoryMock.save(Mockito.any())).thenReturn(expectedIcon);
 
-		importService.importDatabase(database, new AccountMatchList(List.of(accountMatch)), true,true, true);
+		importService.importDatabase(database, new AccountMatchList(List.of(accountMatch)), true, true, true);
 
 		Mockito.verify(accountRepository, Mockito.atLeast(1)).save(expectedAccount);
 	}
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/repeating/RepeatingOptionTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/repeating/RepeatingOptionTest.java
index f44b7e850..44e88c344 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/repeating/RepeatingOptionTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/repeating/RepeatingOptionTest.java
@@ -7,9 +7,9 @@ import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndNever;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierMonths;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierYears;
-import org.joda.time.DateTime;
 import org.junit.jupiter.api.Test;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -23,18 +23,18 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_Every3Days_EndAfter3Times()
 	{
-		DateTime startDate = new DateTime(2018, 4, 22, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 22);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierDays(3),
 				new RepeatingEndAfterXTimes(3));
 
-		DateTime dateFetchLimit = new DateTime(2019, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2019, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2018, 4, 25, 12, 0));
-		expected.add(new DateTime(2018, 4, 28, 12, 0));
-		expected.add(new DateTime(2018, 5, 1, 12, 0));
+		expected.add(LocalDate.of(2018, 4, 25));
+		expected.add(LocalDate.of(2018, 4, 28));
+		expected.add(LocalDate.of(2018, 5, 1));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -43,18 +43,18 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_Every3Days_EndAfterDate()
 	{
-		DateTime startDate = new DateTime(2018, 4, 22, 12, 0);
-		DateTime endDate = new DateTime(2018, 4, 28, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 22);
+		LocalDate endDate = LocalDate.of(2018, 4, 28);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierDays(3),
 				new RepeatingEndDate(endDate));
 
-		DateTime dateFetchLimit = new DateTime(2019, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2019, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2018, 4, 25, 12, 0));
-		expected.add(new DateTime(2018, 4, 28, 12, 0));
+		expected.add(LocalDate.of(2018, 4, 25));
+		expected.add(LocalDate.of(2018, 4, 28));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -63,18 +63,18 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_Every3Days_EndNever()
 	{
-		DateTime startDate = new DateTime(2018, 4, 22, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 22);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierDays(3),
 				new RepeatingEndNever());
 
-		DateTime dateFetchLimit = new DateTime(2018, 5, 2, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2018, 5, 2);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2018, 4, 25, 12, 0));
-		expected.add(new DateTime(2018, 4, 28, 12, 0));
-		expected.add(new DateTime(2018, 5, 1, 12, 0));
+		expected.add(LocalDate.of(2018, 4, 25));
+		expected.add(LocalDate.of(2018, 4, 28));
+		expected.add(LocalDate.of(2018, 5, 1));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -85,20 +85,20 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_Every2Month_EndAfter5Times()
 	{
-		DateTime startDate = new DateTime(2018, 4, 30, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 30);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierMonths(2),
 				new RepeatingEndAfterXTimes(5));
 
-		DateTime dateFetchLimit = new DateTime(2020, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2020, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2018, 6, 30, 12, 0));
-		expected.add(new DateTime(2018, 8, 30, 12, 0));
-		expected.add(new DateTime(2018, 10, 30, 12, 0));
-		expected.add(new DateTime(2018, 12, 30, 12, 0));
-		expected.add(new DateTime(2019, 2, 28, 12, 0));
+		expected.add(LocalDate.of(2018, 6, 30));
+		expected.add(LocalDate.of(2018, 8, 30));
+		expected.add(LocalDate.of(2018, 10, 30));
+		expected.add(LocalDate.of(2018, 12, 30));
+		expected.add(LocalDate.of(2019, 2, 28));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -107,18 +107,18 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_Every2Month_EndAfterDate()
 	{
-		DateTime startDate = new DateTime(2018, 4, 30, 12, 0);
-		DateTime endDate = new DateTime(2018, 9, 28, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 30);
+		LocalDate endDate = LocalDate.of(2018, 9, 28);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierMonths(2),
 				new RepeatingEndDate(endDate));
 
-		DateTime dateFetchLimit = new DateTime(2020, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2020, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2018, 6, 30, 12, 0));
-		expected.add(new DateTime(2018, 8, 30, 12, 0));
+		expected.add(LocalDate.of(2018, 6, 30));
+		expected.add(LocalDate.of(2018, 8, 30));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -127,17 +127,17 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_Every2Month_EndNever()
 	{
-		DateTime startDate = new DateTime(2018, 4, 30, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 30);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierMonths(2),
 				new RepeatingEndNever());
 
-		DateTime dateFetchLimit = new DateTime(2018, 9, 2, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2018, 9, 2);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2018, 6, 30, 12, 0));
-		expected.add(new DateTime(2018, 8, 30, 12, 0));
+		expected.add(LocalDate.of(2018, 6, 30));
+		expected.add(LocalDate.of(2018, 8, 30));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -148,17 +148,17 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_EveryYear_EndAfter2Times()
 	{
-		DateTime startDate = new DateTime(2018, 4, 30, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 30);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierYears(1),
 				new RepeatingEndAfterXTimes(2));
 
-		DateTime dateFetchLimit = new DateTime(2022, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2022, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2019, 4, 30, 12, 0));
-		expected.add(new DateTime(2020, 4, 30, 12, 0));
+		expected.add(LocalDate.of(2019, 4, 30));
+		expected.add(LocalDate.of(2020, 4, 30));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -167,17 +167,17 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_EveryYear_EndAfterDate()
 	{
-		DateTime startDate = new DateTime(2018, 4, 30, 12, 0);
-		DateTime endDate = new DateTime(2019, 9, 28, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 30);
+		LocalDate endDate = LocalDate.of(2019, 9, 28);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierYears(1),
 				new RepeatingEndDate(endDate));
 
-		DateTime dateFetchLimit = new DateTime(2022, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2022, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2019, 4, 30, 12, 0));
+		expected.add(LocalDate.of(2019, 4, 30));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
@@ -186,16 +186,16 @@ class RepeatingOptionTest
 	@Test
 	void test_GetRepeatingDates_EveryYear_EndNever()
 	{
-		DateTime startDate = new DateTime(2018, 4, 30, 12, 0);
+		LocalDate startDate = LocalDate.of(2018, 4, 30);
 		RepeatingOption repeatingOption = new RepeatingOption(startDate,
 				new RepeatingModifierYears(1),
 				new RepeatingEndNever());
 
-		DateTime dateFetchLimit = new DateTime(2020, 1, 1, 12, 0);
+		LocalDate dateFetchLimit = LocalDate.of(2020, 1, 1);
 
-		List<DateTime> expected = new ArrayList<>();
+		List<LocalDate> expected = new ArrayList<>();
 		expected.add(startDate);
-		expected.add(new DateTime(2019, 4, 30, 12, 0));
+		expected.add(LocalDate.of(2019, 4, 30));
 
 		assertThat(repeatingOption.getRepeatingDates(dateFetchLimit))
 				.isEqualTo(expected);
-- 
GitLab