diff --git a/aleksis/apps/lesrooster/managers.py b/aleksis/apps/lesrooster/managers.py
index 0daa74481285ca2c493b02e3bbaf7d0033463339..aa9877de0598d27cea6dc0c65d1a187dbc3aff27 100644
--- a/aleksis/apps/lesrooster/managers.py
+++ b/aleksis/apps/lesrooster/managers.py
@@ -127,7 +127,7 @@ class LessonQuerySet(QuerySet):
         self,
         type_: TimetableType,
         obj: Union[Person, Group, Room, int],
-    ) -> Optional["LessonQuerySet"]:
+    ) -> "LessonQuerySet":
         """Filter lessons for a group, teacher or room by provided type."""
         if type_ == TimetableType.GROUP:
             return self.filter_group(obj)
@@ -136,9 +136,9 @@ class LessonQuerySet(QuerySet):
         elif type_ == TimetableType.ROOM:
             return self.filter_room(obj)
         else:
-            return None
+            return self.none()
 
-    def filter_from_person(self, person: Person) -> Optional["LessonQuerySet"]:
+    def filter_from_person(self, person: Person) -> "LessonQuerySet":
         """Filter lessons for a person."""
         type_ = person.timetable_type
 
@@ -147,7 +147,7 @@ class LessonQuerySet(QuerySet):
         elif type_ == TimetableType.GROUP:
             return self.filter_participant(person)
         else:
-            return None
+            return self.none()
 
 
 class LessonManager(AlekSISBaseManagerWithoutMigrations):
@@ -167,14 +167,14 @@ class SupervisionQuerySet(QuerySet):
         self,
         type_: TimetableType,
         obj: Union[Person, Group, Room, int],
-    ) -> Optional["SupervisionQuerySet"]:
+    ) -> "SupervisionQuerySet":
         """Filter supervisions for a eacher or room by provided type."""
         if type_ == TimetableType.TEACHER:
             return self.filter_teacher(obj)
         elif type_ == TimetableType.ROOM:
             return self.filter_room(obj)
         else:
-            return None
+            return self.none()
 
     def filter_from_person(self, person: Person) -> Optional["SupervisionQuerySet"]:
         """Filter supervisions for a person."""
diff --git a/aleksis/apps/lesrooster/util/build.py b/aleksis/apps/lesrooster/util/build.py
index 37c2f3dc284a0eacff6c9e59c1232601b4ae4c70..41ac058a93163a361fc4a3bf43de6372597bdb30 100644
--- a/aleksis/apps/lesrooster/util/build.py
+++ b/aleksis/apps/lesrooster/util/build.py
@@ -8,18 +8,10 @@ from aleksis.core.models import Group, Person, Room
 
 def build_timetable(
     time_grid: TimeGrid,
-    type_: Union[TimetableType, str],
+    type_: TimetableType,
     obj: Union[Group, Room, Person],
 ) -> list | None:
     """Build regular timetable for the given time grid."""
-    is_person = False
-    if type_ == "person":
-        is_person = True
-        type_ = obj.timetable_type
-
-    if type_ is None:
-        return None
-
     slots = Slot.objects.filter(time_grid=time_grid).order_by("weekday", "time_start")
     lesson_periods_per_slot = OrderedDict()
     supervisions_per_slot = OrderedDict()
@@ -33,37 +25,19 @@ def build_timetable(
     max_slots = len(max_slots)
 
     # Get matching lessons
-    lessons = Lesson.objects.filter(slot_start__time_grid=time_grid)
-
-    lessons = (
-        lessons.filter_from_person(obj) if is_person else lessons.filter_from_group(type_, obj)
-    )
+    lessons = Lesson.objects.filter(slot_start__time_grid=time_grid).filter_from_type(type_, obj)
 
     # Sort lesson periods in a dict
     for lesson in lessons:
-        for slot in Slot.objects.filter(
-            time_grid=time_grid,
-            weekday=lesson.slot_start.weekday,
-            time_start__gte=lesson.slot_start.time_start,
-            time_end__lte=lesson.slot_end.time_end,
-        ).not_instance_of(BreakSlot):
-            lesson_periods_per_slot[slot].append(lesson)
+        lesson_periods_per_slot[lesson.slot_start].append(lesson)
 
     # Get matching supervisions
-    needed_break_slots = []
-
-    supervisions = Supervision.objects.filter(break_slot__time_grid=time_grid).all()
-    if is_person:
-        supervisions = supervisions.filter_from_person(obj)
-    else:
-        supervisions = supervisions.filter_from_type(type_, obj)
-
-    if supervisions:
-        for supervision in supervisions:
-            if supervision.break_slot not in needed_break_slots:
-                needed_break_slots.append(supervision.break_slot)
+    supervisions = Supervision.objects.filter(break_slot__time_grid=time_grid).filter_from_type(
+        type_, obj
+    )
 
-            supervisions_per_slot[supervision.break_slot] = supervision
+    for supervision in supervisions:
+        supervisions_per_slot[supervision.break_slot] = supervision
 
     rows = []
     for slot_idx in range(max_slots):  # period is period after break
@@ -100,7 +74,6 @@ def build_timetable(
             cols.append(col)
 
         row["cols"] = cols
-
         rows.append(row)
 
     return rows