diff --git a/aleksis/apps/chronos/model_extensions.py b/aleksis/apps/chronos/model_extensions.py
index 8f16b828ae522f64daa3df7371871c8afcc4a0c3..672600908bbb9d847ce8fae762ca5b1dd5da4b9b 100644
--- a/aleksis/apps/chronos/model_extensions.py
+++ b/aleksis/apps/chronos/model_extensions.py
@@ -1,4 +1,6 @@
-from aleksis.core.models import Person
+from typing import Optional, Union
+
+from aleksis.core.models import Person, Group
 
 from .models import Lesson, LessonPeriod
 
@@ -10,6 +12,32 @@ def is_teacher(self):
     return self.lesson_periods_as_teacher.exists()
 
 
+@Person.property
+def timetable_type(self) -> Optional[str]:
+    """ Return which type of timetable this user has """
+
+    if self.is_teacher:
+        return "teacher"
+    elif self.primary_group:
+        return "group"
+    else:
+        return None
+
+
+@Person.property
+def timetable_object(self) -> Optional[Union[Group, Person]]:
+    """ Return the object which has the user's timetable """
+
+    type_ = self.timetable_type
+
+    if type_ == "teacher":
+        return self
+    elif type_ == "group":
+        return self.primary_group
+    else:
+        return None
+
+
 @Person.property
 def lessons_as_participant(self):
     """ Return a `QuerySet` containing all `Lesson`s this person
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index 59449c99feccba2438d7866817543c5be21e839f..5a6eb38f9bf4b308e0029506700751322a1a249e 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -206,6 +206,41 @@ class LessonPeriodQuerySet(LessonDataQuerySet):
         else:
             return None
 
+    def filter_from_person(self, person: Person) -> Optional[models.QuerySet]:
+        type_ = person.timetable_type
+
+        if type_ == "teacher":
+            # Teacher
+
+            return person.lesson_periods_as_teacher
+
+        elif type_ == "group":
+            # Student
+
+            return person.lesson_periods_as_participant
+
+        else:
+            # If no student or teacher
+            return None
+
+    def daily_lessons_for_person(self, person: Person, wanted_day: date) -> Optional[models.QuerySet]:
+        lesson_periods = LessonPeriod.objects.filter_from_person(person)
+
+        if lesson_periods is None:
+            return None
+
+        return lesson_periods.on_day(wanted_day)
+
+    def per_period_one_day(self) -> OrderedDict:
+        """ Group selected lessons per period for one day """
+        per_period = {}
+        for lesson_period in self:
+            if lesson_period.period.period in per_period:
+                per_period[lesson_period.period.period].append(lesson_period)
+            else:
+                per_period[lesson_period.period.period] = [lesson_period]
+        return OrderedDict(sorted(per_period.items()))
+
 
 class LessonSubstitutionQuerySet(LessonDataQuerySet):
     _period_path = "lesson_period__"
@@ -522,37 +557,21 @@ class TimetableWidget(DashboardWidget):
         if has_person(request.user):
             person = request.user.person
 
-            if person.is_teacher:
-                # Teacher
-
-                type_ = "teacher"
-                lesson_periods_person = person.lesson_periods_as_teacher
+            lesson_periods = LessonPeriod.objects.daily_lessons_for_person(person, wanted_day)
+            type_ = person.timetable_type
 
-            elif person.primary_group:
-                # Student
-
-                type_ = "group"
-                lesson_periods_person = person.lesson_periods_as_participant
-
-            else:
+            if type_ is None:
                 # If no student or teacher, redirect to all timetables
                 context["has_plan"] = False
-
-        lesson_periods = lesson_periods_person.on_day(wanted_day)
-
-        # Build dictionary with lessons
-        per_period = {}
-        for lesson_period in lesson_periods:
-            if lesson_period.period.period in per_period:
-                per_period[lesson_period.period.period].append(lesson_period)
             else:
-                per_period[lesson_period.period.period] = [lesson_period]
+                context["lesson_periods"] = lesson_periods.per_period_one_day()
+                context["type"] = type_
+                context["day"] = wanted_day
+                context["periods"] = TimePeriod.get_times_dict()
+                context["smart"] = True
+        else:
+            context["has_plan"] = False
 
-        context["lesson_periods"] = OrderedDict(sorted(per_period.items()))
-        context["type"] = type_
-        context["day"] = wanted_day
-        context["periods"] = TimePeriod.get_times_dict()
-        context["smart"] = True
         return context
 
     media = Media(css={
diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py
index 22ab295fd14e89b30ff288e15b337e771b9e5d84..daad66d7c699cfd95d711ad9faa2760274fe8049 100644
--- a/aleksis/apps/chronos/views.py
+++ b/aleksis/apps/chronos/views.py
@@ -62,46 +62,29 @@ def my_timetable(
     if has_person(request.user):
         person = request.user.person
 
-        if person.is_teacher:
-            # Teacher
+        lesson_periods = LessonPeriod.objects.daily_lessons_for_person(person, wanted_day)
 
-            type_ = "teacher"
-            super_el = person
-            lesson_periods_person = person.lesson_periods_as_teacher
-
-        elif person.primary_group:
-            # Student
-
-            type_ = "group"
-            super_el = person.primary_group
-            lesson_periods_person = person.lesson_periods_as_participant
-
-        else:
+        if lesson_periods is None:
             # If no student or teacher, redirect to all timetables
             return redirect("all_timetables")
 
-    lesson_periods = lesson_periods_person.on_day(wanted_day)
-
-    # Build dictionary with lessons
-    per_period = {}
-    for lesson_period in lesson_periods:
-        if lesson_period.period.period in per_period:
-            per_period[lesson_period.period.period].append(lesson_period)
-        else:
-            per_period[lesson_period.period.period] = [lesson_period]
+        type_ = person.timetable_type
+        super_el = person.timetable_object
 
-    context["lesson_periods"] = OrderedDict(sorted(per_period.items()))
-    context["super"] = {"type": type_, "el": super_el}
-    context["type"] = type_
-    context["day"] = wanted_day
-    context["periods"] = TimePeriod.get_times_dict()
-    context["smart"] = True
+        context["lesson_periods"] = lesson_periods.per_period_one_day()
+        context["super"] = {"type": type_, "el": super_el}
+        context["type"] = type_
+        context["day"] = wanted_day
+        context["periods"] = TimePeriod.get_times_dict()
+        context["smart"] = True
 
-    context["url_prev"], context["url_next"] = TimePeriod.get_prev_next_by_day(
-        wanted_day, "my_timetable_by_date"
-    )
+        context["url_prev"], context["url_next"] = TimePeriod.get_prev_next_by_day(
+            wanted_day, "my_timetable_by_date"
+        )
 
-    return render(request, "chronos/my_timetable.html", context)
+        return render(request, "chronos/my_timetable.html", context)
+    else:
+        return redirect("all_timetables")
 
 
 @login_required