diff --git a/src/main/java/org/olat/course/archiver/ArchiverMainController.java b/src/main/java/org/olat/course/archiver/ArchiverMainController.java
index e5893443b5324566ecd7187f56b8bd72efac4ca9..f5103f15cd13618e9617b305165ff6dd267f1611 100644
--- a/src/main/java/org/olat/course/archiver/ArchiverMainController.java
+++ b/src/main/java/org/olat/course/archiver/ArchiverMainController.java
@@ -25,6 +25,7 @@
 
 package org.olat.course.archiver;
 
+import java.util.List;
 import java.util.Locale;
 
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
@@ -44,7 +45,10 @@ 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.MainLayoutBasicController;
+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.activity.ActionType;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
@@ -67,7 +71,7 @@ import org.olat.course.nodes.WikiCourseNode;
  * @author gnaegi
  * 
  */
-public class ArchiverMainController extends MainLayoutBasicController {
+public class ArchiverMainController extends MainLayoutBasicController implements Activateable2 {
 
 	private static final String CMD_INDEX = "index";
 	private static final String CMD_QTISURVRESULTS = "qtisurvresults";
@@ -132,6 +136,11 @@ public class ArchiverMainController extends MainLayoutBasicController {
 		putInitialPanel(columnLayoutCtr.getInitialComponent());
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		//
+	}
+
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (source == menuTree) {
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index 49beeb5c92573389b52c96fc0378ab7eb1db408b..44c960d4bd440ae1ec0da403032105c8969d3de7 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -517,11 +517,15 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				settingsLink = LinkFactory.createToolLink("settings", translate("details.settings"), this, "o_sel_repo_settings");
 				settingsLink.setIconLeftCSS("o_icon o_icon-fw o_icon_settings");
 				settingsLink.setElementCssClass("o_sel_course_settings");
+				settingsLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Settings:0]"));
 				tools.addComponent(settingsLink);
 			}
 			
 			if (reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach() || hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || hasCourseRight(CourseRights.RIGHT_MEMBERMANAGEMENT)) {
 				membersLink = LinkFactory.createToolLink("unifiedusermngt", translate("command.opensimplegroupmngt"), this, "o_icon_membersmanagement");
+				membersLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[MembersMgmt:0][Members:0][All:0]"));
 				membersLink.setElementCssClass("o_sel_course_members");
 				tools.addComponent(membersLink);
 			}
@@ -536,6 +540,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			boolean managed = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.editcontent);
 			boolean readOnly = uce.isCourseReadOnly();
 			editLink = LinkFactory.createToolLink("edit.cmd", translate("command.openeditor"), this, "o_icon_courseeditor");
+			editLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Editor:0]]"));
 			editLink.setElementCssClass("o_sel_course_editor");
 			editLink.setEnabled(!corrupted && !managed);
 			editLink.setVisible(!readOnly);
@@ -544,6 +550,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			
 		if (reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) {
 			folderLink = LinkFactory.createToolLink("cfd", translate("command.coursefolder"), this, "o_icon_coursefolder");
+			folderLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Coursefolder:0]]"));
 			folderLink.setElementCssClass("o_sel_course_folder");
 			tools.addComponent(folderLink);
 			tools.addComponent(new Spacer(""));
@@ -560,18 +568,24 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			
 			if (reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach() || reSecurity.isCoach() || hasCourseRight(CourseRights.RIGHT_ASSESSMENT)) {
 				assessmentLink = LinkFactory.createToolLink("assessment", translate("command.openassessment"), this, "o_icon_assessment_tool");
+				assessmentLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[assessmentToolv2:0]"));
 				assessmentLink.setElementCssClass("o_sel_course_assessment_tool");
 				tools.addComponent(assessmentLink);
 			}
 			
 			if(lectureModule.isEnabled() && (courseAuthorRight || reSecurity.isPrincipal() || reSecurity.isMasterCoach()) && isLectureEnabled()) {
 				lecturesAdminLink = LinkFactory.createToolLink("lectures.admin.cmd", translate("command.options.lectures.admin"), this, "o_icon_lecture");
+				lecturesAdminLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[LecturesAdmin:0][LectureBlocks:0]"));
 				lecturesAdminLink.setElementCssClass("o_sel_course_lectures_admin");
 				tools.addComponent(lecturesAdminLink);
 			}
 			
 			if(reminderModule.isEnabled() && courseAuthorRight) {
 				reminderLink = LinkFactory.createToolLink("reminders.cmd", translate("command.options.reminders"), this, "o_icon_reminder");
+				reminderLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Reminders:0]"));
 				reminderLink.setElementCssClass("o_sel_course_reminders");
 				reminderLink.setVisible(!uce.isCourseReadOnly());
 				tools.addComponent(reminderLink);
@@ -581,6 +595,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				//course author right or the assessment mode access right 
 				boolean managed = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.editcontent);
 				assessmentModeLink = LinkFactory.createToolLink("assessment.mode.cmd", translate("command.assessment.mode"), this, "o_icon_assessment_mode");
+				assessmentModeLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[AssessmentMode:0]"));
 				assessmentModeLink.setElementCssClass("o_sel_course_assessment_mode");
 				assessmentModeLink.setEnabled(!managed);
 				assessmentModeLink.setVisible(assessmentModule.isAssessmentModeEnabled() && !uce.isCourseReadOnly());
@@ -589,12 +605,15 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) {
 				areaLink = LinkFactory.createToolLink("careas", translate("command.courseareas"), this, "o_icon_courseareas");
+				areaLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[CourseAreas:0]"));
 				areaLink.setElementCssClass("o_sel_course_areas");
 				tools.addComponent(areaLink);
 			}
 			
 			if (courseDBManager.isEnabled() && (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_DB))) {
 				dbLink = LinkFactory.createToolLink("customDb",translate("command.opendb"), this, "o_icon_coursedb");
+				//TODO url
 				tools.addComponent(dbLink);
 			}
 		}
@@ -613,6 +632,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			
 			if (reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach() || hasCourseRight(CourseRights.RIGHT_STATISTICS)) {
 				courseStatisticLink = LinkFactory.createToolLink("statistic",translate("command.openstatistic"), this, "o_icon_statistics_tool");
+				courseStatisticLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[CourseStatistics:0]"));
 				tools.addComponent(courseStatisticLink);
 			}
 			
@@ -628,17 +649,23 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				}, course.getRunStructure().getRootNode(), true).visitAll();
 				if(testNodes.intValue() > 0) {
 					testStatisticLink = LinkFactory.createToolLink("qtistatistic", translate("command.openteststatistic"), this, "o_icon_statistics_tool");
+					testStatisticLink.setUrl(BusinessControlFactory.getInstance()
+							.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[TestStatistics:0]"));
 					tools.addComponent(testStatisticLink);
 				}
 				
 				if(surveyNodes.intValue() > 0) {
 					surveyStatisticLink = LinkFactory.createToolLink("qtistatistic", translate("command.opensurveystatistic"), this, "o_icon_statistics_tool");
+					surveyStatisticLink.setUrl(BusinessControlFactory.getInstance()
+							.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[SurveyStatistics:0]"));
 					tools.addComponent(surveyStatisticLink);
 				}
 			}
 
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_ARCHIVING)) {
 				archiverLink = LinkFactory.createToolLink("archiver", translate("command.openarchiver"), this, "o_icon_archive_tool");
+				archiverLink.setUrl(BusinessControlFactory.getInstance()
+						.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Archives:0]"));
 				tools.addComponent(archiverLink);
 			}
 			
@@ -821,12 +848,16 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		CourseConfig cc = course.getCourseConfig();
 		if (!assessmentLock && showDetails) {
 			detailsLink = LinkFactory.createToolLink("courseconfig",translate("command.courseconfig"), this, "o_icon_details");
+			detailsLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Infos:0]"));
 			toolbarPanel.addTool(detailsLink);
 		}
 		
 		if (!assessmentLock && !isGuestOnly
 				&& LearningPathNodeAccessProvider.TYPE.equals(cc.getNodeAccessType().getType())) {
-			learningPathLink = LinkFactory.createToolLink("learningPath", translate("command.learning.path"), this, "o_icon_learning_path");
+			learningPathLink = LinkFactory.createToolLink("learningPath", translate("command.learning.path") + "-LP", this, "o_icon_learning_path");
+			learningPathLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[LearningPath:0]"));
 			toolbarPanel.addTool(learningPathLink);
 		}
 		if (learningPathLink != null) {
@@ -836,6 +867,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if (!assessmentLock && !isGuestOnly
 				&& LearningPathNodeAccessProvider.TYPE.equals(cc.getNodeAccessType().getType())) {
 			learningPathsLink = LinkFactory.createToolLink("learningPaths", translate("command.learning.paths"), this, "o_icon_learning_path");
+			learningPathsLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[LearningPaths:0]"));
 			toolbarPanel.addTool(learningPathsLink);
 		}
 		if (learningPathsLink != null) {
@@ -853,47 +886,63 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		
 		if(!assessmentLock && isLecturesLinkEnabled()) {
 			lecturesLink = LinkFactory.createToolLink("command.lectures", translate("command.lectures"), this, "o_icon_lecture");
+			lecturesLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Lectures:0]"));
 			toolbarPanel.addTool(lecturesLink);
 		}
 		
 		if(!assessmentLock && !isGuestOnly && userCourseEnv != null) {
 			participantListLink = LinkFactory.createToolLink("participantlist", translate("command.participant.list"), this, "o_cmembers_icon");
+			participantListLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[ParticipantList:0]"));
 			participantListLink.setVisible(cc.isParticipantListEnabled());
 			toolbarPanel.addTool(participantListLink);
 		}
 		
 		if(!assessmentLock && userCourseEnv != null) {
 			participantInfoLink = LinkFactory.createToolLink("participantinfo", translate("command.participant.info"), this, "o_infomsg_icon");
+			participantInfoLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[ParticipantInfos:0]"));
 			participantInfoLink.setVisible(cc.isParticipantInfoEnabled());
 			toolbarPanel.addTool(participantInfoLink);
 		}
 		
 		if(!assessmentLock && !isGuestOnly && userCourseEnv != null && !userCourseEnv.isCourseReadOnly()) {
 			emailLink = LinkFactory.createToolLink("email", translate("command.email"), this, "o_co_icon");
+			emailLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[email:0]"));
 			emailLink.setVisible(cc.isEmailEnabled());
 			toolbarPanel.addTool(emailLink);
 		}
 		
 		if(!assessmentLock && userCourseEnv != null) {
 			blogLink = LinkFactory.createToolLink("blog", translate("command.blog"), this, "o_blog_icon");
+			blogLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[blog:0]"));
 			blogLink.setVisible(cc.isBlogEnabled());
 			toolbarPanel.addTool(blogLink);
 		}
 		
 		if(!assessmentLock && userCourseEnv != null) {
 			wikiLink = LinkFactory.createToolLink("wiki", translate("command.wiki"), this, "o_wiki_icon");
+			wikiLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[wiki:0]"));
 			wikiLink.setVisible(cc.isWikiEnabled());
 			toolbarPanel.addTool(wikiLink);
 		}
 		
 		if(!assessmentLock && userCourseEnv != null) {
 			forumLink = LinkFactory.createToolLink("forum", translate("command.forum"), this, "o_fo_icon");
+			forumLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[forum:0]"));
 			forumLink.setVisible(cc.isForumEnabled());
 			toolbarPanel.addTool(forumLink);
 		}
 		
 		if(!assessmentLock && userCourseEnv != null) {
 			documentsLink = LinkFactory.createToolLink("documents", translate("command.documents"), this, "o_bc_icon");
+			documentsLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[documents:0]"));
 			documentsLink.setVisible(cc.isDocumentsEnabled());
 			toolbarPanel.addTool(documentsLink);
 		}
@@ -1226,11 +1275,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				}
 			} else if("LearningPaths".equalsIgnoreCase(type)) {
 				if (learningPathsLink != null && learningPathsLink.isVisible()) {
-					Activateable2 leanringPaths = doLearningPaths(ureq);
-					if (leanringPaths != null) {
-						List<ContextEntry> subEntries = entries.subList(1, entries.size());
-						leanringPaths.activate(ureq, subEntries, entries.get(0).getTransientState());
-					}
+					activateSubEntries(ureq, doLearningPaths(ureq), entries);
 				}
 			} else if("Settings".equalsIgnoreCase(type) || "EditDescription".equalsIgnoreCase(type)) {
 				List<ContextEntry> subEntries = entries.subList(1, entries.size());
@@ -1249,19 +1294,11 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				}
 			} else if("Blog".equalsIgnoreCase(type)) {
 				if (blogLink != null && blogLink.isVisible()) {
-					Activateable2 blog = doBlog(ureq);
-					if (blog != null) {
-						List<ContextEntry> subEntries = entries.subList(1, entries.size());
-						blog.activate(ureq, subEntries, entries.get(0).getTransientState());
-					}
+					activateSubEntries(ureq, doBlog(ureq), entries);
 				}
 			} else if("Wiki".equalsIgnoreCase(type)) {
 				if (wikiLink != null && wikiLink.isVisible()) {
-					Activateable2 wiki = doWiki(ureq);
-					if (wiki != null) {
-						List<ContextEntry> subEntries = entries.subList(1, entries.size());
-						wiki.activate(ureq, subEntries, entries.get(0).getTransientState());
-					}
+					activateSubEntries(ureq, doWiki(ureq), entries);
 				}
 			} else if("Forum".equalsIgnoreCase(type)) {
 				if (forumLink != null && forumLink.isVisible()) {
@@ -1269,11 +1306,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				}
 			} else if("Documents".equalsIgnoreCase(type)) {
 				if (documentsLink != null && documentsLink.isVisible()) {
-					Activateable2 documents = doDocuments(ureq);
-					if (documents != null) {
-						List<ContextEntry> subEntries = entries.subList(1, entries.size());
-						documents.activate(ureq, subEntries, entries.get(0).getTransientState());
-					}
+					activateSubEntries(ureq, doDocuments(ureq), entries);
 				}
 			} else if("Certification".equalsIgnoreCase(type)) {
 				if (efficiencyStatementsLink != null && efficiencyStatementsLink.isVisible()) {
@@ -1282,32 +1315,26 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			} else if("Reminders".equalsIgnoreCase(type) || "RemindersLogs".equalsIgnoreCase(type)) {
 				doReminders(ureq);
 			} else if("Lectures".equalsIgnoreCase(type)) {
-				Activateable2 lectures = doLectures(ureq);
-				if(lectures != null) {
-					List<ContextEntry> subEntries = entries.subList(1, entries.size());
-					lectures.activate(ureq, subEntries, entries.get(0).getTransientState());
-				}
+				activateSubEntries(ureq, doLectures(ureq), entries);
 			} else if("LectureBlock".equalsIgnoreCase(type)) {
 				Activateable2 lectures = doLectures(ureq);
 				if(lectures != null) {
 					lectures.activate(ureq, entries, state);
 				}
 			} else if("LecturesAdmin".equalsIgnoreCase(type)) {
-				Activateable2 lecturesAdmin = doLecturesAdmin(ureq);
-				if(lecturesAdmin != null) {
-					List<ContextEntry> subEntries = entries.subList(1, entries.size());
-					lecturesAdmin.activate(ureq, subEntries, entries.get(0).getTransientState());
-				}
+				activateSubEntries(ureq, doLecturesAdmin(ureq), entries);
+			} else if("CourseFolder".equalsIgnoreCase(type)) {
+				doCourseFolder(ureq);
+			} else if("AssessmentMode".equalsIgnoreCase(type)) {
+				doAssessmentMode(ureq);
+			} else if("CourseAreas".equalsIgnoreCase(type)) {
+				doCourseAreas(ureq);
+			} else if("CourseStatistics".equalsIgnoreCase(type)) {
+				activateSubEntries(ureq, doCourseStatistics(ureq), entries);
+			} else if("Archives".equalsIgnoreCase(type)) {
+				activateSubEntries(ureq, doArchive(ureq), entries);
 			} else if("MembersMgmt".equalsIgnoreCase(type)) {
-				Activateable2 members = doMembers(ureq);
-				if(members != null) {
-					try {
-						List<ContextEntry> subEntries = entries.subList(1, entries.size());
-						members.activate(ureq, subEntries, entries.get(0).getTransientState());
-					} catch (OLATSecurityException e) {
-						//the wrong link to the wrong person
-					}
-				}	
+				activateSubEntries(ureq, doMembers(ureq), entries);	
 			} else if ("assessmentTool".equalsIgnoreCase(type) || "assessmentToolv2".equalsIgnoreCase(type)) {
 				//check the security before, the link is perhaps in the wrong hands
 				if(reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach() || reSecurity.isCoach() || hasCourseRight(CourseRights.RIGHT_ASSESSMENT)) {
@@ -1495,7 +1522,9 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				
 				boolean canManage = reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR) || hasCourseRight(CourseRights.RIGHT_ASSESSMENT_MODE);
 				AssessmentModeSecurityCallback secCallback = AssessmentModeSecurityCallbackFactory.getSecurityCallback(canManage);
-				AssessmentModeListController ctrl = new AssessmentModeListController(ureq, getWindowControl(),
+
+				WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance("AssessmentMode", 0l), null);
+				AssessmentModeListController ctrl = new AssessmentModeListController(ureq, swControl,
 						toolbarPanel, getRepositoryEntry(), secCallback);
 				assessmentModeCtrl = pushController(ureq, translate("command.assessment.mode"), ctrl);
 				setActiveTool(assessmentModeLink);
@@ -1565,20 +1594,23 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		}
 	}
 	
-	private void doArchive(UserRequest ureq) {
+	private ArchiverMainController doArchive(UserRequest ureq) {
 		if(delayedClose == Delayed.archive || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_ARCHIVING)) {
 				removeCustomCSS();
 				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
-				ArchiverMainController ctrl = new ArchiverMainController(ureq, getWindowControl(), course, new FullAccessArchiverCallback());
+				WindowControl swControl = this.addToHistory(ureq, OresHelper.createOLATResourceableInstance("Archives", 0l), null);
+				ArchiverMainController ctrl = new ArchiverMainController(ureq, swControl, course, new FullAccessArchiverCallback());
 				listenTo(ctrl);
 				archiverCtrl = pushController(ureq, translate("command.openarchiver"), ctrl);
 				currentToolCtr = archiverCtrl;
 				setActiveTool(archiverLink);
+				return ctrl;
 			}
 		} else {
 			delayedClose = Delayed.archive;
 		}
+		return null;
 	}
 	
 	private FolderRunController doCourseFolder(UserRequest ureq) {
@@ -1595,7 +1627,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			VFSContainer namedCourseFolder = new NamedContainerImpl(translate("command.coursefolder"), courseContainer);
 			CustomLinkTreeModel customLinkTreeModel = new CourseInternalLinkTreeModel(course.getEditorTreeModel());
 
-			FolderRunController ctrl = new FolderRunController(namedCourseFolder, true, true, true, true, ureq, getWindowControl(), null, customLinkTreeModel, null);
+			WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance("CourseFolder", 0l), null);
+			FolderRunController ctrl = new FolderRunController(namedCourseFolder, true, true, true, true, ureq, swControl, null, customLinkTreeModel, null);
 			ctrl.addLoggingResourceable(LoggingResourceable.wrap(course));
 			courseFolderCtrl = pushController(ureq, translate("command.coursefolder"), ctrl);
 			setActiveTool(folderLink);
@@ -1610,7 +1643,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.courseAreas || requestForClose(ureq)) {
 			removeCustomCSS();
 			ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
-			CourseAreasController ctrl = new CourseAreasController(ureq, getWindowControl(),
+			WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance("CourseAreas", 0l), null);
+			CourseAreasController ctrl = new CourseAreasController(ureq, swControl,
 					getRepositoryEntry().getOlatResource(), getUserCourseEnvironment().isCourseReadOnly());
 			ctrl.addLoggingResourceable(LoggingResourceable.wrap(course));
 			areasCtrl = pushController(ureq, translate("command.courseareas"), ctrl);
@@ -1638,13 +1672,14 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		}
 	}
 	
-	private void doCourseStatistics(UserRequest ureq) {
+	private StatisticMainController doCourseStatistics(UserRequest ureq) {
 		if(delayedClose == Delayed.courseStatistics || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || reSecurity.isPrincipal() || reSecurity.isMasterCoach()
 					|| hasCourseRight(CourseRights.RIGHT_STATISTICS)) {
 				removeCustomCSS();
 				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
-				StatisticMainController ctrl = new StatisticMainController(ureq, getWindowControl(), course);
+				WindowControl swControl = this.addToHistory(ureq, OresHelper.createOLATResourceableInstance("CourseStatistics", 0l), null);
+				StatisticMainController ctrl = new StatisticMainController(ureq, swControl, course);
 				listenTo(ctrl);
 				statisticsCtrl = pushController(ureq, translate("command.openstatistic"), ctrl);
 				setActiveTool(courseStatisticLink);
@@ -1653,6 +1688,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		} else {
 			delayedClose = Delayed.courseStatistics;
 		}
+		return statisticsCtrl;
 	}
 	
 	private Activateable2 doAssessmentTestStatistics(UserRequest ureq) {
diff --git a/src/main/java/org/olat/course/statistic/StatisticMainController.java b/src/main/java/org/olat/course/statistic/StatisticMainController.java
index 18b6458d95f21164ab12575c0427af2a6fd38d14..107e122e6b662b88947512a9c63da10a5d3958d6 100644
--- a/src/main/java/org/olat/course/statistic/StatisticMainController.java
+++ b/src/main/java/org/olat/course/statistic/StatisticMainController.java
@@ -25,18 +25,23 @@
 
 package org.olat.course.statistic;
 
+import java.util.List;
+
 import org.olat.core.extensions.action.ActionExtension;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.layout.GenericMainController;
+import org.olat.core.id.context.ContextEntry;
+import org.olat.core.id.context.StateEntry;
 import org.olat.course.ICourse;
 
 /**
  * Initial Date:  03.12.2009 <br>
  * @author bja
  */
-public class StatisticMainController extends GenericMainController {
+public class StatisticMainController extends GenericMainController implements Activateable2 {
 
 	private ICourse course;
 
@@ -47,6 +52,11 @@ public class StatisticMainController extends GenericMainController {
 		getMenuTree().setRootVisible(false);
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		super.activate(ureq, entries, state);
+	}
+
 	@Override
 	protected void doDispose() {
 		// controllers disposed by BasicController:
diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java
index 13bf4c58f9a8117fb1f73bfd2eb4f96fa5bf54f9..07c01e33af109f21ac119920074a972d06482f14 100644
--- a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java
@@ -33,6 +33,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.OLATResourceable;
+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.logging.activity.ThreadLocalUserActivityLogger;
@@ -92,16 +93,22 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController  {
 	protected void initToolsMenuRuntime(Dropdown toolsDropdown) {
 		if (reSecurity.isEntryAdmin() || reSecurity.isCoach()) {
 			assessmentLink = LinkFactory.createToolLink("assessment", translate("command.openassessment"), this, "o_icon_assessment_tool");
+			assessmentLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[AssessmentTool:0]"));
 			assessmentLink.setElementCssClass("o_sel_course_assessment_tool");
 			toolsDropdown.addComponent(assessmentLink);
 		}
 		if (reSecurity.isEntryAdmin()) {
 			gradingLink = LinkFactory.createToolLink("grading", translate("command.grading"), this, "o_icon_assessment_tool");
+			gradingLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Grading:0]"));
 			gradingLink.setElementCssClass("o_sel_grading");
 			toolsDropdown.addComponent(gradingLink);
 		}
 		if (reSecurity.isEntryAdmin() || reSecurity.isCoach()) {
 			testStatisticLink = LinkFactory.createToolLink("qtistatistic", translate("command.openteststatistic"), this, "o_icon_statistics_tool");
+			testStatisticLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[TestStatistics:0]"));
 			toolsDropdown.addComponent(testStatisticLink);
 		}
 		
diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java
index bc11032dab8505e414a6e60f54f629abfcc41ee9..24c14d35275a17903fa475992a20d7f7870092cd 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java
@@ -33,7 +33,9 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.OLATResourceable;
+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.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.modules.assessment.ui.AssessableResource;
@@ -69,6 +71,8 @@ public class BinderRuntimeController extends RepositoryEntryRuntimeController {
 			toolsDropdown.addComponent(new Spacer(""));
 			
 			assessmentLink = LinkFactory.createToolLink("assessment", translate("command.openassessment"), this, "o_icon_assessment_tool");
+			assessmentLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[AssessmentTool:0]]"));
 			assessmentLink.setElementCssClass("o_sel_course_assessment_tool");
 			toolsDropdown.addComponent(assessmentLink);
 		}
@@ -76,6 +80,8 @@ public class BinderRuntimeController extends RepositoryEntryRuntimeController {
 		if (reSecurity.isEntryAdmin()) {
 			RepositoryEntry re = getRepositoryEntry();
 			ordersLink = LinkFactory.createToolLink("bookings", translate("details.orders"), this, "o_sel_repo_booking");
+			ordersLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Booking:0]]"));
 			ordersLink.setIconLeftCSS("o_icon o_icon-fw o_icon_booking");
 			boolean booking = acService.isResourceAccessControled(re.getOlatResource(), null);
 			ordersLink.setEnabled(booking);
@@ -88,6 +94,18 @@ public class BinderRuntimeController extends RepositoryEntryRuntimeController {
 		}
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		entries = removeRepositoryEntry(entries);
+		if(entries != null && !entries.isEmpty()) {
+			String type = entries.get(0).getOLATResourceable().getResourceableTypeName();
+			if("AssessmentTool".equalsIgnoreCase(type) && assessmentLink != null && assessmentLink.isVisible()) {
+				activateSubEntries(ureq, doAssessmentTool(ureq), entries);
+			}
+		}
+		super.activate(ureq, entries, state);
+	}
+
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
 		if(assessmentLink == source) {
@@ -103,7 +121,7 @@ public class BinderRuntimeController extends RepositoryEntryRuntimeController {
 	}
 
 	private Activateable2 doAssessmentTool(UserRequest ureq) {
-		OLATResourceable ores = OresHelper.createOLATResourceableType("TestStatistics");
+		OLATResourceable ores = OresHelper.createOLATResourceableType("AssessmentTool");
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 		WindowControl swControl = addToHistory(ureq, ores, null);
 		
diff --git a/src/main/java/org/olat/modules/video/ui/VideoRuntimeController.java b/src/main/java/org/olat/modules/video/ui/VideoRuntimeController.java
index 634eeced7da8b1d871b37c068d1f58012cd57e16..3499068bf6e0d1ee48f1af666747fbac81328c9f 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoRuntimeController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoRuntimeController.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.OLATResourceable;
+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.resource.OresHelper;
@@ -68,6 +69,8 @@ public class VideoRuntimeController extends RepositoryEntryRuntimeController {
 			toolsDropdown.addComponent(new Spacer("video-editor"));
 			
 			editorLink = LinkFactory.createToolLink("metaDataConfig", translate("tab.video.settings"), this);
+			editorLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Editor:0][metadata:0]"));
 			editorLink.setIconLeftCSS("o_icon o_icon-fw o_icon_quota o_icon_settings");
 			toolsDropdown.addComponent(editorLink);
 			
diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index ae03385fec7333fd320c0ca217e47da97b93c162..e44579893f28cb8d4567018ced3a40202e8907e3 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -160,6 +160,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	protected boolean corrupted;
 	protected boolean settingsChanged;
 	protected boolean overrideReadOnly = false;
+	protected final String businessPathEntry;
 	private RepositoryEntry re;
 	private List<OrganisationRef> organisations;
 	private LockResult lockResult;
@@ -206,6 +207,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		//! check corrupted
 		corrupted = isCorrupted(re);
 		
+		businessPathEntry = "[RepositoryEntry:" + re.getKey() + "]";
 
 		UserSession session = ureq.getUserSession();
 		Object wcard = session.removeEntry("override_readonly_" + re.getKey());
@@ -449,11 +451,15 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	protected void initToolsMenuSettings(Dropdown toolsDropdown) {
 		if (reSecurity.isEntryAdmin()) {
 			settingsLink = LinkFactory.createToolLink("settings", translate("details.settings"), this, "o_sel_repo_settings");
+			settingsLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Settings:0][Info:0]"));
 			settingsLink.setIconLeftCSS("o_icon o_icon-fw o_icon_settings");
 			settingsLink.setElementCssClass("o_sel_repo_settings");
 			toolsDropdown.addComponent(settingsLink);
 			
 			membersLink = LinkFactory.createToolLink("members", translate("details.members"), this, "o_sel_repo_members");
+			membersLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[MembersMgmt:0]]"));
 			membersLink.setIconLeftCSS("o_icon o_icon-fw o_icon_membersmanagement");
 			toolsDropdown.addComponent(membersLink);
 		}
@@ -465,6 +471,8 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 			
 			boolean managed = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.editcontent);
 			editLink = LinkFactory.createToolLink("edit.cmd", translate("details.openeditor"), this, "o_sel_repository_editor");
+			editLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Editor:0]]"));
 			editLink.setIconLeftCSS("o_icon o_icon-lg o_icon_edit");
 			editLink.setEnabled(!managed);
 			toolsDropdown.addComponent(editLink);
@@ -474,6 +482,8 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	protected void initToolsMenuRuntime(Dropdown toolsDropdown) {
 		if (reSecurity.isEntryAdmin()) {
 			ordersLink = LinkFactory.createToolLink("bookings", translate("details.orders"), this, "o_sel_repo_booking");
+			ordersLink.setUrl(BusinessControlFactory.getInstance()
+					.getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Booking:0]]"));
 			ordersLink.setIconLeftCSS("o_icon o_icon-fw o_icon_booking");
 			boolean booking = acService.isResourceAccessControled(re.getOlatResource(), null);
 			ordersLink.setEnabled(booking);
@@ -570,6 +580,16 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		}
 	}
 	
+	protected void activateSubEntries(UserRequest ureq, Activateable2 ctrl, List<ContextEntry> entries) {
+		if(ctrl == null || entries == null) return;
+		try {
+			List<ContextEntry> subEntries = entries.subList(1, entries.size());
+			ctrl.activate(ureq, subEntries, entries.get(0).getTransientState());
+		} catch (OLATSecurityException e) {
+			//the wrong link to the wrong person
+		}
+	}
+	
 	protected List<ContextEntry> removeRepositoryEntry(List<ContextEntry> entries) {
 		if(entries != null && !entries.isEmpty()) {
 			String type = entries.get(0).getOLATResourceable().getResourceableTypeName();