diff --git a/pom.xml b/pom.xml
index 0a00d26ff4c8522dea966aa9e191d72c7c975e45..cda745c41ebc80c1183da0229b095ad1ec75775b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
 		<version.selenium>3.13.0</version.selenium>
 		<version.drone>2.5.1</version.drone>
 		<activemq.version>5.15.8</activemq.version>
-		<qtiworks.version>1.0.15</qtiworks.version>
+		<qtiworks.version>1.0.17</qtiworks.version>
 
 	    <!-- properties for testing and Q&A -->
 	    <!-- by default no tests are executed so far (April 2011). Use appropriate profiles and properties on the command line -->
@@ -1375,7 +1375,7 @@
 								<Implementation-Build>${buildNumber}</Implementation-Build>
 							</manifestEntries>
 						</archive>
-						<warSourceExcludes>**/*.pxm, **/*.psd, **/*.scss, **/*.sh, static/bootstrap/**, **/*.README</warSourceExcludes>
+						<warSourceExcludes>**/*.pxm, **/*.psd, **/*.sh, static/bootstrap/**, **/*.README</warSourceExcludes>
 						<webResources>
 							<resource>
 								<directory>src/main/webapp</directory>
diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
index 3e46c174faab3df35dffbcfaad251a0d4bc2523f..f80369dcb3e37644426a0df0ad49576f30a4eb2c 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
@@ -27,7 +27,8 @@ package org.olat.course.nodes.iq;
 
 import java.io.File;
 import java.text.DateFormat;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
@@ -222,25 +223,34 @@ public class IQRunController extends BasicController implements GenericEventList
 		Formatter formatter = Formatter.getInstance(ureq.getLocale());
 		ImsRepositoryResolver resolver = new ImsRepositoryResolver(referenceTestEntry);
 		QTIChangeLogMessage[] qtiChangeLog = resolver.getDocumentChangeLog();
+		
 		StringBuilder qtiChangelog = new StringBuilder();
 
 		if(qtiChangeLog.length>0){
+			List<QTIChangeLogMessage> qtiChangeLogList = new ArrayList<>(qtiChangeLog.length);
+			for (int i=qtiChangeLog.length; i-->0 ; ) {
+				if(qtiChangeLog[i] != null) {
+					qtiChangeLogList.add(qtiChangeLog[i]);
+				}
+			}
 			//there are resource changes
-			Arrays.sort(qtiChangeLog);
-			for (int i = qtiChangeLog.length-1; i >= 0 ; i--) {
+			Collections.sort(qtiChangeLogList);
+			
+			for (int i = qtiChangeLogList.size()-1; i >= 0 ; i--) {
+				QTIChangeLogMessage qtiChangeLogEntry = qtiChangeLogList.get(i);
 				//show latest change first
-				if(!showAll && qtiChangeLog[i].isPublic()){
+				if(!showAll && qtiChangeLogEntry.isPublic()){
 					//logged in person is a normal user, hence public messages only
-					Date msgDate = new Date(qtiChangeLog[i].getTimestmp());
+					Date msgDate = new Date(qtiChangeLogEntry.getTimestmp());
 					qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n");
-					String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage());
+					String msg = StringHelper.escapeHtml(qtiChangeLogEntry.getLogMessage());
 					qtiChangelog.append(msg);
 					qtiChangelog.append("\n********************************\n");
 				}else if (showAll){
 					//logged in person is an author, olat admin, owner, show all messages
-					Date msgDate = new Date(qtiChangeLog[i].getTimestmp());
+					Date msgDate = new Date(qtiChangeLogEntry.getTimestmp());
 					qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n");
-					String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage());
+					String msg = StringHelper.escapeHtml(qtiChangeLogEntry.getLogMessage());
 					qtiChangelog.append(msg);
 					qtiChangelog.append("\n********************************\n");
 				}//else non public messages are not shown to normal user
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java
index e4623188fb651882c13fa05ccd6a51e730fd210b..6e2506ec81c14f3aea90231e5a1ccc3ffd7abf9f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponent.java
@@ -35,6 +35,7 @@ import uk.ac.ed.ph.jqtiplus.node.item.ModalFeedback;
 import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction;
 import uk.ac.ed.ph.jqtiplus.node.result.SessionStatus;
 import uk.ac.ed.ph.jqtiplus.node.test.AbstractPart;
+import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest;
 import uk.ac.ed.ph.jqtiplus.node.test.TestPart;
@@ -174,9 +175,16 @@ public class AssessmentTestComponent extends AssessmentObjectComponent  {
 		}
 		
 		try {
-			URI itemSystemId = itemNode.getItemSystemId();
+			AssessmentItemRef itemRef = getResolvedAssessmentTest().getItemRefsByIdentifierMap()
+				.get(itemNode.getKey().getIdentifier());
+			if(itemRef == null) {
+				return false;
+			}
 			ResolvedAssessmentItem resolvedAssessmentItem = getResolvedAssessmentTest()
-					.getResolvedAssessmentItemBySystemIdMap().get(itemSystemId);
+				.getResolvedAssessmentItem(itemRef);
+			if(resolvedAssessmentItem == null) {
+				return false;
+			}
 			AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful();
 			if(assessmentItem.getAdaptive()) {
 				return true;
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 946ad379a5aed48c1d969bba09a1bb008328725d..7ed2ce11de90ad11624fbc37c4e0980e3c52aced 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
@@ -25,7 +25,6 @@ import static org.olat.ims.qti21.ui.components.AssessmentRenderFunctions.testFee
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
-import java.net.URI;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -70,6 +69,7 @@ import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock;
 import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
 import uk.ac.ed.ph.jqtiplus.node.item.template.declaration.TemplateDeclaration;
 import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration;
+import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection;
 import uk.ac.ed.ph.jqtiplus.node.test.NavigationMode;
 import uk.ac.ed.ph.jqtiplus.node.test.TestFeedback;
@@ -380,17 +380,23 @@ public class AssessmentTestComponentRenderer extends AssessmentObjectComponentRe
 	
 	private void renderTestItemBody(AssessmentRenderer renderer, StringOutput sb, AssessmentTestComponent component, TestPlanNode itemNode,
 			URLBuilder ubu, Translator translator, RenderingRequest options) {
-		final ItemSessionState itemSessionState = component.getItemSessionState(itemNode.getKey());
-		
-		URI itemSystemId = itemNode.getItemSystemId();
+
+		AssessmentItemRef itemRef = component.getResolvedAssessmentTest()
+				.getItemRefsByIdentifierMap().get(itemNode.getKey().getIdentifier());
+		if(itemRef == null) {
+			log.error("Missing assessment item ref: " + itemNode.getKey());
+			renderMissingItem(sb, translator);
+			return;
+		}
 		ResolvedAssessmentItem resolvedAssessmentItem = component.getResolvedAssessmentTest()
-				.getResolvedAssessmentItemBySystemIdMap().get(itemSystemId);
+				.getResolvedAssessmentItem(itemRef);
 		if(resolvedAssessmentItem == null) {
-			log.error("Missing assessment item: " + itemSystemId);
+			log.error("Missing assessment item: " + itemNode.getKey());
 			renderMissingItem(sb, translator);
 			return;
 		}
-		
+
+		final ItemSessionState itemSessionState = component.getItemSessionState(itemNode.getKey());
 		final AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful();
 
 		sb.append("<div class='o_assessmentitem_wrapper'>");