diff --git a/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java b/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java
index 1d4b0a19793fee0fc2d27d42e2b0599b1ddbdbf5..b1dfec365088f1db2a456bae8c10ebc29bd3a9d4 100644
--- a/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java
+++ b/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java
@@ -41,6 +41,7 @@ import org.olat.modules.reminder.RuleSPI;
 import org.olat.modules.reminder.model.ReminderRules;
 import org.olat.modules.reminder.rule.BusinessGroupRoleRuleSPI;
 import org.olat.modules.reminder.rule.DateRuleSPI;
+import org.olat.modules.reminder.rule.BeforeDateRuleSPI;
 import org.olat.modules.reminder.rule.RepositoryEntryRoleRuleSPI;
 import org.olat.modules.reminder.rule.UserPropertyRuleSPI;
 import org.olat.repository.RepositoryEntry;
@@ -60,6 +61,7 @@ public class ReminderRuleEngine {
 	
 	private static final OLog log = Tracing.createLoggerFor(ReminderRuleEngine.class);
 	
+	public static final String BEFORE_DATE_RULE_TYPE = BeforeDateRuleSPI.class.getSimpleName();
 	public static final String DATE_RULE_TYPE = DateRuleSPI.class.getSimpleName();
 	public static final String USER_PROP_RULE_TYPE = UserPropertyRuleSPI.class.getSimpleName();
 	public static final String REPO_ROLE_RULE_TYPE = RepositoryEntryRoleRuleSPI.class.getSimpleName();
@@ -68,6 +70,8 @@ public class ReminderRuleEngine {
 	@Autowired
 	private DateRuleSPI dateRuleSpi;
 	@Autowired
+	private BeforeDateRuleSPI beforeDateRuleSpi;
+	@Autowired
 	private UserPropertyRuleSPI userPropertyRuleSpi;
 	
 	@Autowired
@@ -132,6 +136,10 @@ public class ReminderRuleEngine {
 				allOk &= dateRuleSpi.evaluate(rule);
 				ruleIt.remove();
 			}
+			if(BEFORE_DATE_RULE_TYPE.equals(rule.getType())) {
+				allOk &= beforeDateRuleSpi.evaluate(rule);
+				ruleIt.remove();
+			}
 		}
 
 		return allOk;
diff --git a/src/main/java/org/olat/modules/reminder/rule/BeforeDateRuleSPI.java b/src/main/java/org/olat/modules/reminder/rule/BeforeDateRuleSPI.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e4ace37357ae436ce2437180a2742f9bfd6bc4f
--- /dev/null
+++ b/src/main/java/org/olat/modules/reminder/rule/BeforeDateRuleSPI.java
@@ -0,0 +1,91 @@
+/**
+ * <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.reminder.rule;
+
+import java.text.ParseException;
+import java.util.Date;
+
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.Formatter;
+import org.olat.core.util.StringHelper;
+import org.olat.course.export.CourseEnvironmentMapper;
+import org.olat.modules.reminder.ReminderRule;
+import org.olat.modules.reminder.RuleEditorFragment;
+import org.olat.modules.reminder.RuleSPI;
+import org.olat.modules.reminder.model.ReminderRuleImpl;
+import org.olat.modules.reminder.ui.BeforeDateRuleEditor;
+import org.olat.repository.RepositoryEntry;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 22.10.2018<br>
+ * @author Stephan Clemenz, clemenz@vcrp.de
+ *
+ */
+@Service
+public class BeforeDateRuleSPI implements RuleSPI {
+	
+	private static final OLog log = Tracing.createLoggerFor(BeforeDateRuleSPI.class);
+	
+	public static final String BEFORE = "<";
+
+	@Override
+	public String getLabelI18nKey() {
+		return "rule.before.date";
+	}
+
+	@Override
+	public String getCategory() {
+		return "general";
+	}
+
+	@Override
+	public RuleEditorFragment getEditorFragment(ReminderRule rule, RepositoryEntry entry) {
+		return new BeforeDateRuleEditor(rule);
+	}
+	
+	@Override
+	public ReminderRule clone(ReminderRule rule, CourseEnvironmentMapper envMapper) {
+		return rule.clone();
+	}
+	
+	public boolean evaluate(ReminderRule rule) {
+		boolean allOk = true;
+		
+		if(rule instanceof ReminderRuleImpl) {
+			ReminderRuleImpl r = (ReminderRuleImpl)rule;
+			String operator = r.getOperator();
+			if(BEFORE.equals(operator) && StringHelper.containsNonWhitespace(r.getRightOperand())) {
+				try {
+					Date date = Formatter.parseDatetime(r.getRightOperand());
+					Date now = new Date();
+					allOk &= now.compareTo(date) <= 0;
+				} catch (ParseException e) {
+					log.error("", e);
+				}
+			}
+		}
+
+		return allOk;
+	}
+
+}
diff --git a/src/main/java/org/olat/modules/reminder/ui/BeforeDateRuleEditor.java b/src/main/java/org/olat/modules/reminder/ui/BeforeDateRuleEditor.java
new file mode 100644
index 0000000000000000000000000000000000000000..46a157a4eaedb25b16c9a8757d3ae229594cfe7d
--- /dev/null
+++ b/src/main/java/org/olat/modules/reminder/ui/BeforeDateRuleEditor.java
@@ -0,0 +1,105 @@
+/**
+ * <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.reminder.ui;
+
+import java.text.ParseException;
+import java.util.Date;
+
+import org.olat.core.gui.UserRequest;
+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.DateChooser;
+import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.util.CodeHelper;
+import org.olat.core.util.Formatter;
+import org.olat.core.util.Util;
+import org.olat.modules.reminder.ReminderRule;
+import org.olat.modules.reminder.RuleEditorFragment;
+import org.olat.modules.reminder.model.ReminderRuleImpl;
+import org.olat.modules.reminder.rule.BeforeDateRuleSPI;
+
+/**
+ * 
+ * Initial date: 22.10.2018<br>
+ * @author Stephan Clemenz, clemenz@vcrp.de
+ *
+ */
+public class BeforeDateRuleEditor extends RuleEditorFragment {
+	private static final OLog log = Tracing.createLoggerFor(BeforeDateRuleEditor.class);
+	
+	private DateChooser beforeEl;
+	
+	public BeforeDateRuleEditor(ReminderRule rule) {
+		super(rule);
+	}
+	
+	@Override
+	public FormItem initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		String id = Long.toString(CodeHelper.getRAMUniqueID());
+		String page = Util.getPackageVelocityRoot(this.getClass()) + "/rule_1_element.html";
+		FormLayoutContainer ruleCont = FormLayoutContainer
+				.createCustomFormLayout(".".concat(id), formLayout.getTranslator(), page);
+		ruleCont.setRootForm(formLayout.getRootForm());
+		formLayout.add(ruleCont);
+		ruleCont.getFormItemComponent().contextPut("id", id);
+		
+		Date before = null;
+		if(rule instanceof ReminderRuleImpl) {
+			ReminderRuleImpl ruleImpl = (ReminderRuleImpl)rule;
+			try {
+				before = Formatter.parseDatetime(ruleImpl.getRightOperand());
+			} catch (ParseException e) {
+				log.error("", e);
+			}
+		}
+		
+		beforeEl = uifactory.addDateChooser("ruleElement.".concat(id), null, before, ruleCont);
+		beforeEl.setDateChooserTimeEnabled(true);
+		return ruleCont;
+	}
+
+	@Override
+	public boolean validateFormLogic(UserRequest ureq) {
+		boolean allOk = true;
+		
+		beforeEl.clearError();
+		if(beforeEl.getDate() == null) {
+			beforeEl.setErrorKey("form.mandatory.hover", null);
+			allOk &= false;
+		}
+		
+		return allOk;
+	}
+
+	@Override
+	public ReminderRule getConfiguration() {
+		ReminderRuleImpl configuredRule = new ReminderRuleImpl();
+		configuredRule.setType(BeforeDateRuleSPI.class.getSimpleName());
+		configuredRule.setOperator(BeforeDateRuleSPI.BEFORE);
+		if(beforeEl.getDate() != null) {
+			configuredRule.setRightOperand(Formatter.formatDatetime(beforeEl.getDate()));
+		}
+		return configuredRule;
+	}
+
+}
diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties
index 726cb88daf1e7c44bfca91b9a3f5b01c96f69b2d..7d94e86f2699b2a933179d662ae8ee45425f5f26 100644
--- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties
@@ -20,6 +20,7 @@ interval.1=Jede Stunde
 reminder.admin.title=Kurserinnerungen
 reminder.from.course=Erinnerung aus Kurs {0}
 rule.after.date=Nach Datum
+rule.before.date=Bis Datum
 rule.course.enrollment.date=Einschreibedatum
 rule.course.role=Kursrolle
 rule.group.member=Gruppenteilnehmer
diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties
index 1f0740057ebcd4feaeb297e5f8a7108c1ea27259..d4da0424a8fb96093a4fa825d2cf7b73d5169ea5 100644
--- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties
@@ -20,6 +20,7 @@ interval.1=Every hour
 reminder.admin.title=Course reminders
 reminder.from.course=Reminder from course {0}
 rule.after.date=After date
+rule.before.date=Until date
 rule.course.enrollment.date=Enrollment date
 rule.course.role=Course role
 rule.group.member=Group member
diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties
index e686b9f5a51015edf6544520f22c9e0545b881bf..043b930d02a6216b63148a9f5bb1c902336cbee9 100644
--- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties
@@ -20,6 +20,7 @@ interval.8=Trois fois par jour
 reminder.admin.title=Rappels des cours
 reminder.from.course=Rappel du cours {0}
 rule.after.date=Fonction de la date
+rule.before.date=Jusqu'\u00E0
 rule.course.enrollment.date=Date d'inscription
 rule.course.role=R\u00F4le au sein du cours
 rule.group.member=Participant \u00E0 un groupe
diff --git a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
index 45216c0c807e545ecf1870a697beb246764e0b3f..418b3471bce315af7d575e0978f1ad0b6d623733 100644
--- a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
+++ b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
@@ -56,6 +56,7 @@ import org.olat.group.manager.BusinessGroupRelationDAO;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.reminder.ReminderRule;
 import org.olat.modules.reminder.model.ReminderRuleImpl;
+import org.olat.modules.reminder.rule.BeforeDateRuleSPI;
 import org.olat.modules.reminder.rule.CourseEnrollmentDateRuleSPI;
 import org.olat.modules.reminder.rule.DateRuleSPI;
 import org.olat.modules.reminder.rule.InitialCourseLaunchRuleSPI;
@@ -134,6 +135,35 @@ public class ReminderRuleEngineTest extends OlatTestCase {
 		Assert.assertFalse(futureEval);
 	}
 	
+	@Test
+	public void beforeDateRule() {
+		Calendar cal = Calendar.getInstance();
+		
+		//check rule with date in the future
+		List<ReminderRule> rulePastList = new ArrayList<>();
+		ReminderRuleImpl pastRule = new ReminderRuleImpl();
+		pastRule.setType(BeforeDateRuleSPI.class.getSimpleName());
+		pastRule.setOperator(BeforeDateRuleSPI.BEFORE);
+		cal.add(Calendar.HOUR_OF_DAY, 2);
+		pastRule.setRightOperand(Formatter.formatDatetime(cal.getTime()));
+		rulePastList.add(pastRule);
+
+		boolean pastEval = ruleEngine.evaluateDateRule(rulePastList);
+		Assert.assertTrue(pastEval);
+		
+		//check rule with date in the pase
+		List<ReminderRule> ruleFutureList = new ArrayList<>();
+		ReminderRuleImpl futureRule = new ReminderRuleImpl();
+		futureRule.setType(BeforeDateRuleSPI.class.getSimpleName());
+		futureRule.setOperator(BeforeDateRuleSPI.BEFORE);
+		cal.add(Calendar.DATE, -4);
+		futureRule.setRightOperand(Formatter.formatDatetime(cal.getTime()));
+		ruleFutureList.add(futureRule);
+		
+		boolean futureEval = ruleEngine.evaluateDateRule(ruleFutureList);
+		Assert.assertFalse(futureEval);
+	}
+	
 	@Test
 	public void repositoryRules() {
 		//create a repository entry with a relation to a group and members