diff --git a/src/main/java/org/olat/admin/layout/LayoutAdminController.java b/src/main/java/org/olat/admin/layout/LayoutAdminController.java
index 9b83457bda38a121e5929a7e5a7957d46ed566df..fd4d4816c6ae271ca8be9da5ebe3f5f2ab277314 100644
--- a/src/main/java/org/olat/admin/layout/LayoutAdminController.java
+++ b/src/main/java/org/olat/admin/layout/LayoutAdminController.java
@@ -223,7 +223,7 @@ public class LayoutAdminController extends FormBasicController {
 				layoutModule.setLogoFilename(newLogo.getName());
 				logoUpload.setInitialFile(newLogo);
 				deleteLogo.setVisible(true);
-				Windows.getWindows(ureq).getChiefController().wishReload(true);
+				Windows.getWindows(ureq).getChiefController().wishReload(ureq, true);
 				
 			}
 		} else if(logoLinkTypeEl == source) {
@@ -234,7 +234,7 @@ public class LayoutAdminController extends FormBasicController {
 			logoUpload.reset();
 			deleteLogo.setVisible(false);
 			logoUpload.setInitialFile(null);
-			Windows.getWindows(ureq).getChiefController().wishReload(true);
+			Windows.getWindows(ureq).getChiefController().wishReload(ureq, true);
 			
 		} else if(themeSelection == source) {
 			// set new theme in Settings
diff --git a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java
index ae77058bae85a07de02dbd08c20a33ffdd5a9c9c..b808331dc1ea06d30917b5ad64b27683f8bd1a4d 100644
--- a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java
+++ b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java
@@ -50,7 +50,6 @@ import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
-import org.olat.core.gui.control.WindowBackOffice;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.id.Identity;
@@ -150,8 +149,6 @@ public class ClusterAdminControllerCluster extends BasicController {
 		
 		mainVc.put("busmsgs", busMsgs);
 		// let a thread repeatively dump all messages
-		//final Formatter f = Formatter.getInstance(ureq.getLocale());
-		final WindowBackOffice wbo = getWindowControl().getWindowBackOffice();
 		Thread pollThread = new Thread(new Runnable(){
 			public void run() {
 				while (!disposed) {
@@ -160,21 +157,18 @@ public class ClusterAdminControllerCluster extends BasicController {
 					} catch (InterruptedException e) {
 						// ignore
 					}
-					wbo.invokeLater(new Runnable() {
-						public void run() {
-							// simple reput the new lists into the velocity container.
-							// the container is then dirty and automatically rerendered since polling has been turned on here.
-							busMsgs.contextPut("time", Formatter.formatDatetime(new Date()));
-							busMsgs.contextPut("recmsgs", clusBus.getListOfReceivedMsgs());
-							busMsgs.contextPut("sentmsgs", clusBus.getListOfSentMsgs());
-							// also let node infos refresh
-							updateNodeInfos();
-							// also let perf infos refresh
-							updatePerfInfos();
-							// update cache info
-							updateCacheInfo();
-						}
-					});
+					
+					// simple reput the new lists into the velocity container.
+					// the container is then dirty and automatically rerendered since polling has been turned on here.
+					busMsgs.contextPut("time", Formatter.formatDatetime(new Date()));
+					busMsgs.contextPut("recmsgs", clusBus.getListOfReceivedMsgs());
+					busMsgs.contextPut("sentmsgs", clusBus.getListOfSentMsgs());
+					// also let node infos refresh
+					updateNodeInfos();
+					// also let perf infos refresh
+					updatePerfInfos();
+					// update cache info
+					updateCacheInfo();
 				}
 			}});
 		pollThread.setDaemon(true);
diff --git a/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java b/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java
index d1e78ac30949921edc52138ce57cea43e4d66555..09fa64d04acdf40eeb3639519e16b9d04a9f3484 100644
--- a/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java
+++ b/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java
@@ -25,6 +25,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.chiefcontrollers.LanguageChangedEvent;
 import org.olat.core.commons.fullWebApp.DefaultMinimalTopNavController;
+import org.olat.core.commons.fullWebApp.TopNavController;
 import org.olat.core.dispatcher.impl.StaticMediaDispatcher;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.Windows;
@@ -64,7 +65,7 @@ import org.olat.search.ui.SearchInputController;
  * 
  * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com
   */
-public class ContextHelpTopNavController extends FormBasicController {
+public class ContextHelpTopNavController extends FormBasicController implements TopNavController {
 	static final OLATResourceable CHANGE_LANG_RESOURCE = OresHelper.createOLATResourceableType("ContextHelp:ChangeLanguageChannel");
 
 	private SingleSelection langSelection;
@@ -91,6 +92,11 @@ public class ContextHelpTopNavController extends FormBasicController {
 		initForm(ureq);
 	}
 
+	@Override
+	public void lockResource(OLATResourceable resource) {
+		//
+	}
+
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		SearchServiceUIFactory searchUIFactory = (SearchServiceUIFactory)CoreSpringFactory.getBean(SearchServiceUIFactory.class);
diff --git a/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java b/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java
index 7882ecc7244c7d8085750ebfdaae7044b915ad71..4f504b39699bea67be025af2a6caf9a437c15308 100644
--- a/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java
+++ b/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java
@@ -201,13 +201,13 @@ public class ImpressumAdminController extends FormBasicController {
 			impressumCont.setVisible(enabled);
 			
 			getWindowControl().getWindowBackOffice().getWindow().setDirty(true);
-			Windows.getWindows(ureq).getChiefController().wishReload(true);
+			Windows.getWindows(ureq).getChiefController().wishReload(ureq, true);
 		} else if(positionEl == source) {
 			if(positionEl.isOneSelected()) {
 				String key = positionEl.getSelectedKey();
 				impressumModule.setPosition(key);
 				getWindowControl().getWindowBackOffice().getWindow().setDirty(true);
-				Windows.getWindows(ureq).getChiefController().wishReload(true);
+				Windows.getWindows(ureq).getChiefController().wishReload(ureq, true);
 			}
 		} else if(source instanceof FormLink) {
 			FormLink link = (FormLink)source;
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 10e99394f959a06cb31e68a61d704c6a2e05021b..74a4676615da10575e2f3e58622bc99b138fa270 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -81,7 +81,6 @@ import org.olat.core.gui.control.navigation.SiteInstance;
 import org.olat.core.gui.control.util.ZIndexWrapper;
 import org.olat.core.gui.control.winmgr.JSCommand;
 import org.olat.core.gui.themes.Theme;
-import org.olat.core.gui.util.SyntheticUserRequest;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.BusinessControlFactory;
@@ -846,12 +845,19 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 	}
 	
 	@Override
-	public boolean wishReload(boolean erase) {
+	public boolean wishReload(UserRequest ureq, boolean erase) {
 		boolean screen = getScreenMode().wishScreenModeSwitch(erase);
 		boolean r = (reload == null ? false : reload.booleanValue());
 		if(erase && reload != null) {
 			reload = null;
 		}
+		
+		if(openAssessmentModeConfirmation != null && openAssessmentModeConfirmation.booleanValue()) {
+			openAssessmentmodeConfirmation(ureq, mode);
+			r = true;
+		}
+		
+		
 		return r || screen;
 	}
 
@@ -1239,14 +1245,25 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 		}
 	}
 	
+	private Boolean openAssessmentModeConfirmation = Boolean.FALSE;
+	private TransientAssessmentMode mode;
+	
 	private void asyncLockResource(TransientAssessmentMode mode) {
 		logAudit("Async lock resource for user: " + getIdentity().getName() + " (" + mode.getResource() + ")", null);
 		lockResource(mode.getResource());
 		
-		UserRequest ureq = new SyntheticUserRequest(getIdentity(), getLocale());
-		modeCtrl = new AssessmentModeUserConfirmationController(ureq, getWindowControl(), Collections.singletonList(mode));
-		listenTo(modeCtrl);
-		modeCtrl.getInitialComponent();
+		this.mode = mode;
+		openAssessmentModeConfirmation = true;
+	}
+	
+	private void openAssessmentmodeConfirmation(UserRequest ureq, TransientAssessmentMode mode) {
+		if(modeCtrl != null) return;
+		
+		if(openAssessmentModeConfirmation != null && openAssessmentModeConfirmation) {
+			modeCtrl = new AssessmentModeUserConfirmationController(ureq, getWindowControl(), Collections.singletonList(mode));
+			listenTo(modeCtrl);
+			modeCtrl.getInitialComponent();
+		}
 	}
 
 	/**
diff --git a/src/main/java/org/olat/core/gui/UserRequestImpl.java b/src/main/java/org/olat/core/gui/UserRequestImpl.java
index 2d6b05e5a1c1c59b5d3a45bf5799bc1444f595cd..e498358c5fff7fd12aaa6bc0938aead9f707fb83 100644
--- a/src/main/java/org/olat/core/gui/UserRequestImpl.java
+++ b/src/main/java/org/olat/core/gui/UserRequestImpl.java
@@ -83,7 +83,6 @@ public class UserRequestImpl implements UserRequest {
 
 	private boolean isValidDispatchURI;
 
-	//fxdiff BAKS-7 Resume function
 	private String uuid;
 	private static int count = 0;
 
@@ -102,15 +101,15 @@ public class UserRequestImpl implements UserRequest {
 		dispatchResult = new DispatchResult();
 		parseRequest(httpReq);
 
-		//fxdiff BAKS-7 Resume function
 		uuid = Integer.toString(++count);
 	}
 
-	//fxdiff BAKS-7 Resume function
+	@Override
 	public String getUuid() {
 		return uuid;
 	}
-	
+
+	@Override
 	public String getUriPrefix() {
 		return uriPrefix;
 	}
@@ -119,6 +118,7 @@ public class UserRequestImpl implements UserRequest {
 	 * @param key
 	 * @return the value of the parameter with key 'key'
 	 */
+	@Override
 	public String getParameter(String key) {
 		return params.get(key);
 	}
@@ -126,6 +126,7 @@ public class UserRequestImpl implements UserRequest {
 	/**
 	 * @return the Set of parameters
 	 */
+	@Override
 	public Set<String> getParameterSet() {
 		return params.keySet();
 	}
@@ -133,17 +134,18 @@ public class UserRequestImpl implements UserRequest {
 	/**
 	 * @return the http request
 	 */
+	@Override
 	public HttpServletRequest getHttpReq() {
 		return httpReq;
 	}
 
 	/**
-	 * @return the usersession
+	 * @return The openolat user session
 	 */
+	@Override
 	public UserSession getUserSession() {
-		//FIXME:fj:b cache usersession here
 		UserSession result = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(getHttpReq());
-		if (result==null) {
+		if (result == null) {
 			log.warn("getUserSession: null, this="+this, new RuntimeException("getUserSession"));
 		}
 		return result;
diff --git a/src/main/java/org/olat/core/gui/Windows.java b/src/main/java/org/olat/core/gui/Windows.java
index ad750e38c7c301fb3bbf0c10a67a9322a42aee28..36181cf9f8a129676d947060673bc5a9bc8deecf 100644
--- a/src/main/java/org/olat/core/gui/Windows.java
+++ b/src/main/java/org/olat/core/gui/Windows.java
@@ -30,6 +30,9 @@ import java.io.Serializable;
 import java.util.Iterator;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.servlet.http.HttpServletRequest;
+
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.components.Window;
 import org.olat.core.gui.control.ChiefController;
 import org.olat.core.gui.control.Disposable;
@@ -38,6 +41,7 @@ import org.olat.core.gui.util.bandwidth.SlowBandWidthSimulator;
 import org.olat.core.gui.util.bandwidth.SlowBandWidthSimulatorImpl;
 import org.olat.core.util.FIFOMap;
 import org.olat.core.util.UserSession;
+import org.olat.core.util.session.UserSessionManager;
 
 /**
  * @author Felix Jost
@@ -72,6 +76,14 @@ public class Windows implements Disposable, Serializable {
 		UserSession us = ureq.getUserSession();
 		return getWindows(us);
 	}
+	
+	public static Windows getWindows(HttpServletRequest request) {
+		UserSession us = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(request);
+		if (us == null) {
+			return null;
+		}
+		return getWindows(us);
+	}
 
 	/**
 	 * @param us
diff --git a/src/main/java/org/olat/core/gui/components/Window.java b/src/main/java/org/olat/core/gui/components/Window.java
index cc0f3fdd0e645433c03a43e076e72b0ee345918f..28011bf1a17a2e0cc66e22afb4209626d353f4e1 100644
--- a/src/main/java/org/olat/core/gui/components/Window.java
+++ b/src/main/java/org/olat/core/gui/components/Window.java
@@ -336,7 +336,7 @@ public class Window extends AbstractComponent {
 						boolean didDispatch = false;
 						boolean forceReload = false;
 						if (validForDispatching) {
-							DispatchResult dispatchResult = doDispatchToComponent(ureq, null);  // FIXME:fj:c enable time stats for ajax-mode
+							DispatchResult dispatchResult = doDispatchToComponent(ureq, null);
 							didDispatch = dispatchResult.isDispatch();
 							incTimestamp = dispatchResult.isIncTimestamp();
 							forceReload = dispatchResult.isForceReload();
@@ -354,6 +354,7 @@ public class Window extends AbstractComponent {
 							String reRenderUri = buildURIFor(this, timestampID, null);
 							Command rmrcom = CommandFactory.createParentRedirectTo(reRenderUri);
 							wbackofficeImpl.sendCommandTo(rmrcom);
+							System.out.println("Redirect");
 						} else if (didDispatch || !validForDispatching) {
 							if (validForDispatching) {
 								Window ww = ureq.getDispatchResult().getResultingWindow();
@@ -478,7 +479,6 @@ public class Window extends AbstractComponent {
 								// create a mapper which maps this mediaresource, and serves it once only
 								MediaResourceMapper extMRM = new MediaResourceMapper();
 								extMRM.setMediaResource(mmr);
-								//FIXME:fj:b deregister old mapper, or reuse current one
 								String res = CoreSpringFactory.getImpl(MapperService.class).register(ureq.getUserSession(), extMRM) + "/";
 								// e.g. res = /olat/m/10001/
 								Command rmrcom = CommandFactory.createParentRedirectForExternalResource(res);
@@ -622,7 +622,6 @@ public class Window extends AbstractComponent {
 					long dstop = System.currentTimeMillis();
 					long diff = dstop - dstart;
 					debugMsg.append("disp_comp:").append(diff).append(LOG_SEPARATOR);
-					//Tracing.logDebug("componentdispatchtime: " + (dstop - dstart), Window.class);
 				}
 				if (didDispatch) { // the component with the given id was found
 					mr = ureq.getDispatchResult().getResultingMediaResource();
@@ -1052,7 +1051,7 @@ public class Window extends AbstractComponent {
 	 * @param bc the businesscontrolpath
 	 * @return the new (relative) url as a string
 	 */
-	private String buildURIFor(Window win, String timestampId, String moduleUri) {
+	public String buildURIFor(Window win, String timestampId, String moduleUri) {
 		URLBuilder ubu = new URLBuilder(uriPrefix, win.getInstanceId(), timestampId, wbackofficeImpl);
 		StringOutput so = new StringOutput();
 		ubu.buildURI(so, null, null, moduleUri, 0);
@@ -1145,7 +1144,7 @@ public class Window extends AbstractComponent {
 		}
 		
 		ChiefController chief = Windows.getWindows(ureq).getChiefController();
-		boolean reload = chief == null ? false : chief.wishReload(true);
+		boolean reload = chief == null ? false : chief.wishReload(ureq, true);
 		return new DispatchResult(toDispatch, incTimestamp, reload);
 	}
 	
@@ -1185,23 +1184,6 @@ public class Window extends AbstractComponent {
 			}
 		} // else: a component with -no- controller as listener, makes no sense in 99.99% of the cases; ignore in those rare cases
 	}
-	
-	private List<Component> findComponentsWithChildName(final String childName, Component searchRoot) {
-		final List<Component> founds = new ArrayList<Component>();
-		ComponentTraverser ct = new ComponentTraverser(new ComponentVisitor(){
-			public boolean visit(Component comp, UserRequest ureq) {
-				if(comp.getParent()==null){
-					return true;
-				}
-				if (comp.getParent().getComponent(childName) == comp) {
-					founds.add(comp);
-				}
-				return true;
-			}}, searchRoot, true);
-		ct.visitAll(null);
-		return founds;
-	}
-
 
 	/**
 	 * Sets the asyncMediaResponsible.
diff --git a/src/main/java/org/olat/core/gui/control/ChiefController.java b/src/main/java/org/olat/core/gui/control/ChiefController.java
index 158d6a01993d60b0b23e8b7efa750b5c82ab112c..aa3e07781de1c8e3ba07630992aa172d3a82c9ba 100644
--- a/src/main/java/org/olat/core/gui/control/ChiefController.java
+++ b/src/main/java/org/olat/core/gui/control/ChiefController.java
@@ -26,6 +26,7 @@
 
 package org.olat.core.gui.control;
 
+import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Window;
 import org.olat.core.gui.components.htmlheader.jscss.CustomCSS;
 import org.olat.core.gui.control.navigation.SiteInstance;
@@ -48,7 +49,7 @@ public interface ChiefController extends Controller {
 	
 	public ScreenMode getScreenMode();
 	
-	public boolean wishReload(boolean erase);
+	public boolean wishReload(UserRequest ureq, boolean erase);
 	
 	public void lockResource(OLATResourceable resource);
 	
diff --git a/src/main/java/org/olat/core/gui/control/DefaultChiefController.java b/src/main/java/org/olat/core/gui/control/DefaultChiefController.java
index eeb0a7c656966ecad62d70a27d8ca74d39eb186d..b2b0d1e2376e38a6a2b4285aa17528db48a7d24d 100644
--- a/src/main/java/org/olat/core/gui/control/DefaultChiefController.java
+++ b/src/main/java/org/olat/core/gui/control/DefaultChiefController.java
@@ -65,7 +65,7 @@ public abstract class DefaultChiefController extends DefaultController implement
 	}
 
 	@Override
-	public boolean wishReload(boolean erase) {
+	public boolean wishReload(UserRequest ureq, boolean erase) {
 		return false;
 	}
 
diff --git a/src/main/java/org/olat/core/gui/control/WindowBackOffice.java b/src/main/java/org/olat/core/gui/control/WindowBackOffice.java
index 82914fd2d6b69c756ff1bb7b8967d2c936707b85..af079acb8db5fc5a98aeac5221ff861e6def5301 100644
--- a/src/main/java/org/olat/core/gui/control/WindowBackOffice.java
+++ b/src/main/java/org/olat/core/gui/control/WindowBackOffice.java
@@ -110,13 +110,6 @@ public interface WindowBackOffice extends Disposable{
 	 * @return
 	 */
 	public GuiStack createGuiStack(Component initialComponent);
-	
-	/**
-	 * Use this method for asynchronous updates to the gui. <br>
-	 * invokes the runnable at a time when it is safe, that is the dispatching and rendering of the window is not disturbed.
-	 * @param runnable the runnable
-	 */
-	public void invokeLater(Runnable runnable);
 
 	/**
 	 * @param wco the Command to be sent to the client (all requests are queued and sent in a batch at the end of the request)
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java b/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java
index 9c8e5d8dae75978fd5588dd2d9d7e25b24e28b07..b2eb001fa86f173f5559c6cd7a16d50c8b64cece 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java
@@ -45,6 +45,8 @@ import org.olat.core.dispatcher.impl.StaticMediaDispatcher;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.dispatcher.mapper.MapperService;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.UserRequestImpl;
+import org.olat.core.gui.Windows;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.Window;
 import org.olat.core.gui.components.panel.Panel;
@@ -123,10 +125,23 @@ public class AjaxController extends DefaultController {
 				// check for dirty components now.
 				wboImpl.fireCycleEvent(Window.BEFORE_INLINE_RENDERING);
 				Command updateDirtyCom = window.handleDirties();
+				
+				ChiefController cc = Windows.getWindows(request).getChiefController();
+				String uriPrefix = DispatcherModule.getLegacyUriPrefix(request);
+				UserRequest ureq = new UserRequestImpl(uriPrefix, request, null);
+				boolean reload = cc.wishReload(ureq, false);
+				System.out.println("Reload: " + reload);
+				
 				wboImpl.fireCycleEvent(Window.AFTER_INLINE_RENDERING);
 				if (updateDirtyCom != null) {
 					synchronized (windowcommands) { //o_clusterOK by:fj
 						windowcommands.add(new WindowCommand(wboImpl, updateDirtyCom));
+						if(reload) {
+							String timestampID = ureq.getTimestampID();
+							String reRenderUri = window.buildURIFor(window, timestampID, null);
+							Command rmrcom = CommandFactory.createParentRedirectTo(reRenderUri);
+							windowcommands.add(new WindowCommand(wboImpl, rmrcom));
+						}
 					}
 				}
 				MediaResource mr = extractMediaResource(false);
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java b/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java
index 7b2e072f40cb37efe9503e9558916fd44cd851b9..28e9146027e00143a65bc078bf62e8dc24c0b8b4 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java
@@ -38,25 +38,6 @@ import org.olat.core.logging.AssertException;
  */
 public class JSCommand extends Command {
 
-// TODO: commented out since not implemented in functions.js: execute a
-// method on a json object with some data
-//	/**
-//	 * @param command
-//	 */
-//	public JSCommand(Component target, String fktName, JSONObject data) {
-//		super(1); // do not change this command id, it is in js also
-//		String jsObjectName = "o_jso"+target.getDispatchID();
-//		JSONObject subjo = new JSONObject();
-//		try {
-//			subjo.put("jso", jsObjectName);
-//			subjo.put("f", fktName);
-//			subjo.put("data", data);
-//		} catch (JSONException e) {
-//			throw new AssertException("json exception:", e);
-//		}
-//		setSubJSON(subjo);		
-//	}
-
 	/**
 	 * Create a command that executes arbitrary JS code
 	 * @param javaScriptCode
@@ -71,5 +52,4 @@ public class JSCommand extends Command {
 		}
 		setSubJSON(subjo);		
 	}
-
 }
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/RedrawComponentsCommand.java b/src/main/java/org/olat/core/gui/control/winmgr/RedrawComponentsCommand.java
deleted file mode 100644
index 64df4674bcc0e2ec781dda7e8d205c427e6336ab..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/core/gui/control/winmgr/RedrawComponentsCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
-* OLAT - Online Learning and Training<br>
-* http://www.olat.org
-* <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
-* <p>
-* http://www.apache.org/licenses/LICENSE-2.0
-* <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>
-* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
-* University of Zurich, Switzerland.
-* <hr>
-* <a href="http://www.openolat.org">
-* OpenOLAT - Online Learning and Training</a><br>
-* This file has been modified by the OpenOLAT community. Changes are licensed
-* under the Apache 2.0 license as the original file.  
-* <p>
-*/ 
-
-package org.olat.core.gui.control.winmgr;
-
-
-/**
- * Description:<br>
- * Initial Date:  24.03.2006 <br>
- *
- * @author Felix Jost
- */
-public class RedrawComponentsCommand extends Command {
-
-	/**
-	 * @param command
-	 */
-	public RedrawComponentsCommand() {
-		super(2);
-	}
-
-}
diff --git a/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java b/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java
index 8726a4465c8eb7c238c70b13dbe998dd1c9addd6..5e849a90ad46432688c17f5c644984a6c8743c2c 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java
@@ -336,23 +336,6 @@ public class WindowBackOfficeImpl implements WindowBackOffice {
 		return new GuiStackNiceImpl(this, initialComponent);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.olat.core.gui.control.WindowBackOffice#invokeLater(java.lang.Runnable)
-	 */
-	@Override
-	public void invokeLater(Runnable runnable) {
-		// brasato:::: verify that this is now as it should be.
-		// improve by handling those tasks after a ongoing dispatch/render is finished,
-		// or when handleDirties is called.
-		// the current solution below blocks the async caller - e.g. a user firing an eventbus message may then wait for all users to complete their
-		// rendering process - normally way below 0.1 sec, but if we have 100 users which happen to just being rendered when the notifications takes place.
-		// -> 10 seconds delay! this is not very probable but possible.
-		
-		synchronized(window) {//cluster_ok
-			runnable.run();
-		}
-	}
-
 	public void fireCycleEvent(Event cycleEvent) {
 		for (GenericEventListener gel : cycleListeners) {
 			gel.event(cycleEvent);
diff --git a/src/main/java/org/olat/core/util/IPUtils.java b/src/main/java/org/olat/core/util/IPUtils.java
index bc916fb7a7bee1cbe8c445245ed4310bbc7e9502..b6f895cc6b4a56dfa14ed9c16d6362cc94259b67 100644
--- a/src/main/java/org/olat/core/util/IPUtils.java
+++ b/src/main/java/org/olat/core/util/IPUtils.java
@@ -19,7 +19,6 @@
  */
 package org.olat.core.util;
 
-import org.apache.commons.net.util.SubnetUtils;
 
 
 /**
@@ -44,11 +43,18 @@ public class IPUtils {
 		return result;
 	}
 	
-	public static boolean isValidRange(String ipWithMask, String ipToCheck) {
+	public static boolean isValidRange(String ipWithMask, String address) {
 		boolean allOk = false;
-		if(ipWithMask.indexOf("/") > 0) {
-			SubnetUtils utils = new SubnetUtils(ipWithMask);
-			allOk = utils.getInfo().isInRange(ipToCheck);	
+		int maskIndex = ipWithMask.indexOf("/");
+		if(maskIndex > 0) {
+			long bits = Long.parseLong(ipWithMask.substring(maskIndex + 1));
+			long subnet = ipToLong(textToNumericFormatV4(ipWithMask.substring(0, maskIndex)));
+			long ip = ipToLong(textToNumericFormatV4(address));
+			
+			long mask = -1 << (32 - bits);
+			if ((subnet & mask) == (ip & mask)) {
+				allOk = true;
+			}
 		}
 		return allOk;
 	}
diff --git a/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml b/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml
index eeaa6225ea61c9e6ad8f1bd160d15b9ba4023497..08c3575d860bee2f489c26ebaa4363af01c852fb 100644
--- a/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml
+++ b/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml
@@ -23,7 +23,7 @@
 	
 	<bean id="assessmentNotificationsTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
 	    <property name="jobDetail" ref="assessmentNotificationsJob" />
-	    <property name="cronExpression" value="25 */5 * * * ?" />
+	    <property name="cronExpression" value="25 * * * * ?" />
 	    <property name="startDelay" value="55000" />
 	</bean>
 	
diff --git a/src/main/webapp/static/js/functions.js b/src/main/webapp/static/js/functions.js
index 9acccb789d24a63a2531c62086e8c8a4e96bee3c..717a26b91060b2b72273cb3d959b15c2b0e5630c 100644
--- a/src/main/webapp/static/js/functions.js
+++ b/src/main/webapp/static/js/functions.js
@@ -716,7 +716,6 @@ function removeAjaxBusy() {
 		jQuery('#o_body').removeClass('o_ajax_busy');
 		jQuery('#o_ajax_busy_backdrop').remove();
 		jQuery('#o_ajax_busy').modal('hide');
-		console.log("Remove");
 	} catch (e) {
 		if(window.console) console.log(e);
 	}
diff --git a/src/test/java/org/olat/core/util/IPUtilsTest.java b/src/test/java/org/olat/core/util/IPUtilsTest.java
index 1fb4707a0e6e4d34d4ac3a7c6ea159b7d5335639..a01980f8c0d90749a362e3e6925fc4144847a35e 100644
--- a/src/test/java/org/olat/core/util/IPUtilsTest.java
+++ b/src/test/java/org/olat/core/util/IPUtilsTest.java
@@ -22,7 +22,7 @@ public class IPUtilsTest {
 		boolean  check2 = IPUtils.isValidRange(start, end, "192.168.5.45");
 		Assert.assertFalse(check2);
 	}
-	/*
+
 	@Test
 	public void checkRange_mask_31() {
 		String ipWithMask = "192.168.100.1/24";
@@ -37,5 +37,4 @@ public class IPUtilsTest {
 		boolean  notAllowed3 = IPUtils.isValidRange(ipWithMask, "212.34.100.0");
 		Assert.assertFalse(notAllowed3);
 	}
-	*/
 }
diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
index cafb42392f9c2262eb64c252af8e0ec76b04fc8e..9d26e3ae428daa82e824ca75dc43237ec1b4aa6e 100644
--- a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
@@ -594,6 +594,46 @@ public class AssessmentModeManagerTest extends OlatTestCase {
 		boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64");
 		Assert.assertFalse(notAllowed4);
 	}
+	
+	@Test
+	public void isIpAllowed_cidr() {
+		String ipList = "192.168.100.1/24";
+
+		boolean allowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.100.64");
+		Assert.assertTrue(allowed1);
+
+		//negative test
+		boolean notAllowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.99.129");
+		Assert.assertFalse(notAllowed1);
+		boolean notAllowed2 = assessmentModeMgr.isIpAllowed(ipList, "192.168.101.204");
+		Assert.assertFalse(notAllowed2);
+		boolean notAllowed3 = assessmentModeMgr.isIpAllowed(ipList, "192.167.100.1");
+		Assert.assertFalse(notAllowed3);
+		boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64");
+		Assert.assertFalse(notAllowed4);
+	}
+	
+	@Test
+	public void isIpAllowed_all() {
+		String ipList = "192.168.1.203\n192.168.30.1 - 192.168.32.128\n192.168.112.1/24";
+
+		boolean allowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.1.203");
+		Assert.assertTrue(allowed1);
+		boolean allowed2 = assessmentModeMgr.isIpAllowed(ipList, "192.168.31.203");
+		Assert.assertTrue(allowed2);
+		boolean allowed3 = assessmentModeMgr.isIpAllowed(ipList, "192.168.112.203");
+		Assert.assertTrue(allowed3);
+
+		//negative test
+		boolean notAllowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.99.129");
+		Assert.assertFalse(notAllowed1);
+		boolean notAllowed2 = assessmentModeMgr.isIpAllowed(ipList, "192.168.101.204");
+		Assert.assertFalse(notAllowed2);
+		boolean notAllowed3 = assessmentModeMgr.isIpAllowed(ipList, "192.167.100.1");
+		Assert.assertFalse(notAllowed3);
+		boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64");
+		Assert.assertFalse(notAllowed4);
+	}
 
 	private AssessmentMode createMinimalAssessmentmode(RepositoryEntry entry) {
 		AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);