diff --git a/aleksis/core/schema/base.py b/aleksis/core/schema/base.py
index 76e7b7180aa08c4920db9c0ccd55e4519e5d8781..346ae1c2eaae1f9b5dee34cc5fd0b89f48c74516 100644
--- a/aleksis/core/schema/base.py
+++ b/aleksis/core/schema/base.py
@@ -8,6 +8,9 @@ import graphene
 import reversion
 from django_filters.filterset import FilterSet, filterset_factory
 from graphene_django import DjangoListField, DjangoObjectType
+from graphene_django_cud.mutations.batch_create import DjangoBatchCreateMutation
+from graphene_django_cud.mutations.batch_delete import DjangoBatchDeleteMutation
+from graphene_django_cud.mutations.batch_patch import DjangoBatchPatchMutation
 from reversion import set_comment, set_user
 
 from ..util.core_helpers import queryset_rules_filter
@@ -96,6 +99,8 @@ class OptimisticResponseTypeMixin:
 
 
 class PermissionBatchPatchMixin:
+    """Mixin for permission checking during batch patch mutations."""
+
     class Meta:
         login_required = True
 
@@ -108,6 +113,8 @@ class PermissionBatchPatchMixin:
 
 
 class PermissionBatchDeleteMixin:
+    """Mixin for permission checking during batch delete mutations."""
+
     class Meta:
         login_required = True
 
@@ -120,6 +127,8 @@ class PermissionBatchDeleteMixin:
 
 
 class PermissionPatchMixin:
+    """Mixin for permission checking during patch mutations."""
+
     class Meta:
         login_required = True
 
@@ -214,15 +223,34 @@ class FilterOrderList(DjangoListField):
 
             qs = qs.order_by(*order_by)
 
-        print(f"{filters=}")
-
         return qs
 
 
 class MutateWithRevisionMixin:
+    """Mixin for creating revision for mutation."""
+
     @classmethod
     def mutate(cls, root, info, *args, **kwargs):
         with reversion.create_revision():
             set_user(info.context.user)
             set_comment(cls.__name__)
             super().mutate(root, info, *args, **kwargs)
+
+
+class BaseBatchCreateMutation(MutateWithRevisionMixin, DjangoBatchCreateMutation):
+    class Meta:
+        abstract = True
+
+
+class BaseBatchPatchMutation(
+    MutateWithRevisionMixin, PermissionBatchPatchMixin, DjangoBatchPatchMutation
+):
+    class Meta:
+        abstract = True
+
+
+class BaseBatchDeleteMutation(
+    MutateWithRevisionMixin, PermissionBatchDeleteMixin, DjangoBatchDeleteMutation
+):
+    class Meta:
+        abstract = True
diff --git a/aleksis/core/schema/group_type.py b/aleksis/core/schema/group_type.py
index fca51e01894ad9acc07147ca8ee6d5b115823d54..4d5e00cff5d187bd6fd63ce5e80244b597ec0a55 100644
--- a/aleksis/core/schema/group_type.py
+++ b/aleksis/core/schema/group_type.py
@@ -1,16 +1,12 @@
 from graphene_django import DjangoObjectType
-from graphene_django_cud.mutations import (
-    DjangoBatchCreateMutation,
-    DjangoBatchDeleteMutation,
-    DjangoBatchPatchMutation,
-)
 from guardian.shortcuts import get_objects_for_user
 
 from ..models import GroupType
 from .base import (
+    BaseBatchCreateMutation,
+    BaseBatchDeleteMutation,
+    BaseBatchPatchMutation,
     DjangoFilterMixin,
-    PermissionBatchDeleteMixin,
-    PermissionBatchPatchMixin,
     PermissionsTypeMixin,
 )
 
@@ -29,7 +25,7 @@ class GroupTypeType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
         return get_objects_for_user(info.context.user, "core.view_grouptype", GroupType)
 
 
-class GroupTypeBatchCreateMutation(DjangoBatchCreateMutation):
+class GroupTypeBatchCreateMutation(BaseBatchCreateMutation):
     class Meta:
         model = GroupType
         permissions = ("core.create_grouptype_rule",)
@@ -39,13 +35,13 @@ class GroupTypeBatchCreateMutation(DjangoBatchCreateMutation):
         )
 
 
-class GroupTypeBatchDeleteMutation(PermissionBatchDeleteMixin, DjangoBatchDeleteMutation):
+class GroupTypeBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = GroupType
         permissions = ("core.delete_grouptype_rule",)
 
 
-class GroupTypeBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+class GroupTypeBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = GroupType
         permissions = ("core.change_grouptype_rule",)
diff --git a/aleksis/core/schema/holiday.py b/aleksis/core/schema/holiday.py
index b596f6feae003c26696d42725605299b0d7d1a1a..4de4a8c11fedf0b7612340fa28f6eb76637b164a 100644
--- a/aleksis/core/schema/holiday.py
+++ b/aleksis/core/schema/holiday.py
@@ -1,16 +1,12 @@
 from graphene_django import DjangoObjectType
-from graphene_django_cud.mutations import (
-    DjangoBatchCreateMutation,
-    DjangoBatchDeleteMutation,
-    DjangoBatchPatchMutation,
-)
 from guardian.shortcuts import get_objects_for_user
 
 from ..models import Holiday
 from .base import (
+    BaseBatchCreateMutation,
+    BaseBatchDeleteMutation,
+    BaseBatchPatchMutation,
     DjangoFilterMixin,
-    PermissionBatchDeleteMixin,
-    PermissionBatchPatchMixin,
     PermissionsTypeMixin,
 )
 
@@ -31,20 +27,20 @@ class HolidayType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
         return get_objects_for_user(info.context.user, "core.view_holiday", queryset)
 
 
-class HolidayBatchCreateMutation(DjangoBatchCreateMutation):
+class HolidayBatchCreateMutation(BaseBatchCreateMutation):
     class Meta:
         model = Holiday
         permissions = ("core.create_holiday_rule",)
         only_fields = ("holiday_name", "date_start", "date_end")
 
 
-class HolidayBatchDeleteMutation(PermissionBatchDeleteMixin, DjangoBatchDeleteMutation):
+class HolidayBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = Holiday
         permissions = ("core.delete_holiday_rule",)
 
 
-class HolidayBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+class HolidayBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = Holiday
         permissions = ("core.edit_holiday_rule",)
diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py
index 2772fa94ca7c19f1d85d193ebac8dc352d6375d2..3e2af57c2ea06317135e82d00aa0c149e0ecfa60 100644
--- a/aleksis/core/schema/person.py
+++ b/aleksis/core/schema/person.py
@@ -6,7 +6,6 @@ from django.utils import timezone
 import graphene
 from graphene_django import DjangoObjectType
 from graphene_django.forms.mutation import DjangoModelFormMutation
-from graphene_django_cud.mutations import DjangoBatchDeleteMutation
 from guardian.shortcuts import get_objects_for_user
 
 from ..filters import PersonFilter
@@ -14,10 +13,9 @@ from ..forms import PersonForm
 from ..models import DummyPerson, Person
 from ..util.core_helpers import get_site_preferences, has_person
 from .base import (
+    BaseBatchDeleteMutation,
     DjangoFilterMixin,
     FieldFileType,
-    MutateWithRevisionMixin,
-    PermissionBatchDeleteMixin,
     PermissionsTypeMixin,
 )
 from .notification import NotificationType
@@ -263,9 +261,7 @@ class PersonMutation(DjangoModelFormMutation):
         return super().perform_mutate(form, info)
 
 
-class PersonBatchDeleteMutation(
-    MutateWithRevisionMixin, PermissionBatchDeleteMixin, DjangoBatchDeleteMutation
-):
+class PersonBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = Person
         permissions = ("core.delete_person_rule",)
diff --git a/aleksis/core/schema/personal_event.py b/aleksis/core/schema/personal_event.py
index 99b1324790509c4a70eaa63abcaaca94d78863e1..a231bd47fda6c20abefe5007375a420f883679f1 100644
--- a/aleksis/core/schema/personal_event.py
+++ b/aleksis/core/schema/personal_event.py
@@ -4,15 +4,12 @@ from django.utils import timezone
 
 import graphene
 from graphene_django import DjangoObjectType
-from graphene_django_cud.mutations import (
-    DjangoBatchCreateMutation,
-    DjangoBatchDeleteMutation,
-    DjangoBatchPatchMutation,
-)
 
 from ..models import PersonalEvent
 from .base import (
-    PermissionBatchDeleteMixin,
+    BaseBatchCreateMutation,
+    BaseBatchDeleteMutation,
+    BaseBatchPatchMutation,
     PermissionBatchPatchMixin,
 )
 
@@ -37,7 +34,7 @@ class PersonalEventType(DjangoObjectType):
     recurrences = graphene.String()
 
 
-class PersonalEventBatchCreateMutation(PermissionBatchPatchMixin, DjangoBatchCreateMutation):
+class PersonalEventBatchCreateMutation(PermissionBatchPatchMixin, BaseBatchCreateMutation):
     class Meta:
         model = PersonalEvent
         permissions = ("core.create_personal_event_with_invitations_rule",)
@@ -78,13 +75,13 @@ class PersonalEventBatchCreateMutation(PermissionBatchPatchMixin, DjangoBatchCre
         return value
 
 
-class PersonalEventBatchDeleteMutation(PermissionBatchDeleteMixin, DjangoBatchDeleteMutation):
+class PersonalEventBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = PersonalEvent
         permissions = ("core.delete_personal_event_rule",)
 
 
-class PersonalEventBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+class PersonalEventBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = PersonalEvent
         permissions = ("core.change_personalevent",)
diff --git a/aleksis/core/schema/room.py b/aleksis/core/schema/room.py
index b91fc22f4e7ff77a836c9ba25d082200055bafc3..19a315ab06cffebd7f9af29d3def2a5ff4405f60 100644
--- a/aleksis/core/schema/room.py
+++ b/aleksis/core/schema/room.py
@@ -1,16 +1,12 @@
 from graphene_django import DjangoObjectType
-from graphene_django_cud.mutations import (
-    DjangoBatchCreateMutation,
-    DjangoBatchDeleteMutation,
-    DjangoBatchPatchMutation,
-)
 from guardian.shortcuts import get_objects_for_user
 
 from ..models import Room
 from .base import (
+    BaseBatchCreateMutation,
+    BaseBatchDeleteMutation,
+    BaseBatchPatchMutation,
     DjangoFilterMixin,
-    PermissionBatchDeleteMixin,
-    PermissionBatchPatchMixin,
     PermissionsTypeMixin,
 )
 
@@ -30,20 +26,20 @@ class RoomType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
         return get_objects_for_user(info.context.user, "core.view_room", queryset)
 
 
-class RoomBatchCreateMutation(PermissionBatchPatchMixin, DjangoBatchCreateMutation):
+class RoomBatchCreateMutation(BaseBatchCreateMutation):
     class Meta:
         model = Room
         permissions = ("core.create_room_rule",)
         only_fields = ("id", "name", "short_name")
 
 
-class RoomBatchDeleteMutation(PermissionBatchDeleteMixin, DjangoBatchDeleteMutation):
+class RoomBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = Room
         permissions = ("core.delete_room_rule",)
 
 
-class RoomBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+class RoomBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = Room
         permissions = ("core.edit_room_rule",)
diff --git a/aleksis/core/schema/school_term.py b/aleksis/core/schema/school_term.py
index f9af92105a2672eee1cdd4979568dd83cfcdd843..3b9d6e04e7b176017369a5f71bbb160eb94cd0c2 100644
--- a/aleksis/core/schema/school_term.py
+++ b/aleksis/core/schema/school_term.py
@@ -2,17 +2,13 @@ from django.core.exceptions import PermissionDenied, ValidationError
 from django.utils.translation import gettext as _
 
 from graphene_django import DjangoObjectType
-from graphene_django_cud.mutations import (
-    DjangoBatchCreateMutation,
-    DjangoBatchDeleteMutation,
-    DjangoBatchPatchMutation,
-)
 
 from ..models import SchoolTerm
 from .base import (
+    BaseBatchCreateMutation,
+    BaseBatchDeleteMutation,
+    BaseBatchPatchMutation,
     DjangoFilterMixin,
-    PermissionBatchDeleteMixin,
-    PermissionBatchPatchMixin,
     PermissionsTypeMixin,
 )
 
@@ -35,7 +31,7 @@ class SchoolTermType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
         return queryset
 
 
-class SchoolTermBatchCreateMutation(PermissionBatchPatchMixin, DjangoBatchCreateMutation):
+class SchoolTermBatchCreateMutation(BaseBatchCreateMutation):
     class Meta:
         model = SchoolTerm
         permissions = ("core.create_school_term_rule",)
@@ -56,13 +52,13 @@ class SchoolTermBatchCreateMutation(PermissionBatchPatchMixin, DjangoBatchCreate
                 )
 
 
-class SchoolTermBatchDeleteMutation(PermissionBatchDeleteMixin, DjangoBatchDeleteMutation):
+class SchoolTermBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = SchoolTerm
         permissions = ("core.delete_school_term_rule",)
 
 
-class SchoolTermBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+class SchoolTermBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = SchoolTerm
         permissions = ("core.edit_school_term_rule",)