diff --git a/aleksis/apps/cursus/apps.py b/aleksis/apps/cursus/apps.py
index 2100153526771424e6b04addd6bc55b3baa2d960..ba7bf20152de28ca8df9fabe8a80506b643af1d8 100644
--- a/aleksis/apps/cursus/apps.py
+++ b/aleksis/apps/cursus/apps.py
@@ -11,3 +11,12 @@ class DefaultConfig(AppConfig):
     }
     licence = "EUPL-1.2+"
     copyright_info = (([2023], "Jonathan Weth", "dev@jonathanweth.de"),)
+
+    def _maintain_default_data(self):
+        super()._maintain_default_data()
+
+        # Ensure that default group types for school structure exist
+        from .util.group_types import get_school_class_group_type, get_school_grade_group_type
+
+        get_school_grade_group_type()
+        get_school_class_group_type()
diff --git a/aleksis/apps/cursus/schema.py b/aleksis/apps/cursus/schema.py
index 0e2a3d3269218fffa7d39f8694ab4236614d80e9..711ddd0db21bd72c815dfd93ccfc05c27a678c7a 100644
--- a/aleksis/apps/cursus/schema.py
+++ b/aleksis/apps/cursus/schema.py
@@ -1,4 +1,3 @@
-from django.apps import apps
 from django.core.exceptions import PermissionDenied
 from django.db.models import Q
 
@@ -11,7 +10,12 @@ from graphene_django_cud.mutations import (
 )
 from guardian.shortcuts import get_objects_for_user
 
-from aleksis.core.models import Group, GroupType, Person
+from aleksis.apps.cursus.settings import SCHOOL_CLASS_GROUP_TYPE_NAME, SCHOOL_GRADE_GROUP_TYPE_NAME
+from aleksis.apps.cursus.util.group_types import (
+    get_school_class_group_type,
+    get_school_grade_group_type,
+)
+from aleksis.core.models import Group, Person
 from aleksis.core.schema.base import (
     DjangoFilterMixin,
     FilterOrderList,
@@ -25,8 +29,6 @@ from aleksis.core.util.core_helpers import has_person
 
 from .models import Course, Subject
 
-SCHOOL_GRADE_GROUP_TYPE_NAME = "School grade"
-
 
 class SubjectType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
     class Meta:
@@ -185,10 +187,7 @@ class CreateSchoolClassMutation(DjangoBatchCreateMutation):
 
     @classmethod
     def before_mutate(cls, root, info, input):  # noqa
-        app_label = apps.get_containing_app_config(cls.__module__).label
-        group_type, __ = GroupType.objects.managed_by_app(app_label).get_or_create(
-            name="School class", managed_by_app_label=app_label
-        )
+        group_type = get_school_class_group_type()
         for school_class in input:
             school_class["group_type"] = group_type.pk
         return input
@@ -202,10 +201,7 @@ class CreateSchoolGradeMutation(DjangoBatchCreateMutation):
 
     @classmethod
     def before_mutate(cls, root, info, input):  # noqa
-        app_label = apps.get_containing_app_config(cls.__module__).label
-        group_type, __ = GroupType.objects.managed_by_app(app_label).get_or_create(
-            name=SCHOOL_GRADE_GROUP_TYPE_NAME, managed_by_app_label=app_label
-        )
+        group_type = get_school_grade_group_type()
         for school_grade in input:
             school_grade["group_type"] = group_type.pk
         return input
@@ -235,7 +231,7 @@ class Query(graphene.ObjectType):
         return get_objects_for_user(
             info.context.user,
             "core.view_group",
-            Group.objects.filter(group_type__name="School class"),
+            Group.objects.filter(group_type__name=SCHOOL_CLASS_GROUP_TYPE_NAME),
         )
 
     @staticmethod
diff --git a/aleksis/apps/cursus/settings.py b/aleksis/apps/cursus/settings.py
new file mode 100644
index 0000000000000000000000000000000000000000..1065c8c679515b92214f591ca8c1962a2ff4bfba
--- /dev/null
+++ b/aleksis/apps/cursus/settings.py
@@ -0,0 +1,2 @@
+SCHOOL_GRADE_GROUP_TYPE_NAME = "School grade"
+SCHOOL_CLASS_GROUP_TYPE_NAME = "School class"
diff --git a/aleksis/apps/cursus/util/group_types.py b/aleksis/apps/cursus/util/group_types.py
new file mode 100644
index 0000000000000000000000000000000000000000..71f1ebbcc4d4c7613aa678af24b1b3e154d01f24
--- /dev/null
+++ b/aleksis/apps/cursus/util/group_types.py
@@ -0,0 +1,17 @@
+from aleksis.core.models import GroupType
+
+from ..settings import SCHOOL_CLASS_GROUP_TYPE_NAME, SCHOOL_GRADE_GROUP_TYPE_NAME
+
+
+def get_school_grade_group_type():
+    group_type, __ = GroupType.objects.managed_by_app("cursus").get_or_create(
+        name=SCHOOL_GRADE_GROUP_TYPE_NAME, managed_by_app_label="cursus"
+    )
+    return group_type
+
+
+def get_school_class_group_type():
+    group_type, __ = GroupType.objects.managed_by_app("cursus").get_or_create(
+        name=SCHOOL_CLASS_GROUP_TYPE_NAME, managed_by_app_label="cursus"
+    )
+    return group_type