diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
index 3c48211f95dc43e022dccff838100e43d58ea842..2ef03c095e4e46a10fc52c9cc67a0e126a3a1d2e 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
@@ -95,7 +95,7 @@
           </v-list-item-title>
         </v-list-item-content>
       </v-list-item>
-      <v-card-actions>
+      <v-card-actions v-if="checkPermission('chronos.edit_substitution_rule')">
         <edit-button
           i18n-key="chronos.event.amend.button"
           @click="amendEvent.open = true"
@@ -113,10 +113,11 @@
           :get-patch-data="transformPatchData"
           :edit-item="initPatchData"
           @cancel="amendEvent.open = false"
-          @save="$emit('refreshCalendar')"
+          @save="onAmendSave()"
         >
-          <template #subject.field="{ attrs, on }">
+          <template #subject.field="{ attrs, on, item }">
             <v-autocomplete
+              :disabled="item.cancelled"
               :items="amendableSubjects"
               item-text="name"
               item-value="id"
@@ -124,8 +125,9 @@
               v-on="on"
             />
           </template>
-          <template #teachers.field="{ attrs, on }">
+          <template #teachers.field="{ attrs, on, item }">
             <v-autocomplete
+              :disabled="item.cancelled"
               multiple
               :items="amendableTeachers"
               item-text="fullName"
@@ -136,8 +138,9 @@
               deletable-chips
             />
           </template>
-          <template #rooms.field="{ attrs, on }">
+          <template #rooms.field="{ attrs, on, item }">
             <v-autocomplete
+              :disabled="item.cancelled"
               multiple
               :items="amendableRooms"
               item-text="name"
@@ -161,6 +164,7 @@
 </template>
 
 <script>
+import permissionsMixin from "aleksis.core/mixins/permissions.js";
 import calendarFeedDetailsMixin from "aleksis.core/mixins/calendarFeedDetails.js";
 import BaseCalendarFeedDetails from "aleksis.core/components/calendar/BaseCalendarFeedDetails.vue";
 import CalendarStatusChip from "aleksis.core/components/calendar/CalendarStatusChip.vue";
@@ -191,7 +195,7 @@ export default {
     EditButton,
     DialogObjectForm,
   },
-  mixins: [calendarFeedDetailsMixin, lessonEvent],
+  mixins: [permissionsMixin, calendarFeedDetailsMixin, lessonEvent],
   data() {
     return {
       amendEvent: {
@@ -246,14 +250,18 @@ export default {
         cancelled: cancelled ? true : false,
       };
     },
+    onAmendSave() {
+      this.$emit('refreshCalendar');
+      this.model = false;
+    },
   },
   computed: {
     initPatchData() {
       return {
         id: this.selectedEvent.meta.id,
-        subject: this.selectedEvent.meta.subject,
-        teachers: this.selectedEvent.meta.teachers,
-        rooms: this.selectedEvent.meta.rooms,
+        subject: this.selectedEvent.meta.subject?.id.toString(),
+        teachers: this.selectedEvent.meta.teachers.map((teacher) => teacher.id.toString()),
+        rooms: this.selectedEvent.meta.rooms.map((room) => room.id.toString()),
         cancelled: this.selectedEvent.meta.cancelled,
         comment: this.selectedEvent.meta.comment,
       };
@@ -264,5 +272,8 @@ export default {
     amendableTeachers: gqlPersons,
     amendableRooms: gqlRooms,
   },
+  mounted() {
+    this.addPermissions(["chronos.edit_substitution_rule"]);
+  },
 };
 </script>