diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
index 238b5876d3e5d7a25df5afc08d4e7611138fe299..811962c2184d0052527cfbe40dad4eea079ad449 100644
--- a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
+++ b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
@@ -85,7 +85,9 @@ public class InfoMessageControllerSingleVM extends BasicController {
 		infomsgEditButton = LinkFactory.createButton("infomsgEdit", infoMsgView, this);
 		infomsgClearButton = LinkFactory.createButton("infomsgClear", infoMsgView, this);
 		maintenancemsgEditButton = LinkFactory.createButton("maintenancemsgEdit", infoMsgView, this);
+		maintenancemsgEditButton.setElementCssClass("o_sel_maintenance_msg_edit");
 		maintenancemsgClearButton = LinkFactory.createButton("maintenancemsgClear", infoMsgView, this);
+		maintenancemsgClearButton.setElementCssClass("o_sel_maintenance_msg_clear");
 		
 		//login
 		String infoMsg = mrg.getInfoMessage();
diff --git a/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html b/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html
index 0de98e957b222276fe079ee9e22d3ae40f3a5177..4d123600e3153b09ccc9c159db283c33a45a9f55 100644
--- a/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html
+++ b/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html
@@ -1,10 +1,7 @@
-<div class="o_block_large">
-	<fieldset>
-		<legend>Admin.</legend>
-		<p><i>Message Admin-Token: $!admintoken</i></p>
-	</fieldset>
-</div>
-
+<fieldset>
+	<legend>Admin.</legend>
+	<p><i>Message Admin-Token: $!admintoken</i></p>
+</fieldset>
 <div class="o_block_large">
 	<fieldset>
 		<legend>$r.translate("infomsg.title")</legend>
diff --git a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html
index d644c4838a9446126d63efe4e21798ce5d3499f6..3045d2f03a0f693467ae8fecf1a2db19e38797b9 100644
--- a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html
+++ b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html
@@ -1,12 +1,13 @@
+<fieldset class="o_sel_maintenance_msg_form">
 #if ($infoEdit)
-	<h3>$r.translate("infomsgEdit")</h3>
+	<legend>$r.translate("infomsgEdit")</legend>
 	#if ($cluster)
 		$r.render("infoMsgFormCluster")
 	#else
 		$r.render("infoMsgForm")
 	#end
 #else
-	<h3>$r.translate("maintenancemsgEdit")</h3>
+	<legend>$r.translate("maintenancemsgEdit")</legend>
 	#if ($cluster)
 		$r.render("maintenanceMsgFormCluster")
 	#else
@@ -14,6 +15,7 @@
 	#end
 #end
 
-<h3>$r.translate("staticFolder")</h3>
+<h4>$r.translate("staticFolder")</h4>
 <div class="o_copy_code o_nowrap">$extlink</div>
-$r.render("staticFolder")
\ No newline at end of file
+$r.render("staticFolder")
+</fieldset>
\ No newline at end of file
diff --git a/src/test/java/org/olat/selenium/LoginTest.java b/src/test/java/org/olat/selenium/LoginTest.java
index d9b27882fe993c6868ee7cc17019566652e31e7b..1e23e2073a5e6086bcb0655ba54e542b88cd0b62 100644
--- a/src/test/java/org/olat/selenium/LoginTest.java
+++ b/src/test/java/org/olat/selenium/LoginTest.java
@@ -22,6 +22,7 @@ package org.olat.selenium;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.UUID;
 
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
@@ -33,6 +34,10 @@ import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.olat.selenium.page.LoginPage;
+import org.olat.selenium.page.NavigationPage;
+import org.olat.selenium.page.Participant;
+import org.olat.selenium.page.Student;
+import org.olat.selenium.page.core.AdministrationMessagesPage;
 import org.olat.test.ArquillianDeployments;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
@@ -103,4 +108,61 @@ public class LoginTest {
 		//login
 		loginPage.loginAs(user.getLogin(), user.getPassword());
 	}
+	
+	/**
+	 * An administrator set a maintenance message. A first user
+	 * logs in before and wait until the message appears. A second
+	 * user load the login page, check that the message is visible,
+	 * logs in and check that the message is visible too.
+	 * 
+	 * 
+	 * @param loginPage
+	 * @param reiBrowser
+	 * @param kanuBrowser
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void maintenanceMessage(@InitialPage LoginPage loginPage, 
+			@Drone @Participant WebDriver reiBrowser,
+			@Drone @Student WebDriver kanuBrowser)
+	throws IOException, URISyntaxException {
+		UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei");
+		UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
+		
+		//a first user log in
+		LoginPage kanuLogin = LoginPage.getLoginPage(kanuBrowser, deploymentUrl)
+			.loginAs(kanu)
+			.resume();
+		
+		// administrator come in, and set a maintenance message
+		loginPage
+			.assertOnLoginPage()
+			.loginAs("administrator", "openolat");
+		
+		String message = "Hello - " + UUID.randomUUID();
+		AdministrationMessagesPage messagesPage = new NavigationPage(browser)
+			.openAdministration()
+			.selectInfoMessages()
+			.newMaintenanceMessage(message);
+		
+		//A new user see the login page 	
+		LoginPage.getLoginPage(reiBrowser, deploymentUrl)
+			.waitOnMaintenanceMessage(message)
+			.loginAs(rei)
+			.resume()
+			.assertOnMaintenanceMessage(message);
+		
+		kanuLogin
+			.waitOnMaintenanceMessage(message);
+		
+		//administrator remove the message
+		messagesPage
+			.clearMaintenanceMessage();
+		
+		//we wait it disappears
+		kanuLogin
+			.waitOnMaintenanceMessageCleared();
+	}
 }
diff --git a/src/test/java/org/olat/selenium/page/LoginPage.java b/src/test/java/org/olat/selenium/page/LoginPage.java
index fa61508fba1364f6eb093c01c0a129953ad87851..57941387ce8257d9994a770f03188b772ac49760 100644
--- a/src/test/java/org/olat/selenium/page/LoginPage.java
+++ b/src/test/java/org/olat/selenium/page/LoginPage.java
@@ -56,6 +56,8 @@ public class LoginPage {
 	public static final By resumeButton = By.className("o_sel_resume_yes");	
 	public static final By usernameFooterBy = By.id("o_username");
 	
+	public static final By maintenanceMessageBy = By.cssSelector("#o_msg_sticky p");
+	
 	@Drone
 	private WebDriver browser;
 	
@@ -87,6 +89,23 @@ public class LoginPage {
 		Assert.assertTrue(name.contains(lastName));
 	}
 	
+	public LoginPage assertOnMaintenanceMessage(String text) {
+		WebElement messageEl = browser.findElement(maintenanceMessageBy);
+		String message = messageEl.getText();
+		Assert.assertTrue(message.contains(text));
+		return this;
+	}
+	
+	public LoginPage waitOnMaintenanceMessage(String text) {
+		OOGraphene.waitElement(maintenanceMessageBy, 10, browser);
+		return assertOnMaintenanceMessage(text);
+	}
+	
+	public LoginPage waitOnMaintenanceMessageCleared() {
+		OOGraphene.waitElementDisappears(maintenanceMessageBy, 10, browser);
+		return this;
+	}
+	
 	/**
 	 * Login and accept the disclaimer if there is one.
 	 * 
diff --git a/src/test/java/org/olat/selenium/page/core/AdministrationMessagesPage.java b/src/test/java/org/olat/selenium/page/core/AdministrationMessagesPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..64b34df7ed73d59be0a0cda5ae7684da98567cac
--- /dev/null
+++ b/src/test/java/org/olat/selenium/page/core/AdministrationMessagesPage.java
@@ -0,0 +1,61 @@
+/**
+ * <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.selenium.page.core;
+
+import org.olat.selenium.page.graphene.OOGraphene;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * 
+ * Initial date: 22.07.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class AdministrationMessagesPage {
+
+	private final WebDriver browser;
+	
+	public AdministrationMessagesPage(WebDriver browser) {
+		this.browser = browser;
+	}
+	
+	public AdministrationMessagesPage newMaintenanceMessage(String text) {
+		By newMessageButtonBy = By.cssSelector("a.o_sel_maintenance_msg_edit");
+		browser.findElement(newMessageButtonBy).click();
+		OOGraphene.waitBusy(browser);
+		
+		OOGraphene.tinymce(text, browser);
+		
+		By saveBy = By.cssSelector(".o_sel_maintenance_msg_form button.btn-primary");
+		browser.findElement(saveBy).click();
+		OOGraphene.waitBusy(browser);
+		OOGraphene.waitAndCloseBlueMessageWindow(browser);
+		return this;
+	}
+	
+	public AdministrationMessagesPage clearMaintenanceMessage() {
+		By clearBy = By.cssSelector("a.o_sel_maintenance_msg_clear");
+		browser.findElement(clearBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/page/core/AdministrationPage.java b/src/test/java/org/olat/selenium/page/core/AdministrationPage.java
index 91ab42dde4e35f46c9f77a545b497bf516ccc73c..e93ded84fdd8dcf2c2b1f6226956fa8e80cedc2e 100644
--- a/src/test/java/org/olat/selenium/page/core/AdministrationPage.java
+++ b/src/test/java/org/olat/selenium/page/core/AdministrationPage.java
@@ -21,7 +21,6 @@ package org.olat.selenium.page.core;
 
 import java.util.List;
 
-import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.junit.Assert;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.openqa.selenium.By;
@@ -36,25 +35,32 @@ import org.openqa.selenium.WebElement;
  *
  */
 public class AdministrationPage {
-	
-	//private static final By 
-	
-	@Drone
-	private WebDriver browser;
-	
-	public AdministrationPage() {
-		//
-	}
+
+	private final WebDriver browser;
 
 	public AdministrationPage(WebDriver browser) {
 		this.browser = browser;
 	}
 	
-	public AdministrationPage clearCache(String cacheName) {
-		//system tree node
-		WebElement systemLink = browser.findElement(By.xpath("//div[contains(@class,'o_tree')]//a[contains(@href,'systemParent/')]"));
-		systemLink.click();
+	public AdministrationMessagesPage selectInfoMessages() {
+		this.selectSystemInfo();
+		
+		By messagesBy = By.cssSelector(".o_sel_sysinfo span.o_tree_level_label_leaf>a");
+		browser.findElement(messagesBy).click();
 		OOGraphene.waitBusy(browser);
+		return new AdministrationMessagesPage(browser);
+	}
+	
+	public AdministrationPage selectSystemInfo() {
+		By systemLinkby = By.xpath("//div[contains(@class,'o_tree')]//a[contains(@href,'systemParent/')]");
+		browser.findElement(systemLinkby).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public AdministrationPage clearCache(String cacheName) {
+		selectSystemInfo();
+		
 		//cache tree node
 		WebElement cacheLink = browser.findElement(By.cssSelector(".o_sel_caches span.o_tree_level_label_leaf>a"));
 		cacheLink.click();
diff --git a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java
index 2a1d2814bb34b4e52a2cbfa6c2360b59d3a68597..39d1fdfb1ab749c9c35f7e11a704b5190d9efca1 100644
--- a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java
+++ b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java
@@ -59,6 +59,11 @@ public class OOGraphene {
 			.pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until().element(element).is().visible();
 	}
 	
+	public static void waitElementDisappears(By element, int timeoutInSeconds, WebDriver browser) {
+		Graphene.waitModel(browser).withTimeout(timeoutInSeconds, TimeUnit.SECONDS)
+			.pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until().element(element).is().not().present();
+	}
+	
 	public static void waitElement(WebElement element, WebDriver browser) {
 		Graphene.waitModel(browser).pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until().element(element).is().visible();
 	}