diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index 9a3e7ac7bbbbe6b03b3717e832f263966e353fe4..bf6808809d068783393c179b5710f20985cc4fdc 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -222,7 +222,7 @@ class AssignGroupRoleForm(forms.ModelForm):
         if "groups" in initial:
             self.fields["groups"].required = False
 
-        # Filter persons by permissions
+        # Filter persons and groups by permissions
         if not self.request.user.has_perm("alsijil.assign_grouprole"):  # Global permission
             persons = Person.objects
             if initial.get("groups"):
@@ -236,6 +236,12 @@ class AssignGroupRoleForm(forms.ModelForm):
                 persons = persons.filter(member_of__owners=self.request.user.person)
             self.fields["person"].queryset = persons
 
+            if "groups" not in initial:
+                groups = Group.objects.for_current_school_term_or_all().filter(
+                    owners=self.request.user.person
+                )
+                self.fields["groups"].queryset = groups
+
     def clean_groups(self):
         """Ensure that only permitted groups are used."""
         return self.initial["groups"] if "groups" in self.initial else self.cleaned_data["groups"]
diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index a5b5b687abb95c6c7532b96574272ec078f4e0c2..951ee5b8e7d1757bc899542977507026e65a6fa8 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -67,6 +67,17 @@ MENUS = {
                         ),
                     ],
                 },
+                {
+                    "name": _("Assign group role"),
+                    "url": "assign_group_role_multiple",
+                    "icon": "assignment_ind",
+                    "validators": [
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "alsijil.assign_grouprole_for_multiple",
+                        ),
+                    ],
+                },
                 {
                     "name": _("Excuse types"),
                     "url": "excuse_types",
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index 4e7a84f0d973b3c9f35ae967136de0cee1baef59..b1087a65bef5f89522b878d44372635de08d1542 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -20,6 +20,7 @@ from .util.predicates import (
     is_lesson_teacher,
     is_none,
     is_own_personal_note,
+    is_owner_of_any_group,
     is_person_group_owner,
     is_person_primary_group_owner,
     is_personal_note_lesson_parent_group_owner,
@@ -258,6 +259,11 @@ assign_group_role_person_predicate = group_roles_activated_predicate & (
 )
 add_perm("alsijil.assign_grouprole_to_person", assign_group_role_person_predicate)
 
+assign_group_role_for_multiple_predicate = group_roles_activated_predicate & (
+    is_owner_of_any_group | has_global_perm("alsjil.assign_grouprole")
+)
+add_perm("alsijil.assign_grouprole_for_multiple", assign_group_role_for_multiple_predicate)
+
 assign_group_role_group_predicate = view_assigned_group_roles_predicate
 add_perm("alsijil.assign_grouprole_for_group", assign_group_role_group_predicate)
 
diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html b/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html
index 3405e8da56700ab9e29574c8d6f2d0a0a4b5e09b..a4a5ac137179ea12278d16029c06428221c0ef25 100644
--- a/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html
+++ b/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html
@@ -5,10 +5,18 @@
 {% load i18n rules any_js material_form %}
 
 {% block browser_title %}
-  {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %}
+  {% if group %}
+    {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %}
+  {% else %}
+    {% trans "Assign group role" %}
+  {% endif %}
 {% endblock %}
 {% block page_title %}
-  {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %}
+  {% if group %}
+    {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %}
+  {% else %}
+    {% trans "Assign group role" %}
+  {% endif %}
 {% endblock %}
 
 {% block extra_head %}
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 0e007075d04cb15e0d4fd649b896225f12beced2..864c862ae36490c5a7817c7e7ddfce17042930c6 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -87,4 +87,9 @@ urlpatterns = [
         views.GroupRoleAssignmentDeleteView.as_view(),
         name="delete_group_role_assignment",
     ),
+    path(
+        "group_roles/assignments/assign/",
+        views.AssignGroupRoleMultipleView.as_view(),
+        name="assign_group_role_multiple",
+    ),
 ]
diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index c1d6d063e7361e05468a8588efd65a7474e753c3..e039a3b4232a67db3069cbbe05c79538fd22c027 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -261,3 +261,9 @@ def is_group_role_assignment_group_owner(user: User, obj: Union[Group, Person])
             if user.person in list(group.owners.all()):
                 return True
     return False
+
+
+@predicate
+def is_owner_of_any_group(user: User, obj):
+    """Predicate which checks if the person is group owner of any group."""
+    return Group.objects.filter(owners=user.person).exists()
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index aa60f2cb36830f496906716fbcb7200ef5087a92..4b32660ac715f070b1b31b12b518b17c19a7d2b9 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -1024,6 +1024,23 @@ class AssignGroupRoleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCre
         return context
 
 
+@method_decorator(never_cache, name="dispatch")
+class AssignGroupRoleMultipleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCreateView):
+    model = GroupRoleAssignment
+    form_class = AssignGroupRoleForm
+    permission_required = "alsijil.assign_grouprole_for_multiple"
+    template_name = "alsijil/group_role/assign.html"
+    success_message = _("The group role has been assigned.")
+
+    def get_default_success_url(self) -> str:
+        return reverse("assign_group_role_multiple")
+
+    def get_form_kwargs(self):
+        kwargs = super().get_form_kwargs()
+        kwargs["request"] = self.request
+        return kwargs
+
+
 @method_decorator(never_cache, name="dispatch")
 class GroupRoleAssignmentEditView(PermissionRequiredMixin, SuccessNextMixin, AdvancedEditView):
     """Edit view for group role assignments."""