diff --git a/pom.xml b/pom.xml
index e411e24e78bf8b4738d24fa93f126607f9cf0f4d..7d9ad783e0234ea5ccfe0ad3f972a0009e7a0dfc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,7 +78,7 @@
 		<version.selenium>3.141.59</version.selenium>
 		<version.drone>2.5.1</version.drone>
 		<activemq.version>5.15.12</activemq.version>
-		<qtiworks.version>1.0.18</qtiworks.version>
+		<qtiworks.version>1.0.19</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 -->
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java
index 6e0855cbc3a925463f121beedc2d52ff76cafde1..c56cc950e81d18edee35cfc8acecbaa3bdeccd41 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java
@@ -93,7 +93,9 @@ public class FileElementRenderer extends DefaultComponentRenderer {
 			boolean showDeleteButton = fileElem.isDeleteEnabled()
 					&& (fileElem.getInitialFile() != null || fileElem.getUploadFile() != null);
 			
-			sb.append("<div class='o_fileinput'>");	
+			sb.append("<div class='o_fileinput")
+			  .append(" o_sel_file_uploaded", fileElem.getUploadFile() != null)
+			  .append("'>");
 			// input.Browse is the real filebrowser, but set to be transparent. 
 			// the div.o_fakechooser is layered below the input.Browse and represents the visual GUI. 
 			// Since input.Browse is layered above div.o_fakechooser, all click events to go input.Browse
@@ -106,7 +108,9 @@ public class FileElementRenderer extends DefaultComponentRenderer {
 				 if (fileElem.getMaxUploadSizeKB() != FileElement.UPLOAD_UNLIMITED) {
 					 sb.append("\" data-max-size=\"").append(fileElem.getMaxUploadSizeKB() * 1024l);
 				 }
-				 sb.append("\" class='form-control o_realchooser ").append(" o_chooser_with_delete", showDeleteButton).append("' ");
+				 sb.append("\" class='form-control o_realchooser ")
+				   .append(" o_chooser_with_delete", showDeleteButton)
+				   .append("' ");
 				 // Add on* event handlers
 				 StringBuilder eventHandlers = FormJSHelper.getRawJSFor(fileElem.getRootForm(), id, fileElem.getAction());
 				 int onChangePos = eventHandlers.indexOf("onchange=");
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java
index 384ef40ec5af8a378d344aba6caa26a7f565392f..b67a5028d3d189ac08483847dbd3fcf902afec0d 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java
@@ -55,6 +55,7 @@ import org.xml.sax.helpers.DefaultHandler;
 
 import nu.validator.htmlparser.common.XmlViolationPolicy;
 import nu.validator.htmlparser.sax.HtmlParser;
+import uk.ac.ed.ph.jqtiplus.internal.util.StringUtilities;
 
 /**
  * 
@@ -357,6 +358,7 @@ public class FIBEditorController extends FormBasicController {
 						solution = attributes.getValue(i);
 						if(solution != null) {
 							solution = itemBuilder.unescapeDataQtiSolution(solution);
+							solution = StringUtilities.trim(solution);
 						}
 					} else if("data-qti-solution-empty".equals(name)) {
 						solutionEmpty = attributes.getValue(i);
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java
index 9294d751d22f27a163f0016603793746ad9e1894..0b568c5ffb383d63d18155077cf89b7a5962863c 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java
@@ -41,6 +41,7 @@ import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.TextEn
 import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.TextEntryAlternative;
 import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController;
 
+import uk.ac.ed.ph.jqtiplus.internal.util.StringUtilities;
 import uk.ac.ed.ph.jqtiplus.types.Identifier;
 
 /**
@@ -241,7 +242,7 @@ public class FIBTextEntrySettingsController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		interaction.setSolution(solutionEl.getValue());
+		interaction.setSolution(StringUtilities.trim(solutionEl.getValue()));
 		interaction.setPlaceholder(placeholderEl.getValue());
 		List<TextEntryAlternative> alternatives = new ArrayList<>(alternativeRows.size());
 		for(AlternativeRow row:alternativeRows) {
@@ -253,24 +254,24 @@ public class FIBTextEntrySettingsController extends FormBasicController {
 				String[] valArr = val.split("[;]");
 				for(int i=0;i<valArr.length; i++) {
 					if(i==0) {
-						alternative.setAlternative(valArr[i]);
+						alternative.setAlternative(StringUtilities.trim(valArr[i]));
 						alternatives.add(alternative);
 					} else {
 						TextEntryAlternative newAlternative = new TextEntryAlternative();
-						newAlternative.setAlternative(valArr[i]);
+						newAlternative.setAlternative(StringUtilities.trim(valArr[i]));
 						newAlternative.setScore(alternative.getScore());
 						alternatives.add(newAlternative);
 					}
 				}
 			} else {
-				alternative.setAlternative(val);
+				alternative.setAlternative(StringUtilities.trim(val));
 				alternatives.add(alternative);
 			}
 		}
 		interaction.setAlternatives(alternatives);
 		interaction.setCaseSensitive(caseSensitiveEl.isAtLeastSelected(1));
 		if(StringHelper.containsNonWhitespace(expectedLengthEl.getValue())) {
-			interaction.setExpectedLength(new Integer(expectedLengthEl.getValue()));
+			interaction.setExpectedLength(Integer.valueOf(expectedLengthEl.getValue()));
 		} else {
 			interaction.setExpectedLength(null);
 		}
diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java
index 62fa103995dcd1187c72e07083a0aa0dcbedc5a8..6fcfd8065943d56b90756b98c9576f35e0fa76b3 100644
--- a/src/test/java/org/olat/selenium/AssessmentTest.java
+++ b/src/test/java/org/olat/selenium/AssessmentTest.java
@@ -936,7 +936,7 @@ public class AssessmentTest extends Deployments {
 			@Drone @Participant WebDriver kanuBrowser)
 	throws IOException, URISyntaxException {
 			
-		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		UserVO author = new UserRestClient(deploymentUrl).createRandomAuthor();
 		UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
 		UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou");
 
diff --git a/src/test/java/org/olat/selenium/page/core/FolderPage.java b/src/test/java/org/olat/selenium/page/core/FolderPage.java
index a7776c7ff7b69f401b8a33bd7a2eae68b5de6b16..bb26ecbae2f2386bd522a69b7c16c9b0267ea532 100644
--- a/src/test/java/org/olat/selenium/page/core/FolderPage.java
+++ b/src/test/java/org/olat/selenium/page/core/FolderPage.java
@@ -126,6 +126,8 @@ public class FolderPage {
 		By inputBy = By.cssSelector("div.modal-dialog div.o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("div.modal-dialog div.o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector("div.o_sel_upload_buttons button.btn-primary");
 		browser.findElement(saveButtonBy).click();
diff --git a/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java
index ea25e1ef0dbbdae4b407b832c539cad498b36c96..36ba7b6f38baa5e8569d9479c0bb742dbf7bc0e2 100644
--- a/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java
@@ -53,6 +53,8 @@ public class DialogConfigurationPage {
 		By inputBy = By.xpath("//div[contains(@class,'modal-body')]//div[@class='o_fileinput']/input[@type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("div.modal-body .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By uploadButtonBy = By.cssSelector("div.modal-body div.o_sel_upload_buttons button.btn-primary");
 		OOGraphene.waitElement(uploadButtonBy, browser);
diff --git a/src/test/java/org/olat/selenium/page/course/DialogPage.java b/src/test/java/org/olat/selenium/page/course/DialogPage.java
index 08400db37a9b5e056a8c6af697995a941f03e511..b6803845c472aade06b68f0f0071de01cb973f74 100644
--- a/src/test/java/org/olat/selenium/page/course/DialogPage.java
+++ b/src/test/java/org/olat/selenium/page/course/DialogPage.java
@@ -49,6 +49,8 @@ public class DialogPage {
 		By inputBy = By.cssSelector("div.modal-dialog div.o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("div.modal-dialog .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector("div.o_sel_upload_buttons button.btn-primary");
 		browser.findElement(saveButtonBy).click();
diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
index 24c67de297551eb3cfa0a80ce5fc5f11dfb0f9c0..d69d2deb9530595f8570ac847f716cddb86c0c75 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
@@ -166,6 +166,8 @@ public class GroupTaskConfigurationPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_task_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		//save
 		By saveBy = By.cssSelector(".o_sel_course_gta_upload_task_form button.btn-primary");
@@ -203,6 +205,8 @@ public class GroupTaskConfigurationPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_solution_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		//save
 		By saveBy = By.cssSelector(".o_sel_course_gta_upload_solution_form button.btn-primary");
diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
index f8819fa399dc576c44512ac248e20747c0cfbdf1..4a3e552280da529e006defe3c698e4ee3da9aa21 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
@@ -130,6 +130,8 @@ public class GroupTaskPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector(".o_sel_course_gta_upload_form button.btn-primary");
 		browser.findElement(saveButtonBy).click();
diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
index a74ebae757a10937a80d80cd20732d6fad254ac2..bb236a23ef907f9f6f70bfe8b594e31ca89ef373 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
@@ -137,6 +137,8 @@ public class GroupTaskToCoachPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, correctionFile, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector(".o_sel_course_gta_upload_form button.btn-primary");
 		browser.findElement(saveButtonBy).click();
diff --git a/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java
index 771054695b9ea46103ea046013b2f89eaddaf698..dbe48dc26294203ccaa595c788ce96bfc3a2c1a5 100644
--- a/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java
@@ -79,6 +79,8 @@ public class SinglePageConfigurationPage {
 		By inputBy = By.cssSelector(".modal-body .o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".modal-body .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By uploadBy = By.cssSelector(".modal-body .o_sel_upload_buttons button.btn-primary");
 		OOGraphene.waitElement(uploadBy, browser);
diff --git a/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java b/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java
index dfb8bbbf050642baf05bc94a5a232394078b28fc..464e64a2b58d771b94af419d3b4d7932e3aeb8da 100644
--- a/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java
+++ b/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java
@@ -130,7 +130,9 @@ public class EntryPage {
 		
 		By inputBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form .o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, document, browser);
-		OOGraphene.waitingALittleLonger();//wait event
+		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By titleBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form .o_sel_pf_collect_title input[type='text']");
 		browser.findElement(titleBy).sendKeys(title);
@@ -139,6 +141,7 @@ public class EntryPage {
 		By saveBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form button.btn-primary");
 		browser.findElement(saveBy).click();
 		OOGraphene.waitBusy(browser);
+		OOGraphene.waitModalDialogDisappears(browser);
 		return this;
 	}
 	
diff --git a/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java b/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java
index e29da679bf000cb270bd4428d79bbf7155608be5..5c96343b5e0afdbaa5c09b57b7ce61c4d4177ff4 100644
--- a/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java
+++ b/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java
@@ -92,11 +92,13 @@ public class CPEditorPage {
 		
 		//wait popup
 		By metadataPopupBy = By.cssSelector("fieldset.o_sel_cp_import");
-		OOGraphene.waitElement(metadataPopupBy, 2, browser);
+		OOGraphene.waitElement(metadataPopupBy, browser);
 		
 		By inputBy = By.cssSelector("fieldset.o_sel_cp_import .o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, page, browser);
-		OOGraphene.waitingALittleLonger();//wait event
+		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("fieldset.o_sel_cp_import .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		//ok save
 		By saveBy = By.cssSelector("fieldset.o_sel_cp_import button.btn-primary");