diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
index ed8fbbb35d76cf33acb7092b14bd7cb51674fdc9..3ecadd214ff47bb413611e893e4e91c69acbc755 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -667,6 +667,8 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 				removeAsListenerAndDispose(assessmentGuardCtrl);
 				assessmentGuardCtrl = null;
 			} else if("continue".equals(event.getCommand())) {
+				//unlock session
+				ureq.getUserSession().unlockResource();
 				initializeDefaultSite(ureq);
 				removeAsListenerAndDispose(assessmentGuardCtrl);
 				assessmentGuardCtrl = null;
@@ -1482,39 +1484,47 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 	private void updateBusinessPath(UserRequest ureq, SiteInstance site) {
 		if(site == null) return;
 
-		String businessPath = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getAsString();
-		HistoryPoint point = ureq.getUserSession().getLastHistoryPoint();
-		int index = businessPath.indexOf(':');
-		if(index > 0 && point != null && point.getBusinessPath() != null) {
-			String start = businessPath.substring(0, index);
-			if(!point.getBusinessPath().startsWith(start)) {
-				//if a controller has not set its business path, don't pollute the mapping
-				List<ContextEntry> entries = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getEntries();
-				siteToBusinessPath.put(site, new HistoryPointImpl(ureq.getUuid(), businessPath, entries));
-				return;
+		try {
+			String businessPath = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getAsString();
+			HistoryPoint point = ureq.getUserSession().getLastHistoryPoint();
+			int index = businessPath.indexOf(':');
+			if(index > 0 && point != null && point.getBusinessPath() != null) {
+				String start = businessPath.substring(0, index);
+				if(!point.getBusinessPath().startsWith(start)) {
+					//if a controller has not set its business path, don't pollute the mapping
+					List<ContextEntry> entries = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getEntries();
+					siteToBusinessPath.put(site, new HistoryPointImpl(ureq.getUuid(), businessPath, entries));
+					return;
+				}
 			}
+			
+			siteToBusinessPath.put(site, point);
+		} catch (Exception e) {
+			logError("", e);
 		}
-		
-		siteToBusinessPath.put(site, point);
 	}
 	
 	private void updateBusinessPath(UserRequest ureq, DTab tab) {
 		//dtabToBusinessPath is null if the controller is disposed
 		if(tab == null || dtabToBusinessPath == null) return;
 
-		String businessPath = tab.getController().getWindowControlForDebug().getBusinessControl().getAsString();
-		HistoryPoint point = ureq.getUserSession().getLastHistoryPoint();
-		int index = businessPath.indexOf(']');
-		if(index > 0 && point != null && point.getBusinessPath() != null) {
-			String start = businessPath.substring(0, index);
-			if(!point.getBusinessPath().startsWith(start)) {
-				//if a controller has not set its business path, don't pollute the mapping
-				List<ContextEntry> entries = tab.getController().getWindowControlForDebug().getBusinessControl().getEntries();
-				dtabToBusinessPath.put(tab, new HistoryPointImpl(ureq.getUuid(), businessPath, entries));
-				return;
+		try {
+			String businessPath = tab.getController().getWindowControlForDebug().getBusinessControl().getAsString();
+			HistoryPoint point = ureq.getUserSession().getLastHistoryPoint();
+			int index = businessPath.indexOf(']');
+			if(index > 0 && point != null && point.getBusinessPath() != null) {
+				String start = businessPath.substring(0, index);
+				if(!point.getBusinessPath().startsWith(start)) {
+					//if a controller has not set its business path, don't pollute the mapping
+					List<ContextEntry> entries = tab.getController().getWindowControlForDebug().getBusinessControl().getEntries();
+					dtabToBusinessPath.put(tab, new HistoryPointImpl(ureq.getUuid(), businessPath, entries));
+					return;
+				}
 			}
+			dtabToBusinessPath.put(tab, point);
+		} catch (Exception e) {
+			logError("", e);
 		}
-		dtabToBusinessPath.put(tab, point);
 	}
 	
 	private static class TabState {
diff --git a/src/main/java/org/olat/core/util/UserSession.java b/src/main/java/org/olat/core/util/UserSession.java
index a320ee35b7e76583d62b8bc538bd7d0fac969fd5..6abc731345d37ef58bdd5a88ebdfe868850458c7 100644
--- a/src/main/java/org/olat/core/util/UserSession.java
+++ b/src/main/java/org/olat/core/util/UserSession.java
@@ -304,6 +304,11 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 		this.lockMode = mode;
 		this.lockResource = lockResource;
 	}
+	
+	public void unlockResource() {
+		lockMode = null;
+		lockResource = null;
+	}
 
 	public List<TransientAssessmentMode> getAssessmentModes() {
 		return assessmentModes;
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java
index b6ec61df1b0b99e927f387b1660ef8f8fd27850d..43210bb610f8cacb275b5a80dbbae81048430f88 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java
@@ -182,17 +182,17 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 		Date endWithFollowupTime = assessmentModeManager.evaluateFollowupTime(end, followup);
 		if(beginWithLeadTime.compareTo(now) > 0) {
 			status = Status.none;
-		} else if(beginWithLeadTime.compareTo(now) <= 0 && begin.compareTo(now) >= 0 && !beginWithLeadTime.equals(begin)) {
+		} else if(beginWithLeadTime.compareTo(now) <= 0 && begin.compareTo(now) > 0 && !beginWithLeadTime.equals(begin)) {
 			status = Status.leadtime;
-		} else if(begin.compareTo(now) <= 0 && end.compareTo(now) >= 0) {
+		} else if(begin.compareTo(now) <= 0 && end.compareTo(now) > 0) {
 			status = Status.assessment;
-		} else if(end.compareTo(now) <= 0 && endWithFollowupTime.compareTo(now) >= 0) {
+		} else if(end.compareTo(now) <= 0 && endWithFollowupTime.compareTo(now) > 0) {
 			if(followup > 0) {
 				status = Status.followup;
 			} else {
 				status = Status.end;
 			}
-		} else if(endWithFollowupTime.compareTo(now) < 0) {
+		} else if(endWithFollowupTime.compareTo(now) <= 0) {
 			status = Status.end;
 		} else {
 			status = null;
@@ -203,14 +203,16 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 
 	private AssessmentMode sendEvent(AssessmentMode mode, Date now, boolean forceStatus) {
 		if(mode.getBeginWithLeadTime().compareTo(now) > 0) {
+			//none
 			mode = ensureStatusOfMode(mode, Status.none);
 			sendEvent(AssessmentModeNotificationEvent.BEFORE, mode,
 					assessmentModeManager.getAssessedIdentityKeys(mode));
-		} else if(mode.getBeginWithLeadTime().compareTo(now) <= 0 && mode.getBegin().compareTo(now) >= 0
+		} else if(mode.getBeginWithLeadTime().compareTo(now) <= 0 && mode.getBegin().compareTo(now) > 0
 				&& mode.getBeginWithLeadTime().compareTo(mode.getBegin()) != 0) {
+			//leading time
 			mode = ensureStatusOfMode(mode, Status.leadtime);
 			sendEvent(AssessmentModeNotificationEvent.LEADTIME, mode,
-					assessmentModeManager.getAssessedIdentityKeys(mode));
+				assessmentModeManager.getAssessedIdentityKeys(mode));
 		} else if(mode.isManualBeginEnd() && !forceStatus) {
 			//what to do in manual mode
 			if(mode.getStatus() == Status.followup) {
@@ -221,7 +223,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 				}
 			}
 		} else {
-			if(mode.getBegin().compareTo(now) <= 0 && mode.getEnd().compareTo(now) >= 0) {
+			if(mode.getBegin().compareTo(now) <= 0 && mode.getEnd().compareTo(now) > 0) {
 				mode = ensureStatusOfMode(mode, Status.assessment);
 				sendEvent(AssessmentModeNotificationEvent.START_ASSESSMENT, mode,
 						assessmentModeManager.getAssessedIdentityKeys(mode));
@@ -235,7 +237,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 				if(now.after(cal.getTime())) {
 					sendEvent(AssessmentModeNotificationEvent.STOP_WARNING, mode, null);
 				}
-			} else if(mode.getEnd().compareTo(now) <= 0 && mode.getEndWithFollowupTime().compareTo(now) >= 0) {
+			} else if(mode.getEnd().compareTo(now) <= 0 && mode.getEndWithFollowupTime().compareTo(now) > 0) {
 				if(mode.getFollowupTime() > 0) {
 					mode = ensureStatusOfMode(mode, Status.followup);
 					sendEvent(AssessmentModeNotificationEvent.STOP_ASSESSMENT, mode,
@@ -245,7 +247,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 					sendEvent(AssessmentModeNotificationEvent.END, mode,
 							assessmentModeManager.getAssessedIdentityKeys(mode));
 				}
-			} else if(mode.getEndWithFollowupTime().compareTo(now) < 0) {
+			} else if(mode.getEndWithFollowupTime().compareTo(now) <= 0) {
 				mode = ensureStatusOfMode(mode, Status.end);
 				sendEvent(AssessmentModeNotificationEvent.END, mode,
 						assessmentModeManager.getAssessedIdentityKeys(mode));
@@ -276,7 +278,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 	public boolean canStart(AssessmentMode assessmentMode) {
 		boolean canStart;
 		Status status = assessmentMode.getStatus();
-		if(status == Status.end || status == Status.assessment) {
+		if(status == Status.assessment || status == Status.followup || status == Status.end) {
 			canStart = false;
 		} else {
 			canStart = true;
diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java
index 54aa783d45bc4829650cfe18d2e4ed6a9d87392b..cba82ba651dc321d10e85be2b45077181647d5d2 100644
--- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java
+++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java
@@ -237,6 +237,7 @@ public class AssessmentModeGuardController extends BasicController implements Ge
 			Date beginWithLeadTime = mode.getBeginWithLeadTime();
 			Date end = mode.getEnd();
 			Date endWithLeadTime = mode.getEndWithFollowupTime();
+			
 			if(beginWithLeadTime.compareTo(now) <= 0 && begin.compareTo(now) > 0) {
 				state = Status.leadtime.name();
 				go.setEnabled(false);
@@ -249,13 +250,13 @@ public class AssessmentModeGuardController extends BasicController implements Ge
 				go.setVisible(true);
 				cont.setEnabled(false);
 				cont.setVisible(false);
-			} else if(end.compareTo(now) <= 0 && endWithLeadTime.compareTo(now) >= 0) {
+			} else if(end.compareTo(now) <= 0 && endWithLeadTime.compareTo(now) > 0) {
 				state = Status.followup.name();
 				go.setEnabled(false);
 				go.setVisible(false);
 				cont.setEnabled(false);
 				cont.setVisible(false);
-			} else if(endWithLeadTime.before(now) || Status.end == mode.getStatus()) {
+			} else if(endWithLeadTime.compareTo(now) <= 0 || Status.end == mode.getStatus()) {
 				state = Status.end.name();
 				go.setEnabled(false);
 				go.setVisible(false);
diff --git a/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties
index 5db6fec786f07925b2afc4327c207c6c523fd42f..4d2bc9f616765cb022a0345770173a43909b54c9 100644
--- a/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties
@@ -25,6 +25,7 @@ current.mode.datetimes=From {0} until / to {1}
 current.mode.desc=You currently have an exam scheduled in the course listed below. While this assessment is in effect, no other OpenOLAT functions can be accessed.
 current.mode.end.info=The exam is finished. You can now continue to work normally with OpenOLAT.
 current.mode.followuptime=For {0} minute(s) after the exam is finished, all access to other courses is equally disabled.
+current.mode.followuptime.info=General access to OpenOLAT is still disabled. Please wait for the end of the follow-up.
 current.mode.in=The exam starts in {0} minute(s)
 current.mode.leadtime={0} minute(s) before the exam starts, all access to other courses is disabled.
 current.mode.start=Start the exam