From 93e14efc6b1edb9f37108e9bd1e057a908b4d3e3 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 19 Aug 2015 10:17:11 +0200
Subject: [PATCH] OO-1647: remove auto-subscribe of course calendar, list of
 course which the user is member of and which have a calendar ( as
 configuration or as course element)

---
 .../coursecreation/steps/CcStep01.java        |   2 +-
 .../collaboration/CollaborationTools.java     |   2 +-
 .../calendar/ICalFileCalendarManager.java     |  58 ++--
 .../commons/calendar/ICalTokenGenerator.java  |  29 ++
 .../calendar/_chelp/course-calendar.html      |  22 +-
 .../commons/calendar/_content/calConfig.html  |   8 +-
 .../calendar/_i18n/LocalStrings_ar.properties |   1 -
 .../calendar/_i18n/LocalStrings_bg.properties |   1 -
 .../calendar/_i18n/LocalStrings_cs.properties |   1 -
 .../calendar/_i18n/LocalStrings_de.properties |   1 -
 .../calendar/_i18n/LocalStrings_el.properties |   1 -
 .../calendar/_i18n/LocalStrings_en.properties |   1 -
 .../calendar/_i18n/LocalStrings_es.properties |   1 -
 .../calendar/_i18n/LocalStrings_fr.properties |   1 -
 .../calendar/_i18n/LocalStrings_it.properties |   1 -
 .../calendar/_i18n/LocalStrings_lt.properties |   1 -
 .../_i18n/LocalStrings_nl_NL.properties       |   1 -
 .../calendar/_i18n/LocalStrings_pl.properties |   1 -
 .../_i18n/LocalStrings_pt_BR.properties       |   1 -
 .../_i18n/LocalStrings_pt_PT.properties       |   1 -
 .../calendar/_i18n/LocalStrings_sq.properties |   1 -
 .../_i18n/LocalStrings_zh_CN.properties       |   1 -
 .../_i18n/LocalStrings_zh_TW.properties       |   1 -
 .../commons/calendar/model/ICalToken.java     |  51 ++++
 .../ui/CalendarColorChooserController.java    |  13 +-
 ...a => CalendarConfigurationController.java} | 233 ++++++++++-----
 ...va => CalendarEntryDetailsController.java} |   8 +-
 ...rEntryForm.java => CalendarEntryForm.java} |   4 +-
 .../calendar/ui/CalendarPrintMapper.java      |  12 +-
 .../calendar/ui/ExternalLinksController.java  |   5 +-
 .../calendar/ui/ImportCalendarController.java |   5 +-
 ...portedCalendarConfigurationController.java |   2 +-
 .../calendar/ui/WeeklyCalendarController.java |  81 +----
 .../calendar/ui/_content/indexWeekly.html     |  30 +-
 .../ui/components/KalendarRenderWrapper.java  |  23 +-
 .../java/org/olat/course/CourseFactory.java   |  39 ++-
 .../course/CoursefolderWebDAVMergeSource.java |   2 +-
 .../CoursefolderWebDAVNamedContainer.java     |  13 +-
 .../org/olat/course/PersistingCourseImpl.java |  16 +-
 .../ui/AssessmentModeListModel.java           |   4 +-
 .../manager/CertificatesManagerImpl.java      |   2 +-
 .../config/ui/_chelp/course-calendar.html     |   3 +-
 .../ui/_i18n/LocalStrings_ar.properties       |   1 -
 .../PersistingCourseGroupManager.java         |  17 ++
 .../course/nodes/cal/CalEditController.java   |  27 +-
 .../course/nodes/cal/CalRunController.java    |  20 +-
 .../nodes/cal/CourseCalendarController.java   |  11 +-
 .../course/nodes/cal/CourseCalendars.java     |   2 +-
 .../olat/course/nodes/cal/_chelp/caledit.html |   9 +-
 .../cal/_i18n/LocalStrings_ar.properties      |   3 -
 .../cal/_i18n/LocalStrings_de.properties      |   3 -
 .../cal/_i18n/LocalStrings_el.properties      |   3 -
 .../cal/_i18n/LocalStrings_en.properties      |   3 -
 .../cal/_i18n/LocalStrings_fr.properties      |   3 -
 .../cal/_i18n/LocalStrings_it.properties      |   3 -
 .../cal/_i18n/LocalStrings_jp.properties      |   2 -
 .../cal/_i18n/LocalStrings_nl_NL.properties   |   3 -
 .../cal/_i18n/LocalStrings_pl.properties      |   2 -
 .../cal/_i18n/LocalStrings_pt_BR.properties   |   3 -
 .../cal/_i18n/LocalStrings_ru.properties      |   1 -
 .../cal/_i18n/LocalStrings_zh_CN.properties   |   3 -
 .../gta/rule/AbstractDueDateTaskRuleSPI.java  |   2 +-
 .../gta/ui/BeforeDateTaskRuleEditor.java      |   2 +-
 .../course/reminder/rule/AttemptsRuleSPI.java |   2 +-
 .../reminder/ui/AttemptsRuleEditor.java       |   2 +-
 .../course/run/CourseRuntimeController.java   |  15 +-
 .../calendar/CourseCalendarController.java    |   6 +-
 .../environment/CourseEnvironmentImpl.java    |  17 +-
 .../olat/group/manager/BusinessGroupDAO.java  |   3 +-
 .../org/olat/home/HomeCalendarController.java | 191 +-----------
 .../org/olat/home/HomeCalendarManager.java    | 280 ++++++++++++++++++
 .../org/olat/home/_spring/homeContext.xml     |  10 +-
 .../ui/ViteroUserToGroupController.java       |   2 +-
 .../CalendarPortletRunController.java         |  10 +-
 .../org/olat/properties/PropertyManager.java  |  23 ++
 .../repository/handlers/CourseHandler.java    |  12 +-
 .../author/wizard/CloseResourceCallback.java  |   2 +-
 .../light/modules/_various_modules.scss       |   2 +-
 .../olat/course/condition/ConditionTest.java  |   2 +-
 79 files changed, 783 insertions(+), 603 deletions(-)
 create mode 100644 src/main/java/org/olat/commons/calendar/model/ICalToken.java
 rename src/main/java/org/olat/commons/calendar/ui/{KalendarConfigurationController.java => CalendarConfigurationController.java} (52%)
 rename src/main/java/org/olat/commons/calendar/ui/{KalendarEntryDetailsController.java => CalendarEntryDetailsController.java} (98%)
 rename src/main/java/org/olat/commons/calendar/ui/{KalendarEntryForm.java => CalendarEntryForm.java} (99%)
 create mode 100644 src/main/java/org/olat/home/HomeCalendarManager.java

diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep01.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep01.java
index fa23a00ebfc..db3182c18d4 100644
--- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep01.java
+++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep01.java
@@ -157,7 +157,7 @@ class CcStep01 extends BasicStep {
 			formLayout.add(fic);
 
 			// load course
-			ICourse course = CourseFactory.loadCourse(getRepoEntry().getOlatResource());
+			ICourse course = CourseFactory.loadCourse(getRepoEntry());
 
 			// show catalog selection tree
 			if (course != null) {
diff --git a/src/main/java/org/olat/collaboration/CollaborationTools.java b/src/main/java/org/olat/collaboration/CollaborationTools.java
index 49cb1999d94..227d6c129ab 100644
--- a/src/main/java/org/olat/collaboration/CollaborationTools.java
+++ b/src/main/java/org/olat/collaboration/CollaborationTools.java
@@ -407,7 +407,7 @@ public class CollaborationTools implements Serializable {
 		List<ICourse> courses = new ArrayList<ICourse>(repoEntries.size());
 		for (RepositoryEntry repoEntry:repoEntries) {
 			if (repoEntry.getOlatResource().getResourceableTypeName().equals(CourseModule.getCourseTypeName())) {
-				ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource());
+				ICourse course = CourseFactory.loadCourse(repoEntry);
 				courses.add(course);
 			}
 		}
diff --git a/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java b/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
index 7055f7c787c..d9c5bc09aff 100644
--- a/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
+++ b/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
@@ -45,6 +45,31 @@ import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
+import org.olat.commons.calendar.model.Kalendar;
+import org.olat.commons.calendar.model.KalendarConfig;
+import org.olat.commons.calendar.model.KalendarEvent;
+import org.olat.commons.calendar.model.KalendarEventLink;
+import org.olat.commons.calendar.model.KalendarRecurEvent;
+import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
+import org.olat.commons.calendar.ui.events.KalendarModifiedEvent;
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.id.Identity;
+import org.olat.core.id.OLATResourceable;
+import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.CodeHelper;
+import org.olat.core.util.FileUtils;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.cache.CacheWrapper;
+import org.olat.core.util.coordinate.CoordinatorManager;
+import org.olat.core.util.coordinate.SyncerCallback;
+import org.olat.core.util.prefs.Preferences;
+import org.olat.core.util.resource.OresHelper;
+import org.olat.course.ICourse;
+import org.olat.group.BusinessGroup;
+
 import net.fortuna.ical4j.data.CalendarBuilder;
 import net.fortuna.ical4j.data.CalendarOutputter;
 import net.fortuna.ical4j.model.Calendar;
@@ -74,33 +99,7 @@ import net.fortuna.ical4j.model.property.Uid;
 import net.fortuna.ical4j.model.property.Version;
 import net.fortuna.ical4j.model.property.XProperty;
 
-import org.olat.commons.calendar.model.Kalendar;
-import org.olat.commons.calendar.model.KalendarConfig;
-import org.olat.commons.calendar.model.KalendarEvent;
-import org.olat.commons.calendar.model.KalendarEventLink;
-import org.olat.commons.calendar.model.KalendarRecurEvent;
-import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
-import org.olat.commons.calendar.ui.events.KalendarModifiedEvent;
-import org.olat.core.CoreSpringFactory;
-import org.olat.core.gui.UserRequest;
-import org.olat.core.id.Identity;
-import org.olat.core.id.OLATResourceable;
-import org.olat.core.logging.OLATRuntimeException;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
-import org.olat.core.manager.BasicManager;
-import org.olat.core.util.CodeHelper;
-import org.olat.core.util.FileUtils;
-import org.olat.core.util.StringHelper;
-import org.olat.core.util.cache.CacheWrapper;
-import org.olat.core.util.coordinate.CoordinatorManager;
-import org.olat.core.util.coordinate.SyncerCallback;
-import org.olat.core.util.prefs.Preferences;
-import org.olat.core.util.resource.OresHelper;
-import org.olat.course.ICourse;
-import org.olat.group.BusinessGroup;
-
-public class ICalFileCalendarManager extends BasicManager implements CalendarManager {
+public class ICalFileCalendarManager implements CalendarManager {
 
 	private static final OLog log = Tracing.createLoggerFor(ICalFileCalendarManager.class);
 
@@ -672,6 +671,7 @@ public class ICalFileCalendarManager extends BasicManager implements CalendarMan
 		fDirectory.mkdirs();
 	}
 
+	@Override
 	public KalendarRenderWrapper getPersonalCalendar(Identity identity) {
 		Kalendar cal = getCalendar(CalendarManager.TYPE_USER, identity.getName());
 		KalendarRenderWrapper calendarWrapper = new KalendarRenderWrapper(cal);
@@ -680,6 +680,7 @@ public class ICalFileCalendarManager extends BasicManager implements CalendarMan
 		return calendarWrapper;
 	}
 
+	@Override
 	public KalendarRenderWrapper getImportedCalendar(Identity identity, String calendarName) {
 		Kalendar cal = getCalendar(CalendarManager.TYPE_USER, ImportCalendarManager.getImportedCalendarID(identity, calendarName));
 		KalendarRenderWrapper calendarWrapper = new KalendarRenderWrapper(cal);
@@ -687,7 +688,8 @@ public class ICalFileCalendarManager extends BasicManager implements CalendarMan
 		calendarWrapper.setKalendarConfig(config);
 		return calendarWrapper;
 	}
-	
+
+	@Override
 	public KalendarRenderWrapper getGroupCalendar(BusinessGroup businessGroup) {
 		Kalendar cal = getCalendar(CalendarManager.TYPE_GROUP, businessGroup.getResourceableId().toString());
 		KalendarRenderWrapper calendarWrapper = new KalendarRenderWrapper(cal);
diff --git a/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java b/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java
index 90ae743914b..ec11d5748c8 100644
--- a/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java
+++ b/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java
@@ -26,8 +26,12 @@
 
 package org.olat.commons.calendar;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.commons.lang.RandomStringUtils;
 import org.olat.basesecurity.BaseSecurityManager;
+import org.olat.commons.calendar.model.ICalToken;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
@@ -113,6 +117,31 @@ public class ICalTokenGenerator {
   	return token;
   }
   
+  	public static List<ICalToken> getICalAuthTokens(Identity identity) {
+  		PropertyManager pm = PropertyManager.getInstance();
+  		List<Property> tokenProperties = pm.findAllUserProperties(identity, PROP_CAT_ICALTOKEN, PROP_NAME_ICALTOKEN);
+  		List<ICalToken> tokens = new ArrayList<>();
+  		for(Property tokenProperty:tokenProperties) {
+  			Long resourceId = tokenProperty.getResourceTypeId();
+  			String resourceName = tokenProperty.getResourceTypeName();
+  			String value = tokenProperty.getStringValue();
+  			
+  			String type;
+  			if(resourceId == null) {
+  				type = CalendarManager.TYPE_USER;
+  				resourceId = identity.getKey();
+  			} else if("CourseModule".equals(resourceName)) {
+  				type = CalendarManager.TYPE_COURSE;
+  			} else if("BusinessGroup".equals(resourceName)) {
+  				type = CalendarManager.TYPE_GROUP;
+  			} else {
+  				continue;
+  			}
+  			tokens.add(new ICalToken(type, value, resourceId));
+  		}
+  		return tokens;
+	}
+  
   private static String getIcalAuthToken(OLATResourceable resourceable, Identity identity, boolean create) {
   	// find the property for the resourceable
   	NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(resourceable);
diff --git a/src/main/java/org/olat/commons/calendar/_chelp/course-calendar.html b/src/main/java/org/olat/commons/calendar/_chelp/course-calendar.html
index 7475e5fd10d..9b6b7d11200 100644
--- a/src/main/java/org/olat/commons/calendar/_chelp/course-calendar.html
+++ b/src/main/java/org/olat/commons/calendar/_chelp/course-calendar.html
@@ -1,18 +1,4 @@
- <br/>
- $r.translate("chelp.cal14")
-<br />
-<br />
-$r.translate("chelp.calT")
-<br />
-<br />
-$r.translate("chelp.cal2") 
-<br />
-<br />
-$r.translate("chelp.cal2b") $r.contextHelpRelativeLink("org.olat.core.commons.services.notifications.ui", "home-notifications.html").
-<br />
-<br />
-$r.translate("chelp.cal5") $r.translate("chelp.cal6")
-<br />
-<br />
-
-
+<p>$r.translate("chelp.cal14")</p>
+<p>$r.translate("chelp.calT")</p>
+<p>$r.translate("chelp.cal2b") $r.contextHelpRelativeLink("org.olat.core.commons.services.notifications.ui", "home-notifications.html").</p>
+<p>$r.translate("chelp.cal5") $r.translate("chelp.cal6")</p>
\ No newline at end of file
diff --git a/src/main/java/org/olat/commons/calendar/_content/calConfig.html b/src/main/java/org/olat/commons/calendar/_content/calConfig.html
index 9b62dd06704..806042c3359 100644
--- a/src/main/java/org/olat/commons/calendar/_content/calConfig.html
+++ b/src/main/java/org/olat/commons/calendar/_content/calConfig.html
@@ -43,7 +43,7 @@
 	   href="$r.commandURIbg("if", "id", "$calendarWrapper.getKalendar().getCalendarID()")" $r.bgTarget() 
 	   title="$r.translateInAttribute("cal.icalfeed.subscribe")"><i class="o_icon o_icon-lg o_icon_rss"> </i></a>
 
-	#if ($calendarWrapper.hasIcalFeed($identity))
+	#if ($icalTokens.hasIcalFeed($calendarWrapper))
 		<a class="o_cal_config_remove_subscribeical" 
     		href="$r.commandURIbg("rmif", "id", "$calendarWrapper.getKalendar().getCalendarID()")" $r.bgTarget() 
 	  		title="$r.translateInAttribute("cal.icalfeed.subscribe.remove")"><i class="o_icon o_icon-lg o_icon_remove"> </i></a>
@@ -51,12 +51,6 @@
 			href="$r.commandURIbg("rf", "id", "$calendarWrapper.getKalendar().getCalendarID()")" $r.bgTarget()
 			title="$r.translateInAttribute("cal.icalfeed.regenerate.title")"><i class="o_icon o_icon-lg o_icon_refresh"> </i></a>
     #end
-
-	#if ($removeFromPersonalCalendar && $calendarWrapper.isSubscribed())
-		<a class="o_cal_config_unsubscribe" 
-			href="$r.commandURIbg("unsub", "id", "$calendarWrapper.getKalendar().getCalendarID()")" $r.bgTarget() 
-			title="$r.translate("cal.unsubscribe")"><i class="o_icon o_icon-lg o_icon_rss_unsubscribe"> </i></a>
-	#end
 	</div>
 #end
 </fieldset>
\ No newline at end of file
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_ar.properties
index 48e72a1d743..f620bf25ca1 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_ar.properties
@@ -146,7 +146,6 @@ chelp.cal15=\u064A\u0645\u0643\u0646\u0643 \u0631\u0628\u0637 \u062D\u062F\u062B
 chelp.cal16=\u0647\u0630\u0647 \u0627\u0644\u062D\u062F\u062B \u0645\u0631\u062A\u0628\u0637 \u0627\u0644\u0622\u0646 \u0628\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631.
 chelp.cal17=\u0647\u0630\u0647 \u0627\u0644\u0648\u0638\u064A\u0641\u0629 \u0645\u062A\u0627\u062D\u0629 \u0641\u0642\u0637 \u0641\u0649 \u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631.
 chelp.cal18=\:\u0633\u062A\u0639\u0631\u0636 \u0643\u0644 \u0627\u0644\u062A\u0642\u0648\u064A\u0645\u0627\u062A \u0627\u0644\u0622\u062E\u0631\u0649 \u0627\u0644\u0631\u0633\u0627\u0644\u0629
-chelp.cal2=<i>${\:cal.subscribe}</i> \u0625\u0630\u0627 \u0623\u0631\u062F\u062A \u0639\u0631\u0636 \u0623\u062D\u062F\u0627\u062B \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u062E\u0627\u0635 \u0628\u0643 \u0641\u0649 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0634\u062E\u0635\u0649 \u0627\u0644\u062E\u0627\u0635 \u0628\u0643 \u064A\u0631\u062C\u0649 \u0627\u0633\u062A\u062E\u062F\u0627\u0645\r\n\u0648\u064A\u0648\u062C\u062F \u062E\u064A\u0627\u0631 \u0622\u062E\u0631 \u0648\u0647\u0648 \u0627\u0644\u0627\u0634\u062A\u0631\u0627\u0643 \u0641\u0649 \u0627\u0644\u062A\u0639\u062F\u064A\u0644\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644\u064A\u0629 \u0644\u062A\u0642\u0648\u064A\u0645 \u0644\u0645\u0642\u0631\u0631\u060C \u0648\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0641\u0625\u0646\u0647 \u064A\u0631\u062C\u0649 \u0627\u0644\u0630\u0647\u0627\u0628 \u0625\u0644\u0649
 chelp.cal3=\u0645\u0646 \u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0645\u062F\u062E\u0644\u0627\u062A \u0627\u0644\u062A\u0649 \u064A\u0646\u0628\u063A\u0649 \u0639\u0631\u0636\u0647\u0627 \u0641\u0649 \u0635\u0641\u062D\u0629 \u0627\u0644\u062A\u0642\u0648\u064A\u0645. $\:cal.list \u062A\u0645\u0643\u0646\u0643
 chelp.cal4=\u064A\u0645\u0643\u0646\u0643 \u062A\u062D\u062F\u064A\u062F \u0644\u0648\u0646 \u0627\u0644\u0645\u062F\u062E\u0644\u0627\u062A \u0627\u0644\u062A\u0649 \u0633\u064A\u062A\u0645 \u0639\u0631\u0636\u0647\u0627 \u0641\u0649 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0645\u0646 \u062E\u0644\u0627\u0644 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \u0623\u064A\u0642\u0648\u0646\u0629 \u0644\u0648\u062D\u0629 \u0627\u0644\u0623\u0644\u0648\u0627\u0646 \u0648\u0627\u0644\u062A\u0649 \u062A\u0648\u062C\u062F \u0628\u062C\u0627\u0646\u0628 \u0627\u0633\u0645 \u0627\u0644\u062A\u0642\u0648\u064A\u0645.
 chelp.cal5=\u0644\u0643\u0649 \u064A\u062A\u0645 \u0625\u0646\u0634\u0627\u0621 \u0645\u062F\u062E\u0644 \u0641\u0649 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0642\u0645 \u0641\u0642\u0637 \u0628\u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u0630\u0649 \u062A\u0631\u064A\u062F\u0647 \u0623\u0648 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0623\u064A\u0642\u0648\u0646\u0629 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u062F\u0627\u062E\u0644 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062A\u0642\u0648\u064A\u0645.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_bg.properties
index f64faecde07..3289d00b013 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_bg.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_bg.properties
@@ -139,7 +139,6 @@ chelp.cal15=\u041C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0432\u044A
 chelp.cal16=\u0421\u0435\u0433\u0430 \u0442\u043E\u0437\u0438 \u0430\u043D\u0433\u0430\u0436\u0438\u043C\u0435\u043D\u0442 \u0435 \u0441\u0432\u044A\u0440\u0437\u0430\u043D \u0441\u044A\u0441 \u0441\u044A\u043E\u0442\u0432\u0435\u0442\u043D\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0432 \u0435\u043B\u0435\u043C\u0435\u043D\u0442.
 chelp.cal17=\u0422\u0430\u0437\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u044F \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043F\u043E\u043B\u0437\u0432\u0430 \u0441\u0430\u043C\u043E \u0432 \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u044F \u0441 \u043A\u0443\u0440\u0441\u043E\u0432\u0438\u044F \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440.
 chelp.cal18=\u0412\u0441\u0438\u0447\u043A\u0438 \u0434\u0440\u0443\u0433\u0438 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0438 \u0449\u0435 \u043F\u043E\u043A\u0430\u0437\u0432\u0430\u0442 \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u0435\u0442\u043E\:
-chelp.cal2=\u0414\u043E\u043F\u044A\u043B\u043D\u0438\u0442\u0435\u043B\u043D\u043E, \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0430\u0431\u043E\u043D\u0438\u0440\u0430\u0442\u0435 \u0437\u0430 \u0432\u0441\u0435\u043A\u0438 \u043A\u0443\u0440\u0441\u043E\u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440, \u0437\u0430 \u0434\u0430 \u043C\u043E\u0436\u0435 \u043D\u0435\u0433\u043E\u0432\u0438\u0442\u0435 \u0432\u043F\u0438\u0441\u0432\u0430\u043D\u0438\u044F \u0434\u0430 \u0441\u0435 \u043F\u043E\u044F\u0432\u044F\u0432\u0430\u0442 \u0432\u044A\u0432 \u0432\u0430\u0448\u0438\u044F \u043B\u0438\u0447\u0435\u043D \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440.
 chelp.cal3=<i>\u0421\u043F\u0438\u0441\u044A\u043A\u044A\u0442 \u0441 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0438</i> \u0432\u0438 \u0434\u0430\u0432\u0430 \u0432\u044A\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442 \u0434\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u0435 \u0432\u043F\u0438\u0441\u0432\u0430\u043D\u0438\u044F\u0442\u0430, \u043A\u043E\u0438\u0442\u043E \u0449\u0435 \u0441\u0435 \u043F\u043E\u044F\u0432\u044F\u0432\u0430\u0442 \u0432\u044A\u0432 \u0432\u0430\u0448\u0438\u044F \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440.
 chelp.cal4=\u0410\u043A\u043E \u043A\u043B\u0438\u043A\u043D\u0435\u0442\u0435 \u043D\u0430 \u0438\u043A\u043E\u043D\u0430\u0442\u0430 \u043F\u0430\u043B\u0438\u0442\u0440\u0430, \u043A\u043E\u044F\u0442\u043E \u0441\u0435 \u043D\u0430\u043C\u0438\u0440\u0430 \u0434\u043E \u0438\u043C\u0435\u0442\u043E \u043D\u0430 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0430, \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u0435 \u043A\u0430\u043A\u044A\u0432 \u0446\u0432\u044F\u0442 \u0434\u0430 \u0431\u044A\u0434\u0430\u0442 \u0432\u043F\u0438\u0441\u0432\u0430\u043D\u0438\u044F\u0442\u0430 \u0432\u044A\u0432 \u0432\u0430\u0448\u0438\u044F \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440.
 chelp.cal5=\u0417\u0430 \u0434\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435 \u0432\u043F\u0438\u0441\u0432\u0430\u043D\u0435 \u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440, \u043A\u043B\u0438\u043A\u043D\u0435\u0442\u0435 \u043D\u0430 \u0441\u044A\u043E\u0442\u0432\u0435\u0442\u043D\u043E\u0442\u043E \u043F\u043E\u043B\u0435 \u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0430 \u0438\u043B\u0438 \u0438\u0437\u043F\u043E\u043B\u0437\u0432\u0430\u0439\u0442\u0435 \u0438\u043A\u043E\u043D\u0430\u0442\u0430 \u043D\u0430 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0430, \u043A\u043E\u044F\u0442\u043E \u0441\u0435 \u043D\u0430\u043C\u0438\u0440\u0430 \u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u043D\u0438\u044F \u0441\u043F\u0438\u0441\u044A\u043A.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_cs.properties
index d2d701f46c4..1e86e4ffc34 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_cs.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_cs.properties
@@ -83,7 +83,6 @@ chelp.cal15=Sv\u016Fj vstup m\u016F\u017Eete propojit s jedn\u00EDm nebo v\u00ED
 chelp.cal16=Tato ud\u00E1lost se nyn\u00ED odkazuje na p\u0159\u00EDslu\u0161n\u00FD element kurzu.
 chelp.cal17=Tato funk\u010Dnost je dostupn\u00E1 pouze ve spojen\u00ED s kalend\u00E1\u0159em kurzu. 
 chelp.cal18=V\u0161echny ostatn\u00ED kalend\u00E1\u0159e zobrz\u00ED zpr\u00E1vu\: 
-chelp.cal2=Jinak m\u016F\u017Eete odeb\u00EDrat informace z kalend\u00E1\u0159e kurz\u016F, tak\u017Ee jeho ud\u00E1losti se budou zobrazovat i ve Va\u0161em kalend\u00E1\u0159i.
 chelp.cal3=$\:cal.list V\u00E1m umo\u017E\u0148uje vybrat, jak\u00E9 z\u00E1znamy chcete m\u00EDt v kalend\u00E1\u0159i zobrazeny.
 chelp.cal4=Kliknut\u00EDm na ikonu palety u jm\u00E9na kalend\u00E1\u0159e m\u016F\u017Eete barevn\u011B odli\u0161it zobrazov\u00E1n\u00ED ud\u00E1lost\u00ED kalend\u00E1\u0159e.
 chelp.cal5=Pro vytvo\u0159en\u00ED ud\u00E1losti kalend\u00E1\u0159e jen klikn\u011Bte na ikonu listu kalend\u00E1\u0159e uvnit\u0159 kalend\u00E1\u0159e.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_de.properties
index 1dedd960081..047bccfc8f8 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_de.properties
@@ -114,7 +114,6 @@ chelp.cal18=Bei den anderen Kalendern erscheint der Kommentar\:
 chelp.cal19=Eine weitere Funktion ist das Abonnieren von Änderungen im Kurskalender. N\u00E4here Informationen dazu finden Sie unter Hilfe zu den Benachrichtigungen.
 chelp.cal20=In der Kalenderliste unterhalb der Tagesansicht können Sie die einzelnen Kalender ein- und ausblenden und angeben, welcher Kalender in welcher Farbe angezeigt werden soll.
 chelp.cal21=Über iCal (einem Standard zur Verwaltung von Terminen), k\u00F6nnen Sie die verschiedenen OpenOLAT-Kalender in einen anderen Kalender wie z.B. den Google-Kalender integrieren. Andere Kalender lassen sich auf diese Art auch in den OpenOLAT-Kalender integrieren.
-chelp.cal2=M\u00F6chten Sie alle Termine aus dem Kurskalender in Ihrem pers\u00F6nlichen Kalender angezeigt bekommen, verwenden Sie dazu den Button "${\:cal.subscribe}".
 chelp.cal2b=Eine weitere Funktion ist das Abonnieren von \u00C4nderungen im Kurskalender. N\u00E4here Informationen dazu finden Sie unter
 chelp.cal3=In der Kalenderliste k\u00F6nnen Sie bestimmen, welche Kalendereintr\u00E4ge im Kalenderblatt angezeigt werden sollen.
 chelp.cal4=Indem Sie auf das Farbpaletten-Icon neben dem Kalendernamen klicken, k\u00F6nnen Sie festlegen, in welcher Farbe die Eintr\u00E4ge eines Kalenders angezeigt werden. Zudem k\u00F6nnen Sie \u00FCber das Icon "iCal" den Kurskalender in andere Kalender einbinden.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_el.properties
index a2f5efdde0a..8fa618872ef 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_el.properties
@@ -146,7 +146,6 @@ chelp.cal15=\u039C\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03C3
 chelp.cal16=\u03A4\u03BF \u03B3\u03B5\u03B3\u03BF\u03BD\u03CC\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BB\u03AD\u03BF\u03BD \u03C3\u03C5\u03BD\u03B4\u03B5\u03B4\u03B5\u03BC\u03AD\u03BD\u03BF \u03BC\u03B5 \u03C4\u03BF \u03B1\u03BD\u03C4\u03AF\u03C3\u03C4\u03BF\u03B9\u03C7\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2.
 chelp.cal17=\u0397 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03B5\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B7 \u03BC\u03CC\u03BD\u03BF \u03C3\u03B5 \u03C3\u03C5\u03BD\u03B4\u03B9\u03B1\u03C3\u03BC\u03CC \u03BC\u03B5 \u03C4\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2. 
 chelp.cal18=\u038C\u03BB\u03B1 \u03C4\u03B1 \u03AC\u03BB\u03BB\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03B1 \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03C3\u03BF\u03C5\u03BD \u03C4\u03BF \u03BC\u03AE\u03BD\u03C5\u03BC\u03B1\: 
-chelp.cal2=\u0395\u03C0\u03B9\u03C0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03B1, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF\u03C4\u03B5 \u03C3\u03B5 \u03BF\u03C0\u03BF\u03B9\u03BF\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B5\u03C0\u03B9\u03B8\u03C5\u03BC\u03B5\u03AF\u03C4\u03B5, \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B2\u03BB\u03AD\u03C0\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AD\u03C2 \u03C4\u03BF\u03C5 \u03BA\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C0\u03C1\u03BF\u03C3\u03C9\u03C0\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF.
 chelp.cal3=\u0397 $\:cal.list \u03C3\u03B1\u03C2 \u03B5\u03C0\u03B9\u03C4\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C6\u03CD\u03BB\u03BB\u03BF \u03C4\u03BF\u03C5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03C3\u03B1\u03C2.
 chelp.cal4=\u03A0\u03B1\u03C4\u03CE\u03BD\u03C4\u03B1\u03C2 \u03C3\u03C4\u03BF \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C0\u03B1\u03BB\u03AD\u03C4\u03B1\u03C2 \u03B4\u03AF\u03C0\u03BB\u03B1 \u03C3\u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03C3\u03B1\u03C2 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C4\u03C9\u03BD \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03CE\u03BD \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03CC \u03C3\u03B1\u03C2.
 chelp.cal5=\u0393\u03B9\u03B1 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03C3\u03C4\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF, \u03BA\u03AC\u03BD\u03C4\u03B5 \u03BA\u03BB\u03AF\u03BA \u03C3\u03C4\u03BF \u03C6\u03CD\u03BB\u03BB\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03AE \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 \u03C3\u03C4\u03BF \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03BC\u03AD\u03C3\u03B1 \u03B1\u03C0\u03BF \u03C3\u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_en.properties
index a0f7d567324..feb34ed082d 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_en.properties
@@ -166,7 +166,6 @@ chelp.cal16=This event is now linked to that respective course element.
 chelp.cal17=Links can only be created within the course calendar since these are links to course elements.
 chelp.cal18=All other calendars will display the message\: 
 chelp.cal19=Another feature is subscribing to modifications of course calendars. For further information please go to the section 'Help regarding notifications.'
-chelp.cal2=If you want your course calendar's events to show in your personal calendar please use the button "${\:cal.subscribe}".
 chelp.cal20=By means of the calendar list underneath the day view you can (de)activate each single calendar and decide which calendar should be presented in what color.
 chelp.cal21=Via iCal (a standard to manage dates) you can integrate various OpenOLAT calendars into another one, e.g. the Google calendar. Other calendars can be integrated into OpenOLAT calendars similarly.
 chelp.cal2b=Another feature is subscribing to modifications of course calendars. For further information please go to
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_es.properties
index 5d9ef664f5a..0df3a76df99 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_es.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_es.properties
@@ -84,7 +84,6 @@ chelp.cal15=Puedes ligar una cita de tu calendario del curso a uno o m\u00E1s el
 chelp.cal16=La cita est\u00E1 ligada con el elemento del curso.
 chelp.cal17=Esta funci\u00F3n est\u00E1 solamente disponible con respecto al calendario del curso. 
 chelp.cal18=Los otros calendarios mostrar\u00E1n el mensaje\: 
-chelp.cal2=Tambi\u00E9n puedes susribirte a un calendario de un curso si quieres que las citas del mismo aparecezcan en tu calendario personal.
 chelp.cal3=Con la $\:cal.list puedes definir qu\u00E9 citas deben mostrarse en tu calendario.
 chelp.cal4=Con la gama de colores (\u00EDcono a la derecha del nombre de calendario) puedes elegir el color de las citas de este calendario.
 chelp.cal5=Para crear una nueva cita puedes cliquear en el calendario o usar el \u00EDcono de calendario a la derecha del nombre de calendario.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_fr.properties
index e7e44f5c4a9..2d4ccd030e1 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_fr.properties
@@ -166,7 +166,6 @@ chelp.cal16=Un lien appara\u00EEt maintenant dans le rendez-vous qui conduit dir
 chelp.cal17=Les liens peuvent \u00EAtre cr\u00E9\u00E9s seulement dans le calendrier de cours lorsqu'il s'agit de liens vers des \u00E9l\u00E9ments de cours.
 chelp.cal18=Pour les autres calendrier, le commentaire suivant s'affiche\:
 chelp.cal19=Une autre fonction concerne l'abonnement aux modifications dans le calendrier de cours. Vous trouvez plus d'informations dans l'aide pour les notifications.
-chelp.cal2=En plus, vous pouvez vous abonner \u00E0 n'importe quels calendriers de cours, pour que ces entr\u00E9es soient \u00E9galement affich\u00E9es dans votre calendrier personnel.
 chelp.cal20=Vous pouvez visualiser ou cacher les diff\u00E9rents calendriers dans la liste des calendriers sous la page qui affiche la journ\u00E9e. Vous pouvez \u00E9galement choisir une couleur pour les diff\u00E9rents calendriers.
 chelp.cal21=Gr\u00E2ce \u00E0 iCal (un standard pour la gestion des rendez-vous et t\u00E2ches), vous pouvez int\u00E9grer les divers calendriers OpenOLAT dans un autre calendrier, par exemple dans un calendrier Google. De la m\u00EAme mani\u00E8re, d'autres calendriers peuvent \u00EAtre int\u00E9gr\u00E9s dans le calendrier OpenOLAT.
 chelp.cal2b=Une autre fonction concerne l'abonnement aux modifications dans le calendrier de cours. Vous trouvez plus d'informations sous
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_it.properties
index bfb0f314223..9477043e698 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_it.properties
@@ -147,7 +147,6 @@ chelp.cal16=Nell'impegno appare ora un link che conduce all'elemento di corso ad
 chelp.cal17=I collegamenti possono essere creati solo nel calendario di corso perch\u00E9 si tratta di link verso degli elementi di corso.
 chelp.cal18=Negli altri calendari compare il commento\:
 chelp.cal19=Un'altra funzione concerne l'abbonamento alle modifiche nel calendario di corso. Trova ulteriori informazioni nell'aiuto per gli avvisi.
-chelp.cal2=Se vuole vedere tutti gli impegni del Suo calendario di corso nel Suo calendario personale utilizzi  <i>${\:cal.subscribe}</i>. Inoltre pu\u00F2 abbonare le modifiche nel calendario di corso\: trova ulteriori informazioni sotto
 chelp.cal20=Pu\u00F2 visualizzare o nascondere i singoli calendari nella lista dei calendari sotto la pagina che mostra la giornata. Pu\u00F2 inoltre scegliere un colore per i singoli calendari.
 chelp.cal21=Mediante iCal (uno standard per la gestione di appuntamenti e impegni) pu\u00F2 integrare i vari calendari OpenOLAT in un altro calendario, ad esempio in un calendario Google. In modo analogo altri calendari possono venire integrati nel calendario OpenOLAT.
 chelp.cal2b=Un'altra funzione concerne l'abbonamento alle modifiche nel calendario di corso. Trova ulteriori informazioni sotto
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_lt.properties
index c22e0e29c77..080db99211e 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_lt.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_lt.properties
@@ -77,7 +77,6 @@ chelp.cal15=Galite susieti \u012Fra\u0161\u0105 kurso kalendoriuje su vienu ar d
 chelp.cal16=\u0160is \u012Fra\u0161as dabar susietas su atitinkamu kurso elementu.
 chelp.cal17=\u0160i funkcija galima tik kurso kalendoriuje.
 chelp.cal18=Visuose kituose kalendoriuose bus rodomas prane\u0161imas\: 
-chelp.cal2=Beto galite prenumeruoti bet kurio kurso kalendori\u0173 jei norite, kad to kalendoriaus \u012Fra\u0161ai automati\u0161kai atsirast\u0173 J\u016Bs\u0173 kalendoriuje.
 chelp.cal3=$\:cal.list leid\u017Eia nustatyti kokie \u012Fra\u0161ai bus parodomi J\u016Bs\u0173 kalendoriuje.
 chelp.cal4=Paspaudus ant palet\u0117s piktogramos \u0161alia kalendoriaus galite nustatyti \u012Fra\u0161\u0173 spalvas savo kalendoriuje.
 chelp.cal5=Jei norite \u012Fra\u0161yti \u012F kalendori\u0173 paspauskite ant kalendoriaus lapo arba kalendoriaus piktodramos sara\u0161e.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_nl_NL.properties
index 217a02a6cbe..3a6e19c0814 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_nl_NL.properties
@@ -147,7 +147,6 @@ chelp.cal16=Deze gebeurtenis is nu gelinkt aan dat respectievelijke cursuselemen
 chelp.cal17=Links kunnen alleen aangemaakt worden binnen de cursuskalender omdat er links zijn naar cursuselementen.
 chelp.cal18=Alle andere kalenders zullen de volgende boodschap weergeven\:
 chelp.cal19=Een ander functie is de inschrijving voor aanpassingen van cursuskalenders. Voor verdere informatie gelieve naar de sectie 'Hulp betreffende meldingen' te gaan.
-chelp.cal2=Als u de gebeurenissen van uw cursuskalender wilt weergeven in uw persoonlijke kalender gelieve dan op de knop "${\:cal.subscribe}" te klikken.
 chelp.cal20=Doormiddel van de kalenderlijst onder het dagoverzicht kunt u elke kalender (de)activeren en beslissen welke kalender gepresenteerd moet worden in welke kleur.
 chelp.cal21=Via iCal (standaard om data te beheren) kunt u verschillende OpenOLAT kalenders integreren in een andere, b.v. de Google kalender. Andere kalenders kunnen simultaan in OpenOLAT kalenders ge\u00EFntegreerd worden.
 chelp.cal2b=Een ander functie is de inschrijving voor aanpassingen van cursuskalenders. Voor verdere informatie gelievete gaan naar
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pl.properties
index 4d90924c4d2..c29d38c3418 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pl.properties
@@ -154,7 +154,6 @@ chelp.cal15=Mo\u017Cesz utworzy\u0107 link mi\u0119dzy wpisem kalendarza kursu a
 chelp.cal16=Ten wpis jest teraz po\u0142\u0105czony z tym elementu kursu.
 chelp.cal17=Ta funkcja jest dost\u0119pna tylko w po\u0142\u0105czeniu z kalendarzem kursu. 
 chelp.cal18=Wszystkie inne kalendarze wy\u015Bwietl\u0105 komunikat\: 
-chelp.cal2=Dodatkowo mo\u017Cesz subskrybowa\u0107 kalendarz ka\u017Cdego innego kursu, by umo\u017Cliwi\u0107 wy\u015Bwietlanie ich wpis\u00F3w w Twoim osobistym kalendarzu.
 chelp.cal3=$\:cal.list umo\u017Cliwia Ci wyb\u00F3r wpis\u00F3w, kt\u00F3re powinny by\u0107 wy\u015Bwietlone w Twoim kalendarzu.
 chelp.cal4=Klikaj\u0105c na ikon\u0119 palety, obok nazwy kalendarza, mo\u017Cesz ustali\u0107 kolor w jakim wy\u015Bwietla\u0107 si\u0119 b\u0119d\u0105 wpisy tego kalendarza.
 chelp.cal5=By wprowadzi\u0107 pozycj\u0119 w kalendarzu kliknij wewn\u0105trz arkusza kalendarza lub lub u\u017Cyj ikony z listy kalendarza.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_BR.properties
index 3e306a41257..d8037eb5982 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_BR.properties
@@ -165,7 +165,6 @@ chelp.cal16=Este evento est\u00E1 agora ligado \u00E0quele respectivo elemento d
 chelp.cal17=Esta fun\u00E7\u00E3o est\u00E1 apenas dispon\u00EDvel em conex\u00E3o com o calend\u00E1rio de curso. 
 chelp.cal18=Todos os outros calend\u00E1rios ir\u00E3o mostrar a mensagem\: 
 chelp.cal19=Outra fun\u00E7\u00E3o \u00E9 inscrever \u00E0s modifica\u00E7\u00F5es nos calend\u00E1rios de cursos. Para mais informa\u00E7\u00F5es, v\u00E1 para a se\u00E7\u00E3o 'Ajuda a respeito das notifica\u00E7\u00F5es.'
-chelp.cal2=Adicionalmente voc\u00EA pode se inscrever em qualquer calend\u00E1rio de curso que voc\u00EA queira, a fim de permitir que seus eventos apare\u00E7am em seu calend\u00E1rio pessoal, tamb\u00E9m.
 chelp.cal20=Atrav\u00E9s da lista de calend\u00E1rios abaixo do dia voc\u00EA pode (des)ativar cada calend\u00E1rio e decidir qual cor deve apresentar cada calend\u00E1rio.
 chelp.cal21=Via iCal (um padr\u00E3o para gerenciar agendas) voc\u00EA pode integrar v\u00E1rios calend\u00E1rios OpenOLAT em outro, por exemplo, no Google Calendar. Outros calend\u00E1rios podem ser integradas ao OpenOLAT exatamente da mesma maneira.
 chelp.cal2b=Outro recurso \u00E9 se inscrever nas altera\u00E7\u00F5es de calend\u00E1rios do curso. Para mais informa\u00E7\u00F5es acesse
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_PT.properties
index e6387a65dc5..df05dd27a24 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_PT.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_pt_PT.properties
@@ -81,7 +81,6 @@ chelp.cal15=Voc\u00EA pode estabelecer um  link com um evento de seu calend\u00E
 chelp.cal16=Este evento est\u00E1 agora ligado \u00E0quele respectivo elemento de curso.
 chelp.cal17=Esta fun\u00E7\u00E3o est\u00E1 apenas dispon\u00EDvel em conex\u00E3o com o calend\u00E1rio de curso. 
 chelp.cal18=Todos os outros calend\u00E1rios ir\u00E3o mostrar a mensagem\: 
-chelp.cal2=Adicionalmente voc\u00EA pode se inscrever em qualquer calend\u00E1rio de curso que voc\u00EA queira, a fim de permitir que seus eventos apare\u00E7am em seu calend\u00E1rio pessoal, tamb\u00E9m.
 chelp.cal3=A $\:cal.list permite determinar os eventos que devem ser mostrados em sua folha de calend\u00E1rio.
 chelp.cal4=Clicando no \u00EDcone palheta de cores pr\u00F3xima ao nome do calend\u00E1rio, voc\u00EA poder\u00E1 determinar a cor dos eventos a serem mostrados em seu calend\u00E1rio.
 chelp.cal5=Para criar um evento no calend\u00E1rio, clique na folha do calend\u00E1rio na data e hora desejada ou clique no \u00EDcone calend\u00E1rio na lista de calend\u00E1rios abaixo \u00E0 esquerda.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_sq.properties
index 1c181d37f23..23f1cb43740 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_sq.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_sq.properties
@@ -83,7 +83,6 @@ chelp.cal15=Ju mund t\u00EB vjeg\u00EBzoni nj\u00EB ngjarje t\u00EB kalendarit t
 chelp.cal16=Kjo ngjarje tani \u00EBsht\u00EB e vjeg\u00EBzuar te elementi respektiv t\u00EB kursit.
 chelp.cal17=Ky funksion \u00EBsht\u00EB i gatsh\u00EBm vet\u00EBm n\u00EB lidhjet me kalendarin e kursit. 
 chelp.cal18=T\u00EB gjith\u00EB kalendaret do t\u00EB paraqesin mesazhin\: 
-chelp.cal2=Gjithashtu ju mund t\u00EB abonoheni te \u00E7far\u00EBdo kalendar kursi q\u00EB ju doni n\u00EB m\u00EBnyr\u00EB q\u00EB t\u00EB leni q\u00EB ato t\u00EB paraqiten n\u00EB kalendarin tuaj personal.
 chelp.cal3=$\:cal.list Ju mund\u00EBson t\u00EB p\u00EBrcaktoni t\u00EB hyrat q\u00EB do t\u00EB paraqiten n\u00EB flet\u00EBn e kalendarit tuaj.
 chelp.cal4=Duke shtypur n\u00EB ikon\u00EBn e palet\u00EBs pran\u00EB emrit t\u00EB kalendarit ju mund t\u00EB p\u00EBrcaktoni ngjyr\u00EBn e t\u00EB hyrave q\u00EB do t\u00EB paraqiten n\u00EB kalendarin tuaj.
 chelp.cal5=N\u00EB m\u00EBnyr\u00EB q\u00EB krijoni nj\u00EB t\u00EB hyr\u00EB n\u00EB kalendar vet\u00EBm shtypni n\u00EB flet\u00EBn e kalendarit ose p\u00EBrdorni ikon\u00EBn e kalendarit n\u00EB list\u00EBn e kalendarit.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_CN.properties
index a77cbb142bb..bdb5e54aaef 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_CN.properties
@@ -143,7 +143,6 @@ chelp.cal15=\u4F60\u53EF\u4EE5\u628A\u4F60\u7684\u4E00\u4E2A\u8BFE\u7A0B\u65E5\u
 chelp.cal16=\u8FD9\u4E2A\u7ED3\u679C\u9A6C\u4E0A\u94FE\u63A5\u5230\u5404\u81EA\u7684\u8BFE\u7A0B\u5143\u7D20.
 chelp.cal17=\u8FD9\u4E2A\u529F\u80FD\u4EC5\u4EC5\u5728\u94FE\u63A5\u4E00\u4E2A\u7279\u5B9A\u7684\u8BFE\u7A0B\u65E5\u5386\u65F6\u6709\u6548. 
 chelp.cal18=\u6240\u6709\u5176\u5B83\u65E5\u5386\u5C06\u4F1A\u663E\u793A\u6D88\u606F\: 
-chelp.cal2=\u6B64\u5916,\u4F60\u4E5F\u53EF\u4EE5\u8BA2\u9605\u4EFB\u4F55\u4F60\u60F3\u8981\u7684\u8BFE\u7A0B\u65E5\u5386\u7684\u6761\u76EE\u5728\u4F60\u7684\u4E2A\u4EBA\u65E5\u5386\u91CC\u663E\u793A.
 chelp.cal3=$\:cal.list \u4F7F\u4F60\u80FD\u591F\u9009\u62E9\u7684\u6761\u76EE\u5728\u4F60\u7684\u65E5\u5386\u8868\u4E2D\u663E\u793A.
 chelp.cal4=\u901A\u8FC7\u70B9\u51FB\u65E5\u5386\u540D\u5B57\u65C1\u8FB9\u7684\u8C03\u8272\u677F.\u4F60\u53EF\u4EE5\u9009\u62E9\u5728\u4F60\u7684\u65E5\u5386\u4E2D\u663E\u793A\u6761\u76EE\u7684\u989C\u8272.
 chelp.cal5=\u8981\u521B\u5EFA\u4E00\u4E2A\u65E5\u5386\u7684\u6761\u76EE,\u53EA\u8981\u70B9\u51FB\u65E5\u5386\u8868\u6216\u4F7F\u7528\u65E5\u5386\u5217\u8868\u4E2D\u7684\u65E5\u5386\u6807\u56FE.
diff --git a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_TW.properties
index dc470e84468..893b4c96025 100644
--- a/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_TW.properties
+++ b/src/main/java/org/olat/commons/calendar/_i18n/LocalStrings_zh_TW.properties
@@ -143,7 +143,6 @@ chelp.cal15=\u60A8\u53EF\u4EE5\u9023\u7D50\u60A8\u7684\u8AB2\u7A0B\u884C\u4E8B\u
 chelp.cal16=\u9019\u500B\u4E8B\u4EF6\u73FE\u5728\u5DF2\u9023\u7D50\u5230\u5404\u81EA\u7684\u8AB2\u7A0B\u5143\u7D20\u3002
 chelp.cal17=\u9019\u500B\u529F\u80FD\u53EA\u6709\u5728\u548C\u8AB2\u7A0B\u884C\u4E8B\u66C6\u9023\u7D50\u6642\u6709\u6548\u3002
 chelp.cal18=\u6240\u6709\u5176\u4ED6\u7684\u884C\u4E8B\u66C6\u5C07\u986F\u793A\u8A0A\u606F\uFF1A
-chelp.cal2=\u6B64\u5916\uFF0C\u60A8\u4E5F\u53EF\u4EE5\u8A02\u95B1\u4EFB\u4F55\u60A8\u60F3\u8981\u7684\u8AB2\u7A0B\u884C\u4E8B\u66C6\u9805\u76EE\u5728\u60A8\u7684\u500B\u4EBA\u884C\u4E8B\u66C6\u986F\u793A\u3002
 chelp.cal3=$\:cal.list \u4F7F\u60A8\u80FD\u5920\u6C7A\u5B9A\u61C9\u8A72\u986F\u793A\u5728\u60A8\u7684\u884C\u4E8B\u66C6\u4E2D\u7684\u9805\u76EE\u3002
 chelp.cal4=\u900F\u904E\u9EDE\u64CA\u884C\u4E8B\u66C6\u540D\u7A31\u65C1\u908A\u7684\u8ABF\u8272\u76E4\u5716\u793A\uFF0C\u60A8\u53EF\u4EE5\u6C7A\u5B9A\u9805\u76EE\u986F\u793A\u5728\u60A8\u884C\u4E8B\u66C6\u4E0A\u7684\u984F\u8272\u3002
 chelp.cal5=\u8981\u5EFA\u7ACB\u4E00\u500B\u884C\u4E8B\u66C6\u9805\u76EE\u53EA\u8981\u5728\u884C\u4E8B\u66C6\u8868\u55AE\u4E0A\u9EDE\u64CA\u6216\u4F7F\u7528\u884C\u4E8B\u66C6\u6E05\u55AE\u5167\u7684\u884C\u4E8B\u66C6\u5716\u793A\u3002
diff --git a/src/main/java/org/olat/commons/calendar/model/ICalToken.java b/src/main/java/org/olat/commons/calendar/model/ICalToken.java
new file mode 100644
index 00000000000..4bde3689ac3
--- /dev/null
+++ b/src/main/java/org/olat/commons/calendar/model/ICalToken.java
@@ -0,0 +1,51 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.commons.calendar.model;
+
+/**
+ * 
+ * Initial date: 18.08.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ICalToken {
+	
+	private final String type;
+	private final String token;
+	private final Long resourceId;
+	
+	public ICalToken(String type, String token, Long resourceId) {
+		this.type = type;
+		this.token = token;
+		this.resourceId = resourceId;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public Long getResourceId() {
+		return resourceId;
+	}
+}
diff --git a/src/main/java/org/olat/commons/calendar/ui/CalendarColorChooserController.java b/src/main/java/org/olat/commons/calendar/ui/CalendarColorChooserController.java
index b78691dc01e..2c188491fff 100644
--- a/src/main/java/org/olat/commons/calendar/ui/CalendarColorChooserController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/CalendarColorChooserController.java
@@ -25,6 +25,7 @@
 
 package org.olat.commons.calendar.ui;
 
+import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -39,14 +40,19 @@ public class CalendarColorChooserController extends BasicController {
 
 	private VelocityContainer colorVC;
 	private String choosenColor;
+	private final KalendarRenderWrapper calendarWrapper;
 
 	private static final String[] colors = new String[]{
 		"o_cal_green", "o_cal_blue", "o_cal_orange",
 		"o_cal_yellow", "o_cal_red", "o_cal_rebeccapurple", "o_cal_grey"
 	};
 
-	public CalendarColorChooserController(UserRequest ureq, WindowControl wControl, String currentCssSelection) {
+	public CalendarColorChooserController(UserRequest ureq, WindowControl wControl,
+			KalendarRenderWrapper calendarWrapper, String currentCssSelection) {
 		super(ureq, wControl);
+		
+		this.calendarWrapper = calendarWrapper;
+
 		colorVC = createVelocityContainer("calEdit", "calColor");
 		
 		for(String color:colors) {
@@ -78,6 +84,11 @@ public class CalendarColorChooserController extends BasicController {
 		return choosenColor;
 	}
 	
+	public KalendarRenderWrapper getCalendarWrapper() {
+		return calendarWrapper;
+	}
+
+	@Override
 	protected void doDispose() {
 		// nothing to dispose
 	}
diff --git a/src/main/java/org/olat/commons/calendar/ui/KalendarConfigurationController.java b/src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java
similarity index 52%
rename from src/main/java/org/olat/commons/calendar/ui/KalendarConfigurationController.java
rename to src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java
index ac8394397ce..495d61cd45d 100644
--- a/src/main/java/org/olat/commons/calendar/ui/KalendarConfigurationController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java
@@ -26,12 +26,14 @@
 package org.olat.commons.calendar.ui;
 
 import java.util.Date;
-import java.util.Iterator;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.olat.commons.calendar.CalendarManager;
 import org.olat.commons.calendar.CalendarManagerFactory;
 import org.olat.commons.calendar.ICalTokenGenerator;
+import org.olat.commons.calendar.model.ICalToken;
 import org.olat.commons.calendar.model.KalendarConfig;
 import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.commons.calendar.ui.events.KalendarGUIAddEvent;
@@ -46,10 +48,10 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
-import org.olat.course.run.calendar.CourseCalendarSubscription;
 
-public class KalendarConfigurationController extends BasicController {
+public class CalendarConfigurationController extends BasicController {
 
 	private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(CalendarManager.class);
 
@@ -60,51 +62,47 @@ public class KalendarConfigurationController extends BasicController {
 	private static final Object CMD_ICAL_FEED = "if";
 	private static final Object CMD_ICAL_REGENERATE = "rf";
 	private static final Object CMD_ICAL_REMOVE_FEED = "rmif";
-	private static final Object CMD_UNSUBSCRIBE = "unsub";
 	private static final String PARAM_ID = "id";
 
 	private VelocityContainer configVC;
 	private List<KalendarRenderWrapper> calendars;
-	private CalendarColorChooserController colorChooser;
-	private KalendarRenderWrapper lastCalendarWrapper;
+
 	private CloseableModalController cmc;
-	private String currentCalendarID;
 	private CalendarExportController exportController;
+	private CalendarColorChooserController colorChooser;
+
 	private DialogBoxController confirmRemoveDialog;
 	private DialogBoxController confirmRegenerateDialog;
-	
-	private List<String> subscriptionIds;
 
-	public KalendarConfigurationController(List<KalendarRenderWrapper> calendars, UserRequest ureq, WindowControl wControl, boolean insideManager) {
+	public CalendarConfigurationController(List<KalendarRenderWrapper> calendars, UserRequest ureq, WindowControl wControl, boolean insideManager) {
 		super(ureq, wControl);
 		setTranslator(Util.createPackageTranslator(CalendarManager.class, ureq.getLocale()));
 		
 		configVC = new VelocityContainer("calEdit", VELOCITY_ROOT + "/calConfig.html", getTranslator(), this);
-		setCalendars(ureq, calendars);
+		setCalendars(calendars);
 		configVC.contextPut("insideManager", insideManager);
 		configVC.contextPut("identity", ureq.getIdentity());
-		configVC.contextPut("removeFromPersonalCalendar", Boolean.TRUE);
 		putInitialPanel(configVC);
 	}
 	
-	public void setEnableRemoveFromPersonalCalendar(boolean enable) {
-		configVC.contextPut("removeFromPersonalCalendar", new Boolean(enable));
-	}
-
-	public void setCalendars(UserRequest ureq, List<KalendarRenderWrapper> calendars) {
-		subscriptionIds = CourseCalendarSubscription.getSubscribedCourseCalendarIDs(ureq.getUserSession().getGuiPreferences());
-		setCalendars(calendars);
+	@Override
+	protected void doDispose() {
+		//
 	}
 	
 	public void setCalendars(List<KalendarRenderWrapper> calendars) {
 		this.calendars = calendars;
-		for (KalendarRenderWrapper calendar: calendars) {
-			calendar.setSubscribed(subscriptionIds.contains(calendar.getKalendar().getCalendarID()));
-		}
-
 		configVC.contextPut("calendars", calendars);
+		
+		Map<ICalTokenKey, ICalToken> tokenMap = new HashMap<>();
+		List<ICalToken> tokens = ICalTokenGenerator.getICalAuthTokens(getIdentity());
+		for(ICalToken token:tokens) {
+			tokenMap.put(new ICalTokenKey(token.getType(), token.getResourceId()), token);
+		}
+		configVC.contextPut("icalTokens", new ICalTokens(getIdentity().getKey(), tokenMap));
 	}
 	
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (source == configVC) {
 			String command = event.getCommand();
@@ -125,45 +123,15 @@ public class KalendarConfigurationController extends BasicController {
 						config, calendarWrapper.getKalendar(), ureq);
 				fireEvent(ureq, Event.CHANGED_EVENT);
 			} else if (command.equals(CMD_CHOOSE_COLOR)) {
-				String calendarID = ureq.getParameter(PARAM_ID);
-				lastCalendarWrapper = findKalendarRenderWrapper(calendarID);
-				removeAsListenerAndDispose(colorChooser);
-				colorChooser = new CalendarColorChooserController(ureq, getWindowControl(), lastCalendarWrapper.getKalendarConfig().getCss());
-				listenTo(colorChooser);
-				removeAsListenerAndDispose(cmc);
-				cmc = new CloseableModalController(getWindowControl(), translate("close"),  colorChooser.getInitialComponent(), false, translate("cal.color.title"));
-				listenTo(cmc);
-				cmc.activate();
+				doOpenColorChooser(ureq, ureq.getParameter(PARAM_ID));
 			} else if (command.equals(CMD_ICAL_FEED)) {
-				String calendarID = ureq.getParameter(PARAM_ID);
-				KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarID);
-				String calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), calendarID, ureq.getIdentity());
-				exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink);
-				listenTo(exportController);
-				removeAsListenerAndDispose(cmc);
-				cmc = new CloseableModalController(getWindowControl(), translate("close"), exportController.getInitialComponent());
-				cmc.activate();
-				listenTo(cmc);
+				doShowICalink(ureq.getParameter(PARAM_ID));
 			} else if (command.equals(CMD_ICAL_REGENERATE)) {
-				currentCalendarID = ureq.getParameter(PARAM_ID);
 				confirmRegenerateDialog = activateOkCancelDialog(ureq, translate("cal.icalfeed.regenerate.title"), translate("cal.icalfeed.regenerate.warning"), confirmRegenerateDialog);
+				confirmRegenerateDialog.setUserObject(ureq.getParameter(PARAM_ID));
 			} else if (command.equals(CMD_ICAL_REMOVE_FEED)) {
-				currentCalendarID = ureq.getParameter(PARAM_ID);
 				confirmRemoveDialog = activateOkCancelDialog(ureq, translate("cal.icalfeed.remove.title"), translate("cal.icalfeed.remove.confirmation_message"), confirmRemoveDialog);
-			} else if (command.equals(CMD_UNSUBSCRIBE)) {
-				currentCalendarID = ureq.getParameter(PARAM_ID);
-				KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(currentCalendarID);
-				CalendarSubscription subscription = new CourseCalendarSubscription(calendarWrapper.getKalendar(), ureq.getUserSession().getGuiPreferences());
-				subscription.unsubscribe();
-				
-				for (Iterator<KalendarRenderWrapper> it=calendars.iterator(); it.hasNext(); ) {
-					KalendarRenderWrapper calendar = it.next();
-					if (calendarWrapper.getKalendar().getCalendarID().equals(calendar.getKalendar().getCalendarID())) {
-						it.remove();
-					}
-				}
-				configVC.contextPut("calendars", calendars);
-				fireEvent(ureq, Event.CHANGED_EVENT);
+				confirmRemoveDialog.setUserObject(ureq.getParameter(PARAM_ID));
 			}
 		}
 	}
@@ -173,36 +141,97 @@ public class KalendarConfigurationController extends BasicController {
 		if (source == colorChooser) {
 			cmc.deactivate();
 			if (event == Event.DONE_EVENT) {
-				String choosenColor = colorChooser.getChoosenColor();
-				KalendarConfig config = lastCalendarWrapper.getKalendarConfig();
-				config.setCss(choosenColor);
-				CalendarManagerFactory.getInstance().getCalendarManager().saveKalendarConfigForIdentity(
-						config, lastCalendarWrapper.getKalendar(), ureq);
-				fireEvent(ureq, Event.CHANGED_EVENT);
+				doChooseColor(ureq);
 			}
+			cleanUp();
 		} else if (source == confirmRemoveDialog ) {
 			if (DialogBoxUIFactory.isOkEvent(event)) {
-				KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(currentCalendarID);
-				ICalTokenGenerator.destroyIcalAuthToken(calendarWrapper.getKalendar().getType(), currentCalendarID, ureq.getIdentity());							
+				doRemoveToken((String)confirmRemoveDialog.getUserObject());
 				showInfo("cal.icalfeed.remove.info");
 				fireEvent(ureq, Event.CHANGED_EVENT);
 			}
 		} else if (source == confirmRegenerateDialog) {
 			if (DialogBoxUIFactory.isOkEvent(event)) {
-				KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(currentCalendarID);
-				ICalTokenGenerator.regenerateIcalAuthToken(calendarWrapper.getKalendar().getType(), currentCalendarID, ureq.getIdentity());			
-				String calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), currentCalendarID, ureq.getIdentity());
-				exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink);
-				listenTo(exportController);
-				removeAsListenerAndDispose(cmc);
-				cmc = new CloseableModalController(getWindowControl(), translate("close"), exportController.getInitialComponent());
-				cmc.activate();
-				listenTo(cmc);		
+				doRegenerateToken((String)confirmRegenerateDialog.getUserObject()); 	
 			}
+		} else if (source == cmc) {
+			cleanUp();
 		}
 		configVC.setDirty(true);
 	}
 	
+	private void cleanUp() {
+		removeAsListenerAndDispose(cmc);
+		removeAsListenerAndDispose(colorChooser);
+		removeAsListenerAndDispose(exportController);
+		
+		cmc = null;
+		colorChooser = null;
+		exportController = null;
+	}
+	
+	private void doShowICalink(String calendarID) {
+		removeAsListenerAndDispose(cmc);
+		removeAsListenerAndDispose(exportController);
+		
+		KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarID);
+		String calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), calendarID, getIdentity());
+		exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink);
+		listenTo(exportController);
+		
+		cmc = new CloseableModalController(getWindowControl(), translate("close"), exportController.getInitialComponent());
+		listenTo(cmc);
+		cmc.activate();
+	}
+	
+	private void doOpenColorChooser(UserRequest ureq, String calendarID) {
+		removeAsListenerAndDispose(cmc);
+		removeAsListenerAndDispose(colorChooser);
+		
+		KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarID);
+		colorChooser = new CalendarColorChooserController(ureq, getWindowControl(), calendarWrapper, calendarWrapper.getKalendarConfig().getCss());
+
+		listenTo(colorChooser);
+		
+		cmc = new CloseableModalController(getWindowControl(), translate("close"),  colorChooser.getInitialComponent(), false, translate("cal.color.title"));
+		listenTo(cmc);
+		cmc.activate();
+	}
+	
+	private void doChooseColor(UserRequest ureq) {
+		String choosenColor = colorChooser.getChoosenColor();
+		KalendarRenderWrapper calendarWrapper = colorChooser.getCalendarWrapper();
+		KalendarConfig config = calendarWrapper.getKalendarConfig();
+		config.setCss(choosenColor);
+		CalendarManagerFactory.getInstance().getCalendarManager().saveKalendarConfigForIdentity(
+				config, calendarWrapper.getKalendar(), ureq);
+		fireEvent(ureq, Event.CHANGED_EVENT);
+	}
+	
+	private void doRegenerateToken(String calendarId) {
+		removeAsListenerAndDispose(cmc);
+		removeAsListenerAndDispose(exportController);
+		
+		KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarId);
+		ICalTokenGenerator.regenerateIcalAuthToken(calendarWrapper.getKalendar().getType(), calendarId, getIdentity());			
+		String calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), calendarId, getIdentity());
+		
+		exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink);
+		listenTo(exportController);
+		
+		cmc = new CloseableModalController(getWindowControl(), translate("close"), exportController.getInitialComponent());
+		cmc.activate();
+		listenTo(cmc);
+		
+		//update token
+	}
+	
+	private void doRemoveToken(String calendarId) {
+		KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarId);
+		ICalTokenGenerator.destroyIcalAuthToken(calendarWrapper.getKalendar().getType(), calendarId, getIdentity());
+		//remove tokens
+	}
+	
 	private KalendarRenderWrapper findKalendarRenderWrapper(String calendarID) {
 		for (KalendarRenderWrapper calendarWrapper : calendars) {
 			if (calendarWrapper.getKalendar().getCalendarID().equals(calendarID))
@@ -210,12 +239,58 @@ public class KalendarConfigurationController extends BasicController {
 		}
 		return null;
 	}
-	
 
-	protected void doDispose() {
-		// controllers disposed by BasicController
-		cmc = null;
-		colorChooser = null;
+	public static class ICalTokens {
+		
+		private final Long identityKey;
+		private final Map<ICalTokenKey, ICalToken> tokenMap;
+		
+		public ICalTokens(Long identityKey, Map<ICalTokenKey, ICalToken> tokenMap) {
+			this.identityKey = identityKey;
+			this.tokenMap = tokenMap;
+		}
+		
+		public boolean hasIcalFeed(KalendarRenderWrapper wrapper) {
+			String type = wrapper.getKalendar().getType();
+			Long calendarId;
+			if(CalendarManager.TYPE_USER.equals(type)) {
+				calendarId = identityKey;
+			} else {
+				calendarId = Long.valueOf(wrapper.getKalendar().getCalendarID());
+			}
+			ICalTokenKey tokenKey = new ICalTokenKey(type, calendarId);
+			ICalToken token = tokenMap.get(tokenKey);
+			return token != null && StringHelper.containsNonWhitespace(token.getToken());
+		}
 	}
+	
+	public static class ICalTokenKey {
+		
+		private final String type;
+		private final Long resourceId;
+		
+		public ICalTokenKey(String type, Long resourceId) {
+			this.type = type;
+			this.resourceId = resourceId;
+		}
+
+		@Override
+		public int hashCode() {
+			return type.hashCode()
+					+ resourceId.hashCode();
+		}
 
+		@Override
+		public boolean equals(Object obj) {
+			if(this == obj) {
+				return true;
+			}
+			if(obj instanceof ICalTokenKey) {
+				ICalTokenKey key = (ICalTokenKey)obj;
+				return key.resourceId.equals(resourceId)
+						&& key.type.equals(type);
+			}
+			return false;
+		}	
+	}
 }
diff --git a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java b/src/main/java/org/olat/commons/calendar/ui/CalendarEntryDetailsController.java
similarity index 98%
rename from src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
rename to src/main/java/org/olat/commons/calendar/ui/CalendarEntryDetailsController.java
index d2b9fe88b7b..9ce653ab56a 100644
--- a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/CalendarEntryDetailsController.java
@@ -58,7 +58,7 @@ import org.olat.core.helpers.Settings;
 import org.olat.core.util.StringHelper;
 
 
-public class KalendarEntryDetailsController extends BasicController {
+public class CalendarEntryDetailsController extends BasicController {
 
 	private Collection<KalendarRenderWrapper> availableCalendars;
 	private boolean isNew, isReadOnly;
@@ -66,7 +66,7 @@ public class KalendarEntryDetailsController extends BasicController {
 	private StackedPanel mainPanel;
 	private VelocityContainer mainVC, eventVC, linkVC;
 	private TabbedPane pane;
-	private KalendarEntryForm eventForm;
+	private CalendarEntryForm eventForm;
 	private LinkProvider activeLinkProvider;
 	private CustomMediaChooserController customMediaChooserCtr;
 	private DialogBoxController deleteYesNoController;
@@ -75,7 +75,7 @@ public class KalendarEntryDetailsController extends BasicController {
 	private MediaLinksController mediaLinksController;
 	private Link deleteButton;
 
-	public KalendarEntryDetailsController(UserRequest ureq, KalendarEvent kalendarEvent, KalendarRenderWrapper calendarWrapper,
+	public CalendarEntryDetailsController(UserRequest ureq, KalendarEvent kalendarEvent, KalendarRenderWrapper calendarWrapper,
 			List<KalendarRenderWrapper> availableCalendars, boolean isNew, String caller, WindowControl wControl) {
 		super(ureq, wControl);
 		
@@ -94,7 +94,7 @@ public class KalendarEntryDetailsController extends BasicController {
 		eventVC = createVelocityContainer("calEditDetails");
 		deleteButton = LinkFactory.createButton("cal.edit.delete", eventVC, this);
 		eventVC.contextPut("caller", caller);
-		eventForm = new KalendarEntryForm(ureq, wControl, kalendarEvent, calendarWrapper, availableCalendars, isNew);
+		eventForm = new CalendarEntryForm(ureq, wControl, kalendarEvent, calendarWrapper, availableCalendars, isNew);
 		listenTo(eventForm);
 		eventVC.put("eventForm", eventForm.getInitialComponent());
 		eventVC.contextPut("isNewEvent", new Boolean(isNew));
diff --git a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryForm.java b/src/main/java/org/olat/commons/calendar/ui/CalendarEntryForm.java
similarity index 99%
rename from src/main/java/org/olat/commons/calendar/ui/KalendarEntryForm.java
rename to src/main/java/org/olat/commons/calendar/ui/CalendarEntryForm.java
index 5ba74dd2168..c83203bad63 100644
--- a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryForm.java
+++ b/src/main/java/org/olat/commons/calendar/ui/CalendarEntryForm.java
@@ -55,7 +55,7 @@ import org.olat.core.logging.OLATRuntimeException;
 import org.olat.core.util.StringHelper;
 
 
-public class KalendarEntryForm extends FormBasicController {
+public class CalendarEntryForm extends FormBasicController {
 
 	public static final String SUBMIT_MULTI = "multi";
 	public static final String SUBMIT_SINGLE = "single";
@@ -91,7 +91,7 @@ public class KalendarEntryForm extends FormBasicController {
 	 * @param isNew		If it is a new event, display a list of calendars to choose from.
 	 * @param locale
 	 */
-	public KalendarEntryForm(UserRequest ureq, WindowControl wControl, KalendarEvent event, KalendarRenderWrapper choosenWrapper,
+	public CalendarEntryForm(UserRequest ureq, WindowControl wControl, KalendarEvent event, KalendarRenderWrapper choosenWrapper,
 			Collection<KalendarRenderWrapper> availableCalendars, boolean isNew) {
 		super(ureq, wControl);
 		
diff --git a/src/main/java/org/olat/commons/calendar/ui/CalendarPrintMapper.java b/src/main/java/org/olat/commons/calendar/ui/CalendarPrintMapper.java
index 66b92b0af41..3eb33a30163 100644
--- a/src/main/java/org/olat/commons/calendar/ui/CalendarPrintMapper.java
+++ b/src/main/java/org/olat/commons/calendar/ui/CalendarPrintMapper.java
@@ -159,10 +159,10 @@ public class CalendarPrintMapper implements Mapper {
 </div>
 	*/
 	
-	private void renderEvents(StringBuilder sb, List<KalendarEventRenderWrapper> eventList, Date from , Date to) {
+	private void renderEvents(StringBuilder sb, List<KalendarEventRenderWrapper> eventList, Date dateFrom , Date dateTo) {
 		sb.append("<div class='o_cal_wv_print'><fieldset>")
-		  .append("<legend>").append(StringHelper.formatLocaleDateFull(from, translator.getLocale()))
-		  .append(" - ").append(StringHelper.formatLocaleDateFull(to, translator.getLocale()))
+		  .append("<legend>").append(StringHelper.formatLocaleDateFull(dateFrom, translator.getLocale()))
+		  .append(" - ").append(StringHelper.formatLocaleDateFull(dateTo, translator.getLocale()))
 		  .append("</legend>")
 		  .append("<ul class='o_cal_wv_list'>");
 		
@@ -231,7 +231,7 @@ public class CalendarPrintMapper implements Mapper {
 		}
 		sb.append("</span></div>\n");
 		// event name (subject)
-		//fxdiff BAKS-13: firefox doesn't break lines with only <br />, we need <p>
+		// firefox doesn't break lines with only <br />, we need <p>
 		sb.append("<div class=\"o_cal_subject " + eventWrapper.getCssClass() + "\"><p>");
 		if (hidden) {
 			sb.append("-");
@@ -275,8 +275,8 @@ public class CalendarPrintMapper implements Mapper {
 		  .append("</div>");
 	}
 	
-	private void renderCalendar(StringBuilder sb, List<KalendarRenderWrapper> calendarWrappers) {
-		for(KalendarRenderWrapper calendarWrapper:calendarWrappers) {
+	private void renderCalendar(StringBuilder sb, List<KalendarRenderWrapper> calendarWrapperList) {
+		for(KalendarRenderWrapper calendarWrapper:calendarWrapperList) {
 			String cssClass = calendarWrapper.getKalendarConfig().getCss();
 			sb.append("<div class='o_cal_config_row'><div class='o_cal_config_calendar ").append(cssClass).append("'>")
 			  .append(StringHelper.escapeHtml(calendarWrapper.getKalendarConfig().getDisplayName()))
diff --git a/src/main/java/org/olat/commons/calendar/ui/ExternalLinksController.java b/src/main/java/org/olat/commons/calendar/ui/ExternalLinksController.java
index 1e9672dbd13..d5909540f1f 100644
--- a/src/main/java/org/olat/commons/calendar/ui/ExternalLinksController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/ExternalLinksController.java
@@ -164,7 +164,10 @@ public class ExternalLinksController extends FormBasicController {
 					allOk &= false;
 				} else {
 					try {
-						new URL(url);
+						String host = new URL(url).getHost();
+						if(host == null) {
+							link.getUrl().setErrorKey("tab.links.extern.url.invalid", null);
+						}
 					} catch(MalformedURLException e) {
 						link.getUrl().setErrorKey("tab.links.extern.url.invalid", null);
 						allOk &= false;
diff --git a/src/main/java/org/olat/commons/calendar/ui/ImportCalendarController.java b/src/main/java/org/olat/commons/calendar/ui/ImportCalendarController.java
index 0c37078723c..49fa25712fd 100644
--- a/src/main/java/org/olat/commons/calendar/ui/ImportCalendarController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/ImportCalendarController.java
@@ -138,7 +138,10 @@ public class ImportCalendarController extends FormBasicController {
 			String url = importUrl.getValue();
 			if(StringHelper.containsNonWhitespace(url)) {
 				try {
-					new URL(url);
+					String host = new URL(url).getHost();
+					if(host == null) {
+						importUrl.setErrorKey("cal.import.url.invalid", null);
+					}
 				} catch (MalformedURLException e) {
 					importUrl.setErrorKey("cal.import.url.invalid", null);
 					allOk &= false;
diff --git a/src/main/java/org/olat/commons/calendar/ui/ImportedCalendarConfigurationController.java b/src/main/java/org/olat/commons/calendar/ui/ImportedCalendarConfigurationController.java
index 9f4e36bebec..0cfdbcfe358 100644
--- a/src/main/java/org/olat/commons/calendar/ui/ImportedCalendarConfigurationController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/ImportedCalendarConfigurationController.java
@@ -109,7 +109,7 @@ public class ImportedCalendarConfigurationController extends BasicController {
 				String calendarID = ureq.getParameter(PARAM_ID);
 				lastCalendarWrapper = findKalendarRenderWrapper(calendarID);
 				removeAsListenerAndDispose(colorChooser);
-				colorChooser = new CalendarColorChooserController(ureq, getWindowControl(), lastCalendarWrapper.getKalendarConfig().getCss());
+				colorChooser = new CalendarColorChooserController(ureq, getWindowControl(), lastCalendarWrapper, lastCalendarWrapper.getKalendarConfig().getCss());
 				listenTo(colorChooser);
 				removeAsListenerAndDispose(cmc);
 				cmc = new CloseableModalController(getWindowControl(), translate("close"), colorChooser.getInitialComponent());
diff --git a/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java b/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
index fdf122a5f5c..c1928865222 100644
--- a/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
@@ -58,11 +58,9 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
-import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
-import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.util.ComponentUtil;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -97,15 +95,12 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 	private List<KalendarRenderWrapper> calendarWrappers;
 	private List<KalendarRenderWrapper> importedCalendarWrappers;
 	private FullCalendarElement weeklyCalendar;
-	private KalendarConfigurationController calendarConfig;
+	private CalendarConfigurationController calendarConfig;
 	private ImportedCalendarConfigurationController importedCalendarConfig;
-	private KalendarEntryDetailsController editController;
+	private CalendarEntryDetailsController editController;
 	private ImportCalendarController importCalendarController;
-	private CalendarSubscription calendarSubscription;
-	private Controller subscriptionController;
 	private String caller;
 	private boolean dirty = false;
-	private FormLink subscribeButton, unsubscribeButton;
 
 	private CloseableModalController cmc;
 	private SubscriptionContext subsContext;
@@ -127,6 +122,9 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 	private boolean modifiedCalenderDirty = false;
 	private final boolean eventAlwaysVisible;
 	
+	private CalendarPrintMapper printMapper;
+	private String printUrl;
+	
 	private ILoggingAction calLoggingAction;
 	
 	private final CalendarNotificationManager calendarNotificationsManager;
@@ -141,37 +139,8 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 	 * @param eventAlwaysVisible  When true, the 'isVis()' check is disabled and events will be displayed always.
 	 */
 	public WeeklyCalendarController(UserRequest ureq, WindowControl wControl, List<KalendarRenderWrapper> calendarWrappers, String caller, boolean eventAlwaysVisible) {
-		this(ureq, wControl, calendarWrappers, new ArrayList<KalendarRenderWrapper>(), caller, null, eventAlwaysVisible);
+		this(ureq, wControl, calendarWrappers, new ArrayList<KalendarRenderWrapper>(), caller, eventAlwaysVisible);
 	}
-
-	/**
-	 * Used for Home 
-	 * @param ureq
-	 * @param wControl
-	 * @param calendarWrappers
-	 * @param importedCalendarWrappers
-	 * @param caller
-	 * @param eventAlwaysVisible  When true, the 'isVis()' check is disabled and events will be displayed always.
-	 */
-	public WeeklyCalendarController(UserRequest ureq, WindowControl wControl, List<KalendarRenderWrapper> calendarWrappers, List<KalendarRenderWrapper> importedCalendarWrappers, String caller, boolean eventAlwaysVisible) {
-		this(ureq, wControl, calendarWrappers, importedCalendarWrappers, caller, null, eventAlwaysVisible );
-	}
-
-	/**
-	 * 
-	 * @param ureq
-	 * @param wControl
-	 * @param calendarWrappers
-	 * @param caller
-	 * @param calendarSubscription
-	 * @param eventAlwaysVisible  When true, the 'isVis()' check is disabled and events will be displayed always.
-	 */
-	public WeeklyCalendarController(UserRequest ureq, WindowControl wControl, List<KalendarRenderWrapper> calendarWrappers, String caller, CalendarSubscription calendarSubscription, boolean eventAlwaysVisible) {
-		this(ureq, wControl, calendarWrappers, new ArrayList<KalendarRenderWrapper>(), caller, calendarSubscription, eventAlwaysVisible);
-	}
-	
-	private CalendarPrintMapper printMapper;
-	private String printUrl;
 	
 	/**
 	 * Display week view of calendar. Add the calendars to be displayed via
@@ -185,7 +154,7 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 	 * @param eventAlwaysVisible  When true, the 'isVis()' check is disabled and events will be displayed always.
 	 */
 	public WeeklyCalendarController(UserRequest ureq, WindowControl wControl, List<KalendarRenderWrapper> calendarWrappers, List<KalendarRenderWrapper> importedCalendarWrappers,
-			String caller, CalendarSubscription calendarSubscription, boolean eventAlwaysVisible) {
+			String caller, boolean eventAlwaysVisible) {
 		super(ureq,wControl, "indexWeekly");
 		setTranslator(Util.createPackageTranslator(CalendarManager.class, ureq.getLocale(), getTranslator()));
 
@@ -194,7 +163,6 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 		this.eventAlwaysVisible = eventAlwaysVisible;
 		this.calendarWrappers = calendarWrappers;
 		this.importedCalendarWrappers = importedCalendarWrappers;
-		this.calendarSubscription = calendarSubscription;
 		this.caller = caller;
 		
 		String themeBaseUri = wControl.getWindowBackOffice().getWindow().getGuiTheme().getBaseURI();
@@ -210,9 +178,6 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly();
 
-		subscribeButton = uifactory.addFormLink("cal.subscribe", formLayout, Link.BUTTON_XSMALL);
-		unsubscribeButton = uifactory.addFormLink("cal.unsubscribe", formLayout, Link.BUTTON_XSMALL);
-
 		Collections.sort(calendarWrappers, KalendarComparator.getInstance());
 		Collections.sort(importedCalendarWrappers, KalendarComparator.getInstance());
 		
@@ -226,7 +191,7 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 			layoutCont.contextPut("caller", caller);
 			
 			// calendarConfiguration component
-			calendarConfig = new KalendarConfigurationController(calendarWrappers, ureq, getWindowControl(), eventAlwaysVisible);
+			calendarConfig = new CalendarConfigurationController(calendarWrappers, ureq, getWindowControl(), eventAlwaysVisible);
 			listenTo(calendarConfig);
 			layoutCont.put("calendarConfig", calendarConfig.getInitialComponent());
 			
@@ -242,13 +207,6 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 					csc = getContextualSubscriptionController(ureq, calendarWrappers.get(0), subsContext);
 					layoutCont.put("calsubscription", csc.getInitialComponent());
 				}
-				
-				if (calendarSubscription == null || isGuest) {
-					layoutCont.contextPut("hasSubscription", Boolean.FALSE);
-				} else {
-					layoutCont.contextPut("hasSubscription", Boolean.TRUE);
-					layoutCont.contextPut("isSubscribed", new Boolean(calendarSubscription.isSubscribed()));
-				}
 			}
 		}
 	}
@@ -276,10 +234,6 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 		return null;
 	}
 	
-	public void setEnableRemoveFromPersonalCalendar(boolean enable) {
-		calendarConfig.setEnableRemoveFromPersonalCalendar(enable);
-	}
-	
 	public Date getFocus() {
 		return weeklyCalendar.getFocusDate();
 	}
@@ -377,19 +331,6 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 				doMove(moveEvent.getKalendarEvent(), moveEvent.getDayDelta(),
 						moveEvent.getMinuteDelta(), moveEvent.getAllDay());
 			}
-		} else if (source == subscribeButton || source == unsubscribeButton) {
-			removeAsListenerAndDispose(subscriptionController);
-			if(calendarSubscription.isSubscribed() == (source == unsubscribeButton)) {
-				subscriptionController = calendarSubscription.triggerSubscribeAction();
-			}
-			if (subscriptionController != null) {
-				// activate subscription controller
-				listenTo(subscriptionController);
-				flc.put("calsubscription", subscriptionController.getInitialComponent());
-			} else {
-				flc.contextPut("isSubscribed", new Boolean(calendarSubscription.isSubscribed()));
-				CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new KalendarModifiedEvent(), OresHelper.lookupType(CalendarManager.class));
-			}
 		} else if (event instanceof KalendarGUIPrintEvent) {
 			KalendarGUIPrintEvent printEvent = (KalendarGUIPrintEvent)event;
 			if(printEvent.getFrom() != null && printEvent.getTo() != null) {
@@ -458,8 +399,6 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 				setCalendars(calendarWrappers, importedCalendarWrappers);
 				weeklyCalendar.getComponent().setDirty(true);
 			}
-		} else if (source == subscriptionController) {
-			// nothing to do here
 		} else if (source == dbcSequence) {
 			if(event != Event.CANCELLED_EVENT) {
 				int pos = DialogBoxUIFactory.getButtonPos(event);
@@ -621,7 +560,7 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 		}
 		
 		if(canEdit) {
-			editController = new KalendarEntryDetailsController(ureq, kalendarEvent, kalendarWrapper,	calendarWrappers, false, caller, getWindowControl());
+			editController = new CalendarEntryDetailsController(ureq, kalendarEvent, kalendarWrapper,	calendarWrappers, false, caller, getWindowControl());
 			listenTo(editController);
 			
 			removeAsListenerAndDispose(cmc);
@@ -668,7 +607,7 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 		allCalendarWrappers.addAll(importedCalendarWrappers);
 		
 		removeAsListenerAndDispose(editController);
-		editController = new KalendarEntryDetailsController(ureq, newEvent, calendarWrapper, allCalendarWrappers, true, caller, getWindowControl());
+		editController = new CalendarEntryDetailsController(ureq, newEvent, calendarWrapper, allCalendarWrappers, true, caller, getWindowControl());
 		listenTo(editController);
 		
 		removeAsListenerAndDispose(cmc);
diff --git a/src/main/java/org/olat/commons/calendar/ui/_content/indexWeekly.html b/src/main/java/org/olat/commons/calendar/ui/_content/indexWeekly.html
index 18f3af3883a..bd24db9e93a 100644
--- a/src/main/java/org/olat/commons/calendar/ui/_content/indexWeekly.html
+++ b/src/main/java/org/olat/commons/calendar/ui/_content/indexWeekly.html
@@ -1,29 +1,19 @@
 <div id="o_cal_config_below_cal_container">
 	<div class="o_cal_toptoolbar clearfix">
-		#if ($hasSubscription)
-			<div class="o_cal_toptoolbar_sub">
-			#if ($isSubscribed)
-				$r.render("cal.unsubscribe")
-			#else
-				$r.render("cal.subscribe")
-			#end
-			</div>
-			<div class="o_cal_toptoolbar_help">
-			#if ($caller == "home")
-				$r.contextHelp("org.olat.commons.calendar","personal-calendar.html","help.hover.personalcal")
-			#elseif ($caller == "course")
-				$r.contextHelp("org.olat.commons.calendar","course-calendar.html","help.hover.coursecal")
-			#elseif ($caller == "collab")
-				$r.contextHelp("org.olat.commons.calendar","group-calendar.html","help.hover.groupcal")
-			#elseif ($caller == "profile")
-				$r.contextHelp("org.olat.commons.calendar","personal-calendar.html","help.hover.cal")
-			#end
-			</div>
+		<div class="o_cal_toptoolbar_help">
+		#if ($caller == "home")
+			$r.contextHelp("org.olat.commons.calendar","personal-calendar.html","help.hover.personalcal")
+		#elseif ($caller == "course")
+			$r.contextHelp("org.olat.commons.calendar","course-calendar.html","help.hover.coursecal")
+		#elseif ($caller == "collab")
+			$r.contextHelp("org.olat.commons.calendar","group-calendar.html","help.hover.groupcal")
+		#elseif ($caller == "profile")
+			$r.contextHelp("org.olat.commons.calendar","personal-calendar.html","help.hover.cal")
 		#end
+		</div>
 		#if ($r.available("calsubscription"))
 			$r.render("calsubscription")
 		#end
-
 	</div>
 	<div class="o_cal">
 	  $r.render("calendar")
diff --git a/src/main/java/org/olat/commons/calendar/ui/components/KalendarRenderWrapper.java b/src/main/java/org/olat/commons/calendar/ui/components/KalendarRenderWrapper.java
index 4f9473a8e25..878265da643 100644
--- a/src/main/java/org/olat/commons/calendar/ui/components/KalendarRenderWrapper.java
+++ b/src/main/java/org/olat/commons/calendar/ui/components/KalendarRenderWrapper.java
@@ -26,11 +26,9 @@
 package org.olat.commons.calendar.ui.components;
 
 import org.olat.commons.calendar.CalendarManagerFactory;
-import org.olat.commons.calendar.ICalTokenGenerator;
 import org.olat.commons.calendar.model.Kalendar;
 import org.olat.commons.calendar.model.KalendarConfig;
 import org.olat.commons.calendar.ui.LinkProvider;
-import org.olat.core.id.Identity;
 
 
 public class KalendarRenderWrapper {
@@ -52,10 +50,10 @@ public class KalendarRenderWrapper {
 	
 	
 	private Kalendar kalendar;
-	private int access;
+	private int access = ACCESS_READ_ONLY;
 	private boolean imported = false;
 	private boolean subscribed = false;
-	private KalendarConfig kalendarConfig;
+	private KalendarConfig kalendarConfig = new KalendarConfig();
 	private LinkProvider linkProvider;
 	
 	/**
@@ -67,20 +65,7 @@ public class KalendarRenderWrapper {
 	 * @param access
 	 */
 	public KalendarRenderWrapper(Kalendar kalendar) {
-		this(kalendar, new KalendarConfig(), ACCESS_READ_ONLY);
-	}
-
-	/**
-	 * Configure a calendar for rendering.
-	 * 
-	 * @param kalendar
-	 * @param calendarColor
-	 * @param access
-	 */
-	public KalendarRenderWrapper(Kalendar kalendar, KalendarConfig config, int access) {
 		this.kalendar = kalendar;
-		this.kalendarConfig = config;
-		this.access = access;
 	}
 
 	public void setAccess(int access) {
@@ -137,8 +122,4 @@ public class KalendarRenderWrapper {
 	public void setLinkProvider(LinkProvider linkProvider) {
 		this.linkProvider = linkProvider;
 	}
-	
-	public boolean hasIcalFeed(Identity identity) {
-		return ICalTokenGenerator.existIcalFeedLink(this.getKalendar().getType(), this.getKalendar().getCalendarID(), identity);
-	}
 }
diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index bfe3f59174a..7056c821139 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -176,13 +176,13 @@ public class CourseFactory extends BasicManager {
 	 * 
 	 * @param ureq
 	 * @param wControl
-	 * @param olatResource
+	 * @param courseEntry
 	 * @return editor controller for the given course resourceable; if the editor
 	 *         is already locked, it returns a controller with a lock message
 	 */
 	public static EditorMainController createEditorController(UserRequest ureq, WindowControl wControl,
-			TooledStackedPanel toolbar, OLATResourceable olatResource, CourseNode selectedNode) {
-		ICourse course = loadCourse(olatResource);
+			TooledStackedPanel toolbar, RepositoryEntry courseEntry, CourseNode selectedNode) {
+		ICourse course = loadCourse(courseEntry);
 		EditorMainController emc = new EditorMainController(ureq, wControl, toolbar, course, selectedNode);
 		if (emc.getLockEntry() == null) {
 			Translator translator = Util.createPackageTranslator(RunMainController.class, ureq.getLocale());
@@ -243,6 +243,32 @@ public class CourseFactory extends BasicManager {
 	 * @return the course with the given id (the type is always
 	 *         CourseModule.class.toString())
 	 */
+	public static ICourse loadCourse(RepositoryEntry courseEntry) {
+		if (courseEntry == null) {
+			throw new AssertException("No resourceable ID found.");
+		}
+		Long resourceableId = courseEntry.getOlatResource().getResourceableId();
+		PersistingCourseImpl course = loadedCourses.get(resourceableId);
+		if (course == null) {
+			// o_clusterOK by:ld - load and put in cache in doInSync block to ensure
+			// that no invalidate cache event was missed
+			PersistingCourseImpl theCourse = new PersistingCourseImpl(courseEntry);
+			theCourse.load();
+			
+			PersistingCourseImpl cachedCourse = loadedCourses.putIfAbsent(resourceableId, theCourse);
+			if(cachedCourse != null) {
+				course = cachedCourse;
+				course.updateCourseEntry(courseEntry);
+			} else {
+				course = theCourse;
+			}
+		} else {
+			course.updateCourseEntry(courseEntry);
+		}
+		
+		return course;
+	}
+	
 	public static ICourse loadCourse(final Long resourceableId) {
 		if (resourceableId == null) throw new AssertException("No resourceable ID found.");
 		PersistingCourseImpl course = loadedCourses.get(resourceableId);
@@ -556,8 +582,8 @@ public class CourseFactory extends BasicManager {
 		re.setSoftkey(softKey);
 		repositoryService.update(re);
 		
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource());
-		CourseFactory.publishCourse(course, access, false,  null, Locale.ENGLISH);
+		ICourse course = loadCourse(re);
+		publishCourse(course, access, false,  null, Locale.ENGLISH);
 		return re;
 	}
 
@@ -634,8 +660,7 @@ public class CourseFactory extends BasicManager {
 		} else {
 			// Increment launch counter
 			rs.incrementLaunchCounter(entry);
-			OLATResource ores = entry.getOlatResource();
-			ICourse course = loadCourse(ores);
+			ICourse course = loadCourse(entry);
 			
 			ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(entry);
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, wControl);	
diff --git a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
index 7abf01a948c..aca632ed166 100644
--- a/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
+++ b/src/main/java/org/olat/course/CoursefolderWebDAVMergeSource.java
@@ -110,7 +110,7 @@ class CoursefolderWebDAVMergeSource extends WebDAVMergeSource {
 			duplicates.add(re);
 			
 			String courseTitle = RequestUtil.normalizeFilename(re.getDisplayname());
-			NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(courseTitle, re.getOlatResource(), editor ? null : identityEnv);
+			NamedContainerImpl cfContainer = new CoursefolderWebDAVNamedContainer(courseTitle, re, editor ? null : identityEnv);
 			
 			if (useTerms) {
 				RepositoryEntryLifecycle lc = re.getLifecycle();
diff --git a/src/main/java/org/olat/course/CoursefolderWebDAVNamedContainer.java b/src/main/java/org/olat/course/CoursefolderWebDAVNamedContainer.java
index 9b33e6266ed..27a2d05cc3f 100644
--- a/src/main/java/org/olat/course/CoursefolderWebDAVNamedContainer.java
+++ b/src/main/java/org/olat/course/CoursefolderWebDAVNamedContainer.java
@@ -20,13 +20,12 @@
 package org.olat.course;
 
 import org.olat.core.id.IdentityEnvironment;
-import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.repository.RepositoryEntry;
 
 /**
  * 
@@ -36,13 +35,13 @@ class CoursefolderWebDAVNamedContainer extends NamedContainerImpl {
 	
 	private static final OLog log = Tracing.createLoggerFor(CoursefolderWebDAVNamedContainer.class);
 	
-	private OLATResourceable res;
+	private RepositoryEntry entry;
 	private VFSContainer parentContainer;
 	private IdentityEnvironment identityEnv;
 	
-	public CoursefolderWebDAVNamedContainer(String courseTitle, OLATResourceable res, IdentityEnvironment identityEnv) {
+	public CoursefolderWebDAVNamedContainer(String courseTitle, RepositoryEntry entry, IdentityEnvironment identityEnv) {
 		super(courseTitle, null);
-		this.res = OresHelper.clone(res);
+		this.entry = entry;
 		this.identityEnv = identityEnv;
 	}
 
@@ -55,7 +54,7 @@ class CoursefolderWebDAVNamedContainer extends NamedContainerImpl {
 	public VFSContainer getDelegate() {
 		if(super.getDelegate() == null) {
 			try {
-				ICourse course = CourseFactory.loadCourse(res.getResourceableId());
+				ICourse course = CourseFactory.loadCourse(entry);
 				VFSContainer courseFolder = course.getCourseFolderContainer(identityEnv);
 				setDelegate(courseFolder);
 				if(parentContainer != null) {
@@ -63,7 +62,7 @@ class CoursefolderWebDAVNamedContainer extends NamedContainerImpl {
 					parentContainer = null;
 				}
 			} catch (Exception e) {
-				log.error("Error loading course: " + res, e);
+				log.error("Error loading course: " + entry, e);
 			}
 		}
 		return super.getDelegate();
diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java
index 1156d7db7fd..f1c9af1526c 100644
--- a/src/main/java/org/olat/course/PersistingCourseImpl.java
+++ b/src/main/java/org/olat/course/PersistingCourseImpl.java
@@ -100,7 +100,7 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 	private boolean hasAssessableNodes = false;
 	private CourseEditorTreeModel editorTreeModel;
 	private CourseConfig courseConfig;
-	private CourseEnvironment courseEnvironment;
+	private final CourseEnvironmentImpl courseEnvironment;
 	private OlatRootFolderImpl courseRootContainer;
 	private String courseTitle = null;
 	/** courseTitleSyncObj is a final Object only used for synchronizing the courseTitle getter - see OLAT-5654 */
@@ -133,6 +133,15 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 		courseEnvironment = new CourseEnvironmentImpl(this);
 	}
 	
+	PersistingCourseImpl(RepositoryEntry courseEntry) {
+		this.courseTitle = courseEntry.getDisplayname();
+		this.resourceableId = courseEntry.getOlatResource().getResourceableId();
+		// prepare filesystem and set course base path and course folder paths
+		prepareFilesystem();
+		courseConfig = CourseConfigManagerImpl.getInstance().loadConfigFor(this); // load or init defaults
+		courseEnvironment = new CourseEnvironmentImpl(this, courseEntry);
+	}
+	
 
 	/**
 	 * @see org.olat.course.ICourse#getRunStructure()
@@ -203,6 +212,11 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 		}
 		return courseTitle;
 	}
+	
+	public void updateCourseEntry(RepositoryEntry courseEntry) {
+		courseTitle = courseEntry.getDisplayname();
+		courseEnvironment.updateCourseEntry(courseEntry);
+	}
 
 	/**
 	 * Prepares the filesystem for this course.
diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeListModel.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeListModel.java
index b6fe0b6be18..9fe63a43f05 100644
--- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeListModel.java
+++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeListModel.java
@@ -73,7 +73,7 @@ public class AssessmentModeListModel extends DefaultFlexiTableDataModel<Assessme
 				List<String> warnings = null;
 				Status status = mode.getStatus();
 				if(StringHelper.containsNonWhitespace(mode.getStartElement())) {
-					ICourse course = CourseFactory.loadCourse(mode.getRepositoryEntry().getOlatResource());
+					ICourse course = CourseFactory.loadCourse(mode.getRepositoryEntry());
 					CourseNode node = course.getRunStructure().getNode(mode.getStartElement());
 					if(node == null) {
 						warnings = new ArrayList<>(2);
@@ -81,7 +81,7 @@ public class AssessmentModeListModel extends DefaultFlexiTableDataModel<Assessme
 					}
 				}
 				if(StringHelper.containsNonWhitespace(mode.getElementList())) {
-					ICourse course = CourseFactory.loadCourse(mode.getRepositoryEntry().getOlatResource());
+					ICourse course = CourseFactory.loadCourse(mode.getRepositoryEntry());
 					String elements = mode.getElementList();
 					for(String element:elements.split(",")) {
 						CourseNode node = course.getRunStructure().getNode(element);
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
index ba803506fc4..80580280302 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
@@ -515,7 +515,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 	public boolean isRecertificationAllowed(Identity identity, RepositoryEntry entry) {
 		boolean allowed = false;
 		try {
-			ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(entry);
 			CourseConfig config = course.getCourseEnvironment().getCourseConfig();
 			if(config.isRecertificationEnabled()) {
 				int time = config.getRecertificationTimelapse();
diff --git a/src/main/java/org/olat/course/config/ui/_chelp/course-calendar.html b/src/main/java/org/olat/course/config/ui/_chelp/course-calendar.html
index c72fbf438e5..bfd3bb277a2 100644
--- a/src/main/java/org/olat/course/config/ui/_chelp/course-calendar.html
+++ b/src/main/java/org/olat/course/config/ui/_chelp/course-calendar.html
@@ -1,5 +1,4 @@
- <br/>
-	<p>
+<p>
 		<b>$r.translate("chkbx.calendar.onoff")</b>: $r.translate("chelp.cal1") $r.translate("chelp.cal2")
 	</p>
 	<p>
diff --git a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_ar.properties
index 33a74a96f4e..8cfdd9256f6 100644
--- a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_ar.properties
@@ -1,6 +1,5 @@
 #Fri Aug 20 17:53:19 CEST 2010
 chelp.cal1=\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0642\u0631\u0631 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0632\u0645\u0646\u0649 \u0641\u0649 \u0645\u0642\u0631\u0631\u0643 \u0623\u0648 \u0644\u0627.
-chelp.cal2=\u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0632\u0645\u0646\u0649 \u0644\u0645\u0642\u0631\u0631\u0643 \u064A\u062A\u064A\u062D \u0644\u0643 \u062A\u0633\u062C\u064A\u0644 \u0623\u062D\u062F\u0627\u062B \u0627\u0644\u0645\u0642\u0631\u0631 \u0644\u0643\u0649 \u064A\u062A\u0645 \u0631\u0628\u0637\u0647\u0627 \u0645\u0639 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631.
 chelp.cal3=\u064A\u0645\u0643\u0646 \u0639\u0631\u0636 \u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0648\u0627\u0633\u0637\u0629 \u0645\u0631\u0628\u0639 \u0627\u0644\u0623\u062F\u0627\u0629\u060C \u0628\u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0625\u0645\u0643\u0627\u0646\u064A\u0629 \u062F\u0645\u062C \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0641\u0649 \u0647\u064A\u0643\u0644 \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u062E\u0627\u0635 \u0628\u0643\u060C \u0642\u0645 \u0641\u0642\u0637 \u0628\u0627\u0633\u062A\u062E\u062F\u0645 \u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 "\u0627\u0644\u062A\u0642\u0648\u064A\u0645".
 chelp.cha1=\u0645\u0646 \u062E\u0644\u0627\u0644 \u0645\u0631\u0628\u0639 \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631 \u064A\u0645\u0643\u0646\u0643 \u062A\u062D\u062F\u064A\u062F \u0625\u0645\u0643\u0627\u0646\u064A\u0629 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u0641\u0649 \u0627\u0644\u0645\u0642\u0631\u0631.
 chelp.cha2=\u0639\u0646\u062F \u0641\u062A\u062D \u0627\u0644\u062F\u0631\u062F\u0634\u0629 \u0641\u0625\u0646 \u0643\u0644 \u0645\u0634\u0627\u0631\u0643\u0649 \u0627\u0644\u0645\u0642\u0631\u0631 \u0633\u064A\u0633\u062A\u0642\u0628\u0644\u0648\u0646 \u0631\u0627\u0628\u0637 \u0641\u0649 \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645\r\n.<b>$org.olat.course.run\:header.tools.general</b>
diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
index d0342780e88..6d1471e3e98 100644
--- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
@@ -89,6 +89,19 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 		repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
 	}
+	
+	private PersistingCourseGroupManager(RepositoryEntry courseRepoEntry) {
+		this.courseRepoEntry = courseRepoEntry;
+		this.courseResource = courseRepoEntry.getOlatResource();
+		areaManager = CoreSpringFactory.getImpl(BGAreaManager.class);
+		rightManager = CoreSpringFactory.getImpl(BGRightManager.class);
+		repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
+		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
+	}
+	
+	public void updateCourseEntry(RepositoryEntry courseEntry) {
+		this.courseRepoEntry = courseEntry;
+	}
 
 	@Override
 	public OLATResource getCourseResource() {
@@ -118,6 +131,10 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 	public static PersistingCourseGroupManager getInstance(OLATResource courseResource) {
 		return new PersistingCourseGroupManager(courseResource);
 	}
+	
+	public static PersistingCourseGroupManager getInstance(RepositoryEntry courseRepoEntry) {
+		return new PersistingCourseGroupManager(courseRepoEntry);
+	}
 
 	/**
 	 * @see org.olat.course.groupsandrights.CourseGroupManager#hasRight(org.olat.core.id.Identity,
diff --git a/src/main/java/org/olat/course/nodes/cal/CalEditController.java b/src/main/java/org/olat/course/nodes/cal/CalEditController.java
index bfdd6a44dad..bc11e32cfbe 100644
--- a/src/main/java/org/olat/course/nodes/cal/CalEditController.java
+++ b/src/main/java/org/olat/course/nodes/cal/CalEditController.java
@@ -27,7 +27,6 @@ import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.DateChooser;
-import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
@@ -66,7 +65,6 @@ public class CalEditController extends ActivateableTabbableDefaultController imp
 
 	private static final String CONFIG_START_DATE = "startDate";
 	private static final String CONFIG_AUTO_DATE = "autoDate";
-	private static final String CONFIG_AUTO_SUBSCRIBE = "autoSubscribe";
 
 	private static final String[] paneKeys = { PANE_TAB_CALCONFIG, PANE_TAB_ACCESSIBILITY };
 
@@ -218,20 +216,9 @@ public class CalEditController extends ActivateableTabbableDefaultController imp
 		config.setStringValue(CONFIG_AUTO_DATE, Boolean.toString(autoDate));
 	}
 
-	public static boolean getAutoSubscribe(ModuleConfiguration config) {
-		String autoStr = config.getStringValue(CONFIG_AUTO_SUBSCRIBE);
-		if (StringHelper.containsNonWhitespace(autoStr)) { return new Boolean(autoStr); }
-		return Boolean.FALSE;
-	}
-
-	public static void setAutoSubscribe(ModuleConfiguration config, boolean subscribe) {
-		config.setStringValue(CONFIG_AUTO_SUBSCRIBE, Boolean.toString(subscribe));
-	}
-
 	private class DisplayConfigTabForm extends FormBasicController {
 		private DateChooser dateChooser;
 		private SingleSelection autoDateEl;
-		private MultipleSelectionElement autoSubscribeEl;
 		private ModuleConfiguration config;
 
 		public DisplayConfigTabForm(ModuleConfiguration config, UserRequest ureq, WindowControl wControl) {
@@ -262,14 +249,7 @@ public class CalEditController extends ActivateableTabbableDefaultController imp
 			dateChooser.setDate(selectedDate);
 			dateChooser.setVisible(!autoDate);
 			
-			boolean autoSubscribe = getAutoSubscribe(config);
-			String[] subscribesKeys = new String[]{""};
-			String[] subscribesValues = new String[]{translate("pane.tab.auto_subscribe.value")};
-			autoSubscribeEl = uifactory.addCheckboxesHorizontal("pane.tab.auto_subscribe", formLayout, subscribesKeys, subscribesValues);
-			autoSubscribeEl.select("", autoSubscribe);
-			autoSubscribeEl.setLabel("pane.tab.auto_subscribe", null);
-			
-		// Create submit and cancel buttons
+			// Create submit and cancel buttons
 			final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator());
 			formLayout.add(buttonLayout);
 			uifactory.addFormSubmitButton("save", buttonLayout);
@@ -293,7 +273,6 @@ public class CalEditController extends ActivateableTabbableDefaultController imp
 		protected void formOK(UserRequest ureq) {
 			setStartDate(config, getDate());
 			setAutoDate(config, isAutoDate());
-			setAutoSubscribe(config, isAutoSubscribe());
 			fireEvent(ureq, Event.DONE_EVENT);
 		}
 
@@ -304,9 +283,5 @@ public class CalEditController extends ActivateableTabbableDefaultController imp
 		public boolean isAutoDate() {
 			return autoDateEl.isSelected(0);
 		}
-
-		public boolean isAutoSubscribe() {
-			return autoSubscribeEl.isSelected(0);
-		}
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/cal/CalRunController.java b/src/main/java/org/olat/course/nodes/cal/CalRunController.java
index a09568e0c7d..9a5fde2acdf 100644
--- a/src/main/java/org/olat/course/nodes/cal/CalRunController.java
+++ b/src/main/java/org/olat/course/nodes/cal/CalRunController.java
@@ -22,8 +22,6 @@ package org.olat.course.nodes.cal;
 
 import java.util.Date;
 
-import org.olat.commons.calendar.CalendarManager;
-import org.olat.commons.calendar.ui.events.KalendarModifiedEvent;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
 import org.olat.core.gui.UserRequest;
@@ -38,11 +36,9 @@ import org.olat.core.gui.control.generic.clone.CloneController;
 import org.olat.core.gui.control.generic.clone.CloneLayoutControllerCreatorCallback;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.ContextEntry;
-import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.nodes.CalCourseNode;
-import org.olat.course.run.calendar.CourseCalendarSubscription;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.modules.ModuleConfiguration;
@@ -77,17 +73,9 @@ public class CalRunController extends BasicController {
 		this.config = calCourseNode.getModuleConfiguration();
 		mainVC = createVelocityContainer("run");
 
-		ICourse course = CourseFactory.loadCourse(cenv.getCourseResourceableId());
+		ICourse course = CourseFactory.loadCourse(cenv.getCourseGroupManager().getCourseEntry());
 		CourseCalendars myCal = CourseCalendars.createCourseCalendarsWrapper(ureq, wControl, course, ne);
-		CourseCalendarSubscription calSubscription = myCal.createSubscription(ureq);
-		if(CalEditController.getAutoSubscribe(config)) {
-			if(!calSubscription.isSubscribed()) {
-				calSubscription.subscribe(false);
-				ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(new KalendarModifiedEvent(), OresHelper.lookupType(CalendarManager.class));
-			}
-		}
-		
-		calCtr = new CourseCalendarController(ureq, wControl, myCal, calSubscription, course, ne);
+		calCtr = new CourseCalendarController(ureq, wControl, myCal, course, ne);
 
 		boolean focused = false;
 		ContextEntry ce = wControl.getBusinessControl().popLauncherContextEntry();
@@ -115,8 +103,8 @@ public class CalRunController extends BasicController {
 		}
 
 		CloneLayoutControllerCreatorCallback clccc = new CloneLayoutControllerCreatorCallback() {
-			public ControllerCreator createLayoutControllerCreator(UserRequest ureq, final ControllerCreator contentControllerCreator) {
-				return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(ureq, new ControllerCreator() {
+			public ControllerCreator createLayoutControllerCreator(UserRequest uureq, final ControllerCreator contentControllerCreator) {
+				return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(uureq, new ControllerCreator() {
 					@SuppressWarnings("synthetic-access")
 					public Controller createController(UserRequest lureq, WindowControl lwControl) {
 						// wrapp in column layout, popup window needs a layout controller
diff --git a/src/main/java/org/olat/course/nodes/cal/CourseCalendarController.java b/src/main/java/org/olat/course/nodes/cal/CourseCalendarController.java
index 5923f945f60..4330e3b79b7 100644
--- a/src/main/java/org/olat/course/nodes/cal/CourseCalendarController.java
+++ b/src/main/java/org/olat/course/nodes/cal/CourseCalendarController.java
@@ -57,15 +57,13 @@ public class CourseCalendarController extends DefaultController implements Clone
 	private List<KalendarRenderWrapper> calendars;
 
 	public CourseCalendarController(UserRequest ureq, WindowControl wControl, CourseCalendars myCal,
-			CourseCalendarSubscription calendarSubscription, OLATResourceable course, NodeEvaluation ne) {
+			OLATResourceable course, NodeEvaluation ne) {
 		super(wControl);
 		this.ores = course;
 		this.nodeEvaluation = ne;
 		calendars = myCal.getCalendars();
 		courseKalendarWrapper = myCal.getCourseKalendarWrapper();
-		calendarController = new WeeklyCalendarController(ureq, wControl, calendars, WeeklyCalendarController.CALLER_COURSE,
-				calendarSubscription, true);
-		calendarController.setEnableRemoveFromPersonalCalendar(false);
+		calendarController = new WeeklyCalendarController(ureq, wControl, calendars, WeeklyCalendarController.CALLER_COURSE, true);
 		setInitialComponent(calendarController.getInitialComponent());
 	}
 
@@ -112,10 +110,9 @@ public class CourseCalendarController extends DefaultController implements Clone
 	@Override
 	public Controller cloneController(UserRequest ureq, WindowControl wControl) {
 		CourseCalendars myCal = new CourseCalendars(courseKalendarWrapper, calendars);
-		CourseCalendarSubscription calSubscription = myCal.createSubscription(ureq);
-		
+
 		Date focus = calendarController.getFocus();
-		CourseCalendarController ctrl = new CourseCalendarController(ureq, wControl, myCal, calSubscription, ores, nodeEvaluation);
+		CourseCalendarController ctrl = new CourseCalendarController(ureq, wControl, myCal, ores, nodeEvaluation);
 		ctrl.calendarController.setFocus(focus);
 		return ctrl;
 	}
diff --git a/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java b/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java
index 9e27481998d..746d12cedd0 100644
--- a/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java
+++ b/src/main/java/org/olat/course/nodes/cal/CourseCalendars.java
@@ -77,7 +77,7 @@ public class CourseCalendars {
 		return courseKalendarWrapper.getKalendar();
 	}
 
-	public CourseCalendarSubscription createSubscription(UserRequest ureq) {
+	public CourseCalendarSubscription createSubscription2(UserRequest ureq) {
 		CourseCalendarSubscription calSubscription = new CourseCalendarSubscription(getKalendar(), ureq.getUserSession().getGuiPreferences());
 		return calSubscription;
 	}
diff --git a/src/main/java/org/olat/course/nodes/cal/_chelp/caledit.html b/src/main/java/org/olat/course/nodes/cal/_chelp/caledit.html
index d8b92924990..0552193629d 100644
--- a/src/main/java/org/olat/course/nodes/cal/_chelp/caledit.html
+++ b/src/main/java/org/olat/course/nodes/cal/_chelp/caledit.html
@@ -1,7 +1,2 @@
- <br/>
-	$r.translate("chelp.caledit.intro")
- <br/> <br/>
-
-	$r.translate("chelp.caledit.date")
- <br/> <br/>
-	$r.translate("chelp.caledit.autosubscribe")
+<p>$r.translate("chelp.caledit.intro")</p>
+<p>$r.translate("chelp.caledit.date")</p>
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ar.properties
index 6dc76ea8c64..d447beb7ea4 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ar.properties
@@ -4,7 +4,6 @@ calendar.noEvents=\u0644\u0627 \u062A\u0648\u062C\u062F \u0623\u062D\u062F\u0627
 calendar.subject=\u0627\u0644\u0648\u0635\u0641
 calendar.title=\u062A\u0642\u0648\u064A\u0645
 calendar.today=\u0627\u0644\u064A\u0648\u0645
-chelp.caledit.autosubscribe=\u0625\u0630\u0627 \u0643\u0627\u0646 \u064A\u0646\u0628\u063A\u0649 \u0639\u0631\u0636 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u062E\u0627\u0635 \u0628\u0627\u0644\u0645\u0642\u0631\u0631 \u0641\u0649 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B \u0641\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629 \u0644\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u060C \u0648\u0645\u0646 \u062E\u0644\u0627\u0644 <i>$\:pane.tab.auto_subscribe</i> \u064A\u0631\u062C\u0649 \u0627\u062E\u062A\u064A\u0627\u0631\r\n\u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0641\u0625\u0646 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u062E\u0627\u0635 \u0628\u0627\u0644\u0645\u0642\u0631\u0631 \u0633\u064A\u062A\u0645 \u0625\u0636\u0627\u0641\u062A\u0647 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B \u0625\u0644\u0649 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0634\u062E\u0635\u0649 \u060C \u0648\u0645\u0646 \u062B\u0645 \u064A\u0645\u0643\u0646 \u0644\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0625\u0637\u0644\u0627\u0639 \u0639\u0644\u064A\u0647 \u0639\u0646\u062F \u0641\u062A\u062D \u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631.
 chelp.caledit.date=\u0644\u0639\u0631\u0636 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u062D\u0627\u0644\u0649 (\u0627\u0644\u064A\u0648\u0645)\u060C \u0639\u0644\u0627\u0648\u0629 \u0639\u0644\u0649 \u0630\u0644\u0643 \u064A\u0645\u0643\u0646\u0643 \u0639\u0645\u0644 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0645\u0633\u0628\u0642\u0629 \u0644\u0639\u0631\u0636 \u062A\u0627\u0631\u064A\u062E \u0645\u0639\u064A\u0646  <i>$\:pane.tab.auto_date</i> \u064A\u0631\u062C\u0649 \u0627\u062E\u062A\u064A\u0627\u0631\r\n(\u0639\u0644\u0649 \u0633\u0628\u064A\u0644 \u0627\u0644\u0645\u062B\u0627\u0644\: \u0645\u064A\u0639\u0627\u062F \u0627\u0644\u0633\u064A\u0645\u064A\u0646\u0627\u0631 \u0627\u0644\u0623\u0633\u0628\u0648\u0639\u0649) \u0645\u0646 \u062E\u0644\u0627\u0644 \u0627\u062E\u062A\u064A\u0627\u0631\r\n<i>$\:pane.tab.manual_date</i>
 chelp.caledit.intro=\u064A\u0648\u0641\u0631 \u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 "\u0627\u0644\u062A\u0642\u0648\u064A\u0645" \u0625\u0645\u0643\u0627\u0646\u064A\u0629 \u062F\u0645\u062C \u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0645\u0642\u0631\u0631 \u062F\u0627\u062E\u0644 \u0647\u064A\u0643\u0644 \u0627\u0644\u0645\u0642\u0631\u0631\u060C \u0648\u064A\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0639\u0646\u0635\u0631 \u0628\u062F\u064A\u0644\u0627\u064B \u0639\u0646 \u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0630\u0649 \u064A\u0645\u0643\u0646 \u0641\u062A\u062D\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 \u0645\u0631\u0628\u0639 \u0627\u0644\u0623\u062F\u0627\u0629 \u0639\u0644\u0649 \u0627\u0644\u062C\u0627\u0646\u0628 \u0627\u0644\u0623\u064A\u0645\u0646.
 chelp.caledit.title=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0639\u0646\u0635\u0631 \u0627\u0644\u062A\u0642\u0648\u064A\u0645
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=\u0645\u0633\u0627\u0639\u062F\u0629 \u0628\u0634\u0623\u0
 help.hover.calendar=\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0639\u0646 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0639\u0646\u0635\u0631 \u0627\u0644\u062A\u0642\u0648\u064A\u0645
 pane.tab.accessibility=\u0648\u0635\u0648\u0644
 pane.tab.auto_date=\u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u062D\u0627\u0644\u0649
-pane.tab.auto_subscribe=\u0623\u0636\u0641 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629
-pane.tab.auto_subscribe.value=\u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B \u0625\u0644\u0649 \u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0634\u062E\u0635\u0649
 pane.tab.calconfig=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u062A\u0642\u0648\u064A\u0645
 pane.tab.calconfigdesc=\u0625\u0639\u0640\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u062A\u0642\u0648\u064A\u0645
 pane.tab.manual_date=\u062D\u062F\u062F \u062A\u0627\u0631\u064A\u062E \u062B\u0627\u0628\u062A
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_de.properties
index 6470bb3aad1..f1ddd6020c5 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_de.properties
@@ -4,8 +4,6 @@ pane.tab.calconfigdesc=Kalendereinstellungen
 pane.tab.start_date=Angezeigtes Datum
 pane.tab.auto_date=Aktuelles Datum
 pane.tab.manual_date=Datum fest w\u00E4hlen
-pane.tab.auto_subscribe=In Home integrieren
-pane.tab.auto_subscribe.value=Diesen Kalender bei Ansicht automatisch zum pers\u00F6nlichen Kalender der Benutzer hinzuf\u00FCgen
 pane.tab.accessibility=Zugang
 calendar.title=Kalender
 calendar.today=Heute
@@ -20,4 +18,3 @@ help.hover.cal.acc=Hilfe, um Leserechte im Kalenderbaustein zu konfigurieren
 chelp.caledit.title=Kalenderbaustein: Konfiguration
 chelp.caledit.intro=Der Kursbaustein Kalender bietet die M\u00F6glichkeit, den Kurskalender in der Kursstruktur einzubetten. Der Kursbaustein bietet eine alternative Sicht auf den Kurskalender, welcher auch rechts über die Werkzeugbox geöffnet werden kann. 
 chelp.caledit.date=Unter "$\:pane.tab.auto_date" k\u00F6nnen Sie w\u00E4hlen, ob die aktuelle Kalenderwoche oder eine fest vorgegebenes Datum wie z.B. die jeweilige Seminarwoche angezeigt wird.
-chelp.caledit.autosubscribe=W\u00E4hlen Sie die Option "$\:pane.tab.auto_subscribe", wenn der Kurskalender automatisch im Home der Benutzer angezeigt werden soll. Normalerweise muss der Benutzer diese Aktion h\u00E4ndisch vornehmen. Mit dieser Option entf\u00E4llt dieser Schritt und der Kurskalender wird automatisch zum pers\u00F6nlichen Kalender hinzugef\u00FCgt sobald ein Benutzer diesen Kursbaustein aufruft.
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_el.properties
index f55cb76f7c3..6ae0d103790 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_el.properties
@@ -4,7 +4,6 @@ calendar.noEvents=\u0394\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\
 calendar.subject=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE
 calendar.title=\u0397\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF
 calendar.today=\u03A3\u03AE\u03BC\u03B5\u03C1\u03B1
-chelp.caledit.autosubscribe=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE <i>$\:pane.tab.auto_subscribe</i> \u03B1\u03BD \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BD\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03B7\u03BD \u03B1\u03C1\u03C7\u03B9\u03BA\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03C4\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7. \u03A3\u03C5\u03BD\u03AE\u03B8\u03C9\u03C2 \u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03BF \u03BA\u03AC\u03BD\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC \u03C7\u03B5\u03B9\u03C1\u03BF\u03BA\u03AF\u03BD\u03B7\u03C4\u03B1. \u039C\u03B5 \u03C4\u03B7\u03BD \u03B5\u03BD \u03BB\u03CC\u03B3\u03C9 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE, \u03B1\u03C5\u03C4\u03AE \u03B7 \u03B4\u03B9\u03B1\u03B4\u03B9\u03BA\u03B1\u03C3\u03AF\u03B1 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C0\u03B1\u03C1\u03B1\u03BB\u03B5\u03B9\u03C6\u03B8\u03B5\u03AF. \u03A4\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B8\u03B1 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03B5\u03AF \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03BF \u03C0\u03C1\u03BF\u03C3\u03C9\u03C0\u03B9\u03BA\u03CC \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03B1\u03BC\u03AD\u03C3\u03C9\u03C2 \u03BC\u03CC\u03BB\u03B9\u03C2 \u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03BD\u03BF\u03AF\u03BE\u03B5\u03B9 \u03B5\u03BA\u03B5\u03AF\u03BD\u03BF \u03C4\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2.
 chelp.caledit.date=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 <i>$\:pane.tab.auto_date</i> \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03B9\u03C3\u03C4\u03B5\u03AF \u03B7 \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 (\u03C3\u03AE\u03BC\u03B5\u03C1\u03B1). \u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03AC, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03C1\u03BF\u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03B9\u03C3\u03C4\u03B5\u03AF \u03BC\u03B9\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03B3\u03B9\u03B1 \u03C4\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF (\u03C0.\u03C7. \u03C4\u03B7\u03BD \u03B5\u03B2\u03B4\u03BF\u03BC\u03AC\u03B4\u03B1 \u03B5\u03BD\u03CC\u03C2 \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03B5\u03BC\u03B9\u03BD\u03B1\u03C1\u03AF\u03BF\u03C5) \u03B5\u03C0\u03B9\u03BB\u03AD\u03B3\u03BF\u03BD\u03C4\u03B1\u03C2 <i>$\:pane.tab.manual_date</i>
 chelp.caledit.intro=\u03A4\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 "\u0397\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF" \u03C0\u03C1\u03BF\u03C3\u03C6\u03AD\u03C1\u03B5\u03B9 \u03C4\u03B7 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BD\u03B1 \u03B5\u03BD\u03C3\u03C9\u03BC\u03B1\u03C4\u03CE\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03B7 \u03B4\u03BF\u03BC\u03AE \u03C4\u03BF\u03C5 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2. \u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03B1 \u03B5\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03AE \u03C4\u03BF\u03C5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2, \u03C4\u03BF \u03BF\u03C0\u03BF\u03AF\u03BF \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 \u03BD\u03B1 \u03B1\u03BD\u03BF\u03B9\u03C7\u03C4\u03B5\u03AF \u03BC\u03AD\u03C3\u03C9 \u03C4\u03BF\u03C5 \u03BA\u03BF\u03C5\u03C4\u03B9\u03BF\u03CD \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD \u03C3\u03C4\u03B1 \u03B4\u03B5\u03BE\u03B9\u03AC \u03C3\u03B1\u03C2.
 chelp.caledit.title=\u0394\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 \u0397\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=\u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1 \u03C3\u03C4\u0
 help.hover.calendar=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5
 pane.tab.accessibility=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7
 pane.tab.auto_date=\u03A4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1
-pane.tab.auto_subscribe=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B1\u03C1\u03C7\u03B9\u03BA\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1
-pane.tab.auto_subscribe.value=\u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C3\u03B7 \u03B1\u03C5\u03C4\u03BF\u03CD \u03C4\u03BF\u03C5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03BF \u03C0\u03C1\u03BF\u03C3\u03C9\u03C0\u03B9\u03BA\u03CC \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF \u03C4\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BC\u03B5\u03C4\u03AC \u03C4\u03BF \u03AC\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1
 pane.tab.calconfig=\u0394\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5
 pane.tab.calconfigdesc=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5
 pane.tab.manual_date=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C3\u03C4\u03B1\u03B8\u03B5\u03C1\u03AE\u03C2 \u03B7\u03BC/\u03BD\u03AF\u03B1\u03C2
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_en.properties
index c2fc302d60a..90d4f49c454 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_en.properties
@@ -4,7 +4,6 @@ calendar.noEvents=No events for indicated period
 calendar.subject=Description
 calendar.title=Calendar
 calendar.today=Today
-chelp.caledit.autosubscribe=Please select the option "$\:pane.tab.auto_subscribe" if the course calendar should be displayed automtatically on the user's home page. Usually the user has to do this manually. By selecting the said option this procedure can be omitted; the course calendar will be added automatically to the personal calendar as soon as its user opens that course element.
 chelp.caledit.date=When selecting "$\:pane.tab.auto_date" you can determine if you want to display the current calendar week or a preset a date (e.g. the week of a certain seminar).
 chelp.caledit.intro=The course element "Calendar" offers the possibility to imbed a course calender into the course's structure. This element is an alternative to the course calendar that can also be opened by means of the tool box on your right.
 chelp.caledit.title=Calendar element\: configuration
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=Help to configure write access within calendar element
 help.hover.calendar=Help regarding the calendar element's configuration
 pane.tab.accessibility=Access
 pane.tab.auto_date=Current date
-pane.tab.auto_subscribe=Add to home page
-pane.tab.auto_subscribe.value=Add this calendar automatically to the user's personal calendar after opening
 pane.tab.calconfig=Calendar configuration
 pane.tab.calconfigdesc=Calendar settings
 pane.tab.manual_date=Select fixed date
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_fr.properties
index 419cdec241b..83fc0a579bb 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_fr.properties
@@ -4,7 +4,6 @@ calendar.noEvents=Pas de rendez-vous dans la p\u00E9riode indiqu\u00E9e
 calendar.subject=Description
 calendar.title=Calendrier
 calendar.today=Aujourd'hui
-chelp.caledit.autosubscribe=Choisissez l'option <i>$\:pane.tab.auto_subscribe</i> si le calendrier doit \u00EAtre affich\u00E9 automatiquement dans la page d'accueil de l'utilisateur. Normalement, l'utilisateur doit effectuer cette op\u00E9ration manuellement. Avec cette option, cette \u00E9tape est \u00E9limin\u00E9e et le calendrier du cours est ajout\u00E9 automatiquement \u00E0 votre calendrier personnel d\u00E8s qu'un utilisateur ouvre cet \u00E9l\u00E9ment de cours.
 chelp.caledit.date=S\u00E9lectionnez <i>$\:pane.tab.auto_date</i>  pour afficher la date actuelle (aujourd'hui). Vous pouvez \u00E9galement indiquer un date pour l'affichage du calendrier, p.ex. la semaine du s\u00E9minaire) en s\u00E9lectionnant <i>$\:pane.tab.manual_date</i>.
 chelp.caledit.intro=L'\u00E9l\u00E9ment de cours calendrier permet d'int\u00E9grer le calendrier dans la structure de cours. L'\u00E9l\u00E9ment de cours propose un vue alternative sur le calendrier de cours, qui peut aussi \u00EAtre ouverte par la bo\u00EEte \u00E0 outils \u00E0 droite.
 chelp.caledit.title=Configurer l'\u00E9l\u00E9ment "Calendrier"
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=Aide \u00E0 la configuration des droits d'\u00E9criture da
 help.hover.calendar=Aide \u00E0 la configuration de l'\u00E9l\u00E9ment "Calendrier"
 pane.tab.accessibility=Acc\u00E8s
 pane.tab.auto_date=Date actuelle
-pane.tab.auto_subscribe=Int\u00E9grer \u00E0 l'acceuil
-pane.tab.auto_subscribe.value=Ajouter ce calendrier automatiquement au calendrier personnel de l'utilisateur lors de sa consultation
 pane.tab.calconfig=Configuration du calendrier
 pane.tab.calconfigdesc=R\u00E9glages du calendrier
 pane.tab.manual_date=Choisir une date fixe
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_it.properties
index da14a08504b..e3a457c04a9 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_it.properties
@@ -4,7 +4,6 @@ calendar.noEvents=Nessun impegno nel periodo indicato
 calendar.subject=Descrizione
 calendar.title=Calendario
 calendar.today=Oggi
-chelp.caledit.autosubscribe=Selezioni l'opzione <i>$\:pane.tab.auto_subscribe</i> se il calendario deve essere mostrato automaticamente nella pagina iniziale degli utenti. Normalmente questa azione deve essere eseguita manualmente dall'utente. Questa opzione rende superflua la procedura manuale e il calendario di corso viene aggiunto automaticamente al calendario personale non appena un utente apre questo elemento di corso.
 chelp.caledit.date=Selezioni <i>$\:pane.tab.auto_date</i> per visualizzare la data attuale (oggi). Pu\u00F2 anche selezionare <i>$\:pane.tab.manual_date</i> per indicare un periodo da visualizzare nel calendario (ad es. la settimana in cui si svolge un seminario).
 chelp.caledit.intro=L'elemento di corso "Calendario" permette di integrare il calendario di corso nella struttura del corso. Questo elemento di corso \u00E8 un'alternativa al calendario di corso, che pu\u00F2 essere aperto anche attraverso il quadro degli strumenti a destra.
 chelp.caledit.title=Configurare l'elemento "Calendario"
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=Aiuto per la configurazione dei diritti di scrittura nell'
 help.hover.calendar=Aiuto per la configurazione dell'elemento "Calendario"
 pane.tab.accessibility=Accesso
 pane.tab.auto_date=Data attuale
-pane.tab.auto_subscribe=Integrare in pagina iniziale
-pane.tab.auto_subscribe.value=Aggiungere automaticamente questo calendario al calendario personale degli utenti quando questi aprono il corso.
 pane.tab.calconfig=Configurazione calendario
 pane.tab.calconfigdesc=Impostazioni calendario
 pane.tab.manual_date=Selezionare data fissa
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_jp.properties
index 8251787ed79..864a9f1765b 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_jp.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_jp.properties
@@ -12,8 +12,6 @@ help.hover.cal.acc.rw=\u30AB\u30EC\u30F3\u30C0\u30FC\u30A8\u30EC\u30E1\u30F3\u30
 help.hover.calendar=\u30AB\u30EC\u30F3\u30C0\u30FC\u8981\u7D20\u8A2D\u5B9A\u306E\u60C5\u5831
 pane.tab.accessibility=\u30A2\u30AF\u30BB\u30B9
 pane.tab.auto_date=\u73FE\u5728\u306E\u65E5\u4ED8
-pane.tab.auto_subscribe=\u30DB\u30FC\u30E0\u30DA\u30FC\u30B8\u306B\u8FFD\u52A0\u3059\u308B
-pane.tab.auto_subscribe.value=\u30E6\u30FC\u30B6\u304C\u30D1\u30FC\u30BD\u30CA\u30EB\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u958B\u3044\u305F\u5F8C\u3001\u3053\u306E\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u81EA\u52D5\u7684\u306B\u8FFD\u52A0\u3059\u308B
 pane.tab.calconfig=\u30AB\u30EC\u30F3\u30C0\u30FC\u8A2D\u5B9A
 pane.tab.calconfigdesc=\u30AB\u30EC\u30F3\u30C0\u30FC\u8A2D\u5B9A
 pane.tab.manual_date=\u6307\u5B9A\u65E5\u3092\u9078\u629E\u3059\u308B
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_nl_NL.properties
index 60b83890139..a120ee971f1 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_nl_NL.properties
@@ -4,7 +4,6 @@ calendar.noEvents=Geen gebeurtenis voor aangegeven periode
 calendar.subject=Beschrijving
 calendar.title=Kalender
 calendar.today=Vandaag
-chelp.caledit.autosubscribe=Gelieve de optie "$\:pane.tab.auto_subscribe" te selecteren als de cursuskalender automatisch getoond moet worden op de homepagina van de gebruiker. Normaal gezien moet de gebruiker dit zelf instellen. Door de aangegeven optie uit te voeren, kan deze procedure achterwege blijven; De cursuskalender zal automatisch toegevoegd worden aan de persoonlijke kalender zo snel als zijn gebruiker dat cursuselement opent.
 chelp.caledit.date=Wanneer u "$\:pane.tab.auto_date" selecteert, kan u bepalen of u de huidiege kalenderweek wilt tonen, of een vooraf ingestelde datum (b.v. de week van een zekere seminarie).
 chelp.caledit.intro=Het cursuselement "Kalender" biedt de mogelijkheid on een cursuskalender vast te zetten in de cursusstructuur. Dit element is een alternatief voor de cursuskalender die ook geopend kan worden doormiddel van de werktuigkist aan uw rechterkant.
 chelp.caledit.title=Kalender-element\: configuratie
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=Help de schrijftoegang binnen een kalender-element te conf
 help.hover.calendar=Hulp betreffende de configuratie van kalenderelementen
 pane.tab.accessibility=Toegang
 pane.tab.auto_date=Huidige datum
-pane.tab.auto_subscribe=Aan homepagina toevoegen
-pane.tab.auto_subscribe.value=Voeg deze kalender automatisch toe aan de gebruiker's persoonlijke kalender na opening.
 pane.tab.calconfig=Kalender configuratie
 pane.tab.calconfigdesc=Kalender instellingen
 pane.tab.manual_date=Selecteer bepaalde datum
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pl.properties
index d5b9f51a4e7..786ae81dbfa 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pl.properties
@@ -11,8 +11,6 @@ help.hover.cal.acc.rw=Pomoc dotycz\u0105ca konfiguracji uprawnie\u0144 zapisu we
 help.hover.calendar=Informacje na temat konfiguracji elementu kalendarza
 pane.tab.accessibility=Dost\u0119p
 pane.tab.auto_date=Aktualna data
-pane.tab.auto_subscribe=Dodaj do strony g\u0142\u00F3wnej
-pane.tab.auto_subscribe.value=Po otwarciu tego kalendarza, dodaj go automatycznie do osobistego kalendarza u\u017Cytkownika.
 pane.tab.calconfig=Konfiguracja kalendarza
 pane.tab.calconfigdesc=Ustawienia kalendarza
 pane.tab.manual_date=Wybierz okre\u015Blon\u0105 dat\u0119
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pt_BR.properties
index c44659f9dc4..6ff97738d53 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_pt_BR.properties
@@ -4,7 +4,6 @@ calendar.noEvents=Acesso ao "Feed" como leitor
 calendar.subject=Acesso ao "Feed" como escritor
 calendar.title=O acesso como o apresentador lhe permite ler, comentar, editar, apagar ou criar entradas. Al\u00E9m disso, os apresentadores podem modificar o t\u00EDtulo e descri\u00E7\u00E3o do "Feed".
 calendar.today=O acesso como o leitor lhe permite ler e comentar todas as entradas publicadas. No entanto, voc\u00EA n\u00E3o pode criar suas pr\u00F3prias entradas.
-chelp.caledit.autosubscribe=O acesso como apresentador lhe permite ler e comentar as entradas existentes, bem como criar novas. Entradas, uma vez criadas, n\u00E3o podem ser modificadas ou exclu\u00EDdas mais tarde.
 chelp.caledit.date=Inativo
 chelp.caledit.intro=Apenas conte\u00FAdo
 chelp.caledit.title=Mostrar
@@ -15,8 +14,6 @@ help.hover.cal.acc.rw=Ajuda para configurar o acesso a escrita dentro do calend\
 help.hover.calendar=No caso de voc\u00EA desbloquear o seu curso para usu\u00E1rios registrados ou visitantes n\u00E3o se esque\u00E7a de indicar isso no cat\u00E1logo sob o t\u00EDtulo correspondente.
 pane.tab.accessibility=Estat\u00EDstica
 pane.tab.auto_date=Blog
-pane.tab.auto_subscribe=Check list
-pane.tab.auto_subscribe.value=Podcast
 pane.tab.calconfig=Configura\u00E7\u00E3o do calend\u00E1rio
 pane.tab.calconfigdesc=Configura\u00E7\u00F5es da calend\u00E1rio
 pane.tab.manual_date=Selecione a data fixada
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ru.properties
index 61f695962be..00eb1a90141 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ru.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_ru.properties
@@ -6,7 +6,6 @@ calendar.title=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C
 calendar.today=\u0421\u0435\u0433\u043E\u0434\u043D\u044F
 pane.tab.accessibility=\u0414\u043E\u0441\u0442\u0443\u043F
 pane.tab.auto_date=\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0434\u0430\u0442\u0430
-pane.tab.auto_subscribe=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0430 \u0434\u043E\u043C\u0430\u0448\u043D\u044E\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443
 pane.tab.calconfig=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C
 pane.tab.calconfigdesc=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044F
 pane.tab.manual_date=\u0412\u044B\u0431\u043E\u0440 \u0434\u0430\u0442\u044B
diff --git a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_zh_CN.properties
index 8bea4e7e293..0feb26c87a6 100644
--- a/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/course/nodes/cal/_i18n/LocalStrings_zh_CN.properties
@@ -4,7 +4,6 @@ calendar.noEvents=\u60A8\u60F3\u8981\u4E86\u89E3\u7684\u65F6\u95F4\u6BB5\u5185\u
 calendar.subject=\u63CF\u8FF0
 calendar.title=\u65E5\u5386
 calendar.today=\u4ECA\u5929
-chelp.caledit.autosubscribe=\u5982\u679C\u60A8\u5E0C\u671B\u5728\u7528\u6237\u7684\u9996\u9875\u4E0A\u81EA\u52A8\u663E\u793A\u6B64\u5B66\u7A0B\u65E5\u5386\uFF0C\u8BF7\u9009\u62E9\u9009\u9879\uFF1A<i>$\:pane.tab.auto_subscribe</i>\u3002\u901A\u5E38\u6765\u8BF4\uFF0C\u7528\u6237\u9700\u8981\u624B\u52A8\u64CD\u4F5C\u6B64\u9009\u9879\u3002\u4F46\u662F\u5982\u679C\u901A\u8FC7\u9009\u62E9\u8BE5\u9009\u9879\uFF0C\u8FD9\u4E2A\u7A0B\u5E8F\u5C31\u80FD\u591F\u88AB\u7701\u7565\uFF1B\u53EA\u8981\u7528\u6237\u4E00\u6253\u5F00\u90A3\u4E2A\u5B66\u7A0B\u5143\u7D20\uFF0C\u8FD9\u4E2A\u5B66\u7A0B\u65E5\u5386\u5C31\u4F1A\u81EA\u52A8\u88C5\u8F7D\u5230\u4E2A\u4EBA\u65E5\u5386\u4E2D\u3002
 chelp.caledit.date=\u8BF7\u9009\u62E9<i>$\:pane.tab.auto_date</i>\u4EE5\u663E\u793A\u5F53\u524D\u65E5\u671F(\u4ECA\u5929)\u3002\u53E6\u5916\uFF0C\u60A8\u4E5F\u53EF\u4EE5\u901A\u8FC7\u9009\u62E9<i>$\:pane.tab.manual_date</i>\u4E3A\u8981\u663E\u793A\u7684\u65E5\u5386\u8FDB\u884C\u9884\u8BBE\u65F6\u95F4\u3002(\u4F8B\u5982\uFF1A\u7279\u5B9A\u7814\u8BA8\u4F1A\u7684\u4E8E\u54EA\u5468\u5F00\u59CB)
 chelp.caledit.intro=\u5B66\u7A0B\u5143\u7D20\u7684\u201C\u65E5\u5386\u201D\u80FD\u5D4C\u5165\u5B66\u7A0B\u7ED3\u6784\u7684\u5B66\u7A0B\u65E5\u5386\u4E2D\u3002\u6B64\u5143\u7D20\u5E76\u975E\u5FC5\u987B\u52A0\u5165\u5B66\u7A0B\u65E5\u5386\uFF0C\u540C\u6837\uFF0C\u5B66\u7A0B\u65E5\u5386\u4E5F\u53EF\u4EE5\u901A\u8FC7\u60A8\u53F3\u8FB9\u7684\u5DE5\u5177\u7BB1\u6253\u5F00\u3002
 chelp.caledit.title=\u914D\u7F6E\u65E5\u5386\u5143\u7D20
@@ -13,8 +12,6 @@ condition.editable.title=\u521B\u5EFA/\u7F16\u8F91\u4E8B\u4EF6
 help.hover.calendar=\u65E5\u5386\u5143\u7D20\u7684\u914D\u7F6E\u4FE1\u606F
 pane.tab.accessibility=\u8BBF\u95EE
 pane.tab.auto_date=\u5F53\u524D\u65E5\u671F
-pane.tab.auto_subscribe=\u6DFB\u52A0\u5230\u9996\u9875
-pane.tab.auto_subscribe.value=\u6253\u5F00\u65E5\u5386\u540E\uFF0C\u81EA\u52A8\u6DFB\u52A0\u6B64\u65E5\u5386\u5230\u7528\u6237\u7684\u4E2A\u4EBA\u65E5\u5386\u4E2D
 pane.tab.calconfig=\u914D\u7F6E\u65E5\u5386
 pane.tab.calconfigdesc=\u65E5\u5386\u8BBE\u7F6E
 pane.tab.manual_date=\u9009\u62E9\u56FA\u5B9A\u7684\u65E5\u671F
diff --git a/src/main/java/org/olat/course/nodes/gta/rule/AbstractDueDateTaskRuleSPI.java b/src/main/java/org/olat/course/nodes/gta/rule/AbstractDueDateTaskRuleSPI.java
index 1f8f8c34f1c..efe6b98c5b2 100644
--- a/src/main/java/org/olat/course/nodes/gta/rule/AbstractDueDateTaskRuleSPI.java
+++ b/src/main/java/org/olat/course/nodes/gta/rule/AbstractDueDateTaskRuleSPI.java
@@ -80,7 +80,7 @@ public abstract class AbstractDueDateTaskRuleSPI implements IdentitiesProviderRu
 			ReminderRuleImpl r = (ReminderRuleImpl)rule;
 			String nodeIdent = r.getLeftOperand();
 	
-			ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(entry);
 			CourseNode courseNode = course.getRunStructure().getNode(nodeIdent);
 			if(courseNode instanceof GTACourseNode) {
 				identities = evaluateRule(entry, (GTACourseNode)courseNode, r);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/BeforeDateTaskRuleEditor.java b/src/main/java/org/olat/course/nodes/gta/ui/BeforeDateTaskRuleEditor.java
index 81bc2ed4e78..01e275aea9b 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/BeforeDateTaskRuleEditor.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/BeforeDateTaskRuleEditor.java
@@ -86,7 +86,7 @@ public class BeforeDateTaskRuleEditor extends RuleEditorFragment {
 		ruleCont.setTranslator(trans);
 		formLayout.add(ruleCont);
 		
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(entry);
 
 		String currentValue = null;
 		String currentUnit = null;
diff --git a/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java
index d204cc5d8fd..071d69bac41 100644
--- a/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java
@@ -79,7 +79,7 @@ public class AttemptsRuleSPI implements FilterRuleSPI {
 			String operator = r.getOperator();
 			int value = Integer.parseInt(r.getRightOperand());
 			
-			ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(entry);
 			CourseNode courseNode = course.getRunStructure().getNode(nodeIdent);
 
 			Map<Long, Integer> attempts = helperDao.getAttempts(entry.getOlatResource().getResourceableId(), courseNode, identities);
diff --git a/src/main/java/org/olat/course/reminder/ui/AttemptsRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/AttemptsRuleEditor.java
index 07726fc4185..82bf022d195 100644
--- a/src/main/java/org/olat/course/reminder/ui/AttemptsRuleEditor.java
+++ b/src/main/java/org/olat/course/reminder/ui/AttemptsRuleEditor.java
@@ -76,7 +76,7 @@ public class AttemptsRuleEditor extends RuleEditorFragment {
 		formLayout.add(ruleCont);
 		ruleCont.getFormItemComponent().contextPut("id", id);
 		
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(entry);
 		
 		
 		String currentValue = null;
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index c58980fe134..bde08ee11e9 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -221,7 +221,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	@Override
 	protected boolean isCorrupted(RepositoryEntry entry) {
 		try {
-			CourseFactory.loadCourse(entry.getOlatResource());
+			CourseFactory.loadCourse(entry);
 			return false;
 		} catch (Exception e) {
 			return true;
@@ -341,7 +341,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		toolbarPanel.removeAllTools();
 		if(corrupted) return;
 		
-		ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
+		ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 		UserCourseEnvironmentImpl uce = getUserCourseEnvironment();
 		if(!isAssessmentLock()) {
 			initTools(toolsDropdown, course, uce);
@@ -947,9 +947,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			popToRoot(ureq);
 			cleanUp();
 			
-			ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
 			CourseNode currentCourseNode = getCurrentCourseNode();
-			EditorMainController ctrl = CourseFactory.createEditorController(ureq, getWindowControl(), toolbarPanel, course, currentCourseNode);
+			EditorMainController ctrl = CourseFactory.createEditorController(ureq, getWindowControl(), toolbarPanel, getRepositoryEntry(), currentCourseNode);
 			//user activity logger which was initialized with course run
 			if(ctrl != null){
 				editorCtrl = pushController(ureq, "Editor", ctrl);
@@ -1037,7 +1036,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.layout || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) {
 				removeCustomCSS(ureq);
-				ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				boolean managedLayout = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.layout);
 				CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone();
 				CourseLayoutGeneratorController ctrl = new CourseLayoutGeneratorController(ureq, getWindowControl(), course, courseConfig,
@@ -1329,7 +1328,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 
 	private void launchChat(UserRequest ureq) {
 		boolean vip = reSecurity.isCourseCoach() || reSecurity.isGroupCoach() || reSecurity.isEntryAdmin();
-		ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
+		ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 		OpenInstantMessageEvent event = new OpenInstantMessageEvent(ureq, course, course.getCourseTitle(), vip);
 		ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(event, InstantMessagingService.TOWER_EVENT_ORES);
 	}
@@ -1338,7 +1337,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	private void launchCalendar(UserRequest ureq) {
 		ControllerCreator ctrlCreator = new ControllerCreator() {
 			public Controller createController(UserRequest lureq, WindowControl lwControl) {
-				ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(getRepositoryEntry());
 				WindowControl llwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, lwControl);
 				CourseCalendarController calendarController = new CourseCalendarController(lureq, llwControl, course);					
@@ -1382,7 +1381,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		// will not be disposed on course run dispose, popus up as new browserwindow
 		ControllerCreator ctrlCreator = new ControllerCreator() {
 			public Controller createController(UserRequest lureq, WindowControl lwControl) {
-				ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				Controller notesCtr = new NoteController(lureq, course, course.getCourseTitle(), lwControl);
 				LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, notesCtr);
 				layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), course.getCourseEnvironment()));
diff --git a/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java b/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java
index 15dd3c609c1..1f8420eaa74 100644
--- a/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java
+++ b/src/main/java/org/olat/course/run/calendar/CourseCalendarController.java
@@ -66,10 +66,8 @@ public class CourseCalendarController extends BasicController {
 		super(ureq, wControl);
 		this.ores = course;
 		List<KalendarRenderWrapper> calendars = getListOfCalendarWrappers(ureq);
-		CourseCalendarSubscription calendarSubscription = new CourseCalendarSubscription(
-				courseKalendarWrapper.getKalendar(), ureq.getUserSession().getGuiPreferences());
-		calendarController = new WeeklyCalendarController(
-				ureq, wControl, calendars, WeeklyCalendarController.CALLER_COURSE, calendarSubscription, true);
+		calendarController = new WeeklyCalendarController(ureq, wControl, calendars,
+				WeeklyCalendarController.CALLER_COURSE, true);
 		listenTo(calendarController);
 		putInitialPanel(calendarController.getInitialComponent());
 	}
diff --git a/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java b/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java
index a7dad723660..ff540d3f942 100644
--- a/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java
+++ b/src/main/java/org/olat/course/run/environment/CourseEnvironmentImpl.java
@@ -39,6 +39,7 @@ import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.groupsandrights.PersistingCourseGroupManager;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.properties.PersistingCoursePropertyManager;
+import org.olat.repository.RepositoryEntry;
 
 /**
  * Initial Date: 09.03.2004
@@ -47,9 +48,9 @@ import org.olat.course.properties.PersistingCoursePropertyManager;
  */
 public class CourseEnvironmentImpl implements CourseEnvironment {
 
-	private PersistingCourseImpl course;
-	private CourseGroupManager cgm;
-	private CoursePropertyManager propertyManager;
+	private final PersistingCourseImpl course;
+	private final PersistingCourseGroupManager cgm;
+	private final CoursePropertyManager propertyManager;
 	private AssessmentManager assessmentManager;
 	private UserNodeAuditManager auditManager;
 
@@ -63,6 +64,16 @@ public class CourseEnvironmentImpl implements CourseEnvironment {
 		this.propertyManager = PersistingCoursePropertyManager.getInstance(course);
 		this.cgm = PersistingCourseGroupManager.getInstance(course);
 	}
+	
+	public CourseEnvironmentImpl(PersistingCourseImpl course, RepositoryEntry courseEntry) {
+		this.course = course;
+		this.propertyManager = PersistingCoursePropertyManager.getInstance(course);
+		this.cgm = PersistingCourseGroupManager.getInstance(courseEntry);
+	}
+	
+	public void updateCourseEntry(RepositoryEntry courseEntry) {
+		cgm.updateCourseEntry(courseEntry);
+	}
 
 	/**
 	 * @see org.olat.course.run.environment.CourseEnvironment#getCurrentTimeMillis()
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
index 4c5733ee49a..929b0a8685c 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
@@ -395,7 +395,8 @@ public class BusinessGroupDAO {
 	public List<BusinessGroup> findBusinessGroup(Identity identity, int maxResults, BusinessGroupOrder... ordering) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select bgi from ").append(BusinessGroupImpl.class.getName()).append(" as bgi ")
-		  .append(" inner join bgi.baseGroup as baseGroup")
+		  .append(" inner join fetch bgi.resource as bgResource")
+		  .append(" inner join fetch bgi.baseGroup as baseGroup")
 		  .append(" where exists (select bmember from bgroupmember as bmember")
 		  .append("   where bmember.identity.key=:identKey and bmember.group=baseGroup and bmember.role in ('").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("')")
 		  .append(" )");
diff --git a/src/main/java/org/olat/home/HomeCalendarController.java b/src/main/java/org/olat/home/HomeCalendarController.java
index f189f467b6d..d14252aa559 100644
--- a/src/main/java/org/olat/home/HomeCalendarController.java
+++ b/src/main/java/org/olat/home/HomeCalendarController.java
@@ -22,27 +22,15 @@
 * This file has been modified by the OpenOLAT community. Changes are licensed
 * under the Apache 2.0 license as the original file.
 */
-
 package org.olat.home;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
-import org.olat.collaboration.CollaborationManager;
-import org.olat.collaboration.CollaborationTools;
 import org.olat.commons.calendar.CalendarManager;
-import org.olat.commons.calendar.CalendarManagerFactory;
-import org.olat.commons.calendar.CalendarModule;
-import org.olat.commons.calendar.ImportCalendarManager;
-import org.olat.commons.calendar.model.KalendarConfig;
 import org.olat.commons.calendar.ui.CalendarController;
 import org.olat.commons.calendar.ui.WeeklyCalendarController;
 import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.commons.calendar.ui.events.KalendarModifiedEvent;
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.Controller;
@@ -50,36 +38,21 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
-import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
 import org.olat.core.util.UserSession;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.course.CorruptedCourseException;
-import org.olat.course.CourseFactory;
-import org.olat.course.CourseModule;
-import org.olat.course.ICourse;
-import org.olat.course.groupsandrights.CourseGroupManager;
-import org.olat.course.groupsandrights.CourseRights;
-import org.olat.course.run.calendar.CourseCalendarSubscription;
-import org.olat.course.run.calendar.CourseLinkProviderController;
-import org.olat.group.BusinessGroup;
-import org.olat.group.BusinessGroupService;
-import org.olat.group.model.SearchBusinessGroupParams;
-import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 public class HomeCalendarController extends BasicController implements Activateable2, GenericEventListener {
-
-	private static final OLog log = Tracing.createLoggerFor(HomeCalendarController.class);
 	
 	private UserSession userSession;
 	private CalendarController calendarController;
 
+	@Autowired
+	private HomeCalendarManager homeCalendarManager;
 	
 	public HomeCalendarController(UserRequest ureq, WindowControl windowControl) {
 		super(ureq, windowControl);
@@ -88,8 +61,8 @@ public class HomeCalendarController extends BasicController implements Activatea
 		userSession.getSingleUserEventCenter().registerFor(this, ureq.getIdentity(), OresHelper.lookupType(CalendarManager.class));
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), OresHelper.lookupType(CalendarManager.class));
 		
-		List<KalendarRenderWrapper> calendars = getListOfCalendarWrappers(ureq, windowControl);
-		List<KalendarRenderWrapper> importedCalendars = getListOfImportedCalendarWrappers(ureq);
+		List<KalendarRenderWrapper> calendars = homeCalendarManager.getListOfCalendarWrappers(ureq, windowControl);
+		List<KalendarRenderWrapper> importedCalendars = homeCalendarManager.getListOfImportedCalendarWrappers(ureq);
 		calendarController = new WeeklyCalendarController(ureq, windowControl, calendars, importedCalendars, WeeklyCalendarController.CALLER_HOME, false);
 		listenTo(calendarController);
 
@@ -103,166 +76,29 @@ public class HomeCalendarController extends BasicController implements Activatea
 		}
 	}
 
-	public static List<KalendarRenderWrapper> getListOfCalendarWrappers(UserRequest ureq, WindowControl wControl) {
-		List<KalendarRenderWrapper> calendars = new ArrayList<KalendarRenderWrapper>();
-		
-		CalendarModule calendarModule = CoreSpringFactory.getImpl(CalendarModule.class);
-		if(!calendarModule.isEnabled()) {
-			return calendars;
-		}
-		
-		// get the personal calendar
-		CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager();
-		if(calendarModule.isEnablePersonalCalendar()) {
-			KalendarRenderWrapper calendarWrapper = calendarManager.getPersonalCalendar(ureq.getIdentity());
-			calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
-			KalendarConfig personalKalendarConfig = calendarManager.findKalendarConfigForIdentity(
-					calendarWrapper.getKalendar(), ureq);
-			if (personalKalendarConfig != null) {
-				calendarWrapper.getKalendarConfig().setCss(personalKalendarConfig.getCss());
-				calendarWrapper.getKalendarConfig().setVis(personalKalendarConfig.isVis());
-			}
-			calendars.add(calendarWrapper);
-		}
-		
-		// get group calendars
-		if(calendarModule.isEnableGroupCalendar()) {
-			BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class);
-	
-			SearchBusinessGroupParams groupParams = new SearchBusinessGroupParams(ureq.getIdentity(), true, false);
-			groupParams.addTools(CollaborationTools.TOOL_CALENDAR);
-			List<BusinessGroup> ownerGroups = bgs.findBusinessGroups(groupParams, null, 0, -1);
-			addCalendars(ureq, ownerGroups, true, calendars);
-			
-			SearchBusinessGroupParams groupParams2 = new SearchBusinessGroupParams(ureq.getIdentity(), false, true);
-			groupParams2.addTools(CollaborationTools.TOOL_CALENDAR);
-			List<BusinessGroup> attendedGroups = bgs.findBusinessGroups(groupParams2, null, 0, -1);
-			for (Iterator<BusinessGroup> ownerGroupsIterator = ownerGroups.iterator(); ownerGroupsIterator.hasNext();) {
-				BusinessGroup ownerGroup = ownerGroupsIterator.next();
-				if (attendedGroups.contains(ownerGroup)) {
-					attendedGroups.remove(ownerGroup);
-				}
-			}
-			addCalendars(ureq, attendedGroups, false, calendars);
-		}
-		
-		if(calendarModule.isEnableCourseElementCalendar() || calendarModule.isEnableCourseToolCalendar()) {
-			// add course calendars
-			List<String> subscribedCourseCalendarIDs = CourseCalendarSubscription.getSubscribedCourseCalendarIDs(
-					ureq.getUserSession().getGuiPreferences());
-			
-			RepositoryManager repoManager = RepositoryManager.getInstance();
-			List<String> calendarIDsToBeRemoved = new ArrayList<String>();
-			for (Iterator<String> iter = subscribedCourseCalendarIDs.iterator(); iter.hasNext();) {
-				String courseCalendarID = iter.next();
-				final long courseResourceableID = Long.parseLong(courseCalendarID);
-				
-				RepositoryEntry repoEntry = repoManager.lookupRepositoryEntry(new OLATResourceable() {
-	
-					public Long getResourceableId() { return new Long(courseResourceableID); }
-					public String getResourceableTypeName() { return CourseModule.getCourseTypeName(); }
-				}, false);
-				if (repoEntry == null) {
-					// mark calendar ID for cleanup
-					calendarIDsToBeRemoved.add(courseCalendarID);
-					continue;
-				}
-				try {
-					ICourse course = CourseFactory.loadCourse(new Long(courseResourceableID));
-					//calendar course aren't enabled per default but course node of type calendar are always possible
-					//REVIEW if (!course.getCourseEnvironment().getCourseConfig().isCalendarEnabled()) continue;
-					// add course calendar
-					KalendarRenderWrapper courseCalendarWrapper = calendarManager.getCourseCalendar(course);
-					CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
-					boolean isPrivileged = cgm.isIdentityCourseAdministrator(ureq.getIdentity())
-						|| cgm.hasRight(ureq.getIdentity(), CourseRights.RIGHT_COURSEEDITOR);
-					if (isPrivileged) {
-						courseCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
-					} else {
-						courseCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
-					}
-					KalendarConfig courseKalendarConfig = calendarManager.findKalendarConfigForIdentity(courseCalendarWrapper.getKalendar(), ureq);
-					if (courseKalendarConfig != null) {
-						courseCalendarWrapper.getKalendarConfig().setCss(courseKalendarConfig.getCss());
-						courseCalendarWrapper.getKalendarConfig().setVis(courseKalendarConfig.isVis());
-					}
-					courseCalendarWrapper.setLinkProvider(new CourseLinkProviderController(course, Collections.singletonList(course), ureq, wControl));
-					calendars.add(courseCalendarWrapper);
-				} catch (CorruptedCourseException e) {
-					log.error("Corrupted course: " + courseResourceableID, null);
-				}
-			}
-			
-			// do calendar ID cleanup
-			if (!calendarIDsToBeRemoved.isEmpty()) {
-				subscribedCourseCalendarIDs = CourseCalendarSubscription.getSubscribedCourseCalendarIDs(
-						ureq.getUserSession().getGuiPreferences());
-				for (Iterator<String> iter = calendarIDsToBeRemoved.iterator(); iter.hasNext();) {
-					subscribedCourseCalendarIDs.remove(iter.next());
-				}
-				CourseCalendarSubscription.persistSubscribedCalendarIDs(subscribedCourseCalendarIDs, ureq.getUserSession().getGuiPreferences());
-			}
-		}
-
-		return calendars;
-	}
-	
-	public static List<KalendarRenderWrapper> getListOfImportedCalendarWrappers(UserRequest ureq) {
-		ImportCalendarManager.reloadUrlImportedCalendars(ureq);
-		return ImportCalendarManager.getImportedCalendarsForIdentity(ureq);
-	}
-	
-	/**
-	 * Append the calendars of a list of groups. The groups must have their calendar tool
-	 * enabled, this routine doesn't check it.
-	 * @param ureq
-	 * @param groups
-	 * @param isOwner
-	 * @param calendars
-	 */
-	private static void addCalendars(UserRequest ureq, List<BusinessGroup> groups, boolean isOwner, List<KalendarRenderWrapper> calendars) {
-		CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager();
-		Map<Long,Long> groupKeyToAccess = CoreSpringFactory.getImpl(CollaborationManager.class).lookupCalendarAccess(groups);
-		for (BusinessGroup bGroup:groups) {
-			KalendarRenderWrapper groupCalendarWrapper = calendarManager.getGroupCalendar(bGroup);
-			// set calendar access
-			int iCalAccess = CollaborationTools.CALENDAR_ACCESS_OWNERS;
-			Long lCalAccess = groupKeyToAccess.get(bGroup.getKey());
-			if (lCalAccess != null) {
-				iCalAccess = lCalAccess.intValue();
-			}
-			if (iCalAccess == CollaborationTools.CALENDAR_ACCESS_OWNERS && !isOwner) {
-				groupCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
-			} else {
-				groupCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
-			}
-			KalendarConfig groupKalendarConfig = calendarManager.findKalendarConfigForIdentity(groupCalendarWrapper.getKalendar(), ureq);
-			if (groupKalendarConfig != null) {
-				groupCalendarWrapper.getKalendarConfig().setCss(groupKalendarConfig.getCss());
-				groupCalendarWrapper.getKalendarConfig().setVis(groupKalendarConfig.isVis());
-			}
-			calendars.add(groupCalendarWrapper);
-		}
-	}
-	
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		// nothing to do here
 	}
-	
+
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (event instanceof KalendarModifiedEvent) {
-			List<KalendarRenderWrapper> calendars = getListOfCalendarWrappers(ureq, getWindowControl());
-			List<KalendarRenderWrapper> importedCalendars = getListOfImportedCalendarWrappers(ureq);
+			List<KalendarRenderWrapper> calendars = homeCalendarManager.getListOfCalendarWrappers(ureq, getWindowControl());
+			List<KalendarRenderWrapper> importedCalendars = homeCalendarManager.getListOfImportedCalendarWrappers(ureq);
 			calendarController.setCalendars(calendars, importedCalendars);
 		}
+		super.event(ureq, source, event);
 	}
 
+	@Override
 	protected void doDispose() {
 		// remove from event bus
 		userSession.getSingleUserEventCenter().deregisterFor(this, OresHelper.lookupType(CalendarManager.class));
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, OresHelper.lookupType(CalendarManager.class)); 
 	}
 
+	@Override
 	public void event(Event event) {
 		if (event instanceof KalendarModifiedEvent) {
 			if (calendarController != null) {
@@ -271,5 +107,4 @@ public class HomeCalendarController extends BasicController implements Activatea
 			}
 		}
 	}
-	
 }
diff --git a/src/main/java/org/olat/home/HomeCalendarManager.java b/src/main/java/org/olat/home/HomeCalendarManager.java
new file mode 100644
index 00000000000..1c2fc452bf7
--- /dev/null
+++ b/src/main/java/org/olat/home/HomeCalendarManager.java
@@ -0,0 +1,280 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.home;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.IdentityRef;
+import org.olat.collaboration.CollaborationManager;
+import org.olat.collaboration.CollaborationTools;
+import org.olat.commons.calendar.CalendarManager;
+import org.olat.commons.calendar.CalendarManagerFactory;
+import org.olat.commons.calendar.CalendarModule;
+import org.olat.commons.calendar.ImportCalendarManager;
+import org.olat.commons.calendar.model.KalendarConfig;
+import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.nodes.INode;
+import org.olat.core.util.tree.TreeVisitor;
+import org.olat.core.util.tree.Visitor;
+import org.olat.course.CorruptedCourseException;
+import org.olat.course.CourseFactory;
+import org.olat.course.ICourse;
+import org.olat.course.groupsandrights.CourseRights;
+import org.olat.course.nodes.CalCourseNode;
+import org.olat.course.nodes.CourseNode;
+import org.olat.course.run.calendar.CourseLinkProviderController;
+import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupService;
+import org.olat.group.model.SearchBusinessGroupParams;
+import org.olat.repository.RepositoryEntry;
+import org.olat.resource.OLATResource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 18.08.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class HomeCalendarManager {
+	
+	private static final OLog log = Tracing.createLoggerFor(HomeCalendarManager.class);
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private CalendarModule calendarModule;
+	@Autowired
+	private BusinessGroupService businessGroupService;
+	
+	public List<KalendarRenderWrapper> getListOfCalendarWrappers(UserRequest ureq, WindowControl wControl) {
+		
+		if(!calendarModule.isEnabled()) {
+			return new ArrayList<KalendarRenderWrapper>();
+		}
+		
+		List<KalendarRenderWrapper> calendars = new ArrayList<KalendarRenderWrapper>();
+		appendPersonalCalendar(ureq, calendars);
+		appendGroupCalendars(ureq, calendars);
+		appendCourseCalendars(ureq, wControl, calendars);
+		return calendars;
+	}
+	
+	private void appendPersonalCalendar(UserRequest ureq, List<KalendarRenderWrapper> calendars) {
+		// get the personal calendar
+		CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager();
+		if(calendarModule.isEnablePersonalCalendar()) {
+			KalendarRenderWrapper calendarWrapper = calendarManager.getPersonalCalendar(ureq.getIdentity());
+			calendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
+			KalendarConfig personalKalendarConfig = calendarManager.findKalendarConfigForIdentity(calendarWrapper.getKalendar(), ureq);
+			if (personalKalendarConfig != null) {
+				calendarWrapper.getKalendarConfig().setCss(personalKalendarConfig.getCss());
+				calendarWrapper.getKalendarConfig().setVis(personalKalendarConfig.isVis());
+			}
+			calendars.add(calendarWrapper);
+		}
+	}
+	
+	private void appendGroupCalendars(UserRequest ureq, List<KalendarRenderWrapper> calendars) {
+		// get group calendars
+		if(calendarModule.isEnableGroupCalendar()) {
+			SearchBusinessGroupParams groupParams = new SearchBusinessGroupParams(ureq.getIdentity(), true, false);
+			groupParams.addTools(CollaborationTools.TOOL_CALENDAR);
+			List<BusinessGroup> ownerGroups = businessGroupService.findBusinessGroups(groupParams, null, 0, -1);
+			addCalendars(ureq, ownerGroups, true, calendars);
+			
+			SearchBusinessGroupParams groupParams2 = new SearchBusinessGroupParams(ureq.getIdentity(), false, true);
+			groupParams2.addTools(CollaborationTools.TOOL_CALENDAR);
+			List<BusinessGroup> attendedGroups = businessGroupService.findBusinessGroups(groupParams2, null, 0, -1);
+			attendedGroups.removeAll(ownerGroups);
+			addCalendars(ureq, attendedGroups, false, calendars);
+		}
+	}
+
+	private void appendCourseCalendars(UserRequest ureq, WindowControl wControl, List<KalendarRenderWrapper> calendars) {
+		if(calendarModule.isEnableCourseElementCalendar() || calendarModule.isEnableCourseToolCalendar()) {
+			CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager();
+			
+			// add course calendars
+			List<Object[]> resources = getCourses(ureq.getIdentity());
+			Set<OLATResource> editoredResources = getEditorGrants(ureq.getIdentity());
+			
+			Set<Long> duplicates = new HashSet<>();
+			
+			for (Object[] resource:resources) {
+				RepositoryEntry courseEntry = (RepositoryEntry)resource[0];
+				if(duplicates.contains(courseEntry.getKey())) {
+					continue;
+				}
+				duplicates.add(courseEntry.getKey());
+				
+				String role = (String)resource[1];
+				Long courseResourceableID = courseEntry.getOlatResource().getResourceableId();
+				try {
+					ICourse course = CourseFactory.loadCourse(courseEntry);
+					if(isCourseCalendarEnabled(course)) {
+						//calendar course aren't enabled per default but course node of type calendar are always possible
+						//REVIEW if (!course.getCourseEnvironment().getCourseConfig().isCalendarEnabled()) continue;
+						// add course calendar
+						KalendarRenderWrapper courseCalendarWrapper = calendarManager.getCourseCalendar(course);
+						boolean isPrivileged = GroupRoles.owner.name().equals(role) || editoredResources.contains(courseEntry.getOlatResource());
+						if (isPrivileged) {
+							courseCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
+						} else {
+							courseCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
+						}
+						
+						KalendarConfig courseKalendarConfig = calendarManager.findKalendarConfigForIdentity(courseCalendarWrapper.getKalendar(), ureq);
+						if (courseKalendarConfig != null) {
+							courseCalendarWrapper.getKalendarConfig().setCss(courseKalendarConfig.getCss());
+							courseCalendarWrapper.getKalendarConfig().setVis(courseKalendarConfig.isVis());
+						}
+						courseCalendarWrapper.setLinkProvider(new CourseLinkProviderController(course, Collections.singletonList(course), ureq, wControl));
+						calendars.add(courseCalendarWrapper);
+					}
+				} catch (CorruptedCourseException e) {
+					OLATResource olatResource = courseEntry.getOlatResource();
+					
+					
+					log.error("Corrupted course: " + olatResource.getResourceableTypeName() + " :: " + courseResourceableID, null);
+				}
+			}
+		}
+	}
+	
+	private boolean isCourseCalendarEnabled(ICourse course) {
+		if(course.getCourseConfig().isCalendarEnabled()) {
+			return true;
+		}
+		
+		CourseNode rootNode = course.getRunStructure().getRootNode();
+		CalCourseNodeVisitor v = new CalCourseNodeVisitor();
+		new TreeVisitor(v, rootNode, true).visitAll();
+		return v.isFound();
+	}
+	
+	/**
+	 * 
+	 * @param identity
+	 * @return List of array, first the repository entry, second the role
+	 */
+	private List<Object[]> getCourses(IdentityRef identity) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select v, membership.role from repositoryentry  v ")
+		  .append(" inner join fetch v.olatResource as resource ")
+		  .append(" inner join v.groups as retogroup")
+		  .append(" inner join retogroup.group as baseGroup")
+		  .append(" inner join baseGroup.members as membership")
+		  .append(" where v.olatResource.resName='CourseModule' and membership.identity.key=:identityKey and")
+		  .append(" (")
+		  .append("   (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true and membership.role in ('").append(GroupRoles.owner.name()).append("','").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("'))")
+		  .append("   or")
+		  .append("   (v.access>=").append(RepositoryEntry.ACC_OWNERS).append(" and membership.role='").append(GroupRoles.owner.name()).append("')")
+		  .append("   or")
+		  .append("   (v.access>=").append(RepositoryEntry.ACC_USERS).append(" and membership.role in ('").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("'))")
+		  .append(" )");
+		
+		return dbInstance.getCurrentEntityManager()
+			.createQuery(sb.toString(), Object[].class)
+			.setParameter("identityKey", identity.getKey())
+			.getResultList();
+	}
+	
+	private Set<OLATResource> getEditorGrants(IdentityRef identity) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select grant.resource from bgrant as grant")
+		  .append(" inner join grant.group as baseGroup")
+		  .append(" inner join baseGroup.members as membership")
+		  .append(" where membership.identity.key=:identityKey and grant.permission='").append(CourseRights.RIGHT_COURSEEDITOR).append("' and membership.role=grant.role");
+		List<OLATResource> resources = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), OLATResource.class)
+				.setParameter("identityKey", identity.getKey())
+				.getResultList();
+		return new HashSet<>(resources);
+	}
+	
+	/**
+	 * Append the calendars of a list of groups. The groups must have their calendar tool
+	 * enabled, this routine doesn't check it.
+	 * @param ureq
+	 * @param groups
+	 * @param isOwner
+	 * @param calendars
+	 */
+	private void addCalendars(UserRequest ureq, List<BusinessGroup> groups, boolean isOwner, List<KalendarRenderWrapper> calendars) {
+		CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager();
+		Map<Long,Long> groupKeyToAccess = CoreSpringFactory.getImpl(CollaborationManager.class).lookupCalendarAccess(groups);
+		for (BusinessGroup bGroup:groups) {
+			KalendarRenderWrapper groupCalendarWrapper = calendarManager.getGroupCalendar(bGroup);
+			// set calendar access
+			int iCalAccess = CollaborationTools.CALENDAR_ACCESS_OWNERS;
+			Long lCalAccess = groupKeyToAccess.get(bGroup.getKey());
+			if (lCalAccess != null) {
+				iCalAccess = lCalAccess.intValue();
+			}
+			if (iCalAccess == CollaborationTools.CALENDAR_ACCESS_OWNERS && !isOwner) {
+				groupCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_ONLY);
+			} else {
+				groupCalendarWrapper.setAccess(KalendarRenderWrapper.ACCESS_READ_WRITE);
+			}
+			KalendarConfig groupKalendarConfig = calendarManager.findKalendarConfigForIdentity(groupCalendarWrapper.getKalendar(), ureq);
+			if (groupKalendarConfig != null) {
+				groupCalendarWrapper.getKalendarConfig().setCss(groupKalendarConfig.getCss());
+				groupCalendarWrapper.getKalendarConfig().setVis(groupKalendarConfig.isVis());
+			}
+			calendars.add(groupCalendarWrapper);
+		}
+	}
+	
+	public List<KalendarRenderWrapper> getListOfImportedCalendarWrappers(UserRequest ureq) {
+		ImportCalendarManager.reloadUrlImportedCalendars(ureq);
+		return ImportCalendarManager.getImportedCalendarsForIdentity(ureq);
+	}
+	
+	private static class CalCourseNodeVisitor implements Visitor {
+		private boolean found = false;
+		
+		public boolean isFound() {
+			return found;
+		}
+		
+		@Override
+		public void visit(INode node) {
+			if(node instanceof CalCourseNode) {
+				found = true;
+			}
+		}
+	}
+
+}
diff --git a/src/main/java/org/olat/home/_spring/homeContext.xml b/src/main/java/org/olat/home/_spring/homeContext.xml
index 876aa800abf..e508eaf1791 100644
--- a/src/main/java/org/olat/home/_spring/homeContext.xml
+++ b/src/main/java/org/olat/home/_spring/homeContext.xml
@@ -1,8 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.springframework.org/schema/beans 
-                        http://www.springframework.org/schema/beans/spring-beans.xsd ">
+	xmlns:context="http://www.springframework.org/schema/context" 
+	xsi:schemaLocation="
+  http://www.springframework.org/schema/beans 
+  http://www.springframework.org/schema/beans/spring-beans.xsd
+  http://www.springframework.org/schema/context 
+  http://www.springframework.org/schema/context/spring-context.xsd">
+	
+	<context:component-scan base-package="org.olat.home" />
 
 	<!--  the weekly calendar -->
 	<bean class="org.olat.home.HomeCalendarExtension" init-method="initExtensionPoints">
diff --git a/src/main/java/org/olat/modules/vitero/ui/ViteroUserToGroupController.java b/src/main/java/org/olat/modules/vitero/ui/ViteroUserToGroupController.java
index e60197a9a2b..575f631401e 100644
--- a/src/main/java/org/olat/modules/vitero/ui/ViteroUserToGroupController.java
+++ b/src/main/java/org/olat/modules/vitero/ui/ViteroUserToGroupController.java
@@ -266,7 +266,7 @@ public class ViteroUserToGroupController extends BasicController {
 			RepositoryEntry repoEntry = repositoryManager.lookupRepositoryEntry(ores, false);
 			if ("CourseModule".equals(ores.getResourceableTypeName())) {
 				if(courseGroupManager == null) {
-					ICourse course = CourseFactory.loadCourse(ores);
+					ICourse course = CourseFactory.loadCourse(repoEntry);
 					courseGroupManager = course.getCourseEnvironment().getCourseGroupManager();
 				}
 				coaches.addAll(courseGroupManager.getCoachesFromAreas());
diff --git a/src/main/java/org/olat/portal/calendar/CalendarPortletRunController.java b/src/main/java/org/olat/portal/calendar/CalendarPortletRunController.java
index 730302146ab..cce3bf96784 100644
--- a/src/main/java/org/olat/portal/calendar/CalendarPortletRunController.java
+++ b/src/main/java/org/olat/portal/calendar/CalendarPortletRunController.java
@@ -58,7 +58,8 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.id.context.BusinessControl;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.logging.OLATRuntimeException;
-import org.olat.home.HomeCalendarController;
+import org.olat.home.HomeCalendarManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -77,6 +78,9 @@ public class CalendarPortletRunController extends BasicController {
 	private TableController tableController;
 	private boolean dirty = false;
 	private Link showAllLink;
+	
+	@Autowired
+	private HomeCalendarManager homeCalendarManager;
 
 	/**
 	 * Constructor
@@ -127,8 +131,8 @@ public class CalendarPortletRunController extends BasicController {
 		cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) + 7);
 		Date endDate = cal.getTime();
 		List<KalendarEvent> events = new ArrayList<>();
-		List<KalendarRenderWrapper> calendars = HomeCalendarController.getListOfCalendarWrappers(ureq, wControl);
-		calendars.addAll( HomeCalendarController.getListOfImportedCalendarWrappers(ureq) );
+		List<KalendarRenderWrapper> calendars = homeCalendarManager.getListOfCalendarWrappers(ureq, wControl);
+		calendars.addAll( homeCalendarManager.getListOfImportedCalendarWrappers(ureq) );
 		for (Iterator<KalendarRenderWrapper> iter = calendars.iterator(); iter.hasNext();) {
 			KalendarRenderWrapper calendarWrapper = iter.next();
 			boolean readOnly = (calendarWrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY) && !calendarWrapper.isImported();
diff --git a/src/main/java/org/olat/properties/PropertyManager.java b/src/main/java/org/olat/properties/PropertyManager.java
index 82871df0af8..b2d5375e7fc 100644
--- a/src/main/java/org/olat/properties/PropertyManager.java
+++ b/src/main/java/org/olat/properties/PropertyManager.java
@@ -33,6 +33,7 @@ import java.util.List;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 
+import org.olat.basesecurity.IdentityRef;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -168,6 +169,28 @@ public class PropertyManager extends BasicManager implements UserDataDeletable {
 		}
 		return props.get(0);
 	}
+	
+	/**
+	 * Return all the properties with the specified name and category
+	 * 
+	 * @param identity
+	 * @param category
+	 * @param name
+	 * @return
+	 */
+	public List<Property> findAllUserProperties(IdentityRef identity, String category, String name) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select v from ").append(Property.class.getName()).append(" as v ")
+		  .append(" inner join v.identity identity ")
+		  .append(" where identity.key=:identityKey and v.category=:cat and v.name=:name");
+		
+		return DBFactory.getInstance().getCurrentEntityManager()
+				.createQuery(sb.toString(), Property.class)
+				.setParameter("identityKey", identity.getKey())
+				.setParameter("cat", category)
+				.setParameter("name", name)
+				.getResultList();
+	}
 
 	
 	/**
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index 35c1a28f708..ca9c3c5be13 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -431,7 +431,7 @@ public class CourseHandler implements RepositoryHandler {
 		CourseFactory.copyCourse(sourceResource, targetResource);
 		 
 		//transaction copied
-		ICourse sourceCourse = CourseFactory.loadCourse(source.getOlatResource().getResourceableId());
+		ICourse sourceCourse = CourseFactory.loadCourse(source);
 		CourseGroupManager sourceCgm = sourceCourse.getCourseEnvironment().getCourseGroupManager();
 		CourseEnvironmentMapper env = PersistingCourseGroupManager.getInstance(sourceCourse).getBusinessGroupEnvironment();
 			
@@ -439,7 +439,7 @@ public class CourseHandler implements RepositoryHandler {
 		fExportDir.mkdirs();
 		sourceCgm.exportCourseBusinessGroups(fExportDir, env, false, false);
 
-		ICourse course = CourseFactory.loadCourse(target.getOlatResource().getResourceableId());
+		ICourse course = CourseFactory.loadCourse(target);
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
 		// import groups
 		CourseEnvironmentMapper envMapper = cgm.importCourseBusinessGroups(fExportDir);
@@ -499,7 +499,7 @@ public class CourseHandler implements RepositoryHandler {
 					@Override
 					public Controller create(UserRequest uureq, WindowControl wwControl, TooledStackedPanel toolbarPanel,
 							RepositoryEntry entry, RepositoryEntrySecurity security, AssessmentMode assessmentMode) {
-						ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+						ICourse course = CourseFactory.loadCourse(entry);
 						return new RunMainController(uureq, wwControl, toolbarPanel, course, entry, security, assessmentMode);
 					}
 			}, true, true);
@@ -534,14 +534,14 @@ public class CourseHandler implements RepositoryHandler {
 
 	@Override
 	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar) {
-		return CourseFactory.createEditorController(ureq, wControl, toolbar, re.getOlatResource(), null);
+		return CourseFactory.createEditorController(ureq, wControl, toolbar, re, null);
 	}
 
 	@Override
 	public StepsMainRunController createWizardController(OLATResourceable res, UserRequest ureq, WindowControl wControl) {
 		// load the course structure
 		final RepositoryEntry repoEntry = (RepositoryEntry) res;
-		ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(repoEntry);
 		Translator cceTranslator = Util.createPackageTranslator(CourseCreationHelper.class, ureq.getLocale());
 		final CourseCreationConfiguration courseConfig = new CourseCreationConfiguration(course.getCourseTitle(), Settings.getServerContextPathURI() + "/url/RepositoryEntry/" + repoEntry.getKey());
 		// wizard finish callback called after "finish" is called
@@ -602,7 +602,7 @@ public class CourseHandler implements RepositoryHandler {
 	 */
 	@Override
 	public String archive(Identity archiveOnBehalfOf, String archivFilePath, RepositoryEntry entry) {
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource() );
+		ICourse course = CourseFactory.loadCourse(entry);
 		// Archive course runtime data (like delete course, archive e.g. logfiles, node-data)
 		File tmpExportDir = new File(WebappHelper.getTmpDir(), CodeHelper.getUniqueID());
 		tmpExportDir.mkdirs();
diff --git a/src/main/java/org/olat/repository/ui/author/wizard/CloseResourceCallback.java b/src/main/java/org/olat/repository/ui/author/wizard/CloseResourceCallback.java
index d4c224d5fa6..8a4866743e1 100644
--- a/src/main/java/org/olat/repository/ui/author/wizard/CloseResourceCallback.java
+++ b/src/main/java/org/olat/repository/ui/author/wizard/CloseResourceCallback.java
@@ -139,7 +139,7 @@ public class CloseResourceCallback implements StepRunnerCallback {
 	 * do unsubscribe all group members from this course
 	 */
 	private void doCleanGroups(Identity identity) {
-		ICourse course = CourseFactory.loadCourse(repositoryEntry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(repositoryEntry);
 		if(course != null) {
 			// LearningGroups
 			List<BusinessGroup> allGroups = course.getCourseEnvironment().getCourseGroupManager().getAllBusinessGroups();
diff --git a/src/main/webapp/static/themes/light/modules/_various_modules.scss b/src/main/webapp/static/themes/light/modules/_various_modules.scss
index 59ebdd23e3d..7652abfa3ba 100644
--- a/src/main/webapp/static/themes/light/modules/_various_modules.scss
+++ b/src/main/webapp/static/themes/light/modules/_various_modules.scss
@@ -330,7 +330,7 @@ ul.o_certificates li {
 /* Calendar */
 .o_cal_toptoolbar {
 	margin-bottom: $padding-base-vertical;
-	.o_cal_toptoolbar_sub, .o_cal_toptoolbar_help {
+	.o_cal_toptoolbar_help {
 		float: left;
 		margin-right: $padding-base-horizontal;
 	}
diff --git a/src/test/java/org/olat/course/condition/ConditionTest.java b/src/test/java/org/olat/course/condition/ConditionTest.java
index bec6683bdb3..5778c1eaf15 100644
--- a/src/test/java/org/olat/course/condition/ConditionTest.java
+++ b/src/test/java/org/olat/course/condition/ConditionTest.java
@@ -88,7 +88,7 @@ public class ConditionTest extends OlatTestCase {
 		Identity id = JunitTestHelper.createAndPersistIdentityAsUser("condition");
 		Roles roles = new Roles(false, false, false, false, false, false, false);
 		RepositoryEntry re = JunitTestHelper.deployDemoCourse(author);
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(re);
 		IdentityEnvironment identityEnv = new IdentityEnvironment(id, roles);
 		UserCourseEnvironment uce = new UserCourseEnvironmentImpl(identityEnv, course.getCourseEnvironment());
 		return uce;
-- 
GitLab