diff --git a/aleksis/apps/chronos/admin.py b/aleksis/apps/chronos/admin.py
index 1c8506e04fd98257d40f4a68c824260976fd25c0..b43af26cb5d602b1e5584e2be32f6adf2f2294fe 100644
--- a/aleksis/apps/chronos/admin.py
+++ b/aleksis/apps/chronos/admin.py
@@ -1,5 +1,5 @@
 from django.contrib import admin
 
-from .dashboard import TimetableWidget
+from .models import TimetableWidget
 
 admin.site.register(TimetableWidget)
diff --git a/aleksis/apps/chronos/dashboard.py b/aleksis/apps/chronos/dashboard.py
deleted file mode 100644
index 9e283e1302366a2ea991c922aa1b52a1c05389d1..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/dashboard.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from datetime import datetime
-from collections import OrderedDict
-
-from django.forms.widgets import Media
-from django.utils import timezone
-from django.utils.translation import gettext_lazy as _
-from django_global_request.middleware import get_request
-
-from aleksis.apps.chronos.models import TimePeriod
-from aleksis.apps.chronos.util.date import get_name_for_day_from_today
-from aleksis.core.models import DashboardWidget
-from aleksis.core.util.core_helpers import has_person
-
-
-class TimetableWidget(DashboardWidget):
-    template = "chronos/widget.html"
-
-    def get_context(self):
-        request = get_request()
-        context = {"has_plan": True}
-        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
-
-        if has_person(request.user):
-            person = request.user.person
-
-            if person.is_teacher:
-                # Teacher
-
-                type_ = "teacher"
-                lesson_periods_person = person.lesson_periods_as_teacher
-
-            elif person.primary_group:
-                # Student
-
-                type_ = "group"
-                lesson_periods_person = person.lesson_periods_as_participant
-
-            else:
-                # 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"] = OrderedDict(sorted(per_period.items()))
-        context["type"] = type_
-        context["day"] = wanted_day
-        context["day_label"] = get_name_for_day_from_today(wanted_day)
-        context["periods"] = TimePeriod.get_times_dict()
-        context["smart"] = True
-        return context
-
-    media = Media(css={
-        "all": ("css/chronos/timetable.css",)
-    })
-
-    class Meta:
-        proxy = True
-        verbose_name = _("Timetable widget")
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index ed4caa85b485d4496603f8c92d2a73598c8f130c..7eb25cec1c50c1e4935c28b8256478a9ddb6be0d 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -1,5 +1,6 @@
 from __future__ import annotations
 
+from collections import OrderedDict
 from datetime import date, datetime, timedelta, time
 from typing import Dict, Optional, Tuple, Union
 
@@ -8,6 +9,7 @@ from django.core.exceptions import ValidationError
 from django.db import models
 from django.db.models import F, Max, Min, Q
 from django.db.models.functions import Coalesce
+from django.forms import Media
 from django.http.request import QueryDict
 from django.urls import reverse
 from django.utils import timezone
@@ -15,11 +17,13 @@ from django.utils.decorators import classproperty
 from django.utils.translation import ugettext_lazy as _
 
 from calendarweek.django import CalendarWeek, i18n_day_names_lazy, i18n_day_abbrs_lazy
+from django_global_request.middleware import get_request
 
 from aleksis.core.mixins import ExtensibleModel
-from aleksis.core.models import Group, Person
+from aleksis.core.models import Group, Person, DashboardWidget
 
-from aleksis.apps.chronos.util.date import week_weekday_from_date
+from aleksis.apps.chronos.util.date import week_weekday_from_date, get_name_for_day_from_today
+from aleksis.core.util.core_helpers import has_person
 
 
 class LessonPeriodManager(models.Manager):
@@ -505,3 +509,57 @@ class LessonPeriod(ExtensibleModel):
     class Meta:
         ordering = ["lesson__date_start", "period__weekday", "period__period"]
         indexes = [models.Index(fields=["lesson", "period"])]
+
+
+class TimetableWidget(DashboardWidget):
+    template = "chronos/widget.html"
+
+    def get_context(self):
+        request = get_request()
+        context = {"has_plan": True}
+        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
+
+        if has_person(request.user):
+            person = request.user.person
+
+            if person.is_teacher:
+                # Teacher
+
+                type_ = "teacher"
+                lesson_periods_person = person.lesson_periods_as_teacher
+
+            elif person.primary_group:
+                # Student
+
+                type_ = "group"
+                lesson_periods_person = person.lesson_periods_as_participant
+
+            else:
+                # 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"] = OrderedDict(sorted(per_period.items()))
+        context["type"] = type_
+        context["day"] = wanted_day
+        context["day_label"] = get_name_for_day_from_today(wanted_day)
+        context["periods"] = TimePeriod.get_times_dict()
+        context["smart"] = True
+        return context
+
+    media = Media(css={
+        "all": ("css/chronos/timetable.css",)
+    })
+
+    class Meta:
+        proxy = True
+        verbose_name = _("Timetable widget")