diff --git a/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java b/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java
index f9f420dd5503060c278c1a26d281c4c7b78b9a73..a296be6242d9d7535ce13c92fb4ebc84cf7e0ec4 100644
--- a/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java
+++ b/src/main/java/org/olat/core/gui/render/velocity/VelocityRenderDecorator.java
@@ -379,6 +379,9 @@ public class VelocityRenderDecorator implements Closeable {
 		return sb;
 	}
 
+	public String mathJax(String targetDomId) {
+		return Formatter.elementLatexFormattingScript(targetDomId);
+	}
 	
 	/**
 	 * e.g. "/olat/"
diff --git a/src/main/java/org/olat/core/util/WebappHelper.java b/src/main/java/org/olat/core/util/WebappHelper.java
index 1a4255425a46633b3ba06acb2c98bbe532f50473..5bef57b97b246dabefcf296d87b37530abcbe45a 100644
--- a/src/main/java/org/olat/core/util/WebappHelper.java
+++ b/src/main/java/org/olat/core/util/WebappHelper.java
@@ -448,7 +448,7 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA
 	private void testUtf8FileSystem() {
 		File tmpDir = new File(new File(WebappHelper.getUserDataRoot()), "tmp");
 		if (!tmpDir.exists()) tmpDir.mkdir();
-		File writeFile = new File(tmpDir, "UTF-8 test läsÖiç-首页|新");
+		File writeFile = new File(tmpDir, "UTF-8 test läsÖiç-首页f新");
 		if (writeFile.exists()) {
 			// remove exising files first
 			writeFile.delete();
@@ -464,7 +464,7 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA
 		if(tmpFiles != null){
 			for (int i = 0; i < tmpFiles.length; i++) {
 				File tmpFile = tmpFiles[i];
-				if (tmpFile.getName().equals("UTF-8 test läsÖiç-首页|新")) {
+				if (tmpFile.getName().equals("UTF-8 test läsÖiç-首页f新")) {
 					foundUtf8File = true;
 					break;
 				}
diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html b/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html
index 869b33d32634836c5904e52d338b4b80979ec425..c9a1d48bc1b7bef7c162d3cb25e38f6249516a63 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html
+++ b/src/main/java/org/olat/ims/qti21/ui/_content/assessment_results.html
@@ -1,4 +1,4 @@
-<div class="o_assessment_test_results">
+<div id="o_assessment_test_results_$r.getCId()" class="o_assessment_test_results">
 <a id="o_result_overview" title="$r.translateInAttribute("head.assessment.details")"></a>
 
 <div class="o_header_with_buttons o_qti_assessment_title">
@@ -547,4 +547,6 @@
 /* ]]> */
 </script>
 #end
-</div> ## END of o_assessment_test_results
\ No newline at end of file
+</div> ## END of o_assessment_test_results
+$r.mathJax("o_assessment_test_results_${r.getCId()}")
+
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java
index 0661939db9c9a40385fa4591ae8cafff654df9e7..d70cc1677c5295ce7442950fedb43726868abd9f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityInteractionsController.java
@@ -80,6 +80,8 @@ import uk.ac.ed.ph.jqtiplus.state.TestPlanNode;
 import uk.ac.ed.ph.jqtiplus.state.TestPlanNodeKey;
 import uk.ac.ed.ph.jqtiplus.state.TestSessionState;
 import uk.ac.ed.ph.jqtiplus.types.Identifier;
+import uk.ac.ed.ph.jqtiplus.types.ResponseData;
+import uk.ac.ed.ph.jqtiplus.types.StringResponseData;
 import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator;
 
 /**
@@ -170,6 +172,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
 		
 		viewSolutionButton = uifactory.addFormLink("view.solution", formLayout);
 		viewSolutionButton.setIconLeftCSS("o_icon o_icon_open_togglebox");
+		viewSolutionButton.setVisible(hasSolution());
 		
 		solutionItem = initFormExtendedTextInteraction(testPlanNodeKey, testSessionState, testSession, formLayout);	
 		solutionItem.setVisible(false);
@@ -273,6 +276,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
 		if(formLayout instanceof FormLayoutContainer) {
 			FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
 			layoutCont.contextPut("interactionWrapper", wrapper);
+			layoutCont.contextPut("autoSaved", Boolean.valueOf(isAutoSaved(testPlanNodeKey, testSessionState)));
 		}
 	}
 	
@@ -310,6 +314,49 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
 		return feedbackItem;
 	}
 	
+	private boolean isAutoSaved(TestPlanNodeKey testPlanNodeKey, TestSessionState testSessionState) {
+		for(Interaction interaction:assessmentItem.getItemBody().findInteractions()) {
+			if(!(interaction instanceof ExtendedTextInteraction)) {
+				return false;
+			}
+		}
+		
+		ItemSessionState sessionState = testSessionState.getItemSessionStates().get(testPlanNodeKey);
+		if(sessionState == null) {
+			return false;
+		}
+		Map<Identifier, ResponseData> raws = sessionState.getRawResponseDataMap();
+		if(raws == null || raws.isEmpty()) {
+			return false;
+		}
+		
+		for(ResponseData data:raws.values()) {
+			if(data instanceof StringResponseData) {
+				StringResponseData stringData = (StringResponseData)data;
+				if(stringData.getResponseData() != null) {
+					for(String string:stringData.getResponseData()) {
+						if(StringHelper.containsNonWhitespace(string)) {
+							return true;
+						}
+					}
+				}
+			}
+		}
+		
+		return false;
+	}
+	
+	private boolean hasSolution() {
+		for(Interaction interaction:assessmentItem.getItemBody().findInteractions()) {
+			if(!(interaction instanceof ExtendedTextInteraction)
+					&& !(interaction instanceof DrawingInteraction)
+					&& !(interaction instanceof UploadInteraction)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
 	private boolean hasCorrectSolution() {
 		for(ModalFeedback modalFeedback:assessmentItem.getModalFeedbacks()) {
 			Identifier outcomeIdentifier = modalFeedback.getOutcomeIdentifier();
@@ -473,7 +520,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
 			solutionItem.setVisible(false);
 		} else {
 			viewSolutionButton.setIconLeftCSS("o_icon o_icon_close_togglebox");
-			solutionItem.setVisible(true);
+			solutionItem.setVisible(hasSolution());
 		}
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html
index 6c67f673f6a88cf8da33824905bd1d7fb818e5da..f7b1090bb5a271dd3c561026918686f3a648d188 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_assessment_item.html
@@ -1,4 +1,4 @@
-<div class="o_assessmentitem_wrapper clearfix">
+<div id="o_assessmentitem_$r.getCId()" class="o_assessmentitem_wrapper clearfix">
 	<h4 class="itemTitle"><i class="o_icon $labelCssClass"> </i> $r.escapeHtml($label)</h4>
 	$r.render("interactions")
 	<div class="o_button_group o_assessmentitem_scoring_buttons">
@@ -7,4 +7,5 @@
 		$r.render("save.next")
 		$r.render("save.back")
 	</div>
-</div>
\ No newline at end of file
+</div>
+$r.mathJax("o_assessmentitem_${r.getCId()}")
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html
index 5d2a0d398e9ebee8c0689d9f3d4cab8ad0112c37..29eb57ed7ab7e6a8504489cd7adac2d4589904e7 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_content/correction_identity_interactions.html
@@ -1,5 +1,6 @@
 #if(!${interactionWrapper.isItemSessionStateFinal()})
-	<div class="o_assessment_item_not_final o_warning">$r.translate("warning.not.submitted")</div>
+	<div class="o_assessment_item_not_final o_warning">$r.translate("warning.not.submitted")
+	 #if($r.isTrue($autoSaved))<br>$r.translate("warning.not.submitted.autosave")#end</div>
 #end
 <div class="o_qti_item_body clearfix">$r.render("answer")</div>
 
@@ -10,9 +11,13 @@
 	<div class="o_assessmentitem_controls"> </div>
 	#end
 #elseif($r.visible("view.correct.solution"))
-	<div class="o_assessmentitem_control_view_solution">$r.render("view.solution")</div>
-#else
+	#if($r.visible("view.solution"))
+		<div class="o_assessmentitem_control_view_solution">$r.render("view.solution")</div>
+	#end
+#elseif($r.visible("view.solution"))
 	<div class="o_assessmentitem_controls">$r.render("view.solution")</div>
+#else
+	<div class="o_assessmentitem_controls"> </div>
 #end
 
 #if($r.visible("view.correct.solution"))
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties
index 63eeb5b19ff3ab8d92a812eac1435c03e59468a9..1c91f19ef5c589f83ef554be7702fb13dc0c79a6 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties
@@ -47,6 +47,7 @@ tool.unreview.all=Markierung aufheben
 view.correct.solution=Korrekte L\u00F6sung ansehen
 view.solution=L\u00F6sung ansehen
 warning.not.submitted=Diese Frage wurde vom Benutzer nicht beantwortet
+warning.not.submitted.autosave=<strong>Hinweis:</strong> Die im Antwortfeld erfassten Inhalte wurden automatisch gespeichert.
 warning.no.assessment.item=Es gibt nichts zu korrigieren
 waring.atleast.one=Sie m\u00FCssen mindestens eine Frage w\u00E4hlen.
 warning.assessment.item.locked=Antwort ist bereit von einem anderen Benutzer gesperrt: {0}
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties
index 9eea6feec63bdb47550ba17711a8b1ecb8dec9b4..a9ae630696f757f702eef9e7eb43f20215ad11df 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties
@@ -51,3 +51,4 @@ warning.assessment.item.locked=The answer is currently locked by an other user\:
 warning.confirm.save=$\:confirm.save You have still uncorrected questions.
 warning.no.assessment.item=There is nothing to correct.
 warning.not.submitted=This question has not been answered by the user
+warning.not.submitted.autosave=<strong>Note:</strong> The contents entered in the answer field were automatically saved.
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
index 41073988ee388e78bc3c256f203be206743577ee..732fad5d61389e3b65f58c9c74155f8bb70422a6 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
@@ -19,7 +19,7 @@ export.user.data.notReady=Der Benutzer kann den Export mit dem folgenden Link he
 export.user.data.processing=Der Export ist gerade bearbeitet.
 export.user.data.ready=Der Benutzer kann den Export mit dem folgenden Link herunterladen. Sie k\u00F6nnen auch ein en neuen Export erfordern.
 export.user.data.ready.subject=Export von "{0}" ist fertig
-export.user.data.ready.text=<p>Export von "{0}" ist fertig. Es konnte unter <a href\="{1}">{1}</a> heruntergeladen werden</p>
+export.user.data.ready.text=<p>Sie haben als Benutzerverwalter in OpenOLAT f\u00FCr den Benutzer "{0}" den Export der pers\u00F6nlichen Daten durchgef\u00FChrt. Die Daten sind nun generiert und stehen dem Benutzer im pers\u00F6nlichen Bereich in OpenOLAT zur Verf\u00FCgung.</p><p>Mit folgendem Link hat der Benutzer direkten Zugriff auf den Export: <a href="{1}">{1}</a><br>Sie k\u00F6nnen diesen Link an den Benutzer weiterleiten.</p><p>Wichtig: Diese Daten sind NUR f\u00FCr den Benutzer einsehbar, nicht aber f\u00FCr andere Benutzer des Systems. Auch Sie in der Rolle des Benutzerverwalters haben keinen Zugriff auf die pers\u00F6nlichen Daten des Benutzers.</p>
 feeds=Blogs und Podcasts
 forums=Foren
 group.memberships=Zugeh\u00F6rigkeit zu Gruppen
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
index b0b63e8c444cd04fc81a440264c768d13182a407..9d718da3f2d5655c47a5244b66dcfad36c88c822 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
@@ -19,7 +19,7 @@ export.user.data.notReady=The user can download the export using the following l
 export.user.data.processing=The export is currently processed
 export.user.data.ready=The user can download the export with the following link. You can ask for a new export too.
 export.user.data.ready.subject=The export for "{0}" is ready
-export.user.data.ready.text=<p>The export for "{0}" is ready. The user can use the following link to download it <a href\="{1}">{1}</a>.</p>
+export.user.data.ready.text=<p>As user administrator in OpenOLAT, you have exported the personal data for the user"{0}". The data is now generated and is available to the user in the personal area of OpenOLAT.</p><p>With the following link the user has direct access to the export: <a href="{1}">{1}</a><br>You can forward this link to the user.</p><p>Important: This data can ONLY be viewed by the user, but not by other users of the system. You in the role of user administrator also have no access to the user's personal data.</p>
 feeds=Blogs and podcasts
 forums=Forums
 group.memberships=Membership to groups
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
index e2df05ee0caea1d7cb39b492c72fd695083f7375..cf8f6e0f3388645cb68d7422ee717c983bf44809 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
@@ -10,16 +10,16 @@ disclaimer=Conditions d'utilisation
 display.portrait=Image publi\u00E9e du profil
 download.data=T\u00E9l\u00E9charger les donn\u00E9es
 efficiency.statements=Attestations de performance
-export.options=Elements \u00E0 exporter
+export.options=Elements à exporter
 export.start=D\u00E9marrer l'exportation
 export.url=Lien vers les donn\u00E9es
-export.user.data.explain=S\u00E9lectionner les \u00E9l\u00E9ments \u00E0 exporter pour cette utilisateur. L'exportation peut dur\u00E9e plusieurs heures, vous recevrez un courriel lorsqu'il sera termin\u00E9.
-export.user.data.none=Vous pouvez demander un aper\u00E7u de vos donn\u00E9es sauv\u00E9es dans OpenOLAT selon l'article 15 du r\u00E8glement g\u00E9n\u00E9ral sur la protection des donn\u00E9es (RGPD) \u00E0 l'op\u00E9rateur. Ecrivez votre adresse courriel avec votre demande \u00E0 <a href\="mailto\:{0}">Support</a>.
+export.user.data.explain=S\u00E9lectionner les \u00E9l\u00E9ments à exporter pour cette utilisateur. L'exportation peut dur\u00E9e plusieurs heures, vous recevrez un courriel lorsqu'il sera termin\u00E9.
+export.user.data.none=Vous pouvez demander un aper\u00E7u de vos donn\u00E9es sauv\u00E9es dans OpenOLAT selon l'article 15 du r\u00E8glement g\u00E9n\u00E9ral sur la protection des donn\u00E9es (RGPD) à l'op\u00E9rateur. Ecrivez votre adresse courriel avec votre demande à <a href\="mailto\:{0}">Support</a>.
 export.user.data.notReady=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es export\u00E9es avec le lien suivant.
 export.user.data.processing=L'exportation est en cours.
 export.user.data.ready=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es avec le lien suivant. Vous pouvez \u00E9galement d\u00E9marrer une nouvelle exportation.
 export.user.data.ready.subject=Les donn\u00E9es pour "{0}" sont pr\u00EAtes.
-export.user.data.ready.text=<p>Les donn\u00E9es pour l'utilisateur "{0}" sont pr\u00EAtes. L'utilisateur peut les t\u00E9l\u00E9charger en suivant le lien <a href\="{1}">{1}</a>.</p>
+export.user.data.ready.text=<p>Vous avez export\u00E9 les donn\u00E9es personelles de l'utilisateur "{0}" en tant que gestionnaire des utilisateurs.</p><p>Avec le lien suivant, l'utilisateur peut t\u00E9l\u00E9charger ses donn\u00E9es: <a href\="{1}">{1}</a>.<br>Vous pouvez envoyer ce lien à l'utilisateur concern\u00E9.</p><p>Attention: ces donn\u00E9es ne peuvent \u00EAtre vues que par l'utilisateur concern\u00E9 et par aucun autre utilisateur du syst\u00E8me. Vous, en tant qu'administrateur, n'avez pas non plus acc\u00E8s à ces donn\u00E9es.</p>
 feeds=Blogues et podcasts
 forums=Forums
 group.memberships=Participations aux groupes