diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java
index 435e6a37bd88b8e28f78d23ca6355adfd7e81a2b..1a2393f8109982e1c37a891f438a81863f08d235 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java
@@ -114,6 +114,7 @@ public class CourseReminderEditController extends FormBasicController {
 		
 		String desc = reminder.getDescription();
 		descriptionEl = uifactory.addTextElement("reminder.description", "reminder.description", 128, desc, generalCont);
+		descriptionEl.setElementCssClass("o_sel_course_reminder_desc");
 		
 		String sendTime = getSendTimeDescription();
 		uifactory.addStaticTextElement("send.time.description.label", sendTime, generalCont);
@@ -199,8 +200,10 @@ public class CourseReminderEditController extends FormBasicController {
 		
 		FormLink addRuleButton = uifactory.addFormLink("add.rule.".concat(id), "add", "add.rule", null, rulesCont, Link.BUTTON);
 		addRuleButton.setIconLeftCSS("o_icon o_icon-fw o_icon_add");
+		addRuleButton.setElementCssClass("o_sel_course_add_rule");
 		FormLink deleteRuleButton = uifactory.addFormLink("delete.rule.".concat(id), "delete", "delete.rule", null, rulesCont, Link.BUTTON);
 		deleteRuleButton.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item");
+		deleteRuleButton.setElementCssClass("o_sel_course_delete_rule");
 		
 		RuleEditorFragment editor = ruleSpi.getEditorFragment(rule, entry);
 		FormItem customItem = editor.initForm(rulesCont, this, ureq);
diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java
index 4be65d314f5a831d057c8b0b4ca31664b91ba990..c122e8bf8e41b62cdfaea488873c54f7324c2e45 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderListController.java
@@ -101,8 +101,11 @@ public class CourseReminderListController extends FormBasicController implements
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		formLayout.setElementCssClass("o_sel_course_reminder_list");
+		
 		addButton = uifactory.addFormLink("add.reminder", formLayout, Link.BUTTON);
 		addButton.setIconLeftCSS("o_icon o_icon_add");
+		addButton.setElementCssClass("o_sel_add_course_reminder");
 		
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, ReminderCols.id.i18nKey(), ReminderCols.id.ordinal(),
@@ -131,6 +134,7 @@ public class CourseReminderListController extends FormBasicController implements
 			
 			FormLink toolsLink = uifactory.addFormLink("tools_" + counter.incrementAndGet(), "tools", "", null, null, Link.NONTRANSLATED);
 			toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg");
+			toolsLink.setElementCssClass("o_sel_course_reminder_tools");
 			toolsLink.setTitle(translate("tools"));
 
 			ReminderRow row = new ReminderRow(reminder, toolsLink);
@@ -300,21 +304,24 @@ public class CourseReminderListController extends FormBasicController implements
 			mainVC = createVelocityContainer("tools");
 			List<String> links = new ArrayList<>();
 
-			addLink("edit", "edit", "o_icon o_icon-fw o_icon_edit", links);
-			addLink("duplicate", "duplicate", "o_icon o_icon-fw o_icon_copy", links);
-			addLink("send", "send", "o_icon o_icon-fw o_icon_send", links);
-			addLink("show.sent", "show.sent", "o_icon o_icon-fw o_icon_show_send", links);
-			addLink("delete", "delete", "o_icon o_icon-fw o_icon_delete_item", links);
+			addLink("edit", "edit", "o_icon o_icon-fw o_icon_edit", links, "o_sel_course_reminder_edit");
+			addLink("duplicate", "duplicate", "o_icon o_icon-fw o_icon_copy", links, "o_sel_course_reminder_duplicate");
+			addLink("send", "send", "o_icon o_icon-fw o_icon_send", links, "o_sel_course_reminder_send");
+			addLink("show.sent", "show.sent", "o_icon o_icon-fw o_icon_show_send", links, "o_sel_course_reminder_showsent");
+			addLink("delete", "delete", "o_icon o_icon-fw o_icon_delete_item", links, "o_sel_course_reminder_delete");
 
 			mainVC.contextPut("links", links);
 			putInitialPanel(mainVC);
 		}
 		
-		private void addLink(String name, String cmd, String iconCSS, List<String> links) {
+		private void addLink(String name, String cmd, String iconCSS, List<String> links, String elementCssClass) {
 			Link link = LinkFactory.createLink(name, cmd, getTranslator(), mainVC, this, Link.LINK);
 			if(iconCSS != null) {
 				link.setIconLeftCSS(iconCSS);
 			}
+			if(elementCssClass != null) {
+				link.setElementCssClass(elementCssClass);
+			}
 			mainVC.put(name, link);
 			links.add(name);
 		}
diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java
index 678d0276c6a6d9436b8660b0a531f42b4f504116..0f8c9b539ae3d215ecc02fd5d1f3221c265392fb 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java
@@ -142,6 +142,7 @@ public class CourseReminderLogsController extends FormBasicController {
 		
 		tableModel = new CourseSendReminderTableModel(columnsModel);
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
+		tableEl.setElementCssClass("o_sel_course_sent_reminder_log_list");
 		updateModel();
 	}
 	
diff --git a/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java b/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java
index 321bb90796777d752e13799d28d2fae84748b217..dea834217fa6aefc7a4056cb3e867a48d11720da 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseRemindersController.java
@@ -71,8 +71,10 @@ public class CourseRemindersController extends BasicController implements Activa
 		
 		segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this);
 		remindersLink = LinkFactory.createLink("reminders", mainVC, this);
+		remindersLink.setElementCssClass("o_sel_course_reminder_list_segment");
 		segmentView.addSegment(remindersLink, true);
 		logsLink = LinkFactory.createLink("logs", mainVC, this);
+		logsLink.setElementCssClass("o_sel_course_reminder_log_segment");
 		segmentView.addSegment(logsLink, false);
 		
 		doOpenRemindersConfiguration(ureq);
diff --git a/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java b/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java
index ce3e9423efcf8d73663850256c34820551d54d2c..b54d9c1d343e3db9f19dff12d43fbf6af659c228 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java
@@ -130,6 +130,7 @@ public class CourseSendReminderListController extends FormBasicController {
 		
 		tableModel = new CourseSendReminderTableModel(columnsModel);
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
+		tableEl.setElementCssClass("o_sel_course_sent_reminder_list");
 		updateModel();
 	}
 	
diff --git a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html
index f99d5eb4b3c6b740bffe2bbda22a3cdbfa7c8776..6775c89500b2c23d50ed7f4506e7b673104a5bad 100644
--- a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html
+++ b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules.html
@@ -1,7 +1,7 @@
 <div class="o_block_large">
 	<p>$r.translate("rules.description")</p>
 	#foreach($rule in $rules)
-	<div class="o_reminder_rule row">
+	<div class="o_reminder_rule row o_sel_row-$velocityCount">
 		<div class="col-md-4">$r.render($rule.typeComponentName)</div>
 		<div class="col-md-6">
 			$r.render($rule.customItemName)
diff --git a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html
index 8c7c295ee00c713da68de7fc7a2cf4a38bce9dab..b97f9f8bb09a1b217a9e5c910c375e72d35df34f 100644
--- a/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html
+++ b/src/main/java/org/olat/course/reminder/ui/_content/edit_rules_buttons.html
@@ -1,4 +1,4 @@
-<div class="o_block o_button_group">
+<div class="o_block o_button_group o_sel_course_reminder_config_buttons">
 	$r.render("save")
 	$r.render("cancel")
 </div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index 77475fc251dca1e1ce1b56aafc33f26b192299e5..c58980fe134e744695a8111f2a5824d419187f7e 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -493,7 +493,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			
 			if(reminderModule.isEnabled()) {
 				reminderLink = LinkFactory.createToolLink("reminders.cmd", translate("command.options.reminders"), this, "o_icon_reminder");
-				reminderLink.setElementCssClass("o_sel_course_options_certificates");
+				reminderLink.setElementCssClass("o_sel_course_reminders");
 				settings.addComponent(reminderLink);
 			}
 		}
diff --git a/src/main/java/org/olat/repository/_content/cycle_dates.html b/src/main/java/org/olat/repository/_content/cycle_dates.html
index aa1f98e01664d1b76652b8decc2ed4cfa2d514f6..bb817259e3a7e34c7cb1e2da266a456ee5a50af8 100644
--- a/src/main/java/org/olat/repository/_content/cycle_dates.html
+++ b/src/main/java/org/olat/repository/_content/cycle_dates.html
@@ -1,6 +1,6 @@
 <div class="o_date form-inline">
 	<span class="form-control-static">$r.translate("cif.date.start")</span>
-	<div class="form-group">$r.render("date.start")</div>
+	<div class="form-group o_sel_repo_lifecycle_validfrom">$r.render("date.start")</div>
 	<span class="form-control-static">$r.translate("cif.date.end")</span>
-	<div class="form-group">$r.render("date.end")</div>
+	<div class="form-group o_sel_repo_lifecycle_validto">$r.render("date.end")</div>
 </div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java
index 0d86deabf5101068b877d652715df38c341ae6bc..6d0b67eb05e60dcb4d5364b23923ed2acf6c94d8 100644
--- a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java
+++ b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java
@@ -53,7 +53,6 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
-import org.olat.core.util.i18n.I18nManager;
 import org.olat.core.util.vfs.LocalFileImpl;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
@@ -106,8 +105,6 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 	
 	private static final String[] dateKeys = new String[]{ "none", "private", "public"};
 
-	@Autowired
-	private I18nManager i18nmanager;
 	@Autowired
 	private UserManager userManager;
 	@Autowired
@@ -217,6 +214,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 					translate("cif.dates.public")	
 			};
 			dateTypesEl = uifactory.addRadiosVertical("cif.dates", descCont, dateKeys, dateValues);
+			dateTypesEl.setElementCssClass("o_sel_repo_lifecycle_type");
 			if(repositoryEntry.getLifecycle() == null) {
 				dateTypesEl.select("none", true);
 			} else if(repositoryEntry.getLifecycle().isPrivateCycle()) {
@@ -253,7 +251,9 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 			descCont.add("private.date", privateDatesCont);
 			
 			startDateEl = uifactory.addDateChooser("date.start", "cif.date.start", null, privateDatesCont);
+			startDateEl.setElementCssClass("o_sel_repo_lifecycle_validfrom");
 			endDateEl = uifactory.addDateChooser("date.end", "cif.date.end", null, privateDatesCont);
+			endDateEl.setElementCssClass("o_sel_repo_lifecycle_validto");
 			
 			if(repositoryEntry.getLifecycle() != null) {
 				RepositoryEntryLifecycle lifecycle = repositoryEntry.getLifecycle();
diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java
index 7bbe0b63396b0d532feb6b27a44638feb0cfd346..1ec30ac526332c93a19c1e5a507ea8b1c5dd9414 100644
--- a/src/test/java/org/olat/selenium/CourseTest.java
+++ b/src/test/java/org/olat/selenium/CourseTest.java
@@ -22,7 +22,10 @@ package org.olat.selenium;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 import java.util.UUID;
 
 import org.jboss.arquillian.container.test.api.Deployment;
@@ -47,6 +50,7 @@ import org.olat.selenium.page.course.CoursePageFragment;
 import org.olat.selenium.page.course.CourseWizardPage;
 import org.olat.selenium.page.course.InfoMessageCEPage;
 import org.olat.selenium.page.course.PublisherPageFragment;
+import org.olat.selenium.page.course.RemindersPage;
 import org.olat.selenium.page.course.PublisherPageFragment.Access;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.olat.selenium.page.repository.AuthoringEnvPage;
@@ -910,4 +914,96 @@ public class CourseTest {
 			.members()
 			.assertFirstNameInList(ryomou);
 	}
+	
+	/**
+	 * An author create a course, set a start and end date for life-cycle.
+	 * It add a participant to the course. It creates a reminder
+	 * with a rule to catch only participant, an other to send
+	 * the reminder after the start of the course. It sends the reminder
+	 * manually, checks the reminders send, checks the log.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void courseReminders(@InitialPage LoginPage loginPage)
+	throws IOException, URISyntaxException {
+		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		loginPage.loginAs(author.getLogin(), author.getPassword());
+		UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
+		
+		//go to authoring
+		AuthoringEnvPage authoringEnv = navBar
+			.assertOnNavigationPage()
+			.openAuthoringEnvironment();
+		
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(new Date());
+		cal.add(Calendar.DATE, -10);
+		Date validFrom = cal.getTime();
+		cal.add(Calendar.DATE, 20);
+		Date validTo = cal.getTime();
+		
+		String title = "Remind-me-" + UUID.randomUUID().toString();
+		//create course
+		authoringEnv
+			.openCreateDropDown()
+			.clickCreate(ResourceType.course)
+			.fillCreateForm(title)
+			.assertOnGeneralTab()
+			.setLifecycle(validFrom, validTo, Locale.GERMAN)
+			.save();
+
+		//open course editor, create a node, set access
+		CoursePageFragment course = new CoursePageFragment(browser);
+		course
+			.openToolsMenu()
+			.edit()
+			.createNode("info")
+			.autoPublish()
+			.accessConfiguration()
+			.setUserAccess(UserAccess.registred)
+			.clickToolbarBack();
+		// add a participant
+		course
+			.members()
+			.quickAdd(kanu);
+		
+		//go to reminders
+		RemindersPage reminders = course
+				.reminders()
+				.assertOnRemindersList();
+		
+		String reminderTitle = "REM-" + UUID.randomUUID();
+		reminders
+			.addReminder()
+			.setDescription(reminderTitle)
+			.setTimeBasedRule(1, "RepositoryEntryLifecycleAfterValidFromRuleSPI", 5, "day")
+			.addRule(1)
+			.setRoleBasedRule(2, "RepositoryEntryRoleRuleSPI", "participant")
+			.saveReminder()
+			.assertOnRemindersList()
+			.assertOnReminderInList(reminderTitle);
+		//send the reminders
+		reminders
+			.openActionMenu(reminderTitle)
+			.sendReminders();
+		//check the reminder is send to user
+		reminders
+			.openActionMenu(reminderTitle)
+			.showSentReminders()
+			//reminder send to user
+			.assertSentRemindersList(kanu, true)
+			//reminder not send to author
+			.assertSentRemindersList(author, false);
+		
+		//open reminders log
+		reminders
+			.clickToolbarBack()
+			.openLog()
+			.assertLogList(kanu, reminderTitle, true)
+			.assertLogList(author, reminderTitle, false);
+	}
 }
diff --git a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java
index 026b30d1aa224fc6400623a74578553c481725b0..46a993cbc66fc852af491f7b2ac66b1ed3461255 100644
--- a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java
+++ b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java
@@ -128,6 +128,16 @@ public class CoursePageFragment {
 		return this;
 	}
 	
+	public RemindersPage reminders() {
+		if(!browser.findElement(settingsMenu).isDisplayed()) {
+			openSettingsMenu();
+		}
+		By reminderBy = By.cssSelector("a.o_sel_course_reminders");
+		browser.findElement(reminderBy).click();
+		OOGraphene.waitBusy(browser);
+		return new RemindersPage(browser);
+	}
+	
 	/**
 	 * Click the editor link in the tools drop-down
 	 * @return
diff --git a/src/test/java/org/olat/selenium/page/course/RemindersPage.java b/src/test/java/org/olat/selenium/page/course/RemindersPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c78ead8fb99bffa476bf539048ca4113019bc25
--- /dev/null
+++ b/src/test/java/org/olat/selenium/page/course/RemindersPage.java
@@ -0,0 +1,254 @@
+/**
+ * <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.course;
+
+import java.util.List;
+
+import org.jboss.arquillian.drone.api.annotation.Drone;
+import org.junit.Assert;
+import org.olat.selenium.page.NavigationPage;
+import org.olat.selenium.page.graphene.OOGraphene;
+import org.olat.user.restapi.UserVO;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.Select;
+
+/**
+ * 
+ * Initial date: 09.07.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class RemindersPage {
+	
+	@Drone
+	private WebDriver browser;
+	
+	public RemindersPage() {
+		//
+	}
+	
+	public RemindersPage(WebDriver browser) {
+		this.browser = browser;
+	}
+	
+	/**
+	 * Check that the reminders list is present.
+	 * @return
+	 */
+	public RemindersPage assertOnRemindersList() {
+		By reminderListBy = By.className("o_sel_course_reminder_list");
+		List<WebElement> reminderListEls = browser.findElements(reminderListBy);
+		Assert.assertEquals(1, reminderListEls.size());
+		return this;
+	}
+	
+	
+	public RemindersPage assertOnReminderInList(String title) {
+		By rowBy = By.xpath("//fieldset[contains(@class,'o_sel_course_reminder_list')]//table//tr//td//a[contains(text(), '" + title + "')]");
+		List<WebElement> reminderListEls = browser.findElements(rowBy);
+		Assert.assertEquals(1, reminderListEls.size());
+		return this;
+	}
+	
+	/**
+	 * Open the tools menu of the reminder specified by the title.
+	 * 
+	 * @param title
+	 * @return
+	 */
+	public RemindersPage openActionMenu(String title) {
+		By rowBy = By.xpath("//fieldset[contains(@class,'o_sel_course_reminder_list')]//table//tr[//td//a[contains(text(), '" + title + "')]]//td//a[contains(@class,'o_sel_course_reminder_tools')]");
+		List<WebElement> reminderListEls = browser.findElements(rowBy);
+		Assert.assertEquals(1, reminderListEls.size());
+		reminderListEls.get(0).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	/**
+	 * Click in the tools the "Send reminders".
+	 * 
+	 * @return
+	 */
+	public RemindersPage sendReminders() {
+		By sendBy = By.cssSelector("div.o_callout_content ul.o_dropdown a.o_sel_course_reminder_send");
+		browser.findElement(sendBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	/**
+	 * Click in the tools the "Show sent reminders".
+	 * 
+	 * @return
+	 */
+	public RemindersPage showSentReminders() {
+		By sendBy = By.cssSelector("div.o_callout_content ul.o_dropdown a.o_sel_course_reminder_showsent");
+		browser.findElement(sendBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public RemindersPage assertSentRemindersList(UserVO user, boolean in) {
+		By rowBy = By.xpath("//div[contains(@class,'o_sel_course_sent_reminder_list')]//table//tr//td//a[contains(text(), '" + user.getFirstName() + "')]");
+		List<WebElement> reminderListEls = browser.findElements(rowBy);
+		if(in) {
+			Assert.assertEquals(1, reminderListEls.size());
+		} else {
+			Assert.assertTrue(reminderListEls.isEmpty());
+		}
+		return this;
+	}
+	
+	public RemindersPage clickToolbarBack() {
+		browser.findElement(NavigationPage.toolbarBackBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	/**
+	 * Open the log
+	 * 
+	 * @return
+	 */
+	public RemindersPage openLog() {
+		By logSegmentBy = By.cssSelector("a.o_sel_course_reminder_log_segment");
+		browser.findElement(logSegmentBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public RemindersPage assertLogList(UserVO user, String reminderTitle, boolean in) {
+		String xpath = "//div[contains(@class,'o_sel_course_sent_reminder_log_list')]//table//tr"
+		     + "[//td//a[contains(text(), '" + user.getFirstName() + "')]]"
+		     + "[//td//a[contains(text(), '" + reminderTitle + "')]]";
+		
+		By rowBy = By.xpath(xpath);
+		List<WebElement> logListEls = browser.findElements(rowBy);
+		if(in) {
+			Assert.assertFalse(logListEls.isEmpty());
+		} else {
+			Assert.assertTrue(logListEls.isEmpty());
+		}
+		return this;
+	}
+	
+	/**
+	 * Create a new reminder
+	 * 
+	 * @return
+	 */
+	public RemindersPage addReminder() {
+		By addReminderBy = By.cssSelector("a.o_sel_add_course_reminder");
+		browser.findElement(addReminderBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public RemindersPage setDescription(String text) {
+		By descBy = By.cssSelector(".o_sel_course_reminder_desc input[type='text']");
+		browser.findElement(descBy).sendKeys(text);
+		return this;
+	}
+	
+	public RemindersPage setTimeBasedRule(int pos, String type, int time, String unit) {
+		//select type
+		selectRuleType(pos, type);
+		
+		//enter time
+		By timeBy = By.cssSelector("div.o_sel_row-" + pos + " input[type='text']");
+		browser.findElement(timeBy).sendKeys(Integer.toString(time));
+		
+		//select time unit
+		By selectUnitBy = By.xpath("//div[contains(@class,'o_sel_row-" + pos + "')]//select[contains(@name,'launchunit')]");
+		WebElement unitSelect = browser.findElement(selectUnitBy);
+		new Select(unitSelect).selectByValue(unit);
+		OOGraphene.waitBusy(browser);
+		
+		return this;
+	}
+	
+	/**
+	 * Set the configuration of a repository entry role.
+	 * 
+	 * @param pos
+	 * @param type
+	 * @param role
+	 * @return
+	 */
+	public RemindersPage setRoleBasedRule(int pos, String type, String role) {
+		//select type
+		selectRuleType(pos, type);
+		
+		//select role
+		By selectRoleBy = By.xpath("//div[contains(@class,'o_sel_row-" + pos + "')]//select[contains(@name,'role.')]");
+		WebElement roleSelect = browser.findElement(selectRoleBy);
+		new Select(roleSelect).selectByValue(role);
+		OOGraphene.waitBusy(browser);
+		
+		return this;
+	}
+	
+	/**
+	 * Add a rule after the specified row. Warning, the first
+	 * position is 1.
+	 * 
+	 * @param pos
+	 * @return
+	 */
+	public RemindersPage addRule(int pos) {
+		By addRuleBy = By.cssSelector("div.o_sel_row-" + pos + " a.o_sel_course_add_rule");
+		browser.findElement(addRuleBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	/**
+	 * Select the rule type, it's the simple name of the class:
+	 * RepositoryEntryLifecycleAfterValidFromRuleSPI,
+	 * RepositoryEntryRoleRuleSPI...
+	 * 
+	 * @param pos
+	 * @param type
+	 */
+	private void selectRuleType(int pos, String type) {
+		By selectTypeBy = By.xpath("//div[contains(@class,'o_sel_row-" + pos + "')]//select[contains(@name,'rule.type')]");
+		WebElement typeSelect = browser.findElement(selectTypeBy);
+		new Select(typeSelect).selectByValue(type);
+		OOGraphene.waitBusy(browser);
+	}
+	
+	/**
+	 * Save the form to edit a reminder
+	 * 
+	 * @return
+	 */
+	public RemindersPage saveReminder() {
+		By saveBy = By.cssSelector(".o_sel_course_reminder_config_buttons button.btn-primary");
+		List<WebElement> saveEls = browser.findElements(saveBy);
+		Assert.assertEquals(1, saveEls.size());
+		saveEls.get(0).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java b/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java
index 452c3f6e89a34cfc0d87ff77221f279e9af84035..68c251f7315ecae859658a57b63615acc795cdf0 100644
--- a/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java
+++ b/src/test/java/org/olat/selenium/page/repository/RepositoryEditDescriptionPage.java
@@ -19,7 +19,10 @@
  */
 package org.olat.selenium.page.repository;
 
+import java.text.DateFormat;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.Graphene;
@@ -57,6 +60,32 @@ public class RepositoryEditDescriptionPage {
 		return this;
 	}
 	
+	public RepositoryEditDescriptionPage setLifecycle(Date validFrom, Date validTo, Locale locale) {
+		//select private
+		By radioPrivateBy = By.cssSelector(".o_sel_repo_lifecycle_type input[type='radio'][value='private']");
+		browser.findElement(radioPrivateBy).click();
+		OOGraphene.waitBusy(browser);
+		
+		By validFromBy = By.cssSelector(".o_sel_repo_lifecycle_validfrom .o_date_picker input[type='text']");
+		DateFormat shortDateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+		String validFromStr = shortDateFormat.format(validFrom);
+		browser.findElement(validFromBy).sendKeys(validFromStr);
+		
+		By validToBy = By.cssSelector(".o_sel_repo_lifecycle_validto .o_date_picker input[type='text']");
+		String validToStr = shortDateFormat.format(validTo);
+		browser.findElement(validToBy).sendKeys(validToStr);
+		
+		return this;
+	}
+	
+	public RepositoryEditDescriptionPage save() {
+		By saveBy = By.cssSelector("div.o_sel_repo_save_details button.btn-primary");
+		WebElement saveButton = browser.findElement(saveBy);
+		saveButton.click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
 	public void clickToolbarBack() {
 		browser.findElement(NavigationPage.toolbarBackBy).click();
 		OOGraphene.waitBusy(browser);