diff --git a/src/main/java/de/bps/course/nodes/ll/LLEditForm.java b/src/main/java/de/bps/course/nodes/ll/LLEditForm.java
index 8a0d04e21d6934b9def5974eead061beb3cf74ff..64c46a7bd3d568577e97f4d97ced3c628d23acfc 100644
--- a/src/main/java/de/bps/course/nodes/ll/LLEditForm.java
+++ b/src/main/java/de/bps/course/nodes/ll/LLEditForm.java
@@ -322,7 +322,8 @@ public class LLEditForm extends FormBasicController {
 		lTarget.setUserObject(link);
 		lTargetInputList.add(index, lTarget);
 		//add html target
-		SingleSelection htmlTargetSelection = uifactory.addDropdownSingleselect("html_target" + counter, flc, new String[]{BLANK_KEY, SELF_KEY}, new String[]{translate("ll.table.html_target"), translate("ll.table.html_target.self")}, null);
+		SingleSelection htmlTargetSelection = uifactory.addDropdownSingleselect("html_target" + counter, null, flc,
+				new String[]{BLANK_KEY, SELF_KEY}, new String[]{translate("ll.table.html_target"), translate("ll.table.html_target.self")}, null);
 		htmlTargetSelection.setUserObject(link);
 		htmlTargetSelection.select((SELF_KEY.equals(link.getHtmlTarget()) ? SELF_KEY : BLANK_KEY), true);
 		lHtmlTargetInputList.add(index, htmlTargetSelection);
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java b/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java
index d94737e00edbe62eedb85f6e73489c36e3f9ee64..0d2e2406d147b2120618a2d03c119457013db824 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/FormUIFactory.java
@@ -270,6 +270,10 @@ public class FormUIFactory {
 		return addCheckboxesVertical(name, name, formLayout, keys, values, null, iconLeftCSS, columns);
 	}
 	
+	public MultipleSelectionElement addCheckboxesVertical(String name, String i18nLabel, FormItemContainer formLayout, String[] keys, String[] values, String[] iconLeftCSS, int columns) {
+		return addCheckboxesVertical(name, i18nLabel, formLayout, keys, values, null, iconLeftCSS, columns);
+	}
+	
 	public MultipleSelectionElement addCheckboxesVertical(String name, String i18nLabel, FormItemContainer formLayout, String[] keys, String[] values, int columns) {
 		return addCheckboxesVertical(name, i18nLabel, formLayout, keys, values, null, null, columns);
 	}
diff --git a/src/main/java/org/olat/core/util/i18n/ui/TranslationToolI18nItemEditCrumbController.java b/src/main/java/org/olat/core/util/i18n/ui/TranslationToolI18nItemEditCrumbController.java
index 68eeffefc8b0905a7b8b093e4b74428836df720a..1157507358e62e2eba56b97fac05fa613742d30b 100644
--- a/src/main/java/org/olat/core/util/i18n/ui/TranslationToolI18nItemEditCrumbController.java
+++ b/src/main/java/org/olat/core/util/i18n/ui/TranslationToolI18nItemEditCrumbController.java
@@ -179,20 +179,20 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		}
 		String[] bundlesListArray = ArrayHelper.toArray(bundlesList);
 		String[] keysListArray = ArrayHelper.toArray(keysList);
-		bundlesSelection = uifactory.addDropdownSingleselect("bundlesSelection", this.flc, bundlesListArray, bundlesListArray, null);
+		bundlesSelection = uifactory.addDropdownSingleselect("bundlesSelection", null, flc, bundlesListArray, bundlesListArray, null);
 		bundlesSelection.setDomReplacementWrapperRequired(false);
 		bundlesSelection.addActionListener(FormEvent.ONCHANGE);
 		bundlesSelection.select(currentItem.getBundleName(), true);
-		keysSelection = uifactory.addDropdownSingleselect("keysSelection", this.flc, keysListArray, keysListArray, null);
+		keysSelection = uifactory.addDropdownSingleselect("keysSelection", null, flc, keysListArray, keysListArray, null);
 		keysSelection.setDomReplacementWrapperRequired(false);
 		keysSelection.addActionListener(FormEvent.ONCHANGE);
 		keysSelection.select(currentItem.getKey(), true);
 		// Add reference box
-		referenceArea = uifactory.addTextAreaElement("referenceArea", "edit.referenceArea", -1, 1, -1, true, false, null, flc);
+		referenceArea = uifactory.addTextAreaElement("referenceArea", null, -1, 1, -1, true, false, null, flc);
 		referenceArea.setEnabled(false); // read only
 		// Add compare box
 		Boolean compareEnabledPrefs = (Boolean) guiPrefs.get(I18nModule.class, I18nModule.GUI_PREFS_COMPARE_LANG_ENABLED, Boolean.FALSE);
-		compareArea = uifactory.addTextAreaElement("compareArea", "edit.compareArea", -1, 1, -1, true, false, null, this.flc);
+		compareArea = uifactory.addTextAreaElement("compareArea", null, -1, 1, -1, true, false, null, flc);
 		compareArea.setEnabled(false); // read only
 		compareArea.setVisible(compareEnabledPrefs.booleanValue());
 		
@@ -221,7 +221,7 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 				.getDefaultLocale().toString());
 		compareLocale = i18nMgr.getLocaleOrNull(comparePrefs);
 		if (compareLocale == null) compareLocale = I18nModule.getDefaultLocale();
-		compareLangSelection = uifactory.addDropdownSingleselect("compareLangSelection", flc, comparelangKeys, compareLangValues, null);
+		compareLangSelection = uifactory.addDropdownSingleselect("compareLangSelection", null, flc, comparelangKeys, compareLangValues, null);
 		compareLangSelection.setDomReplacementWrapperRequired(false);
 		compareLangSelection.select(i18nModule.getLocaleKey(compareLocale), true);
 		flc.contextPut("compareLanguageKey", i18nModule.getLocaleKey(compareLocale));
@@ -231,9 +231,9 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		// Add target box
 		flc.contextPut("targetLanguageKey", i18nModule.getLocaleKey(currentItem.getLocale()));
 		flc.contextPut("targetLanguage", i18nMgr.getLanguageTranslated(i18nModule.getLocaleKey(currentItem.getLocale()), false));			
-		targetArea = uifactory.addTextAreaElement("targetArea", "edit.targetArea", -1, 5, -1, true, false, null, flc);
+		targetArea = uifactory.addTextAreaElement("targetArea", null, -1, 5, -1, true, false, null, flc);
 		// Add annotation box
-		annotationArea = uifactory.addTextAreaElement("annotationArea", "edit.annotationArea", -1, 1, -1, true, false, null, flc);
+		annotationArea = uifactory.addTextAreaElement("annotationArea", null, -1, 1, -1, true, false, null, flc);
 		// Add progress bar
 		// init with values
 		progressBarBundle = new ProgressBar("progressBarBundle", 300, 1, bundlesList.size(), translate("generic.bundles"));
@@ -278,7 +278,7 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 			// still in same bundle, just select the currentItemPosition key
 			keysSelection.select(currentItem.getKey(), true);
 			// Update key progress bar
-			progressBarKey.setActual(keysSelection.getSelected() + 1);
+			progressBarKey.setActual(keysSelection.getSelected() + 1.0f);
 		} else {
 			// in new bundle, load new keys
 			updateKeysSelectionAndProgress();
@@ -343,11 +343,11 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		keysSelection.select(currentItem.getKey(), true);
 		// Update key progress bar
 		progressBarKey.setMax(keysListArray.length);
-		progressBarKey.setActual(keysSelection.getSelected()+1);
+		progressBarKey.setActual(keysSelection.getSelected() + 1.0f);
 		// Set currentItemPosition bundle
 		bundlesSelection.select(currentItem.getBundleName(), true);
 		// Update bundle progress bar
-		progressBarBundle.setActual(bundlesSelection.getSelected()+1);
+		progressBarBundle.setActual(bundlesSelection.getSelected() + 1.0f);
 	}
 
 	private void doPrevious(UserRequest ureq) {
@@ -384,16 +384,9 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		}
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK
-	 * (org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	protected void formOK(UserRequest ureq) {
-	// no form ok events to catch
+		// no form ok events to catch
 	}
 
 	@Override
@@ -411,14 +404,6 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		return allOk;
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.olat.core.gui.components.form.flexible.impl.FormBasicController#
-	 * formInnerEvent(org.olat.core.gui.UserRequest,
-	 * org.olat.core.gui.components.form.flexible.FormItem,
-	 * org.olat.core.gui.components.form.flexible.impl.FormEvent)
-	 */
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == bundlesSelection) {
@@ -490,12 +475,7 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		}
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.olat.core.gui.control.generic.breadcrumb.CrumbController#
-	 * getCrumbLinkHooverText()
-	 */
+	@Override
 	public String getCrumbLinkHooverText() {
 		if (customizingMode) {
 			return translate("edit.customize.crumb.hoover");			
@@ -503,24 +483,11 @@ public class TranslationToolI18nItemEditCrumbController extends CrumbFormBasicCo
 		return translate("edit.crumb.hoover");
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.olat.core.gui.control.generic.breadcrumb.CrumbController#getCrumbLinkText
-	 * ()
-	 */
+	@Override
 	public String getCrumbLinkText() {
 		return translate("edit.crumb.link");
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose
-	 * ()
-	 */
 	@Override
 	protected void doDispose() {
 		i18nItems = null;
diff --git a/src/main/java/org/olat/core/util/i18n/ui/TranslationToolStartCrumbController.java b/src/main/java/org/olat/core/util/i18n/ui/TranslationToolStartCrumbController.java
index 8922a7484b909efd9cef260320098aee272dbceb..c5a5ca6c8b678188a64156d1fde17a4954981de5 100644
--- a/src/main/java/org/olat/core/util/i18n/ui/TranslationToolStartCrumbController.java
+++ b/src/main/java/org/olat/core/util/i18n/ui/TranslationToolStartCrumbController.java
@@ -260,7 +260,7 @@ class TranslationToolStartCrumbController extends CrumbFormBasicController {
 	private void initMissingItemsElements(FormUIFactory formFactory, FormItemContainer formLayout,
 			String[] bundlesKeys, String[] bundlesValues) {
 		// Add missing bundles selector
-		missingBundlesSelection = formFactory.addDropdownSingleselect("missingBundlesSelection", this.flc, bundlesKeys, bundlesValues, null);
+		missingBundlesSelection = formFactory.addDropdownSingleselect("missingBundlesSelection", null, flc, bundlesKeys, bundlesValues, null);
 		missingBundlesSelection.addActionListener(FormEvent.ONCHANGE);
 		missingBundlesSelection.select(ALL_BUNDLES_IDENTIFYER, true);
 		// Add missing bundles children switch
@@ -288,7 +288,7 @@ class TranslationToolStartCrumbController extends CrumbFormBasicController {
 	private void initExistingItemsElements(FormUIFactory formFactory, FormItemContainer formLayout,
 			String[] bundlesKeys, String[] bundlesValues) {
 		// Add existing bundles selector
-		existingBundlesSelection = formFactory.addDropdownSingleselect("existingBundlesSelection", this.flc, bundlesKeys, bundlesValues, null);
+		existingBundlesSelection = formFactory.addDropdownSingleselect("existingBundlesSelection", null, flc, bundlesKeys, bundlesValues, null);
 		existingBundlesSelection.addActionListener(FormEvent.ONCHANGE);
 		existingBundlesSelection.select(ALL_BUNDLES_IDENTIFYER, true);
 		// Add existing bundles children switch
@@ -316,7 +316,7 @@ class TranslationToolStartCrumbController extends CrumbFormBasicController {
 	private void initAllItemsElements(FormUIFactory formFactory, FormItemContainer formLayout,
 			String[] bundlesKeys, String[] bundlesValues) {
 		// Add all bundles selector
-		allBundlesSelection = formFactory.addDropdownSingleselect("allBundlesSelection", this.flc, bundlesKeys, bundlesValues, null);
+		allBundlesSelection = formFactory.addDropdownSingleselect("allBundlesSelection", null, flc, bundlesKeys, bundlesValues, null);
 		allBundlesSelection.addActionListener(FormEvent.ONCHANGE);
 		allBundlesSelection.select(ALL_BUNDLES_IDENTIFYER, true);
 		// Add all bundles children switch
@@ -366,7 +366,7 @@ class TranslationToolStartCrumbController extends CrumbFormBasicController {
 				searchReferenceTargetKeys, searchReferenceTargetValues);
 		searchReferenceTargetSelection.select(KEYS_TARGET, true);
 		// Add search bundles selector : reuse keys from above
-		searchBundlesSelection = formFactory.addDropdownSingleselect("searchBundlesSelection", searchLayoutContainer, bundlesKeys,
+		searchBundlesSelection = formFactory.addDropdownSingleselect("searchBundlesSelection", null, searchLayoutContainer, bundlesKeys,
 				bundlesValues, null);
 		searchBundlesSelection.setLabel("generic.limit.bundles", null);
 		searchBundlesSelection.addActionListener(FormEvent.ONCHANGE);
diff --git a/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java b/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
index 2a96f228b0475d798cf9fb65ec8ed7f2fc851c0f..86a9409175b9443125d9ddb37067fe696d2c30b0 100644
--- a/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
+++ b/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
@@ -37,6 +37,7 @@ import org.olat.core.commons.modules.bc.commands.FolderCommand;
 import org.olat.core.commons.modules.bc.commands.FolderCommandHelper;
 import org.olat.core.commons.modules.bc.commands.FolderCommandStatus;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
+import org.olat.core.commons.modules.bc.meta.MetaInfoController;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -111,7 +112,8 @@ public class SendDocumentsByEMailController extends FormBasicController implemen
 	private BaseSecurity securityManager;
 
 	public SendDocumentsByEMailController(UserRequest ureq, WindowControl wControl) {
-		super(ureq, wControl, null, Util.createPackageTranslator(MailModule.class, ureq.getLocale()));
+		super(ureq, wControl, null, Util.createPackageTranslator(MailModule.class, ureq.getLocale(),
+				Util.createPackageTranslator(MetaInfoController.class, ureq.getLocale())));
 		setBasePackage(MailModule.class);
 
 		allowAttachments = !FolderConfig.getSendDocumentLinkOnly();
diff --git a/src/main/java/org/olat/course/disclaimer/ui/CourseDisclaimerController.java b/src/main/java/org/olat/course/disclaimer/ui/CourseDisclaimerController.java
index 979c8ace97bdf3784ac9e99b04ce738206b047d3..f6d54f367db04145e1d50811302546e3a1f21fc6 100644
--- a/src/main/java/org/olat/course/disclaimer/ui/CourseDisclaimerController.java
+++ b/src/main/java/org/olat/course/disclaimer/ui/CourseDisclaimerController.java
@@ -110,7 +110,7 @@ public class CourseDisclaimerController extends FormBasicController {
 		uifactory.addSpacerElement("course.disclaimer.spacer.1", formLayout, false);
 
 		// Disclaimer 1
-		disclaimer1HeaderEl = uifactory.addStaticTextElement("course.disclaimer.1.section", translate("course.disclaimer.1"), formLayout);
+		disclaimer1HeaderEl = uifactory.addStaticTextElement("course.disclaimer.1.section", null, translate("course.disclaimer.1"), formLayout);
 		disclaimer1HeaderEl.showLabel(false);
 		disclaimer1HeaderEl.setElementCssClass("o_static_textelement_bold");
 
@@ -129,7 +129,7 @@ public class CourseDisclaimerController extends FormBasicController {
 		spacer = uifactory.addSpacerElement("course.disclaimer.spacer.2", formLayout, false);
 
 		// Disclaimer 2
-		disclaimer2HeaderEl = uifactory.addStaticTextElement("course.disclaimer.2.section", translate("course.disclaimer.2"), formLayout);
+		disclaimer2HeaderEl = uifactory.addStaticTextElement("course.disclaimer.2.section", null, translate("course.disclaimer.2"), formLayout);
 		disclaimer2HeaderEl.showLabel(false);
 		disclaimer2HeaderEl.setElementCssClass("o_static_textelement_bold");
 
diff --git a/src/main/java/org/olat/course/editor/MultiSPController.java b/src/main/java/org/olat/course/editor/MultiSPController.java
index ba4e7bf7133efd171799dd654c7a4033dd8e195b..d4aeeda22400d0c77e076f72940671a347ad467b 100644
--- a/src/main/java/org/olat/course/editor/MultiSPController.java
+++ b/src/main/java/org/olat/course/editor/MultiSPController.java
@@ -121,7 +121,8 @@ public class MultiSPController extends FormBasicController {
 		String[] singleKey = new String[]{ node.getId() };
 		String[] singleValue = new String[]{ node.getName() };
 		String[] iconCSS = new String[]{ "o_icon o_icon-fw " + node.getIconCssClass() };
-		MultipleSelectionElement nodeSelection = uifactory.addCheckboxesVertical("print.node.list." + nodeSelections.size(), layoutcont, singleKey, singleValue, iconCSS, 1);
+		MultipleSelectionElement nodeSelection = uifactory.addCheckboxesVertical("print.node.list." + nodeSelections.size(), null, layoutcont,
+				singleKey, singleValue, iconCSS, 1);
 		nodeSelection.setLabel("multi.sps.file", null);
 		
 		nodeSelection.setUserObject(node);
diff --git a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
index 6e9bfe6c17787235110857d5a4bbc6c6e3a42fb3..8f5557cf53ee4bc5d7011f8e923db223a2d5505a 100644
--- a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
+++ b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java
@@ -41,6 +41,7 @@ import java.util.zip.ZipOutputStream;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.logging.log4j.Logger;
 import org.apache.velocity.VelocityContext;
 import org.olat.admin.user.imp.TransientIdentity;
 import org.olat.core.CoreSpringFactory;
@@ -63,7 +64,6 @@ import org.olat.core.gui.util.WindowControlMocker;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.id.UserConstants;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
index d3543aba1cf320ffb9173c8d32ea900fbe81046e..3e3a21dc0c491cc081de866e849ee734e9873aad 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
@@ -80,6 +80,7 @@ confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend
 confirmation=Best\u00E4tigung
 correct.solution=Korrekte L\u00F6sung
 correction=Korrigieren
+correction.alternatives=Varianten
 correction.readonly=Korrektur nur sehen
 correction.workflow=Korrekturworkflow
 correction.workflow.anonymous=Anonym
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
index 9f6a8b8914332fdc413c8d1e19b40e4d508d20cf..15fd21fdf051b84bee32c58938557083291fe71f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
@@ -80,6 +80,7 @@ confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend
 confirmation=Confirmation
 correct.solution=Correct solution
 correction=Grade
+correction.alternatives=Alternative
 correction.readonly=See correction read only
 correction.workflow=Correction workflow
 correction.workflow.anonymous=Anonymous
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties
index 262b81fbb5e5023503428e7f42905d52c61e5a04..c0f5931c698683bcd960457ee3d977b389c5c7fa 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties
@@ -80,6 +80,7 @@ confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend
 confirmation=Confirmation
 correct.solution=Solution correcte
 correction=Corriger
+correction.alternatives=Alternatives
 correction.readonly=Corrections en lecture seule
 correction.workflow=Corrections
 correction.workflow.anonymous=Anonymis\u00E9
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
index 8cba37429b84c9ae2cc6fc19e973bb4d4ce98d6b..4817155cdc0be19487c49796857d5326b9ebf491 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties
@@ -86,7 +86,8 @@ fib.tolerance.mode.absolute.help=Die Schranke stellt eine absolute Zahl dar. Bei
 fib.tolerance.mode.exact=Genau
 fib.tolerance.mode.exact.help=Die L\u00F6sung entspricht exakt der eingegebenen L\u00F6sung unter "L\u00F6sung"
 fib.tolerance.mode.relative=Relativ
-fib.tolerance.mode.relative.example=Prozent, zum Beispiel 15 oder 99.0
+fib.tolerance.mode.relative.low.example=Prozent Abweichung nach unten, example 15
+fib.tolerance.mode.relative.up.example=Prozent Abweichung nach oben, example 15
 fib.tolerance.mode.relative.help=Die Schranke stellt eine relative Zahl in Prozent dar.\u2028Beispiel\: L\u00F6sung 20, Untere Schranke 10, Obere Schranke 10 → Alle L\u00F6sungen zwischen 18 und 22 sind g\u00FCltig, denn die untere Schranke bedeutet minus 10% (20-2) und die obere Schranke plus 10% (20+2).
 fib.tolerance.up=Obere Schranke
 file=Datei
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
index 73c88a05be274d4384259ab222a51e0848b6fa97..0681fa493498f830c81279bb384110a1371830a2 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties
@@ -86,7 +86,8 @@ fib.tolerance.mode.absolute.help=The solution is accepted until a lower and an u
 fib.tolerance.mode.exact=Exact
 fib.tolerance.mode.exact.help=The solution correlates exactly with the inserted solution in "Solution"
 fib.tolerance.mode.relative=Relative
-fib.tolerance.mode.relative.example=Percentage, example 15 or 99.0
+fib.tolerance.mode.relative.low.example=Lower tolerance in percent, example 15
+fib.tolerance.mode.relative.up.example=Upper tolerance in percent, example 15
 fib.tolerance.mode.relative.help=The solution is accepted until a lower and an upper bound. The bound is a relative number in percent. Example\: Solution 20, lower bound 10, upper bound 10 → all solutions between 18 and 22 are correct, as the lower bound means minus 10% (20-2) and the upper bound plus 10% (20+2).
 fib.tolerance.up=Upper bound
 file=File
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
index afbe9a781c932b2c93d8322f3bdc4b5e34102a5e..a7e39153e2bc8dcbdba2df136b8744392e995dd1 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
@@ -87,7 +87,8 @@ fib.tolerance.mode.absolute.help=La solution est accept\u00E9 si elle se trouve
 fib.tolerance.mode.exact=Exact
 fib.tolerance.mode.exact.help=La solution doit \u00EAtre exactement celle entr\u00E9e sous "Solution".
 fib.tolerance.mode.relative=Relatif
-fib.tolerance.mode.relative.example=Pourcentage, par example 15 ou 99.0
+fib.tolerance.mode.relative.low.example=Tol\u00E9rance sup\u00E9rieure en pourcent, example 15
+fib.tolerance.mode.relative.up.example=Tol\u00E9rance inf\u00E9rieure en pourcent, example 15
 fib.tolerance.mode.relative.help=Le solution est accept\u00E9 entre la limite inf\u00E9rieure et sup\u00E9rieure. La limite peut \u00EAtre un nombre relatif exprim\u00E9 en pour cent, exemple, la solution est 20, limite inf\u00E9rieure 10, limite sup\u00E9rieure 10 → toutes les r\u00E9ponses entre 18 et 22 sont correctes. La limite inf\u00E9rieure signifie moins 10% (20-2) and la limite sup\u00E9rieur plus 10% (20+2).
 fib.tolerance.up=Limite sup\u00E9rieur
 file=Fichier
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_it.properties
index 8e5fb6483ee6a84fbb1bd661a96f1f69b51e8755..9322ca2e61e8f18bb2a182a38ff91f938e61cf73 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_it.properties
@@ -37,7 +37,6 @@ fib.tolerance.mode.absolute=Assoluto
 fib.tolerance.mode.absolute.example=Un numero, ad esempio 1.5 oppure 1322
 fib.tolerance.mode.exact=Esatto
 fib.tolerance.mode.relative=Relativo
-fib.tolerance.mode.relative.example=Percentuale, ad esempio 15 oppure 99.0
 fib.tolerance.up=Limite superiore
 file=File
 form.choice=Scelta
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties
index 35cfbcc65fdfe1d6b5542096d4ecd4d59aa05cb8..f5644ca97006ea57d08866375c09264fdaf1bcee 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties
@@ -85,7 +85,6 @@ fib.tolerance.mode.absolute.help=A solu\u00E7\u00E3o \u00E9 aceita at\u00E9 um l
 fib.tolerance.mode.exact=Exato
 fib.tolerance.mode.exact.help=A solu\u00E7\u00E3o correlaciona-se exatamente com a solu\u00E7\u00E3o inserida em "Solu\u00E7\u00E3o"
 fib.tolerance.mode.relative=Relativo
-fib.tolerance.mode.relative.example=Porcentagem, exemplo 15 ou 99.0
 fib.tolerance.mode.relative.help=A solu\u00E7\u00E3o \u00E9 aceita at\u00E9 um limite inferior e um limite superior. O limite \u00E9 um n\u00FAmero relativo em porcentagem. Exemplo\: Solu\u00E7\u00E3o 20, limite inferior 10, limite superior 10 & rarr; Todas as solu\u00E7\u00F5es entre 18 e 22 s\u00E3o corretas, j\u00E1 que o limite inferior significa menos 10% (20-2) e o limite superior mais 10% (20 + 2).
 fib.tolerance.up=Limite superior
 file=Arquivo
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_zh_CN.properties
index ce785e29021694db924583b8850868848a630ed6..e473defae1926bdd7cc2285ad2836f4d65e16ed3 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_zh_CN.properties
@@ -36,7 +36,6 @@ fib.tolerance.mode.absolute=\u7EDD\u5BF9
 fib.tolerance.mode.absolute.example=\u6570\u503C\uFF0C\u4F8B\u59821.5\u62161322
 fib.tolerance.mode.exact=\u7CBE\u786E
 fib.tolerance.mode.relative=\u76F8\u5BF9
-fib.tolerance.mode.relative.example=\u767E\u5206\u6570\uFF0C\u4F8B\u598215\u621699.0
 fib.tolerance.up=\u4E0A\u9650
 file=\u6587\u4EF6
 form.choice=\u9009\u62E9
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java
index ba3d2371da524787ec848165bb597401c957dd41..7ff1d43551d06562e63a31806e42afa083e27d04 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java
@@ -189,8 +189,8 @@ public class FIBNumericalEntrySettingsController extends FormBasicController {
 			lowerToleranceEl.setVisible(visible);
 			upperToleranceEl.setVisible(visible);
 			if(mode == ToleranceMode.RELATIVE) {
-				lowerToleranceEl.setExampleKey("fib.tolerance.mode.relative.example", null);
-				upperToleranceEl.setExampleKey("fib.tolerance.mode.relative.example", null);
+				lowerToleranceEl.setExampleKey("fib.tolerance.mode.relative.low.example", null);
+				upperToleranceEl.setExampleKey("fib.tolerance.mode.relative.up.example", null);
 			} else if(mode == ToleranceMode.ABSOLUTE) {
 				lowerToleranceEl.setExampleKey("fib.tolerance.mode.absolute.example", null);
 				upperToleranceEl.setExampleKey("fib.tolerance.mode.absolute.example", null);
diff --git a/src/main/java/org/olat/modules/opencast/OpencastEventProvider.java b/src/main/java/org/olat/modules/opencast/OpencastEventProvider.java
index e9ec5a2ae66b9c5ed8c235a212a1afa291060d6d..c1a75cbb68573c5f1ba9e73b653053b5003ac124 100644
--- a/src/main/java/org/olat/modules/opencast/OpencastEventProvider.java
+++ b/src/main/java/org/olat/modules/opencast/OpencastEventProvider.java
@@ -20,6 +20,7 @@
 package org.olat.modules.opencast;
 
 import java.util.List;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import org.olat.core.CoreSpringFactory;
@@ -35,6 +36,7 @@ import org.olat.core.id.Identity;
  */
 public class OpencastEventProvider implements ListProvider {
 	
+	private static final Function<Object, String> EVENT_TITLE_STINGIFIER = new EventTitleStingifier();
 	private static final int LIMIT = 15;
 
 	private final String moreKey;
@@ -63,7 +65,7 @@ public class OpencastEventProvider implements ListProvider {
 		}
 		
 		List<OpencastEvent> matchingEvents = events.stream()
-			.filter(e -> e.getTitle().toLowerCase().indexOf(searchValue.toLowerCase()) > -1)
+				.filter(new WildcardFilter(searchValue, EVENT_TITLE_STINGIFIER))
 			.sorted((e1, e2) -> e1.getTitle().compareToIgnoreCase(e2.getTitle()))
 			.collect(Collectors.toList());
 		List<OpencastEvent> limitedEvents = matchingEvents.stream()
@@ -75,5 +77,17 @@ public class OpencastEventProvider implements ListProvider {
 			receiver.addEntry(moreKey, moreKey);
 		}
 	}
+	
+	private static final class EventTitleStingifier implements Function<Object, String> {
+
+		@Override
+		public String apply(Object object) {
+			if (object instanceof OpencastEvent) {
+				return ((OpencastEvent)object).getTitle();
+			}
+			return null;
+		}
+		
+	}
 
 }
diff --git a/src/main/java/org/olat/modules/opencast/OpencastSeriesProvider.java b/src/main/java/org/olat/modules/opencast/OpencastSeriesProvider.java
index 157f0ef581ed17e8fd59503625b00c592174dcc1..6005fca6b45402ce46b0f0e3d6c871577b9fab35 100644
--- a/src/main/java/org/olat/modules/opencast/OpencastSeriesProvider.java
+++ b/src/main/java/org/olat/modules/opencast/OpencastSeriesProvider.java
@@ -20,6 +20,7 @@
 package org.olat.modules.opencast;
 
 import java.util.List;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import org.olat.core.CoreSpringFactory;
@@ -35,6 +36,7 @@ import org.olat.core.id.Identity;
  */
 public class OpencastSeriesProvider implements ListProvider {
 
+	private static final Function<Object, String> SERIES_TITLE_STINGIFIER = new SeriesTitleStingifier();
 	private static final int LIMIT = 15;
 
 	private final String moreKey;
@@ -63,7 +65,7 @@ public class OpencastSeriesProvider implements ListProvider {
 		}
 		
 		List<OpencastSeries> matchingSeries = series.stream()
-			.filter(s -> s.getTitle().toLowerCase().indexOf(searchValue.toLowerCase()) > -1)
+			.filter(new WildcardFilter(searchValue, SERIES_TITLE_STINGIFIER))
 			.sorted((s1, s2) -> s1.getTitle().compareToIgnoreCase(s2.getTitle()))
 			.collect(Collectors.toList());
 		List<OpencastSeries> limitedSeries = matchingSeries.stream()
@@ -75,5 +77,17 @@ public class OpencastSeriesProvider implements ListProvider {
 			receiver.addEntry(moreKey, moreKey);
 		}
 	}
+	
+	private static final class SeriesTitleStingifier implements Function<Object, String> {
+
+		@Override
+		public String apply(Object object) {
+			if (object instanceof OpencastSeries) {
+				return ((OpencastSeries)object).getTitle();
+			}
+			return null;
+		}
+		
+	}
 
 }
diff --git a/src/main/java/org/olat/modules/opencast/WildcardFilter.java b/src/main/java/org/olat/modules/opencast/WildcardFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf7e13ef6ffbfbda3c20fc907baa85d00ed22343
--- /dev/null
+++ b/src/main/java/org/olat/modules/opencast/WildcardFilter.java
@@ -0,0 +1,60 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.opencast;
+
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+import org.olat.core.util.StringHelper;
+
+/**
+ * 
+ * Initial date: 19 Aug 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+class WildcardFilter implements Predicate<Object> {
+	
+	private final String searchValue;
+	private final Function<Object, String> stringifier;
+	private final boolean wildcard;
+	
+	WildcardFilter(String searchValue, Function<Object, String> stringifier) {
+		this.stringifier = stringifier;
+		this.wildcard = searchValue.contains("*");
+		this.searchValue = wildcard
+				? ".*" + searchValue.toLowerCase().replaceAll("\\*", ".*") + ".*"
+				: searchValue.toLowerCase();
+	}
+
+	@Override
+	public boolean test(Object object) {
+		// No search value
+		if (!StringHelper.containsNonWhitespace(searchValue)) return true;
+			
+		String value = stringifier.apply(object);
+		if (value != null) {
+			String lowerCaseValue = value.toLowerCase();
+			return wildcard? lowerCaseValue.matches(searchValue): lowerCaseValue.indexOf(searchValue) > -1;
+		}
+		return false;
+	}
+
+}
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
index 87dc8175635f6d2878e0dbc9b57744e3a1d7dae8..823a3fb953cd79c49ef5c0d7f4efb2e966cfb8c2 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties
@@ -144,6 +144,7 @@ item.type.matchdraganddrop=Drag and Drop
 item.type.matchtruefalse=True/false
 item.type.mc=Multiple Choice
 item.type.numerical=Numerische Eingabe
+item.type.order=Reihenfolge
 item.type.sc=Single Choice
 item.type.unkown=Unbekannt
 item.type.upload=Datei hochladen
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
index 809f53f31eb896bdc0f5dd4d40a710345d3c06c9..725275af04e3457aa7dc77d7c7e2a50be5cd8d81 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
@@ -144,6 +144,7 @@ item.type.matchdraganddrop=Drag and Drop
 item.type.matchtruefalse=True/false
 item.type.mc=Multiple-Choice
 item.type.numerical=Numerical input
+item.type.order=Order
 item.type.sc=Single-Choice
 item.type.unkown=Unknown
 item.type.upload=Upload file
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
index 248d146503508f4854370e4d04b9101cf9d8b32d..864d241606f3fd969e21de40fb85b9e67c3f07f8 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_fr.properties
@@ -144,6 +144,7 @@ item.type.matchdraganddrop=Drag and Drop
 item.type.matchtruefalse=Juste/faux
 item.type.mc=Choix multiple
 item.type.numerical=Entr\u00E9e num\u00E9rique
+item.type.order=Ordre
 item.type.sc=Choix unique
 item.type.unkown=Inconnu
 item.type.upload=T\u00E9l\u00E9verser un fichier
diff --git a/src/main/java/org/olat/search/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/search/ui/_i18n/LocalStrings_de.properties
index afd74a3b2a8afef1eed0ac9728183aa4c0532cba..15404d7acc2369d1e6d9f97737e8d67f8502ebd6 100644
--- a/src/main/java/org/olat/search/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/search/ui/_i18n/LocalStrings_de.properties
@@ -77,6 +77,7 @@ type.course.node.iqtest=Kursbaustein, Test
 type.course.node.forum.message=Kursbaustein, Forum
 type.course.node.gotomeeting=Kursbaustein, GoToMeeting
 type.course.node.gta=Kursbaustein, Aufgabe
+type.course.node.info.message=Kursbaustein, Mitteilungen
 type.course.node.ll=Kursbaustein, Linkliste
 type.course.node.lti=Kursbaustein, LTI-Seite
 type.course.node.membersCourseNodeConf=Kursbaustein, Teilnehmerliste
@@ -98,6 +99,7 @@ type.course.node.projectbroker=Kursbaustein, Themenb\u00F6rse
 type.course.node.blog=Kursbaustein, Blog
 type.course.node.podcast=Kursbaustein, Podcast
 type.course.node.scorm=Kursbaustein, SCORM
+HomePage=Homepage
 HomeSite=Home
 Portfolio=Portfolio
 LibrarySite=Bibliothek
diff --git a/src/main/java/org/olat/search/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/search/ui/_i18n/LocalStrings_en.properties
index 6ecbcf32e42e28dc0f1656e75c394a35ad56a480..c9c0d9c011c9599d0c18a495932d3336165a956b 100644
--- a/src/main/java/org/olat/search/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/search/ui/_i18n/LocalStrings_en.properties
@@ -30,6 +30,7 @@ form.search.label.title=Title
 form.search.label.tooltip=Search in\: "{0}"
 Forum=Forum
 found.no.result.try.fuzzy.search=No results found; search has been modified to find similar terms.
+HomePage=Homepage
 invalid.search.query=This query is not valid.
 invalid.search.query.empty=This search query is not valid--there should not be an empty string\!
 invalid.search.query.with.wildcard=This query is too short for wildcard ('*'). Please specify your search. 
@@ -83,6 +84,7 @@ type.course.node.ep=Course element, portfolio task
 type.course.node.forum.message=Course element, forum
 type.course.node.gotomeeting=Course element, GoToMeeting
 type.course.node.gta=Course element, task
+type.course.node.info.message=Course element, info message
 type.course.node.iqself=Course element, self-test
 type.course.node.iqsurv=Course element, survey
 type.course.node.iqtest=Course element, test
diff --git a/src/main/java/org/olat/search/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/search/ui/_i18n/LocalStrings_fr.properties
index 30f4f7d23a546e118bff248be114a25c0f68586b..524520070c34d2b8b24dd6272fa173153b70fdff 100644
--- a/src/main/java/org/olat/search/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/search/ui/_i18n/LocalStrings_fr.properties
@@ -1,7 +1,6 @@
 #Mon Apr 16 21:25:19 CEST 2018
 DocumentPool=Banque de documents
 DocumentPoolSite=Banque de documents
-HomeSite=Home
 LibrarySite=Biblioth\u00E8que
 Portfolio=Portfolio
 Taxonomy=Taxonomie
@@ -33,6 +32,8 @@ form.search.label.title=Titre
 form.search.label.tooltip=Recherche dans\: "{0}"
 Forum=Forum
 found.no.result.try.fuzzy.search=Aucun r\u00E9sultat trouv\u00E9, recherche \u00E9largie sur des termes semblables
+HomePage=Page d'accueil
+HomeSite=Home
 invalid.search.query=La demande de recherche n'est pas valable.
 invalid.search.query.empty=L'entr\u00E9e pour la recherche n'est valable - ne peut pas \u00EAtre vide\!
 invalid.search.query.with.wildcard=La demande de recherche est trop courte pour le joker ('*'). Veuillez d\u00E9finir la recherche plus pr\u00E9cis\u00E9ment.
@@ -83,6 +84,7 @@ type.course.node.ep=\u00C9l\u00E9ment de cours, devoir portfolio
 type.course.node.forum.message=El\u00E9ment de cours, forum
 type.course.node.gotomeeting=El\u00E9ment de cours, GoToMeeting
 type.course.node.gta=El\u00E9ment de cours, devoir
+type.course.node.info.message=El\u00E9ment de cours, communications
 type.course.node.iqself=El\u00E9ment de cours, auto-test
 type.course.node.iqsurv=El\u00E9ment de cours, questionnaire
 type.course.node.iqtest=El\u00E9ment de cours, test
diff --git a/src/main/java/org/olat/user/propertyhandlers/GenderPropertyHandler.java b/src/main/java/org/olat/user/propertyhandlers/GenderPropertyHandler.java
index 01838c2ffa9a316ed0b2d2328ca8ef2caf7399b5..575128006fa4c2a26ed4f9d8ff326053ec009967 100644
--- a/src/main/java/org/olat/user/propertyhandlers/GenderPropertyHandler.java
+++ b/src/main/java/org/olat/user/propertyhandlers/GenderPropertyHandler.java
@@ -47,7 +47,10 @@ import org.olat.user.UserManager;
 
 public class GenderPropertyHandler extends AbstractUserPropertyHandler {
 	
-	private static final String[] keys = new String[] { "male", "female", "-" };
+	private static final String MALE = "male";
+	private static final String FEMALE = "female";
+	private static final String OTHER = "-";
+	private static final String[] keys = new String[] { MALE, FEMALE, OTHER };
 	
 	/**
 	 * Helper method to create translated values that correspond with the static keys
@@ -78,13 +81,16 @@ public class GenderPropertyHandler extends AbstractUserPropertyHandler {
 
 	@Override
 	public String getUserProperty(User user, Locale locale) {
+		String internalValue = getInternalValue(user);
+		if(!FEMALE.equals(internalValue) && !MALE.equals(internalValue) && !OTHER.equals(internalValue)) {
+			internalValue = OTHER;
+		}
 		Translator myTrans;
 		if (locale == null) {
 			myTrans = Util.createPackageTranslator(this.getClass(), I18nModule.getDefaultLocale());			
 		} else {
 			myTrans = Util.createPackageTranslator(this.getClass(), locale);
 		}
-		String internalValue = getInternalValue(user);
 		return myTrans.translate("form.name.gender." + internalValue);
 	}
 
@@ -112,7 +118,7 @@ public class GenderPropertyHandler extends AbstractUserPropertyHandler {
 	@Override
 	public FormItem addFormItem(Locale locale, User user, String usageIdentifyer, boolean isAdministrativeUser,	FormItemContainer formItemContainer) {
 		SingleSelection	genderElem = FormUIFactory.getInstance().addRadiosVertical(getName(), i18nFormElementLabelKey(), formItemContainer, keys, getTranslatedValues(locale));
-		String key = user == null ? "-" : getInternalValue(user);
+		String key = user == null ? OTHER : getInternalValue(user);
 		for(int i=keys.length; i-->0; ) {
 			if(keys[i].equals(key)) {
 				genderElem.select(keys[i], true);
@@ -132,7 +138,7 @@ public class GenderPropertyHandler extends AbstractUserPropertyHandler {
 	@Override
 	public String getInternalValue(User user) {
 		String value = super.getInternalValue(user);
-		return (StringHelper.containsNonWhitespace(value) ? value : "-"); // default		
+		return (StringHelper.containsNonWhitespace(value) ? value : OTHER); // default		
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/user/propertyhandlers/ui/UsrPropCfgTableController.java b/src/main/java/org/olat/user/propertyhandlers/ui/UsrPropCfgTableController.java
index 6471ddda91b8dd7e62c12a5d167576176097c46a..593e479d5a2c67c5e09985c4febf83c56e7679ab 100644
--- a/src/main/java/org/olat/user/propertyhandlers/ui/UsrPropCfgTableController.java
+++ b/src/main/java/org/olat/user/propertyhandlers/ui/UsrPropCfgTableController.java
@@ -138,7 +138,7 @@ public class UsrPropCfgTableController extends FormBasicController {
 		for (UserPropertyHandler handler : myHandlerList) {
 			handlerName = handler.getName();
 			// the group field
-			groupDropdown = uifactory.addDropdownSingleselect(FT_NAME_PREFIX_GRPN + handlerName, propTableFlc, selectableGroups,
+			groupDropdown = uifactory.addDropdownSingleselect(FT_NAME_PREFIX_GRPN + handlerName, null, propTableFlc, selectableGroups,
 					selectableGroups, null);
 
 			if (Arrays.asList(selectableGroups).contains(handler.getGroup())) {
@@ -162,23 +162,23 @@ public class UsrPropCfgTableController extends FormBasicController {
 
 			// the "translate" link
 			if (isPropertyHandlerTranslated(handler)) {
-				translateLink = uifactory.addFormLink(FT_NAME_PREFIX_TRANSL + handlerName, "upc.edittranslate", "label", propTableFlc, Link.LINK);
+				translateLink = uifactory.addFormLink(FT_NAME_PREFIX_TRANSL + handlerName, "upc.edittranslate", null, propTableFlc, Link.LINK);
 			} else {
-				translateLink = uifactory.addFormLink(FT_NAME_PREFIX_TRANSL + handlerName, "upc.translate", "label", propTableFlc, Link.LINK);
+				translateLink = uifactory.addFormLink(FT_NAME_PREFIX_TRANSL + handlerName, "upc.translate", null, propTableFlc, Link.LINK);
 				translateLink.setCustomEnabledLinkCSS("o_ochre");
 			}
 			translateLink.setUserObject(handler);
 
 			// the "handler-config" link
 			if (handlerConfigCtrlFactory.hasConfig(handler)) {
-				handlerLink = uifactory.addFormLink(FT_NAME_PREFIX_HDNL + handlerName, "upc.hndlconfig", "label", propTableFlc, Link.LINK);
+				handlerLink = uifactory.addFormLink(FT_NAME_PREFIX_HDNL + handlerName, "upc.hndlconfig", null, propTableFlc, Link.LINK);
 				handlerLink.setUserObject(handler);
 			}
 
 			// put the translation (in the current language) for the property
 			translatedName = I18nManager.getInstance().getLocalizedString(UserPropertyHandler.class.getPackage().getName(),
 					handler.i18nFormElementLabelKey(), null, getLocale(), true, true);
-			uifactory.addStaticTextElement(FT_NAME_PREFIX_TRANSNAME + handlerName,  (translatedName == null ? "-" : translatedName)  ,
+			uifactory.addStaticTextElement(FT_NAME_PREFIX_TRANSNAME + handlerName, null, (translatedName == null ? "-" : translatedName),
 					propTableFlc);
 		}
 		propTableFlc.contextPut("rows", myHandlerList);
diff --git a/src/test/java/org/olat/modules/opencast/WildcardFilterTest.java b/src/test/java/org/olat/modules/opencast/WildcardFilterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..18ca6af8cfd7841202c00fb7a8c0aaa79389b1e2
--- /dev/null
+++ b/src/test/java/org/olat/modules/opencast/WildcardFilterTest.java
@@ -0,0 +1,85 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.opencast;
+
+import org.assertj.core.api.SoftAssertions;
+import org.junit.Test;
+
+/**
+ * 
+ * Initial date: 19 Aug 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class WildcardFilterTest {
+	
+	@Test
+	public void shouldFilterWithoutWildcard() {
+		WildcardFilter sut = new WildcardFilter("abc", o -> (String)o);
+		
+		SoftAssertions softly = new SoftAssertions();
+		assertThat(softly, sut, "abc", true);
+		assertThat(softly, sut, "abc1", true);
+		assertThat(softly, sut, "1abc", true);
+		assertThat(softly, sut, "ABC", true);
+		assertThat(softly, sut, "Abc", true);
+		assertThat(softly, sut, "UaBc%", true);
+		assertThat(softly, sut, "a1bc", false);
+		assertThat(softly, sut, "ab2c", false);
+		softly.assertAll();
+	}
+	
+	@Test
+	public void shouldFilterWithWildcard() {
+		WildcardFilter sut = new WildcardFilter("ab*c", o -> (String)o);
+		
+		SoftAssertions softly = new SoftAssertions();
+		assertThat(softly, sut, "abc", true);
+		assertThat(softly, sut, "abc1", true);
+		assertThat(softly, sut, "1abc", true);
+		assertThat(softly, sut, "ABC", true);
+		assertThat(softly, sut, "Abc", true);
+		assertThat(softly, sut, "UaBc%", true);
+		assertThat(softly, sut, "a1bc", false);
+		assertThat(softly, sut, "ab2c", true);
+		softly.assertAll();
+	}
+	
+	@Test
+	public void shouldFilterWithWildcardOnly() {
+		WildcardFilter sut = new WildcardFilter("*", o -> (String)o);
+		
+		SoftAssertions softly = new SoftAssertions();
+		assertThat(softly, sut, "abc", true);
+		assertThat(softly, sut, "abc1", true);
+		assertThat(softly, sut, "1abc", true);
+		assertThat(softly, sut, "ABC", true);
+		assertThat(softly, sut, "Abc", true);
+		assertThat(softly, sut, "UaBc%", true);
+		assertThat(softly, sut, "a1bc", true);
+		assertThat(softly, sut, "ab2c", true);
+		softly.assertAll();
+	}
+	
+	private void assertThat(SoftAssertions softly, WildcardFilter sut, String value, boolean expected) {
+		softly.assertThat(sut.test(value)).as(value).isEqualTo(expected);
+	}
+
+}
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index b7bec76f6549bddffccac49635c789febef981e6..9dba2145156120c88c94143ba15c786f9040ffe1 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -520,6 +520,7 @@ import org.junit.runners.Suite;
 	org.olat.modules.forms.manager.RubricStatisticCalculatorTest.class,
 	org.olat.modules.forms.model.xml.ScaleTypeTest.class,
 	org.olat.modules.forms.RubricsComparisonTest.class,
+	org.olat.modules.opencast.WildcardFilterTest.class,
 	org.olat.modules.qpool.manager.QuestionPoolServiceImplTest.class,
 	org.olat.modules.qpool.manager.QuestionPoolUserDataDeletableTest.class,
 	org.olat.modules.qpool.manager.review.LowerLimitProviderTest.class,