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 23b4ef2873bbff5478bd936c95647de3ad6adb3f..406b2f18c7e887881e8203503f27df59582ead93 100644
--- a/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/WeeklyCalendarController.java
@@ -234,7 +234,7 @@ public class WeeklyCalendarController extends FormBasicController implements Act
 	
 	@Override
 	public void setFocusOnEvent(String eventId, String recurenceId) {
-		if  (eventId.length() > 0) {
+		if(StringHelper.containsNonWhitespace(eventId)) {
 			for(KalendarRenderWrapper wrapper:calendarWrappers) {
 				KalendarEvent event = wrapper.getKalendar().getEvent(eventId, recurenceId);
 				if(event != null) {
diff --git a/src/main/java/org/olat/core/id/context/BusinessControlFactory.java b/src/main/java/org/olat/core/id/context/BusinessControlFactory.java
index 5a500b493ad274cf493bd278c94caa8bff07ad75..390da6ff7cf822112e297d3124a2e63420cbd105 100644
--- a/src/main/java/org/olat/core/id/context/BusinessControlFactory.java
+++ b/src/main/java/org/olat/core/id/context/BusinessControlFactory.java
@@ -351,7 +351,7 @@ public class BusinessControlFactory {
 	 * @return
 	 */
 	public List<ContextEntry> createCEListFromResourceType(String resourceType) {
-		List<ContextEntry> entries = new ArrayList<ContextEntry>(3);
+		List<ContextEntry> entries = new ArrayList<>(3);
 		if(StringHelper.containsNonWhitespace(resourceType)) {
 			OLATResourceable ores = OresHelper.createOLATResourceableInstanceWithoutCheck(resourceType, 0l);
 			ContextEntry entry = createContextEntry(ores);
@@ -366,7 +366,7 @@ public class BusinessControlFactory {
 	 * @return
 	 */
 	public List<ContextEntry> createCEListFromString(String businessControlString) {
-		List<ContextEntry> entries = new ArrayList<ContextEntry>();
+		List<ContextEntry> entries = new ArrayList<>();
 		if(!StringHelper.containsNonWhitespace(businessControlString)) {
 			return entries;
 		}
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 3152daf9c1b3d1c2796ac9c3ba2d464a869daab1..65bbef2d4d3022f1ab4dff4079a60c020aaef858 100644
--- a/src/main/java/org/olat/course/nodes/cal/CalRunController.java
+++ b/src/main/java/org/olat/course/nodes/cal/CalRunController.java
@@ -21,6 +21,7 @@
 package org.olat.course.nodes.cal;
 
 import java.util.Date;
+import java.util.List;
 
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
@@ -31,11 +32,13 @@ import org.olat.core.gui.control.Controller;
 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.creator.ControllerCreator;
 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.gui.control.generic.dtabs.Activateable2;
+import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
+import org.olat.core.id.context.StateEntry;
+import org.olat.core.util.StringHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.nodes.CalCourseNode;
 import org.olat.course.run.userview.NodeEvaluation;
@@ -50,11 +53,11 @@ import org.olat.modules.ModuleConfiguration;
  * Initial Date:  4 nov. 2009 <br>
  * @author srosse, stephane.rosse@frentix.com, www.frentix.com
  */
-public class CalRunController extends BasicController {
+public class CalRunController extends BasicController implements Activateable2 {
 
-	private CourseCalendarController calCtr;
-	private ModuleConfiguration config;
-	private CloneController cloneCtr;
+	private final CourseCalendarController calCtr;
+	private final CloneController cloneCtr;
+	private final ModuleConfiguration config;
 	
 	/**
 	 * 
@@ -65,59 +68,48 @@ public class CalRunController extends BasicController {
 	 */
 	public CalRunController(WindowControl wControl, UserRequest ureq, CalCourseNode calCourseNode, UserCourseEnvironment courseEnv, NodeEvaluation ne) {
 		super(ureq, wControl);
-		this.config = calCourseNode.getModuleConfiguration();
+		config = calCourseNode.getModuleConfiguration();
 		VelocityContainer mainVC = createVelocityContainer("run");
 
 		CourseCalendars myCal = CourseCalendars.createCourseCalendarsWrapper(ureq, wControl, courseEnv, ne);
 		calCtr = new CourseCalendarController(ureq, wControl, myCal, courseEnv, ne);
-
-		boolean focused = false;
-		ContextEntry ce = wControl.getBusinessControl().popLauncherContextEntry();
-		if ( ce != null ) { // a context path is left for me
-			OLATResourceable ores = ce.getOLATResourceable();
-			String typeName = ores.getResourceableTypeName();
-			String eventId = typeName.substring("path=".length());
-			if(eventId.indexOf(':') > 0) {
-				eventId = eventId.substring(0, eventId.indexOf(':'));
-			}
-			if  (eventId.length() > 0) {
-				calCtr.setFocusOnEvent(eventId, null);
-				focused = true;
-			}
-		}
-		if(!focused) {
-			Date startDate = null;
-			if(CalEditController.getAutoDate(config)) {
-				startDate = new Date();
-			} else {
-				startDate = CalEditController.getStartDate(config);
-				if(startDate == null) startDate = new Date();
-			}
-			calCtr.setFocus(startDate);
+		listenTo(calCtr);
+		
+		Date startDate = null;
+		if(CalEditController.getAutoDate(config)) {
+			startDate = new Date();
+		} else {
+			startDate = CalEditController.getStartDate(config);
+			if(startDate == null) startDate = new Date();
 		}
+		calCtr.setFocus(startDate);
 
-		CloneLayoutControllerCreatorCallback clccc = new CloneLayoutControllerCreatorCallback() {
-			@Override
-			public ControllerCreator createLayoutControllerCreator(UserRequest uureq, final ControllerCreator contentControllerCreator) {
-				return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(uureq, new ControllerCreator() {
-					@Override
-					public Controller createController(UserRequest lureq, WindowControl lwControl) {
-						// wrapp in column layout, popup window needs a layout controller
-						Controller ctr = contentControllerCreator.createController(lureq, lwControl);
-						LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, ctr);
-						layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), courseEnv.getCourseEnvironment()));
-						layoutCtr.addDisposableChildController(ctr);
-						return layoutCtr;
-					}
-				});
-			}
+		CloneLayoutControllerCreatorCallback clccc = (uureq, contentControllerCreator)  -> {
+			return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(uureq, (lureq, lwControl) -> {
+				// wrap in column layout, popup window needs a layout controller
+				Controller ctr = contentControllerCreator.createController(lureq, lwControl);
+				LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, ctr);
+				layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), courseEnv.getCourseEnvironment()));
+				layoutCtr.addDisposableChildController(ctr);
+				return layoutCtr;
+			});
 		};
-		cloneCtr	 = new CloneController(ureq, getWindowControl(), calCtr, clccc);
-		
+		cloneCtr = new CloneController(ureq, getWindowControl(), calCtr, clccc);
 		mainVC.put("cal", cloneCtr.getInitialComponent());
 		putInitialPanel(mainVC);
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		if(entries == null || entries.isEmpty()) return;
+		
+		ContextEntry ce = entries.get(0);
+		String eventId = BusinessControlFactory.getInstance().getPath(ce);
+		if(StringHelper.containsNonWhitespace(eventId)) {
+			calCtr.setFocusOnEvent(eventId, null);
+		}
+	}
+
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		//no events yet
@@ -127,11 +119,9 @@ public class CalRunController extends BasicController {
 	protected void doDispose() {
 		if(calCtr != null){
 			calCtr.dispose();
-			calCtr = null;
 		}
 		if(cloneCtr != null){
 			cloneCtr.dispose();
-			cloneCtr = null;
 		}
 	}
 }
\ No newline at end of file
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 2e5e00720e16c7fedcba6328a94ccbd0b9f2ce9e..29a0f2e648f509ee85a11c466386f6e4c3958958 100644
--- a/src/main/java/org/olat/course/nodes/cal/CourseCalendarController.java
+++ b/src/main/java/org/olat/course/nodes/cal/CourseCalendarController.java
@@ -67,9 +67,7 @@ public class CourseCalendarController extends DefaultController implements Clone
 				courseEnv.getCourseEnvironment().getCourseGroupManager().getCourseResource(), false);
 		calendarController.setDifferentiateManagedEvent(CourseCalendars.needToDifferentiateManagedEvents(calendars));
 		setInitialComponent(calendarController.getInitialComponent());
-	}
-	
-	
+	}	
 
 	public CourseCalendarSubscription getCalendarSubscription() {
 		return calendarSubscription;