diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
index ce0229688dc81390dae0fa1d9d6ead70a00e33f4..c7116fbf9a9af9d60cc5d31d580261bfab2da46e 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
@@ -84,6 +84,7 @@ drawing.opacity=Deckkraft
 error.as.directed=Alle 4 Antwortm\u00F6glichkeiten m\u00FCssen entweder mit Richtig oder Falsch beantwortet werden.
 error.as.directed.kprim=Bitte beantworten Sie die Frage wie vorgegeben.
 error.assessment.item=Die Datei konnte nicht gelesen werden. Sie ist entweder korrupt oder mit dem falschen Format gespeichert.
+error.assessment.item.missing=Die Datei der Frage konnte nicht gelesen werden.
 error.choice=Sie m\u00FCssen ein von den folgenden Optionen w\u00E4hlen.
 error.digital.certificate.noX509=Es wurde kein X509 Zertifikat gefunden.
 error.digital.certificate.noPrivateKey=Es wurde kein "Private key" im Zertifikat gefunden. Sie ist erforderlich.
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
index 3b9745a9781390203323843f429313964befccc4..a8cc64a710d1010c3e95d4fb5d406ff3cc6c17c6 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
@@ -84,6 +84,7 @@ drawing.opacity=Opacity
 error.as.directed=Please complete this interaction as directed.
 error.as.directed.kprim=Please complete this interaction as directed.
 error.assessment.item=The file cannot be interpreted. It seems corrupted or with the wrong format.
+error.assessment.item.missing=The file of the question cannot be read.
 error.choice=You must select one of the following options
 error.digital.certificate.noX509=The X509 certificate could not be found in the uploaded file.
 error.digital.certificate.noPrivateKey=The "private key" could not be found. It is mandatory.
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java
index 2042a5bf980285bec5f91a2f31a8e5319d02d5e3..22cce086e3a2de7d6c8f3046066e2ef88dbf2763 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java
@@ -198,6 +198,10 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
 	protected void renderExploded(StringOutput sb, Translator translator) {
 		sb.append("<div class='o_error'>").append(translator.translate("exploded.msg")).append("</div>");
     }
+	
+	protected void renderMissingItem(StringOutput sb, Translator translator) {
+		sb.append("<div class='o_error'>").append(translator.translate("error.assessment.item.missing")).append("</div>");
+    }
 
     protected void renderTerminated(StringOutput sb, Translator translator) {
 		sb.append("<div class='o_info o_sel_assessment_test_terminated'>").append(translator.translate("terminated.msg")).append("</div>");
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
index 3022903920f9fcde02e33c5463aea05e359baa2c..94438a7f5f99a8791f2093831b5acf3250779b30 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
@@ -336,6 +336,12 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe
 		URI itemSystemId = itemNode.getItemSystemId();
 		ResolvedAssessmentItem resolvedAssessmentItem = component.getResolvedAssessmentTest()
 				.getResolvedAssessmentItemBySystemIdMap().get(itemSystemId);
+		if(resolvedAssessmentItem == null) {
+			log.error("Missing assessment item: " + itemSystemId);
+			renderMissingItem(sb, translator);
+			return;
+		}
+		
 		final AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful();
 
 		sb.append("<div class='o_assessmentitem_wrapper'>");
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
index 2b706a4e3dd39863a9c7c66c182b0a90d531e134..bd2159fa6e1f8ea8a288696d8360e960516407d0 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
@@ -176,7 +176,9 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 	
 	private final boolean survey = false;
 	private final boolean restrictedEdit;
+	
 	private boolean assessmentChanged = false;
+	private boolean deleteAuthorSesssion = false;
 	
 	private LockResult lockEntry;
 	private LockResult activeSessionLock;
@@ -410,7 +412,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		} else if(event instanceof AssessmentItemEvent) {
 			AssessmentItemEvent aie = (AssessmentItemEvent)event;
 			if(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED.equals(aie.getCommand())) {
-				assessmentChanged = true;
+				assessmentChanged();
 				doSaveAssessmentTest(null);
 				doUpdate(aie.getAssessmentItemRef().getIdentifier(), aie.getAssessmentItem().getTitle());
 				doSaveManifest();
@@ -890,7 +892,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		URI testUri = resolvedAssessmentTest.getTestLookup().getSystemId();
 		File testFile = new File(testUri);
 		qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest);
-		assessmentChanged = true;
+		assessmentChanged();
 
 		//reload the test
 		updateTreeModel(false);
@@ -972,7 +974,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 	 * @param flyingObjects A list of assessmentItems which are not part of the test but will be.
 	 */
 	private void doSaveAssessmentTest(Map<AssessmentItemRef,AssessmentItem> flyingObjects) {
-		assessmentChanged = true;
+		assessmentChanged();
 		recalculateMaxScoreAssessmentTest(flyingObjects);
 		assessmentTestBuilder.build();
 		URI testURI = resolvedAssessmentTest.getTestLookup().getSystemId();
@@ -1215,7 +1217,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 	
 	private void doForceReloadFiles() {
 		updateTreeModel(true);
-		assessmentChanged = true;
+		assessmentChanged();
 	}
 	
 	private void doConfirmDelete(UserRequest ureq) {
@@ -1326,7 +1328,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 			}
 		}
 		if(deleted) {
-			assessmentChanged = true;
+			assessmentChanged();
 		}
 		
 		logAudit(removed + " " + deleted + " removed item ref", null);
@@ -1356,6 +1358,15 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		}
 		testPart.getParent().getTestParts().remove(testPart);
 	}
+	
+	private void assessmentChanged() {
+		assessmentChanged = true;
+		
+		if(!deleteAuthorSesssion) {
+			deleteAuthorSesssion = true;//delete sessions only once
+			qtiService.deleteAuthorAssessmentTestSession(testEntry);
+		}
+	}
 
 	private ResourceType getResourceType(AssessmentItemRef itemRef) {
 		return getResourceType(manifestBuilder, itemRef);