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 fa23a00ebfc0560bafa29187a3179f0cb2a0e4a2..db3182c18d454535ac87e1a16e8bdeb24a5f8ce8 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 49cb1999d94a427d65803e36b9e076c95993a556..227d6c129ab27a251edcc034e494064f67bc5396 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 7055f7c787c8532f448f1beeef6df6b0e6e13928..d9c5bc09aff530c7c37de7e5c8642cbcda8debaa 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 90ae743914bae4265f771b3679010fa006b63ab9..ec11d5748c832026ffbd4da9673c88d83aab744c 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 7475e5fd10dfb36d641b8fee62dbdedd1e10f97c..9b6b7d1120030018d2ca2a067d34a38c06988ea6 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 9b62dd067045c0a8d6c42db4996cab22853a025e..806042c33596d2783a9420f5f30cf31891c6632a 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 48e72a1d74350e32e63218008b378b31f6c6266c..f620bf25ca1f773dba9f32d71315f9349f875284 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 f64faecde076394d11580cbf7512a7f831c43a4f..3289d00b01326369a7f054dfcf3281dbb3ed7bdd 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 d2d701f46c4c8bd7b224e372065780dba5ed148c..1e86e4ffc345e9f509db7abcfcebf4ec88c7917a 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 1dedd960081c85421a09f71e4b30f27182c73407..047bccfc8f843844db12afbfd3d2919395f68c9b 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 a2f5efdde0ac1f72d0a47f3498e8e70a17769277..8fa618872ef560c516cdfe1a257911b92fac1bd6 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 a0f7d567324e3ed33045148037fa0d46c74d20bb..feb34ed082dc44ce7d5687a37040a50ff786db36 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 5d9ef664f5a633eca5b62bcee481e493e6e547b8..0df3a76df9967695696b096cb6425cf598f1c53d 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 e7e44f5c4a920c8a1dbb625fb13ba37f831b40b0..2d4ccd030e1290b94d17f50d63d361bbc08de4bc 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 bfb0f3142238fe494415c6cea23a100f3e7a8a43..9477043e6987b7c9db6958ea69004960959c86b2 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 c22e0e29c771de480fff312f241b712f05cf96bf..080db99211e41af24cf5d2112b99f726a875c16a 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 217a02a6cbe4f382c17af912931f52338c3bbea4..3a6e19c0814486abb81b11b3a7648f32ecb3b678 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 4d90924c4d2e4a0b00d6d290f6147255946fc0c8..c29d38c3418db789bbb2206f35d5fbf49abdd50d 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 3e306a412570c7f773c8f9a35273a4978a374fb5..d8037eb5982270e1ffcc68064c220246c5e5a9c8 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 e6387a65dc5af3f69aef244572a7958700b60d5e..df05dd27a24c3340a4cb16f84262d6ef8bed8c2f 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 1c181d37f236063b742c4203843adf6da4c11fe0..23f1cb437402862dbbf7b0d65e8f317de00ff252 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 a77cbb142bb5e26afcfc09c2f67618d60786610c..bdb5e54aaefb299dfd5130eef0f0df781be22478 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 dc470e84468ee3bc66e9f6bb5f68283606d09d53..893b4c9602530191c3a4b03109531f73c6ec0782 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 0000000000000000000000000000000000000000..4bde3689ac3a074dfd838d2a9d9743e9243a508e
--- /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 b78691dc01e9db6e8c8966d04534b53bbfa46457..2c188491ffff259747e02c9e7f8fbf9ab9a79031 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 ac8394397cea23e28c022950e3afc0069ea466aa..495d61cd45d540f2ead706f8a9d7d54d36cc8dcb 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 d2b9fe88b7bbdaa33a47c7a5244a6306ea34647c..9ce653ab56aab4ad6caf90762f108ad356a1cabc 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 5ba74dd2168b631d0d96b8335d1620373dc01865..c83203bad633ab97c223b6c40136e89d83b4e5ff 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 66b92b0af41fe9d347da62071189fa7d58e0f1b9..3eb33a3016338f2a719a028dfb3e978751d885be 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 1e9672dbd13dc4b44adb312676dc11fd657ba66b..d5909540f1fccd95561892aad769782a6516de24 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 0c37078723cfce00e7c8127fbf3791c0593e5f2f..49fa25712fd30a5755d93006b63c9b7ecdbb9512 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 9f4e36bebec334f5573ee1d5f23ca754084ea513..0cfdbcfe358838cb359c2a75799a31400a4292e1 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 fdf122a5f5c34e1109297956e1ff4c591a25d133..c1928865222b2dfe6a9c9b41b642a9a3fef232b3 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 18f3af3883a319653595bbfe43387275d77daebe..bd24db9e93ae08a38bc1d2728a0d66f732813959 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 4f9473a8e254c686819f1667e364ab3242f4035f..878265da6436f9f26c4963bb61a06df444bfa982 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 bfe3f59174a0202b90fe876fa7f02c7e87ef0853..7056c8211395e21872e8be258e2e0fb518f9af97 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 7abf01a948cde78339c02a8c67a64826572ea911..aca632ed1662d155e79ad1b24035393b99435fa2 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 9b33e6266edb87ef57e3160f6c557770195a6f18..27a2d05cc3fbb073bdefb06f26c6ea79aec2c555 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 1156d7db7fd556ddaa265af66b59d6e148204bc1..f1c9af1526c8209441874d18659aaa8aa2341fb0 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 b6fe0b6be18b1eb8360682dd5ccb387074ec2fda..9fe63a43f05b39cf56c7eea904f9b621f1062d4c 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 ba803506fc43321540927e05aa9a1c8f4096a93b..805802803021cd88ef0d35d26cce131213dd1b46 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 c72fbf438e574870b078ca77db023456c07cfab3..bfd3bb277a2b66bc0dd77fb33397d392f4e18bdd 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 33a74a96f4e293e7ffd8b3c20a791b394379a158..8cfdd9256f68d6e5fd60555ef1243241d720d93b 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 d0342780e88745c0480c99bfdfe05338e4ee3253..6d1471e3e981eecbd5c9965675f975269bf77afb 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 bfdd6a44dadb81cb93b1fe365d52606d77970c7c..bc11e32cfbed844b274400f7464c49d8bfd6f944 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 a09568e0c7d4a3baa267885720ee94af3f211748..9a5fde2acdfdc9559c0f587564c9def5dc44af70 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 5923f945f609b86e8d751a64081bb039ee780d3c..4330e3b79b7f6ba7a639a5be0141fbbda92bfda2 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 9e27481998d3240fd23f890175307d284eea7908..746d12cedd0246913950366bb51a6f98c2c48d1f 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 d8b9292499092db52f4fd1ee86c086aa090c5d3e..0552193629df456c63fffd89c559b680600ffa71 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 6dc76ea8c643fae347e3a2c7e3196b2737d7e621..d447beb7ea4191b8619e71ec85e47da31ab38399 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 6470bb3aad115beef2f8c7ff1de35c0ec512d6c7..f1ddd6020c5db0ebca925f649ec9e43bf1a02f7e 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 f55cb76f7c35f77f783b81e59a476d5654231801..6ae0d1037906e7772f385b4858a1c05dda405480 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 c2fc302d60aa919bbc80a5c123feb5c1f01d0a2a..90d4f49c454b1966ea1f01fec12f74db3f19d450 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 419cdec241b6d65700f0c60f4941489a54a4a938..83fc0a579bb1d1ea758b5ca6686da689f0b0f49d 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 da14a08504ba644adb63a038b33180af475a7be6..e3a457c04a9edffd6d0730831ff3f0289e352ab9 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 8251787ed7913710d859fda1d0c27d26e020af50..864a9f1765b33f7d7460af7764e17688cce53ce2 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 60b83890139784fd3624968f9200a390eec32081..a120ee971f156a2cacec36a3bdcfde851fee238a 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 d5b9f51a4e7c2b807c55767dcaf7f7ae3354a85b..786ae81dbfa52f9e13d84ece707421600e441dfd 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 c44659f9dc461eb391140459d27630c56b060588..6ff97738d53337db8f2855f3c5dffeb071a430a9 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 61f695962be0bc86f1bf92f3f49aaed33b1d10da..00eb1a901413638fc2f64584d1397e116075c6f0 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 8bea4e7e293d1c37fd19830300298f4e6bd69e48..0feb26c87a6eb47b64de1e58824c341e13429d40 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 1f8f8c34f1c2b5cb71cdde8de7ac1c15dc59b643..efe6b98c5b2e6c95288b014f9c686965468b7f08 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 81bc2ed4e78528ab48507bf7be6f9992036f99c8..01e275aea9b060444903af29fe7ffe24b5d66d56 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 d204cc5d8fd1a1ccb7ebca266621307cc651703a..071d69bac41961cae69c0ee69fcc6f52912e5080 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 07726fc4185938f50bd206533fc0ee34e34c8a54..82bf022d1950ef5b8c583d36ee57f93827ae5f4b 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 c58980fe134e744695a8111f2a5824d419187f7e..bde08ee11e97ca1b6d825a30ca5c9feb8af4feec 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 15dd3c609c131a01a1b1a96914629250ef88a482..1f8420eaa74894075b620747e31d53bd4f2b8a8e 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 a7dad723660cadc2e2812fee04d40c44ecfc07f8..ff540d3f942c08422428fc2cac95da9f2d83f008 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 4c5733ee49ab7124280a4b27c6c9ce905f51e164..929b0a8685cf0da6558e65fde4521fc0cf41d862 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 f189f467b6d4e09fa9e6fbd0d6f9fd2f818ec9e3..d14252aa5593037f74f24f3f04ab5ecd6b066ec0 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 0000000000000000000000000000000000000000..1c2fc452bf73233eea68dc9c776c78db6485d164
--- /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 876aa800abf9a4cdef2f120fb53d85895033e927..e508eaf1791d62da846eebde00aa2b38acd08fdc 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 e60197a9a2b0fbdc5e41a9f6106d71d15f9d4a04..575f631401e0264ca8e75e62bb84da60185fc382 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 730302146ab07ea9e25528c1abbd95fe73bd24d1..cce3bf96784c1d954189e646db6de12f6bf47938 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 82871df0af8c1213c2eebe23c157b63fb035e3f1..b2d5375e7fc3e1f93442feb747ae9e3a1db072fc 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 35c1a28f708d2b293e347ec484e9db6b5fd8c805..ca9c3c5be137c82b3ecf3edfe4663fbd43e85d9b 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 d4c224d5fa6c338a1182050385713eed5cf2e1bd..8a4866743e1e78834bbdef4b6bd710415385e35d 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 59ebdd23e3d76c3e59afec64d8bef5632dbdbf9a..7652abfa3ba3d15cdff5abdbfe2fa5bd828e92e8 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 bec6683bdb3ea33277098c7165f9ba89bf2792fd..5778c1eaf151cd573b961ffc0a25b222eb74957b 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;