diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookPrintDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookPrintDialog.vue
index b69ab14f62efeb404a75add394701dbe47f167a9..6fd2fc6742ae79dc3945dd5ec9085771a8ee278c 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookPrintDialog.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookPrintDialog.vue
@@ -136,8 +136,7 @@ export default {
       this.$router.push({
         name: "alsijil.coursebook_print",
         params: {
-          // TODO: Send & handle more than one group!
-          groupId: this.selectedGroups[0],
+          groupIds: this.selectedGroups,
         },
         query: { 
           cover: this.includeCover,
diff --git a/aleksis/apps/alsijil/frontend/index.js b/aleksis/apps/alsijil/frontend/index.js
index a157cb1bbf3d18f9ac78fb63b7f5685d2b84b6e5..03b8dec4843fa8b3a1f123399b6f3eb86ed5d058 100644
--- a/aleksis/apps/alsijil/frontend/index.js
+++ b/aleksis/apps/alsijil/frontend/index.js
@@ -80,7 +80,7 @@ export default {
       ],
     },
     {
-      path: "print/group/:groupId/",
+      path: "print/groups/:groupIds+/",
       component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
       name: "alsijil.coursebook_print",
       props: {
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index c7465fc55cd1491fd347ae9d76efc9e7f4dfd1e4..b03ac2cb3e4d63b581701466e1e541bc108ecd3d 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -4,7 +4,7 @@ from . import views
 
 urlpatterns = [
     path(
-        "print/group/<int:id_>/",
+        "print/groups/<path:ids>/",
         views.full_register_for_group,
         name="full_register_for_group"
     ),
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 6376e570d8497dbd72548d889d774c09abf8fdcc..776493de4ebc27a8c56d64fed8ec1af17c1a00b5 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -42,10 +42,12 @@ from .tasks import generate_full_register_printout
 @permission_required(
     "alsijil.view_full_register_rule", fn=objectgetter_optional(Group, None, False)
 )
-def full_register_for_group(request: HttpRequest, id_: int) -> HttpResponse:
+def full_register_for_group(request: HttpRequest, ids: str) -> HttpResponse:
     """Show a configurable register printout as PDF for a group."""
 
-    group = get_object_or_404(Group, pk=id_)
+    ids = [int(id_) for id_ in ids.split("/")]
+
+    groups = [get_object_or_404(Group, pk=id_) for id_ in ids]
 
     file_object = PDFFile.objects.create()
     if has_person(request):
@@ -55,7 +57,7 @@ def full_register_for_group(request: HttpRequest, id_: int) -> HttpResponse:
     redirect_url = f"/pdfs/{file_object.pk}"
 
     result = generate_full_register_printout.delay(
-        group=group.pk,
+        groups=ids,
         file_object=file_object.pk,
         include_cover=request.GET.get("cover", True),
         include_abbreviations=request.GET.get("abbreviations", True),
@@ -77,7 +79,7 @@ def full_register_for_group(request: HttpRequest, id_: int) -> HttpResponse:
     return render_progress_page(
         request,
         result,
-        title=_("Generate register printout for {}").format(group),
+        title=_(f"Generate register printout for {', '.join([group.short_name for group in groups])}"),
         progress_title=_("Generate register printout …"),
         success_message=_("The printout has been generated successfully."),
         error_message=_("There was a problem while generating the printout."),