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 dbf5c15c562ad920e5216c37a5afdbdef48a45c9..898c1763f9da179f820b897c174fdb8616192e0a 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -558,7 +558,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 			FileResourceManager frm = FileResourceManager.getInstance();
 			File fUnzippedDirRoot = frm.unzipFileResource(session.getTestEntry().getOlatResource());
 			URI assessmentObjectUri = qtiService.createAssessmentTestUri(fUnzippedDirRoot);
-			File submissionDir = qtiService.getAssessmentResultFile(session);
+			File submissionDir = qtiService.getSubmissionDirectory(session);
 			String mapperUri = registerCacheableMapper(ureq, "QTI21CNResults::" + session.getTestEntry().getKey(),
 					new ResourcesMapper(assessmentObjectUri, submissionDir));
 
diff --git a/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java b/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java
index ca6b3dd307116a1bf765ef23ffa725547ae40df2..2a6a8a2c5eec27fcc380268c1146928637baf94f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java
+++ b/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java
@@ -44,6 +44,7 @@ import org.olat.core.util.StringHelper;
 public class ResourcesMapper implements Mapper {
 	
 	private static final Logger log = Tracing.createLoggerFor(ResourcesMapper.class);
+	private static final String SUBMISSION_SUBPATH = "submissions/";
 	
 	private final URI assessmentObjectUri;
 	private final File submissionDirectory;
@@ -92,14 +93,15 @@ public class ResourcesMapper implements Mapper {
 				} else {
 					resource = new ForbiddenMediaResource();
 				}
-			} else if(filename.endsWith("/raw/_noversion_/images/transparent.gif")) {
+			} else if(filename != null && filename.endsWith("/raw/_noversion_/images/transparent.gif")) {
 				String realPath = request.getServletContext().getRealPath("/static/images/transparent.gif");
 				resource = new FileMediaResource(new File(realPath), true);
 			} else {
 				String submissionName = null;
 				File storage = null;
-				if(filename.startsWith("submissions/")) {
-					String submission = filename.substring("submissions/".length());
+				if(filename != null && filename.contains(SUBMISSION_SUBPATH)) {
+					int submissionIndex = filename.indexOf(SUBMISSION_SUBPATH) + SUBMISSION_SUBPATH.length();
+					String submission = filename.substring(submissionIndex);
 					int candidateSessionIndex = submission.indexOf('/');
 					if(candidateSessionIndex > 0) {
 						submissionName = submission.substring(candidateSessionIndex + 1);
@@ -109,7 +111,7 @@ public class ResourcesMapper implements Mapper {
 							String sessionKey = submission.substring(0, candidateSessionIndex);
 							if(StringHelper.isLong(sessionKey)) {
 								try {
-									storage = submissionDirectoryMaps.get(new Long(sessionKey));
+									storage = submissionDirectoryMaps.get(Long.valueOf(sessionKey));
 								} catch (Exception e) {
 									log.error("", e);
 								}
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java
index 8a1bb0809535a8b1cd25c604f637734db5c856ae..d95fc58e03929cb74e0f9e64a0f0612bac436005 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java
@@ -194,7 +194,7 @@ public class AssessmentObjectVelocityRenderDecorator extends VelocityRenderDecor
 	}
 	
 	public String convertSubmissionLinkFull(String uri) {
-		return AssessmentRenderFunctions.convertSubmissionLink(avc, resolvedAssessmentItem, uri);
+		return AssessmentRenderFunctions.convertSubmissionLink(avc, uri);
 	}
 	
 	public String getFormDispatchFieldId() {
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
index 678f3ebafd3b82e0691fae6ad449c984629aa092..d54ef1081e39e8df7f3ee834401fd4a95686805e 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
@@ -661,10 +661,9 @@ public class AssessmentRenderFunctions {
 		return component.getMapperUri() + "/" + relativePath + "?href=" + relativePath;
 	}
 	
-	public static final String convertSubmissionLink(AssessmentObjectComponent component, ResolvedAssessmentItem resolvedAssessmentItem, String uri) {
+	public static final String convertSubmissionLink(AssessmentObjectComponent component, String uri) {
 		String filename = getLinkFilename(uri);
-		String relativePath = component.relativePathTo(resolvedAssessmentItem);
-		return component.getSubmissionMapperUri() + "/submissions/" + filename + "?href=" + relativePath + (uri == null ? "" : uri);
+		return component.getSubmissionMapperUri() + "/submissions/" + filename + "?href=" + (uri == null ? "" : uri);
 	}
 	
 	private static final String getLinkFilename(String uri) {