diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index eed15b70b9b58414166bc21b9d35c8029cbab37b..7323636367244d66302d72035b36f3e40160a7ff 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -14,6 +14,7 @@ Fixed
 
 * Migration path was ambigious
 * Unique constraints for breaks and substitutions were too tight
+* Absences in substitutions list were displayed multiple times.
 
 `2.0b0`_ - 2021-05-21
 ---------------------
diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py
index 303a22032683c5e1c74647e39c1c64801885c3f5..82021ef495791e24b525cfcbe9e5f8390fd3283b 100644
--- a/aleksis/apps/chronos/managers.py
+++ b/aleksis/apps/chronos/managers.py
@@ -600,13 +600,13 @@ class AbsenceQuerySet(DateRangeQuerySetMixin, SchoolTermRelatedQuerySet):
     """QuerySet with custom query methods for absences."""
 
     def absent_teachers(self):
-        return Person.objects.filter(absences__in=self).order_by("short_name")
+        return Person.objects.filter(absences__in=self).distinct().order_by("short_name")
 
     def absent_groups(self):
-        return Group.objects.filter(absences__in=self).order_by("short_name")
+        return Group.objects.filter(absences__in=self).distinct().order_by("short_name")
 
     def absent_rooms(self):
-        return Person.objects.filter(absences__in=self).order_by("short_name")
+        return Person.objects.filter(absences__in=self).distinct().order_by("short_name")
 
 
 class HolidayQuerySet(QuerySet, DateRangeQuerySetMixin):