diff --git a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java
index 09efd2ee2f5f2b1ad9b40b0225f8798519ccf4dc..3159fe5037659f2da045698835103cb3fd766e9d 100644
--- a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java
+++ b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java
@@ -167,6 +167,17 @@ public class HTMLToOpenXMLHandler extends DefaultHandler {
 		return null;
 	}
 	
+	protected void trimTextBuffer() {
+		if(textBuffer == null) return;
+		
+		String text = textBuffer.toString().trim();
+		if(text.length() == 0) {
+			textBuffer = null;
+		} else {
+			textBuffer = new StringBuilder(text);
+		}
+	}
+	
 	protected void flushText() {
 		if(textBuffer == null) return;
 		
@@ -403,7 +414,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler {
 	@Override
 	public void startElement(String uri, String localName, String qName, Attributes attributes) {
 		String tag = localName.toLowerCase();
-		if("p".equalsIgnoreCase(tag)) {
+		if("p".equals(tag)) {
 			getCurrentParagraph(pNeedNewParagraph);
 		} else if("span".equalsIgnoreCase(tag)) {
 			flushText();
@@ -419,18 +430,18 @@ public class HTMLToOpenXMLHandler extends DefaultHandler {
 			styleStack.add(new StyleStatus(tag, styles));
 		} else if("br".equals(tag)) {
 			closeParagraph();
-		} else if("em".equalsIgnoreCase(tag)) {
+		} else if("em".equals(tag)) {
 			flushText();
 			Style[] styles = setTextPreferences(Style.italic);
 			styleStack.add(new StyleStatus(tag, styles));
-		} else if("strong".equalsIgnoreCase(tag)) {
+		} else if("strong".equals(tag)) {
 			flushText();
 			Style[] styles = setTextPreferences(Style.bold);
 			styleStack.add(new StyleStatus(tag, styles));
 		} else if("img".equals(tag)) {
 			String path = attributes.getValue("src");
 			setImage(path);
-		} else if("table".equalsIgnoreCase(tag)) {
+		} else if("table".equals(tag)) {
 			startTable();
 		} else if("tr".equals(tag)) {
 			startCurrentTableRow();
@@ -456,9 +467,11 @@ public class HTMLToOpenXMLHandler extends DefaultHandler {
 					appendParagraph(new Spacing(120, 0));
 					pNeedNewParagraph = false;
 				} else {
+					getCurrentParagraph(pNeedNewParagraph);
 					styleStack.add(new StyleStatus(tag, new Style[0]));
 				}
 			} else {
+				getCurrentParagraph(pNeedNewParagraph);
 				styleStack.add(new StyleStatus(tag, new Style[0]));
 			}
 		}
@@ -506,6 +519,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler {
 			popStyle(tag);
 		} else if("div".equals(tag)) {
 			popStyle(tag);
+			closeParagraph();
 		}
 	}
 	
diff --git a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java
index 1bcc4bb516f247fdff710ce366d23455ec8dacd0..dfaabdda7ff9adcd8cfc3fb8f84e0a962ce8af91 100644
--- a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java
+++ b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java
@@ -268,7 +268,7 @@ public class OpenXMLDocument {
 		
 		if(StringHelper.containsNonWhitespace(documentHeader)) {
 			try(InputStream headerIn = OpenXMLDocument.class.getResourceAsStream("_resources/header.xml")) {
-				String headerTemplate = IOUtils.toString(headerIn);
+				String headerTemplate = IOUtils.toString(headerIn, "UTF-8");
 				String header = headerTemplate.replace("[oodocumentitlte]", documentHeader);
 
 				String headerId = generateId();
diff --git a/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java b/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java
index f6fa794d74dd1345cafc12a5fee00c3b75ca0f3b..ba5463fb300267ae8e29cda9aae7caa11b8bde48 100644
--- a/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java
+++ b/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java
@@ -471,6 +471,11 @@ public class QTI21WordExport implements MediaResource {
 				case "simpleassociablechoice":
 					//do nothing
 					break;
+				case "div":
+				case "p":
+					trimTextBuffer();
+					super.startElement(uri, localName, qName, attributes);
+					break;
 				default: {
 					if(renderElement) {
 						super.startElement(uri, localName, qName, attributes);
@@ -668,7 +673,7 @@ public class QTI21WordExport implements MediaResource {
 		
 		private void startMatch(MatchInteraction matchInteraction) {
 			List<String> cssClasses = matchInteraction.getClassAttr();
-			if(cssClasses.contains(QTI21Constants.CSS_MATCH_DRAG_AND_DROP)) {
+			if(cssClasses != null && cssClasses.contains(QTI21Constants.CSS_MATCH_DRAG_AND_DROP)) {
 				if(hasClass(matchInteraction, QTI21Constants.CSS_MATCH_SOURCE_TOP)
 						|| hasClass(matchInteraction, QTI21Constants.CSS_MATCH_SOURCE_BOTTOM)) {
 					startMatchDragAndDropHorizontal(matchInteraction);