diff --git a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java
index b350a65781f26cd54271b866f1c1edc1396d7f83..3db93ca28da25fd2af378bdf91c9e0cad31c8e19 100644
--- a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java
+++ b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java
@@ -226,9 +226,13 @@ public class InfoDisplayController extends FormBasicController {
 	}
 	
 	private InfoMessageForDisplay createInfoMessageForDisplay(InfoMessage info) {
-		String message = "";
-		if(StringHelper.containsNonWhitespace(info.getMessage())) {
+		String message = info.getMessage();
+		boolean html = StringHelper.isHtml(message);
+		if(html) {
+			message = message.toString();
+		} else if(StringHelper.containsNonWhitespace(message)) {
 			message = Formatter.escWithBR(info.getMessage()).toString();
+			message =	Formatter.formatURLsAsLinks(message);
 		}
 		
 		Formatter formatter = Formatter.getInstance(getLocale());
diff --git a/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java b/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java
index d1e03bdfbece4d4f137e123a91c2a166fa50918e..c1eee0815014b04ae7a2c07003ae4499203252b8 100644
--- a/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java
+++ b/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java
@@ -22,6 +22,7 @@ package org.olat.commons.info.ui;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
@@ -41,7 +42,7 @@ import org.olat.core.util.StringHelper;
 public class InfoEditFormController extends FormBasicController {
 
 	private TextElement title;
-	private TextElement message;
+	private RichTextElement message;
 	
 	public InfoEditFormController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
@@ -59,7 +60,12 @@ public class InfoEditFormController extends FormBasicController {
 		
 		title = uifactory.addTextElement("info_title", "edit.info_title", 512, "", formLayout);
 		title.setMandatory(true);
-		message = uifactory.addTextAreaElement("edit.info_message", 6, 80, "", formLayout);
+		//message = uifactory.addTextAreaElement("edit.info_message", 6, 80, "", formLayout);
+		//message.setMandatory(true);
+		//message.setMaxLength(2000);
+		
+		message = uifactory.addRichTextElementForStringDataMinimalistic("edit.info_message", "edit.info_message", "", 6, 80, false,
+				formLayout, ureq.getUserSession(), getWindowControl());
 		message.setMandatory(true);
 		message.setMaxLength(2000);
 	}
diff --git a/src/main/java/org/olat/commons/info/ui/_content/display.html b/src/main/java/org/olat/commons/info/ui/_content/display.html
index c3cd0fa6be5ff52aa6cb017e14d4fcd4d836855c..88a126ec61a43d47bfd0f366b8ca1e7714ff0969 100644
--- a/src/main/java/org/olat/commons/info/ui/_content/display.html
+++ b/src/main/java/org/olat/commons/info/ui/_content/display.html
@@ -25,7 +25,7 @@
 			<p class="o_item_info">$info.getInfos()#if($info.isModified()), <span class="o_item_info_mod">$info.getModifier()</span>#end</p>
 			<p></p>
 			#if($info.getMessage())
-				<p>$r.formatURLsAsLinks($info.getMessage())</p>
+				<p>$info.getMessage()</p>
 			#end
 		</div>
 	#end
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
index 8ac6a0a41edae57247ea014621353009215b615a..5a784e41d1a7d08362d04828546de3389d3a9641 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.StringTokenizer;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel;
@@ -1523,6 +1524,10 @@ public class RichTextConfiguration implements Disposable {
 		plugins4.remove("advlink");
 		plugins4.remove("xhtmlxtras");
 		plugins4.remove("advimage");
+		if(plugins4.contains("visualchars")) {
+			plugins4.remove("visualchars");
+			plugins4.add("charmap");
+		}
 		if(plugins4.remove("-olatmatheditor")) {
 			plugins4.add("olatmatheditor");
 		}
@@ -1544,37 +1549,80 @@ public class RichTextConfiguration implements Disposable {
 		if(theme_advanced_buttons3.contains(CODE_BUTTON)) {
 			plugins4.add("code");
 		}
+		
+		if(theme_advanced_buttons1.contains("forecolor,backcolor") || theme_advanced_buttons1.contains("bakcolor")) {
+			plugins4.add("textcolor");
+		}
+	
+		
+		List<String> menubar = new ArrayList<String>();
+		//if(theme_advanced_buttons3.contains("tablecontrols")) menubar.add("table");
+		//if(theme_advanced_buttons3.contains("code"))          menubar.add("tools");
+		
+		List<String> buttons1 = new ArrayList<String>(theme_advanced_buttons1);
+		if(buttons1.contains("justifyleft")) buttons1.set(buttons1.indexOf("justifyleft"), "alignleft");
+		if(buttons1.contains("justifycenter")) buttons1.set(buttons1.indexOf("justifycenter"), "aligncenter");
+		if(buttons1.contains("justifyright")) buttons1.set(buttons1.indexOf("justifyright"), "alignright");
+		if(buttons1.contains("justifyfull")) buttons1.set(buttons1.indexOf("justifyfull"), "alignjustify");
+		if(buttons1.contains(JUSTIFY_BUTTONGROUP)) {
+			int index = buttons1.indexOf(JUSTIFY_BUTTONGROUP);
+			buttons1.remove(index);
+			buttons1.add(index, "alignleft");
+			buttons1.add(index, "aligncenter");
+			buttons1.add(index, "alignright");
+			buttons1.add(index, "alignjustify");
+		}
 
-		int i = appendValuesFromList(sb, PLUGINS, plugins4);
-		// Add toolbars
-		sb.append(",\n");
-		sb.append("menubar:false,\n");
-		sb.append("image_advtab:true,\n");
+		List<String> buttons2 = new ArrayList<String>(theme_advanced_buttons2);
+		List<String> buttons3 = new ArrayList<String>(theme_advanced_buttons3);
+		if(buttons3.contains("visualchars")) buttons3.set(buttons3.indexOf("visualchars"), "charmap");
+		if(buttons3.contains("tablecontrols")) buttons3.set(buttons3.indexOf("tablecontrols"), "table");
+		buttons3.remove("cleanup");
+		
+		System.out.println("Plugins: " + plugins);
+		System.out.println("Buttons 1: " + theme_advanced_buttons1);
+		System.out.println("Buttons 1n: " +buttons1);
+		System.out.println("Buttons 2: " + theme_advanced_buttons2);
+		System.out.println("Buttons 2n: " + buttons2);
+		System.out.println("Buttons 3: " + theme_advanced_buttons3);
+		System.out.println("Buttons 3n: " + buttons3);
 
-		if (theme_advanced_buttons1.size() == 0) {
-			sb.append(THEME_ADVANCED_BUTTONS1).append(":\"\"");
+		appendValuesFromList(sb, PLUGINS, plugins4);
+		sb.append(",\n")
+		  .append("image_advtab:true,\n")
+		  .append("statusbar:true,\n");
+		
+		//menubar
+		if(menubar.isEmpty()) {
+			sb.append("menubar:false,\n");
 		} else {
-			i += appendValuesFromList(sb, "toolbar1", theme_advanced_buttons1);			
+			listToString(sb, "menubar", menubar);	
+			sb.append(",\n");
 		}
 		
-		List<String> buttons2 = new ArrayList<String>(theme_advanced_buttons2);
-		buttons2.add("inserttable");
-		if (i > 0) sb.append(",");			
+		//toolbar 1
+		if (buttons1.size() == 0) {
+			sb.append("toolbar1").append(":false,\n");
+		} else {
+			listToString(sb, "toolbar1", buttons1);
+			sb.append(",\n");	
+		}
+
 		if (buttons2.size() == 0) {
-			sb.append(THEME_ADVANCED_BUTTONS2).append(":\"\"");
+			sb.append("toolbar2").append(": false,\n");
 		} else {
-			i += appendValuesFromList(sb, "toolbar2", buttons2);			
+			listToString(sb, "toolbar2", buttons2);
+			sb.append(",\n");	
 		}
-		if (i > 0) sb.append(",");	
-		List<String> buttons3 = new ArrayList<String>(theme_advanced_buttons3);
+
 		if (buttons3.size() == 0) {
-			sb.append(THEME_ADVANCED_BUTTONS3).append(":\"\"");			
+			sb.append("toolbar3").append(":false,\n");			
 		} else {
-			i += appendValuesFromList(sb, "toolbar3", buttons3);						
+			listToString(sb, "toolbar3", buttons3);
+			sb.append(",\n");							
 		}
-		// Now add disabled buttons
-		if (i > 0 && theme_advanced_disable.size() > 0) sb.append(",");
-		i += appendValuesFromList(sb, THEME_ADVANCED_DISABLE, theme_advanced_disable);
+		
+
 		// Now add the quoted values
 		Map<String,String> copyValues = new HashMap<String,String>(quotedConfigValues);
 		//remove unused configurations in 4
@@ -1586,23 +1634,20 @@ public class RichTextConfiguration implements Disposable {
 		copyValues.remove("theme_advanced_resize_horizontal");
 		copyValues.remove("theme_advanced_resizing");
 		copyValues.remove("theme_advanced_toolbar_align");
+		copyValues.remove("theme_advanced_link_targets");
 		copyValues.remove("dialog_type");
 		copyValues.remove("mode");
 		copyValues.remove("elements");
-		
-		
 		//update value from 3 to 4
 		String tabfocus = copyValues.remove("tab_focus");
 		if(tabfocus != null) {
 			copyValues.put("tabfocus_elements", tabfocus);
 		}
-		
 		for (Map.Entry<String, String> entry : copyValues.entrySet()) {
-			if (i > 0) sb.append(",");
-			sb.append(entry.getKey()).append(": \"").append(entry.getValue()).append("\"\n");
-			i++;
+			sb.append(entry.getKey()).append(": \"").append(entry.getValue()).append("\",\n");
 		}
-
+		
+		// Now add the non-quoted values (e.g. true, false or functions)
 		Map<String,String> copyNonValues = new HashMap<String,String>(nonQuotedConfigValues);
 		copyNonValues.remove("theme_advanced_resizing");
 		copyNonValues.remove("theme_advanced_resize_horizontal");
@@ -1610,36 +1655,30 @@ public class RichTextConfiguration implements Disposable {
 		if(converter != null) {
 			copyNonValues.put("convert_urls", converter);	
 		}
-		
-		// Now add the non-quoted values (e.g. true, false or functions)
  		for (Map.Entry<String, String> entry : copyNonValues.entrySet()) {
-			if (i > 0) sb.append(",");
-			sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
-			i++;
+			sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(",\n");
 		}
- 		
- 		// Now add on init callback functions
- 		/*if (oninit.size() > 0) {
- 			if (i > 0) sb.append(",");
- 			sb.append(ONINIT_CALLBACK).append(": ");
- 			if (oninit.size() == 1) {
- 				sb.append(oninit.iterator().next());
- 			} else {
- 				Iterator<String> iter = oninit.iterator();
- 				sb.append("function(){");
- 				while (iter.hasNext()) {
-					String function = iter.next();
-					sb.append(function);
-					if(function.endsWith(")")) {
-						sb.append(";");
-					} else {
-						sb.append("();");
-					}
+
+ 		System.out.println("Quoted: " + quotedConfigValues);
+ 		System.out.println("Non quoted: " + copyNonValues);
+	}
+	
+	
+	private int listToString(StringOutput sb, String key, List<String> values) {
+		if (values.size() == 0) return 0;
+		sb.append(key).append(": \"");
+		for (String value : values) {
+			for(StringTokenizer tokenizer=new StringTokenizer(value,","); tokenizer.hasMoreTokens(); ) {
+				String token = tokenizer.nextToken();
+				if("separator".equals(token)) {
+					sb.append(" | ");
+				} else {
+					sb.append(token).append(" ");
 				}
- 				sb.append("}");
- 			}
- 			i++;
- 		}*/
+			}
+		}
+		sb.append("\"");
+		return 1;
 	}
 
 	/**
diff --git a/src/main/java/org/olat/core/util/StringHelper.java b/src/main/java/org/olat/core/util/StringHelper.java
index a175824cdd56d9d037efed4119f82658ca7ca402..a9a2e101d33874f886f0cf170e1ec9170265615c 100644
--- a/src/main/java/org/olat/core/util/StringHelper.java
+++ b/src/main/java/org/olat/core/util/StringHelper.java
@@ -282,6 +282,12 @@ public class StringHelper {
 		// contain non-whitespace
 		return !matcher.find();
 	}
+	
+	public static boolean isHtml(String s) {
+		if (s == null) return false;
+
+		return s.contains("<html") || s.contains("<body") || s.contains("<p") || s.contains("<span");
+	}
 
 	/**
 	 * takes an array of Identies and converts them to a String containing the
diff --git a/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql b/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql
index d20bd44fcbf4f3d04a21bcb56ae34577845dfab0..173f5b04dba619a5d110017667f8fb9e8485e4a8 100644
--- a/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql
+++ b/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql
@@ -1,3 +1,6 @@
 -- salted password
 alter table o_bs_authentication add column salt varchar(255) default null;
 alter table o_bs_authentication add column hashalgorithm varchar(16) default null;
+
+
+alter table o_info_message modify message longtext;
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 34163159a3676bc8a909cdbb36761ce7c9b73122..52141169ef6dbc42ff72955b6ef7221cf4e1e66d 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -688,7 +688,7 @@ create table if not exists o_info_message (
   creationdate datetime,
   modificationdate datetime,
   title varchar(2048),
-  message varchar(2048),
+  message longtext,
   resname varchar(50) NOT NULL,
   resid bigint NOT NULL,
   ressubpath varchar(2048),
diff --git a/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql b/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql
index 3df574818a9baf40033195d1a031a9bd21e65360..7b57583fcd957260a8b300a0bc5ed22989bc1dc8 100644
--- a/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql
+++ b/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql
@@ -1,3 +1,5 @@
 -- salted password
 alter table o_bs_authentication add (salt varchar(255));
 alter table o_bs_authentication add (hashalgorithm varchar(16));
+
+
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index db0de6b77b66c472ccf23715a6cab12bd523c08a..78e9f7a8543a5d83de25f8760887d1dbd2200aaf 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -623,7 +623,7 @@ CREATE TABLE o_info_message (
   creationdate date,
   modificationdate date,
   title varchar2(2048 char),
-  message varchar2(2048 char),
+  message clob,
   resname varchar(50 char) NOT NULL,
   resid number(20) NOT NULL,
   ressubpath varchar2(2048 char),
diff --git a/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql b/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql
index d20bd44fcbf4f3d04a21bcb56ae34577845dfab0..1895a20d8a5310cee583faeedcbee5fcaa1280b0 100644
--- a/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql
+++ b/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql
@@ -1,3 +1,15 @@
 -- salted password
 alter table o_bs_authentication add column salt varchar(255) default null;
 alter table o_bs_authentication add column hashalgorithm varchar(16) default null;
+
+
+alter table o_info_message add message_copy varchar2(4000);
+update o_info_message set message_copy = message;
+Commit;
+update o_info_message set message = null;
+commit;
+alter table o_info_message modify message long;
+alter table o_info_message modify message clob;
+update o_info_message set message = message_copy;
+Commit;
+alter table o_info_message drop column message_copy;
\ No newline at end of file
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 23f1872ffd5ddf0ff9eae715a946ac6b898dd6aa..bebe83d400370e2da10a86f2e0ac37149f0e966c 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -532,7 +532,7 @@ create table o_info_message (
   creationdate timestamp,
   modificationdate timestamp,
   title varchar(2048),
-  message varchar(2048),
+  message text,
   resname varchar(50) NOT NULL,
   resid int8 NOT NULL,
   ressubpath varchar(2048),