diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index 8869d3337581df63d5d498c19a055747dd8bae24..d20c88b567ad7d4feb86231eafa4e35d880f9e1c 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -24,12 +24,18 @@ MENUS = {
                     "icon": "view_week",
                     "validators": ["menu_generator.validators.is_authenticated"],
                 },
-{
+                {
                     "name": _("My overview"),
                     "url": "overview_me",
                     "icon": "insert_chart",
                     "validators": ["menu_generator.validators.is_authenticated"],
                 },
+                {
+                    "name": _("My students"),
+                    "url": "my_students",
+                    "icon": "people",
+                    "validators": ["menu_generator.validators.is_authenticated"],
+                },
                 {
                     "name": _("Register absence"),
                     "url": "register_absence",
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html b/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html
new file mode 100644
index 0000000000000000000000000000000000000000..c3f5e35d48991bafd37ffdc3def7f445d1400247
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html
@@ -0,0 +1,26 @@
+{# -*- engine:django -*- #}
+{% extends "core/base.html" %}
+{% load data_helpers %}
+{% load week_helpers %}
+{% load i18n %}
+
+{% block browser_title %}{% blocktrans %}My students{% endblocktrans %}{% endblock %}
+
+
+{% block page_title %}
+  {% blocktrans %}My students{% endblocktrans %}
+{% endblock %}
+
+{% block content %}
+  <div class="collection">
+    {% for person in persons %}
+      <a class="collection-item" href="{% url "overview_person" person.pk %}">
+      {{ person }}
+      </a>
+    {% empty %}
+      <li class="collection-item flow-text">
+        {% blocktrans %}No students available.{% endblocktrans %}
+      </li>
+    {% endfor %}
+  </div>
+{% endblock %}
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 2fc61a1c275592d90f8326b954b150b6c18a83bd..0482571bd3cd9cf7c7da4a15b4cd7fc3e0a58c36 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -26,7 +26,8 @@ urlpatterns = [
     path(
         "print/group/<int:id_>", views.full_register_group, name="full_register_group"
     ),
-    path("person/<int:id_>/", views.overview_person, name="overview_person"),
+    path("persons/", views.my_students, name="my_students"),
+    path("persons/<int:id_>/", views.overview_person, name="overview_person"),
     path("me/", views.overview_person, name="overview_me"),
     path("absence/new", views.register_absence, name="register_absence"),
     path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index d07fae9ac2f310e9777639643a99d6a1aa6a21f5..6c2dcba3332395de4e78ae3e68100a171628da39 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -454,11 +454,23 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
     return render(request, "alsijil/print/full_register.html", context)
 
 
-def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
+def my_students(request: HttpRequest) -> HttpResponse:
     context = {}
-    person = objectgetter_optional(Person, default="request.user.person", default_eval=True)(
-        request, id_
+    relevant_groups = (
+        Group.objects.for_current_school_term_or_all()
+        .annotate(lessons_count=Count("lessons"))
+        .filter(lessons_count__gt=0, owners=request.user.person)
     )
+    persons = Person.objects.filter(member_of__in=relevant_groups)
+    context["persons"] = persons
+    return render(request, "alsijil/class_register/persons.html", context)
+
+
+def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
+    context = {}
+    person = objectgetter_optional(
+        Person, default="request.user.person", default_eval=True
+    )(request, id_)
     context["person"] = person
 
     if request.method == "POST":
@@ -554,11 +566,7 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
                 unexcused=Count("absent")
             )
         )
-        stat.update(
-            personal_notes.aggregate(
-                tardiness=Sum("late")
-            )
-        )
+        stat.update(personal_notes.aggregate(tardiness=Sum("late")))
 
         for extra_mark in ExtraMark.objects.all():
             stat.update(