diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 4452b3ba382d3253591891dffc2494830f19c2e9..e325627b6895dcfa16a040eea9ed6c1b4b468e36 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -10,6 +10,7 @@ from .documentation import (
     DocumentationBatchCreateMutation,
     DocumentationBatchPatchMutation,
     DocumentationCreateMutation,
+    DocumentationCreateOrUpdateMutation,
     DocumentationDeleteMutation,
     DocumentationType,
 )
@@ -46,3 +47,5 @@ class Mutation(graphene.ObjectType):
     create_documentations = DocumentationBatchCreateMutation.Field()
     delete_documentation = DocumentationDeleteMutation.Field()
     update_documentations = DocumentationBatchPatchMutation.Field()
+
+    create_or_update_documentation = DocumentationCreateOrUpdateMutation.Field()
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 9aa9f2cf862764ee733394a1779fad9138e1cf82..90382a1f0ff8ff5e5c6f73d149f3abfc919c434f 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -1,3 +1,4 @@
+import graphene
 from graphene_django.types import DjangoObjectType
 from graphene_django_cud.mutations import (
     DjangoBatchCreateMutation,
@@ -6,13 +7,13 @@ from graphene_django_cud.mutations import (
 )
 from guardian.shortcuts import get_objects_for_user
 
+from aleksis.apps.chronos.models import LessonEvent
 from aleksis.core.schema.base import (
     DeleteMutation,
     DjangoFilterMixin,
     PermissionBatchPatchMixin,
     PermissionsTypeMixin,
 )
-
 from ..models import Documentation
 
 
@@ -113,3 +114,44 @@ class DocumentationBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatc
             "date_end",
         )
         permissions = ("alsijil.edit_documentation_rule",)  # FIXME
+
+
+class DocumentationInputType(graphene.InputObjectType):
+    course = graphene.ID(required=False)
+    subject = graphene.ID(required=False)
+
+    topic = graphene.String(required=False)
+    homework = graphene.String(required=False)
+    group_note = graphene.String(required=False)
+
+
+class DocumentationCreateOrUpdateMutation(graphene.Mutation):
+    class Arguments:
+        id = graphene.ID(required=True)
+        input = DocumentationInputType(required=False)
+
+    documentation = graphene.Field(DocumentationType)
+
+    @classmethod
+    def mutate(cls, root, info, id, input):
+        # Sadly, we can't use the update_or_create method since create_defaults is only introduced in Django 5.0
+        if id.startswith("DUMMY"):
+            dummy, lesson_event_id, datetime_start, datetime_end = id.split(";")
+
+            obj = Documentation.objects.create(
+                datetime_start=datetime_start,
+                datetime_end=datetime_end,
+                lesson_event=LessonEvent.objects.get(id=lesson_event_id),
+                topic=input.topic,
+                homework=input.homework,
+                group_note=input.group_note,
+            )  # TODO: Add course & subject
+        else:
+            obj = Documentations.objects.get(id=id)
+            obj.update(
+                topic=input.topic,
+                homework=input.homework,
+                group_note=input.group_note,
+            )
+
+        return DocumentationCreateOrUpdateMutation(documentation=obj)