diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java
index 440333c442a63eb4c1c2338532a4a9233ac1ed2f..d77d68fc5868ffcccc6e948e73fc72b250dd4723 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java
@@ -182,7 +182,7 @@ public class FileElementImpl extends FormItemImpl
 				previewEl.setCropSelectionEnabled(cropSelectionEnabled);
 				previewEl.setMaxWithAndHeightToFitWithin(300, 200);
 				previewEl.setVisible(true);
-			} else {
+			} else if(previewEl != null) {
 				previewEl.setVisible(false);
 			}
 			// Mark associated component dirty, that it gets rerendered
diff --git a/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java b/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java
index d9373778750c9e7884a1474bfdb7888422170c3b..5019fd743161c7b18452832e9448ceb969defb24 100644
--- a/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java
+++ b/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java
@@ -140,7 +140,7 @@ public class ImsQTI21EditorTest extends Deployments {
 			.saveAnswer()
 			.answerMultipleChoice("Deutschland", "Brasilien", "S\u00FCdafrika")
 			.saveAnswer()
-			.answerSingleChoice("Italien")
+			.answerSingleChoiceWithParagraph("Italien")
 			.saveAnswer()
 			.answerCorrectKPrim("Deutschland", "Uruguay")
 			.answerIncorrectKPrim("Frankreich", "Spanien")
@@ -355,17 +355,17 @@ public class ImsQTI21EditorTest extends Deployments {
 				.getQTI12Page(ryomouBrowser);
 		ryomouQtiPage
 			.assertOnAssessmentItem()
-			.answerSingleChoice("Falsch")
+			.answerSingleChoiceWithParagraph("Falsch")
 			.saveAnswer()
 			.assertFeedback("Incorrect")
 			.assertCorrectSolution("Correct solution")
 			.hint()
 			.assertFeedback("Hint")
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.assertFeedback("Correct feedback")
 			.nextAnswer()
-			.answerSingleChoice("Almost")
+			.answerSingleChoiceWithParagraph("Almost")
 			.saveAnswer()
 			.assertCorrectSolution("Correct solution")
 			.assertFeedback("Incorrect")
@@ -431,14 +431,14 @@ public class ImsQTI21EditorTest extends Deployments {
 		qtiPage
 			.clickToolbarBack()
 			.assertOnAssessmentItem()
-			.answerSingleChoice("Falsch")
+			.answerSingleChoiceWithParagraph("Falsch")
 			.saveAnswer()
 			.assertFeedback("Incorrect")
-			.answerSingleChoice("Faux")
+			.answerSingleChoiceWithParagraph("Faux")
 			.saveAnswer()
 			.assertFeedback("Incorrect")
 			.assertFeedback("Attempts")
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.assertNoFeedback()
 			.endTest();
@@ -3176,7 +3176,7 @@ public class ImsQTI21EditorTest extends Deployments {
 		ryomouQtiPage
 			.assertOnAssessmentItem()
 			.assertHiddenSection()
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.answerMultipleChoice("OkToo")
 			.answerMultipleChoice("Correct")
@@ -3327,7 +3327,7 @@ public class ImsQTI21EditorTest extends Deployments {
 		ryomouQtiPage
 			.assertOnAssessmentItem()
 			.assertHiddenSection()
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.answerMultipleChoice("Ok")
 			.answerMultipleChoice("Correct")
@@ -3360,7 +3360,7 @@ public class ImsQTI21EditorTest extends Deployments {
 		asukaQtiPage
 			.assertOnAssessmentItem()
 			.assertHiddenSection()
-			.answerSingleChoice("Wrong")
+			.answerSingleChoiceWithParagraph("Wrong")
 			.saveAnswer()
 			.answerMultipleChoice("Falsch")
 			.answerMultipleChoice("Faux")
@@ -3392,7 +3392,7 @@ public class ImsQTI21EditorTest extends Deployments {
 		reiQtiPage
 			.assertOnAssessmentItem()
 			.assertHiddenSection()
-			.answerSingleChoice("Faux")
+			.answerSingleChoiceWithParagraph("Faux")
 			.saveAnswer()
 			.answerMultipleChoice("Ok")
 			.answerMultipleChoice("Correct")
diff --git a/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java b/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java
index 781d4edff6a3977fce2d058b0575f425856f8a86..74fec822329f5277f79a6a3b9c3a550e85c75140 100644
--- a/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java
+++ b/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java
@@ -343,18 +343,18 @@ public class ImsQTI21InteractionsTest extends Deployments {
 			.assertOnAssessmentItem()
 			.hint()
 			.assertFeedbackText("Tony lives in the United Kingdom")
-			.answerSingleChoice("Tony")
+			.answerSingleChoiceWithParagraph("Tony")
 			.saveAnswer()
 			.assertFeedbackText("No, the correct answer is Vicente Fox")
 			.assertFeedbackInline("No, he is the Prime Minister of England.")
 			.assertNoFeedbackText("Tony lives in the United Kingdom")
-			.answerSingleChoice("George")
+			.answerSingleChoiceWithParagraph("George")
 			.saveAnswer()
 			.assertFeedbackText("No, the correct answer is Vicente Fox")
 			.assertFeedbackInline("No, he is the President of the USA.")
 			.assertNoFeedbackText("Tony lives in the United Kingdom")
 			.assertNoFeedbackInline("No, he is the Prime Minister of England.")
-			.answerSingleChoice("Vicente")
+			.answerSingleChoiceWithParagraph("Vicente")
 			.saveAnswer()
 			.assertFeedbackText("Yes, that is correct")
 			.assertNoFeedbackText("Tony lives in the United Kingdom")
@@ -683,5 +683,58 @@ public class ImsQTI21InteractionsTest extends Deployments {
 			.assertOnAssessmentResults()
 			.assertOnAssessmentItemScore("Richard III", 3);
 	}
+	
+	/**
+	 * This is an assessment item with severals
+	 * different interactions.
+	 * 
+	 * @param authorLoginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void qti21MultipleInput(@InitialPage LoginPage authorLoginPage)
+	throws IOException, URISyntaxException {
+		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		authorLoginPage.loginAs(author.getLogin(), author.getPassword());
+		
+		//upload a test
+		String qtiTestTitle = "Gap match QTI 2.1 " + UUID.randomUUID();
+		URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/simple_QTI_21_multi-input.zip");
+		File qtiTestFile = new File(qtiTestUrl.toURI());
+		navBar
+			.openAuthoringEnvironment()
+			.uploadResource(qtiTestTitle, qtiTestFile)
+			.clickToolbarRootCrumb();
+		
+		QTI21Page qtiPage = QTI21Page
+				.getQTI12Page(browser);
+		qtiPage
+			.options()
+			.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
+			.save();
+		// to the test and spot it
+		qtiPage
+			.clickToolbarBack()
+			.assertOnAssessmentItem()
+			// the single choice
+			.answerSingleChoice("Some people are afraid of a woman")
+			// the inline choice
+			.answerInlineChoice("A2")
+			// the text entry
+			.answerGapText("wicked king", "RESPONSE3")
+			// the gap match
+			.answerGapMatch(1, "family", true)
+			.answerGapMatch(2, "castle", true)
+			.answerGapMatch(3, "horse", true)
+			.saveAnswer()
+			.endTest()
+			.closeTest();
+		//check the results
+		qtiPage
+			.assertOnAssessmentResults()
+			.assertOnAssessmentItemScore("Legend", 4);
+	}
 
 }
diff --git a/src/test/java/org/olat/selenium/ImsQTI21Test.java b/src/test/java/org/olat/selenium/ImsQTI21Test.java
index 62cfbc4a287c5ae3fcee7be7f71c4bc6262559d3..a19b0bfb46cbff500674aa1e637110d8792501dc 100644
--- a/src/test/java/org/olat/selenium/ImsQTI21Test.java
+++ b/src/test/java/org/olat/selenium/ImsQTI21Test.java
@@ -98,12 +98,12 @@ public class ImsQTI21Test extends Deployments {
 				.getQTI12Page(browser);
 		qtiPage
 			.assertOnAssessmentItem()
-			.answerSingleChoice("Incorrect response")
+			.answerSingleChoiceWithParagraph("Incorrect response")
 			.saveAnswer()
 			.assertOnAssessmentItem("Second question")
 			.selectItem("First question")
 			.assertOnAssessmentItem("First question")
-			.answerSingleChoice("Correct response")
+			.answerSingleChoiceWithParagraph("Correct response")
 			.saveAnswer()
 			.answerMultipleChoice("Correct response")
 			.saveAnswer()
@@ -140,10 +140,10 @@ public class ImsQTI21Test extends Deployments {
 				.getQTI12Page(browser);
 		qtiPage
 			.assertOnAssessmentItem()
-			.answerSingleChoice("Wrong answer")
+			.answerSingleChoiceWithParagraph("Wrong answer")
 			.saveAnswer()
 			.assertFeedback("Oooops")
-			.answerSingleChoice("Correct answer")
+			.answerSingleChoiceWithParagraph("Correct answer")
 			.saveAnswer()
 			.assertFeedback("Well done")
 			.nextAnswer()
@@ -196,7 +196,7 @@ public class ImsQTI21Test extends Deployments {
 		qtiPage
 			.clickToolbarBack()
 			.assertOnAssessmentItem()
-			.answerSingleChoice("Wrong answer")
+			.answerSingleChoiceWithParagraph("Wrong answer")
 			.saveAnswer()
 			.assertFeedback("Oooops")
 			.nextAnswer()
@@ -250,7 +250,7 @@ public class ImsQTI21Test extends Deployments {
 			.startTestPart()
 			.selectItem("First question")
 			.assertOnAssessmentItem("First question")
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.assertOnAssessmentItem("Second question")
 			.answerMultipleChoice("True")
@@ -300,7 +300,7 @@ public class ImsQTI21Test extends Deployments {
 			.startTestPart()
 			.selectItem("First question")
 			.assertOnAssessmentItem("First question")
-			.answerSingleChoice("Correct answer")
+			.answerSingleChoiceWithParagraph("Correct answer")
 			.saveAnswer()
 			.assertOnAssessmentItem("Second question")
 			.answerMultipleChoice("Valid answer")
@@ -308,9 +308,9 @@ public class ImsQTI21Test extends Deployments {
 			.endTestPart()
 			.selectItem("Third question")
 			.assertOnAssessmentItem("Third question")
-			.answerSingleChoice("Right")
+			.answerSingleChoiceWithParagraph("Right")
 			.saveAnswer()
-			.answerSingleChoice("Good")
+			.answerSingleChoiceWithParagraph("Good")
 			.saveAnswer()
 			.endTestPart()
 			.assertOnAssessmentTestFeedback("Well done")
@@ -347,10 +347,10 @@ public class ImsQTI21Test extends Deployments {
 		//check simple time limit
 		qtiPage
 			.assertOnAssessmentItem("Single choice")
-			.answerSingleChoice("Correct answer")
+			.answerSingleChoiceWithParagraph("Correct answer")
 			.saveAnswer()
 			.assertOnAssessmentItem("Last choice")
-			.answerSingleChoice("True")
+			.answerSingleChoiceWithParagraph("True")
 			.saveAnswer()
 			.assertOnAssessmentTestTerminated(15);
 	}
@@ -390,10 +390,10 @@ public class ImsQTI21Test extends Deployments {
 		qtiPage
 			.clickToolbarBack()
 			.assertOnAssessmentItem("Single choice")
-			.answerSingleChoice("Correct answer")
+			.answerSingleChoiceWithParagraph("Correct answer")
 			.saveAnswer()
 			.assertOnAssessmentItem("Last choice")
-			.answerSingleChoice("True")
+			.answerSingleChoiceWithParagraph("True")
 			.saveAnswer()
 			.assertOnAssessmentResults(15)
 			.assertOnAssessmentTestPassed()
@@ -478,7 +478,7 @@ public class ImsQTI21Test extends Deployments {
 				.getQTI12Page(ryomouBrowser);
 		userQtiPage
 			.assertOnAssessmentItem("Single choice")
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.answerMultipleChoice("Correct")
 			.saveAnswer()
@@ -579,7 +579,7 @@ public class ImsQTI21Test extends Deployments {
 				.getQTI12Page(browser);
 		qtiPage
 			.start()
-			.answerSingleChoice("Right")
+			.answerSingleChoiceWithParagraph("Right")
 			.saveAnswer()
 			.endTest()
 			.assertOnCourseAttempts(1)
@@ -665,7 +665,7 @@ public class ImsQTI21Test extends Deployments {
 				.getQTI12Page(browser);
 		qtiPage
 			.start()
-			.answerSingleChoice("Right")
+			.answerSingleChoiceWithParagraph("Right")
 			.saveAnswer()
 			.endTest()
 			.assertOnAssessmentResults()
@@ -760,7 +760,7 @@ public class ImsQTI21Test extends Deployments {
 				.getQTI12Page(browser);
 		qtiPage
 			.start()
-			.answerSingleChoice("Correct")
+			.answerSingleChoiceWithParagraph("Correct")
 			.saveAnswer()
 			.answerMultipleChoice("Correct")
 			.saveAnswer()
diff --git a/src/test/java/org/olat/selenium/page/qti/QTI21Page.java b/src/test/java/org/olat/selenium/page/qti/QTI21Page.java
index 08e92e1e004c8bb8100484677097b23f2084086a..61c5523253f760a7a751f38ff00c56273a194918 100644
--- a/src/test/java/org/olat/selenium/page/qti/QTI21Page.java
+++ b/src/test/java/org/olat/selenium/page/qti/QTI21Page.java
@@ -105,7 +105,23 @@ public class QTI21Page {
 		return this;
 	}
 	
+	/**
+	 * Check the answer of a single choice.
+	 * @param answer The answer
+	 * @return Itself
+	 */
 	public QTI21Page answerSingleChoice(String answer) {
+		By choiceBy = By.xpath("//tr[contains(@class,'choiceinteraction')][td[contains(@class,'choiceInteraction')][label[text()[contains(normalize-space(.),'" + answer + "')]]]]/td[contains(@class,'control')]/input[@type='radio']");
+		browser.findElement(choiceBy).click();
+		return this;
+	}
+	
+	/**
+	 * Check the answer of a single choice. The answer is wrapped in a P tag.
+	 * @param answer The answer
+	 * @return Itself
+	 */
+	public QTI21Page answerSingleChoiceWithParagraph(String answer) {
 		By choiceBy = By.xpath("//tr[contains(@class,'choiceinteraction')][td[contains(@class,'choiceInteraction')][label/p[contains(normalize-space(text()),'" + answer + "')]]]/td[contains(@class,'control')]/input[@type='radio']");
 		browser.findElement(choiceBy).click();
 		return this;
diff --git a/src/test/java/org/olat/test/file_resources/qti21/simple_QTI_21_multi-input.zip b/src/test/java/org/olat/test/file_resources/qti21/simple_QTI_21_multi-input.zip
new file mode 100644
index 0000000000000000000000000000000000000000..dd7ca2fff099938a1b4fd1a4b711f67045002fad
Binary files /dev/null and b/src/test/java/org/olat/test/file_resources/qti21/simple_QTI_21_multi-input.zip differ