diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index 11f9d171ee04bbbd4c01a5ef64b708a458f1f40f..76dd7d61805357938bfb4661edbd003fc0cbb963 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -140,6 +140,8 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT
 
 	private static final int CURRENT_CONFIG_VERSION = 2;
 
+	private transient RepositoryEntry cachedReferenceRepositoryEntry;
+
 	public IQTESTCourseNode() {
 		this(null);
 	}
@@ -424,12 +426,27 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT
 		sd.setActivateableViewIdentifier(pane);
 		status.add(sd);
 	}
+	
+	/**
+	 * @return A cached instance of the reference repository entry. May be not suitable
+	 * 		to insert an assessment entry.
+	 */
+	public RepositoryEntry getCachedReferencedRepositoryEntry() {
+		RepositoryEntry cachedEntry = cachedReferenceRepositoryEntry;
+		if(IQEditController.matchIQReference(cachedEntry, getModuleConfiguration())) {
+			return cachedEntry;
+		}
+		// The method updates the cache
+		return getReferencedRepositoryEntry();
+	}
 
 	@Override
 	public RepositoryEntry getReferencedRepositoryEntry() {
 		// ",false" because we do not want to be strict, but just indicate whether
 		// the reference still exists or not
-		return IQEditController.getIQReference(getModuleConfiguration(), false);
+		RepositoryEntry entry = IQEditController.getIQReference(getModuleConfiguration(), false);
+		cachedReferenceRepositoryEntry = entry;
+		return entry;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/iq/IQEditController.java b/src/main/java/org/olat/course/nodes/iq/IQEditController.java
index 18b806325109a7c5cb7fb79ac6736c922c690b60..ee318a982f8c97a520ddee92d032f090cf27fda4 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQEditController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQEditController.java
@@ -389,6 +389,11 @@ public class IQEditController extends ActivateableTabbableDefaultController impl
 		moduleConfiguration.set(CONFIG_KEY_REPOSITORY_SOFTKEY, re.getSoftkey());
 	}
 	
+	public static boolean matchIQReference(RepositoryEntry re, ModuleConfiguration moduleConfiguration) {
+		String repoSoftkey = (String)moduleConfiguration.get(CONFIG_KEY_REPOSITORY_SOFTKEY);
+		return repoSoftkey != null && re != null && repoSoftkey.equals(re.getSoftkey());
+	}
+	
 	/**
 	 * Remove the reference to the repository entry.
 	 * 
diff --git a/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java b/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java
index 620b487e457d42760ba9fdfc1069a445d66918d4..001840a25e0cd60aa70f167e7e45aae53da02a40 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentConfig.java
@@ -78,7 +78,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig {
 				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
 			maxScore = (Float) config.get(IQEditController.CONFIG_KEY_MAXSCORE);
 		} else {
-			RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry();
+			RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry();
 			if (testEntry != null) {
 				if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) {
 					AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry);
@@ -107,7 +107,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig {
 				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
 			minScore = (Float) config.get(IQEditController.CONFIG_KEY_MINSCORE);
 		} else {
-			RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry();
+			RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry();
 			if (testEntry != null) {
 				if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) {
 					AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry);
@@ -135,7 +135,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig {
 				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
 			mode = Mode.setByNode;
 		} else {
-			RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry();
+			RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry();
 			if (testEntry != null) {
 				if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) {
 					AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry);
@@ -168,7 +168,7 @@ public class IQTESTAssessmentConfig implements AssessmentConfig {
 				|| IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) {
 			cutValue = (Float) config.get(IQEditController.CONFIG_KEY_CUTVALUE);
 		} else {
-			RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry();
+			RepositoryEntry testEntry = courseNode.getCachedReferencedRepositoryEntry();
 			if (testEntry != null) {
 				if(QTIResourceTypeModule.isQtiWorks(testEntry.getOlatResource())) {
 					AssessmentTest assessmentTest = courseNode.loadAssessmentTest(testEntry);
diff --git a/src/main/java/org/olat/modules/ceditor/ui/PageEditorV2Controller.java b/src/main/java/org/olat/modules/ceditor/ui/PageEditorV2Controller.java
index 0f644a53f705b4c8472a2d3637f893fe92feb251..cd0cb07a3a87e7a6c8524544d5c3274ed80c4c95 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/PageEditorV2Controller.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/PageEditorV2Controller.java
@@ -63,6 +63,7 @@ import org.olat.modules.ceditor.ui.event.MoveDownElementEvent;
 import org.olat.modules.ceditor.ui.event.MoveUpElementEvent;
 import org.olat.modules.ceditor.ui.event.OpenAddElementEvent;
 import org.olat.modules.ceditor.ui.event.PositionEnum;
+import org.olat.modules.ceditor.ui.event.SaveElementEvent;
 
 /**
  * 
@@ -215,6 +216,8 @@ public class PageEditorV2Controller extends BasicController {
 			doDrop(ureq, (DropToEditorEvent)event);
 		} else if(event instanceof DropToPageElementEvent) {
 			doDrop(ureq, (DropToPageElementEvent)event);
+		} else if(event instanceof SaveElementEvent) {
+			fireEvent(ureq, Event.CHANGED_EVENT);
 		}
 	}
 	
@@ -228,6 +231,8 @@ public class PageEditorV2Controller extends BasicController {
 			}
 			return true;
 		}, editorCmp, false).visitAll(ureq);
+
+		fireEvent(ureq, Event.CHANGED_EVENT);
 	}
 	
 	private void doCloseEditionEvent(UserRequest ureq, String elementId) {
diff --git a/src/main/java/org/olat/modules/ceditor/ui/component/ContentEditorFragmentComponent.java b/src/main/java/org/olat/modules/ceditor/ui/component/ContentEditorFragmentComponent.java
index de2c1e07473ac8bd45525c76a1daf776f7f4574b..337d99de699f35b79578949d560c336c55b26f26 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/component/ContentEditorFragmentComponent.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/component/ContentEditorFragmentComponent.java
@@ -46,6 +46,7 @@ import org.olat.modules.ceditor.ui.event.MoveDownElementEvent;
 import org.olat.modules.ceditor.ui.event.MoveUpElementEvent;
 import org.olat.modules.ceditor.ui.event.OpenAddElementEvent;
 import org.olat.modules.ceditor.ui.event.PositionEnum;
+import org.olat.modules.ceditor.ui.event.SaveElementEvent;
 
 /**
  * 
@@ -147,6 +148,7 @@ public class ContentEditorFragmentComponent extends FormBaseComponentImpl implem
 					break;
 				case "save_element":
 					doCloseEditFragment();
+					fireEvent(ureq, new SaveElementEvent(this));
 					break;
 				case "delete_element":
 					fireEvent(ureq, new DeleteElementEvent(this));
@@ -209,6 +211,7 @@ public class ContentEditorFragmentComponent extends FormBaseComponentImpl implem
 			((PageElementEditorController)editorPart).setEditMode(false);
 		}
 		setDirty(true);
+		
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/ceditor/ui/event/SaveElementEvent.java b/src/main/java/org/olat/modules/ceditor/ui/event/SaveElementEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0bae30834a09a828f5887c52352e56a6324e881
--- /dev/null
+++ b/src/main/java/org/olat/modules/ceditor/ui/event/SaveElementEvent.java
@@ -0,0 +1,48 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <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 the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <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>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.ceditor.ui.event;
+
+import org.olat.core.gui.control.Event;
+import org.olat.modules.ceditor.ui.component.ContentEditorFragment;
+
+/**
+ * 
+ * Initial date: 24 juin 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class SaveElementEvent extends Event {
+
+	private static final long serialVersionUID = 3300706246686745496L;
+
+	public static final String SAVE_ELEMENT = "ce-save-element";
+	
+	private final ContentEditorFragment component;
+	
+	public SaveElementEvent(ContentEditorFragment component) {
+		super(SAVE_ELEMENT);
+		this.component = component;
+	}
+	
+	public ContentEditorFragment getComponent() {
+		return component;
+	}
+
+}