diff --git a/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.graphql b/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.graphql
index 9e9c68b020425ab906eeec3b62895757e3b3895e..aecf2aa39d7497f46038e8cb45303950722317be 100644
--- a/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.graphql
+++ b/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.graphql
@@ -37,6 +37,10 @@ query CourseBook($lessonId: ID!) {
     week
     lessonPeriod {
       id
+      period {
+        id
+        period
+      }
     }
     event {
       id
diff --git a/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue b/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue
index 879ffd1cd06a437c46cf421f0db36a2622af1d7e..f4411f02a6f00285929b3bf20456f79770451788 100644
--- a/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue
+++ b/aleksis/apps/alsijil/assets/components/coursebook/CourseBook.vue
@@ -13,13 +13,13 @@
           <v-subheader>{{ data.lesson.subject.name }}</v-subheader>
           <v-row>
             <v-col cols="12">
-              <lesson-documentations-week
-                :lessonDocumentations="data.lessonDocumentations"
-                :plannedLessonperiodsDatetimes="data.lesson.plannedLessonperiodsDatetimes"
+              <lesson-documentations
+                :lesson-documentations="data.lessonDocumentations"
+                :planned-lesson-periods-date-times="data.lesson.plannedLessonperiodsDatetimes"
                 :groups="data.lesson.groups"
-                :excuseTypes="data.excuseTypes"
-                :extraMarks="data.extraMarks"
-                :documentLessonTopicsByWeek="documentlessontopicsbyweek"
+                :excuse-types="data.excuseTypes"
+                :extra-marks="data.extraMarks"
+                :save-lesson-documentations-per-week="saveLessonDocumentationsPerWeek"
               />
             </v-col>
           </v-row>
@@ -40,15 +40,13 @@
 import {CHANGES, SAVED, UPDATING} from "../../UpdateStatuses.js";
 import UpdateIndicator from "./UpdateIndicator.vue";
 import LessonDocumentations from "./LessonDocumentations.vue";
-import LessonDocumentationsWeek from "./LessonDocumentationsWeek.vue";
 
 export default {
     components: {
         UpdateIndicator,
         LessonDocumentations,
-        LessonDocumentationsWeek,
     },
-    props: [ "documentlessontopicsbyweek" ],
+    props: [ "saveLessonDocumentationsPerWeek" ],
     methods: {
         processDataChange(event) {
             this.status = CHANGES;
@@ -70,9 +68,6 @@ export default {
                 this.status = SAVED;
             }, 500)
         },
-        weekView() {
-          return this.documentlessontopicsbyweek === "True"
-        },
     },
     name: "course-book",
     data: () => {
diff --git a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentation.vue b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentation.vue
index 0f86a96fa7e59dc5249a85994f2bb898034223a1..ceaa3a6aae5bf004938812c6b44730b9fe78d50d 100644
--- a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentation.vue
+++ b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentation.vue
@@ -7,7 +7,13 @@
     <template v-slot="{ mutate, loading, error }">
       <v-card elevation="2" :loading="loading">
         <v-form v-model="valid">
-          <v-card-title>
+          <v-card-title v-if="saveLessonDocumentationsPerWeek === 'True'">
+            <span
+              v-text="getWeekText(lessonDocumentationEdit)"
+              class="ma-1">
+            </span>
+          </v-card-title>
+          <v-card-title v-else>
             <v-hover v-slot="{ hover }">
               <div>
                 <v-menu
@@ -37,7 +43,7 @@
                 </v-menu>
               </div>
             </v-hover>
-            <v-hover v-slot="{ hover }">
+            <v-hover v-slot="{ hover }" v-if="!(saveLessonDocumentationsPerWeek === 'True')">
               <div>
                 <v-menu offset-y>
                   <template v-slot:activator="{ on, attrs }">
@@ -69,7 +75,7 @@
           </v-card-title>
           <v-card-text>
             <v-row>
-              <v-col cols="12" md="8" lg="8">
+              <v-col cols="12" md="12" lg="12">
                 <message-box type="error" v-if="error">Error updating data</message-box>
                 <v-textarea
                     name="input-7-1"
@@ -97,7 +103,7 @@
                     v-model="lessonDocumentationEdit.groupNote"
                 ></v-textarea>
               </v-col>
-              <v-col cols="12" md="4" lg="4">
+              <v-col v-if="!(saveLessonDocumentationsPerWeek === 'True')" cols="12" md="4" lg="4">
                 Personal notes
                 <personal-notes
                     :lesson-documentation-id="lessonDocumentationEdit.id"
@@ -138,7 +144,7 @@ import PersonalNotes from "./PersonalNotes.vue";
 
 export default {
   components: {PersonalNotes},
-  props: ["lessonDocumentationEdit", "groups", "excuseTypes", "extraMarks"],
+  props: ["lessonDocumentationEdit", "groups", "excuseTypes", "extraMarks", "saveLessonDocumentationsPerWeek", "getWeekText"],
   name: "lesson-documentation",
   data() {
     return {
diff --git a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue
index c89c3491e900c28f2f967edc24b2176afbbe84b5..a93707eafbb8a77c7651b5e2f7b290a704eb1b12 100644
--- a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue
+++ b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentations.vue
@@ -7,10 +7,19 @@
       <v-row>
         <v-col cols="6">
           <v-select
-            :items="emptyLessonperiods"
+            v-if="saveLessonDocumentationsPerWeek === 'True'"
+            :items="emptyLessonPeriods"
+            label="Choose week"
+            :item-text="getWeekText"
+            item-value="datetimeStart"
+            v-model="selectedLessonPeriodDatetime"
+          ></v-select>
+          <v-select
+            v-else
+            :items="emptyLessonPeriods"
             label="Choose Lesson date"
             :item-text="getLessonText"
-            v-model="selectedLessonperiodDatetime"
+            v-model="selectedLessonPeriodDatetime"
             return-object
           ></v-select>
         </v-col>
@@ -22,33 +31,57 @@
             v-on="on"
             @click="createLessonDocumentation()"
           >
-            Create Lesson Documentation
+            {{ $root.django.gettext("Create lesson documentation") }}
           </v-btn>
         </v-col>
       </v-row>
     </template>
     <lesson-documentation
-      :lessonDocumentationEdit="lessonDocumentationEdit"
+      :lesson-documentation-edit="lessonDocumentationEdit"
       :groups="groups"
       :excuse-types="excuseTypes"
       :extra-marks="extraMarks"
+      :save-lesson-documentations-per-week="saveLessonDocumentationsPerWeek"
+      :get-week-text="getWeekText"
       @cancel-lesson-documentation-dialog="cancelDialog"
     />
   </v-dialog>
   <v-data-table
     :headers="headers"
-    :items="lessonDocumentations"
+    :items="computedLessonDocumentations"
     @click:row="editLessonDocumentation"
     class="elevation-1"
     :expanded.sync="expanded"
     show-expand
+    multi-sort
+    :sort-by="['year','week']"
+    :sort-desc="[true, true]"
   >
     <template v-slot:item.period="{ item }">
-      <span class="text-no-wrap">{{ item.date }} Period {{ item.period }}</span>
+      <span class="text-no-wrap">{{ (saveLessonDocumentationsPerWeek === "True") ? getWeekText(item) : getLessonText(item) }}</span>
     </template>
     <template v-slot:expanded-item="{ headers, item }">
       <td :colspan="headers.length">
-        <template v-for="personalNote in item.personalNotes">
+        <template v-if="saveLessonDocumentationsPerWeek === 'True'" v-for="lessonDocumentation in item.documentations">
+          <v-list-item>
+            <v-list-item-content>
+              <v-list-item-title>{{ getLessonText(lessonDocumentation) }}</v-list-item-title>
+              <v-list-item-action>
+                <personal-notes
+                    :lesson-documentation-id="lessonDocumentation.id"
+                    :groups="groups"
+                    :excuse-types="excuseTypes"
+                    :extra-marks="extraMarks"
+
+                    v-model="lessonDocumentation.personalNotes"
+                    @change="$emit('change-personal-notes', $event)"
+                ></personal-notes>
+              </v-list-item-action>
+            </v-list-item-content>
+          </v-list-item>
+          <v-divider></v-divider>
+        </template>
+        <template v-else v-for="personalNote in item.personalNotes">
 <!--          FIXME: Add edit and delete functionality to personal note chips-->
           <v-chip class="ma-1" v-if="personalNoteString(personalNote)">
             {{ personalNote.person.fullName }}: {{ personalNoteString(personalNote) }}
@@ -61,9 +94,10 @@
 
 <script>
   import LessonDocumentation from "./LessonDocumentation.vue";
+  import PersonalNotes from "./PersonalNotes.vue";
   export default {
-    components: { LessonDocumentation },
-    props: [ "lessonDocumentations","plannedLessonperiodsDatetimes",  "groups", "excuseTypes", "extraMarks", "documentLessonTopicsByWeek" ],
+    components: {LessonDocumentation, PersonalNotes},
+    props: [ "lessonDocumentations", "plannedLessonPeriodsDateTimes",  "groups", "excuseTypes", "extraMarks", "saveLessonDocumentationsPerWeek" ],
     name: "lesson-documentations",
     data () {
       return {
@@ -77,15 +111,62 @@
           { text: "Personal notes", value: "data-table-expand" }
         ],
         lessonDocumentationEdit: {},
-        selectedLessonperiodDatetime: {},
+        selectedLessonPeriodDatetime: {},
         recordedWeeks: [],
       }
     },
     computed: {
-      emptyLessonperiods() {
-        let currentDatetime = new Date()
-        return this.plannedLessonperiodsDatetimes.filter(lp => new Date(lp.datetimeStart) > currentDatetime)
+      emptyLessonPeriods() {
+        if (this.saveLessonDocumentationsPerWeek === "True") {
+          let currentDatetime = new Date()
+          let weeks = {}
+          let lpdts = this.plannedLessonPeriodsDateTimes.filter(lp => new Date(lp.datetimeStart) > currentDatetime)
+          for (let ldIndex in lpdts) {
+            let ld = lpdts[ldIndex]
+            if (ld.week in weeks) {
+              weeks[ld.week]["planned"].push(ld)
+            } else {
+              weeks[ld.week] = {
+                "year": ld.year,
+                "week": ld.week,
+                "startDate": this.calculateStartDateOfCW(ld.year, ld.week),
+                "datetimeStart": ld.datetimeStart,
+                "lessonPeriod": ld.lessonPeriod,
+                "planned": [ld]
+              }
+            }
+          }
+          return Object.values(weeks) // FIXME sort by date
+        } else {
+          let currentDatetime = new Date()
+          return this.plannedLessonPeriodsDateTimes.filter(lp => new Date(lp.datetimeStart) > currentDatetime)
+        }
       },
+      computedLessonDocumentations() {
+        if (this.saveLessonDocumentationsPerWeek === "True") {
+          let weeks = {}
+          for (let ldIndex in this.lessonDocumentations) {
+            let ld = this.lessonDocumentations[ldIndex]
+            if (ld.week in weeks) {
+              weeks[ld.week]["documentations"].push(ld)
+            } else {
+              weeks[ld.week] = {
+                "id": ld.id,
+                "startDate": this.calculateStartDateOfCW(ld.year, ld.week),
+                "year": ld.year,
+                "week": ld.week,
+                "topic": ld.topic,
+                "homework": ld.homework,
+                "groupNote": ld.groupNote,
+                "documentations": [ld]
+              }
+            }
+          }
+          return Object.values(weeks)
+        } else {
+          return this.lessonDocumentations
+        }
+      }
     },
     methods: {
       cancelDialog() {
@@ -93,12 +174,10 @@
         this.lessonDocumentationEdit = {};
       },
       recordDocumentation(item) {
-        if (this.documentLessonTopicsByWeek === "True") {
-          if (this.recordedWeeks.includes(item.week)) {
-            return false
-          }
-          this.recordedWeeks.push(item.week)
+        if (this.recordedWeeks.includes(item.week)) {
+          return false
         }
+        this.recordedWeeks.push(item.week)
         return true
       },
       async loadLessonDocumentation(item) {
@@ -130,22 +209,47 @@
       },
 
       editLessonDocumentation(item) {
-        this.loadLessonDocumentation(item)
+        if (this.saveLessonDocumentationsPerWeek === "True") {
+          this.loadLessonDocumentation(item.documentations[0])
+        } else {
+          this.loadLessonDocumentation(item)
+        }
         this.dialog = true
       },
 
       createLessonDocumentation() { // FIXME: Update cache to show newly created LessonDocumentation in table
-        let lessonDocumentation = this.selectedLessonperiodDatetime
+        let lessonDocumentation = this.selectedLessonPeriodDatetime
         lessonDocumentation["event"] = null
         lessonDocumentation["extraLesson"] = null
         this.loadLessonDocumentation(lessonDocumentation)
         this.dialog = true
       },
 
+      calculateStartDateOfCW(year, week){
+        let ld_date = new Date(Date.UTC(year, 0, 1 + (week - 1) * 7));
+        let dow = ld_date.getDay();
+        let start_date = ld_date;
+        if (dow <= 4)
+          return start_date.setDate(ld_date.getDate() - ld_date.getDay() + 1)
+        else
+          return start_date.setDate(ld_date.getDate() + 8 - ld_date.getDay())
+      },
+
       getLessonText(item) {
-          let date_obj = new Date(item.datetimeStart)
-          let period = item.lessonPeriod ? ", Period " + item.lessonPeriod.period.period : "" // FIXME: Cases without lessonPeriod
-          return date_obj.toLocaleDateString(this.$root.languageCode) + period
+        let date_obj = new Date(item.hasOwnProperty("datetimeStart") ? item.datetimeStart : item.date)
+        let period = item.lessonPeriod ? ", " + this.$root.django.gettext('period') + " " + item.lessonPeriod.period.period : "" // FIXME: Cases without lessonPeriod
+        return date_obj.toLocaleDateString(this.$root.languageCode) + period
+      },
+      getWeekText(item) {
+        if (item.hasOwnProperty("startDate")) {
+          var start_date = new Date(item.startDate)
+        } else {
+          let lesson_date = new Date(item.date)
+          var start_date = new Date(((lesson_date.getDay() || 7) !== 1) ? lesson_date.setHours(-24 * (lesson_date.getDay() - 1)) : lesson_date)
+        }
+        let end_date = new Date(start_date)
+        end_date.setDate(end_date.getDate() + 7)
+        return start_date.toLocaleDateString(this.$root.languageCode) + " - " + end_date.toLocaleDateString(this.$root.languageCode) + ", " + this.$root.django.gettext('CW') + " " + item.week
       },
       personalNoteString(personalNote) {
           let personalNoteString = "";
@@ -153,10 +257,10 @@
               personalNoteString += personalNote.late + " min. ";
           }
           if (personalNote.absent) {
-              personalNoteString += "abwesend ";
+              personalNoteString += this.$root.django.gettext("abwesend") + " ";
           }
           if (personalNote.excused) {
-              personalNoteString += "entschuldigt ";
+              personalNoteString += this.$root.django.gettext("entschuldigt") + " ";
           }
           if (personalNote.excuseType) {
               personalNoteString += personalNote.excuseType.name;
diff --git a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentationsWeek.vue b/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentationsWeek.vue
deleted file mode 100644
index 73de93b4815833085a100538523913b01552e48a..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/assets/components/coursebook/LessonDocumentationsWeek.vue
+++ /dev/null
@@ -1,206 +0,0 @@
-<template><div>
-  <v-dialog
-    v-model="dialog"
-    max-width="800"
-  >
-    <template v-slot:activator="{ on, attrs }">
-      <v-row>
-        <v-col cols="6">
-          <v-select
-            :items="emptyLessonperiods"
-            label="Choose Lesson date"
-            :item-text="getLessonText"
-            v-model="selectedLessonperiodDatetime"
-            return-object
-          ></v-select>
-        </v-col>
-        <v-col>
-          <v-btn
-            color="primary"
-            dark
-            v-bind="attrs"
-            v-on="on"
-            @click="createLessonDocumentation()"
-          >
-            Create Lesson Documentation
-          </v-btn>
-        </v-col>
-      </v-row>
-    </template>
-    <lesson-documentation
-      :lessonDocumentationEdit="lessonDocumentationEdit"
-      :groups="groups"
-      :excuse-types="excuseTypes"
-      :extra-marks="extraMarks"
-    />
-  </v-dialog>
-  <v-data-table
-    :headers="headers"
-    :items="lessonDocumentationGroups"
-    @click:row="editLessonDocumentation"
-    class="elevation-1"
-    :expanded.sync="expanded"
-    show-expand
-  >
-    <template v-slot:item.period="{ item }">
-      <span class="text-no-wrap">{{ item.date }} Period {{ item.period }}</span>
-    </template>
-    <template v-slot:expanded-item="{ headers, item }">
-      <td :colspan="headers.length" v-for="ld in item.documentations">
-        <template v-for="personalNote in ld.personalNotes">
-          <v-chip class="ma-1" close v-if="personalNoteString(personalNote)">
-            {{ personalNote.person.fullName }}: {{ personalNoteString(personalNote) }}
-          </v-chip>
-        </template>
-      </td>
-    </template>
-</v-data-table>
-</div></template>
-
-<script>
-  import LessonDocumentation from "./LessonDocumentation.vue";
-  export default {
-    components: { LessonDocumentation },
-    props: [ "lessonDocumentations","plannedLessonperiodsDatetimes",  "groups", "excuseTypes", "extraMarks" ],
-    name: "lesson-documentations",
-    data () {
-      return {
-        dialog: false,
-        expanded: [],
-        headers: [
-          { text: "Period", value: "period" },
-          { text: "Topic", value: "topic" },
-          { text: "Homework", value: "homework" },
-          { text: "Group note", value: "groupNote" },
-          { text: "Personal notes", value: "data-table-expand" }
-        ],
-        lessonDocumentationEdit: {},
-        selectedLessonperiodDatetime: {},
-        recordedWeeks: [],
-      }
-    },
-    computed: {
-      emptyLessonperiods() {
-        let currentDatetime = new Date()
-        let groups = {}
-        let lpdts = this.plannedLessonperiodsDatetimes.filter(lp => new Date(lp.datetimeStart > currentDatetime))
-        for (let ldIndex in lpdts) {
-          let ld = lpdts[ldIndex]
-          if (ld.week in groups) {
-            groups[ld.week]["planned"].push(ld)
-          } else {
-            groups[ld.week] = {
-              "year": ld.year,
-              "week": ld.week,
-              "datetimeStart": ld.datetimeStart,
-              "lessonPeriod": ld.lessonPeriod,
-              "planned": [ld]
-            }
-          }
-        }
-        return Object.values(groups) // FIXME sort by date
-      },
-      lessonDocumentationGroups() {
-        let groups = {}
-        for (let ldIndex in this.lessonDocumentations) {
-          let ld = this.lessonDocumentations[ldIndex]
-          if (ld.week in groups) {
-            groups[ld.week]["documentations"].push(ld)
-          } else {
-            groups[ld.week] = {
-              "id": ld.id,
-              "date": ld.date,
-              "period": ld.period,
-              "topic": ld.topic,
-              "homework": ld.homework,
-              "groupNote": ld.groupNote,
-              "documentations": [ld]
-            }
-          }
-        }
-        return Object.values(groups)
-      },
-    },
-    methods: {
-      recordDocumentation(item) {
-        if (this.recordedWeeks.includes(item.week)) {
-          return false
-        }
-        this.recordedWeeks.push(item.week)
-        return true
-      },
-      async loadLessonDocumentation(item) {
-        const result = await this.$apollo.mutate({
-          mutation: require("./LessonDocumentation.graphql"),
-          variables: {
-            year: item.year,
-            week: item.week,
-            lessonPeriodId: item.lessonPeriod ? item.lessonPeriod.id : null,
-            eventId: item.event ? item.event.id : null,
-            extraLessonId: item.extraLesson ? item.extraLesson.id : null,
-          },
-        })
-        let lessonDocumentation = result.data.updateOrCreateLessonDocumentation.lessonDocumentation
-        this.lessonDocumentationEdit = {
-          id: lessonDocumentation.id,
-          year: item.year,
-          week: item.week,
-          date: lessonDocumentation.date,
-          lessonPeriodId: item.lessonPeriod ? item.lessonPeriod.id : null,
-          eventId: item.event ? item.event.id : null,
-          extraLessonId: item.extraLesson ? item.extraLesson.id : null,
-          topic: lessonDocumentation.topic,
-          homework: lessonDocumentation.homework,
-          groupNote: lessonDocumentation.groupNote,
-          personalNotes: lessonDocumentation.personalNotes,
-        }
-      },
-
-      editLessonDocumentation(item) {
-        this.loadLessonDocumentation(item)
-        this.dialog = true
-      },
-
-      createLessonDocumentation() { // FIXME: Update cache to show newly created LessonDocumentation in table
-        let lessonDocumentation = this.selectedLessonperiodDatetime
-        lessonDocumentation["event"] = null
-        lessonDocumentation["extraLesson"] = null
-        this.loadLessonDocumentation(lessonDocumentation)
-        this.dialog = true
-      },
-
-      getLessonText(item) {
-          let date_obj = new Date(item.datetimeStart)
-          let period = item.lessonPeriod ? ", Period " + item.lessonPeriod.period.period : "" // FIXME: Cases without lessonPeriod
-          return date_obj.toLocaleDateString(this.$root.languageCode) + period
-      },
-      personalNoteString(personalNote) {
-          let personalNoteString = "";
-          if (personalNote.late > 0) {
-              personalNoteString += personalNote.late + " min. ";
-          }
-          if (personalNote.absent) {
-              personalNoteString += "abwesend ";
-          }
-          if (personalNote.excused) {
-              personalNoteString += "entschuldigt ";
-          }
-          if (personalNote.excuseType) {
-              personalNoteString += personalNote.excuseType.name;
-          }
-          if (personalNote.extraMarks.length > 0) {
-              personalNoteString += " (";
-              personalNote.extraMarks.forEach(item => {
-                  personalNoteString += item.name + ", ";
-              });
-              personalNoteString = personalNoteString.substring(0, personalNoteString.length - 2);
-              personalNoteString += ") ";
-          }
-          if (personalNote.remarks) {
-              personalNoteString += "\"" + personalNote.remarks + "\" ";
-          }
-          return personalNoteString;
-      },
-    }
-  }
-</script>
diff --git a/aleksis/apps/alsijil/assets/index.js b/aleksis/apps/alsijil/assets/index.js
index b191fd63f5b0850df21a160eb85bfef2f244ab50..2030ee27683c60b07a77058b1b93e8c4ae716d69 100644
--- a/aleksis/apps/alsijil/assets/index.js
+++ b/aleksis/apps/alsijil/assets/index.js
@@ -1,3 +1,3 @@
 import CourseBook from './components/coursebook/CourseBook.vue'
 
-window.router.addRoute({ path: "/app/alsijil/coursebook/:lessonId", component: CourseBook });
+window.router.addRoute({ path: "/app/alsijil/coursebook/:lessonId", component: CourseBook, props: true });
diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index 4ef9b4e24e7315c75cd6106b72f3853410e9ef7b..3c5630cbfc1653db99107159e1b8834507a27a6d 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -47,7 +47,7 @@ class LessonDocumentationForm(forms.ModelForm):
         self.fields["homework"].label = _("Homework for the next lesson")
         if (
             self.instance.lesson_period
-            and get_site_preferences()["alsijil__allow_carry_over_same_week"]
+            and get_site_preferences()["alsijil__save_lesson_documentations_by_week"]
         ):
             self.fields["carry_over_week"] = forms.BooleanField(
                 label=_("Carry over data to all other lessons with the same subject in this week"),
@@ -58,7 +58,7 @@ class LessonDocumentationForm(forms.ModelForm):
     def save(self, **kwargs):
         lesson_documentation = super(LessonDocumentationForm, self).save(commit=True)
         if (
-            get_site_preferences()["alsijil__allow_carry_over_same_week"]
+            get_site_preferences()["alsijil__save_lesson_documentations_by_week"]
             and self.cleaned_data["carry_over_week"]
             and (
                 lesson_documentation.topic
@@ -68,7 +68,7 @@ class LessonDocumentationForm(forms.ModelForm):
             and lesson_documentation.lesson_period
         ):
             lesson_documentation.carry_over_data(
-                LessonPeriod.objects.filter(lesson=lesson_documentation.lesson_period.lesson)
+                LessonPeriod.objects.filter(lesson=lesson_documentation.lesson_period.lesson), True
             )
 
 
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index b504a294164a6388099148fda5149091767577a7..ed79ee912c0e581021be74c3505a7daed13cf2eb 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -347,11 +347,13 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
     homework = models.CharField(verbose_name=_("Homework"), max_length=200, blank=True)
     group_note = models.CharField(verbose_name=_("Group note"), max_length=200, blank=True)
 
-    def carry_over_data(self, all_periods_of_lesson: LessonPeriod):
-        """Carry over data to given periods in this lesson if data is not already set.
+    def carry_over_data(self, all_periods_of_lesson: LessonPeriod, force: bool):
+        """Carry over data to given periods in this lesson.
+
+        Does overwrite existing data in case ``force`` is set to ``True``.
 
         Both forms of carrying over data can be deactivated using site preferences
-        ``alsijil__carry_over_next_periods`` and ``alsijil__allow_carry_over_same_week``
+        ``alsijil__carry_over_next_periods`` and ``alsijil__save_lesson_documentations_by_week``
         respectively.
         """
         for period in all_periods_of_lesson:
@@ -361,15 +363,15 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
 
             changed = False
 
-            if not lesson_documentation.topic:
+            if not lesson_documentation.topic or force:
                 lesson_documentation.topic = self.topic
                 changed = True
 
-            if not lesson_documentation.homework:
+            if not lesson_documentation.homework or force:
                 lesson_documentation.homework = self.homework
                 changed = True
 
-            if not lesson_documentation.group_note:
+            if not lesson_documentation.group_note or force:
                 lesson_documentation.group_note = self.group_note
                 changed = True
 
@@ -390,7 +392,8 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
                 LessonPeriod.objects.filter(
                     lesson=self.lesson_period.lesson,
                     period__weekday=self.lesson_period.period.weekday,
-                )
+                ),
+                False
             )
         super().save(*args, **kwargs)
 
diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py
index 634598b1efd054ad68d8a9ae644ab51d2340f479..014435f1b3072ab8804e2e57d1fdb6c7d135bca7 100644
--- a/aleksis/apps/alsijil/preferences.py
+++ b/aleksis/apps/alsijil/preferences.py
@@ -67,25 +67,11 @@ class CarryOverDataToNextPeriods(BooleanPreference):
 
 
 @site_preferences_registry.register
-class AllowCarryOverLessonDocumentationToCurrentWeek(BooleanPreference):
+class SaveLessonDocumentationsPerWeek(BooleanPreference):
     section = alsijil
-    name = "allow_carry_over_same_week"
+    name = "save_lesson_documentations_by_week"
     default = False
-    verbose_name = _(
-        "Allow carrying over data from any lesson period to all other lesson \
-                periods with the same lesson and in the same week"
-    )
-    help_text = _(
-        "This will carry over data only if the data in the aforementioned periods are empty."
-    )
-
-
-@site_preferences_registry.register
-class DocumentLessonTopicsByWeek(BooleanPreference):
-    section = alsijil
-    name = "document_lesson_topics_by_week"
-    default = False
-    verbose_name = _("Document lesson topics per week instead of per lesson period")
+    verbose_name = _("Save lesson documentations per week instead of per lesson period")
 
 
 @site_preferences_registry.register
diff --git a/aleksis/apps/alsijil/schema.py b/aleksis/apps/alsijil/schema.py
index 8654967fe36a80cae721f7306dd8db9b82076db4..5864f7f02341f7dbb0837b27a5b225f9e579ffd9 100644
--- a/aleksis/apps/alsijil/schema.py
+++ b/aleksis/apps/alsijil/schema.py
@@ -114,7 +114,7 @@ class LessonDocumentationMutation(graphene.Mutation):
         lesson_documentation.save()
 
         if (
-            get_site_preferences()["alsijil__document_lesson_topics_by_week"]
+            get_site_preferences()["alsijil__save_lesson_documentations_by_week"]
             and (
                 lesson_documentation.topic
                 or lesson_documentation.homework
@@ -123,7 +123,7 @@ class LessonDocumentationMutation(graphene.Mutation):
             and lesson_documentation.lesson_period
         ):
             lesson_documentation.carry_over_data(
-                LessonPeriod.objects.filter(lesson=lesson_documentation.lesson_period.lesson)
+                LessonPeriod.objects.filter(lesson=lesson_documentation.lesson_period.lesson), True
             )
 
         return LessonDocumentationMutation(lesson_documentation=lesson_documentation)
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/coursebook.html b/aleksis/apps/alsijil/templates/alsijil/class_register/coursebook.html
index b30133faa18b79bb0dbc7c489ba042c4d04b79ee..a670eb5d21ca03b7e444ce19782c14c2dc19b944 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/coursebook.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/coursebook.html
@@ -9,7 +9,7 @@
 {% endblock %}
 {% block browser_title %}{% trans "Coursebook" %} {{ lesson }}{% endblock %}
 {% block content %}
-<router-view documentlessontopicsbyweek="{{ documentLessonTopicsByWeek }}"/><!-- FIXME -->
+<router-view save-lesson-documentations-per-week={{ SITE_PREFERENCES.alsijil__save_lesson_documentations_by_week }} />
 {% endblock %}
 
 {% block extra_body %}
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index cd27ebe15b56930fdaecbb74967dd741e781fea7..0f44426d1e4cd575455959a5e4f2688a83f2e7ec 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -1365,9 +1365,6 @@ class CoursebookView(DetailView):
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
-        context["documentLessonTopicsByWeek"] = get_site_preferences()[
-            "alsijil__document_lesson_topics_by_week"
-        ]
         return context