diff --git a/aleksis/apps/alsijil/tasks.py b/aleksis/apps/alsijil/tasks.py
index ad62bdf24d215e29acbc67099addea22733786f2..cb6c7c64e268920b88da380b94fa2894b1e2c360 100644
--- a/aleksis/apps/alsijil/tasks.py
+++ b/aleksis/apps/alsijil/tasks.py
@@ -1,4 +1,4 @@
-from typing import Optional
+from typing import Optional, List
 
 from copy import deepcopy
 from datetime import date, timedelta
@@ -23,7 +23,7 @@ from .model_extensions import annotate_person_statistics_from_documentations
 
 @recorded_task
 def generate_full_register_printout(
-        group: int,
+        groups: List[int],
         file_object: int,
         recorder: ProgressRecorder,
         include_cover: Optional[bool] = True,
@@ -61,14 +61,14 @@ def generate_full_register_printout(
 
     context = {}
 
-    _number_of_steps = 4
+    _number_of_steps = 5 + len(groups)
 
-    recorder.set_progress(1, _number_of_steps, _("Load data ..."))
+    recorder.set_progress(1, _number_of_steps, _("Loading data ..."))
     
-    group = Group.objects.filter(pk=group)
+    groups = Group.objects.filter(pk__in=groups).order_by("name")
 
     if include_cover:
-        group = group.select_related("school_term")
+        groups = groups.select_related("school_term")
 
     if include_abbreviations or include_members_table:
         context["absence_reasons"] = AbsenceReason.objects.filter(tags__short_name="class_register", count_as_absent=True)
@@ -76,10 +76,10 @@ def generate_full_register_printout(
         context["extra_marks"] = ExtraMark.objects.all()
 
     if include_members_table or include_person_overviews:
-        group = group.prefetch_related("members")
+        groups = groups.prefetch_related("members")
 
     if include_teachers_and_subjects_table:
-        group = group.prefetch_related(
+        groups = groups.prefetch_related(
             Prefetch("courses", queryset=Course.objects.select_related("subject")),
             "courses__teachers",
             "child_groups",
@@ -87,58 +87,63 @@ def generate_full_register_printout(
             "child_groups__courses__teachers",
         )
 
-    group = group[0]
-    context["group"] = group
-
-    if include_members_table or include_person_overviews or include_coursebook:
-        documentations = Documentation.objects.filter(
-            Q(datetime_start__date__gte=group.school_term.date_start)
-            & Q(datetime_end__date__lte=group.school_term.date_end)
-            & (Q(course__groups=group) | Q(course__groups__parent_groups=group))
-        )
-
-    if include_members_table or include_person_overviews:
-        context["members"] = annotate_person_statistics_from_documentations(group.members.all(), documentations)
-
-    if include_person_overviews:
-        doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers"),
-        context["members"] = context["members"].prefetch_related(
-            prefetch_notable_participations(
-                prefetch_related=[
-                    Prefetch(
-                        "related_documentation",
-                        queryset=doc_query_set,
-                    )
-                ],
-            ),
-            prefetch_personal_notes(
-                "new_personal_notes",
-                prefetch_related=[
-                    Prefetch(
-                        "documentation",
-                        queryset=doc_query_set,
-                    )
-                ],
-            ),
-        )
-
-    if include_coursebook:
-        context["documentations_by_day"] = {}
-        documentations = documentations.order_by("datetime_start").prefetch_related(
-            prefetch_notable_participations(select_related=["person"]),
-            prefetch_personal_notes("personal_notes", select_related=["person"])
-        )
-        for doc in documentations:
-            context["documentations_by_day"].setdefault(doc.datetime_start.date(), []).append(doc)
-
-    recorder.set_progress(2, _number_of_steps, _("Generate template ..."))
+    recorder.set_progress(2, _number_of_steps, _("Loading groups ..."))
+
+    for i, group in enumerate(groups, start=1):
+
+        recorder.set_progress(2 + i, _number_of_steps, _(f"Loading group {group.short_name or group.name} ..."))
+
+        if include_members_table or include_person_overviews or include_coursebook:
+            documentations = Documentation.objects.filter(
+                Q(datetime_start__date__gte=group.school_term.date_start)
+                & Q(datetime_end__date__lte=group.school_term.date_end)
+                & (Q(course__groups=group) | Q(course__groups__parent_groups=group))
+            )
+
+        if include_members_table or include_person_overviews:
+            group.members_with_stats = annotate_person_statistics_from_documentations(group.members.all(), documentations)
+
+        if include_person_overviews:
+            doc_query_set = Documentation.objects.select_related("subject").prefetch_related("teachers"),
+            group.members_with_stats = group.members_with_stats.prefetch_related(
+                prefetch_notable_participations(
+                    prefetch_related=[
+                        Prefetch(
+                            "related_documentation",
+                            queryset=doc_query_set,
+                        )
+                    ],
+                ),
+                prefetch_personal_notes(
+                    "new_personal_notes",
+                    prefetch_related=[
+                        Prefetch(
+                            "documentation",
+                            queryset=doc_query_set,
+                        )
+                    ],
+                ),
+            )
+
+        if include_coursebook:
+            group.documentations_by_day = {}
+            documentations = documentations.order_by("datetime_start").prefetch_related(
+                prefetch_notable_participations(select_related=["person"]),
+                prefetch_personal_notes("personal_notes", select_related=["person"])
+            )
+            for doc in documentations:
+                group.documentations_by_day.setdefault(doc.datetime_start.date(), []).append(doc)
+
+    context["groups"] = groups
+
+    recorder.set_progress(3 + len(groups), _number_of_steps, _("Generating template ..."))
 
     # TODO: Use render pdf instead
     file_object, result = generate_pdf_from_template(
         "alsijil/print/register_for_group.html", context, file_object=file_object
     )
 
-    recorder.set_progress(3, _number_of_steps, _("Generate PDF ..."))
+    recorder.set_progress(4 + len(groups), _number_of_steps, _("Generating PDF ..."))
 
     with allow_join_result():
         result.wait()
@@ -146,4 +151,4 @@ def generate_full_register_printout(
         if not result.status == SUCCESS and file_object.file:
             raise Exception(_("PDF generation failed"))
 
-    recorder.set_progress(4, _number_of_steps)
+    recorder.set_progress(5 + len(groups), _number_of_steps)