diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index d20c88b567ad7d4feb86231eafa4e35d880f9e1c..8b51bb206862364dbed6c57ff9af25d598b48e33 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -24,6 +24,12 @@ MENUS = {
                     "icon": "view_week",
                     "validators": ["menu_generator.validators.is_authenticated"],
                 },
+                {
+                    "name": _("My groups"),
+                    "url": "my_groups",
+                    "icon": "people",
+                    "validators": ["menu_generator.validators.is_authenticated"],
+                },
                 {
                     "name": _("My overview"),
                     "url": "overview_me",
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html b/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html
new file mode 100644
index 0000000000000000000000000000000000000000..87385476b881062b7498a7e2ff35120723bba8bd
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html
@@ -0,0 +1,24 @@
+{# -*- engine:django -*- #}
+{% extends "core/base.html" %}
+{% load i18n %}
+
+{% block browser_title %}{% blocktrans %}My groups{% endblocktrans %}{% endblock %}
+
+
+{% block page_title %}
+  {% blocktrans %}My groups{% endblocktrans %}
+{% endblock %}
+
+{% block content %}
+  <div class="collection">
+    {% for group in groups %}
+      <a class="collection-item" href="{% url "week_view" "group" group.pk %}">
+        {{ group }}
+      </a>
+    {% empty %}
+      <li class="collection-item flow-text">
+        {% blocktrans %}No groups available.{% endblocktrans %}
+      </li>
+    {% endfor %}
+  </div>
+{% endblock %}
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index e2bba60a0df002ccf4b110ea8ac5f1e22df8387a..af972edd5be09307c83ad550fa2385fe4d088669 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -26,6 +26,7 @@ urlpatterns = [
     path(
         "print/group/<int:id_>", views.full_register_group, name="full_register_group"
     ),
+    path("groups/", views.my_groups, name="my_groups"),
     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"),
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index ce85d10136b7a1f566b4c4ad27b8afeb9369d35a..b6b76985ecfc6a9cfc4495e8950a721058751dda 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -473,6 +473,17 @@ def my_students(request: HttpRequest) -> HttpResponse:
     return render(request, "alsijil/class_register/persons.html", context)
 
 
+def my_groups(request: HttpRequest) -> HttpResponse:
+    context = {}
+    groups = (
+        Group.objects.for_current_school_term_or_all()
+        .annotate(lessons_count=Count("lessons"))
+        .filter(lessons_count__gt=0, owners=request.user.person)
+    )
+    context["groups"] = groups
+    return render(request, "alsijil/class_register/groups.html", context)
+
+
 def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
     context = {}
     person = objectgetter_optional(