diff --git a/aleksis/apps/kolego/schema/__init__.py b/aleksis/apps/kolego/schema/__init__.py
index 471a14e2d15cfd744d3150c61e67ae82382576ad..625c29b0c50c4883e6bb9c792d9fc1520d8b0c80 100644
--- a/aleksis/apps/kolego/schema/__init__.py
+++ b/aleksis/apps/kolego/schema/__init__.py
@@ -2,9 +2,37 @@ from django.apps import apps
 
 import graphene
 
+from aleksis.core.schema.base import DjangoFilterMixin, FilterOrderList
+
+from .absence import (
+    AbsenceType,
+    AbsenceCreateMutation,
+    AbsenceBatchCreateMutation,
+    AbsenceDeleteMutation,
+    AbsenceBatchPatchMutation,
+    AbsenceReasonType,
+    AbsenceReasonCreateMutation,
+    AbsenceReasonBatchCreateMutation,
+    AbsenceReasonDeleteMutation,
+    AbsenceReasonBatchPatchMutation
+)
+
 
 class Query(graphene.ObjectType):
     app_name = graphene.String()
+    absences = FilterOrderList(AbsenceType)
+    absence_reasons = FilterOrderList(AbsenceReasonType)
 
     def resolve_app_name(root, info, **kwargs) -> str:
         return apps.get_app_config("kolego").verbose_name
+
+class Mutation(graphene.ObjectType):
+    create_absence = AbsenceCreateMutation.Field()
+    create_absences = AbsenceBatchCreateMutation.Field()
+    delete_absence = AbsenceDeleteMutation.Field()
+    update_absences = AbsenceBatchPatchMutation.Field()
+
+    create_absence_reason = AbsenceReasonCreateMutation.Field()
+    create_absence_reasons = AbsenceReasonBatchCreateMutation.Field()
+    delete_absence_reason = AbsenceReasonDeleteMutation.Field()
+    update_absence_reasons = AbsenceReasonBatchPatchMutation.Field()
diff --git a/aleksis/apps/kolego/schema/absence.py b/aleksis/apps/kolego/schema/absence.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c9f099d546bb468b4895030f0e810e25be96060
--- /dev/null
+++ b/aleksis/apps/kolego/schema/absence.py
@@ -0,0 +1,93 @@
+import graphene
+from graphene_django import DjangoListField
+from graphene_django.types import DjangoObjectType
+from graphene_django_cud.mutations import (
+    DjangoBatchCreateMutation,
+    DjangoBatchPatchMutation,
+    DjangoCreateMutation,
+)
+from guardian.shortcuts import get_objects_for_user
+
+from aleksis.core.schema.base import (
+    DeleteMutation,
+    DjangoFilterMixin,
+    PermissionBatchPatchMixin,
+    PermissionsTypeMixin,
+)
+
+from ..models import Absence, AbsenceReason
+
+
+class AbsenceReasonType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
+    class Meta:
+        model = AbsenceReason
+        fields = ("id", "short_name", "name")
+        filter_fields = {
+            "short_name": ["icontains", "exact"],
+            "name": ["icontains", "exact"],
+        }
+
+
+class AbsenceType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
+    class Meta:
+        model = Absence
+        fields = ("id", "person", "reason", "comment", "datetime_start", "datetime_end", "date_start", "date_end")
+        filter_fields = {
+            "person__full_name": ["icontains", "exact"],
+            "comment": ["icontains", "exact"],
+        }
+
+
+class AbsenceCreateMutation(DjangoCreateMutation):
+    class Meta:
+        model = Absence
+        fields = ("person", "reason", "comment", "datetime_start", "datetime_end", "date_start", "date_end")
+        optional_fields = ("comment", "reason", "datetime_start", "datetime_end", "date_start", "date_end")
+        permissions = ("",)  # FIXME
+
+
+class AbsenceBatchCreateMutation(DjangoBatchCreateMutation):
+    class Meta:
+        model = Absence
+        fields = ("id", "person", "reason", "comment", "datetime_start", "datetime_end", "date_start", "date_end")
+        permissions = ("",)  # FIXME
+
+
+class AbsenceDeleteMutation(DeleteMutation):
+    klass = Absence
+    permission_required = ""  # FIXME
+
+
+class AbsenceBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+    class Meta:
+        model = Absence
+        fields = ("id", "person", "reason", "comment", "datetime_start", "datetime_end", "date_start", "date_end")
+        permissions = ("",)  # FIXME
+
+
+class AbsenceReasonCreateMutation(DjangoCreateMutation):
+    class Meta:
+        model = AbsenceReason
+        fields = ("short_name", "name")
+        optional_fields = ("name",)
+        permissions = ("",)  # FIXME
+
+
+class AbsenceReasonBatchCreateMutation(DjangoBatchCreateMutation):
+    class Meta:
+        model = AbsenceReason
+        fields = ("short_name", "name")
+        optional_fields = ("name",)
+        permissions = ("",)  # FIXME
+
+
+class AbsenceReasonDeleteMutation(DeleteMutation):
+    klass = AbsenceReason
+    permission_required = ""  # FIXME
+
+
+class AbsenceReasonBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
+    class Meta:
+        model = AbsenceReason
+        fields = ("id", "short_name", "name")
+        permissions = ("",)  # FIXME