diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java
index 25da0039b2fdf5a22fdb15e045f159538c92b1a1..899be996f1c0d27fd274c0fd5664b4474bbe658f 100644
--- a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java
+++ b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java
@@ -119,21 +119,10 @@ public class AppointmentsPeekViewController extends BasicController {
 		return null;
 	}
 
-	private Optional<Appointment> getNextAppointment(List<Appointment> loadedAppointments) {
-		List<Appointment> appointments = new ArrayList<>(loadedAppointments.size());
+	private Optional<Appointment> getNextAppointment(List<Appointment> appointments) {
 		Date now = new Date();
-		for (Appointment appointment: loadedAppointments) {
-			Date begin = appointment.getStart();
-			Date end = appointment.getEnd();
-			Date ajustedEnd = new Date(end.getTime());
-			if (DateUtils.isSameDate(begin, end) && DateUtils.isSameTime(begin, end)) {
-				ajustedEnd = DateUtils.setTime(ajustedEnd, 23, 59, 59);
-			}
-			if (now.before(ajustedEnd)) {
-				appointments.add(appointment);
-			}
-		}
 		Optional<Appointment> appointment = appointments.stream()
+				.filter(a -> appointmentsService.isEndAfter(a, now))
 				.sorted((a1, a2) -> a1.getStart().compareTo(a2.getStart()))
 				.limit(1)
 				.findFirst();
diff --git a/src/main/java/org/olat/modules/appointments/AppointmentsService.java b/src/main/java/org/olat/modules/appointments/AppointmentsService.java
index 43337edf99571978647d1f319a40e5470403e41f..3b7c7d3f966950c2a53a55888a7843fdc574498b 100644
--- a/src/main/java/org/olat/modules/appointments/AppointmentsService.java
+++ b/src/main/java/org/olat/modules/appointments/AppointmentsService.java
@@ -20,6 +20,7 @@
 package org.olat.modules.appointments;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -101,6 +102,16 @@ public interface AppointmentsService {
 
 	public void deleteAppointment(Appointment appointment);
 	
+	/**
+	 * Checks whether the end of the appointment is after the due date.
+	 * It respects full day events.
+	 *
+	 * @param appointment
+	 * @param dueDate
+	 * @return
+	 */
+	public boolean isEndAfter(Appointment appointment, Date dueDate);
+	
 	/**
 	 * Gets the key of the topic and the according count of appointments.
 	 *
diff --git a/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java b/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java
index 3489742990b012333f66a5fac7d7959044b7313b..3e554d39e79764922ccdb29e0677917f0b0d7e6b 100644
--- a/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java
+++ b/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java
@@ -40,6 +40,7 @@ import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.PublisherData;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.id.Identity;
+import org.olat.core.util.DateUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
@@ -434,6 +435,17 @@ public class AppointmentsServiceImpl implements AppointmentsService {
 		appointmentDao.delete(appointment);
 	}
 	
+	@Override
+	public boolean isEndAfter(Appointment appointment, Date dueDate) {
+		Date begin = appointment.getStart();
+		Date end = appointment.getEnd();
+		Date ajustedEnd = new Date(end.getTime());
+		if (DateUtils.isSameDate(begin, end) && DateUtils.isSameTime(begin, end)) {
+			ajustedEnd = DateUtils.setTime(ajustedEnd, 23, 59, 59);
+		}
+		return ajustedEnd.after(dueDate);
+	}
+	
 	@Override
 	public Map<Long, Long> getTopicKeyToAppointmentCount(AppointmentSearchParams params, boolean freeOnly) {
 		return appointmentDao.loadTopicKeyToAppointmentCount(params, freeOnly);
diff --git a/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java b/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java
index 3758190dff11a9775aa3d246c0f8e06b3fc4358d..719fa9c6a7af41d5de407ed7e917b86f58054bf7 100644
--- a/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java
+++ b/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java
@@ -221,7 +221,7 @@ public class TopicsRunCoachController extends BasicController {
 		} else {
 			nextAppointment = appointments.stream()
 					.filter(a -> Appointment.Status.confirmed == a.getStatus())
-					.filter(a1 -> now.before(a1.getEnd()))
+					.filter(a -> appointmentsService.isEndAfter(a, now))
 					.sorted((a1, a2) -> a1.getStart().compareTo(a2.getStart()))
 					.findFirst();
 		}
diff --git a/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java b/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java
index 9b48ca6135646d0fc99a075dfb4d95bf40db8181..4357e20c6827ebf1527f3e0cff3e7bc53e96cbbb 100644
--- a/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java
+++ b/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java
@@ -236,7 +236,7 @@ public class TopicsRunController extends BasicController implements Activateable
 			Date now = new Date();
 			Optional<Appointment> nextAppointment = myTopicParticipations.stream()
 					.map(Participation::getAppointment)
-					.filter(a1 -> now.before(a1.getEnd()))
+					.filter(a -> appointmentsService.isEndAfter(a, now))
 					.sorted((a1, a2) -> a1.getStart().compareTo(a2.getStart()))
 					.findFirst();
 			Appointment appointment = nextAppointment.isPresent()
diff --git a/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java b/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java
index 992c455d951182197907d1114e4cd7a5ebd438ae..2a840936e8eaae057215e2b6f27f1e7d5c0266af 100644
--- a/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java
+++ b/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java
@@ -76,6 +76,25 @@ public class AppointmentsServiceTest extends OlatTestCase {
 						organizerDelete);
 	}
 	
+	@Test
+	public void shouldCheckEndAfterDueDate() {
+		Appointment appointment = sut.createUnsavedAppointment(null);
+		appointment.setStart(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime());
+		appointment.setEnd(new GregorianCalendar(2020, 2, 3, 11, 0, 0).getTime());
+		assertThat(sut.isEndAfter(appointment, new GregorianCalendar(2020, 2, 3, 12, 0, 0).getTime())).isFalse();
+		
+		appointment = sut.createUnsavedAppointment(null);
+		appointment.setStart(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime());
+		appointment.setEnd(new GregorianCalendar(2020, 2, 3, 14, 0, 0).getTime());
+		assertThat(sut.isEndAfter(appointment, new GregorianCalendar(2020, 2, 3, 12, 0, 0).getTime())).isTrue();
+		
+		// full day
+		appointment = sut.createUnsavedAppointment(null);
+		appointment.setStart(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime());
+		appointment.setEnd(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime());
+		assertThat(sut.isEndAfter(appointment, new GregorianCalendar(2020, 2, 3, 12, 0, 0).getTime())).isTrue();
+	}
+	
 	@Test
 	public void createParticipationShouldCreateParticiption() {
 		Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("ap");