diff --git a/aleksis/apps/kolego/frontend/components/AbsenceReasons.vue b/aleksis/apps/kolego/frontend/components/AbsenceReasons.vue
index a5398ec6d126e462d16558a9ba4c66c43eba7931..504b9045a2b579bb3bf854f820cb77d851a36140 100644
--- a/aleksis/apps/kolego/frontend/components/AbsenceReasons.vue
+++ b/aleksis/apps/kolego/frontend/components/AbsenceReasons.vue
@@ -20,9 +20,9 @@ import InlineCRUDList from "aleksis.core/components/generic/InlineCRUDList.vue";
 
 <script>
 import {
-  gqlAbsenceReasons,
-  createAbsenceReason,
-  deleteAbsenceReason,
+  absenceReasons,
+  createAbsenceReasons,
+  deleteAbsenceReasons,
   updateAbsenceReasons,
 } from "./absenceReasons.graphql";
 
@@ -41,10 +41,10 @@ export default {
         },
       ],
       i18nKey: "kolego.absence_reason",
-      gqlQuery: gqlAbsenceReasons,
-      gqlCreateMutation: createAbsenceReason,
+      gqlQuery: absenceReasons,
+      gqlCreateMutation: createAbsenceReasons,
       gqlPatchMutation: updateAbsenceReasons,
-      gqlDeleteMutation: deleteAbsenceReason,
+      gqlDeleteMutation: deleteAbsenceReasons,
       defaultItem: {
         shortName: "",
         name: "",
diff --git a/aleksis/apps/kolego/frontend/components/Absences.vue b/aleksis/apps/kolego/frontend/components/Absences.vue
index 168ef7b04b1d4270e4103cd456f731fcbca3fc7d..852eacc5bd464ac7d8203cd9ff95f5a41d87f3f1 100644
--- a/aleksis/apps/kolego/frontend/components/Absences.vue
+++ b/aleksis/apps/kolego/frontend/components/Absences.vue
@@ -13,7 +13,6 @@ import DateTimeField from "aleksis.core/components/generic/forms/DateTimeField.v
       :gql-create-mutation="gqlCreateMutation"
       :gql-patch-mutation="gqlPatchMutation"
       :gql-delete-mutation="gqlDeleteMutation"
-      :get-patch-data="getPatchData"
       :default-item="defaultItem"
     >
       <template #datetimeStart="{ item }">
@@ -89,9 +88,9 @@ import DateTimeField from "aleksis.core/components/generic/forms/DateTimeField.v
 
 <script>
 import {
-  gqlAbsences,
-  createAbsence,
-  deleteAbsence,
+  absences,
+  createAbsences,
+  deleteAbsences,
   updateAbsences,
 } from "./absences.graphql";
 import { gqlAbsenceReasons, gqlPersons } from "./helper.graphql";
@@ -123,10 +122,10 @@ export default {
         },
       ],
       i18nKey: "kolego.absence",
-      gqlQuery: gqlAbsences,
-      gqlCreateMutation: createAbsence,
+      gqlQuery: absences,
+      gqlCreateMutation: createAbsences,
       gqlPatchMutation: updateAbsences,
-      gqlDeleteMutation: deleteAbsence,
+      gqlDeleteMutation: deleteAbsences,
       defaultItem: {
         datetimeStart: new Date().toISOString(),
         datetimeEnd: new Date().toISOString(),
@@ -137,18 +136,6 @@ export default {
       required: [(value) => !!value || this.$t("forms.errors.required")],
     };
   },
-  methods: {
-    getPatchData(items) {
-      return items.map((item) => ({
-        id: item.id,
-        datetimeStart: item.datetimeStart,
-        datetimeEnd: item.datetimeEnd,
-        person: item.person.id,
-        reason: item.reason.id,
-        comment: item.comment,
-      }));
-    },
-  },
   apollo: {
     persons: gqlPersons,
     absenceReasons: gqlAbsenceReasons,
diff --git a/aleksis/apps/kolego/frontend/components/absenceReasons.graphql b/aleksis/apps/kolego/frontend/components/absenceReasons.graphql
index 996e514cdb4511ace135b73a354f39a79c793199..ddbe73af90f67c99f6800a2a03f89bc35c1ba4e2 100644
--- a/aleksis/apps/kolego/frontend/components/absenceReasons.graphql
+++ b/aleksis/apps/kolego/frontend/components/absenceReasons.graphql
@@ -1,4 +1,4 @@
-query gqlAbsenceReasons($orderBy: [String], $filters: JSONString) {
+query absenceReasons($orderBy: [String], $filters: JSONString) {
   items: absenceReasons(orderBy: $orderBy, filters: $filters) {
     id
     shortName
@@ -8,9 +8,9 @@ query gqlAbsenceReasons($orderBy: [String], $filters: JSONString) {
   }
 }
 
-mutation createAbsenceReason($input: CreateAbsenceReasonInput!) {
-  createAbsenceReason(input: $input) {
-    absenceReason {
+mutation createAbsenceReasons($input: [BatchCreateAbsenceReasonInput]!) {
+  createAbsenceReasons(input: $input) {
+    items: absenceReasons {
       id
       shortName
       name
@@ -20,14 +20,14 @@ mutation createAbsenceReason($input: CreateAbsenceReasonInput!) {
   }
 }
 
-mutation deleteAbsenceReason($id: ID!) {
-  deleteAbsenceReason(id: $id) {
-    ok
+mutation deleteAbsenceReasons($ids: [ID]!) {
+  deleteAbsenceReasons(ids: $ids) {
+    deletionCount
   }
 }
 
 mutation updateAbsenceReasons($input: [BatchPatchAbsenceReasonInput]!) {
-  batchMutation: updateAbsenceReasons(input: $input) {
+  updateAbsenceReasons(input: $input) {
     items: absenceReasons {
       id
       shortName
diff --git a/aleksis/apps/kolego/frontend/components/absences.graphql b/aleksis/apps/kolego/frontend/components/absences.graphql
index c3ca66b3284d292edde228a7c89745265cb6cfc7..25d5c0ea2027a6d42e080bd50bb6f50194c58911 100644
--- a/aleksis/apps/kolego/frontend/components/absences.graphql
+++ b/aleksis/apps/kolego/frontend/components/absences.graphql
@@ -1,4 +1,4 @@
-query gqlAbsences($orderBy: [String], $filters: JSONString) {
+query absences($orderBy: [String], $filters: JSONString) {
   items: absences(orderBy: $orderBy, filters: $filters) {
     id
     person {
@@ -18,9 +18,9 @@ query gqlAbsences($orderBy: [String], $filters: JSONString) {
   }
 }
 
-mutation createAbsence($input: CreateAbsenceInput!) {
-  createAbsence(input: $input) {
-    absence {
+mutation createAbsences($input: [BatchCreateAbsenceInput]!) {
+  createAbsences(input: $input) {
+    items: absences {
       id
       person {
         id
@@ -40,14 +40,14 @@ mutation createAbsence($input: CreateAbsenceInput!) {
   }
 }
 
-mutation deleteAbsence($id: ID!) {
-  deleteAbsence(id: $id) {
-    ok
+mutation deleteAbsences($ids: [ID]!) {
+  deleteAbsences(ids: $ids) {
+    deletionCount
   }
 }
 
 mutation updateAbsences($input: [BatchPatchAbsenceInput]!) {
-  batchMutation: updateAbsences(input: $input) {
+  updateAbsences(input: $input) {
     items: absences {
       id
       person {
diff --git a/aleksis/apps/kolego/schema/__init__.py b/aleksis/apps/kolego/schema/__init__.py
index f511f5773f3a162f3c538346b2802aec1bccf4b0..4fd07d96cd16188d60c035d0a46c247fb492d091 100644
--- a/aleksis/apps/kolego/schema/__init__.py
+++ b/aleksis/apps/kolego/schema/__init__.py
@@ -6,13 +6,11 @@ from aleksis.core.schema.base import FilterOrderList
 
 from .absence import (
     AbsenceBatchCreateMutation,
+    AbsenceBatchDeleteMutation,
     AbsenceBatchPatchMutation,
-    AbsenceCreateMutation,
-    AbsenceDeleteMutation,
     AbsenceReasonBatchCreateMutation,
+    AbsenceReasonBatchDeleteMutation,
     AbsenceReasonBatchPatchMutation,
-    AbsenceReasonCreateMutation,
-    AbsenceReasonDeleteMutation,
     AbsenceReasonType,
     AbsenceType,
 )
@@ -28,12 +26,10 @@ class Query(graphene.ObjectType):
 
 
 class Mutation(graphene.ObjectType):
-    create_absence = AbsenceCreateMutation.Field()
     create_absences = AbsenceBatchCreateMutation.Field()
-    delete_absence = AbsenceDeleteMutation.Field()
+    delete_absences = AbsenceBatchDeleteMutation.Field()
     update_absences = AbsenceBatchPatchMutation.Field()
 
-    create_absence_reason = AbsenceReasonCreateMutation.Field()
     create_absence_reasons = AbsenceReasonBatchCreateMutation.Field()
-    delete_absence_reason = AbsenceReasonDeleteMutation.Field()
+    delete_absence_reasons = AbsenceReasonBatchDeleteMutation.Field()
     update_absence_reasons = AbsenceReasonBatchPatchMutation.Field()
diff --git a/aleksis/apps/kolego/schema/absence.py b/aleksis/apps/kolego/schema/absence.py
index 37cb8eb91afc0ca09070d5a6b87061b7fe7c275a..bb66bf940d0d451e1993dc822901b350b1025a25 100644
--- a/aleksis/apps/kolego/schema/absence.py
+++ b/aleksis/apps/kolego/schema/absence.py
@@ -5,14 +5,13 @@ from django.conf import settings
 from graphene_django.types import DjangoObjectType
 from graphene_django_cud.mutations import (
     DjangoBatchCreateMutation,
+    DjangoBatchDeleteMutation,
     DjangoBatchPatchMutation,
-    DjangoCreateMutation,
 )
 from guardian.shortcuts import get_objects_for_user
 from zoneinfo import ZoneInfo
 
 from aleksis.core.schema.base import (
-    DeleteMutation,
     DjangoFilterMixin,
     PermissionBatchPatchMixin,
     PermissionsTypeMixin,
@@ -49,7 +48,7 @@ class AbsenceType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
         return get_objects_for_user(info.context.user, "kolego.view_absence", queryset)
 
 
-class AbsenceCreateMutation(DjangoCreateMutation):
+class AbsenceBatchCreateMutation(DjangoBatchCreateMutation):
     class Meta:
         model = Absence
         fields = ("person", "reason", "comment", "datetime_start", "datetime_end")
@@ -68,20 +67,15 @@ class AbsenceCreateMutation(DjangoCreateMutation):
 
     @classmethod
     def before_save(cls, root, info, input, obj):  # noqa: A002
-        obj.timezone = ZoneInfo(settings.TIME_ZONE)  # FIXME Use TZ provided by client
+        for absence in obj:
+            absence.timezone = ZoneInfo(settings.TIME_ZONE)  # FIXME Use TZ provided by client
         return obj
 
 
-class AbsenceBatchCreateMutation(DjangoBatchCreateMutation):
+class AbsenceBatchDeleteMutation(DjangoBatchDeleteMutation):
     class Meta:
         model = Absence
-        fields = ("id", "person", "reason", "comment", "datetime_start", "datetime_end")
-        permissions = ("kolego.add_absence",)  # FIXME
-
-
-class AbsenceDeleteMutation(DeleteMutation):
-    klass = Absence
-    permission_required = "kolego.delete_absence"  # FIXME
+        permission_required = "kolego.delete_absence"  # FIXME
 
 
 class AbsenceBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
@@ -107,7 +101,7 @@ class AbsenceBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutat
         return obj
 
 
-class AbsenceReasonCreateMutation(DjangoCreateMutation):
+class AbsenceReasonBatchCreateMutation(DjangoBatchCreateMutation):
     class Meta:
         model = AbsenceReason
         fields = ("short_name", "name")
@@ -115,17 +109,10 @@ class AbsenceReasonCreateMutation(DjangoCreateMutation):
         permissions = ("kolego.create_absencereason",)  # FIXME
 
 
-class AbsenceReasonBatchCreateMutation(DjangoBatchCreateMutation):
+class AbsenceReasonBatchDeleteMutation(DjangoBatchDeleteMutation):
     class Meta:
         model = AbsenceReason
-        fields = ("short_name", "name")
-        optional_fields = ("name",)
-        permissions = ("kolego.create_absencereason",)  # FIXME
-
-
-class AbsenceReasonDeleteMutation(DeleteMutation):
-    klass = AbsenceReason
-    permission_required = "kolego.delete_absencereason"  # FIXME
+        permission_required = "kolego.delete_absencereason"  # FIXME
 
 
 class AbsenceReasonBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):