diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
index 8fbf6aeec6ab982b3327b765561e9243199e8285..b3f531b7b55727a788e7619b80b0f1b7d12b80b3 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -137,7 +137,8 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 		mainVC.contextPut("passed", scoreEval.getPassed());
 		StringBuilder comment = Formatter.stripTabsAndReturns(courseNode.getUserUserComment(userCourseEnv));
 		mainVC.contextPut("comment", StringHelper.xssScan(comment));
-		mainVC.contextPut("attempts", courseNode.getUserAttempts(userCourseEnv));
+		Integer attempts = courseNode.getUserAttempts(userCourseEnv);
+		mainVC.contextPut("attempts", attempts == null ? new Integer(0) : attempts);
 		
 		UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager();
 		mainVC.contextPut("log", am.getUserNodeLog(courseNode, identity));
diff --git a/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html b/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
index 522ebc77612459af89939bd364bac9be2b71c921..b443c8c119467f720e3553ddefe018c725881179 100644
--- a/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
+++ b/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
@@ -1,5 +1,5 @@
 #if ($enableScoreInfo)
-	#if($attempts > 0)
+	#if($attempts && $attempts > 0)
 		<div class="panel panel-default o_personal">
 		  	<div class="panel-heading">
 	  			<h4 class="panel-title">$r.translate("personal.title")</h4>
diff --git a/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java b/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java
index b5bee7ec1f0243ba6f0da9512b41dbdd29499e6b..840cde8c0c5956f18435d0818f7e46fc690756d3 100644
--- a/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java
+++ b/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java
@@ -107,7 +107,7 @@ public class ImsQTI21Resource extends FileResource {
 			if(cp.hasTest()) {
 				URI test = cp.getTest().toUri();
 				ResourceLocator chainedResourceLocator = createResolvingResourceLocator(resourceLocator);
-				XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, test, true);
+				XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, test, true, true);
 				return result != null && result.isSchemaValid();
 			}
 			return false;
@@ -121,7 +121,7 @@ public class ImsQTI21Resource extends FileResource {
 		try {
 			PathResourceLocator resourceLocator = new PathResourceLocator(resource.getParentFile().toPath());
 			ResourceLocator chainedResourceLocator = createResolvingResourceLocator(resourceLocator);
-			XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, resource.toURI(), true);
+			XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, resource.toURI(), true, true);
 			return result != null && result.isSchemaValid();
 		} catch (Exception e) {
 			log.error("", e);
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 ccc421389770c4938a4613aee8e4f9671d559234..f39949c59b23d38b784eee678b79010f7f5ac73d 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -49,6 +49,7 @@ import org.olat.core.id.Persistable;
 import org.olat.core.logging.OLATRuntimeException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.CodeHelper;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -253,12 +254,15 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa
         URI assessmentObjectSystemId = createAssessmentObjectUri(resourceDirectory);
 		File resourceFile = new File(assessmentObjectSystemId);
 		return assessmentTestsCache.computeIfAbsent(resourceFile, file -> {
+			long start = System.nanoTime();
 			QtiXmlReader qtiXmlReader = new QtiXmlReader(jqtiExtensionManager());
 			ResourceLocator fileResourceLocator = new PathResourceLocator(resourceDirectory.toPath());
 			ResourceLocator inputResourceLocator = 
 	        		ImsQTI21Resource.createResolvingResourceLocator(fileResourceLocator);
 	        AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, inputResourceLocator);
-	        return assessmentObjectXmlLoader.loadAndResolveAssessmentTest(assessmentObjectSystemId);
+	        ResolvedAssessmentTest resolvedAssessmentTest = assessmentObjectXmlLoader.loadAndResolveAssessmentTest(assessmentObjectSystemId);
+	        CodeHelper.printNanoTime(start, "Load test takes");
+	        return resolvedAssessmentTest;
 		});
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
index 8f075f3ec1fa5eb31fd289d09c40fbb503406c24..295c2b18212da99ba0eda0ef56aac9840fc793de 100644
--- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
@@ -768,6 +768,8 @@ public class AssessmentTestDisplayController extends BasicController implements
         
         final TestSessionControllerSettings testSessionControllerSettings = new TestSessionControllerSettings();
         testSessionControllerSettings.setTemplateProcessingLimit(computeTemplateProcessingLimit());
+        
+        testProcessingMap.reduceItemProcessingMapMap(testPlan.getTestPlanNodeList());
 
         /* Create controller and wire up notification recorder */
         final TestSessionController result = new TestSessionController(qtiService.jqtiExtensionManager(),