diff --git a/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java b/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java
index 3fa85d242bc1618322ac908441832ab75d19a993..7c92ed6a4721f5e2d440b1a361bf80b572845b4e 100644
--- a/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java
+++ b/src/main/java/org/olat/course/statistic/StatisticCourseNodesController.java
@@ -183,7 +183,7 @@ public class StatisticCourseNodesController extends BasicController implements A
 		removeAsListenerAndDispose(currentCtrl);
 		currentCtrl = null;
 		
-		WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance(selectedNode.getIdent(), 0l), null);
+		WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstanceWithoutCheck(selectedNode.getIdent(), 0l), null);
 		if(selectedNode instanceof StatisticResourceNode) {
 			StatisticResourceNode node = (StatisticResourceNode)selectedNode;
 			currentCtrl = node.getResult().getController(ureq, swControl, stackPanel, node);
diff --git a/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java b/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java
index 15a211e1e59ce3a566ce4645ebee41fe85b73a1b..b679d9585762a413b89ccd9da0430f40b41f3397 100644
--- a/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java
+++ b/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java
@@ -29,8 +29,11 @@ import org.olat.core.gui.components.tree.TreeModel;
 import org.olat.core.gui.components.tree.TreeNode;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.generic.messages.MessageUIFactory;
+import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.CodeHelper;
+import org.olat.core.util.Util;
 import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -89,14 +92,16 @@ public class QTIStatisticResourceResult implements StatisticResourceResult {
 		} else {
 			resolver = new ImsRepositoryResolver(qtiRepositoryEntry);
 			Document doc = resolver.getQTIDocument();
-			ParserManager parser = new ParserManager();
-			qtiDocument = (QTIDocument) parser.parse(doc);
-			if (courseNode instanceof IQSURVCourseNode) {
-				type = QTIType.survey;
-			} else if (courseNode instanceof IQTESTCourseNode) {
-				type = QTIType.test;
-			} else if (courseNode instanceof IQSELFCourseNode){
-				type = QTIType.self;
+			if(doc != null) {
+				ParserManager parser = new ParserManager();
+				qtiDocument = (QTIDocument) parser.parse(doc);
+				if (courseNode instanceof IQSURVCourseNode) {
+					type = QTIType.survey;
+				} else if (courseNode instanceof IQTESTCourseNode) {
+					type = QTIType.test;
+				} else if (courseNode instanceof IQSELFCourseNode){
+					type = QTIType.self;
+				}
 			}
 		}
 	}
@@ -184,7 +189,11 @@ public class QTIStatisticResourceResult implements StatisticResourceResult {
 	private Controller createAssessmentController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
 			boolean printMode) {
 		Controller ctrl;
-		if (type == QTIType.onyx){
+		if (type == null) {
+			Translator translator = Util.createPackageTranslator(QTI12AssessmentStatisticsController.class, ureq.getLocale());
+			String text = translator.translate("error.notfound.text");
+			ctrl = MessageUIFactory.createErrorMessage(ureq, wControl, null, text);
+		} else if (type == QTIType.onyx){
 			ctrl = new QTI21OnyxAssessmentStatisticsController(ureq, wControl, this, printMode);
 		} else {
 			ctrl = new QTI12AssessmentStatisticsController(ureq, wControl, stackPanel, this, printMode);
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties
index ffb723fc72d9a4f236033a762e4ce8ff8a03139c..124433223caa40943583f805c12763a66d009ec1 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties
@@ -83,4 +83,5 @@ fig.median=Median
 print=Drucken
 section=Sektion
 retrievetest.confirm.text.plural=Wollen Sie wirklich die Tests von "{0}" einziehen?
-retrievetest.nothing.todo=Es gibt zurzeit kein Test dass Sie einziehen k\u00F6nnen.
\ No newline at end of file
+retrievetest.nothing.todo=Es gibt zurzeit kein Test dass Sie einziehen k\u00F6nnen.
+error.notfound.text=Das Test-Datei konnte nicht ge\u00F6ffnet werden und die Statistiken konnten nicht angezeigt werden.
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties
index fa59a3d47a2f9bb3c6bf5f62e9d3699cfc8a831a..e470ac1d094f009de8156f45839de77851d2b767 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties
@@ -42,6 +42,7 @@ chart.thisquestionwrongansweredpercent={0}% of the participants did not answer t
 chart.title.completiontime=Completion time
 chart.title.ovpassedfailed=Passed / Failed
 download.raw.data=Download raw data
+error.notfound.text=The file with the test cannot be opened and the statistics cannot be shown.
 essay.warning.test=This test contains question of type essay. Please navigate to the respective question for further analysis.
 essay.warning.survey=This questionnaire contains question of type essay. Please navigate to the respective question for further analysis.
 fig.averagedur=Average completion time
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index dac41a7fe0bb231503087a3e078e06775934b521..d84fd1341d493ace6175be2404b47077bd7d121e 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -610,6 +610,7 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa
     @Override
 	public AssessmentResult getAssessmentResult(AssessmentTestSession candidateSession) {
     	File assessmentResultFile = getAssessmentResultFile(candidateSession);
+    	System.out.println(assessmentResultFile);
     	ResourceLocator fileResourceLocator = new PathResourceLocator(assessmentResultFile.getParentFile().toPath());
 		ResourceLocator inputResourceLocator = 
         		ImsQTI21Resource.createResolvingResourceLocator(fileResourceLocator);
diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java b/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java
index bcb87fc28f5560e6fc1ea14718f3130d4f37f299..6738fd510c836c47b556a33210a3ccc86cea9397 100644
--- a/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java
+++ b/src/main/java/org/olat/ims/qti21/pool/QTI21AssessmentItemFactory.java
@@ -56,6 +56,7 @@ public class QTI21AssessmentItemFactory implements QItemFactory {
 			case fib: return "QTI 2.1 " + trans.translate("new.fib");
 			case numerical: return "QTI 2.1 " + trans.translate("new.fib.numerical");
 			case essay: return "QTI 2.1 " + trans.translate("new.essay");
+			case hotspot: return "QTI 2.1 " + trans.translate("new.hotspot");
 			default: return type.name();
 		}
 	}
diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java
index 1367da0a4973db838bc4521639e11d9c8a34dcb3..79b2ba00697f355e2cc159f69f1a4e7afe00577a 100644
--- a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java
+++ b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java
@@ -58,6 +58,7 @@ import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder;
 import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.EntryType;
+import org.olat.ims.qti21.model.xml.interactions.HotspotAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder;
@@ -245,6 +246,7 @@ public class QTI21QPoolServiceProvider implements QPoolSPI {
 			case fib: itemBuilder = new FIBAssessmentItemBuilder(EntryType.text, qtiService.qtiSerializer()); break;
 			case numerical: itemBuilder = new FIBAssessmentItemBuilder(EntryType.numerical, qtiService.qtiSerializer()); break;
 			case essay: itemBuilder = new EssayAssessmentItemBuilder(qtiService.qtiSerializer()); break;
+			case hotspot: itemBuilder = new HotspotAssessmentItemBuilder(qtiService.qtiSerializer()); break;
 			default: return null;
 		}