diff --git a/.prettierignore b/.prettierignore
index de783fc60a1ca5f6e25204bb7a51eab815bc77ce..bba3a420ca59cd6361aea639785e5236ed546759 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -92,3 +92,5 @@ aleksis/core/util/licenses.json
 
 .pnp.cjs
 .pnp.loader.mjs
+
+.git/
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 0cfde1b5162db68f85d762f17fa34375ec09c9a0..d58e466b99296765d1b74fb19eb350e5e67b15ea 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -6,12 +6,13 @@ All notable changes to this project will be documented in this file.
 The format is based on `Keep a Changelog`_,
 and this project adheres to `Semantic Versioning`_.
 
-Unreleased
-----------
+`4.0.0.dev0`_ - 2024-04-23
+--------------------------
 
 Notable, breaking changes
 ~~~~~~~~~~~~~~~~~~~~~~~~~
-Starting from the class register core functionality, `AlekSIS-App-Alsijil` is getting a entire rewrite
+
+Starting from the class register core functionality, Alsijil is getting a entire rewrite
 of both its frontend and backend. The models formerly used for lesson documentation, notably
 `LessonDocumentation` and `PersonalNote` are replaced by new ones based on the calendar framework
 provided by `AlekSIS-Core` and the absense framework provided by `AlekSIS-App-Kolego`. The legacy
@@ -20,15 +21,16 @@ there exists no migration path away from legacy data.
 
 Changed
 ~~~~~~~
-* Rewrite of class register/coursebook, both in the frontend and the backend
-  * Several legacy class register views were consolidated in one Vue.js based frontend (coursebook).
+
+* Modern rewrite of class register/coursebook, both in the frontend and the backend
+  * Several legacy class register views were consolidated in a modern frontend (coursebook).
   * [Dev] The `LessonDocumentation` model is replaced with the `Documentation` model, based on the calendar framework.
   * [Dev] The `PersonalNote` model is replaced with the `NewPersonalNote` model.
   * [Dev] Participation status documentation is taken over by the new `Participation` model.
 
-
 Fixed
 ~~~~~
+
 * Migrating failed due to an incorrect field reference.
 
 `3.0`_ - 2023-05-15
@@ -341,3 +343,4 @@ Fixed
 .. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1.1
 .. _3.0b0: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/3.0b0
 .. _3.0: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/3.0
+.. _4.0.0.dev0: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/4.0.0.dev0
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
index af143a59af433bba0d8ed87fa8beccabbbac6dfe..4e673db88090f473f2bc036bd128881327d21fc3 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -333,11 +333,16 @@ export default {
         // Also intersect handler does not always react to scrollIntoView
         this.setDate(date);
         present.focus("smooth");
-      } else if (
-        !this.findPrev(DateTime.fromISO(date)) ||
-        !this.findNext(DateTime.fromISO(date))
-      ) {
-        this.resetDate(date);
+      } else {
+        const prev = this.findPrev(DateTime.fromISO(date));
+        const next = this.findNext(DateTime.fromISO(date));
+        if (prev && next) {
+          // In between two present days -> goto prev
+          this.gotoDate(prev.toISODate());
+        } else {
+          // Outsite present day range
+          this.resetDate(date);
+        }
       }
     },
     gotoPrev() {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
index 14411e9ce9c1c2780402890a80aa907b246262ff..2f15c3fd031c62ff9fc96cf5c35042f2274d3321 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
@@ -1,13 +1,14 @@
 <template>
-  <v-list-item :style="{ scrollMarginTop: '145px' }" two-line>
+  <v-list-item :style="{ scrollMarginTop: '145px' }" two-line class="px-0">
     <v-list-item-content>
-      <v-subheader class="text-h6">{{
+      <v-subheader class="text-h6 px-1">{{
         $d(date, "dateWithWeekday")
       }}</v-subheader>
       <v-list max-width="100%" class="pt-0 mt-n1">
         <v-list-item
           v-for="doc in docs"
           :key="'documentation-' + (doc.oldId || doc.id)"
+          class="px-1"
         >
           <documentation-modal
             :documentation="doc"
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
index e5493b07cda406fddbb3fccc89e5d1b42080ab89..b47ebbfbb1d1cd8219686f05085eb0eeb8f453d3 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
@@ -45,6 +45,10 @@
 <script>
 import { coursesOfPerson, groupsByPerson } from "./coursebook.graphql";
 
+const TYPENAMES_TO_TYPES = {
+  CourseType: "course",
+  GroupType: "group",
+};
 export default {
   name: "CoursebookFilters",
   data() {
@@ -73,9 +77,9 @@ export default {
     selectable() {
       return [
         { header: this.$t("alsijil.coursebook.filter.groups") },
-        ...this.groups.map((group) => ({ type: "group", ...group })),
+        ...this.groups,
         { header: this.$t("alsijil.coursebook.filter.courses") },
-        ...this.courses.map((course) => ({ type: "course", ...course })),
+        ...this.courses,
       ];
     },
     selectLoading() {
@@ -86,14 +90,16 @@ export default {
     },
     currentObj() {
       return this.selectable.find(
-        (o) => o.type === this.value.objType && o.id === this.value.objId,
+        (o) =>
+          TYPENAMES_TO_TYPES[o.__typename] === this.value.objType &&
+          o.id === this.value.objId,
       );
     },
   },
   methods: {
     selectObject(selection) {
       this.$emit("input", {
-        objType: selection ? selection.type : null,
+        objType: selection ? TYPENAMES_TO_TYPES[selection.__typename] : null,
         objId: selection ? selection.id : null,
       });
     },
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
index a5136eb9f0c2535009fd78a02e7481aebacd12b4..52866931e7b2d31bbee85bc754a4a668066e8b73 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
@@ -1,12 +1,12 @@
 <template>
   <div>
-    <v-list-item v-for="i in numberOfDays" :key="'i-' + i">
+    <v-list-item v-for="i in numberOfDays" :key="'i-' + i" class="px-0">
       <v-list-item-content>
         <v-list-item-title>
           <v-skeleton-loader type="heading" />
         </v-list-item-title>
         <v-list max-width="100%">
-          <v-list-item v-for="j in numberOfDocs" :key="'j-' + j">
+          <v-list-item v-for="j in numberOfDocs" :key="'j-' + j" class="px-1">
             <DocumentationLoader />
           </v-list-item>
         </v-list>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
index 23e300749e5cf9b8c4902886bba9bbc83bb79433..cb3820dd6a9498ee6662304a6e38ee4111fb3139 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
@@ -1,4 +1,5 @@
 <script>
+import AbsenceReasonButtons from "aleksis.apps.kolego/components/AbsenceReasonButtons.vue";
 import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
 import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReasonGroupSelect.vue";
 import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue";
@@ -14,9 +15,10 @@ export default {
   name: "ManageStudentsDialog",
   extends: MobileFullscreenDialog,
   components: {
-    PersonalNotes,
     AbsenceReasonChip,
     AbsenceReasonGroupSelect,
+    AbsenceReasonButtons,
+    PersonalNotes,
     CancelButton,
     LessonInformation,
     MobileFullscreenDialog,
@@ -27,6 +29,7 @@ export default {
     return {
       dialog: false,
       search: "",
+      loadSelected: false,
       selected: [],
       isExpanded: false,
     };
@@ -44,58 +47,44 @@ export default {
     },
   },
   methods: {
-    sendToServer(participation, field, value) {
+    sendToServer(participations, field, value) {
       if (field !== "absenceReason") return;
 
       this.mutate(
         updateParticipationStatuses,
         {
-          input: [
-            {
-              id: participation.id,
-              absenceReason: value === "present" ? null : value,
-            },
-          ],
+          input: participations.map((participation) => ({
+            id: participation.id,
+            absenceReason: value === "present" ? null : value,
+          })),
         },
         (storedDocumentations, incomingStatuses) => {
-          const newStatus = incomingStatuses[0];
           const documentation = storedDocumentations.find(
-            (doc) => doc.id === newStatus.relatedDocumentation.id,
-          );
-          const participationStatus = documentation.participations.find(
-            (part) => part.id === newStatus.id,
+            (doc) => doc.id === this.documentation.id,
           );
-          participationStatus.absenceReason = newStatus.absenceReason;
-          participationStatus.isOptimistic = newStatus.isOptimistic;
+
+          incomingStatuses.forEach((newStatus) => {
+            const participationStatus = documentation.participations.find(
+              (part) => part.id === newStatus.id,
+            );
+            participationStatus.absenceReason = newStatus.absenceReason;
+            participationStatus.isOptimistic = newStatus.isOptimistic;
+          });
 
           return storedDocumentations;
         },
-        // {
-        //   optimisticResponse: {
-        //     updateParticipationStatuses: {
-        //       items: [
-        //         {
-        //           id: participation.id,
-        //           isOptimistic: true,
-        //           relatedDocumentation: {
-        //             id: this.documentation.id,
-        //             __typename: "DocumentationType",
-        //           },
-        //           absenceReason: value === "present" ? null : {
-        //             id: value,
-        //             name: "",
-        //             shortName: "",
-        //             __typename: "AbsenceReasonType",
-        //           },
-        //           __typename: "ParticipationStatusType",
-        //         },
-        //       ],
-        //       __typename: "ParticipationStatusBatchPatchMutation",
-        //     },
-        //   },
-        // },
       );
     },
+    handleMultipleAction(absenceReasonId) {
+      this.loadSelected = true;
+      this.sendToServer(this.selected, "absenceReason", absenceReasonId);
+      this.$once("save", this.resetMultipleAction);
+    },
+    resetMultipleAction() {
+      this.loadSelected = false;
+      this.$set(this.selected, []);
+      this.$refs.iterator.selected = [];
+    },
   },
 };
 </script>
@@ -112,27 +101,36 @@ export default {
     </template>
 
     <template #title>
-      <lesson-information v-bind="documentationPartProps" />
-      <v-slide-x-transition leave-absolute>
+      <lesson-information v-bind="documentationPartProps" :compact="false" />
+      <v-scroll-x-transition leave-absolute>
         <v-text-field
           v-show="!isExpanded"
           type="search"
           v-model="search"
           clearable
           rounded
-          filled
           hide-details
           single-line
           prepend-inner-icon="$search"
           dense
           outlined
           :placeholder="$t('actions.search')"
-          class="pt-4"
+          class="pt-4 full-width"
         />
-      </v-slide-x-transition>
+      </v-scroll-x-transition>
+      <v-scroll-x-transition>
+        <div v-show="selected.length > 0" class="full-width mt-4">
+          <absence-reason-buttons
+            allow-empty
+            empty-value="present"
+            @input="handleMultipleAction"
+          />
+        </div>
+      </v-scroll-x-transition>
     </template>
     <template #content>
       <slide-iterator
+        ref="iterator"
         v-model="selected"
         :items="items"
         :search="search"
@@ -140,14 +138,16 @@ export default {
           (item) => 'documentation-' + documentation.id + '-student-' + item.id
         "
         :is-expanded.sync="isExpanded"
-        :loading="loadingIndicator"
+        :loading="loadingIndicator || loadSelected"
+        :load-only-selected="loadSelected"
+        :disabled="loading"
       >
         <template #listItemContent="{ item }">
           <v-list-item-title>
             {{ item.person.fullName }}
           </v-list-item-title>
           <v-list-item-subtitle v-if="item.absenceReason">
-            <absence-reason-chip dense :absence-reason="item.absenceReason" />
+            <absence-reason-chip small :absence-reason="item.absenceReason" />
           </v-list-item-subtitle>
         </template>
 
@@ -169,7 +169,7 @@ export default {
               empty-value="present"
               :loadSelectedChip="loading"
               :value="item.absenceReason?.id || 'present'"
-              @input="sendToServer(item, 'absenceReason', $event)"
+              @input="sendToServer([item], 'absenceReason', $event)"
             />
           </v-card-text>
           <v-divider />
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
index 739ff4217df2d82d1765381aae3543277f8f631a..572036c67955b3365bb46eb69f6ab41ee86cf074 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
@@ -41,8 +41,6 @@ export default {
         },
         (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 })
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
index 0d139df42a9bfb5deae3cbb88507a3def37827fa..aafb3409f3f123d19d42aa32a36731a835dbdeb6 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
@@ -12,6 +12,7 @@ mutation updateParticipationStatuses(
         id
         name
         shortName
+        colour
       }
     }
   }
@@ -25,12 +26,14 @@ mutation touchDocumentation($documentationId: ID!) {
         id
         person {
           id
+          firstName
           fullName
         }
         absenceReason {
           id
           name
           shortName
+          colour
         }
         notesWithExtraMark {
           id
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
index 1e5ca9e18ba3dda21b056e5654d798003c17e714..f1c4012c37ffa3ec3d3630978b603c204963a908 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -9,10 +9,6 @@ query coursesOfPerson {
   courses: coursesOfPerson {
     id
     name
-    groups {
-      id
-      name
-    }
   }
 }
 
@@ -74,12 +70,14 @@ query documentationsForCoursebook(
       id
       person {
         id
+        firstName
         fullName
       }
       absenceReason {
         id
         name
         shortName
+        colour
       }
       notesWithExtraMark {
         id
@@ -115,6 +113,21 @@ mutation createOrUpdateDocumentations($input: [DocumentationInputType]!) {
       homework
       groupNote
       oldId
+      participations {
+        id
+        person {
+          id
+          firstName
+          fullName
+        }
+        absenceReason {
+          id
+          name
+          shortName
+          colour
+        }
+        isOptimistic
+      }
     }
   }
 }
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
index 09a04bcb67c6ae618fa0b1546a0171af30323885..652609dccaf430d3a4ab138f80ee2f810b84b4af 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
@@ -61,7 +61,7 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
         v-for="teacher in documentation.teachers"
         :key="documentation.id + '-teacher-' + teacher.id"
         :person="teacher"
-        no-link
+        :no-link="compact"
         v-bind="compact ? dialogActivator.attrs : {}"
         v-on="compact ? dialogActivator.on : {}"
       />
@@ -69,7 +69,7 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
         v-for="teacher in amendedTeachers"
         :key="documentation.id + '-amendedTeacher-' + teacher.id"
         :person="teacher"
-        no-link
+        :no-link="compact"
         v-bind="compact ? dialogActivator.attrs : {}"
         v-on="compact ? dialogActivator.on : {}"
         class="text-decoration-line-through"
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
index 8f40f71b60199a8c10e577d0ae006fbb1af5a7c5..bc0da4a742917e0639a0c1983186fad29764babb 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
@@ -1,33 +1,40 @@
+<script setup>
+import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
+</script>
+
 <template>
   <div
     class="d-flex align-center justify-space-between justify-md-end flex-wrap gap"
   >
-    <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
-    <v-chip dense color="success">
-      <v-chip small dense class="mr-2" color="green darken-3 white--text">
-        {{ documentation.participations.length }}
-      </v-chip>
-      Schüler
-    </v-chip>
-    <v-chip dense color="warning">
-      <v-chip small dense class="mr-2" color="orange darken-3 white--text"
-        >3</v-chip
-      >
-      entschuldigt
+    <v-chip dense color="success" outlined v-if="total > 0">
+      {{ $t("alsijil.coursebook.present_number", { present, total }) }}
     </v-chip>
-    <v-chip dense color="error">
-      <v-chip small dense class="mr-2" color="red darken-3 white--text"
-        >1</v-chip
-      >
-      unentschuldigt
-    </v-chip>
-    <v-chip dense color="grey lighten-1">
-      <v-chip small dense class="mr-2" color="grey darken-1 white--text"
-        >4</v-chip
-      >
-      Hausaufgaben vergessen
-    </v-chip>
-    <!-- eslint-enable @intlify/vue-i18n/no-raw-text -->
+    <absence-reason-chip
+      v-for="[reasonId, participations] in Object.entries(absences)"
+      :key="'reason-' + reasonId"
+      :absence-reason="participations[0].absenceReason"
+      dense
+    >
+      <template #append>
+        <span
+          >:
+          <span>
+            {{
+              participations
+                .slice(0, 5)
+                .map((participation) => participation.person.firstName)
+                .join(", ")
+            }}
+          </span>
+          <span v-if="participations.length > 5">
+            <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
+            +{{ participations.length - 5 }}
+            <!-- eslint-enable @intlify/vue-i18n/no-raw-text -->
+          </span>
+        </span>
+      </template>
+    </absence-reason-chip>
+
     <manage-students-trigger v-bind="documentationPartProps" />
   </div>
 </template>
@@ -40,6 +47,25 @@ export default {
   name: "LessonNotes",
   components: { ManageStudentsTrigger },
   mixins: [documentationPartMixin],
+  computed: {
+    total() {
+      return this.documentation.participations.length;
+    },
+    present() {
+      return this.documentation.participations.filter(
+        (p) => p.absenceReason === null,
+      ).length;
+    },
+    absences() {
+      // Get all course attendants who have an absence reason
+      return Object.groupBy(
+        this.documentation.participations.filter(
+          (p) => p.absenceReason !== null,
+        ),
+        ({ absenceReason }) => absenceReason.id,
+      );
+    },
+  },
 };
 </script>
 
diff --git a/aleksis/apps/alsijil/frontend/messages/de.json b/aleksis/apps/alsijil/frontend/messages/de.json
index e83cccc2c07303305ab2952da4e39caf1575859a..31ae2d9763a98f946aa896a9ab79d5fc8d514a0f 100644
--- a/aleksis/apps/alsijil/frontend/messages/de.json
+++ b/aleksis/apps/alsijil/frontend/messages/de.json
@@ -1,91 +1,95 @@
 {
   "alsijil": {
-    "menu_title": "Klassenbuch",
-    "lesson": {
-      "menu_title": "Aktuelle Unterrichtsstunde"
-    },
-    "week": {
-      "menu_title": "Aktuelle Woche"
-    },
-    "groups": {
-      "menu_title": "Meine Gruppen"
-    },
-    "persons": {
-      "menu_title": "Meine Schülerinnen und Schüler"
-    },
     "absence": {
       "menu_title": "Abwesenheit eintragen"
     },
-    "my_overview": {
-      "menu_title": "Meine Übersicht"
-    },
-    "excuse_types": {
-      "menu_title": "Entschuldigungsarten"
-    },
-    "group_roles": {
-      "menu_title_assign": "Gruppenrollen zuweisen",
-      "menu_title_manage": "Gruppenrollen verwalten"
-    },
-    "extra_marks": {
-      "menu_title": "Zusätzliche Markierungen",
-      "create": "Markierung erstellen",
-      "name": "Markierung",
-      "short_name": "Abkürzung",
-      "colour_fg": "Schriftfarbe",
-      "colour_bg": "Hintergrundfarbe",
-      "show_in_coursebook": "In Kursbuch-Übersicht zeigen",
-      "show_in_coursebook_helptext": "Wenn aktiviert tauchen diese Markierungen in den Zeilen im Kursbuch auf."
-    },
     "all_lessons": {
       "menu_title": "Alle Stunden"
     },
     "coursebook": {
+      "filter": {
+        "courses": "Kurse",
+        "filter_for_obj": "Nach Gruppe und Kurs filtern",
+        "groups": "Gruppen",
+        "missing": "Nur unvollständige Stunden anzeigen",
+        "own": "Nur eigene Stunden anzeigen"
+      },
       "menu_title": "Kursbuch",
+      "no_data": "Keine Stunden der ausgewählten Gruppen und Kurse im aktuellen Zeitraum",
+      "no_results": "Keine Suchergebnisse für {search}",
+      "notices": {
+        "future": "Diese Stunde darf nicht bearbeitet werden, da sie in der Zukunft liegt.",
+        "no_entry": "Für diese Stunde gibt es noch keinen Eintrag."
+      },
       "page_title": "Kursbuch für {name}",
-      "title_plural": "Kursbuch",
       "status": {
         "available": "Kursbucheintrag vorhanden",
+        "cancelled": "Stunde fällt aus",
         "missing": "Kursbucheintrag fehlt",
+        "pending": "Stunde in der Zukunft",
         "running": "Stunde läuft",
-        "substitution": "Vertretungsstunde",
-        "cancelled": "Stunde fällt aus",
-        "pending": "Stunde in der Zukunft"
+        "substitution": "Vertretungsstunde"
       },
       "summary": {
-        "topic": {
-          "label": "Topic",
-          "status": {
-            "success": "Topic saved successfully",
-            "error": "There has been an error while saving the topic: {error}"
-          }
+        "group_note": {
+          "empty": "Keine Gruppennotiz",
+          "label": "Gruppennotiz",
+          "value": "GN: {groupNote}"
         },
         "homework": {
+          "empty": "Keine Hausaufgaben",
           "label": "Hausaufgaben",
-          "value": "HA: {homework}",
-          "empty": "Keine Hausaufgaben"
+          "value": "HA: {homework}"
         },
-        "group_note": {
-          "label": "Gruppennotiz",
-          "value": "GN: {groupNote}",
-          "empty": "Keine Gruppennotiz"
+        "topic": {
+          "label": "Thema",
+          "status": {
+            "error": "Beim Speichern des Themas ist ein Fehler aufgetreten: {error}",
+            "success": "Thema erfolgreich gespeichert"
+          }
         }
       },
-      "filter": {
-        "own": "Nur eigene Stunden anzeigen",
-        "missing": "Nur unvollständige Stunden anzeigen",
-        "groups": "Gruppen",
-        "courses": "Kurse",
-        "filter_for_obj": "Nach Gruppe und Kurs filtern"
-      },
-      "no_data": "Keine Stunden der ausgewählten Gruppen und Kurse im aktuellen Zeitraum",
-      "no_results": "Keine Suchergebnisse für {search}"
+      "title_plural": "Kursbuch",
+      "present_number": "{present}/{total} anwesend"
+    },
+    "excuse_types": {
+      "menu_title": "Entschuldigungsarten"
+    },
+    "extra_marks": {
+      "menu_title": "Zusätzliche Markierungen",
+      "create": "Markierung erstellen",
+      "name": "Markierung",
+      "short_name": "Abkürzung",
+      "colour_fg": "Schriftfarbe",
+      "colour_bg": "Hintergrundfarbe",
+      "show_in_coursebook": "In Kursbuch-Übersicht zeigen",
+      "show_in_coursebook_helptext": "Wenn aktiviert tauchen diese Markierungen in den Zeilen im Kursbuch auf."
     },
     "personal_notes": {
       "note": "Notiz",
       "create_personal_note": "Weitere Notiz",
       "confirm_delete": "Notiz wirklich löschen?",
       "confirm_delete_explanation": "Die Notiz \"{note}\" für {name} wird entfernt."
-
+    },
+    "group_roles": {
+      "menu_title_assign": "Gruppenrollen zuweisen",
+      "menu_title_manage": "Gruppenrollen verwalten"
+    },
+    "groups": {
+      "menu_title": "Meine Gruppen"
+    },
+    "lesson": {
+      "menu_title": "Aktuelle Unterrichtsstunde"
+    },
+    "menu_title": "Klassenbuch",
+    "my_overview": {
+      "menu_title": "Meine Übersicht"
+    },
+    "persons": {
+      "menu_title": "Meine Schüler*innen"
+    },
+    "week": {
+      "menu_title": "Aktuelle Woche"
     }
   },
   "actions": {
diff --git a/aleksis/apps/alsijil/frontend/messages/en.json b/aleksis/apps/alsijil/frontend/messages/en.json
index 8283c4b7c03a33269481c18dce9e32815ac2bcba..5345ca9259606424a42ae4ae222cf72833ef91e6 100644
--- a/aleksis/apps/alsijil/frontend/messages/en.json
+++ b/aleksis/apps/alsijil/frontend/messages/en.json
@@ -81,6 +81,7 @@
         "courses": "Courses",
         "filter_for_obj": "Filter for group and course"
       },
+      "present_number": "{present}/{total} present",
       "no_data": "No lessons for the selected groups and courses in this period",
       "no_results": "No search results for {search}"
     },
diff --git a/aleksis/apps/alsijil/frontend/messages/ru.json b/aleksis/apps/alsijil/frontend/messages/ru.json
index 8fb7aea426577ea2406c1579dbe44b39b70e5ef6..3f20ae686429082b97521d0f36ba0bdca9e6367a 100644
--- a/aleksis/apps/alsijil/frontend/messages/ru.json
+++ b/aleksis/apps/alsijil/frontend/messages/ru.json
@@ -1,36 +1,44 @@
 {
+  "actions": {
+    "back_to_overview": "Назад к обзору"
+  },
   "alsijil": {
-    "my_overview": {
-      "menu_title": "Мой обзор"
-    },
-    "group_roles": {
-      "menu_title_manage": "Управление ролями групп",
-      "menu_title_assign": "Назначить роль группы"
+    "absence": {
+      "menu_title": "Регистрация отсутствия"
     },
     "all_lessons": {
       "menu_title": "Все уроки"
     },
-    "menu_title": "Классный журнал",
-    "lesson": {
-      "menu_title": "Текущий урок"
+    "coursebook": {
+      "filter": {
+        "groups": "Группы"
+      }
     },
-    "week": {
-      "menu_title": "Текущая неделя"
+    "excuse_types": {
+      "menu_title": "Типы объяснительных"
+    },
+    "extra_marks": {
+      "menu_title": "Дополнительные отметки"
+    },
+    "group_roles": {
+      "menu_title_assign": "Назначить роль группы",
+      "menu_title_manage": "Управление ролями групп"
     },
     "groups": {
       "menu_title": "Мои группы"
     },
-    "persons": {
-      "menu_title": "Мои студенты"
+    "lesson": {
+      "menu_title": "Текущий урок"
     },
-    "absence": {
-      "menu_title": "Регистрация отсутствия"
+    "menu_title": "Классный журнал",
+    "my_overview": {
+      "menu_title": "Мой обзор"
     },
-    "extra_marks": {
-      "menu_title": "Дополнительные отметки"
+    "persons": {
+      "menu_title": "Мои студенты"
     },
-    "excuse_types": {
-      "menu_title": "Типы объяснительных"
+    "week": {
+      "menu_title": "Текущая неделя"
     }
   }
 }
diff --git a/aleksis/apps/alsijil/frontend/messages/uk.json b/aleksis/apps/alsijil/frontend/messages/uk.json
index a29573bea059ddf91b6ae156be5d76914dd2ca50..860e21a111aa1d70dd74c3e787bb1763fa977808 100644
--- a/aleksis/apps/alsijil/frontend/messages/uk.json
+++ b/aleksis/apps/alsijil/frontend/messages/uk.json
@@ -1,36 +1,44 @@
 {
+  "actions": {
+    "back_to_overview": "Назад до огляду"
+  },
   "alsijil": {
-    "week": {
-      "menu_title": "Поточний тиждень"
-    },
-    "groups": {
-      "menu_title": "Мої групи"
-    },
-    "persons": {
-      "menu_title": "Мої студенти"
-    },
     "absence": {
       "menu_title": "Реєстрація відсутності"
     },
-    "my_overview": {
-      "menu_title": "Мій огляд"
+    "all_lessons": {
+      "menu_title": "Усі уроки"
     },
-    "extra_marks": {
-      "menu_title": "Додаткові відмітки"
+    "coursebook": {
+      "filter": {
+        "groups": "Групи"
+      }
     },
     "excuse_types": {
       "menu_title": "Типи пояснень"
     },
+    "extra_marks": {
+      "menu_title": "Додаткові відмітки"
+    },
     "group_roles": {
-      "menu_title_manage": "Керування ролями групи",
-      "menu_title_assign": "Призначити роль групи"
+      "menu_title_assign": "Призначити роль групи",
+      "menu_title_manage": "Керування ролями групи"
     },
-    "all_lessons": {
-      "menu_title": "Усі уроки"
+    "groups": {
+      "menu_title": "Мої групи"
     },
-    "menu_title": "Класний журнал",
     "lesson": {
       "menu_title": "Поточний урок"
+    },
+    "menu_title": "Класний журнал",
+    "my_overview": {
+      "menu_title": "Мій огляд"
+    },
+    "persons": {
+      "menu_title": "Мої студенти"
+    },
+    "week": {
+      "menu_title": "Поточний тиждень"
     }
   }
 }
diff --git a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
index 9b3363583bbfa59f7e4c85070f65c6dd3b6a6c55..48140858293ae7990bfa39c1668d1807e11f51e4 100644
--- a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -50,55 +50,55 @@ msgstr ""
 msgid "Ask teacher to check data"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr ""
 
@@ -110,10 +110,10 @@ msgstr ""
 msgid "Before"
 msgstr ""
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -135,8 +135,8 @@ msgstr ""
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr ""
@@ -151,80 +151,80 @@ msgstr ""
 msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr ""
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -232,69 +232,6 @@ msgstr ""
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-msgid "My groups"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr ""
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr ""
@@ -335,149 +272,248 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 msgid "Group note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:489
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:491
+msgid "Group Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:525
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:765
+msgid "Groups of Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:778
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:790
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:833
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:840
+msgid "Personal Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:841
+msgid "Personal Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr ""
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
@@ -558,6 +594,22 @@ msgstr ""
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -570,24 +622,17 @@ msgid "Date"
 msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr ""
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr ""
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr ""
@@ -598,14 +643,46 @@ msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:156
 #, python-brace-format
-msgid "{value}' late"
+msgid "{value}' tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+msgid "Sort data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+msgid "Load statistics ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr ""
 
@@ -649,26 +726,36 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr ""
 
@@ -683,8 +770,8 @@ msgstr ""
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr ""
 
@@ -701,39 +788,25 @@ msgstr ""
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 msgid "Persons"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -786,84 +859,89 @@ msgstr ""
 msgid "Filter results"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
 "      %(instance)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
 "            There are no lessons for the selected group or teacher in this week.\n"
@@ -907,6 +985,11 @@ msgstr ""
 msgid "Assign group role for %(group)s"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr ""
@@ -976,16 +1059,16 @@ msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr ""
@@ -1009,8 +1092,8 @@ msgid "Unexcused absences"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr ""
@@ -1027,14 +1110,28 @@ msgstr ""
 msgid "Excuse types (not counted as absent)"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1042,13 +1139,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1056,7 +1153,7 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1064,11 +1161,11 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr ""
 
@@ -1184,27 +1281,27 @@ msgid "No students available."
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr ""
 
@@ -1375,78 +1472,98 @@ msgstr ""
 msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+msgid "Generate full register printout for {}"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:659
+msgid "Generate full register printout …"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:660
+msgid "The printout has been generated successfully."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr ""
diff --git a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
index 5c846bc0433997a8a2dfe7488705f1f836591e38..14c910ed3a24b89bc09e4cc6438137dfbcc92b5d 100644
--- a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
@@ -7,17 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
-"PO-Revision-Date: 2022-06-25 13:53+0000\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
+"PO-Revision-Date: 2024-06-13 09:24+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
-"Language-Team: German <https://translate.edugit.org/projects/aleksis/"
-"aleksis-app-alsijil/de/>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/de/>\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.12.1\n"
+"X-Generator: Weblate 5.0.2\n"
 
 #: aleksis/apps/alsijil/actions.py:18
 msgid "Mark as excused"
@@ -51,55 +50,55 @@ msgstr "Wir haben erfolgreich Benachrichtigungen an {count_teachers} Personen f
 msgid "Ask teacher to check data"
 msgstr "Lehrkraft bitten, die Daten zu überprüfen"
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr "Objekt löschen"
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr "Aktuelle Gruppen setzen"
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr "Persönliche Notiz zurücksetzen"
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr "Sicherstellen, dass es keine persönlichen Notizen in ausgefallenen Stunden gibt"
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr "Die persönliche Notiz ist einer ausgefallenen Stunde zugeordnet."
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr "Sicherstellen, dass \"groups_of_person\" für alle persönlichen Notizen gesetzt ist"
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr "Die persönliche Notiz hat keine Gruppe in \"groups_of_person\"."
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr "Sicherstellen, dass es keine ausgefüllten Stundendokumentationen in den Ferien gibt"
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr "Die Stundendokumentation ist in den Ferien."
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr "Sicherstellen, dass es keine ausgefüllten persönlichen Notizen in den Ferien gibt"
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr "Die persönliche Notiz ist in den Ferien."
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr "Sicherstellen, dass es keine entschuldigten persönlichen Notizen ohne eine Absenz gibt"
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr "Die persönliche Notiz ist als entschuldigt, aber nicht als abwesend markiert."
 
@@ -111,10 +110,10 @@ msgstr "Nach"
 msgid "Before"
 msgstr "Bevor"
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -134,12 +133,10 @@ msgstr "Hausaufgabe zur nächsten Stunde"
 
 #: aleksis/apps/alsijil/forms.py:53
 msgid "Carry over data to all other lessons with the same subject in this week"
-msgstr ""
-"Daten zu allen weiteren Stunden mit dem gleichen Fach in dieser Woche "
-"übernehmen"
+msgstr "Daten zu allen weiteren Stunden mit dem gleichen Fach in dieser Woche übernehmen"
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr "Gruppe"
@@ -154,80 +151,80 @@ msgstr "Lehrkraft"
 msgid "You can't select a group and a teacher both."
 msgstr "Es kann nur entweder eine Gruppe oder eine Lehrkraft ausgewählt werden."
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr "Person"
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr "Startstunde"
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr "Endstunde"
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr "Abwesend"
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr "Entschuldigt"
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr "Entschuldigungsart"
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr "Bemerkungen"
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr "Person"
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr "Hat eine Stunden-Dokumentation"
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -235,69 +232,6 @@ msgstr "Hat eine Stunden-Dokumentation"
 msgid "Event"
 msgstr "Veranstaltung"
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr "Klassenbuch"
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr "Aktuelle Unterrichtsstunde"
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr "Aktuelle Woche"
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-msgid "My groups"
-msgstr "Meine Gruppen"
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr "Meine Übersicht"
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr "Meine Schülerinnen und Schüler"
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr "Gruppenrolle zuweisen"
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr "Alle Stunden"
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr "Entschuldigungsarten"
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr "Zusätzliche Markierungen"
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr "Gruppenrollen verwalten"
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr "Kann Wochenübersicht des Gruppenklassenbuches sehen"
@@ -338,152 +272,248 @@ msgstr "Kann eine Gruppenrolle für diese Gruppe zuweisen"
 msgid "Can register an absence for a person"
 msgstr "Kann eine Absenz für eine Person registrieren"
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Als abwesend zählen"
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
-msgstr ""
-"Wenn ausgewählt wird diese Entschuldigungsart als eine verpasste Stunde "
-"gezählt. Wenn nicht ausgewählt wird es nicht im Abwesenheitsbericht "
-"auftauchen."
+msgstr "Wenn ausgewählt wird diese Entschuldigungsart als eine verpasste Stunde gezählt. Wenn nicht ausgewählt wird es nicht im Abwesenheitsbericht auftauchen."
+
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr "Entschuldigungsarten"
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr "Jahr"
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr "Zusätzliche Markierungen"
+
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr "Persönliche Notiz"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Persönliche Notizen"
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr "Stundenthema"
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr "Hausaufgaben"
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 msgid "Group note"
 msgstr "Gruppennotiz"
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Stunden-Dokumentation"
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr "Stunden-Dokumentationen"
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr "Vordergrundfarbe"
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr "Hintergrundfarbe"
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr "In Kursbuch anzeigen"
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr "Zusätzliche Markierung"
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr "Kurs"
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr "Lehrkräfte"
+
+#: aleksis/apps/alsijil/models.py:489
+msgid "Lesson Topic"
+msgstr "Stundenthema"
+
+#: aleksis/apps/alsijil/models.py:491
+msgid "Group Note"
+msgstr "Gruppennotiz"
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr "Teilnahmestatus angelegt am"
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: aleksis/apps/alsijil/models.py:525
+msgid "Documentations"
+msgstr "Dokumentationen"
+
+#: aleksis/apps/alsijil/models.py:765
+msgid "Groups of Person"
+msgstr "Gruppen der Person"
+
+#: aleksis/apps/alsijil/models.py:778
+msgid "Absence Reason"
+msgstr "Abwesenheitsgrund"
+
+#: aleksis/apps/alsijil/models.py:790
+msgid "Base Absence"
+msgstr "Basis-Abwesenheit"
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
+#: aleksis/apps/alsijil/models.py:831
+msgid "Note"
+msgstr "Notiz"
+
+#: aleksis/apps/alsijil/models.py:833
+msgid "Extra Mark"
+msgstr "Zusätzliche Markierung"
+
+#: aleksis/apps/alsijil/models.py:840
+msgid "Personal Note"
+msgstr "Persönliche Notiz"
+
+#: aleksis/apps/alsijil/models.py:841
+msgid "Personal Notes"
+msgstr "Persönliche Notizen"
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr "Farbe"
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr "Gruppenrolle"
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr "Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr "Kann Gruppenrolle zuweisen"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr "Zugewiesene Person"
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Kann frei gelassen werden, wenn das Enddatum noch nicht feststeht"
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr "Zuweisung von Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr "Zuweisungen von Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr "Kann die Stundenübersicht sehen"
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr "Kann die Wochenübersicht sehen"
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr "Kann komplettes Klassenbuch sehen"
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr "Kann eine Absenz registrieren"
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr "Kann alle Filter für persönliche Notizen anzeigen"
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr "Klassenbuch"
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr "Blockiere das Hinzufügen von persönlichen Notizen für ausgefallene Stunden"
@@ -498,9 +528,7 @@ msgstr "Erlaube Primärgruppeninhabern Absenzen in der Zukunft für Mitglieder i
 
 #: aleksis/apps/alsijil/preferences.py:44
 msgid "Grant the owner of a parent group the same privileges as the owners of the respective child groups"
-msgstr ""
-"Gebe dem Besitzer einer Elterngruppe die gleichen Rechte wie den Besitzern "
-"der entsprechenden Kindgruppen"
+msgstr "Gebe dem Besitzer einer Elterngruppe die gleichen Rechte wie den Besitzern der entsprechenden Kindgruppen"
 
 #: aleksis/apps/alsijil/preferences.py:54
 msgid "Allow original teachers to edit their lessons although they are substituted"
@@ -516,15 +544,11 @@ msgstr "Dies wird die Daten nur übernehmen, wenn die Daten in den Folgestunden
 
 #: aleksis/apps/alsijil/preferences.py:75
 msgid "Allow carrying over data from any lesson period to all other lesson                 periods with the same lesson and in the same week"
-msgstr ""
-"Erlaube das Übernehmen von Daten von einer Stunde zu allen weiteren Stunden "
-"mit dem gleichen Unterricht in der gleichen Woche"
+msgstr "Erlaube das Übernehmen von Daten von einer Stunde zu allen weiteren Stunden mit dem gleichen Unterricht in der gleichen Woche"
 
 #: aleksis/apps/alsijil/preferences.py:79
 msgid "This will carry over data only if the data in the aforementioned periods are empty."
-msgstr ""
-"Dies wird die Daten nur übernehmen, wenn die Daten in den eben genannten "
-"Stunden leer sind."
+msgstr "Dies wird die Daten nur übernehmen, wenn die Daten in den eben genannten Stunden leer sind."
 
 #: aleksis/apps/alsijil/preferences.py:88
 msgid "Carry over personal notes to all following lesson periods on the same day."
@@ -570,6 +594,22 @@ msgstr "Jede Seite muss mindestens einen Eintrag anzeigen."
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr "Stunden standardmäßig anhand der Existenz ihrer Stundendokumentation filtern"
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr "Bearbeiten von allen zukünftigen Dokumentationen erlauben"
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr "Bearbeiten von allen Dokumentationen bis inklusive zum aktuellen Tag erlauben"
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr "Bearbeiten von allen Dokumentationen bis inklusive zum aktuellen Tag und zur aktuellen Uhrzeit erlauben"
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr "Zeitraum setzen, in dem Dokumentationen bearbeitet werden dürfen"
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -582,24 +622,17 @@ msgid "Date"
 msgstr "Datum"
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr "Stunde"
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr "Lehrkräfte"
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr "Verspätung"
@@ -610,14 +643,46 @@ msgstr "Entschuldigen"
 
 #: aleksis/apps/alsijil/tables.py:156
 #, python-brace-format
-msgid "{value}' late"
-msgstr "{value}' verspätet"
+msgid "{value}' tardiness"
+msgstr "{value}' Verspätung"
+
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr "Daten werden geladen ..."
+
+#: aleksis/apps/alsijil/tasks.py:49
+msgid "Sort data ..."
+msgstr "Daten sortieren ..."
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr "Stundendaten laden ..."
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr "Stundendaten sortieren ..."
+
+#: aleksis/apps/alsijil/tasks.py:133
+msgid "Load statistics ..."
+msgstr "Statistiken laden ..."
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr "Template generieren ..."
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr "PDF generieren ..."
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
+msgstr "PDF-Generierung ist fehlgeschlagen"
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr "Abwesenheit eintragen"
 
@@ -671,26 +736,36 @@ msgstr "Status auf \"nicht abwesend\" zurücksetzen"
 msgid "Cancel"
 msgstr "Abbrechen"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr "Alle Stunden"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr "Meine Gruppen"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr "Schülerinnen und Schüler"
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr "Liste der Schülerinnen und Schüler"
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr "Wochenansicht"
 
@@ -705,8 +780,8 @@ msgstr "Rollen"
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr "Ausdruck generieren"
 
@@ -723,39 +798,25 @@ msgstr "Schülerinnen und Schüler"
 msgid "Lesson"
 msgstr "Unterrichtsstunde"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 msgid "Persons"
 msgstr "Personen"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr "Sitzplan"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr "Vorherige"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr "Mehr"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr "Meine vorherige Stunde"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr "Meine nächste Stunde"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr "Nächste"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -814,52 +875,57 @@ msgstr "Filtern"
 msgid "Filter results"
 msgstr "Ergebnisse filtern"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr "Statistiken zu Fehlzeiten, Verspätungen und Bemerkungen"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr "Fehlstunden"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr "davon"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr "Ohne Entschuldigungsart"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr "Unentschuldigt"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr "Meine Schülerinnen und Schüler"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr "Liste der Schülerinnen und Schüler: %(group)s"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr "Auswählen"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr "Filter umschalten"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
@@ -868,32 +934,32 @@ msgstr ""
 "KW %(week)s: \n"
 "%(instance)s"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr "Ausklappen"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr "Stundenübersicht besuchen"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr "unentschuldigt"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr "Summierte Verspätung"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr "Anzahl der Verspätungen"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr "Keine Stunden verfügbar"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
 "            There are no lessons for the selected group or teacher in this week.\n"
@@ -944,6 +1010,11 @@ msgstr "Zusätzliche Markierung bearbeiten"
 msgid "Assign group role for %(group)s"
 msgstr "Gruppenrolle für %(group)s zuweisen"
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr "Gruppenrolle zuweisen"
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr "Zuweisen"
@@ -1017,16 +1088,16 @@ msgstr "Bitte prüfen Sie, ob die folgenden Klassenbucheinträge komplett und ri
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr "(e)"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr "(u)"
@@ -1050,8 +1121,8 @@ msgid "Unexcused absences"
 msgstr "Unentschuldigte Fehlzeiten"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr "Summe (e)"
@@ -1068,14 +1139,28 @@ msgstr "Normal entschuldigte Fehlzeiten"
 msgid "Excuse types (not counted as absent)"
 msgstr "Entschuldigungsarten (nicht als abwesend gezählt)"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr "Meine vorherige Stunde"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr "Meine nächste Stunde"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr "Nächste"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr "%(period)s. Stunde"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1086,13 +1171,13 @@ msgstr ""
 "            %(period_from)s.–%(period_to)s.  Stunde\n"
 "          "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr "Speichern"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1103,7 +1188,7 @@ msgstr ""
 "        Vorherige %(subject)s Stunde\n"
 "      "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1114,11 +1199,11 @@ msgstr ""
 "        Nächste %(subject)s Stunde\n"
 "      "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr "Veränderungen"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr "Verspätung (in m)"
 
@@ -1164,10 +1249,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Dieser Sitzplan wurde von der Elterngruppe von %(child_group)s "
-"übernommen.\n"
-"Wenn Sie wollen, können Sie ihn für Ihre Gruppe übernehmen und dann anpassen."
-"\n"
+"            Dieser Sitzplan wurde von der Elterngruppe von %(child_group)s übernommen.\n"
+"Wenn Sie wollen, können Sie ihn für Ihre Gruppe übernehmen und dann anpassen.\n"
 "          "
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:30
@@ -1190,8 +1273,7 @@ msgid ""
 "                "
 msgstr ""
 "\n"
-"                  Einen neuen Sitzplan für %(group)s (%(subject)s) in %(room)"
-"s erstellen\n"
+"                  Einen neuen Sitzplan für %(group)s (%(subject)s) in %(room)s erstellen\n"
 "                "
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78
@@ -1202,8 +1284,7 @@ msgid ""
 "                  "
 msgstr ""
 "\n"
-"                    Einen neuen Sitzplan für %(group)s in %(room)s "
-"erstellen\n"
+"                    Einen neuen Sitzplan für %(group)s in %(room)s erstellen\n"
 "                  "
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:6
@@ -1250,27 +1331,27 @@ msgid "No students available."
 msgstr "Keine Schülerinnen und Schüler verfügbar."
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 msgid "Primary group"
 msgstr "Primärgruppe"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr "Ungezählte Fehlzeiten"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr "Summe"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr "Normal entschuldigt"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr "Mehr Details anzeigen"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr "Details"
 
@@ -1455,84 +1536,116 @@ msgstr "KW"
 msgid "Notes"
 msgstr "Notizen"
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 "Sie haben eine ungültige Stunde ausgewählt oder es\n"
 "      läuft momentan keine Stunde."
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr "Ihnen ist es nicht erlaubt, eine Eintragung für eine Unterrichtsstunde in der Zukunft vorzunehmen."
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr "Die Stunden-Dokumentation wurde gespeichert."
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr "Die persönlichen Notizen wurden gespeichert."
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+msgid "Generate full register printout for {}"
+msgstr "Vollständigen Klassenbuchausdruck für {} generieren"
+
+#: aleksis/apps/alsijil/views.py:659
+msgid "Generate full register printout …"
+msgstr "Vollständigen Klassenbuchausdruck generieren …"
+
+#: aleksis/apps/alsijil/views.py:660
+msgid "The printout has been generated successfully."
+msgstr "Der Ausdruck wurde erfolgreich generiert."
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr "Es ist ein Fehler beim Generieren des Ausdrucks aufgetreten."
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr "PDF herunterladen"
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr "Die Abwesenheit wurde gespeichert."
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr "Die persönliche Notiz wurde gelöscht."
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr "Die zusätzliche Markierung wurde erstellt."
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr "Die zusätzliche Markierung wurde gespeichert."
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr "Die zusätzliche Markierung wurde gelöscht."
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr "Die Entschuldigungsart wurde erstellt."
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr "Die Entschuldigunsart wurde gespeichert."
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr "Die Entschuldigungsart wurde gelöscht."
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr "Die Gruppenrolle wurde erstellt."
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr "Die Gruppenrolle wurde gespeichert."
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr "Die Gruppenrolle wurde gelöscht."
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr "Die Gruppenrolle wurde zugewiesen."
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr "Die Gruppenrollenzuweisung wurde gespeichert."
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr "Die Gruppenrollenzuweisung wurde beendet."
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr "Die Gruppenrollenzuweisung wurde gelöscht."
 
+#~ msgid "Current lesson"
+#~ msgstr "Aktuelle Unterrichtsstunde"
+
+#~ msgid "Current week"
+#~ msgstr "Aktuelle Woche"
+
+#~ msgid "My overview"
+#~ msgstr "Meine Übersicht"
+
+#~ msgid "Manage group roles"
+#~ msgstr "Gruppenrollen verwalten"
+
 #~ msgid "Excused absences"
 #~ msgstr "Entschuldigte Fehlzeiten"
 
diff --git a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
index e1a4b25dc5ebd5a6090ead1f0a1eee38d3e07ab3..72c9ebda41b069fb1e4116b336be8aeff1427caa 100644
--- a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2021-06-16 11:59+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/fr/>\n"
@@ -52,63 +52,63 @@ msgstr ""
 msgid "Ask teacher to check data"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 #, fuzzy
 #| msgid "Relevant personal notes"
 msgid "Reset personal note to defaults"
 msgstr "Notes personnelles importantes"
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The personal note is related to a cancelled lesson."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The lesson documentation is on holidays."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The personal note is on holidays."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The personal note is marked as excused, but not as absent."
@@ -122,10 +122,10 @@ msgstr ""
 msgid "Before"
 msgstr ""
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -151,8 +151,8 @@ msgstr ""
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr "groupe"
@@ -167,88 +167,88 @@ msgstr "prof"
 msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr "Personne"
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Date de début"
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Date de fin"
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 #, fuzzy
 #| msgid "From period"
 msgid "Start period"
 msgstr "De la période"
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 #, fuzzy
 #| msgid "From period"
 msgid "End period"
 msgstr "De la période"
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr "Absent(e)"
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr "Excusé"
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 #, fuzzy
 #| msgid "Excused"
 msgid "Excuse type"
 msgstr "Excusé"
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr "Remarque"
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr "Personne"
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 #, fuzzy
 #| msgid "Lesson documentation"
 msgid "Has lesson documentation"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -256,77 +256,6 @@ msgstr "Documentation de cours"
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr "Registre de la classe"
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr "Lecon actuelle"
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr "Semaine actuelle"
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-#, fuzzy
-#| msgid "Group"
-msgid "My groups"
-msgstr "Groupe"
-
-#: aleksis/apps/alsijil/menus.py:49
-#, fuzzy
-#| msgid "Personal overview"
-msgid "My overview"
-msgstr "Vue d'ensemble personnelle"
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-#, fuzzy
-#| msgid "Persons in group"
-msgid "Assign group role"
-msgstr "Personnes en groupe"
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-#, fuzzy
-#| msgid "Excused"
-msgid "Excuse types"
-msgstr "Excusé"
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr ""
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr ""
@@ -377,107 +306,223 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr "Registre de la classe"
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+#, fuzzy
+#| msgid "Excused"
+msgid "Excuse types"
+msgstr "Excusé"
+
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:299
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal note"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr "Sujet de cours"
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr "Devoirs"
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 #, fuzzy
 #| msgid "Group"
 msgid "Group note"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 #, fuzzy
 #| msgid "Lesson documentation"
 msgid "Lesson documentations"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr "Profs"
+
+#: aleksis/apps/alsijil/models.py:489
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Sujet de cours"
+
+#: aleksis/apps/alsijil/models.py:491
+#, fuzzy
+#| msgid "Group"
+msgid "Group Note"
+msgstr "Groupe"
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Documentation de cours"
+
+#: aleksis/apps/alsijil/models.py:525
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentations"
+msgstr "Documentation de cours"
+
+#: aleksis/apps/alsijil/models.py:765
+#, fuzzy
+#| msgid "Group"
+msgid "Groups of Person"
+msgstr "Groupe"
+
+#: aleksis/apps/alsijil/models.py:778
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Absences"
+
+#: aleksis/apps/alsijil/models.py:790
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Absences"
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Notes"
+
+#: aleksis/apps/alsijil/models.py:833
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:840
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Note"
+msgstr "Notes personnelles"
+
+#: aleksis/apps/alsijil/models.py:841
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Notes personnelles"
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 #, fuzzy
 #| msgid "Group"
 msgid "Group role"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 #, fuzzy
@@ -485,67 +530,72 @@ msgstr "Groupe"
 msgid "Group roles"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 #, fuzzy
 #| msgid "Persons in group"
 msgid "Can assign group role"
 msgstr "Personnes en groupe"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 #, fuzzy
 #| msgid "Absences"
 msgid "Assigned person"
 msgstr "Absences"
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 #, fuzzy
 #| msgid "Group"
 msgid "Groups"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 #, fuzzy
 #| msgid "Personal overview"
 msgid "Can view lesson overview"
 msgstr "Vue d'ensemble personnelle"
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 #, fuzzy
 #| msgid "Class register"
 msgid "Can view full register"
 msgstr "Registre de la classe"
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 #, fuzzy
 #| msgid "Register absence"
 msgid "Can register absence"
 msgstr "Registre de Absence"
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 #, fuzzy
 #| msgid "List of all personal note filters"
 msgid "Can list all personal note filters"
 msgstr "Liste de filtres de notes personnelles"
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr "Registre de la classe"
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
@@ -628,6 +678,22 @@ msgstr ""
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -640,24 +706,17 @@ msgid "Date"
 msgstr "Date"
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr "Période"
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr "Profs"
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr "Retard"
@@ -669,15 +728,50 @@ msgid "Excuse"
 msgstr "Excusé"
 
 #: aleksis/apps/alsijil/tables.py:156
-#, python-brace-format
-msgid "{value}' late"
+#, fuzzy, python-brace-format
+#| msgid "Summed up tardiness"
+msgid "{value}' tardiness"
+msgstr "Résumé des retards"
+
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+#, fuzzy
+#| msgid "Start date"
+msgid "Sort data ..."
+msgstr "Date de début"
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+msgid "Load statistics ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr "Registre de Absence"
 
@@ -731,26 +825,38 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+#, fuzzy
+#| msgid "Group"
+msgid "My groups"
+msgstr "Groupe"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr "Vue de semaine"
 
@@ -765,8 +871,8 @@ msgstr ""
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr ""
 
@@ -783,47 +889,29 @@ msgstr ""
 msgid "Lesson"
 msgstr "Cours"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 #, fuzzy
 #| msgid "Person"
 msgid "Persons"
 msgstr "Personne"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 #, fuzzy
 #| msgid "Current lesson"
 msgid "Previous"
 msgstr "Lecon actuelle"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-#, fuzzy
-#| msgid "Current lesson"
-msgid "My previous lesson"
-msgstr "Lecon actuelle"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-#, fuzzy
-#| msgid "Current lesson"
-msgid "My next lesson"
-msgstr "Lecon actuelle"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 #, fuzzy
 #| msgid ""
 #| "\n"
@@ -892,92 +980,97 @@ msgstr ""
 msgid "Filter results"
 msgstr "Notes personnelles importantes"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr "Absences"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 #, fuzzy
 #| msgid "Excused"
 msgid "Without Excuse Type"
 msgstr "Excusé"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr "injustifié(e)"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr "Sélectionner"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 #, fuzzy
 #| msgid "Personal note filters"
 msgid "Toggle filters"
 msgstr "Filtres de notes personnelles"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
 "      %(instance)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 #, fuzzy
 #| msgid "Personal overview"
 msgid "Visit lesson overview"
 msgstr "Vue d'ensemble personnelle"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr "Injustifié(e)"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr "Résumé des retards"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 #, fuzzy
 #| msgid "Summed up tardiness"
 msgid "Count of tardiness"
 msgstr "Résumé des retards"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 #, fuzzy
 #| msgid ""
 #| "\n"
@@ -1029,6 +1122,13 @@ msgstr ""
 msgid "Assign group role for %(group)s"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+#, fuzzy
+#| msgid "Persons in group"
+msgid "Assign group role"
+msgstr "Personnes en groupe"
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr ""
@@ -1102,16 +1202,16 @@ msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr ""
@@ -1137,8 +1237,8 @@ msgid "Unexcused absences"
 msgstr "injustifié(e)"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr ""
@@ -1159,15 +1259,33 @@ msgstr "injustifié(e)"
 msgid "Excuse types (not counted as absent)"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#, fuzzy
+#| msgid "Current lesson"
+msgid "My previous lesson"
+msgstr "Lecon actuelle"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+#, fuzzy
+#| msgid "Current lesson"
+msgid "My next lesson"
+msgstr "Lecon actuelle"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, fuzzy, python-format
 #| msgid "From period"
 msgid "%(period)s. period"
 msgstr "De la période"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1175,13 +1293,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1189,7 +1307,7 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1197,11 +1315,11 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr "Changement d' histoire"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 #, fuzzy
 #| msgid "Tardiness"
 msgid "Tardiness (in m)"
@@ -1327,33 +1445,33 @@ msgid "No students available."
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 #, fuzzy
 #| msgid "Group"
 msgid "Primary group"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 #, fuzzy
 #| msgid "Unexcused"
 msgid "Uncounted Absences"
 msgstr "injustifié(e)"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 #, fuzzy
 #| msgid "unexcused"
 msgid "Regular excused"
 msgstr "Injustifié(e)"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr ""
 
@@ -1532,104 +1650,137 @@ msgstr "Vue de semaine"
 msgid "Notes"
 msgstr "Notes"
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The lesson documentation has been saved."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+msgid "Generate full register printout for {}"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:659
+msgid "Generate full register printout …"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:660
+#, fuzzy
+#| msgid "Lesson documentation for calendar week"
+msgid "The printout has been generated successfully."
+msgstr "Documentation de cours pour la semaine calendrier"
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The personal note has been deleted."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The extra mark has been created."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The extra mark has been saved."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role has been created."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role has been saved."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role has been deleted."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role has been assigned."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role assignment has been saved."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role assignment has been stopped."
 msgstr "Documentation de cours pour la semaine calendrier"
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 #, fuzzy
 #| msgid "Lesson documentation for calendar week"
 msgid "The group role assignment has been deleted."
 msgstr "Documentation de cours pour la semaine calendrier"
 
+#~ msgid "Current lesson"
+#~ msgstr "Lecon actuelle"
+
+#~ msgid "Current week"
+#~ msgstr "Semaine actuelle"
+
+#, fuzzy
+#~| msgid "Personal overview"
+#~ msgid "My overview"
+#~ msgstr "Vue d'ensemble personnelle"
+
 #, fuzzy
 #~| msgid "Unexcused"
 #~ msgid "Excused absences"
diff --git a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
index 482b187e4b662d5dae6984428bf834aeb086c7eb..474943af086754291a287070770f0e915f2f5c6b 100644
--- a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2020-07-26 14:08+0000\n"
 "Last-Translator: Julian <leuckerj@gmail.com>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/la/>\n"
@@ -50,55 +50,55 @@ msgstr ""
 msgid "Ask teacher to check data"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr ""
 
@@ -110,10 +110,10 @@ msgstr ""
 msgid "Before"
 msgstr ""
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -135,8 +135,8 @@ msgstr ""
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr "Grex"
@@ -151,80 +151,80 @@ msgstr ""
 msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr "Persona"
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr "Persona"
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -232,71 +232,6 @@ msgstr ""
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-#, fuzzy
-#| msgid "Group"
-msgid "My groups"
-msgstr "Grex"
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr ""
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr ""
@@ -337,105 +272,207 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Primus nomen"
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:299
 #, fuzzy
 #| msgid "Person"
 msgid "Personal note"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 #, fuzzy
 #| msgid "Group"
 msgid "Group note"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:489
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:491
+#, fuzzy
+#| msgid "Group"
+msgid "Group Note"
+msgstr "Grex"
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:525
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:765
+#, fuzzy
+#| msgid "Group"
+msgid "Groups of Person"
+msgstr "Grex"
+
+#: aleksis/apps/alsijil/models.py:778
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:790
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:833
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:840
+#, fuzzy
+#| msgid "Person"
+msgid "Personal Note"
+msgstr "Persona"
+
+#: aleksis/apps/alsijil/models.py:841
+#, fuzzy
+#| msgid "Person"
+msgid "Personal Notes"
+msgstr "Persona"
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 #, fuzzy
 #| msgid "Group"
 msgid "Group role"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 #, fuzzy
@@ -443,55 +480,60 @@ msgstr "Grex"
 msgid "Group roles"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 #, fuzzy
 #| msgid "Group"
 msgid "Groups"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr ""
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
@@ -572,6 +614,22 @@ msgstr ""
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -584,24 +642,17 @@ msgid "Date"
 msgstr "dies"
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr ""
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr ""
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr ""
@@ -612,14 +663,46 @@ msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:156
 #, python-brace-format
-msgid "{value}' late"
+msgid "{value}' tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+msgid "Sort data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+msgid "Load statistics ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr ""
 
@@ -663,26 +746,38 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+#, fuzzy
+#| msgid "Group"
+msgid "My groups"
+msgstr "Grex"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr ""
 
@@ -697,8 +792,8 @@ msgstr ""
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr ""
 
@@ -715,41 +810,27 @@ msgstr ""
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 #, fuzzy
 #| msgid "Person"
 msgid "Persons"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -806,84 +887,89 @@ msgstr ""
 msgid "Filter results"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
 "      %(instance)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
 "            There are no lessons for the selected group or teacher in this week.\n"
@@ -927,6 +1013,11 @@ msgstr ""
 msgid "Assign group role for %(group)s"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr ""
@@ -998,16 +1089,16 @@ msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr ""
@@ -1031,8 +1122,8 @@ msgid "Unexcused absences"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr ""
@@ -1049,14 +1140,28 @@ msgstr ""
 msgid "Excuse types (not counted as absent)"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1064,13 +1169,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1078,7 +1183,7 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1086,11 +1191,11 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr ""
 
@@ -1206,29 +1311,29 @@ msgid "No students available."
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 #, fuzzy
 #| msgid "Group"
 msgid "Primary group"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr ""
 
@@ -1399,79 +1504,99 @@ msgstr ""
 msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+msgid "Generate full register printout for {}"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:659
+msgid "Generate full register printout …"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:660
+msgid "The printout has been generated successfully."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr ""
 
diff --git a/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po
index 90e59955ce06421fc74620937eb7c06cce05da2b..7e8285208907941025f0a6da310079f0e35e214e 100644
--- a/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -49,55 +49,55 @@ msgstr ""
 msgid "Ask teacher to check data"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr ""
 
@@ -109,10 +109,10 @@ msgstr ""
 msgid "Before"
 msgstr ""
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -134,8 +134,8 @@ msgstr ""
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr ""
@@ -150,80 +150,80 @@ msgstr ""
 msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr ""
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -231,69 +231,6 @@ msgstr ""
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-msgid "My groups"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr ""
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr ""
@@ -334,149 +271,248 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 msgid "Group note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:489
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:491
+msgid "Group Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:525
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:765
+msgid "Groups of Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:778
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:790
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:833
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:840
+msgid "Personal Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:841
+msgid "Personal Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr ""
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
@@ -557,6 +593,22 @@ msgstr ""
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -569,24 +621,17 @@ msgid "Date"
 msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr ""
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr ""
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr ""
@@ -597,14 +642,46 @@ msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:156
 #, python-brace-format
-msgid "{value}' late"
+msgid "{value}' tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+msgid "Sort data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+msgid "Load statistics ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr ""
 
@@ -648,26 +725,36 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr ""
 
@@ -682,8 +769,8 @@ msgstr ""
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr ""
 
@@ -700,39 +787,25 @@ msgstr ""
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 msgid "Persons"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -785,84 +858,89 @@ msgstr ""
 msgid "Filter results"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
 "      %(instance)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
 "            There are no lessons for the selected group or teacher in this week.\n"
@@ -906,6 +984,11 @@ msgstr ""
 msgid "Assign group role for %(group)s"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr ""
@@ -975,16 +1058,16 @@ msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr ""
@@ -1008,8 +1091,8 @@ msgid "Unexcused absences"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr ""
@@ -1026,14 +1109,28 @@ msgstr ""
 msgid "Excuse types (not counted as absent)"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1041,13 +1138,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1055,7 +1152,7 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1063,11 +1160,11 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr ""
 
@@ -1183,27 +1280,27 @@ msgid "No students available."
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr ""
 
@@ -1374,78 +1471,98 @@ msgstr ""
 msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+msgid "Generate full register printout for {}"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:659
+msgid "Generate full register printout …"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:660
+msgid "The printout has been generated successfully."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr ""
diff --git a/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
index f7d4d6e925786bb72d7a37b62d5629aec7f4989c..aff00561b86b01e0dfb0862151a83a96fc6741cf 100644
--- a/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2023-05-26 04:38+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/ru/>\n"
@@ -50,55 +50,55 @@ msgstr "Мы отправили уведомление для {count_teachers} 
 msgid "Ask teacher to check data"
 msgstr "Попросить учителя проверить данные"
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr "Удалить объект"
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr "Установить текущие группы"
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr "Сбросить личные заметки на типовые"
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr "Убедитесь, чтобы в отмененных уроках не было личных заметок"
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr "У отмененного урока есть связанные личные заметки."
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr "Убедитесь, что для каждой личной заметки установлены \"группы_лиц\""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr "Эта личная заметка без группы в \"группах_лиц\"."
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr "Убедитесь, что на выходные нет заполненного учебного материала"
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr "На выходные есть учебный материал."
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr "Убедитесь, что на выходные нет заполненных личных заметок"
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr "На выходные есть личные заметки."
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr "Убедитесь, что нет личных заметок с пояснениями без отсутствия"
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr "Эта личная заметка отмечена как пояснительная, но нет отсутствия."
 
@@ -110,10 +110,10 @@ msgstr "После"
 msgid "Before"
 msgstr "До"
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -135,8 +135,8 @@ msgstr "Домашняя работа на следующий урок"
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr "Перенести данные на все другие уроки с тем же предметом на этой неделе"
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr "Группа"
@@ -151,80 +151,80 @@ msgstr "Преподаватель"
 msgid "You can't select a group and a teacher both."
 msgstr "Вы не можете одновременно выбрать группу и преподавателя."
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr "Физлицо"
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Дата начала"
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Дата окончания"
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr "Начало уроков"
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr "Окончание уроков"
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr "Отсутствует"
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr "Уважительно"
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr "Тип объяснительной записки"
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr "Замечания"
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr "Физлицо"
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr "Учебный год"
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr "Имеет в наличии учебный материал"
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -232,69 +232,6 @@ msgstr "Имеет в наличии учебный материал"
 msgid "Event"
 msgstr "Событие"
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr "Классный журнал"
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr "Текущий урок"
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr "Текущая неделя"
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-msgid "My groups"
-msgstr "Мои группы"
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr "Мой обзор"
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr "Мои студенты"
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr "Назначить роль группы"
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr "Все уроки"
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr "Типы объяснительных"
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr "Дополнительные отметки"
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr "Управление ролями групп"
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr "Может просматривать классный журнал группы за неделю"
@@ -335,149 +272,270 @@ msgstr "Может назначать роль группы для этой гр
 msgid "Can register an absence for a person"
 msgstr "Может регистрировать отсутствия"
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr "Короткое имя"
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr "Полное имя"
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Количество отсутствующих"
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr "Если отмечено, этот тип объяснительной будет засчитан как пропущенный урок. Если не отмечено, то без записи в отчет о пропусках."
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr "Типы объяснительных"
+
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr "Год"
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr "Дополнительные отметки"
+
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr "Личная заметка"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Личные заметки"
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr "Тема урока"
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr "Домашняя работа"
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 msgid "Group note"
 msgstr "Групповая заметка"
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Учебный материал"
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr "Учебные материалы"
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr "Дополнительная отметка"
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr "Преподаватели"
+
+#: aleksis/apps/alsijil/models.py:489
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Тема урока"
+
+#: aleksis/apps/alsijil/models.py:491
+#, fuzzy
+#| msgid "Group note"
+msgid "Group Note"
+msgstr "Групповая заметка"
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Учебный материал"
+
+#: aleksis/apps/alsijil/models.py:525
+#, fuzzy
+#| msgid "Lesson documentations"
+msgid "Documentations"
+msgstr "Учебные материалы"
+
+#: aleksis/apps/alsijil/models.py:765
+#, fuzzy
+#| msgid "Group roles"
+msgid "Groups of Person"
+msgstr "Роли групп"
+
+#: aleksis/apps/alsijil/models.py:778
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Пропуски"
+
+#: aleksis/apps/alsijil/models.py:790
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Пропуски"
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Заметки"
+
+#: aleksis/apps/alsijil/models.py:833
+#, fuzzy
+#| msgid "Extra mark"
+msgid "Extra Mark"
+msgstr "Дополнительная отметка"
+
+#: aleksis/apps/alsijil/models.py:840
+#, fuzzy
+#| msgid "Personal note"
+msgid "Personal Note"
+msgstr "Личная заметка"
+
+#: aleksis/apps/alsijil/models.py:841
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Личные заметки"
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr "Иконка"
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr "Цвет"
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr "Роль группы"
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr "Роли групп"
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr "Может назначать роль группы"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr "Назначенное физлицо"
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr "Группы"
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Если нет точной конечной даты, можно оставить незаполненным"
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr "Назначение роли группы"
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr "Назначение ролей групп"
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr "Может просматривать обзор урока"
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr "Может просматривать недельный обзор"
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr "Может просматривать весь журнал"
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr "Может регистрировать отсутствие"
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr "Может просматривать все фильтры личных заметок"
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr "Классный журнал"
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr "Блокировать добавление личных заметок к отмененным урокам"
@@ -492,9 +550,7 @@ msgstr "Разрешить владельцам основных групп ре
 
 #: aleksis/apps/alsijil/preferences.py:44
 msgid "Grant the owner of a parent group the same privileges as the owners of the respective child groups"
-msgstr ""
-"Наделить владельца родительской группы такими же правами, как у владельца "
-"соответствующих дочерних групп"
+msgstr "Наделить владельца родительской группы такими же правами, как у владельца соответствующих дочерних групп"
 
 #: aleksis/apps/alsijil/preferences.py:54
 msgid "Allow original teachers to edit their lessons although they are substituted"
@@ -510,15 +566,11 @@ msgstr "Это перенесёт данные только в случае от
 
 #: aleksis/apps/alsijil/preferences.py:75
 msgid "Allow carrying over data from any lesson period to all other lesson                 periods with the same lesson and in the same week"
-msgstr ""
-"Разрешить перенос данных с любого урока на все такие же "
-"уроки                 с таким же номером в расписании на той же неделе"
+msgstr "Разрешить перенос данных с любого урока на все такие же уроки                 с таким же номером в расписании на той же неделе"
 
 #: aleksis/apps/alsijil/preferences.py:79
 msgid "This will carry over data only if the data in the aforementioned periods are empty."
-msgstr ""
-"Это перенесёт данные только если в упомянутых выше уроках данные не "
-"заполнены."
+msgstr "Это перенесёт данные только если в упомянутых выше уроках данные не заполнены."
 
 #: aleksis/apps/alsijil/preferences.py:88
 msgid "Carry over personal notes to all following lesson periods on the same day."
@@ -564,6 +616,22 @@ msgstr "Каждая страница должна содержать хотя 
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr "По-умолчанию фильтровать уроки по наличию в них учебного материала"
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -576,24 +644,17 @@ msgid "Date"
 msgstr "Дата"
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr "Урок"
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr "Преподаватели"
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr "Опоздание"
@@ -603,15 +664,52 @@ msgid "Excuse"
 msgstr "Объяснительная"
 
 #: aleksis/apps/alsijil/tables.py:156
-#, python-brace-format
-msgid "{value}' late"
+#, fuzzy, python-brace-format
+#| msgid "{value}' late"
+msgid "{value}' tardiness"
 msgstr "{value}' задержка"
 
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+#, fuzzy
+#| msgid "Start date"
+msgid "Sort data ..."
+msgstr "Дата начала"
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+#, fuzzy
+#| msgid "Statistics"
+msgid "Load statistics ..."
+msgstr "Статистика"
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr "Регистрация отсутствия"
 
@@ -665,26 +763,36 @@ msgstr "Сбросить статус на 'не отсутствует'"
 msgid "Cancel"
 msgstr "Отменить"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr "Все уроки"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr "Мои группы"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr "Студенты"
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr "Список студентов"
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr "Недельный обзор"
 
@@ -699,8 +807,8 @@ msgstr "Роли"
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr "Подготовить к печати"
 
@@ -717,39 +825,25 @@ msgstr "студенты"
 msgid "Lesson"
 msgstr "Урок"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 msgid "Persons"
 msgstr "Люди"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr "План рассадки"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr "Предыдущий"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr "Ещё"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr "Мой предыдущий урок"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr "Мой следующий урок"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr "Следующий"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -808,52 +902,57 @@ msgstr "Фильтры"
 msgid "Filter results"
 msgstr "Результат фильтров"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr "Статистика пропусков, опозданий и замечаний"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr "Пропуски"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr "итак"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr "Без типа объяснительной"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr "Без пояснений"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr "Мои студенты"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr "Список студентов: %(group)s"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr "Отметить"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr "Переключить фильтры"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
@@ -862,32 +961,32 @@ msgstr ""
 "НД %(week)s:\n"
 "      %(instance)s"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr "Развернуть"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr "Обзор посещений урока"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr "без пояснений"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr "Суммированные опоздания"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr "Количество опозданий"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr "Нет доступных уроков"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
 "            There are no lessons for the selected group or teacher in this week.\n"
@@ -938,6 +1037,11 @@ msgstr "Редактировать дополнительную отметку"
 msgid "Assign group role for %(group)s"
 msgstr "Назначить роль группы для %(group)s"
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr "Назначить роль группы"
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr "Назначить"
@@ -1011,16 +1115,16 @@ msgstr "Проверьте, пожалуйста, эти записи в кла
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr "(о)"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr "(н)"
@@ -1044,8 +1148,8 @@ msgid "Unexcused absences"
 msgstr "Отсутствие без пояснений"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr "Сумма (п)"
@@ -1062,14 +1166,28 @@ msgstr "Регулярные обоснованные пропуски"
 msgid "Excuse types (not counted as absent)"
 msgstr "Типы объяснительных (не учитываются как пропуски)"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr "Мой предыдущий урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr "Мой следующий урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr "Следующий"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr "%(period)s. урок"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1080,13 +1198,13 @@ msgstr ""
 "            %(period_from)s.–%(period_to)s.  уроки\n"
 "          "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr "Сохранить"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1097,7 +1215,7 @@ msgstr ""
 "        Предыдущий урок %(subject)s\n"
 "      "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1108,11 +1226,11 @@ msgstr ""
 "        Следующий урок %(subject)s\n"
 "      "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr "Изменить историю"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr "Опоздания (мин)"
 
@@ -1182,8 +1300,7 @@ msgid ""
 "                "
 msgstr ""
 "\n"
-"                  Создать новый план рассадки %(group)s (%(subject)s) в "
-"%(room)s\n"
+"                  Создать новый план рассадки %(group)s (%(subject)s) в %(room)s\n"
 "                "
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78
@@ -1241,27 +1358,27 @@ msgid "No students available."
 msgstr "Нет доступных студентов."
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 msgid "Primary group"
 msgstr "Основная группа"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr "Неучтённые пропуски"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr "Сумма"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr "Регулярные обоснования"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr "Показать более детально"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr "Детали"
 
@@ -1446,78 +1563,116 @@ msgstr "Неделя"
 msgid "Notes"
 msgstr "Заметки"
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr "Вы или выбрали неправильный урок, или сейчас урока нет."
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr "Вам нельзя создавать учебные материалы для уроков в будущем."
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr "Учебный материал сохранён."
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr "Личные заметки сохранены."
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+#, fuzzy
+#| msgid "Generate printout"
+msgid "Generate full register printout for {}"
+msgstr "Подготовить к печати"
+
+#: aleksis/apps/alsijil/views.py:659
+#, fuzzy
+#| msgid "Generate printout"
+msgid "Generate full register printout …"
+msgstr "Подготовить к печати"
+
+#: aleksis/apps/alsijil/views.py:660
+#, fuzzy
+#| msgid "The personal note has been deleted."
+msgid "The printout has been generated successfully."
+msgstr "Личная заметка удалена."
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr "Отсутствие сохранено."
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr "Личная заметка удалена."
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr "Дополнительная отметка создана."
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr "Дополнительная отметка сохранена."
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr "Дополнительная отметка удалена."
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr "Тип объяснительной создан."
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr "Тип объяснительной сохранён."
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr "Тип объяснительной удалён."
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr "Роль группы создана."
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr "Роль группы сохранена."
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr "Роль группы удалена."
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr "Роль группы назначена."
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr "Назначение роли группы сохранено."
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr "Назначение роли группы остановлено."
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr "Назначение роли группы удалено."
+
+#~ msgid "Current lesson"
+#~ msgstr "Текущий урок"
+
+#~ msgid "Current week"
+#~ msgstr "Текущая неделя"
+
+#~ msgid "My overview"
+#~ msgstr "Мой обзор"
+
+#~ msgid "Manage group roles"
+#~ msgstr "Управление ролями групп"
diff --git a/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po
index 90e59955ce06421fc74620937eb7c06cce05da2b..7e8285208907941025f0a6da310079f0e35e214e 100644
--- a/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -49,55 +49,55 @@ msgstr ""
 msgid "Ask teacher to check data"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr ""
 
@@ -109,10 +109,10 @@ msgstr ""
 msgid "Before"
 msgstr ""
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
 msgid "Subject"
@@ -134,8 +134,8 @@ msgstr ""
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
 msgid "Group"
 msgstr ""
@@ -150,80 +150,80 @@ msgstr ""
 msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:194
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:195
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
 msgid "Absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
 msgid "Remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-msgid "Person"
-msgstr ""
-
-#: aleksis/apps/alsijil/forms.py:346
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:347
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
@@ -231,69 +231,6 @@ msgstr ""
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-msgid "My groups"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-msgid "Extra marks"
-msgstr ""
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr ""
-
 #: aleksis/apps/alsijil/model_extensions.py:191
 msgid "Can view week overview of group class register"
 msgstr ""
@@ -334,149 +271,248 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 msgid "Group note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:442
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:489
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:491
+msgid "Group Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:525
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:765
+msgid "Groups of Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:778
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:790
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:833
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:840
+msgid "Personal Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:841
+msgid "Personal Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:496
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr ""
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
@@ -557,6 +593,22 @@ msgstr ""
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr ""
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -569,24 +621,17 @@ msgid "Date"
 msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr ""
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr ""
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr ""
@@ -597,14 +642,46 @@ msgstr ""
 
 #: aleksis/apps/alsijil/tables.py:156
 #, python-brace-format
-msgid "{value}' late"
+msgid "{value}' tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+msgid "Sort data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+msgid "Load statistics ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr ""
 
@@ -648,26 +725,36 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr ""
 
@@ -682,8 +769,8 @@ msgstr ""
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr ""
 
@@ -700,39 +787,25 @@ msgstr ""
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 msgid "Persons"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr ""
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -785,84 +858,89 @@ msgstr ""
 msgid "Filter results"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
 "      %(instance)s"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
 "            There are no lessons for the selected group or teacher in this week.\n"
@@ -906,6 +984,11 @@ msgstr ""
 msgid "Assign group role for %(group)s"
 msgstr ""
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr ""
@@ -975,16 +1058,16 @@ msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr ""
@@ -1008,8 +1091,8 @@ msgid "Unexcused absences"
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr ""
@@ -1026,14 +1109,28 @@ msgstr ""
 msgid "Excuse types (not counted as absent)"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1041,13 +1138,13 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1055,7 +1152,7 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1063,11 +1160,11 @@ msgid ""
 "      "
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr ""
 
@@ -1183,27 +1280,27 @@ msgid "No students available."
 msgstr ""
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr ""
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr ""
 
@@ -1374,78 +1471,98 @@ msgstr ""
 msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:118
+#: aleksis/apps/alsijil/views.py:114
 msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:151
+#: aleksis/apps/alsijil/views.py:147
 msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:268
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:302
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1119
+#: aleksis/apps/alsijil/views.py:658
+msgid "Generate full register printout for {}"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:659
+msgid "Generate full register printout …"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:660
+msgid "The printout has been generated successfully."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1140
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1162
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1174
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1185
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1206
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1218
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1229
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1250
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1262
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1273
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1357
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1378
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr ""
 
-#: aleksis/apps/alsijil/views.py:1391
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr ""
diff --git a/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
index 4d42b8750e5d3f189681038046bb0137c9aba0ff..d3663a8befb259e29f630d7b08355882257e5e4a 100644
--- a/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2023-01-25 05:58+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/uk/>\n"
@@ -43,67 +43,62 @@ msgstr "{} просить Вас перевірити деякі записи к
 
 #: aleksis/apps/alsijil/actions.py:86
 #, python-brace-format
-msgid ""
-"We have successfully sent notifications to {count_teachers} persons for "
-"{count_items} lessons."
-msgstr ""
-"Ми надіслали сповіщення для {count_teachers} осіб щодо {count_items} уроків."
+msgid "We have successfully sent notifications to {count_teachers} persons for {count_items} lessons."
+msgstr "Ми надіслали сповіщення для {count_teachers} осіб щодо {count_items} уроків."
 
 #: aleksis/apps/alsijil/actions.py:92
 msgid "Ask teacher to check data"
 msgstr "Попросити вчителя перевірити дані"
 
-#: aleksis/apps/alsijil/data_checks.py:12
+#: aleksis/apps/alsijil/data_checks.py:16
 msgid "Delete object"
 msgstr "Видалити об'єкт"
 
-#: aleksis/apps/alsijil/data_checks.py:22
+#: aleksis/apps/alsijil/data_checks.py:26
 msgid "Set current groups"
 msgstr "Встановити поточні групи"
 
-#: aleksis/apps/alsijil/data_checks.py:33
+#: aleksis/apps/alsijil/data_checks.py:37
 msgid "Reset personal note to defaults"
 msgstr "Скинути персональні нотатки на типові"
 
-#: aleksis/apps/alsijil/data_checks.py:45
+#: aleksis/apps/alsijil/data_checks.py:49
 msgid "Ensure that there are no personal notes in cancelled lessons"
 msgstr "Переконайтеся, щоб у скасованих уроках не було особистих нотаток"
 
-#: aleksis/apps/alsijil/data_checks.py:46
+#: aleksis/apps/alsijil/data_checks.py:50
 msgid "The personal note is related to a cancelled lesson."
 msgstr "У скасованого уроку є пов'язані особисті нотатки."
 
-#: aleksis/apps/alsijil/data_checks.py:73
+#: aleksis/apps/alsijil/data_checks.py:77
 msgid "Ensure that 'groups_of_person' is set for every personal note"
-msgstr ""
-"Переконайтеся, що для кожної особистої нотатки установлені \"групи_осіб\""
+msgstr "Переконайтеся, що для кожної особистої нотатки установлені \"групи_осіб\""
 
-#: aleksis/apps/alsijil/data_checks.py:74
+#: aleksis/apps/alsijil/data_checks.py:78
 msgid "The personal note has no group in 'groups_of_person'."
 msgstr "Ця особиста нотатка не має групи у \"групах_осіб\"."
 
-#: aleksis/apps/alsijil/data_checks.py:99
+#: aleksis/apps/alsijil/data_checks.py:103
 msgid "Ensure that there are no filled out lesson documentations on holidays"
 msgstr "Переконайтеся, що на вихідні немає заповненого учбового матеріалу"
 
-#: aleksis/apps/alsijil/data_checks.py:100
+#: aleksis/apps/alsijil/data_checks.py:104
 msgid "The lesson documentation is on holidays."
 msgstr "На вихідних є учбовий матеріал."
 
-#: aleksis/apps/alsijil/data_checks.py:133
+#: aleksis/apps/alsijil/data_checks.py:137
 msgid "Ensure that there are no filled out personal notes on holidays"
 msgstr "Переконайтеся, що на вихідні немає заповнених особистих нотаток"
 
-#: aleksis/apps/alsijil/data_checks.py:134
+#: aleksis/apps/alsijil/data_checks.py:138
 msgid "The personal note is on holidays."
 msgstr "Ці особисті нотатки є на вихідних."
 
-#: aleksis/apps/alsijil/data_checks.py:162
+#: aleksis/apps/alsijil/data_checks.py:166
 msgid "Ensure that there are no excused personal notes without an absence"
-msgstr ""
-"Переконайтеся, що немає особистих нотаток щодо пояснення без відсутності"
+msgstr "Переконайтеся, що немає особистих нотаток щодо пояснення без відсутності"
 
-#: aleksis/apps/alsijil/data_checks.py:163
+#: aleksis/apps/alsijil/data_checks.py:167
 msgid "The personal note is marked as excused, but not as absent."
 msgstr "Ця персональна нотатка відмічена як пояснення, але не як пропуск."
 
@@ -115,13 +110,12 @@ msgstr "Після"
 msgid "Before"
 msgstr "Перед"
 
-#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:349
-#: aleksis/apps/alsijil/tables.py:116
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
-#: aleksis/apps/alsijil/forms.py:302
 msgid "Subject"
 msgstr "Предмет"
 
@@ -141,389 +135,407 @@ msgstr "Домашня робота на наступний урок"
 msgid "Carry over data to all other lessons with the same subject in this week"
 msgstr "Перенести дані на усі інші уроки з таким самим предметом на цьому тижні"
 
-#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:256
-#: aleksis/apps/alsijil/forms.py:348
+#: aleksis/apps/alsijil/forms.py:98 aleksis/apps/alsijil/forms.py:278
+#: aleksis/apps/alsijil/forms.py:370
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
-#: aleksis/apps/alsijil/forms.py:73 aleksis/apps/alsijil/forms.py:214
-#: aleksis/apps/alsijil/forms.py:301
 msgid "Group"
 msgstr "Група"
 
 #: aleksis/apps/alsijil/forms.py:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:190
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:221
-#: aleksis/apps/alsijil/forms.py:79
 msgid "Teacher"
 msgstr "Викладач"
 
-#: aleksis/apps/alsijil/forms.py:121 aleksis/apps/alsijil/forms.py:96
+#: aleksis/apps/alsijil/forms.py:121
 msgid "You can't select a group and a teacher both."
 msgstr "Ви не можете обрати одночасно групу та викладача."
 
-#: aleksis/apps/alsijil/forms.py:192 aleksis/apps/alsijil/forms.py:350
-#: aleksis/apps/alsijil/models.py:491
+#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
+msgid "Person"
+msgstr "Особа"
+
+#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
-#: aleksis/apps/alsijil/forms.py:150 aleksis/apps/alsijil/forms.py:303
-#: aleksis/apps/alsijil/models.py:480
 msgid "Start date"
 msgstr "Дата початку"
 
-#: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:351
-#: aleksis/apps/alsijil/models.py:495
+#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
-#: aleksis/apps/alsijil/forms.py:151 aleksis/apps/alsijil/forms.py:304
-#: aleksis/apps/alsijil/models.py:484
 msgid "End date"
 msgstr "Дата закінчення"
 
-#: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:152
+#: aleksis/apps/alsijil/forms.py:196
 msgid "Start period"
 msgstr "Початок уроків"
 
-#: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:153
+#: aleksis/apps/alsijil/forms.py:197
 msgid "End period"
 msgstr "Закінчення уроків"
 
-#: aleksis/apps/alsijil/forms.py:196 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
 #: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
-#: aleksis/apps/alsijil/forms.py:154
 msgid "Absent"
 msgstr "Відсутній(-я)"
 
-#: aleksis/apps/alsijil/forms.py:197 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/tables.py:146
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:135
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:87
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
-#: aleksis/apps/alsijil/forms.py:155
 msgid "Excused"
 msgstr "Пояснено"
 
-#: aleksis/apps/alsijil/forms.py:199 aleksis/apps/alsijil/models.py:71
-#: aleksis/apps/alsijil/models.py:253
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
-#: aleksis/apps/alsijil/forms.py:157 aleksis/apps/alsijil/models.py:245
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
 msgstr "Тип пояснення"
 
-#: aleksis/apps/alsijil/forms.py:204
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/forms.py:206
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:93
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
-#: aleksis/apps/alsijil/forms.py:162
 msgid "Remarks"
 msgstr "Зауваження"
 
-#: aleksis/apps/alsijil/forms.py:269
-#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
-#: aleksis/apps/alsijil/forms.py:227
-msgid "Person"
-msgstr "Особа"
-
-#: aleksis/apps/alsijil/forms.py:346 aleksis/apps/alsijil/forms.py:299
+#: aleksis/apps/alsijil/forms.py:368
 msgid "School term"
 msgstr "Навчальний рік"
 
-#: aleksis/apps/alsijil/forms.py:347 aleksis/apps/alsijil/forms.py:300
+#: aleksis/apps/alsijil/forms.py:369
 msgid "Has lesson documentation"
 msgstr "Має учбовий матеріал"
 
-#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/managers.py:91 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:172
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:236
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:311
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:99
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
 #: aleksis/apps/alsijil/util/alsijil_helpers.py:330
-#: aleksis/apps/alsijil/util/alsijil_helpers.py:315
 msgid "Event"
 msgstr "Подія"
 
-#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
-msgid "Class register"
-msgstr "Класний журнал"
-
-#: aleksis/apps/alsijil/menus.py:16
-msgid "Current lesson"
-msgstr "Поточний урок"
-
-#: aleksis/apps/alsijil/menus.py:27
-msgid "Current week"
-msgstr "Поточний тиждень"
-
-#: aleksis/apps/alsijil/menus.py:38
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
-msgid "My groups"
-msgstr "Мої групи"
-
-#: aleksis/apps/alsijil/menus.py:49
-msgid "My overview"
-msgstr "Мій огляд"
-
-#: aleksis/apps/alsijil/menus.py:60
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
-msgid "My students"
-msgstr "Мої студенти"
-
-#: aleksis/apps/alsijil/menus.py:71
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
-#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
-msgid "Assign group role"
-msgstr "Призначити роль групи"
-
-#: aleksis/apps/alsijil/menus.py:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
-#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
-msgid "All lessons"
-msgstr "Усі уроки"
-
-#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
-msgid "Excuse types"
-msgstr "Типи пояснень"
-
-#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:258
-#: aleksis/apps/alsijil/models.py:443 aleksis/apps/alsijil/tables.py:120
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
-#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
-#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
-#: aleksis/apps/alsijil/models.py:250 aleksis/apps/alsijil/models.py:432
-msgid "Extra marks"
-msgstr "Додаткові відмітки"
-
-#: aleksis/apps/alsijil/menus.py:115
-msgid "Manage group roles"
-msgstr "Керування ролями групи"
-
 #: aleksis/apps/alsijil/model_extensions.py:191
-#: aleksis/apps/alsijil/model_extensions.py:190
 msgid "Can view week overview of group class register"
 msgstr "Може бачити класний журнал групи за тиждень"
 
 #: aleksis/apps/alsijil/model_extensions.py:195
-#: aleksis/apps/alsijil/model_extensions.py:194
 msgid "Can view lesson overview of group class register"
 msgstr "Може бачити класний журнал групи за урок"
 
 #: aleksis/apps/alsijil/model_extensions.py:197
-#: aleksis/apps/alsijil/model_extensions.py:196
 msgid "Can view all personal notes of a group"
 msgstr "Може бачити усі особисті нотатки групи"
 
 #: aleksis/apps/alsijil/model_extensions.py:198
-#: aleksis/apps/alsijil/model_extensions.py:197
 msgid "Can edit all personal notes of a group"
 msgstr "Може редагувати усі особисті нотатки групи"
 
 #: aleksis/apps/alsijil/model_extensions.py:200
-#: aleksis/apps/alsijil/model_extensions.py:199
 msgid "Can view all lesson documentation of a group"
 msgstr "Може бачити увесь учбовий матеріал групи"
 
 #: aleksis/apps/alsijil/model_extensions.py:203
-#: aleksis/apps/alsijil/model_extensions.py:202
 msgid "Can edit all lesson documentation of a group"
 msgstr "Може редагувати увесь учбовий матеріал групи"
 
 #: aleksis/apps/alsijil/model_extensions.py:205
-#: aleksis/apps/alsijil/model_extensions.py:204
 msgid "Can view full register of a group"
 msgstr "Може бачити класний журнал групи без обмежень"
 
 #: aleksis/apps/alsijil/model_extensions.py:207
-#: aleksis/apps/alsijil/model_extensions.py:206
 msgid "Can register an absence for all members of a group"
 msgstr "Може реєструвати пропуски для усіх учасників групи"
 
 #: aleksis/apps/alsijil/model_extensions.py:209
-#: aleksis/apps/alsijil/model_extensions.py:208
 msgid "Can assign a group role for this group"
 msgstr "Може призначати роль групи для цієї групи"
 
 #: aleksis/apps/alsijil/model_extensions.py:210
-#: aleksis/apps/alsijil/model_extensions.py:209
 msgid "Can register an absence for a person"
 msgstr "Може реєструвати відсутність особи"
 
-#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:430
-#: aleksis/apps/alsijil/models.py:419
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr "Коротке ім'я"
 
-#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:431
-#: aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
-#: aleksis/apps/alsijil/models.py:420 aleksis/apps/alsijil/models.py:444
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr "Повне ім'я"
 
-#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Кількість відсутніх"
 
-#: aleksis/apps/alsijil/models.py:57
-msgid ""
-"If checked, this excuse type will be counted as a missed lesson. If not "
-"checked,it won't show up in the absence report."
-msgstr ""
-"Якщо відмічено, цей тип пояснення буде зарахований як пропущений урок. Якщо "
-"не відмічено, то без запису у звіт відсутності."
+#: aleksis/apps/alsijil/models.py:70
+msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
+msgstr "Якщо відмічено, цей тип пояснення буде зарахований як пропущений урок. Якщо не відмічено, то без запису у звіт відсутності."
+
+#: aleksis/apps/alsijil/models.py:85
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr "Типи пояснень"
 
-#: aleksis/apps/alsijil/models.py:233 aleksis/apps/alsijil/models.py:332
-#: aleksis/apps/alsijil/models.py:225 aleksis/apps/alsijil/models.py:324
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr "Рік"
 
-#: aleksis/apps/alsijil/models.py:292 aleksis/apps/alsijil/models.py:284
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
+#: aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:19
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr "Додаткові відмітки"
+
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr "Особиста нотатка"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
-#: aleksis/apps/alsijil/models.py:285
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Особисті нотатки"
 
-#: aleksis/apps/alsijil/models.py:344
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/models.py:351
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:25
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
-#: aleksis/apps/alsijil/models.py:336
 msgid "Lesson topic"
 msgstr "Тема уроку"
 
-#: aleksis/apps/alsijil/models.py:345
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:33
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
-#: aleksis/apps/alsijil/models.py:337
 msgid "Homework"
 msgstr "Домашня робота"
 
-#: aleksis/apps/alsijil/models.py:346
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
-#: aleksis/apps/alsijil/models.py:338
+#: aleksis/apps/alsijil/models.py:353
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:41
 msgid "Group note"
 msgstr "Групова нотатка"
 
-#: aleksis/apps/alsijil/models.py:396
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
-#: aleksis/apps/alsijil/models.py:385
+#: aleksis/apps/alsijil/models.py:403
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Учбовий матеріал"
 
-#: aleksis/apps/alsijil/models.py:397
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
-#: aleksis/apps/alsijil/models.py:386
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr "Учбові матеріали"
 
-#: aleksis/apps/alsijil/models.py:442 aleksis/apps/alsijil/models.py:431
+#: aleksis/apps/alsijil/models.py:440
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:441
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:443
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr "Додаткова відмітка"
 
-#: aleksis/apps/alsijil/models.py:456 aleksis/apps/alsijil/models.py:445
+#: aleksis/apps/alsijil/models.py:474
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
+msgid "Teachers"
+msgstr "Викладачі"
+
+#: aleksis/apps/alsijil/models.py:489
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Тема уроку"
+
+#: aleksis/apps/alsijil/models.py:491
+#, fuzzy
+#| msgid "Group note"
+msgid "Group Note"
+msgstr "Групова нотатка"
+
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Учбовий матеріал"
+
+#: aleksis/apps/alsijil/models.py:525
+#, fuzzy
+#| msgid "Lesson documentations"
+msgid "Documentations"
+msgstr "Учбові матеріали"
+
+#: aleksis/apps/alsijil/models.py:765
+#, fuzzy
+#| msgid "Group roles"
+msgid "Groups of Person"
+msgstr "Ролі груп"
+
+#: aleksis/apps/alsijil/models.py:778
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Відсутності"
+
+#: aleksis/apps/alsijil/models.py:790
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Відсутності"
+
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:831
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Нотатки"
+
+#: aleksis/apps/alsijil/models.py:833
+#, fuzzy
+#| msgid "Extra mark"
+msgid "Extra Mark"
+msgstr "Додаткова відмітка"
+
+#: aleksis/apps/alsijil/models.py:840
+#, fuzzy
+#| msgid "Personal note"
+msgid "Personal Note"
+msgstr "Особиста нотатка"
+
+#: aleksis/apps/alsijil/models.py:841
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Особисті нотатки"
+
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr "Піктограма"
 
-#: aleksis/apps/alsijil/models.py:457 aleksis/apps/alsijil/models.py:446
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr "Колір"
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
-#: aleksis/apps/alsijil/models.py:452 aleksis/apps/alsijil/models.py:467
 msgid "Group role"
 msgstr "Роль групи"
 
-#: aleksis/apps/alsijil/models.py:464
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/models.py:864
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
-#: aleksis/apps/alsijil/models.py:453
 msgid "Group roles"
 msgstr "Ролі груп"
 
-#: aleksis/apps/alsijil/models.py:468 aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr "Може призначати роль групи"
 
-#: aleksis/apps/alsijil/models.py:484 aleksis/apps/alsijil/models.py:473
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr "Призначена особа"
 
-#: aleksis/apps/alsijil/models.py:489 aleksis/apps/alsijil/tables.py:105
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
-#: aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr "Групи"
 
-#: aleksis/apps/alsijil/models.py:496 aleksis/apps/alsijil/models.py:485
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Якщо немає точної кінцевої дати, можна залишити порожнім"
 
-#: aleksis/apps/alsijil/models.py:511 aleksis/apps/alsijil/models.py:500
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr "Призначення ролі групи"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:501
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr "Призначення ролі групи"
 
-#: aleksis/apps/alsijil/models.py:519 aleksis/apps/alsijil/models.py:508
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr "Може бачити огляд уроку"
 
-#: aleksis/apps/alsijil/models.py:520 aleksis/apps/alsijil/models.py:509
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr "Може бачити огляд тижня"
 
-#: aleksis/apps/alsijil/models.py:521 aleksis/apps/alsijil/models.py:510
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr "Може бачити весь журнал"
 
-#: aleksis/apps/alsijil/models.py:522 aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr "Може реєструвати пропуск"
 
-#: aleksis/apps/alsijil/models.py:523 aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr "Може бачити усі фільтри особистих нотаток"
 
+#: aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr "Класний журнал"
+
 #: aleksis/apps/alsijil/preferences.py:17
 msgid "Block adding personal notes for cancelled lessons"
 msgstr "Блокувати додавання особистих нотаток до скасованих уроків"
@@ -533,127 +545,93 @@ msgid "Allow users to view their own personal notes"
 msgstr "Дозволити користувачам переглядати власні особисті нотатки"
 
 #: aleksis/apps/alsijil/preferences.py:34
-msgid ""
-"Allow primary group owners to register future absences for students in their "
-"groups"
-msgstr ""
-"Дозволити власникам основних груп реєструвати майбутні пропуски студентів у "
-"своїх групах"
+msgid "Allow primary group owners to register future absences for students in their groups"
+msgstr "Дозволити власникам основних груп реєструвати майбутні пропуски студентів у своїх групах"
 
 #: aleksis/apps/alsijil/preferences.py:44
-msgid ""
-"Grant the owner of a parent group the same privileges as the owners of the "
-"respective child groups"
-msgstr ""
-"Надати власнику батьківської групи такі самі повноваження, як і власникам "
-"відповідних підлеглих груп"
+msgid "Grant the owner of a parent group the same privileges as the owners of the respective child groups"
+msgstr "Надати власнику батьківської групи такі самі повноваження, як і власникам відповідних підлеглих груп"
 
 #: aleksis/apps/alsijil/preferences.py:54
-#: aleksis/apps/alsijil/preferences.py:43
-msgid ""
-"Allow original teachers to edit their lessons although they are substituted"
-msgstr ""
-"Дозволити початковим викладачам редагувати свої уроки навіть після їх заміни"
+msgid "Allow original teachers to edit their lessons although they are substituted"
+msgstr "Дозволити початковим викладачам редагувати свої уроки навіть після їх заміни"
 
 #: aleksis/apps/alsijil/preferences.py:63
-#: aleksis/apps/alsijil/preferences.py:52
-msgid ""
-"Carry over data from first lesson period to the following lesson periods in "
-"lessons over multiple periods"
-msgstr ""
-"Переносити дані з першого уроку в розкладі на поточні уроки через декілька "
-"уроків"
+msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods"
+msgstr "Переносити дані з першого уроку в розкладі на поточні уроки через декілька уроків"
 
 #: aleksis/apps/alsijil/preferences.py:66
-#: aleksis/apps/alsijil/preferences.py:55
-msgid ""
-"This will carry over data only if the data in the following periods are "
-"empty."
+msgid "This will carry over data only if the data in the following periods are empty."
 msgstr "Це перенесе дані лише в тому разі, коли в поточних уроках даних немає."
 
 #: aleksis/apps/alsijil/preferences.py:75
-msgid ""
-"Allow carrying over data from any lesson period to all other "
-"lesson                 periods with the same lesson and in the same week"
-msgstr ""
-"Дозволити переносити дані з будь-якого уроку на усі інші                 "
-"уроки з таким самим номером урока на тому самому тижні"
+msgid "Allow carrying over data from any lesson period to all other lesson                 periods with the same lesson and in the same week"
+msgstr "Дозволити переносити дані з будь-якого уроку на усі інші                 уроки з таким самим номером урока на тому самому тижні"
 
 #: aleksis/apps/alsijil/preferences.py:79
-msgid ""
-"This will carry over data only if the data in the aforementioned periods are "
-"empty."
-msgstr ""
-"Це перенесе дані лише в тому разі, коли у вищезгаданих уроках даних немає."
+msgid "This will carry over data only if the data in the aforementioned periods are empty."
+msgstr "Це перенесе дані лише в тому разі, коли у вищезгаданих уроках даних немає."
 
 #: aleksis/apps/alsijil/preferences.py:88
-#: aleksis/apps/alsijil/preferences.py:63
-msgid ""
-"Carry over personal notes to all following lesson periods on the same day."
+msgid "Carry over personal notes to all following lesson periods on the same day."
 msgstr "Переносити особисті нотатки до всіх наступних уроків того ж дня."
 
 #: aleksis/apps/alsijil/preferences.py:97
-#: aleksis/apps/alsijil/preferences.py:72
-msgid ""
-"Allow teachers to open lesson periods on the same day and not just at the "
-"beginning of the period"
-msgstr ""
-"Дозволити викладачам відкривати уроки того самого дня і не лише на початку "
-"уроків"
+msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period"
+msgstr "Дозволити викладачам відкривати уроки того самого дня і не лише на початку уроків"
 
 #: aleksis/apps/alsijil/preferences.py:101
-#: aleksis/apps/alsijil/preferences.py:76
-msgid ""
-"Lessons in the past are not affected by this setting, you can open them "
-"whenever you want."
-msgstr ""
-"Ці налаштування не впливають на минулі уроки. Ви можете відкривати їх будь-"
-"коли."
+msgid "Lessons in the past are not affected by this setting, you can open them whenever you want."
+msgstr "Ці налаштування не впливають на минулі уроки. Ви можете відкривати їх будь-коли."
 
 #: aleksis/apps/alsijil/preferences.py:110
-#: aleksis/apps/alsijil/preferences.py:85
 msgid "Allow teachers to add data for lessons in holidays"
-msgstr ""
-"Дозволити викладачам додавати навчальний матеріал (дані для уроків) на "
-"вихідних"
+msgstr "Дозволити викладачам додавати навчальний матеріал (дані для уроків) на вихідних"
 
 #: aleksis/apps/alsijil/preferences.py:119
-#: aleksis/apps/alsijil/preferences.py:94
-msgid ""
-"Allow group owners to assign group roles to the parents of the group's "
-"members"
+msgid "Allow group owners to assign group roles to the parents of the group's members"
 msgstr "Дозволити власникам груп призначати ролі груп батькам учасників груп"
 
 #: aleksis/apps/alsijil/preferences.py:128
-#: aleksis/apps/alsijil/preferences.py:103
 msgid "Show assigned group roles in week view"
 msgstr "Показати призначені ролі груп у тижневому огляді"
 
 #: aleksis/apps/alsijil/preferences.py:129
-#: aleksis/apps/alsijil/preferences.py:104
 msgid "Only week view of groups"
 msgstr "Лише тижневі огляди груп"
 
 #: aleksis/apps/alsijil/preferences.py:137
-#: aleksis/apps/alsijil/preferences.py:112
 msgid "Show assigned group roles in lesson view"
 msgstr "Показати призначені ролі груп в огляді уроку"
 
 #: aleksis/apps/alsijil/preferences.py:147
-#: aleksis/apps/alsijil/preferences.py:122
 msgid "Items per page in lessons table"
 msgstr "Кількість записів у розкладі на сторінку"
 
 #: aleksis/apps/alsijil/preferences.py:151
-#: aleksis/apps/alsijil/preferences.py:126
 msgid "Each page must show at least one item."
 msgstr "Кожна сторінка повинна мати принаймні один запис."
 
 #: aleksis/apps/alsijil/preferences.py:159
-#: aleksis/apps/alsijil/preferences.py:134
 msgid "Filter lessons by existence of their lesson documentation on default"
 msgstr "Типово фільтувати уроки за наявністю у них учбового матеріалу"
 
+#: aleksis/apps/alsijil/preferences.py:170
+msgid "Allow editing of all future documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:173
+msgid "Allow editing of all documentations up to and including those on the current day"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:178
+msgid "Allow editing of all documentations up to and including those on the current date and time"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:183
+msgid "Set time range for which documentations may be edited"
+msgstr ""
+
 #: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
 #: aleksis/apps/alsijil/tables.py:72
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
@@ -666,24 +644,17 @@ msgid "Date"
 msgstr "Дата"
 
 #: aleksis/apps/alsijil/tables.py:99
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:122
 msgid "Period"
 msgstr "Урок"
 
-#: aleksis/apps/alsijil/tables.py:111
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
-msgid "Teachers"
-msgstr "Викладачі"
-
 #: aleksis/apps/alsijil/tables.py:118
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:161
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:21
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:46
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:123
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
 msgid "Tardiness"
 msgstr "Запізнення"
@@ -693,15 +664,52 @@ msgid "Excuse"
 msgstr "Пояснення"
 
 #: aleksis/apps/alsijil/tables.py:156
-#, python-brace-format
-msgid "{value}' late"
+#, fuzzy, python-brace-format
+#| msgid "{value}' late"
+msgid "{value}' tardiness"
 msgstr "{value}' затримка"
 
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+#, fuzzy
+#| msgid "Start date"
+msgid "Sort data ..."
+msgstr "Дата початку"
+
+#: aleksis/apps/alsijil/tasks.py:64
+msgid "Load lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:104
+msgid "Sort lesson data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:133
+#, fuzzy
+#| msgid "Statistics"
+msgid "Load statistics ..."
+msgstr "Статистика"
+
+#: aleksis/apps/alsijil/tasks.py:173
+msgid "Generate template ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:179
+msgid "Generate PDF ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:185
+msgid "PDF generation failed"
+msgstr ""
+
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
 #: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:380
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:140
 msgid "Register absence"
 msgstr "Реєстрація відсутності"
 
@@ -740,13 +748,11 @@ msgstr " %(count)s залежних уроків "
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:40
 msgid ""
 "\n"
-"                  There are no affected lessons. Registering this absence "
-"won't have any effect.\n"
+"                  There are no affected lessons. Registering this absence won't have any effect.\n"
 "                "
 msgstr ""
 "\n"
-"                  Залежних уроків немає. Реєстрація пропуску ні на що не "
-"впливає.\n"
+"                  Залежних уроків немає. Реєстрація пропуску ні на що не впливає.\n"
 "                "
 
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:57
@@ -757,26 +763,36 @@ msgstr "Скинути статус на 'не відсутній'"
 msgid "Cancel"
 msgstr "Скасувати"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr "Усі уроки"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr "Мої групи"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
 msgid "Students"
 msgstr "Студенти"
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:59
 msgid "Students list"
 msgstr "Список студентів"
 
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:19
 msgid "Week view"
 msgstr "Тижневий огляд"
 
@@ -791,8 +807,8 @@ msgstr "Ролі"
 #: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:66
 msgid "Generate printout"
 msgstr "Підготувати для друку"
 
@@ -809,39 +825,25 @@ msgstr "студенти"
 msgid "Lesson"
 msgstr "Урок"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:37
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:83
 msgid "Persons"
 msgstr "Особи"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:45
 msgid "Seating plan"
 msgstr "План розсадження"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:55
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:32
 msgid "Previous"
 msgstr "Попередній"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:63
 msgid "More"
 msgstr "Ще"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
-msgid "My previous lesson"
-msgstr "Мій попередній урок"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
-msgid "My next lesson"
-msgstr "Мій наступний урок"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
-msgid "Next"
-msgstr "Наступний"
-
-#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:114
 msgid ""
 "\n"
 "                  This lesson overlaps with holidays and can't be edited.\n"
@@ -900,52 +902,57 @@ msgstr "Фільтри"
 msgid "Filter results"
 msgstr "Результат фільтрів"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:120
 msgid "Statistics on absences, tardiness and remarks"
 msgstr "Статистика пропусків, запізнень та зауважень"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:129
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:82
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
 msgid "Absences"
 msgstr "Відсутності"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:139
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
 msgid "thereof"
 msgstr "отже"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:141
 msgid "Without Excuse Type"
 msgstr "Без Типу Пояснення"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:151
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:104
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
 msgid "Unexcused"
 msgstr "Необґрунтоване"
 
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr "Мої студенти"
+
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
 #: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
 #, python-format
 msgid "Students list: %(group)s"
 msgstr "Список студентів: %(group)s"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:25
 msgid "Select"
 msgstr "Обрати"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:31
 msgid "Toggle filters"
 msgstr "Перемикнути фільтри"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:38
 #, python-format
 msgid ""
 "CW %(week)s:\n"
@@ -954,36 +961,35 @@ msgstr ""
 "ТЖ %(week)s:\n"
 "      %(instance)s"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:289
 msgid "Unfold"
 msgstr "Розгорнути"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:355
 msgid "Visit lesson overview"
 msgstr "Перегляд відвідування уроку"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:393
 msgid "unexcused"
 msgstr "непояснене"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:396
 msgid "Summed up tardiness"
 msgstr "Сумарні запізнення"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:399
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:126
 msgid "Count of tardiness"
 msgstr "Кількість запізень"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:431
 msgid "No lessons available"
 msgstr "Немає доступних уроків"
 
-#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:434
 msgid ""
 "\n"
-"            There are no lessons for the selected group or teacher in this "
-"week.\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
 "          "
 msgstr ""
 "\n"
@@ -1005,17 +1011,13 @@ msgstr "Редагувати тип пояснення"
 #: aleksis/apps/alsijil/templates/alsijil/group_role/warning.html:4
 msgid ""
 "\n"
-"    This function should only be used to define alternatives to the default "
-"excuse which also will be counted extra.\n"
-"    Don't use this to create a default excuse or if you don't divide between "
-"different types of excuse.\n"
+"    This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"    Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
 "  "
 msgstr ""
 "\n"
-"    Ця функція використовується лише для визначення альтернатив до типового "
-"пояснення, яке додатково буде враховане.\n"
-"    Не користуйтеся цим для створення типового пояснення або якщо не "
-"розділяєте на типи пояснень.\n"
+"    Ця функція використовується лише для визначення альтернатив до типового пояснення, яке додатково буде враховане.\n"
+"    Не користуйтеся цим для створення типового пояснення або якщо не розділяєте на типи пояснень.\n"
 "  "
 
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:6
@@ -1035,6 +1037,11 @@ msgstr "Редагувати додаткову позначку"
 msgid "Assign group role for %(group)s"
 msgstr "Призначити роль групи для %(group)s"
 
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr "Призначити роль групи"
+
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
 msgid "Assign"
 msgstr "Призначити"
@@ -1089,14 +1096,12 @@ msgstr "Ніхто не призначений."
 #: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:41
 msgid ""
 "\n"
-"    You can get some additional actions for each group role assignment if "
-"you click on the name of the\n"
+"    You can get some additional actions for each group role assignment if you click on the name of the\n"
 "    corresponding person.\n"
 "  "
 msgstr ""
 "\n"
-"    Ви можете отримати деякі додаткові дії для кожного призначення ролі "
-"групи після кліку\n"
+"    Ви можете отримати деякі додаткові дії для кожного призначення ролі групи після кліку\n"
 "     на ім'я відповідної особи.\n"
 "  "
 
@@ -1105,24 +1110,21 @@ msgid "Stop"
 msgstr "Стоп"
 
 #: aleksis/apps/alsijil/templates/alsijil/notifications/check.html:1
-msgid ""
-"Please check if the following class register entries are complete and "
-"correct:"
-msgstr ""
-"Перевірте, будь ласка, чи ці записи класного журналу повні та правильні:"
+msgid "Please check if the following class register entries are complete and correct:"
+msgstr "Перевірте, будь ласка, чи ці записи класного журналу повні та правильні:"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:29
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:52
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
 msgid "(e)"
 msgstr "(п)"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:35
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:58
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
 msgid "(u)"
 msgstr "(н)"
@@ -1146,8 +1148,8 @@ msgid "Unexcused absences"
 msgstr "Необґрунтовані пропуски"
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:51
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
 msgid "Sum (e)"
 msgstr "Сума (п)"
@@ -1164,14 +1166,28 @@ msgstr "Регулярні пояснення пропусків"
 msgid "Excuse types (not counted as absent)"
 msgstr "Типи пояснень (не враховані як пропуски)"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+msgid "My previous lesson"
+msgstr "Мій попередній урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:36
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+msgid "My next lesson"
+msgstr "Мій наступний урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:43
+msgid "Next"
+msgstr "Наступний"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:77
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:91
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
 #, python-format
 msgid "%(period)s. period"
 msgstr "%(period)s. урок"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:80
 #, python-format
 msgid ""
 "\n"
@@ -1182,13 +1198,13 @@ msgstr ""
 "            %(period_from)s.–%(period_to)s.  уроки\n"
 "          "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:139
 msgid "Save"
 msgstr "Зберегти"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:20
 #, python-format
 msgid ""
 "\n"
@@ -1199,7 +1215,7 @@ msgstr ""
 "        Попередній урок %(subject)s\n"
 "      "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:31
 #, python-format
 msgid ""
 "\n"
@@ -1210,11 +1226,11 @@ msgstr ""
 "        Наступний урок %(subject)s\n"
 "      "
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:11
 msgid "Change history"
 msgstr "Змінити історію"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:58
 msgid "Tardiness (in m)"
 msgstr "Запізнення (хв)"
 
@@ -1255,15 +1271,12 @@ msgstr ""
 #, python-format
 msgid ""
 "\n"
-"            This seating plan is taken from the parent group of "
-"%(child_group)s.\n"
-"            If you want, you can take it over for your group and then "
-"customize it.\n"
+"            This seating plan is taken from the parent group of %(child_group)s.\n"
+"            If you want, you can take it over for your group and then customize it.\n"
 "          "
 msgstr ""
 "\n"
-"            Цей план розсадження взятий із батьківської групи "
-"%(child_group)s.\n"
+"            Цей план розсадження взятий із батьківської групи %(child_group)s.\n"
 "            При необхідності, Ви можете його налаштувати під свою групу.\n"
 "          "
 
@@ -1283,13 +1296,11 @@ msgstr "Для цього уроку немає плану розсадженн
 #, python-format
 msgid ""
 "\n"
-"                  Create a new seating plan for %(group)s (%(subject)s) in "
-"%(room)s\n"
+"                  Create a new seating plan for %(group)s (%(subject)s) in %(room)s\n"
 "                "
 msgstr ""
 "\n"
-"                  Створити новий план розсадження %(group)s (%(subject)s) у "
-"%(room)s\n"
+"                  Створити новий план розсадження %(group)s (%(subject)s) у %(room)s\n"
 "                "
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78
@@ -1347,27 +1358,27 @@ msgid "No students available."
 msgstr "Немає доступних студентів."
 
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
 msgid "Primary group"
 msgstr "Основна група"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
 msgid "Uncounted Absences"
 msgstr "Невраховані пропуски"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
 msgid "Sum"
 msgstr "Сума"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:92
 msgid "Regular excused"
 msgstr "Регулярні пояснення"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:132
 msgid "Show more details"
 msgstr "Показати більш детально"
 
-#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:133
 msgid "Details"
 msgstr "Деталі"
 
@@ -1541,8 +1552,6 @@ msgstr "Так"
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:386
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:483
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:498
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:484
-#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:499
 msgid "e"
 msgstr "п"
 
@@ -1554,83 +1563,116 @@ msgstr "Тиждень"
 msgid "Notes"
 msgstr "Нотатки"
 
-#: aleksis/apps/alsijil/views.py:118
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
+#: aleksis/apps/alsijil/views.py:114
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr "Або Ви обрали неправильний урок, або зараз уроку немає."
 
-#: aleksis/apps/alsijil/views.py:151
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
+#: aleksis/apps/alsijil/views.py:147
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr "Вам не дозволено створювати учбові матеріали для уроку у майбутньому."
 
-#: aleksis/apps/alsijil/views.py:268 aleksis/apps/alsijil/views.py:266
+#: aleksis/apps/alsijil/views.py:264
 msgid "The lesson documentation has been saved."
 msgstr "Учбовий матеріал збережений."
 
-#: aleksis/apps/alsijil/views.py:302 aleksis/apps/alsijil/views.py:300
+#: aleksis/apps/alsijil/views.py:298
 msgid "The personal notes have been saved."
 msgstr "Особисті нотатки збережені."
 
-#: aleksis/apps/alsijil/views.py:1119 aleksis/apps/alsijil/views.py:1079
+#: aleksis/apps/alsijil/views.py:658
+#, fuzzy
+#| msgid "Generate printout"
+msgid "Generate full register printout for {}"
+msgstr "Підготувати для друку"
+
+#: aleksis/apps/alsijil/views.py:659
+#, fuzzy
+#| msgid "Generate printout"
+msgid "Generate full register printout …"
+msgstr "Підготувати для друку"
+
+#: aleksis/apps/alsijil/views.py:660
+#, fuzzy
+#| msgid "The personal note has been deleted."
+msgid "The printout has been generated successfully."
+msgstr "Особиста нотатка видалена."
+
+#: aleksis/apps/alsijil/views.py:661
+msgid "There was a problem while generating the printout."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:664
+msgid "Download PDF"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1030
 msgid "The absence has been saved."
 msgstr "Пропуск збережений."
 
-#: aleksis/apps/alsijil/views.py:1140 aleksis/apps/alsijil/views.py:1100
+#: aleksis/apps/alsijil/views.py:1051
 msgid "The personal note has been deleted."
 msgstr "Особиста нотатка видалена."
 
-#: aleksis/apps/alsijil/views.py:1162 aleksis/apps/alsijil/views.py:1122
+#: aleksis/apps/alsijil/views.py:1074
 msgid "The extra mark has been created."
 msgstr "Додаткова позначка сторена."
 
-#: aleksis/apps/alsijil/views.py:1174 aleksis/apps/alsijil/views.py:1134
+#: aleksis/apps/alsijil/views.py:1086
 msgid "The extra mark has been saved."
 msgstr "Додаткова позначка збережена."
 
-#: aleksis/apps/alsijil/views.py:1185 aleksis/apps/alsijil/views.py:1145
+#: aleksis/apps/alsijil/views.py:1097
 msgid "The extra mark has been deleted."
 msgstr "Додаткова позначка видалена."
 
-#: aleksis/apps/alsijil/views.py:1206 aleksis/apps/alsijil/views.py:1166
+#: aleksis/apps/alsijil/views.py:1119
 msgid "The excuse type has been created."
 msgstr "Тип пояснення створений."
 
-#: aleksis/apps/alsijil/views.py:1218 aleksis/apps/alsijil/views.py:1178
+#: aleksis/apps/alsijil/views.py:1131
 msgid "The excuse type has been saved."
 msgstr "Тип пояснення збережений."
 
-#: aleksis/apps/alsijil/views.py:1229 aleksis/apps/alsijil/views.py:1189
+#: aleksis/apps/alsijil/views.py:1142
 msgid "The excuse type has been deleted."
 msgstr "Тип пояснення видалений."
 
-#: aleksis/apps/alsijil/views.py:1250 aleksis/apps/alsijil/views.py:1210
+#: aleksis/apps/alsijil/views.py:1164
 msgid "The group role has been created."
 msgstr "Роль групи створена."
 
-#: aleksis/apps/alsijil/views.py:1262 aleksis/apps/alsijil/views.py:1222
+#: aleksis/apps/alsijil/views.py:1176
 msgid "The group role has been saved."
 msgstr "Роль групи збережена."
 
-#: aleksis/apps/alsijil/views.py:1273 aleksis/apps/alsijil/views.py:1233
+#: aleksis/apps/alsijil/views.py:1187
 msgid "The group role has been deleted."
 msgstr "Роль групи видалена."
 
-#: aleksis/apps/alsijil/views.py:1306 aleksis/apps/alsijil/views.py:1338
-#: aleksis/apps/alsijil/views.py:1266 aleksis/apps/alsijil/views.py:1298
+#: aleksis/apps/alsijil/views.py:1221 aleksis/apps/alsijil/views.py:1253
 msgid "The group role has been assigned."
 msgstr "Роль групи призначена."
 
-#: aleksis/apps/alsijil/views.py:1357 aleksis/apps/alsijil/views.py:1317
+#: aleksis/apps/alsijil/views.py:1272
 msgid "The group role assignment has been saved."
 msgstr "Призначення ролі групи збережене."
 
-#: aleksis/apps/alsijil/views.py:1378 aleksis/apps/alsijil/views.py:1338
+#: aleksis/apps/alsijil/views.py:1293
 msgid "The group role assignment has been stopped."
 msgstr "Призначення ролі групи зупинене."
 
-#: aleksis/apps/alsijil/views.py:1391 aleksis/apps/alsijil/views.py:1351
+#: aleksis/apps/alsijil/views.py:1306
 msgid "The group role assignment has been deleted."
 msgstr "Призначення ролі групи видалене."
+
+#~ msgid "Current lesson"
+#~ msgstr "Поточний урок"
+
+#~ msgid "Current week"
+#~ msgstr "Поточний тиждень"
+
+#~ msgid "My overview"
+#~ msgstr "Мій огляд"
+
+#~ msgid "Manage group roles"
+#~ msgstr "Керування ролями групи"
diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py
index 2e8b2e558e78c84ac83674840f0a3f8b2eb259c5..7d0130805275359672d1337133eacd1b0a2b62ad 100644
--- a/aleksis/apps/alsijil/managers.py
+++ b/aleksis/apps/alsijil/managers.py
@@ -11,7 +11,7 @@ from django.utils.translation import gettext as _
 from calendarweek import CalendarWeek
 
 from aleksis.apps.chronos.managers import DateRangeQuerySetMixin
-from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations
+from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations, PolymorphicBaseManager
 
 if TYPE_CHECKING:
     from aleksis.core.models import Group
@@ -187,3 +187,27 @@ class GroupRoleAssignmentQuerySet(DateRangeQuerySetMixin, QuerySet):
     def for_group(self, group: "Group"):
         """Filter all role assignments for a group."""
         return self.filter(Q(groups=group) | Q(groups__child_groups=group))
+
+
+class DocumentationManager(PolymorphicBaseManager):
+    """Manager adding specific methods to documentations."""
+
+    def get_queryset(self):
+        """Ensure often used related data are loaded as well."""
+        return (
+            super()
+            .get_queryset()
+            .select_related(
+                "course",
+                "subject",
+            )
+            .prefetch_related("teachers")
+        )
+
+
+class ParticipationStatusManager(PolymorphicBaseManager):
+    """Manager adding specific methods to participation statuses."""
+
+    def get_queryset(self):
+        """Ensure often used related data are loaded as well."""
+        return super().get_queryset().select_related("person", "absence_reason", "base_absence")
diff --git a/aleksis/apps/alsijil/migrations/0022_documentation_participation_touched_at.py b/aleksis/apps/alsijil/migrations/0022_documentation_participation_touched_at.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef09ddca37a893128571818368982e29bd0c219f
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0022_documentation_participation_touched_at.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.6 on 2024-06-06 09:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('alsijil', '0021_remove_participationstatus_absent_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='documentation',
+            name='participation_touched_at',
+            field=models.DateTimeField(blank=True, null=True, verbose_name='Participation touched at'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 2449efb3176ed973fbc11368b562bc891ff23f2e..9e68ccd06773dc8b0f6ee65ccd16c81319b94a8b 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -9,8 +9,9 @@ from django.db.models import QuerySet
 from django.db.models.constraints import CheckConstraint
 from django.db.models.query_utils import Q
 from django.urls import reverse
+from django.utils import timezone
 from django.utils.formats import date_format
-from django.utils.timezone import localdate, localtime
+from django.utils.timezone import localdate, localtime, now
 from django.utils.translation import gettext_lazy as _
 
 from calendarweek import CalendarWeek
@@ -24,12 +25,14 @@ from aleksis.apps.alsijil.data_checks import (
     PersonalNoteOnHolidaysDataCheck,
 )
 from aleksis.apps.alsijil.managers import (
+    DocumentationManager,
     GroupRoleAssignmentManager,
     GroupRoleAssignmentQuerySet,
     GroupRoleManager,
     GroupRoleQuerySet,
     LessonDocumentationManager,
     LessonDocumentationQuerySet,
+    ParticipationStatusManager,
     PersonalNoteManager,
     PersonalNoteQuerySet,
 )
@@ -42,7 +45,7 @@ from aleksis.apps.kolego.models import Absence as KolegoAbsence
 from aleksis.apps.kolego.models import AbsenceReason
 from aleksis.core.data_checks import field_validation_data_check_factory
 from aleksis.core.mixins import ExtensibleModel, GlobalPermissionModel
-from aleksis.core.models import CalendarEvent, Group, SchoolTerm
+from aleksis.core.models import CalendarEvent, Group, Person, SchoolTerm
 from aleksis.core.util.core_helpers import get_site_preferences
 from aleksis.core.util.model_helpers import ICONS
 
@@ -460,6 +463,8 @@ class Documentation(CalendarEvent):
 
     # FIXME: DataCheck
 
+    objects = DocumentationManager()
+
     course = models.ForeignKey(
         Course,
         models.PROTECT,
@@ -485,6 +490,11 @@ class Documentation(CalendarEvent):
     homework = models.CharField(verbose_name=_("Homework"), max_length=255, blank=True)
     group_note = models.CharField(verbose_name=_("Group Note"), max_length=255, blank=True)
 
+    # Used to track whether participations have been filled in
+    participation_touched_at = models.DateTimeField(
+        blank=True, null=True, verbose_name=_("Participation touched at")
+    )
+
     def get_subject(self) -> str:
         if self.subject:
             return self.subject
@@ -660,29 +670,12 @@ class Documentation(CalendarEvent):
             amends=lesson_event,
             course=course,
             subject=subject,
-            topic="",
-            homework="",
-            group_note="",
         )
         obj.teachers.set(teachers.all())
         obj.save()
 
         # Create Participation Statuses
-        # Cannot use djangos bulk_create method, as then the save method of the
-        # superclass wouldn't be called
-
-        for member in lesson_event.all_members:
-            # TODO: Check for preexisting absences in kolego
-            # TODO: maybe only create if the lesson start is in the past
-            status = ParticipationStatus.objects.create(
-                person=member,
-                related_documentation=obj,
-                datetime_start=datetime_start,
-                datetime_end=datetime_end,
-                timezone=lesson_event.timezone,
-            )
-            status.groups_of_person.set(member.member_of.all())
-            status.save()
+        obj.touch()
 
         return obj
 
@@ -692,15 +685,66 @@ class Documentation(CalendarEvent):
             return cls.create_from_lesson_event(
                 user,
                 *cls.parse_dummy(_id),
-            )
+            ), True
 
-        return cls.objects.get(id=_id)
+        return cls.objects.get(id=_id), False
 
     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
+        """Ensure that participation statuses are created for this documentation."""
+        if (
+            self.participation_touched_at
+            or not self.amends
+            or self.value_start_datetime(self) > now()
+        ):
+            # There is no source to update from or it's too early
+            return
+
+        lesson_event: LessonEvent = self.amends
+        all_members = lesson_event.all_members
+        member_pks = [p.pk for p in all_members]
+
+        new_persons = Person.objects.filter(Q(pk__in=member_pks)).prefetch_related("member_of")
+
+        # Get absences from Kolego
+        events = KolegoAbsence.get_single_events(
+            self.value_start_datetime(self),
+            self.value_end_datetime(self),
+            None,
+            {"persons": member_pks},
+            with_reference_object=True,
+        )
+        kolego_absences_map = {a["REFERENCE_OBJECT"].person: a["REFERENCE_OBJECT"] for a in events}
+
+        new_participations = []
+        new_groups_of_person = []
+        for person in new_persons:
+            participation_status = ParticipationStatus(
+                person=person,
+                related_documentation=self,
+                datetime_start=self.datetime_start,
+                datetime_end=self.datetime_end,
+                timezone=self.timezone,
+            )
+
+            # Take over data from Kolego absence
+            if person in kolego_absences_map:
+                participation_status.fill_from_kolego(kolego_absences_map[person])
+
+            participation_status.save()
+
+            new_groups_of_person += [
+                ParticipationStatus.groups_of_person.through(
+                    group=group, participationstatus=participation_status
+                )
+                for group in person.member_of.all()
+            ]
+            new_participations.append(participation_status)
+        ParticipationStatus.groups_of_person.through.objects.bulk_create(new_groups_of_person)
+
+        self.participation_touched_at = timezone.now()
+        self.save()
+
+        return new_participations
 
 
 class ParticipationStatus(CalendarEvent):
@@ -712,6 +756,8 @@ class ParticipationStatus(CalendarEvent):
 
     # FIXME: DataChecks
 
+    objects = ParticipationStatusManager()
+
     person = models.ForeignKey(
         "core.Person", models.CASCADE, related_name="participations", verbose_name=_("Person")
     )
@@ -744,8 +790,13 @@ class ParticipationStatus(CalendarEvent):
         verbose_name=_("Base Absence"),
     )
 
+    def fill_from_kolego(self, kolego_absence: KolegoAbsence):
+        """Take over data from a Kolego absence."""
+        self.base_absence = kolego_absence
+        self.absence_reason = kolego_absence.reason
+
     def __str__(self) -> str:
-        return f"{self.related_documentation}, {self.person}"
+        return f"{self.related_documentation.id}, {self.person}"
 
     class Meta:
         verbose_name = _("Participation Status")
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index b7fa4d04a23df031ff479870c17cf5f1a3d53446..9045598fdf362f0bedb57424fd73bb450d80d669 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -12,8 +12,10 @@ from aleksis.core.util.predicates import (
 
 from .util.predicates import (
     can_edit_documentation,
+    can_edit_participation_status,
     can_view_any_documentation,
     can_view_documentation,
+    can_view_participation_status,
     has_lesson_group_object_perm,
     has_person_group_object_perm,
     has_personal_note_group_perm,
@@ -24,6 +26,7 @@ from .util.predicates import (
     is_group_owner,
     is_group_role_assignment_group_owner,
     is_in_allowed_time_range,
+    is_in_allowed_time_range_for_participation_status,
     is_lesson_event_group_owner,
     is_lesson_event_teacher,
     is_lesson_original_teacher,
@@ -414,3 +417,21 @@ edit_documentation_predicate = (
 )
 add_perm("alsijil.edit_documentation_rule", edit_documentation_predicate)
 add_perm("alsijil.delete_documentation_rule", edit_documentation_predicate)
+
+view_participation_status_for_documentation_predicate = has_person & (
+    has_global_perm("alsijil.change_participationstatus") | can_view_participation_status
+)
+add_perm(
+    "alsijil.view_participation_status_for_documentation_rule",
+    view_participation_status_for_documentation_predicate,
+)
+
+edit_participation_status_for_documentation_predicate = (
+    has_person
+    & (has_global_perm("alsijil.change_participationstatus") | can_edit_participation_status)
+    & is_in_allowed_time_range_for_participation_status
+)
+add_perm(
+    "alsijil.edit_participation_status_for_documentation_rule",
+    edit_participation_status_for_documentation_predicate,
+)
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index f503b01d85e9142be6b51f3450256b0d80936416..2da84d2a244026e8612154e3d3b7a0b79f542fe5 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -19,6 +19,8 @@ from .documentation import (
     DocumentationType,
     LessonsForPersonType,
     TouchDocumentationMutation,
+    LessonsForPersonType,
+    TouchDocumentationMutation,
 )
 from .extra_marks import (
     ExtraMarkBatchCreateMutation,
@@ -32,6 +34,7 @@ from .personal_note import (
     PersonalNoteBatchDeleteMutation,
     PersonalNoteBatchPatchMutation,
 )
+from .participation_status import ParticipationStatusBatchPatchMutation
 
 
 class Query(graphene.ObjectType):
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 72017279c97c3e9ccf7c6f642d621eaaaf62ffd4..4a0055064abd0a9cc1bb79850390da318a808b4a 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -2,7 +2,6 @@ from django.core.exceptions import PermissionDenied
 
 import graphene
 from graphene_django.types import DjangoObjectType
-from guardian.shortcuts import get_objects_for_user
 from reversion import create_revision, set_comment, set_user
 
 from aleksis.apps.alsijil.util.predicates import can_edit_documentation, is_in_allowed_time_range
@@ -71,16 +70,15 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
 
     @staticmethod
     def resolve_participations(root: Documentation, info, **kwargs):
-        # TODO: probably check for permission
+        if not info.context.user.has_perm(
+            "alsijil.view_participation_status_for_documentation", root
+        ):
+            return []
 
         # A dummy documentation will not have any participations
         if str(root.pk).startswith("DUMMY") or not hasattr(root, "participations"):
             return []
-        return root.participations.all()
-
-    @classmethod
-    def get_queryset(cls, queryset, info):
-        return get_objects_for_user(info.context.user, "alsijil.view_documentation", queryset)
+        return root.participations.select_related("absence_reason", "base_absence").all()
 
 
 class DocumentationInputType(graphene.InputObjectType):
@@ -111,7 +109,7 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
 
         # Sadly, we can't use the update_or_create method since create_defaults
         # is only introduced in Django 5.0
-        obj = Documentation.get_or_create_by_id(_id, info.context.user)
+        obj, __ = Documentation.get_or_create_by_id(_id, info.context.user)
 
         if not info.context.user.has_perm("alsijil.edit_documentation_rule", obj):
             raise PermissionDenied()
@@ -148,6 +146,16 @@ class TouchDocumentationMutation(graphene.Mutation):
     documentation = graphene.Field(DocumentationType)
 
     def mutate(root, info, documentation_id):
-        documentation = Documentation.get_or_create_by_id(documentation_id, info.context.user)
-        documentation.touch()
+        documentation, created = Documentation.get_or_create_by_id(
+            documentation_id, info.context.user
+        )
+
+        if not info.context.user.has_perm(
+            "alsijil.edit_participation_status_for_documentation_rule", documentation
+        ):
+            raise PermissionDenied()
+
+        if not created:
+            documentation.touch()
+
         return TouchDocumentationMutation(documentation=documentation)
diff --git a/aleksis/apps/alsijil/schema/participation_status.py b/aleksis/apps/alsijil/schema/participation_status.py
index d12ea83addc0e1cf3b2910d8dd7f5ba1e519eaed..ddff69e7c3e7631ea74132f6f42869c41a04e06e 100644
--- a/aleksis/apps/alsijil/schema/participation_status.py
+++ b/aleksis/apps/alsijil/schema/participation_status.py
@@ -1,3 +1,5 @@
+from django.core.exceptions import PermissionDenied
+
 import graphene
 from graphene_django import DjangoObjectType
 
@@ -51,5 +53,15 @@ class ParticipationStatusBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = ParticipationStatus
         fields = ("id", "absence_reason")  # Only the reason can be updated after creation
-        permissions = ("alsijil.change_participation_status",)  # FIXME
         return_field_name = "participationStatuses"
+
+    @classmethod
+    def check_permissions(cls, root, info, input, *args, **kwargs):  # noqa: A002
+        pass
+
+    @classmethod
+    def after_update_obj(cls, root, info, input, obj, full_input):  # noqa: A002
+        if not info.context.user.has_perm(
+            "alsijil.edit_participation_status_for_documentation_rule", obj.related_documentation
+        ):
+            raise PermissionDenied()
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index b06aebd352774727bb6bddca9dec8a0e28846a69..edc0b4fa81cfb50e1f268d9dd21b3d9dda2c033a 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -3,52 +3,6 @@ from django.urls import path
 from . import views
 
 urlpatterns = [
-    path("lesson", views.register_object, {"model": "lesson"}, name="lesson_period"),
-    path(
-        "lesson/<int:year>/<int:week>/<int:id_>",
-        views.register_object,
-        {"model": "lesson"},
-        name="lesson_period",
-    ),
-    path(
-        "extra_lesson/<int:id_>/",
-        views.register_object,
-        {"model": "extra_lesson"},
-        name="extra_lesson",
-    ),
-    path(
-        "event/<int:id_>/",
-        views.register_object,
-        {"model": "event"},
-        name="event",
-    ),
-    path("week/", views.week_view, name="week_view"),
-    path("week/<int:year>/<int:week>/", views.week_view, name="week_view_by_week"),
-    path("week/year/cw/", views.week_view, name="week_view_placeholders"),
-    path("week/<str:type_>/<int:id_>/", views.week_view, name="week_view"),
-    path(
-        "week/year/cw/<str:type_>/<int:id_>/",
-        views.week_view,
-        name="week_view_placeholders",
-    ),
-    path(
-        "week/<int:year>/<int:week>/<str:type_>/<int:id_>/",
-        views.week_view,
-        name="week_view_by_week",
-    ),
-    path("print/group/<int:id_>", views.full_register_group, name="full_register_group"),
-    path("groups/", views.my_groups, name="my_groups"),
-    path("groups/<int:pk>/", views.StudentsList.as_view(), name="students_list"),
-    path("persons/", views.my_students, name="my_students"),
-    path("persons/<int:id_>/", views.overview_person, name="overview_person"),
-    path("me/", views.overview_person, name="overview_me"),
-    path(
-        "notes/<int:pk>/delete/",
-        views.DeletePersonalNoteView.as_view(),
-        name="delete_personal_note",
-    ),
-    path("absence/new/<int:id_>/", views.register_absence, name="register_absence"),
-    path("absence/new/", views.register_absence, name="register_absence"),
     path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
     path(
         "extra_marks/create/",
@@ -65,22 +19,6 @@ urlpatterns = [
         views.ExtraMarkDeleteView.as_view(),
         name="delete_extra_mark",
     ),
-    path("excuse_types/", views.ExcuseTypeListView.as_view(), name="excuse_types"),
-    path(
-        "excuse_types/create/",
-        views.ExcuseTypeCreateView.as_view(),
-        name="create_excuse_type",
-    ),
-    path(
-        "excuse_types/<int:pk>/edit/",
-        views.ExcuseTypeEditView.as_view(),
-        name="edit_excuse_type",
-    ),
-    path(
-        "excuse_types/<int:pk>/delete/",
-        views.ExcuseTypeDeleteView.as_view(),
-        name="delete_excuse_type",
-    ),
     path("group_roles/", views.GroupRoleListView.as_view(), name="group_roles"),
     path("group_roles/create/", views.GroupRoleCreateView.as_view(), name="create_group_role"),
     path(
@@ -128,5 +66,4 @@ urlpatterns = [
         views.AssignGroupRoleMultipleView.as_view(),
         name="assign_group_role_multiple",
     ),
-    path("all/", views.AllRegisterObjectsView.as_view(), name="all_register_objects"),
 ]
diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index fe7746948d807f3afede2a8fd3a11b41358965f5..9f06195e279b6e9bc9564731146d33ea7995498d 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -2,7 +2,7 @@ from typing import Any, Union
 
 from django.contrib.auth.models import User
 from django.db.models import Q
-from django.utils.timezone import localdate, localtime
+from django.utils.timezone import localdate, now
 
 from rules import predicate
 
@@ -420,11 +420,17 @@ def can_view_any_documentation(user: User):
     """Predicate which checks if the user is allowed to view any documentation."""
     allowed_lesson_events = LessonEvent.objects.related_to_person(user.person)
 
-    return Documentation.objects.filter(
+    if allowed_lesson_events.exists():
+        return True
+
+    if Documentation.objects.filter(
         Q(teachers=user.person)
         | Q(amends__in=allowed_lesson_events)
         | Q(course__teachers=user.person)
-    ).exists()
+    ).exists():
+        return True
+
+    return False
 
 
 @predicate
@@ -440,6 +446,34 @@ def can_edit_documentation(user: User, obj: Documentation):
     return False
 
 
+@predicate
+def can_view_participation_status(user: User, obj: Documentation):
+    """Predicate which checks if the user is allowed to view participation for a documentation."""
+    if obj:
+        if is_documentation_teacher(user, obj):
+            return True
+        if obj.amends:
+            return is_lesson_event_teacher(user, obj.amends) | is_lesson_event_group_owner(
+                user, obj.amends
+            )
+        if obj.course:
+            return is_course_teacher(user, obj.course)
+    return False
+
+
+@predicate
+def can_edit_participation_status(user: User, obj: Documentation):
+    """Predicate which checks if the user is allowed to edit participation for a documentation."""
+    if obj:
+        if is_documentation_teacher(user, obj):
+            return True
+        if obj.amends:
+            return is_lesson_event_teacher(user, obj.amends) | is_lesson_event_group_owner(
+                user, obj.amends
+            )
+    return False
+
+
 @predicate
 def is_in_allowed_time_range(user: User, obj: Documentation):
     """Predicate which checks if the documentation is in the allowed time range for editing."""
@@ -447,12 +481,20 @@ def is_in_allowed_time_range(user: User, obj: Documentation):
         get_site_preferences()["alsijil__allow_edit_future_documentations"] == "all"
         or (
             get_site_preferences()["alsijil__allow_edit_future_documentations"] == "current_day"
-            and obj.datetime_start.date() <= localdate()
+            and obj.value_start_datetime(obj).date() <= localdate()
         )
         or (
             get_site_preferences()["alsijil__allow_edit_future_documentations"] == "current_time"
-            and obj.datetime_start <= localtime()
+            and obj.value_start_datetime(obj) <= now()
         )
     ):
         return True
     return False
+
+
+@predicate
+def is_in_allowed_time_range_for_participation_status(user: User, obj: Documentation):
+    """Predicate which checks if the documentation is in the allowed time range for editing."""
+    if obj and obj.value_start_datetime(obj) <= now():
+        return True
+    return False
diff --git a/docs/conf.py b/docs/conf.py
index b37b0f814f16734100037dfe13bc1d8a4e007456..b13eb0d33210fef5bab89a0c80b5dfe53e812c8a 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -29,9 +29,9 @@ copyright = "2019-2022 The AlekSIS team"
 author = "The AlekSIS Team"
 
 # The short X.Y version
-version = "3.0"
+version = "4.0"
 # The full version, including alpha/beta/rc tags
-release = "3.0.1.dev0"
+release = "4.0.0.dev0"
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/pyproject.toml b/pyproject.toml
index 4ee946cab6399279af3e4de7029f283e64114384..03a0772bee8aa34ffc35dc565a1762b87745abbb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-App-Alsijil"
-version = "4.0.dev0"
+version = "4.0.0.dev1"
 packages = [
     { include = "aleksis" }
 ]
@@ -49,10 +49,10 @@ priority = "supplemental"
 
 [tool.poetry.dependencies]
 python = "^3.10"
-aleksis-core = "^4.0.0.dev2"
-aleksis-app-chronos = "^4.0.0.dev0"
+aleksis-core = "^4.0.0.dev7"
+aleksis-app-chronos = "^4.0.0.dev3"
 aleksis-app-stoelindeling = { version = "^3.0.dev1", optional = true }
-aleksis-app-kolego = "^0.1.dev0"
+aleksis-app-kolego = "^0.1.0.dev2"
 
 [tool.poetry.extras]
 seatingplans = ["aleksis-app-stoelindeling"]