diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
index 3aa87f47cbe6651025bd3e5ea3a6676b5e810800..528a66ed53ac3e89f91204ac6e514d305b6e14c2 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
@@ -2,11 +2,13 @@
 import { DateTime } from "luxon";
 import ManageStudentsDialog from "./ManageStudentsDialog.vue";
 import documentationPartMixin from "../documentation/documentationPartMixin";
+import { touchDocumentation } from "./participationStatus.graphql";
+import mutateMixin from "aleksis.core/mixins/mutateMixin.js";
 
 export default {
   name: "ManageStudentsTrigger",
   components: { ManageStudentsDialog },
-  mixins: [documentationPartMixin],
+  mixins: [documentationPartMixin, mutateMixin],
   data() {
     return {
       canOpenParticipation: false,
@@ -30,6 +32,26 @@ export default {
       clearTimeout(this.timeout);
     }
   },
+  methods: {
+    touchDocumentation() {
+      this.mutate(
+        touchDocumentation,
+        {
+          documentationId: this.documentation.id,
+        },
+        (storedDocumentations, incoming) => {
+          // ID may be different now
+          console.log("incoming:", incoming);
+
+          return storedDocumentations.map((doc) =>
+            doc.id === this.documentation.id
+              ? Object.assign(doc, incoming, { oldId: doc.id })
+              : doc,
+          );
+        },
+      );
+    },
+  },
 };
 </script>
 
@@ -40,9 +62,10 @@ export default {
         dense
         color="primary"
         outlined
-        :disabled="!canOpenParticipation"
+        :disabled="!canOpenParticipation || loading"
         v-bind="attrs"
         v-on="on"
+        @click="touchDocumentation"
       >
         <v-icon>$edit</v-icon>
       </v-chip>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
index e752326355ae38fb4efcd7a999de0760b2198069..4c3f8df66e8236bb126aff29ccf8361931b35f8e 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
@@ -16,3 +16,24 @@ mutation updateParticipationStatuses(
     }
   }
 }
+
+mutation touchDocumentation($documentationId: ID!) {
+  touchDocumentation(documentationId: $documentationId) {
+    items: documentation {
+      id
+      participations {
+        id
+        person {
+          id
+          fullName
+        }
+        absenceReason {
+          id
+          name
+          shortName
+        }
+        isOptimistic
+      }
+    }
+  }
+}
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 2bf3b78c3909ab9f5ca90e82f1e3f1d090231d07..89b15ef94a4bb04563307306c3372746c18d4a84 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -708,6 +708,12 @@ class Documentation(CalendarEvent):
 
         return cls.objects.get(id=_id)
 
+    def touch(self):
+        # TODO: check if participation statuses etc. are created correctly.
+        #   might require some extra work, as the object may have been created
+        #   recently, so checking again would be overkill.
+        pass
+
 
 class ParticipationStatus(CalendarEvent):
     """A participation or absence record about a single person.
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 7ed5030b3ba246e9809ffb9dbd88977a4e185e4a..01366e832a9778025eaff0a8d3c909041d9483e1 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -18,6 +18,7 @@ from .documentation import (
     DocumentationBatchCreateOrUpdateMutation,
     DocumentationType,
     LessonsForPersonType,
+    TouchDocumentationMutation,
 )
 from .participation_status import ParticipationStatusBatchPatchMutation
 
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index bdc965471a78903a1d547bb25c1cd2c2284ff69f..72017279c97c3e9ccf7c6f642d621eaaaf62ffd4 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -139,3 +139,15 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
             objs = [cls.create_or_update(info, doc) for doc in input]
 
         return DocumentationBatchCreateOrUpdateMutation(documentations=objs)
+
+
+class TouchDocumentationMutation(graphene.Mutation):
+    class Arguments:
+        documentation_id = graphene.ID(required=True)
+
+    documentation = graphene.Field(DocumentationType)
+
+    def mutate(root, info, documentation_id):
+        documentation = Documentation.get_or_create_by_id(documentation_id, info.context.user)
+        documentation.touch()
+        return TouchDocumentationMutation(documentation=documentation)