diff --git a/.hgtags b/.hgtags
index 6a0e5499a704648d92be32c78177e04356d99982..e825a2af371ffe4b29cf344486653497b8995ec5 100644
--- a/.hgtags
+++ b/.hgtags
@@ -135,3 +135,4 @@ d355c6357d0e5aeb25fc978b747824447a214b88 OpenOLAT 10.4.5
 fef7f6b2e2628d242e93f86d208f4cfb9c807d7c OpenOLAT 10.4.6
 b38ed621ea53507fbf41eb616648ebad2340e613 OpenOLAT 10.4.7
 273a6270a08460c07fdfbb53e31547b9c7e1c8c9 OpenOLAT 10.4.8
+6cea4865f4e8ea7978eb90f82662bdfa4132dbcb OpenOLAT 10.4.9
diff --git a/src/main/java/org/olat/commons/calendar/manager/ImportCalendarManager.java b/src/main/java/org/olat/commons/calendar/manager/ImportCalendarManager.java
index c79582b7bc2d0a5c1efc56de5894faf58ba1f832..85e7edadf4443772f07093a10c56b593a74ed8c9 100644
--- a/src/main/java/org/olat/commons/calendar/manager/ImportCalendarManager.java
+++ b/src/main/java/org/olat/commons/calendar/manager/ImportCalendarManager.java
@@ -46,6 +46,7 @@ import org.olat.commons.calendar.model.ImportedCalendar;
 import org.olat.commons.calendar.model.Kalendar;
 import org.olat.commons.calendar.model.KalendarComparator;
 import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -69,6 +70,10 @@ import net.fortuna.ical4j.model.Calendar;
 public class ImportCalendarManager {
 	private static final OLog log = Tracing.createLoggerFor(ImportCalendarManager.class);
 	
+	private static final int RELOAD_INTERVAL = 3600000;
+	
+	@Autowired
+	private DB dbInstance;
 	@Autowired
 	private CalendarModule calendarModule;
 	@Autowired
@@ -147,20 +152,11 @@ public class ImportCalendarManager {
 
 			List<ImportedCalendar> importedCalendars = importedCalendarDao.getImportedCalendars(identity);
 			for (ImportedCalendar importedCalendar: importedCalendars) {
-				String calendarId = importedCalendar.getCalendarId();
-				String url = importedCalendar.getUrl();
-
 				if(reload) {
-					Date lastUpdate = importedCalendar.getLastUpdate();
-					if (url != null && (timestamp - lastUpdate.getTime() > 3600000)) {
-						log.info("Calendar reload started from url=" + url);
-						reloadCalendarFromUrl(url, CalendarManager.TYPE_USER, calendarId);
-						importedCalendar.setLastUpdate(new Date());
-						importedCalendar = importedCalendarDao.update(importedCalendar);
-						log.info("Calendar reloaded from url=" + url);
-					}
+					reloadImportCalendar(importedCalendar, timestamp);
 				}
-				
+
+				String calendarId = importedCalendar.getCalendarId();
 				KalendarRenderWrapper calendarWrapper = calendarManager.getImportedCalendar(identity, calendarId);
 				calendarWrapper.setDisplayName(importedCalendar.getDisplayName());
 				calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
@@ -177,28 +173,16 @@ public class ImportCalendarManager {
 	}
 	
 	public List<CalendarFileInfos> getImportedCalendarInfosForIdentity(Identity identity, boolean reload) {
-		// initialize the calendars list
-
 		List<CalendarFileInfos> calendars = new ArrayList<CalendarFileInfos>();
 		if(calendarModule.isEnabled() && calendarModule.isEnablePersonalCalendar()) {
 			long timestamp = System.currentTimeMillis();
 
 			List<ImportedCalendar> importedCalendars = importedCalendarDao.getImportedCalendars(identity);
 			for (ImportedCalendar importedCalendar: importedCalendars) {
-				String calendarId = importedCalendar.getCalendarId();
-				String url = importedCalendar.getUrl();
-
 				if(reload) {
-					Date lastUpdate = importedCalendar.getLastUpdate();
-					if (url != null && (timestamp - lastUpdate.getTime() > 3600000)) {
-						log.info("Calendar reload started from url=" + url);
-						reloadCalendarFromUrl(url, CalendarManager.TYPE_USER, calendarId);
-						importedCalendar.setLastUpdate(new Date());
-						importedCalendar = importedCalendarDao.update(importedCalendar);
-						log.info("Calendar reloaded from url=" + url);
-					}
+					reloadImportCalendar(importedCalendar, timestamp);
 				}
-
+				String calendarId = importedCalendar.getCalendarId();
 				File calendarFile = calendarManager.getCalendarFile(CalendarManager.TYPE_USER, calendarId);
 				CalendarFileInfos calendarInfos = new CalendarFileInfos(calendarId, CalendarManager.TYPE_USER, calendarFile);
 				calendars.add(calendarInfos);
@@ -206,6 +190,21 @@ public class ImportCalendarManager {
 		}
 		return calendars;
 	}
+	
+	private void reloadImportCalendar(ImportedCalendar importedCalendar, long timestamp) {
+		String url = importedCalendar.getUrl();
+		Date lastUpdate = importedCalendar.getLastUpdate();
+		if (url != null && (timestamp - lastUpdate.getTime() > RELOAD_INTERVAL)) {
+			log.info("Calendar reload started from url=" + url);
+			importedCalendar.setLastUpdate(new Date());
+			importedCalendar = importedCalendarDao.update(importedCalendar);
+			dbInstance.commit();
+			
+			String calendarId = importedCalendar.getCalendarId();
+			reloadCalendarFromUrl(url, CalendarManager.TYPE_USER, calendarId);
+			log.info("Calendar reloaded from url=" + url);
+		}
+	}
 
 	/**
 	 * Reload calendar from url and store calendar file locally.
diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
index 6b0547cbcab59572f0669543a45826e27da66a75..3ea6e7330645daf24c50ba281ead184c06125237 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
@@ -91,6 +91,7 @@ public class GroupTaskPage {
 		By uploadButtonBy = By.cssSelector("#" + stepId + " .o_sel_course_gta_submit_file");
 		browser.findElement(uploadButtonBy).click();
 		OOGraphene.waitBusy(browser);
+		OOGraphene.waitModalDialog(browser);
 		
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
@@ -106,6 +107,7 @@ public class GroupTaskPage {
 		By uploadButtonBy = By.cssSelector("#o_step_submit_content .o_sel_course_gta_create_doc");
 		browser.findElement(uploadButtonBy).click();
 		OOGraphene.waitBusy(browser);
+		OOGraphene.waitModalDialog(browser);
 		
 		By filenameBy = By.cssSelector(".o_sel_course_gta_doc_filename input[type='text']");
 		browser.findElement(filenameBy).sendKeys(filename);