diff --git a/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java b/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java
index 1df36fb6cac73f910804b2a522d26d71829738f6..3acb6a177f0070ff853299f0a9bd0780fc8789d8 100644
--- a/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java
+++ b/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java
@@ -141,7 +141,7 @@ public class WysiwygFactory {
 	 * @return XHTML page
 	 */
 	public static String createXHtmlFileContent(String bodyMarkup, String title) {
-		StringBuffer fileContent = new StringBuffer();
+		StringBuilder fileContent = new StringBuilder();
 		fileContent.append(HTMLEditorController.DOCTYPE).append(HTMLEditorController.OPEN_HTML).append(HTMLEditorController.OPEN_HEAD);
 		fileContent.append(HTMLEditorController.GENERATOR_META).append(HTMLEditorController.UTF8CHARSET);
 		fileContent.append(HTMLEditorController.OPEN_TITLE).append(title).append(HTMLEditorController.CLOSE_TITLE);
diff --git a/src/main/java/org/olat/core/gui/components/AbstractComponent.java b/src/main/java/org/olat/core/gui/components/AbstractComponent.java
index 45d432acfeac144a9453164b26d99a63115b2b21..e9165df8895a53b4f637ab5bd3094990900148bd 100644
--- a/src/main/java/org/olat/core/gui/components/AbstractComponent.java
+++ b/src/main/java/org/olat/core/gui/components/AbstractComponent.java
@@ -57,6 +57,7 @@ public abstract class AbstractComponent implements Component {
 	private String elementCssClass;
 
 	private long timestamp = 1l;
+	private String timestampID = "1";
 	private boolean staticCmp = true;
 	
 	private boolean visible = true;
@@ -140,7 +141,9 @@ public abstract class AbstractComponent implements Component {
 	 * @return a valid JS variableName
 	 */
 	private static String secureJSVarName(String id) {
-		if(StringUtils.isBlank(id)) return "o_"+Long.toString(CodeHelper.getRAMUniqueID());
+		if(StringUtils.isBlank(id)) {
+			return "o_" + Long.toString(CodeHelper.getRAMUniqueID());
+		}
 		id = id.replace("-", "_"); // no - 
 		id =  id.replace(".", "_"); // no dots
 		
@@ -202,12 +205,13 @@ public abstract class AbstractComponent implements Component {
 	 * (e.g. for CPComponent, so that the browser loads images correctly). only
 	 * called when the component is visible
 	 */
+	@Override
 	public void validate(UserRequest ureq, ValidationResult vr) {
 		if (this.dirty) {
 			if(!staticCmp) {
 				timestamp++;
+				timestampID = Long.toString(timestamp);
 			}
-			if ( log_.isDebug() ) log_.debug("increment component.timestamp new value=" + timestamp + " ureq=" + ureq + " component=" + this);
 		}
 	}
 	
@@ -458,7 +462,7 @@ public abstract class AbstractComponent implements Component {
 		if(staticCmp) {
 			return "1";
 		}
-		return Long.toString(timestamp);
+		return timestampID;
 	}
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java b/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java
index b9bf3c86b8406cd411f8b3b71594e43e6b05b94d..7ef17d1255c7f445e4236a9928c0de53f3f9948a 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java
@@ -88,6 +88,11 @@ public interface FormItemContainer extends FormItem, FormItemCollection {
 	 */
 	public Map<String, FormItem> getFormComponents();
 	
+	/**
+	 * @return True if the container manages this item.
+	 */
+	public boolean hasFormComponent(FormItem item);
+	
 	/**
 	 * 
 	 * @param name
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
index 4ddd5c6f48981376972b3046fc158c00fbe2c42f..140c93369f616fb189e48b61b8e43788d2aa329f 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
@@ -701,7 +701,7 @@ public class Form extends LogDelegator {
 		public boolean visit(FormItem comp, UserRequest ureq) {
 			if (comp instanceof FormItemContainer) {
 				FormItemContainer new_name = (FormItemContainer) comp;
-				if(new_name.getFormComponents().containsValue(child)){
+				if(new_name.hasFormComponent(child)){
 					parentContainer = (FormItemContainer)comp;
 					return false;
 				}
@@ -717,13 +717,13 @@ public class Form extends LogDelegator {
 		public boolean visit(FormItem comp, UserRequest ureq) {
 			if (comp instanceof FormItemContainer) {
 				FormItemContainer fic = (FormItemContainer)comp;
-				Map<String, FormItem> pairs = fic.getFormComponents();
+				Iterable<FormItem> pairs = fic.getFormItems();
 				//go to next container if no elements inside
-				if(pairs == null || pairs.size()==0) return true;
-				//otherwise iterate overall elements and evaluate dependency rules
-				Iterable<FormItem> elms= pairs.values();
-				for (FormItem item : elms) {
-					fic.evalDependencyRuleSetFor(ureq, item);
+				if(pairs != null) {
+					//otherwise iterate overall elements and evaluate dependency rules
+					for (FormItem item : pairs) {
+						fic.evalDependencyRuleSetFor(ureq, item);
+					}
 				}
 			}
 			return true;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java
index 2553dc693648a0de670caf06eff3e5f90cc813c7..111d722ce15e8904817c0172c3b4289860be6b47 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java
@@ -59,7 +59,7 @@ public abstract class FormBaseComponentImpl extends AbstractComponent implements
 	}
 	
 	public String getFormDispatchId(){		
-		return DISPPREFIX+super.getDispatchID();
+		return DISPPREFIX.concat(super.getDispatchID());
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
index adbff34c9b5ba70b39ac2c56c82611a675673d12..552784937efdd44c7d846175b95affdd6a665fbe 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
@@ -25,8 +25,6 @@
 */ 
 package org.olat.core.gui.components.form.flexible.impl;
 
-import java.util.Map;
-
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -625,8 +623,8 @@ public abstract class FormBasicController extends BasicController {
 			public void run() {
 				// Dispose also disposable form items (such as file uploads that needs to
 				// cleanup temporary files)
-				Map<String, FormItem> formItems = FormBasicController.this.flc.getFormComponents();
-				for (FormItem formItem : formItems.values()) {
+				Iterable<FormItem> formItems = FormBasicController.this.flc.getFormItems();
+				for (FormItem formItem : formItems) {
 					if (formItem instanceof Disposable) {
 						Disposable disposableFormItem = (Disposable) formItem;
 						disposableFormItem.dispose();				
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java
index 412684fefb892e0eba53d8bc700a36eb4800c5d8..8c7bc7efe2a965243e3fee44e570f561244c84e0 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java
@@ -25,8 +25,6 @@
 */
 package org.olat.core.gui.components.form.flexible.impl;
 
-import java.util.Map;
-
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.SpacerElement;
@@ -152,9 +150,7 @@ public class FormDecorator {
 	 * @return
 	 */
 	private FormItem getFormItem(String formItemName) {
-		Map<String, FormItem> comps = container.getFormComponents();
-		FormItem foco = comps.get(formItemName);
-		return foco;
+		return container.getFormComponent(formItemName);
 	}
 
 }
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java
index a67ef4fd603036a3395c871e804c5f3898adce91..91525a6b6342b9cd8376bee1ad47a7eb9addd9e4 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java
@@ -515,7 +515,7 @@ public abstract class FormItemImpl implements FormItem, InlineElement {
 			return ((FormBaseComponentIdProvider)comp).getFormDispatchId();
 		} else {
 			//do the same as the FormBaseComponentIdProvider would do
-			return DISPPREFIX+comp.getDispatchID();
+			return DISPPREFIX.concat(comp.getDispatchID());
 		}
 	}
 
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java
index b6480cfad0e4a5455cce57e79321b604ff42293a..e9df3ee88dbcec472998288d5e9bd7e27097c701 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java
@@ -345,12 +345,19 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain
 		return merged;
 	}
 
+	@Override
 	public Map<String, FormItem> getFormComponents() {
 		Map<String,FormItem> merged = new HashMap<String, FormItem>(formComponents);
 		merged.putAll(listeningOnlyFormComponents);
 		return Collections.unmodifiableMap(merged);
 	}
 
+	@Override
+	public boolean hasFormComponent(FormItem item) {
+		return formComponents.containsValue(item)
+				||  listeningOnlyFormComponents.containsValue(item);
+	}
+
 	public FormItem getFormComponent(String name){
 		if(formComponents.containsKey(name)) {
 			return formComponents.get(name);
@@ -496,9 +503,7 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain
 		//enable / disable this
 		super.setEnabled(isEnabled);
 		//iterate over all components and disable / enable them
-		Collection<FormItem> formItems = getFormComponents().values();
-		for (Iterator<FormItem> iter = formItems.iterator(); iter.hasNext();) {
-			FormItem element = iter.next();
+		for (FormItem element : getFormItems()) {
 			element.setEnabled(isEnabled);
 		}
 	}
@@ -657,16 +662,15 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain
 	 * 
 	 * @see org.olat.core.gui.control.Disposable#dispose()
 	 */
+	@Override
 	public void dispose() {
 		// Dispose also disposable form items (such as file uploads that needs to
 		// cleanup temporary files)
-		Map<String, FormItem> formItems = this.getFormComponents();
-		for (FormItem formItem : formItems.values()) {
+		for (FormItem formItem : getFormItems()) {
 			if (formItem instanceof Disposable) {
 				Disposable disposableFormItem = (Disposable) formItem;
 				disposableFormItem.dispose();
 			}
 		}
 	}
-	
 }
diff --git a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java
index 67185a79b92386db20c93e544a6d13b0bd0df47d..69ea60032ec7cc1899192a70ad4b6bac81b443ee 100644
--- a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java
+++ b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java
@@ -849,7 +849,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger {
 
 	/** toString for debug **/
 	private String convertLoggingResourceableListToString(List<ILoggingResourceable> resourceInfos) {
-		StringBuffer loggingResourceableListToString = new StringBuffer("[LoggingResourceables: ");
+		StringBuilder loggingResourceableListToString = new StringBuilder("[LoggingResourceables: ");
 		loggingResourceableListToString.append(resourceInfos.size());
 		for (Iterator<ILoggingResourceable> iterator = resourceInfos.iterator(); iterator.hasNext();) {
 			ILoggingResourceable loggingResourceable = iterator.next();
diff --git a/src/main/java/org/olat/core/util/i18n/I18nManager.java b/src/main/java/org/olat/core/util/i18n/I18nManager.java
index 733e1a4b48da18ac6df0de5a9d503bde425cd7e4..ca766fee3d3579b8a8adab3137082190965d0a40 100644
--- a/src/main/java/org/olat/core/util/i18n/I18nManager.java
+++ b/src/main/java/org/olat/core/util/i18n/I18nManager.java
@@ -139,6 +139,7 @@ public class I18nManager extends BasicManager {
 	private ConcurrentMap<String, Properties> cachedBundles = new ConcurrentHashMap<String, Properties>();
 	private ConcurrentMap<String, String> cachedJSTranslatorData = new ConcurrentHashMap<String, String>();
 	private ConcurrentMap<String, Deque<String>> referencingBundlesIndex = new ConcurrentHashMap<String, Deque<String>>();
+	private static final ConcurrentMap<Locale,String> localeToLocaleKey = new ConcurrentHashMap<>();
 	private boolean cachingEnabled = true;
 
 	private static FilenameFilter i18nFileFilter = new FilenameFilter() {
@@ -1689,26 +1690,35 @@ public class I18nManager extends BasicManager {
 	 * @return
 	 */
 	public String getLocaleKey(Locale locale) {
-		String langKey = locale.getLanguage();
-		String country = locale.getCountry();
-		// Only add country when available - in case of an overlay country is
-		// set to
-		// an empty value
-		if (StringHelper.containsNonWhitespace(country)) {
-			langKey = langKey + "_" + country;
-		}
-		String variant = locale.getVariant();
-		// Only add the _ separator if the variant contains something in
-		// addition to
-		// the overlay, otherways use the __ only
-		if (StringHelper.containsNonWhitespace(variant)) {
-			if (variant.startsWith("__" + I18nModule.getOverlayName())) {
-				langKey += variant;
-			} else {
-				langKey = langKey + "_" + variant;
+		String key = localeToLocaleKey.get(locale);
+		if(key == null) {
+			String langKey = locale.getLanguage();
+			String country = locale.getCountry();
+			// Only add country when available - in case of an overlay country is
+			// set to
+			// an empty value
+			if (StringHelper.containsNonWhitespace(country)) {
+				langKey = langKey + "_" + country;
+			}
+			String variant = locale.getVariant();
+			// Only add the _ separator if the variant contains something in
+			// addition to
+			// the overlay, otherways use the __ only
+			if (StringHelper.containsNonWhitespace(variant)) {
+				if (variant.startsWith("__" + I18nModule.getOverlayName())) {
+					langKey += variant;
+				} else {
+					langKey = langKey + "_" + variant;
+				}
+			}
+			
+			key = localeToLocaleKey.putIfAbsent(locale, langKey);
+			if(key == null) {
+				key = langKey;
 			}
+			
 		}
-		return langKey;
+		return key;
 	}
 
 	/**