diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeEditorController.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeEditorController.java
index 2f7998274cbb6157219177777387c26952ea7424..e7b2de05fa97be7b819c23b2761c6af9f741ba14 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeEditorController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeEditorController.java
@@ -30,6 +30,7 @@ import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeService;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.Window;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -66,7 +67,9 @@ public class OnlyOfficeEditorController extends BasicController {
 			final DocEditorConfigs configs, Access runAccess) {
 		super(ureq, wControl);
 		access = runAccess;
-
+		
+		wControl.getWindowBackOffice().getWindow().addListener(this);
+		
 		if (Mode.EDIT == access.getMode() && !onlyOfficeService.isEditLicenseAvailable()) {
 			access = docEditorService.updateMode(access, Mode.VIEW);
 			showWarning("editor.warning.no.edit.license");
@@ -113,11 +116,18 @@ public class OnlyOfficeEditorController extends BasicController {
 
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
-		//
+		if(event == Window.CLOSE_WINDOW) {
+			deleteAccess();
+		}
 	}
 
 	@Override
 	protected void doDispose() {
+		deleteAccess();
+		getWindowControl().getWindowBackOffice().getWindow().removeListener(this);
+	}
+	
+	private void deleteAccess() {
 		if (access != null) {
 			log.info("Document (key={}) closed with ONLYOFFICE ({}) by {}", openVfsMetadataKey, openMode,
 					getIdentity());
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 3bd19afeabd343137d2ad937a6ee30375ee73abb..eab39e3cd0f4e0b3c73c936bf3b06492c15345f7 100644
--- a/src/main/java/org/olat/core/gui/components/Window.java
+++ b/src/main/java/org/olat/core/gui/components/Window.java
@@ -145,6 +145,8 @@ public class Window extends AbstractComponent implements CustomCSSDelegate {
 
 		
 	public static final Event AFTER_VALIDATING = new Event("before_validate");
+	
+	public static final Event CLOSE_WINDOW = new Event("close-window");
 
 	/**
 	 * fired just before the targetcomponent.dispatch takes places
@@ -306,6 +308,7 @@ public class Window extends AbstractComponent implements CustomCSSDelegate {
 	/**
 	 * @see org.olat.core.gui.components.Component#dispatchRequest(org.olat.core.gui.UserRequest)
 	 */
+	@Override
 	protected void doDispatchRequest(UserRequest ureq) {
 		dispatchRequest(ureq, false);
 	}
@@ -320,8 +323,9 @@ public class Window extends AbstractComponent implements CustomCSSDelegate {
 		final String timestampID = ureq.getTimestampID() == null ? "1" : ureq.getTimestampID();
 		final String componentID = ureq.getComponentID();
 		final boolean closeWindow = "close-window".equals(ureq.getParameter("cid"));
-		
-		setMarkToBeRemoved(false);
+		if(!closeWindow) {
+			setMarkToBeRemoved(false);
+		}
 
 		// case windowId timestamp componentId
 		// --------------------------------------------
@@ -432,9 +436,10 @@ public class Window extends AbstractComponent implements CustomCSSDelegate {
 							forceReload = dispatchResult.isForceReload();
 							if (isDebugLog) {
 								long durationAfterDoDispatchToComponent = System.currentTimeMillis() - debug_start;
-								log.debug("Perf-Test: Window durationAfterDoDispatchToComponent=" + durationAfterDoDispatchToComponent);
+								log.debug("Perf-Test: Window durationAfterDoDispatchToComponent={}", durationAfterDoDispatchToComponent);
 							}
 							if(closeWindow) {
+								fireEvent(ureq, CLOSE_WINDOW);
 								ureq.getHttpResp().setStatus(HttpServletResponse.SC_NOT_MODIFIED);
 								return;
 							}
@@ -649,6 +654,9 @@ public class Window extends AbstractComponent implements CustomCSSDelegate {
 				inline = true;
 				validate = true;
 				wbackofficeImpl.fireCycleEvent(BEFORE_RENDER_ONLY);
+				if(closeWindow) {
+					fireEvent(ureq, CLOSE_WINDOW);
+				}
 			} else if (validatingCausedRerendering && timestampID.equals("-1")) {
 				// the first request after the 302 redirect cause by a component validation 
 				// -> just rerender, but clear the flag for further async media requests
@@ -722,6 +730,7 @@ public class Window extends AbstractComponent implements CustomCSSDelegate {
 					debugMsg.append("disp_comp:").append(diff).append(LOG_SEPARATOR);
 				}
 				if(closeWindow) {
+					fireEvent(ureq, CLOSE_WINDOW);
 					ureq.getHttpResp().setStatus(HttpServletResponse.SC_NOT_MODIFIED);
 					return;
 				}