diff --git a/aleksis/apps/chronos/admin.py b/aleksis/apps/chronos/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c8506e04fd98257d40f4a68c824260976fd25c0
--- /dev/null
+++ b/aleksis/apps/chronos/admin.py
@@ -0,0 +1,5 @@
+from django.contrib import admin
+
+from .dashboard import TimetableWidget
+
+admin.site.register(TimetableWidget)
diff --git a/aleksis/apps/chronos/dashboard.py b/aleksis/apps/chronos/dashboard.py
new file mode 100644
index 0000000000000000000000000000000000000000..f628cd683464b823b7f68aa1ab68292fbc172607
--- /dev/null
+++ b/aleksis/apps/chronos/dashboard.py
@@ -0,0 +1,67 @@
+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.apps.chronos.util.prev_next import get_next_relevant_day
+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 = 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/templates/chronos/my_timetable.html b/aleksis/apps/chronos/templates/chronos/my_timetable.html
index 90adf8fb4a2f0c04eeb605ae7ff6b271a6ab6141..d508fd43b0b02009c7124e5bb03c4bde2b77e8e5 100644
--- a/aleksis/apps/chronos/templates/chronos/my_timetable.html
+++ b/aleksis/apps/chronos/templates/chronos/my_timetable.html
@@ -50,18 +50,9 @@
 
         </div>
       </div>
+
       {#  Lessons #}
-      {% for period, lessons in lesson_periods.items %}
-        <div class="row">
-          <div class="col s4">
-            {% include "chronos/partials/period_time.html" with period=period periods=periods %}
-          </div>
-          <div class="col s8">
-            {# A lesson #}
-            {% include "chronos/partials/lesson.html" with lessons=lessons %}
-          </div>
-        </div>
-      {% endfor %}
+      {% include "chronos/partials/lessons_col.html" with lesson_periods=lesson_periods %}
 
     </div>
   </div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html b/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html
new file mode 100644
index 0000000000000000000000000000000000000000..abb2710a6a147d2bbc67ab17be784a6c52f5da69
--- /dev/null
+++ b/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html
@@ -0,0 +1,10 @@
+{% for period, lessons in lesson_periods.items %}
+  <div class="row">
+    <div class="col s4">
+      {% include "chronos/partials/period_time.html" with period=period periods=periods %}
+    </div>
+    <div class="col s8">
+      {% include "chronos/partials/lesson.html" with lessons=lessons %}
+    </div>
+  </div>
+{% endfor %}
diff --git a/aleksis/apps/chronos/templates/chronos/widget.html b/aleksis/apps/chronos/templates/chronos/widget.html
new file mode 100644
index 0000000000000000000000000000000000000000..a16f291d1fbcc9f836db3d031c2c4c19692421a4
--- /dev/null
+++ b/aleksis/apps/chronos/templates/chronos/widget.html
@@ -0,0 +1,27 @@
+{# -*- engine:django -*- #}
+
+{% load i18n static %}
+
+<div class="card">
+  <div class="card-content">
+    <span class="card-title">
+      {% blocktrans with day_label=day_label %}
+        My timetable for {{ day_label }}
+      {% endblocktrans %}
+    </span>
+    <div class="timetable-plan">
+      {% if has_plan %}
+        {% include "chronos/partials/lessons_col.html" with lesson_periods=lesson_periods %}
+      {% else %}
+        <div class="alert warning">
+          <p>
+            <i class="material-icons left">info</i>
+            {% blocktrans %}
+              There is no timetable linked to your person.
+            {% endblocktrans %}
+          </p>
+        </div>
+      {% endif %}
+    </div>
+  </div>
+</div>