diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index bdb61698a6f5fe82a4ebc30a0ef5df58ca93f4dc..4fc79137da727a052f5f2d9ed2ac17cfded5aa20 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,8 +9,28 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Notable, breaking changes
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+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
+views providing management functionality for those legacy models are not available anymore. Currently,
+there exists no migration path away from legacy data.
+
+Changed
+~~~~~~~
+
+* 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
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
new file mode 100644
index 0000000000000000000000000000000000000000..af143a59af433bba0d8ed87fa8beccabbbac6dfe
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -0,0 +1,366 @@
+<template>
+  <c-r-u-d-iterator
+    i18n-key="alsijil.coursebook"
+    :gql-query="gqlQuery"
+    :gql-additional-query-args="gqlQueryArgs"
+    :enable-create="false"
+    :enable-edit="false"
+    :elevated="false"
+    @lastQuery="lastQuery = $event"
+    ref="iterator"
+    fixed-header
+    disable-pagination
+    hide-default-footer
+    use-deep-search
+  >
+    <template #additionalActions="{ attrs, on }">
+      <coursebook-filters v-model="filters" />
+    </template>
+    <template #default="{ items }">
+      <coursebook-loader />
+      <coursebook-day
+        v-for="{ date, docs, first, last } in groupDocsByDay(items)"
+        v-intersect="{
+          handler: intersectHandler(date, first, last),
+          options: {
+            rootMargin: '-' + topMargin + 'px 0px 0px 0px',
+            threshold: [0, 1],
+          },
+        }"
+        :date="date"
+        :docs="docs"
+        :lastQuery="lastQuery"
+        :focus-on-mount="initDate && initDate.toMillis() === date.toMillis()"
+        @init="transition"
+        :key="'day-' + date"
+        ref="days"
+      />
+      <coursebook-loader />
+
+      <date-select-footer
+        :value="currentDate"
+        @input="gotoDate"
+        @prev="gotoPrev"
+        @next="gotoNext"
+      />
+    </template>
+    <template #loading>
+      <coursebook-loader :number-of-days="10" :number-of-docs="5" />
+    </template>
+
+    <template #no-data>
+      <CoursebookEmptyMessage icon="mdi-book-off-outline">
+        {{ $t("alsijil.coursebook.no_data") }}
+      </CoursebookEmptyMessage>
+    </template>
+
+    <template #no-results>
+      <CoursebookEmptyMessage icon="mdi-book-alert-outline">
+        {{
+          $t("alsijil.coursebook.no_results", { search: $refs.iterator.search })
+        }}
+      </CoursebookEmptyMessage>
+    </template>
+  </c-r-u-d-iterator>
+</template>
+
+<script>
+import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
+import DateSelectFooter from "aleksis.core/components/generic/DateSelectFooter.vue";
+import CoursebookDay from "./CoursebookDay.vue";
+import { DateTime, Interval } from "luxon";
+import { documentationsForCoursebook } from "./coursebook.graphql";
+import CoursebookFilters from "./CoursebookFilters.vue";
+import CoursebookLoader from "./CoursebookLoader.vue";
+import CoursebookEmptyMessage from "./CoursebookEmptyMessage.vue";
+
+export default {
+  name: "Coursebook",
+  components: {
+    CoursebookEmptyMessage,
+    CoursebookFilters,
+    CoursebookLoader,
+    CRUDIterator,
+    DateSelectFooter,
+    CoursebookDay,
+  },
+  props: {
+    filterType: {
+      type: String,
+      required: true,
+    },
+    objId: {
+      type: [Number, String],
+      required: false,
+      default: null,
+    },
+    objType: {
+      type: String,
+      required: false,
+      default: null,
+    },
+    /**
+     * Number of consecutive to load at once
+     * This number of days is initially loaded and loaded
+     * incrementally while scrolling.
+     */
+    dayIncrement: {
+      type: Number,
+      required: false,
+      default: 7,
+    },
+    /**
+     * Margin from coursebook list to top of viewport in pixels
+     */
+    topMargin: {
+      type: Number,
+      required: false,
+      default: 165,
+    },
+  },
+  data() {
+    return {
+      gqlQuery: documentationsForCoursebook,
+      lastQuery: null,
+      dateStart: "",
+      dateEnd: "",
+      // Placeholder values while query isn't completed yet
+      groups: [],
+      courses: [],
+      incomplete: false,
+      ready: false,
+      initDate: false,
+      currentDate: "",
+      hashUpdater: false,
+    };
+  },
+  computed: {
+    // Assertion: Should only fire on page load or selection change.
+    //            Resets date range.
+    gqlQueryArgs() {
+      return {
+        own: this.filterType === "all" ? false : true,
+        objId: this.objId ? Number(this.objId) : undefined,
+        objType: this.objType?.toUpperCase(),
+        dateStart: this.dateStart,
+        dateEnd: this.dateEnd,
+        incomplete: !!this.incomplete,
+      };
+    },
+    filters: {
+      get() {
+        return {
+          objType: this.objType,
+          objId: this.objId,
+          filterType: this.filterType,
+          incomplete: this.incomplete,
+        };
+      },
+      set(selectedFilters) {
+        if (Object.hasOwn(selectedFilters, "incomplete")) {
+          this.incomplete = selectedFilters.incomplete;
+        } else if (
+          Object.hasOwn(selectedFilters, "filterType") ||
+          Object.hasOwn(selectedFilters, "objId") ||
+          Object.hasOwn(selectedFilters, "objType")
+        ) {
+          this.$router.push({
+            name: "alsijil.coursebook",
+            params: {
+              filterType: selectedFilters.filterType
+                ? selectedFilters.filterType
+                : this.filterType,
+              objType: selectedFilters.objType,
+              objId: selectedFilters.objId,
+            },
+            hash: this.$route.hash,
+          });
+          // computed should not have side effects
+          // but this was actually done before filters was refactored into
+          // its own component
+          this.resetDate();
+          // might skip query until both set = atomic
+        }
+      },
+    },
+  },
+  methods: {
+    resetDate(toDate) {
+      // Assure current date
+      console.log("Resetting date range", this.$route.hash);
+      this.currentDate = toDate || this.$route.hash?.substring(1);
+      if (!this.currentDate) {
+        console.log("Set default date");
+        this.setDate(DateTime.now().toISODate());
+      }
+
+      const date = DateTime.fromISO(this.currentDate);
+      this.initDate = date;
+      this.dateStart = date.minus({ days: this.dayIncrement }).toISODate();
+      this.dateEnd = date.plus({ days: this.dayIncrement }).toISODate();
+    },
+    transition() {
+      this.initDate = false;
+      this.ready = true;
+    },
+    groupDocsByDay(docs) {
+      // => {dt: {date: dt, docs: doc ...} ...}
+      const docsByDay = docs.reduce((byDay, doc) => {
+        // This works with dummy. Does actual doc have dateStart instead?
+        const day = DateTime.fromISO(doc.datetimeStart).startOf("day");
+        byDay[day] ??= { date: day, docs: [] };
+        byDay[day].docs.push(doc);
+        return byDay;
+      }, {});
+      // => [{date: dt, docs: doc ..., idx: idx, lastIdx: last-idx} ...]
+      // sorting is necessary since backend can send docs unordered
+      return Object.keys(docsByDay)
+        .sort()
+        .map((key, idx, { length }) => {
+          const day = docsByDay[key];
+          day.first = idx === 0;
+          const lastIdx = length - 1;
+          day.last = idx === lastIdx;
+          return day;
+        });
+    },
+    // docsByDay: {dt: [dt doc ...] ...}
+    fetchMore(from, to, then) {
+      console.log("fetching", from, to);
+      this.lastQuery.fetchMore({
+        variables: {
+          dateStart: from,
+          dateEnd: to,
+        },
+        // Transform the previous result with new data
+        updateQuery: (previousResult, { fetchMoreResult }) => {
+          console.log("Received more");
+          then();
+          return { items: previousResult.items.concat(fetchMoreResult.items) };
+        },
+      });
+    },
+    setDate(date) {
+      this.currentDate = date;
+      if (!this.hashUpdater) {
+        this.hashUpdater = window.requestIdleCallback(() => {
+          if (!(this.$route.hash.substring(1) === this.currentDate)) {
+            this.$router.replace({ hash: this.currentDate });
+          }
+          this.hashUpdater = false;
+        });
+      }
+    },
+    fixScrollPos(height, top) {
+      this.$nextTick(() => {
+        if (height < document.documentElement.scrollHeight) {
+          document.documentElement.scrollTop =
+            document.documentElement.scrollHeight - height + top;
+          this.ready = true;
+        } else {
+          // Update top, could have changed in the meantime.
+          this.fixScrollPos(height, document.documentElement.scrollTop);
+        }
+      });
+    },
+    intersectHandler(date, first, last) {
+      let once = true;
+      return (entries) => {
+        const entry = entries[0];
+        if (entry.isIntersecting) {
+          if (entry.boundingClientRect.top <= this.topMargin || first) {
+            console.log("@ ", date.toISODate());
+            this.setDate(date.toISODate());
+          }
+
+          if (once && this.ready && first) {
+            console.log("load up", date.toISODate());
+            this.ready = false;
+            this.fetchMore(
+              date.minus({ days: this.dayIncrement }).toISODate(),
+              date.minus({ days: 1 }).toISODate(),
+              () => {
+                this.fixScrollPos(
+                  document.documentElement.scrollHeight,
+                  document.documentElement.scrollTop,
+                );
+              },
+            );
+            once = false;
+          } else if (once && this.ready && last) {
+            console.log("load down", date.toISODate());
+            this.ready = false;
+            this.fetchMore(
+              date.plus({ days: 1 }).toISODate(),
+              date.plus({ days: this.dayIncrement }).toISODate(),
+              () => {
+                this.ready = true;
+              },
+            );
+            once = false;
+          }
+        }
+      };
+    },
+    // Improve me?
+    // The navigation logic could be a bit simpler if the current days
+    // where known as a sorted array (= result of groupDocsByDay) But
+    // then the list would need its own component and this gets rather
+    // complicated. Then the calendar could also show the present days
+    // / gray out the missing.
+    //
+    // Next two: arg date is ts object
+    findPrev(date) {
+      return this.$refs.days
+        .map((day) => day.date)
+        .sort()
+        .reverse()
+        .find((date2) => date2 < date);
+    },
+    findNext(date) {
+      return this.$refs.days
+        .map((day) => day.date)
+        .sort()
+        .find((date2) => date2 > date);
+    },
+    gotoDate(date) {
+      const present = this.$refs.days.find(
+        (day) => day.date.toISODate() === date,
+      );
+
+      if (present) {
+        // React immediatly -> smoother navigation
+        // 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);
+      }
+    },
+    gotoPrev() {
+      const prev = this.findPrev(DateTime.fromISO(this.currentDate));
+      if (prev) {
+        this.gotoDate(prev.toISODate());
+      }
+    },
+    gotoNext() {
+      const next = this.findNext(DateTime.fromISO(this.currentDate));
+      if (next) {
+        this.gotoDate(next.toISODate());
+      }
+    },
+  },
+  created() {
+    this.resetDate();
+  },
+};
+</script>
+
+<style>
+.max-width {
+  max-width: 25rem;
+}
+</style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
new file mode 100644
index 0000000000000000000000000000000000000000..14411e9ce9c1c2780402890a80aa907b246262ff
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
@@ -0,0 +1,66 @@
+<template>
+  <v-list-item :style="{ scrollMarginTop: '145px' }" two-line>
+    <v-list-item-content>
+      <v-subheader class="text-h6">{{
+        $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)"
+        >
+          <documentation-modal
+            :documentation="doc"
+            :affected-query="lastQuery"
+          />
+        </v-list-item>
+      </v-list>
+    </v-list-item-content>
+  </v-list-item>
+</template>
+
+<script>
+import DocumentationModal from "./documentation/DocumentationModal.vue";
+export default {
+  name: "CoursebookDay",
+  components: {
+    DocumentationModal,
+  },
+  props: {
+    date: {
+      type: Object,
+      required: true,
+    },
+    docs: {
+      type: Array,
+      required: true,
+    },
+    lastQuery: {
+      type: Object,
+      required: true,
+    },
+    focusOnMount: {
+      type: Boolean,
+      required: false,
+      default: false,
+    },
+  },
+  emits: ["init"],
+  methods: {
+    focus(how) {
+      this.$el.scrollIntoView({
+        behavior: how,
+        block: "start",
+        inline: "nearest",
+      });
+      console.log("focused @", this.date.toISODate());
+    },
+  },
+  mounted() {
+    if (this.focusOnMount) {
+      this.$nextTick(this.focus("instant"));
+      this.$emit("init");
+    }
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookEmptyMessage.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookEmptyMessage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..346ecc63c272ab5c57a1da9f5e5f78b825739a79
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookEmptyMessage.vue
@@ -0,0 +1,25 @@
+<template>
+  <v-list-item>
+    <v-list-item-content
+      class="d-flex justify-center align-center flex-column full-width"
+    >
+      <div class="mb-4">
+        <v-icon large color="primary">{{ icon }}</v-icon>
+      </div>
+      <v-list-item-title>
+        <slot></slot>
+      </v-list-item-title>
+    </v-list-item-content>
+  </v-list-item>
+</template>
+<script>
+export default {
+  name: "CoursebookEmptyMessage",
+  props: {
+    icon: {
+      type: String,
+      default: "mdi-book-alert-outline",
+    },
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e5493b07cda406fddbb3fccc89e5d1b42080ab89
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
@@ -0,0 +1,109 @@
+<template>
+  <div class="d-flex flex-grow-1 justify-end">
+    <v-autocomplete
+      :items="selectable"
+      item-text="name"
+      clearable
+      return-object
+      filled
+      dense
+      hide-details
+      :placeholder="$t('alsijil.coursebook.filter.filter_for_obj')"
+      :loading="selectLoading"
+      :value="currentObj"
+      @input="selectObject"
+      @click:clear="selectObject"
+      class="max-width"
+    />
+    <div class="ml-6">
+      <v-switch
+        :loading="selectLoading"
+        :label="$t('alsijil.coursebook.filter.own')"
+        :input-value="value.filterType === 'my'"
+        @change="selectFilterType($event)"
+        dense
+        inset
+        hide-details
+      />
+      <v-switch
+        :loading="selectLoading"
+        :label="$t('alsijil.coursebook.filter.missing')"
+        :input-value="value.incomplete"
+        @change="
+          $emit('input', {
+            incomplete: $event,
+          })
+        "
+        dense
+        inset
+        hide-details
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { coursesOfPerson, groupsByPerson } from "./coursebook.graphql";
+
+export default {
+  name: "CoursebookFilters",
+  data() {
+    return {
+      // Placeholder values while query isn't completed yet
+      groups: [],
+      courses: [],
+    };
+  },
+  props: {
+    value: {
+      type: Object,
+      required: true,
+    },
+  },
+  emits: ["input"],
+  apollo: {
+    groups: {
+      query: groupsByPerson,
+    },
+    courses: {
+      query: coursesOfPerson,
+    },
+  },
+  computed: {
+    selectable() {
+      return [
+        { header: this.$t("alsijil.coursebook.filter.groups") },
+        ...this.groups.map((group) => ({ type: "group", ...group })),
+        { header: this.$t("alsijil.coursebook.filter.courses") },
+        ...this.courses.map((course) => ({ type: "course", ...course })),
+      ];
+    },
+    selectLoading() {
+      return (
+        this.$apollo.queries.groups.loading ||
+        this.$apollo.queries.courses.loading
+      );
+    },
+    currentObj() {
+      return this.selectable.find(
+        (o) => o.type === this.value.objType && o.id === this.value.objId,
+      );
+    },
+  },
+  methods: {
+    selectObject(selection) {
+      this.$emit("input", {
+        objType: selection ? selection.type : null,
+        objId: selection ? selection.id : null,
+      });
+    },
+    selectFilterType(switchValue) {
+      this.$emit("input", {
+        filterType: switchValue ? "my" : "all",
+        objType: this.value.objType,
+        objId: this.value.objId,
+      });
+    },
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a5136eb9f0c2535009fd78a02e7481aebacd12b4
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
@@ -0,0 +1,36 @@
+<template>
+  <div>
+    <v-list-item v-for="i in numberOfDays" :key="'i-' + i">
+      <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">
+            <DocumentationLoader />
+          </v-list-item>
+        </v-list>
+      </v-list-item-content>
+    </v-list-item>
+  </div>
+</template>
+<script>
+import DocumentationLoader from "./documentation/DocumentationLoader.vue";
+
+export default {
+  name: "CoursebookLoader",
+  components: { DocumentationLoader },
+  props: {
+    numberOfDays: {
+      type: Number,
+      required: false,
+      default: 1,
+    },
+    numberOfDocs: {
+      type: Number,
+      required: false,
+      default: 1,
+    },
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
new file mode 100644
index 0000000000000000000000000000000000000000..8444f9e35af335080026b221424fda598068c6fc
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -0,0 +1,97 @@
+query groupsByPerson {
+  groups: groupsByPerson {
+    id
+    name
+  }
+}
+
+query coursesOfPerson {
+  courses: coursesOfPerson {
+    id
+    name
+    groups {
+      id
+      name
+    }
+  }
+}
+
+query documentationsForCoursebook(
+  $own: Boolean!
+  $objId: ID
+  $objType: String
+  $dateStart: Date!
+  $dateEnd: Date!
+  $incomplete: Boolean
+) {
+  items: documentationsForCoursebook(
+    own: $own
+    objId: $objId
+    objType: $objType
+    dateStart: $dateStart
+    dateEnd: $dateEnd
+    incomplete: $incomplete
+  ) {
+    id
+    course {
+      id
+      name
+    }
+    amends {
+      id
+      amends {
+        id
+        teachers {
+          id
+          shortName
+          fullName
+          avatarContentUrl
+        }
+        subject {
+          id
+          name
+          shortName
+          colourFg
+          colourBg
+        }
+      }
+      cancelled
+    }
+    teachers {
+      id
+      shortName
+      fullName
+      avatarContentUrl
+    }
+    subject {
+      id
+      name
+      shortName
+      colourFg
+      colourBg
+    }
+    topic
+    homework
+    groupNote
+    datetimeStart
+    datetimeEnd
+    dateStart
+    dateEnd
+    oldId
+    canEdit
+    futureNotice
+    canDelete
+  }
+}
+
+mutation createOrUpdateDocumentations($input: [DocumentationInputType]!) {
+  createOrUpdateDocumentations(input: $input) {
+    items: documentations {
+      id
+      topic
+      homework
+      groupNote
+      oldId
+    }
+  }
+}
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/Documentation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/Documentation.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5bbc21c0de53b613986c30360e853ee6720526b5
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/Documentation.vue
@@ -0,0 +1,96 @@
+<template>
+  <v-card :class="{ 'my-1 full-width': true, 'd-flex flex-column': !compact }">
+    <v-card-title v-if="!compact">
+      <lesson-information v-bind="documentationPartProps" />
+    </v-card-title>
+
+    <v-card-text
+      class="full-width main-body"
+      :class="{
+        vertical: !compact || $vuetify.breakpoint.mobile,
+        'pa-2': compact,
+      }"
+    >
+      <lesson-information v-if="compact" v-bind="documentationPartProps" />
+      <lesson-summary
+        ref="summary"
+        v-bind="{ ...$attrs, ...documentationPartProps }"
+        :is-create="false"
+        :gql-patch-mutation="documentationsMutation"
+        @open="$emit('open')"
+        @loading="loading = $event"
+        @save="$emit('close')"
+      />
+      <lesson-notes v-bind="documentationPartProps" />
+    </v-card-text>
+    <v-spacer />
+    <v-divider />
+    <v-card-actions v-if="!compact">
+      <v-spacer />
+      <cancel-button
+        v-if="documentation.canEdit"
+        @click="$emit('close')"
+        :disabled="loading"
+      />
+      <save-button
+        v-if="documentation.canEdit"
+        @click="save"
+        :loading="loading"
+      />
+      <cancel-button
+        v-if="!documentation.canEdit"
+        i18n-key="actions.close"
+        @click="$emit('close')"
+      />
+    </v-card-actions>
+  </v-card>
+</template>
+
+<script>
+import LessonInformation from "./LessonInformation.vue";
+import LessonSummary from "./LessonSummary.vue";
+import LessonNotes from "./LessonNotes.vue";
+
+import SaveButton from "aleksis.core/components/generic/buttons/SaveButton.vue";
+import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue";
+
+import { createOrUpdateDocumentations } from "../coursebook.graphql";
+
+import documentationPartMixin from "./documentationPartMixin";
+
+export default {
+  name: "Documentation",
+  components: {
+    LessonInformation,
+    LessonSummary,
+    LessonNotes,
+    SaveButton,
+    CancelButton,
+  },
+  emits: ["open", "close"],
+  mixins: [documentationPartMixin],
+  data() {
+    return {
+      loading: false,
+      documentationsMutation: createOrUpdateDocumentations,
+    };
+  },
+  methods: {
+    save() {
+      this.$refs.summary.save();
+      this.$emit("close");
+    },
+  },
+};
+</script>
+
+<style scoped>
+.main-body {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  gap: 1em;
+}
+.vertical {
+  grid-template-columns: 1fr;
+}
+</style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationCompactDetails.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationCompactDetails.vue
new file mode 100644
index 0000000000000000000000000000000000000000..09ae0e5d09903387dd314bc25b8885c9eff1b370
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationCompactDetails.vue
@@ -0,0 +1,30 @@
+<template>
+  <v-card outlined dense rounded="lg" v-bind="$attrs" v-on="$listeners">
+    <div class="font-weight-medium mr-2">
+      {{ $t("alsijil.coursebook.summary.topic.label") }}:
+    </div>
+    <div class="text-truncate">{{ documentation.topic || "–" }}</div>
+
+    <div class="font-weight-medium mr-2">
+      {{ $t("alsijil.coursebook.summary.homework.label") }}:
+    </div>
+    <div class="text-truncate">{{ documentation.homework || "–" }}</div>
+
+    <div class="font-weight-medium mr-2">
+      {{ $t("alsijil.coursebook.summary.group_note.label") }}:
+    </div>
+    <div class="text-truncate">{{ documentation.groupNote || "–" }}</div>
+  </v-card>
+</template>
+
+<script>
+export default {
+  name: "DocumentationCompactDetails",
+  props: {
+    documentation: {
+      type: Object,
+      required: true,
+    },
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationFullDetails.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationFullDetails.vue
new file mode 100644
index 0000000000000000000000000000000000000000..58ef4285647a5b80e7c8dd94aae54955aa95c81d
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationFullDetails.vue
@@ -0,0 +1,34 @@
+<template>
+  <div v-bind="$attrs" v-on="$listeners">
+    <v-card outlined dense rounded="lg" class="mb-2">
+      <v-card-title class="text-subtitle-2 pb-1 font-weight-medium">
+        {{ $t("alsijil.coursebook.summary.topic.label") }}
+      </v-card-title>
+      <v-card-text>{{ documentation.topic || "–" }}</v-card-text>
+    </v-card>
+    <v-card outlined dense rounded="lg" class="mb-2">
+      <v-card-title class="text-subtitle-2 pb-1 font-weight-medium">
+        {{ $t("alsijil.coursebook.summary.homework.label") }}
+      </v-card-title>
+      <v-card-text>{{ documentation.homework || "–" }}</v-card-text>
+    </v-card>
+    <v-card outlined dense rounded="lg">
+      <v-card-title class="text-subtitle-2 pb-1 font-weight-medium">
+        {{ $t("alsijil.coursebook.summary.group_note.label") }}
+      </v-card-title>
+      <v-card-text>{{ documentation.groupNote || "–" }}</v-card-text>
+    </v-card>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "DocumentationFullDetails",
+  props: {
+    documentation: {
+      type: Object,
+      required: true,
+    },
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationLoader.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationLoader.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ad326bc61437ee394852917e48163b663b955ca0
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationLoader.vue
@@ -0,0 +1,32 @@
+<template>
+  <v-card class="my-2 full-width">
+    <div class="full-width d-flex flex-column align-stretch flex-md-row">
+      <v-card-text>
+        <v-skeleton-loader
+          type="avatar, heading, chip"
+          class="d-flex full-width align-center gap"
+          height="100%"
+        />
+      </v-card-text>
+      <v-card-text>
+        <v-skeleton-loader
+          type="heading@2"
+          class="d-flex full-width align-center gap"
+          height="100%"
+        />
+      </v-card-text>
+      <v-card-text>
+        <v-skeleton-loader
+          type="chip@3"
+          class="d-flex full-width align-center justify-end gap"
+          height="100%"
+        />
+      </v-card-text>
+    </div>
+  </v-card>
+</template>
+<script>
+export default {
+  name: "DocumentationLoader",
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..460f39f97fc15b61d0476dd99ed33d29cf43029c
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
@@ -0,0 +1,31 @@
+<!-- Wrapper around Documentation.vue -->
+<!-- That uses it either as list item or as editable modal dialog. -->
+<template>
+  <mobile-fullscreen-dialog v-model="popup" max-width="500px">
+    <template #activator="activator">
+      <!-- list view -> activate dialog -->
+      <documentation compact v-bind="$attrs" :dialog-activator="activator" />
+    </template>
+    <!-- dialog view -> deactivate dialog -->
+    <!-- cancel | save (through lesson-summary) -->
+    <documentation v-bind="$attrs" @close="popup = false" />
+  </mobile-fullscreen-dialog>
+</template>
+
+<script>
+import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue";
+import Documentation from "./Documentation.vue";
+
+export default {
+  name: "DocumentationModal",
+  components: {
+    MobileFullscreenDialog,
+    Documentation,
+  },
+  data() {
+    return {
+      popup: false,
+    };
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ad214b49da74fcab14fd39f456b9e24e2e620c47
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue
@@ -0,0 +1,132 @@
+<template>
+  <v-tooltip bottom>
+    <template #activator="{ on, attrs }">
+      <v-icon
+        :color="currentStatus?.color"
+        class="mr-md-4"
+        v-on="on"
+        v-bind="attrs"
+        >{{ currentStatus?.icon }}</v-icon
+      >
+    </template>
+    <span>{{ currentStatus?.text }}</span>
+  </v-tooltip>
+</template>
+
+<script>
+import documentationPartMixin from "./documentationPartMixin";
+
+import { DateTime } from "luxon";
+
+export default {
+  name: "DocumentationStatus",
+  mixins: [documentationPartMixin],
+  data() {
+    return {
+      statusChoices: [
+        {
+          name: "available",
+          text: this.$t("alsijil.coursebook.status.available"),
+          icon: "$success",
+          color: "success",
+        },
+        {
+          name: "missing",
+          text: this.$t("alsijil.coursebook.status.missing"),
+          icon: "$warning",
+          color: "error",
+        },
+        {
+          name: "running",
+          text: this.$t("alsijil.coursebook.status.running"),
+          icon: "mdi-play-outline",
+          color: "warning",
+        },
+        {
+          name: "substitution",
+          text: this.$t("alsijil.coursebook.status.substitution"),
+          icon: "$info",
+          color: "warning",
+        },
+        {
+          name: "cancelled",
+          text: this.$t("alsijil.coursebook.status.cancelled"),
+          icon: "mdi-cancel",
+          color: "error",
+        },
+        {
+          name: "pending",
+          text: this.$t("alsijil.coursebook.status.pending"),
+          icon: "mdi-clipboard-clock-outline",
+          color: "blue",
+        },
+      ],
+      statusTimeout: null,
+      currentStatusName: "",
+    };
+  },
+  computed: {
+    currentStatus() {
+      return this.statusChoices.find((s) => s.name === this.currentStatusName);
+    },
+    documentationDateTimeStart() {
+      return DateTime.fromISO(this.documentation.datetimeStart);
+    },
+    documentationDateTimeEnd() {
+      return DateTime.fromISO(this.documentation.datetimeEnd);
+    },
+  },
+  methods: {
+    updateStatus() {
+      if (this.documentation?.amends.cancelled) {
+        this.currentStatusName = "cancelled";
+      } else if (this.documentation.topic) {
+        this.currentStatusName = "available";
+      } else if (DateTime.now() > this.documentationDateTimeEnd) {
+        this.currentStatusName = "missing";
+      } else if (this.documentation?.amends.amends) {
+        this.currentStatusName = "substitution";
+      } else if (
+        DateTime.now() > this.documentationDateTimeStart &&
+        DateTime.now() < this.documentationDateTimeEnd
+      ) {
+        this.currentStatusName = "running";
+      } else {
+        this.currentStatusName = "pending";
+      }
+    },
+  },
+  watch: {
+    documentation: {
+      handler() {
+        this.updateStatus();
+      },
+      deep: true,
+    },
+  },
+  mounted() {
+    this.updateStatus();
+
+    if (DateTime.now() < this.documentationDateTimeStart) {
+      this.statusTimeout = setTimeout(
+        this.updateStatus,
+        this.documentationDateTimeStart
+          .diff(DateTime.now(), "seconds")
+          .toObject(),
+      );
+    } else if (DateTime.now() < this.documentationDateTimeEnd) {
+      this.statusTimeout = setTimeout(
+        this.updateStatus,
+        this.documentationDateTimeEnd
+          .diff(DateTime.now(), "seconds")
+          .toObject(),
+      );
+    }
+  },
+  beforeDestroy() {
+    if (this.statusTimeout) {
+      clearTimeout(this.statusTimeout);
+    }
+  },
+};
+</script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
new file mode 100644
index 0000000000000000000000000000000000000000..09a04bcb67c6ae618fa0b1546a0171af30323885
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
@@ -0,0 +1,143 @@
+<script setup>
+import DocumentationStatus from "./DocumentationStatus.vue";
+import PersonChip from "aleksis.core/components/person/PersonChip.vue";
+</script>
+
+<template>
+  <div :class="{ 'full-width grid': true, 'large-grid': largeGrid }">
+    <div class="d-flex">
+      <documentation-status v-if="compact" v-bind="documentationPartProps" />
+      <div :class="{ 'text-right d-flex flex-column fit-content': largeGrid }">
+        <time :datetime="documentation.datetimeStart" class="text-no-wrap">
+          {{ $d(toDateTime(documentation.datetimeStart), "shortTime") }}
+        </time>
+        <span v-if="!largeGrid">–</span>
+        <time :datetime="documentation.datetimeEnd" class="text-no-wrap">
+          {{ $d(toDateTime(documentation.datetimeEnd), "shortTime") }}
+        </time>
+      </div>
+    </div>
+    <span
+      :class="{
+        'text-right': !largeGrid,
+        'text-subtitle-1': largeGrid,
+        'font-weight-medium': largeGrid,
+      }"
+    >
+      {{ documentation.course?.name }}
+    </span>
+    <div
+      :class="{
+        'd-flex align-center flex-wrap gap': true,
+        'justify-center': largeGrid,
+        'justify-start': !largeGrid,
+      }"
+    >
+      <subject-chip
+        v-if="documentation.subject"
+        :subject="documentation.subject"
+        v-bind="compact ? dialogActivator.attrs : {}"
+        v-on="compact ? dialogActivator.on : {}"
+      />
+      <subject-chip
+        v-if="
+          documentation?.amends?.amends?.subject &&
+          documentation.amends.amends.subject.id !== documentation.subject.id
+        "
+        :subject="documentation.amends.amends.subject"
+        v-bind="compact ? dialogActivator.attrs : {}"
+        v-on="compact ? dialogActivator.on : {}"
+        class="text-decoration-line-through"
+        disabled
+      />
+    </div>
+    <div
+      :class="{
+        'd-flex align-center flex-wrap gap': true,
+        'justify-end': !largeGrid,
+      }"
+    >
+      <person-chip
+        v-for="teacher in documentation.teachers"
+        :key="documentation.id + '-teacher-' + teacher.id"
+        :person="teacher"
+        no-link
+        v-bind="compact ? dialogActivator.attrs : {}"
+        v-on="compact ? dialogActivator.on : {}"
+      />
+      <person-chip
+        v-for="teacher in amendedTeachers"
+        :key="documentation.id + '-amendedTeacher-' + teacher.id"
+        :person="teacher"
+        no-link
+        v-bind="compact ? dialogActivator.attrs : {}"
+        v-on="compact ? dialogActivator.on : {}"
+        class="text-decoration-line-through"
+        disabled
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import SubjectChip from "aleksis.apps.cursus/components/SubjectChip.vue";
+import { DateTime } from "luxon";
+import documentationPartMixin from "./documentationPartMixin";
+
+export default {
+  name: "LessonInformation",
+  mixins: [documentationPartMixin],
+  components: {
+    SubjectChip,
+  },
+  methods: {
+    toDateTime(dateString) {
+      return DateTime.fromISO(dateString);
+    },
+  },
+  computed: {
+    largeGrid() {
+      return this.compact && !this.$vuetify.breakpoint.mobile;
+    },
+    amendedTeachers() {
+      if (
+        this.documentation?.amends?.amends?.teachers &&
+        this.documentation.amends.amends.teachers.length
+      ) {
+        return this.documentation.amends.amends.teachers.filter(
+          (at) => !this.documentation.teachers.includes((t) => t.id === at.id),
+        );
+      }
+      return [];
+    },
+  },
+};
+</script>
+
+<style scoped>
+.grid {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  align-items: center;
+  gap: 1em;
+  align-content: start;
+}
+
+.large-grid {
+  grid-template-columns: 1fr 1fr 1fr 1fr;
+  align-content: unset;
+}
+
+.grid:last-child {
+  justify-self: end;
+  justify-content: end;
+}
+
+.fit-content {
+  width: fit-content;
+}
+
+.gap {
+  gap: 0.25em;
+}
+</style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f85633f2e6f3864a20db9136f86cee4b51311719
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
@@ -0,0 +1,50 @@
+<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"
+        >26</v-chip
+      >
+      von 30 anwesend
+    </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>
+    <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>
+    <v-chip dense color="primary" outlined>
+      <v-icon>$edit</v-icon>
+    </v-chip>
+    <!-- eslint-enable @intlify/vue-i18n/no-raw-text -->
+  </div>
+</template>
+
+<script>
+import documentationPartMixin from "./documentationPartMixin";
+
+export default {
+  name: "LessonNotes",
+  mixins: [documentationPartMixin],
+};
+</script>
+
+<style scoped>
+.gap {
+  gap: 0.25em;
+}
+</style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonSummary.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonSummary.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f4ef410e2f12f17d7e284178e7a2b6acc8022e66
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonSummary.vue
@@ -0,0 +1,294 @@
+<template>
+  <div>
+    <!-- compact -->
+    <div
+      class="d-flex flex-column flex-md-row align-stretch align-md-center gap justify-start fill-height"
+      v-if="compact"
+    >
+      <documentation-compact-details
+        v-bind="dialogActivator.attrs"
+        v-on="dialogActivator.on"
+        v-if="
+          !documentation.canEdit &&
+          (documentation.topic ||
+            documentation.homework ||
+            documentation.groupNote)
+        "
+        :documentation="documentation"
+        @click="$emit('open')"
+        :class="{
+          'flex-grow-1 min-width pa-1 read-only-grid': true,
+          'full-width': $vuetify.breakpoint.mobile,
+        }"
+      />
+      <v-alert
+        v-else-if="documentation.futureNotice"
+        type="warning"
+        outlined
+        class="min-width flex-grow-1 mb-0"
+      >
+        {{ $t("alsijil.coursebook.notices.future") }}
+      </v-alert>
+      <v-alert
+        v-else-if="!documentation.canEdit"
+        type="info"
+        outlined
+        class="min-width flex-grow-1 mb-0"
+      >
+        {{ $t("alsijil.coursebook.notices.no_entry") }}
+      </v-alert>
+
+      <v-text-field
+        v-if="documentation.canEdit"
+        :class="{
+          'flex-grow-1 min-width': true,
+          'full-width': $vuetify.breakpoint.mobile,
+        }"
+        hide-details
+        outlined
+        :label="$t('alsijil.coursebook.summary.topic.label')"
+        :value="documentation.topic"
+        @input="topic = $event"
+        @focusout="save"
+        @keydown.enter="saveAndBlur"
+        :loading="loading"
+      >
+        <template #append>
+          <v-tooltip bottom>
+            <template #activator="{ on, attrs }">
+              <v-scroll-x-transition>
+                <v-icon
+                  v-if="appendIcon"
+                  :color="appendIconColor"
+                  v-on="on"
+                  v-bind="attrs"
+                  >{{ appendIcon }}</v-icon
+                >
+              </v-scroll-x-transition>
+            </template>
+            <span>{{ appendIconTooltip }}</span>
+          </v-tooltip>
+        </template>
+      </v-text-field>
+      <div
+        :class="{
+          'flex-grow-1 max-width': true,
+          'full-width': $vuetify.breakpoint.mobile,
+        }"
+        v-if="documentation.canEdit"
+      >
+        <v-card
+          v-bind="dialogActivator.attrs"
+          v-on="dialogActivator.on"
+          outlined
+          @click="$emit('open')"
+          class="max-width grid-layout pa-1"
+          dense
+          rounded="lg"
+        >
+          <span class="max-width text-truncate">{{
+            documentation.homework
+              ? $t("alsijil.coursebook.summary.homework.value", documentation)
+              : $t("alsijil.coursebook.summary.homework.empty")
+          }}</span>
+          <v-icon right class="float-right">{{ homeworkIcon }}</v-icon>
+          <span class="max-width text-truncate">{{
+            documentation.groupNote
+              ? $t("alsijil.coursebook.summary.group_note.value", documentation)
+              : $t("alsijil.coursebook.summary.group_note.empty")
+          }}</span>
+          <v-icon right class="float-right">{{ groupNoteIcon }}</v-icon>
+        </v-card>
+      </div>
+    </div>
+    <!-- not compact -->
+    <!-- Are focusout & enter enough trigger? -->
+    <v-text-field
+      filled
+      v-if="!compact && documentation.canEdit"
+      :label="$t('alsijil.coursebook.summary.topic.label')"
+      :value="documentation.topic"
+      @input="topic = $event"
+    />
+    <v-textarea
+      filled
+      auto-grow
+      rows="3"
+      clearable
+      v-if="!compact && documentation.canEdit"
+      :label="$t('alsijil.coursebook.summary.homework.label')"
+      :value="documentation.homework"
+      @input="homework = $event ? $event : ''"
+    />
+    <v-textarea
+      filled
+      auto-grow
+      rows="3"
+      clearable
+      v-if="!compact && documentation.canEdit"
+      :label="$t('alsijil.coursebook.summary.group_note.label')"
+      :value="documentation.groupNote"
+      @input="groupNote = $event ? $event : ''"
+    />
+
+    <documentation-full-details
+      v-if="!compact && !documentation.canEdit"
+      :documentation="documentation"
+    />
+  </div>
+</template>
+
+<script setup>
+import DocumentationCompactDetails from "./DocumentationCompactDetails.vue";
+import DocumentationFullDetails from "./DocumentationFullDetails.vue";
+</script>
+
+<script>
+import createOrPatchMixin from "aleksis.core/mixins/createOrPatchMixin.js";
+import documentationPartMixin from "./documentationPartMixin";
+
+export default {
+  name: "LessonSummary",
+  mixins: [createOrPatchMixin, documentationPartMixin],
+  emits: ["open"],
+  data() {
+    return {
+      topic: null,
+      homework: null,
+      groupNote: null,
+      appendIcon: null,
+      topicError: null,
+    };
+  },
+  methods: {
+    handleUpdateAfterCreateOrPatch(itemId) {
+      return (cached, incoming) => {
+        for (const object of incoming) {
+          console.log("summary: handleUpdateAfterCreateOrPatch", object);
+          // Replace the current documentation
+          const index = cached.findIndex(
+            (o) => o[itemId] === this.documentation.id,
+          );
+          // merged with the incoming partial documentation
+          // if creation of proper documentation from dummy one, set ID of documentation currently being edited as oldID so that key in coursebook doesn't change
+          cached[index] = {
+            ...this.documentation,
+            ...object,
+            oldId:
+              this.documentation.id !== object.id
+                ? this.documentation.id
+                : this.documentation.oldId,
+          };
+        }
+        return cached;
+      };
+    },
+    handleAppendIconSuccess() {
+      this.topicError = null;
+      this.appendIcon = "$success";
+      setTimeout(() => {
+        this.appendIcon = "";
+      }, 3000);
+    },
+    save() {
+      if (
+        this.topic !== null ||
+        this.homework !== null ||
+        this.groupNote !== null
+      ) {
+        this.createOrPatch([
+          {
+            id: this.documentation.id,
+            ...(this.topic !== null && { topic: this.topic }),
+            ...(this.homework !== null && { homework: this.homework }),
+            ...(this.groupNote !== null && { groupNote: this.groupNote }),
+          },
+        ]);
+
+        this.topic = null;
+        this.homework = null;
+        this.groupNote = null;
+      }
+    },
+    saveAndBlur(event) {
+      this.save();
+      event.target.blur();
+    },
+    handleError(error) {
+      this.appendIcon = "$error";
+      this.topicError = error;
+    },
+  },
+  computed: {
+    homeworkIcon() {
+      if (this.documentation.homework) {
+        return this.documentation.canEdit
+          ? "mdi-book-edit-outline"
+          : "mdi-book-alert-outline";
+      }
+      return this.documentation.canEdit
+        ? "mdi-book-plus-outline"
+        : "mdi-book-off-outline";
+    },
+    groupNoteIcon() {
+      if (this.documentation.groupNote) {
+        return this.documentation.canEdit
+          ? "mdi-note-edit-outline"
+          : "mdi-note-alert-outline";
+      }
+      return this.documentation.canEdit
+        ? "mdi-note-plus-outline"
+        : "mdi-note-off-outline";
+    },
+    minWidth() {
+      return Math.min(this.documentation?.topic?.length || 15, 15) + "ch";
+    },
+    maxWidth() {
+      return this.$vuetify.breakpoint.mobile ? "100%" : "20ch";
+    },
+    appendIconColor() {
+      return (
+        { $success: "success", $error: "error" }[this.appendIcon] || "primary"
+      );
+    },
+    appendIconTooltip() {
+      return (
+        {
+          $success: this.$t("alsijil.coursebook.summary.topic.status.success"),
+          $error: this.$t("alsijil.coursebook.summary.topic.status.error", {
+            error: this.topicError,
+          }),
+        }[this.appendIcon] || ""
+      );
+    },
+  },
+  mounted() {
+    this.$on("save", this.handleAppendIconSuccess);
+  },
+};
+</script>
+
+<style scoped>
+.min-width {
+  min-width: v-bind(minWidth);
+}
+
+.max-width {
+  max-width: v-bind(maxWidth);
+}
+
+.gap {
+  gap: 1em;
+}
+
+.grid-layout {
+  display: grid;
+  grid-template-columns: auto min-content;
+}
+
+.read-only-grid {
+  display: grid;
+  grid-template-columns: min-content auto;
+  grid-template-rows: auto;
+}
+</style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
new file mode 100644
index 0000000000000000000000000000000000000000..165f1d2fd157bb35bf2831fc7973f480b29ccd0a
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
@@ -0,0 +1,44 @@
+/**
+ * Mixin to provide common fields for all components specific to a singular documentation inside the coursebook
+ */
+export default {
+  props: {
+    /**
+     * The documentation in question
+     */
+    documentation: {
+      type: Object,
+      required: true,
+    },
+    /**
+     * Whether the documentation is currently in the compact mode (meaning coursebook row)
+     */
+    compact: {
+      type: Boolean,
+      required: false,
+      default: false,
+    },
+    /**
+     * Activator attributes and event listeners to open documentation dialog in different places
+     */
+    dialogActivator: {
+      type: Object,
+      required: false,
+      default: () => ({ attrs: {}, on: {} }),
+    },
+  },
+
+  computed: {
+    /**
+     * All necessary props bundled together to easily pass to child components
+     * @returns {{compact: Boolean, documentation: Object, dialogActivator: Object<{attrs: Object, on: Object}>}}
+     */
+    documentationPartProps() {
+      return {
+        documentation: this.documentation,
+        compact: this.compact,
+        dialogActivator: this.dialogActivator,
+      };
+    },
+  },
+};
diff --git a/aleksis/apps/alsijil/frontend/index.js b/aleksis/apps/alsijil/frontend/index.js
index 521c4b5629d6800abebaec1e4ce27f4f57cc3ab4..1ec79280e06ef377c4be215c27b5291c51043522 100644
--- a/aleksis/apps/alsijil/frontend/index.js
+++ b/aleksis/apps/alsijil/frontend/index.js
@@ -2,206 +2,20 @@ import {
   notLoggedInValidator,
   hasPersonValidator,
 } from "aleksis.core/routeValidators";
+import { DateTime } from "luxon";
 
 export default {
   meta: {
     inMenu: true,
     titleKey: "alsijil.menu_title",
     icon: "mdi-account-group-outline",
+    iconActive: "mdi-account-group",
     validators: [hasPersonValidator],
   },
   props: {
     byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
   },
   children: [
-    {
-      path: "lesson",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.lessonPeriod",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.lesson.menu_title",
-        icon: "mdi-alarm",
-        permission: "alsijil.view_lesson_menu_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "lesson/:year(\\d+)/:week(\\d+)/:id_(\\d+)",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.lessonPeriodByCWAndID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "extra_lesson/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.extraLessonByID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "event/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.eventByID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "week/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.weekView",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.week.menu_title",
-        icon: "mdi-view-week-outline",
-        permission: "alsijil.view_week_menu_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "week/:year(\\d+)/:week(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.weekViewByWeek",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "week/year/cw/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.weekViewPlaceholders",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "week/:type_/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.weekViewByTypeAndID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "week/year/cw/:type_/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.weekViewPlaceholdersByTypeAndID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "week/:year(\\d+)/:week(\\d+)/:type_/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.weekViewByWeekTypeAndID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "print/group/:id_(\\d+)",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.fullRegisterGroup",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "groups/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.myGroups",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.groups.menu_title",
-        icon: "mdi-account-multiple-outline",
-        permission: "alsijil.view_my_groups_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "groups/:pk(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.studentsList",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "persons/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.myStudents",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.persons.menu_title",
-        icon: "mdi-account-school-outline",
-        permission: "alsijil.view_my_students_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "persons/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.overviewPerson",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "me/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.overviewMe",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.my_overview.menu_title",
-        icon: "mdi-chart-box-outline",
-        permission: "alsijil.view_person_overview_menu_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "notes/:pk(\\d+)/delete/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.deletePersonalNote",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "absence/new/:id_(\\d+)/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.registerAbsenceWithID",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "absence/new/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.registerAbsence",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.absence.menu_title",
-        icon: "mdi-message-alert-outline",
-        permission: "alsijil.view_register_absence_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
     {
       path: "extra_marks/",
       component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
@@ -210,6 +24,7 @@ export default {
         inMenu: true,
         titleKey: "alsijil.extra_marks.menu_title",
         icon: "mdi-label-variant-outline",
+        iconActive: "mdi-label-variant",
         permission: "alsijil.view_extramarks_rule",
       },
       props: {
@@ -241,156 +56,40 @@ export default {
       },
     },
     {
-      path: "excuse_types/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.excuseTypes",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.excuse_types.menu_title",
-        icon: "mdi-label-outline",
-        permission: "alsijil.view_excusetypes_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "excuse_types/create/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.createExcuseType",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      path: "coursebook/",
+      component: () => import("./components/coursebook/Coursebook.vue"),
+      redirect: () => {
+        return {
+          name: "alsijil.coursebook",
+          params: {
+            filterType: "my",
+          },
+          hash: "#" + DateTime.now().toISODate(),
+        };
       },
-    },
-    {
-      path: "excuse_types/:pk(\\d+)/edit/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.editExcuseType",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "excuse_types/:pk(\\d+)/delete/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.deleteExcuseType",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.groupRoles",
+      name: "alsijil.coursebook_landing",
+      props: true,
       meta: {
         inMenu: true,
-        titleKey: "alsijil.group_roles.menu_title_manage",
-        icon: "mdi-clipboard-plus-outline",
-        permission: "alsijil.view_grouproles_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/create/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.createGroupRole",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/:pk(\\d+)/edit/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.editGroupRole",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/:pk(\\d+)/delete/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.deleteGroupRole",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "groups/:pk(\\d+)/group_roles/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.assignedGroupRoles",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "groups/:pk(\\d+)/group_roles/assign/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.assignGroupRole",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "groups/:pk(\\d+)/group_roles/:role_pk(\\d+)/assign/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.assignGroupRoleByRolePK",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/assignments/:pk(\\d+)/edit/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.editGroupRoleAssignment",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/assignments/:pk(\\d+)/stop/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.stopGroupRoleAssignment",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/assignments/:pk(\\d+)/delete/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.deleteGroupRoleAssignment",
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "group_roles/assignments/assign/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.assignGroupRoleMultiple",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.group_roles.menu_title_assign",
-        icon: "mdi-clipboard-account-outline",
-        permission: "alsijil.assign_grouprole_for_multiple_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
-    },
-    {
-      path: "all/",
-      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
-      name: "alsijil.allRegisterObjects",
-      meta: {
-        inMenu: true,
-        titleKey: "alsijil.all_lessons.menu_title",
-        icon: "mdi-format-list-text",
-        permission: "alsijil.view_register_objects_list_rule",
-      },
-      props: {
-        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-      },
+        icon: "mdi-book-education-outline",
+        iconActive: "mdi-book-education",
+        titleKey: "alsijil.coursebook.menu_title",
+        toolbarTitle: "alsijil.coursebook.menu_title",
+        permission: "alsijil.view_documentations_menu_rule",
+      },
+      children: [
+        {
+          path: ":filterType(my|all)/:objType(group|course|teacher)?/:objId(\\d+)?/",
+          component: () => import("./components/coursebook/Coursebook.vue"),
+          name: "alsijil.coursebook",
+          meta: {
+            titleKey: "alsijil.coursebook.menu_title",
+            toolbarTitle: "alsijil.coursebook.menu_title",
+            permission: "alsijil.view_documentations_menu_rule",
+            fullWidth: true,
+          },
+        },
+      ],
     },
   ],
 };
diff --git a/aleksis/apps/alsijil/frontend/messages/de.json b/aleksis/apps/alsijil/frontend/messages/de.json
index 09456c74481a13e390b1e08e2389d027d8c6974d..f38f1621d800af92e0c595a7f044b9895376c751 100644
--- a/aleksis/apps/alsijil/frontend/messages/de.json
+++ b/aleksis/apps/alsijil/frontend/messages/de.json
@@ -31,6 +31,47 @@
     },
     "all_lessons": {
       "menu_title": "Alle Stunden"
+    },
+    "coursebook": {
+      "menu_title": "Kursbuch",
+      "page_title": "Kursbuch für {name}",
+      "title_plural": "Kursbuch",
+      "status": {
+        "available": "Kursbucheintrag vorhanden",
+        "missing": "Kursbucheintrag fehlt",
+        "running": "Stunde läuft",
+        "substitution": "Vertretungsstunde",
+        "cancelled": "Stunde fällt aus",
+        "pending": "Stunde in der Zukunft"
+      },
+      "summary": {
+        "topic": {
+          "label": "Topic",
+          "status": {
+            "success": "Topic saved successfully",
+            "error": "There has been an error while saving the topic: {error}"
+          }
+        },
+        "homework": {
+          "label": "Hausaufgaben",
+          "value": "HA: {homework}",
+          "empty": "Keine Hausaufgaben"
+        },
+        "group_note": {
+          "label": "Gruppennotiz",
+          "value": "GN: {groupNote}",
+          "empty": "Keine Gruppennotiz"
+        }
+      },
+      "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}"
     }
   }
 }
diff --git a/aleksis/apps/alsijil/frontend/messages/en.json b/aleksis/apps/alsijil/frontend/messages/en.json
index cd9798229b0d867611da8dc6b89dfe02eae91f85..acadfea9a598f5edf1952cd205166db7b6ecde62 100644
--- a/aleksis/apps/alsijil/frontend/messages/en.json
+++ b/aleksis/apps/alsijil/frontend/messages/en.json
@@ -31,6 +31,51 @@
     "all_lessons": {
       "menu_title": "All lessons"
     },
-    "menu_title": "Class register"
+    "menu_title": "Class register",
+    "coursebook": {
+      "menu_title": "Coursebook",
+      "page_title": "Coursebook for {name}",
+      "title_plural": "Coursebook",
+      "status": {
+        "available": "Documentation available",
+        "missing": "Documentation missing",
+        "running": "Lesson running",
+        "substitution": "Substitution lesson",
+        "cancelled": "Lesson cancelled",
+        "pending": "Lesson pending"
+      },
+      "summary": {
+        "topic": {
+          "label": "Topic",
+          "status": {
+            "success": "Topic saved successfully",
+            "error": "There has been an error while saving the topic: {error}"
+          }
+        },
+        "homework": {
+          "label": "Homework",
+          "value": "HW: {homework}",
+          "empty": "No homework"
+        },
+        "group_note": {
+          "label": "Group note",
+          "value": "GN: {groupNote}",
+          "empty": "No group note"
+        }
+      },
+      "notices": {
+        "future": "Editing this lesson isn't allowed as this lesson is in the future.",
+        "no_entry": "There is no entry for this lesson yet."
+      },
+      "filter": {
+        "own": "Only show own lessons",
+        "missing": "Only show incomplete lessons",
+        "groups": "Groups",
+        "courses": "Courses",
+        "filter_for_obj": "Filter for group and course"
+      },
+      "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/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
index 9b3363583bbfa59f7e4c85070f65c6dd3b6a6c55..461e0f3cec97715fef05f37eae2d09b466b6e984 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-04-23 21:13+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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,244 @@ 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:58 aleksis/apps/alsijil/models.py:432
 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:65
 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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:484
+msgid "Group Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:513
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:612
+msgid "Groups of Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:625
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:634
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:672
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:679
+msgid "Personal Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:680
+msgid "Personal Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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:704
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:750
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 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 +590,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 +618,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 +639,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 +722,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 +766,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 +784,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 +855,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 +981,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 +1055,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 +1088,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 +1106,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 +1135,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 +1149,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 +1157,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 +1277,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 +1468,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..95e2c62508d2213718a6d6ad97fda65b7a4fd234 100644
--- a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
@@ -7,11 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-25 15:28+0200\n"
+"POT-Creation-Date: 2024-04-23 21:13+0200\n"
 "PO-Revision-Date: 2022-06-25 13:53+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"
@@ -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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,266 @@ 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:58 aleksis/apps/alsijil/models.py:432
 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 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:65
 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:233 aleksis/apps/alsijil/models.py:332
+#: aleksis/apps/alsijil/models.py:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr "Jahr"
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 msgid "Personal note"
 msgstr "Persönliche Notiz"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr "Zusätzliche Markierung"
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Stundenthema"
+
+#: aleksis/apps/alsijil/models.py:484
+#, fuzzy
+#| msgid "Group note"
+msgid "Group Note"
+msgstr "Gruppennotiz"
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Stunden-Dokumentation"
+
+#: aleksis/apps/alsijil/models.py:513
+#, fuzzy
+#| msgid "Lesson documentations"
+msgid "Documentations"
+msgstr "Stunden-Dokumentationen"
+
+#: aleksis/apps/alsijil/models.py:612
+#, fuzzy
+#| msgid "Group roles"
+msgid "Groups of Person"
+msgstr "Gruppenrollen"
+
+#: aleksis/apps/alsijil/models.py:625
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Fehlstunden"
+
+#: aleksis/apps/alsijil/models.py:634
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Fehlstunden"
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Notizen"
+
+#: aleksis/apps/alsijil/models.py:672
+#, fuzzy
+#| msgid "Extra mark"
+msgid "Extra Mark"
+msgstr "Zusätzliche Markierung"
+
+#: aleksis/apps/alsijil/models.py:679
+#, fuzzy
+#| msgid "Personal note"
+msgid "Personal Note"
+msgstr "Persönliche Notiz"
+
+#: aleksis/apps/alsijil/models.py:680
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Persönliche Notizen"
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr "Farbe"
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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:704
 msgid "Can assign group role"
 msgstr "Kann Gruppenrolle zuweisen"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 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:750
 msgid "Group role assignment"
 msgstr "Zuweisung von Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr "Zuweisungen von Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr "Kann die Stundenübersicht sehen"
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr "Kann die Wochenübersicht sehen"
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr "Kann komplettes Klassenbuch sehen"
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr "Kann eine Absenz registrieren"
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 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 +546,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 +562,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 +612,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 ""
+
+#: 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
@@ -582,24 +640,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"
@@ -609,15 +660,52 @@ msgid "Excuse"
 msgstr "Entschuldigen"
 
 #: aleksis/apps/alsijil/tables.py:156
-#, python-brace-format
-msgid "{value}' late"
+#, fuzzy, python-brace-format
+#| msgid "{value}' late"
+msgid "{value}' tardiness"
 msgstr "{value}' verspätet"
 
+#: aleksis/apps/alsijil/tasks.py:26
+msgid "Load data ..."
+msgstr ""
+
+#: aleksis/apps/alsijil/tasks.py:49
+#, fuzzy
+#| msgid "Start date"
+msgid "Sort data ..."
+msgstr "Startdatum"
+
+#: 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 "Statistiken"
+
+#: 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 "Abwesenheit eintragen"
 
@@ -671,26 +759,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 +803,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 +821,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 +898,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 +957,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 +1033,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 +1111,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 +1144,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 +1162,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 +1194,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 +1211,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 +1222,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 +1272,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 +1296,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 +1307,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 +1354,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 +1559,122 @@ 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
+#, fuzzy
+#| msgid "Generate printout"
+msgid "Generate full register printout for {}"
+msgstr "Ausdruck generieren"
+
+#: aleksis/apps/alsijil/views.py:659
+#, fuzzy
+#| msgid "Generate printout"
+msgid "Generate full register printout …"
+msgstr "Ausdruck generieren"
+
+#: aleksis/apps/alsijil/views.py:660
+#, fuzzy
+#| msgid "The personal note has been deleted."
+msgid "The printout has been generated successfully."
+msgstr "Die persönliche Notiz wurde gelöscht."
+
+#: 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 "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..e283f3797931d09214dbc06954730515b45eda92 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-04-23 21:13+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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,219 @@ 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:58 aleksis/apps/alsijil/models.py:432
 #, 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:65
 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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal note"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Sujet de cours"
+
+#: aleksis/apps/alsijil/models.py:484
+#, fuzzy
+#| msgid "Group"
+msgid "Group Note"
+msgstr "Groupe"
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Documentation de cours"
+
+#: aleksis/apps/alsijil/models.py:513
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentations"
+msgstr "Documentation de cours"
+
+#: aleksis/apps/alsijil/models.py:612
+#, fuzzy
+#| msgid "Group"
+msgid "Groups of Person"
+msgstr "Groupe"
+
+#: aleksis/apps/alsijil/models.py:625
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Absences"
+
+#: aleksis/apps/alsijil/models.py:634
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Absences"
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Notes"
+
+#: aleksis/apps/alsijil/models.py:672
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:679
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Note"
+msgstr "Notes personnelles"
+
+#: aleksis/apps/alsijil/models.py:680
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Notes personnelles"
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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 +526,72 @@ msgstr "Groupe"
 msgid "Group roles"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:704
 #, 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:723
 #, 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:728 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:735
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:750
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 #, 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:759
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 #, 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:761
 #, fuzzy
 #| msgid "Register absence"
 msgid "Can register absence"
 msgstr "Registre de Absence"
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 #, 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 +674,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 +702,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 +724,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 +821,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 +867,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 +885,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 +976,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 +1118,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 +1198,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 +1233,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 +1255,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 +1289,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 +1303,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 +1311,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 +1441,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 +1646,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..a3ca7ecd62424293afd0f457fe4b67c95cbeb5af 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-04-23 21:13+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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,203 @@ 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:58 aleksis/apps/alsijil/models.py:432
 #, 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:65
 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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 #, fuzzy
 #| msgid "Person"
 msgid "Personal note"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:484
+#, fuzzy
+#| msgid "Group"
+msgid "Group Note"
+msgstr "Grex"
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:513
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:612
+#, fuzzy
+#| msgid "Group"
+msgid "Groups of Person"
+msgstr "Grex"
+
+#: aleksis/apps/alsijil/models.py:625
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:634
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:672
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:679
+#, fuzzy
+#| msgid "Person"
+msgid "Personal Note"
+msgstr "Persona"
+
+#: aleksis/apps/alsijil/models.py:680
+#, fuzzy
+#| msgid "Person"
+msgid "Personal Notes"
+msgstr "Persona"
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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 +476,60 @@ msgstr "Grex"
 msgid "Group roles"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:468
+#: aleksis/apps/alsijil/models.py:704
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:750
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 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 +610,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 +638,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 +659,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 +742,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 +788,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 +806,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 +883,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 +1009,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 +1085,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 +1118,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 +1136,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 +1165,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 +1179,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 +1187,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 +1307,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 +1500,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..4a23675366e43a10b5190e5dfd31b46a442dd86f 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-04-23 21:13+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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,244 @@ 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:58 aleksis/apps/alsijil/models.py:432
 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:65
 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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:484
+msgid "Group Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:513
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:612
+msgid "Groups of Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:625
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:634
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:672
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:679
+msgid "Personal Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:680
+msgid "Personal Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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:704
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:750
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 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 +589,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 +617,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 +638,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 +721,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 +765,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 +783,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 +854,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 +980,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 +1054,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 +1087,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 +1105,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 +1134,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 +1148,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 +1156,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 +1276,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 +1467,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..e1467925c5f0b0d1b4d9eebf9a8eea986c3785f3 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-04-23 21:13+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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,266 @@ 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:58 aleksis/apps/alsijil/models.py:432
 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Количество отсутствующих"
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:65
 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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr "Год"
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 msgid "Personal note"
 msgstr "Личная заметка"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr "Дополнительная отметка"
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Тема урока"
+
+#: aleksis/apps/alsijil/models.py:484
+#, fuzzy
+#| msgid "Group note"
+msgid "Group Note"
+msgstr "Групповая заметка"
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Учебный материал"
+
+#: aleksis/apps/alsijil/models.py:513
+#, fuzzy
+#| msgid "Lesson documentations"
+msgid "Documentations"
+msgstr "Учебные материалы"
+
+#: aleksis/apps/alsijil/models.py:612
+#, fuzzy
+#| msgid "Group roles"
+msgid "Groups of Person"
+msgstr "Роли групп"
+
+#: aleksis/apps/alsijil/models.py:625
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Пропуски"
+
+#: aleksis/apps/alsijil/models.py:634
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Пропуски"
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Заметки"
+
+#: aleksis/apps/alsijil/models.py:672
+#, fuzzy
+#| msgid "Extra mark"
+msgid "Extra Mark"
+msgstr "Дополнительная отметка"
+
+#: aleksis/apps/alsijil/models.py:679
+#, fuzzy
+#| msgid "Personal note"
+msgid "Personal Note"
+msgstr "Личная заметка"
+
+#: aleksis/apps/alsijil/models.py:680
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Личные заметки"
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr "Иконка"
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr "Цвет"
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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:704
 msgid "Can assign group role"
 msgstr "Может назначать роль группы"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Если нет точной конечной даты, можно оставить незаполненным"
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:750
 msgid "Group role assignment"
 msgstr "Назначение роли группы"
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr "Назначение ролей групп"
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr "Может просматривать обзор урока"
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr "Может просматривать недельный обзор"
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr "Может просматривать весь журнал"
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr "Может регистрировать отсутствие"
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 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 +546,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 +562,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 +612,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 +640,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 +660,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 +759,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 +803,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 +821,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 +898,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 +957,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 +1033,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 +1111,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 +1144,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 +1162,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 +1194,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 +1211,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 +1222,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 +1296,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 +1354,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 +1559,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..4a23675366e43a10b5190e5dfd31b46a442dd86f 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-04-23 21:13+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:471 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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,244 @@ 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:58 aleksis/apps/alsijil/models.py:432
 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:57
+#: aleksis/apps/alsijil/models.py:65
 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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:292
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:456
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+msgid "Lesson Topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:484
+msgid "Group Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+msgid "Documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:513
+msgid "Documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:612
+msgid "Groups of Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:625
+msgid "Absence Reason"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:634
+msgid "Base Absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+msgid "Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:672
+msgid "Extra Mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:679
+msgid "Personal Note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:680
+msgid "Personal Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:457
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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:704
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:750
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:519
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:520
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:521
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:522
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:523
+#: aleksis/apps/alsijil/models.py:762
 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 +589,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 +617,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 +638,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 +721,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 +765,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 +783,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 +854,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 +980,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 +1054,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 +1087,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 +1105,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 +1134,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 +1148,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 +1156,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 +1276,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 +1467,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..6353e21e708c593793b756827d3f056ba5edb008 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-04-23 21:13+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:471 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,403 @@ 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:609 aleksis/apps/alsijil/models.py:658
+#: 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:730
 #: 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:734
 #: 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/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
+#: 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:79
+#: aleksis/apps/alsijil/models.py:255
+#: 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:58 aleksis/apps/alsijil/models.py:432
 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:59 aleksis/apps/alsijil/models.py:433
+#: aleksis/apps/alsijil/models.py:694
 #: 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:63 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:65
+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:80
+#: 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:235 aleksis/apps/alsijil/models.py:334
 msgid "Year"
 msgstr "Рік"
 
-#: aleksis/apps/alsijil/models.py:292 aleksis/apps/alsijil/models.py:284
+#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: 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:294
 msgid "Personal note"
 msgstr "Особиста нотатка"
 
-#: aleksis/apps/alsijil/models.py:293
+#: aleksis/apps/alsijil/models.py:295
 #: 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:346
+#: 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:347 aleksis/apps/alsijil/models.py:483
+#: 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:348
+#: 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:398
+#: 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:399
 #: 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:435
+msgid "Foreground colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:436
+msgid "Background colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:438
+msgid "Show in coursebook"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:449
 msgid "Extra mark"
 msgstr "Додаткова відмітка"
 
-#: aleksis/apps/alsijil/models.py:456 aleksis/apps/alsijil/models.py:445
+#: aleksis/apps/alsijil/models.py:467
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:479 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:482
+#, fuzzy
+#| msgid "Lesson topic"
+msgid "Lesson Topic"
+msgstr "Тема уроку"
+
+#: aleksis/apps/alsijil/models.py:484
+#, fuzzy
+#| msgid "Group note"
+msgid "Group Note"
+msgstr "Групова нотатка"
+
+#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
+#: aleksis/apps/alsijil/models.py:665
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Documentation"
+msgstr "Учбовий матеріал"
+
+#: aleksis/apps/alsijil/models.py:513
+#, fuzzy
+#| msgid "Lesson documentations"
+msgid "Documentations"
+msgstr "Учбові матеріали"
+
+#: aleksis/apps/alsijil/models.py:612
+#, fuzzy
+#| msgid "Group roles"
+msgid "Groups of Person"
+msgstr "Ролі груп"
+
+#: aleksis/apps/alsijil/models.py:625
+#, fuzzy
+#| msgid "Absences"
+msgid "Absence Reason"
+msgstr "Відсутності"
+
+#: aleksis/apps/alsijil/models.py:634
+#, fuzzy
+#| msgid "Absences"
+msgid "Base Absence"
+msgstr "Відсутності"
+
+#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+msgid "Participation Status"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:670
+#, fuzzy
+#| msgid "Notes"
+msgid "Note"
+msgstr "Нотатки"
+
+#: aleksis/apps/alsijil/models.py:672
+#, fuzzy
+#| msgid "Extra mark"
+msgid "Extra Mark"
+msgstr "Додаткова відмітка"
+
+#: aleksis/apps/alsijil/models.py:679
+#, fuzzy
+#| msgid "Personal note"
+msgid "Personal Note"
+msgstr "Особиста нотатка"
+
+#: aleksis/apps/alsijil/models.py:680
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal Notes"
+msgstr "Особисті нотатки"
+
+#: aleksis/apps/alsijil/models.py:695
 msgid "Icon"
 msgstr "Піктограма"
 
-#: aleksis/apps/alsijil/models.py:457 aleksis/apps/alsijil/models.py:446
+#: aleksis/apps/alsijil/models.py:696
 msgid "Colour"
 msgstr "Колір"
 
-#: aleksis/apps/alsijil/models.py:463 aleksis/apps/alsijil/models.py:478
+#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
 #: 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:703
+#: 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:704
 msgid "Can assign group role"
 msgstr "Може призначати роль групи"
 
-#: aleksis/apps/alsijil/models.py:484 aleksis/apps/alsijil/models.py:473
+#: aleksis/apps/alsijil/models.py:723
 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:728 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:735
 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:750
 msgid "Group role assignment"
 msgstr "Призначення ролі групи"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:501
+#: aleksis/apps/alsijil/models.py:751
 msgid "Group role assignments"
 msgstr "Призначення ролі групи"
 
-#: aleksis/apps/alsijil/models.py:519 aleksis/apps/alsijil/models.py:508
+#: aleksis/apps/alsijil/models.py:758
 msgid "Can view lesson overview"
 msgstr "Може бачити огляд уроку"
 
-#: aleksis/apps/alsijil/models.py:520 aleksis/apps/alsijil/models.py:509
+#: aleksis/apps/alsijil/models.py:759
 msgid "Can view week overview"
 msgstr "Може бачити огляд тижня"
 
-#: aleksis/apps/alsijil/models.py:521 aleksis/apps/alsijil/models.py:510
+#: aleksis/apps/alsijil/models.py:760
 msgid "Can view full register"
 msgstr "Може бачити весь журнал"
 
-#: aleksis/apps/alsijil/models.py:522 aleksis/apps/alsijil/models.py:511
+#: aleksis/apps/alsijil/models.py:761
 msgid "Can register absence"
 msgstr "Може реєструвати пропуск"
 
-#: aleksis/apps/alsijil/models.py:523 aleksis/apps/alsijil/models.py:512
+#: aleksis/apps/alsijil/models.py:762
 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 +541,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 +640,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 +660,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 +744,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 +759,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 +803,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 +821,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 +898,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 +957,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 +1007,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 +1033,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 +1092,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 +1106,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 +1144,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 +1162,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 +1194,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 +1211,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 +1222,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 +1267,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 +1292,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 +1354,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 +1548,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 +1559,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/migrations/0020_documentation_extramark_colour_bg_and_more.py b/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..e83ef5e2205280af85df6b5674caf32e10152ee9
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py
@@ -0,0 +1,92 @@
+# Generated by Django 4.2.10 on 2024-04-18 14:48
+
+import colorfield.fields
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0061_remove_group_additional_fields'),
+        ('kolego', '0003_refactor_absence'),
+        ('cursus', '0003_drop_site'),
+        ('alsijil', '0019_drop_sites'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Documentation',
+            fields=[
+                ('calendarevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent')),
+                ('topic', models.CharField(blank=True, max_length=255, verbose_name='Lesson Topic')),
+                ('homework', models.CharField(blank=True, max_length=255, verbose_name='Homework')),
+                ('group_note', models.CharField(blank=True, max_length=255, verbose_name='Group Note')),
+                ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentations', to='cursus.course', verbose_name='Course')),
+                ('subject', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='cursus.subject', verbose_name='Subject')),
+                ('teachers', models.ManyToManyField(blank=True, null=True, related_name='documentations_as_teacher', to='core.person', verbose_name='Teachers')),
+            ],
+            options={
+                'verbose_name': 'Documentation',
+                'verbose_name_plural': 'Documentations',
+            },
+            bases=('core.calendarevent',),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='colour_bg',
+            field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Background colour'),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='colour_fg',
+            field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Foreground colour'),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='show_in_coursebook',
+            field=models.BooleanField(default=True, verbose_name='Show in coursebook'),
+        ),
+        migrations.CreateModel(
+            name='ParticipationStatus',
+            fields=[
+                ('calendarevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent')),
+                ('absent', models.BooleanField(verbose_name='Absent')),
+                ('absence_reason', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='kolego.absencereason', verbose_name='Absence Reason')),
+                ('base_absence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='absences', to='kolego.absence', verbose_name='Base Absence')),
+                ('groups_of_person', models.ManyToManyField(related_name='+', to='core.group', verbose_name='Groups of Person')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='core.person', verbose_name='Person')),
+                ('related_documentation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='alsijil.documentation', verbose_name='Documentation')),
+            ],
+            options={
+                'verbose_name': 'Participation Status',
+                'verbose_name_plural': 'Participation Status',
+                'ordering': ['related_documentation', 'person__last_name', 'person__first_name'],
+            },
+            bases=('core.calendarevent',),
+        ),
+        migrations.CreateModel(
+            name='NewPersonalNote',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')),
+                ('extended_data', models.JSONField(default=dict, editable=False)),
+                ('note', models.TextField(blank=True, verbose_name='Note')),
+                ('documentation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='personal_notes', to='alsijil.documentation', verbose_name='Documentation')),
+                ('extra_mark', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='alsijil.extramark', verbose_name='Extra Mark')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='new_personal_notes', to='core.person', verbose_name='Person')),
+            ],
+            options={
+                'verbose_name': 'Personal Note',
+                'verbose_name_plural': 'Personal Notes',
+            },
+        ),
+        migrations.AddConstraint(
+            model_name='participationstatus',
+            constraint=models.UniqueConstraint(fields=('related_documentation', 'person'), name='unique_participation_status_per_documentation'),
+        ),
+        migrations.AddConstraint(
+            model_name='newpersonalnote',
+            constraint=models.CheckConstraint(check=models.Q(models.Q(('note', ''), _negated=True), ('extra_mark__isnull', False), _connector='OR'), name='unique_absence_per_documentation'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 17a2552567df74f80b4c7aecfcf5465f7dd0bc76..332c428fa7eff2095dc3ec83eb013ee759bab42b 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -1,10 +1,12 @@
-from datetime import date
+from datetime import date, datetime
 from typing import Optional, Union
 from urllib.parse import urlparse
 
 from django.db import models
+from django.db.models import QuerySet
 from django.db.models.constraints import CheckConstraint
 from django.db.models.query_utils import Q
+from django.http import HttpRequest
 from django.urls import reverse
 from django.utils.formats import date_format
 from django.utils.translation import gettext_lazy as _
@@ -31,10 +33,14 @@ from aleksis.apps.alsijil.managers import (
 )
 from aleksis.apps.chronos.managers import GroupPropertiesMixin
 from aleksis.apps.chronos.mixins import WeekRelatedMixin
-from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod, TimePeriod
+from aleksis.apps.chronos.models import Event, ExtraLesson, LessonEvent, LessonPeriod, TimePeriod
+from aleksis.apps.chronos.util.format import format_m2m
+from aleksis.apps.cursus.models import Course, Subject
+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 SchoolTerm
+from aleksis.core.models import CalendarEvent, Group, SchoolTerm
 from aleksis.core.util.core_helpers import get_site_preferences
 from aleksis.core.util.model_helpers import ICONS
 
@@ -426,6 +432,11 @@ class ExtraMark(ExtensibleModel):
     short_name = models.CharField(max_length=255, unique=True, verbose_name=_("Short name"))
     name = models.CharField(max_length=255, unique=True, verbose_name=_("Name"))
 
+    colour_fg = ColorField(verbose_name=_("Foreground colour"), blank=True)
+    colour_bg = ColorField(verbose_name=_("Background colour"), blank=True)
+
+    show_in_coursebook = models.BooleanField(default=True, verbose_name=_("Show in coursebook"))
+
     def __str__(self):
         return f"{self.name}"
 
@@ -439,6 +450,242 @@ class ExtraMark(ExtensibleModel):
         verbose_name_plural = _("Extra marks")
 
 
+class Documentation(CalendarEvent):
+    """A documentation on teaching content in a freely choosable time frame.
+
+    Non-personal, includes the topic and homework of the lesson.
+    """
+
+    # FIXME: DataCheck
+
+    course = models.ForeignKey(
+        Course,
+        models.PROTECT,
+        related_name="documentations",
+        blank=True,
+        null=True,
+        verbose_name=_("Course"),
+    )
+
+    subject = models.ForeignKey(
+        Subject, models.PROTECT, related_name="+", blank=True, null=True, verbose_name=_("Subject")
+    )
+
+    teachers = models.ManyToManyField(
+        "core.Person",
+        related_name="documentations_as_teacher",
+        blank=True,
+        null=True,
+        verbose_name=_("Teachers"),
+    )
+
+    topic = models.CharField(verbose_name=_("Lesson Topic"), max_length=255, blank=True)
+    homework = models.CharField(verbose_name=_("Homework"), max_length=255, blank=True)
+    group_note = models.CharField(verbose_name=_("Group Note"), max_length=255, blank=True)
+
+    def get_subject(self) -> str:
+        if self.subject:
+            return self.subject
+        if self.amends:
+            if self.amends.subject:
+                return self.amends.subject
+            if self.amends.course:
+                return self.amends.course.subject
+        if self.course:
+            return self.course.subject
+
+    def get_groups(self) -> QuerySet[Group]:
+        if self.amends:
+            return self.amends.actual_groups
+        if self.course:
+            return self.course.groups.all()
+
+    def __str__(self) -> str:
+        start_datetime = CalendarEvent.value_start_datetime(self)
+        end_datetime = CalendarEvent.value_end_datetime(self)
+        return (
+            f"{format_m2m(self.get_groups())} {self.get_subject()}"
+            + f" {start_datetime} - {end_datetime}"
+        )
+
+    class Meta:
+        verbose_name = _("Documentation")
+        verbose_name_plural = _("Documentations")
+        # should check if object has either course or amends,
+        # which is not possible via constraint, because amends is not local to Documentation
+
+    @classmethod
+    def get_for_coursebook(
+        cls,
+        own: bool,
+        date_start: datetime,
+        date_end: datetime,
+        request: HttpRequest,
+        obj_type: Optional[str] = None,
+        obj_id: Optional[str] = None,
+        incomplete: Optional[bool] = False,
+    ) -> list:
+        """Get all the documentations for an object and a time frame.
+
+        obj_type may be one of TEACHER, GROUP, ROOM, COURSE
+        """
+
+        # 1. Find all LessonEvents for all Lessons of this Course in this date range
+        event_params = {
+            "own": own,
+        }
+        if obj_type is not None and obj_id is not None:
+            event_params.update(
+                {
+                    "type": obj_type,
+                    "id": obj_id,
+                }
+            )
+
+        events = LessonEvent.get_single_events(
+            date_start,
+            date_end,
+            request,
+            event_params,
+            with_reference_object=True,
+        )
+
+        # 2. For each lessonEvent → check if there is a documentation
+        # if so, add the documentation to a list, if not, create a new one
+        docs = []
+        for event in events:
+            if incomplete and event["STATUS"] == "CANCELLED":
+                continue
+
+            event_reference_obj = event["REFERENCE_OBJECT"]
+            existing_documentations = event_reference_obj.amended_by.filter(
+                datetime_start=event["DTSTART"].dt,
+                datetime_end=event["DTEND"].dt,
+            )
+
+            if existing_documentations.exists():
+                doc = existing_documentations.first()
+                if incomplete and doc.topic:
+                    continue
+                docs.append(doc)
+            else:
+                if event_reference_obj.amends:
+                    if event_reference_obj.course:
+                        course = event_reference_obj.course
+                    else:
+                        course = event_reference_obj.amends.course
+
+                    if event_reference_obj.subject:
+                        subject = event_reference_obj.subject
+                    else:
+                        subject = event_reference_obj.amends.subject
+                else:
+                    course, subject = event_reference_obj.course, event_reference_obj.subject
+
+                docs.append(
+                    cls(
+                        pk=f"DUMMY;{event_reference_obj.id};{event['DTSTART'].dt.isoformat()};{event['DTEND'].dt.isoformat()}",
+                        amends=event_reference_obj,
+                        course=course,
+                        subject=subject,
+                        datetime_start=event["DTSTART"].dt,
+                        datetime_end=event["DTEND"].dt,
+                    )
+                )
+
+        return docs
+
+
+class ParticipationStatus(CalendarEvent):
+    """A participation or absence record about a single person.
+
+    Used in the class register to note participation or absence of a student
+    in a documented unit (e.g. a single lesson event or a custom time frame; see Documentation).
+    """
+
+    # FIXME: DataChecks
+
+    person = models.ForeignKey(
+        "core.Person", models.CASCADE, related_name="participations", verbose_name=_("Person")
+    )
+    groups_of_person = models.ManyToManyField(
+        "core.Group", related_name="+", verbose_name=_("Groups of Person")
+    )
+
+    related_documentation = models.ForeignKey(
+        Documentation,
+        models.CASCADE,
+        related_name="participations",
+        verbose_name=_("Documentation"),
+    )
+
+    # Absence part
+    absent = models.BooleanField(verbose_name=_("Absent"))
+    absence_reason = models.ForeignKey(
+        AbsenceReason, verbose_name=_("Absence Reason"), on_delete=models.PROTECT
+    )
+
+    base_absence = models.ForeignKey(
+        KolegoAbsence,
+        models.SET_NULL,
+        blank=True,
+        null=True,
+        related_name="absences",
+        verbose_name=_("Base Absence"),
+    )
+
+    def __str__(self) -> str:
+        return f"{self.related_documentation}, {self.person}"
+
+    class Meta:
+        verbose_name = _("Participation Status")
+        verbose_name_plural = _("Participation Status")
+        ordering = [
+            "related_documentation",
+            "person__last_name",
+            "person__first_name",
+        ]
+        constraints = [
+            models.UniqueConstraint(
+                fields=("related_documentation", "person"),
+                name="unique_participation_status_per_documentation",
+            ),
+        ]
+
+
+class NewPersonalNote(ExtensibleModel):
+    person = models.ForeignKey(
+        "core.Person", models.CASCADE, related_name="new_personal_notes", verbose_name=_("Person")
+    )
+
+    documentation = models.ForeignKey(
+        Documentation,
+        models.CASCADE,
+        related_name="personal_notes",
+        verbose_name=_("Documentation"),
+        blank=True,
+        null=True,
+    )
+
+    note = models.TextField(blank=True, verbose_name=_("Note"))
+    extra_mark = models.ForeignKey(
+        ExtraMark, on_delete=models.PROTECT, blank=True, null=True, verbose_name=_("Extra Mark")
+    )
+
+    def __str__(self) -> str:
+        return f"{self.person}, {self.note}, {self.extra_mark}"
+
+    class Meta:
+        verbose_name = _("Personal Note")
+        verbose_name_plural = _("Personal Notes")
+        constraints = [
+            models.CheckConstraint(
+                check=~Q(note="") | Q(extra_mark__isnull=False),
+                name="unique_absence_per_documentation",
+            ),
+        ]
+
+
 class GroupRole(ExtensibleModel):
     data_checks = [field_validation_data_check_factory("alsijil", "GroupRole", "icon")]
 
diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py
index 2fd34fa7fc4f802a52ead1d2d0291789be4fb9ce..b00d9277e507e284130340b84cbbca8c07597d1f 100644
--- a/aleksis/apps/alsijil/preferences.py
+++ b/aleksis/apps/alsijil/preferences.py
@@ -2,7 +2,7 @@ from django.core.exceptions import ValidationError
 from django.utils.translation import gettext_lazy as _
 
 from dynamic_preferences.preferences import Section
-from dynamic_preferences.types import BooleanPreference, IntegerPreference
+from dynamic_preferences.types import BooleanPreference, ChoicePreference, IntegerPreference
 
 from aleksis.core.registries import person_preferences_registry, site_preferences_registry
 
@@ -157,3 +157,27 @@ class DefaultLessonDocumentationFilter(BooleanPreference):
     name = "default_lesson_documentation_filter"
     default = True
     verbose_name = _("Filter lessons by existence of their lesson documentation on default")
+
+
+@site_preferences_registry.register
+class AllowEditFutureDocumentations(ChoicePreference):
+    """Time range for which documentations may be edited."""
+
+    section = alsijil
+    name = "allow_edit_future_documentations"
+    default = "current_day"
+    choices = (
+        ("all", _("Allow editing of all future documentations")),
+        (
+            "current_day",
+            _("Allow editing of all documentations up to and including those on the current day"),
+        ),
+        (
+            "current_time",
+            _(
+                "Allow editing of all documentations up to and "
+                "including those on the current date and time"
+            ),
+        ),
+    )
+    verbose_name = _("Set time range for which documentations may be edited")
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index e9011c6c2b33ed58a21b6412f6c7e366b1b5e49e..b7fa4d04a23df031ff479870c17cf5f1a3d53446 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -11,12 +11,21 @@ from aleksis.core.util.predicates import (
 )
 
 from .util.predicates import (
+    can_edit_documentation,
+    can_view_any_documentation,
+    can_view_documentation,
     has_lesson_group_object_perm,
     has_person_group_object_perm,
     has_personal_note_group_perm,
+    is_course_group_owner,
+    is_course_member,
+    is_course_teacher,
     is_group_member,
     is_group_owner,
     is_group_role_assignment_group_owner,
+    is_in_allowed_time_range,
+    is_lesson_event_group_owner,
+    is_lesson_event_teacher,
     is_lesson_original_teacher,
     is_lesson_parent_group_owner,
     is_lesson_participant,
@@ -352,3 +361,56 @@ view_register_objects_list_predicate = has_person & (
     | has_global_perm("alsijil.view_full_register")
 )
 add_perm("alsijil.view_register_objects_list_rule", view_register_objects_list_predicate)
+
+view_documentation_predicate = has_person & (
+    has_global_perm("alsijil.view_documentation") | can_view_documentation
+)
+add_perm("alsijil.view_documentation_rule", view_documentation_predicate)
+
+view_documentations_for_course_predicate = has_person & (
+    has_global_perm("alsijil.view_documentation")
+    | is_course_teacher
+    | is_course_member
+    | is_course_group_owner
+)
+add_perm("alsijil.view_documentations_for_course_rule", view_documentations_for_course_predicate)
+
+view_documentations_for_group_predicate = has_person & (
+    has_global_perm("alsijil.view_documentation")
+    | is_group_owner
+    | is_group_member
+    | is_parent_group_owner
+)
+add_perm("alsijil.view_documentations_for_group_rule", view_documentations_for_group_predicate)
+
+view_documentations_menu_predicate = has_person & (
+    has_global_perm("alsijil.view_documentation") | can_view_any_documentation
+)
+add_perm("alsijil.view_documentations_menu_rule", view_documentations_menu_predicate)
+
+view_documentations_for_teacher_predicate = has_person & (
+    has_global_perm("alsijil.view_documentation") | is_current_person
+)
+add_perm("alsijil.view_documentations_for_teacher_rule", view_documentations_for_teacher_predicate)
+
+add_documentation_for_course_predicate = has_person & (
+    has_global_perm("alsijil.add_documentation") | is_course_teacher
+)
+add_perm("alsijil.add_documentation_for_course_rule", add_documentation_for_course_predicate)
+
+add_documentation_for_lesson_event_predicate = has_person & (
+    has_global_perm("alsijil.add_documentation")
+    | is_lesson_event_teacher
+    | is_lesson_event_group_owner
+)
+add_perm(
+    "alsijil.add_documentation_for_lesson_event_rule", add_documentation_for_lesson_event_predicate
+)
+
+edit_documentation_predicate = (
+    has_person
+    & (has_global_perm("alsijil.change_documentation") | can_edit_documentation)
+    & is_in_allowed_time_range
+)
+add_perm("alsijil.edit_documentation_rule", edit_documentation_predicate)
+add_perm("alsijil.delete_documentation_rule", edit_documentation_predicate)
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..aae1b70603f0b0e5c738d81467d31f3844f13a86
--- /dev/null
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -0,0 +1,121 @@
+from datetime import datetime
+
+from django.core.exceptions import PermissionDenied
+from django.db.models.query_utils import Q
+
+import graphene
+
+from aleksis.apps.cursus.models import Course
+from aleksis.apps.cursus.schema import CourseType
+from aleksis.core.models import Group, Person
+from aleksis.core.schema.base import FilterOrderList
+from aleksis.core.schema.group import GroupType
+from aleksis.core.util.core_helpers import has_person
+
+from ..models import Documentation
+from .documentation import (
+    DocumentationBatchCreateOrUpdateMutation,
+    DocumentationType,
+)
+
+
+class Query(graphene.ObjectType):
+    documentations = FilterOrderList(DocumentationType)
+    documentations_by_course_id = FilterOrderList(
+        DocumentationType, course_id=graphene.ID(required=True)
+    )
+    documentations_for_coursebook = FilterOrderList(
+        DocumentationType,
+        own=graphene.Boolean(required=True),
+        obj_type=graphene.String(required=False),
+        obj_id=graphene.ID(required=False),
+        date_start=graphene.Date(required=True),
+        date_end=graphene.Date(required=True),
+        incomplete=graphene.Boolean(required=False),
+    )
+
+    groups_by_person = FilterOrderList(GroupType, person=graphene.ID())
+    courses_of_person = FilterOrderList(CourseType, person=graphene.ID())
+
+    def resolve_documentations_by_course_id(root, info, course_id, **kwargs):
+        documentations = Documentation.objects.filter(
+            Q(course__pk=course_id) | Q(amends__course__pk=course_id)
+        )
+        return documentations
+
+    def resolve_documentations_for_coursebook(
+        root,
+        info,
+        own,
+        date_start,
+        date_end,
+        obj_type=None,
+        obj_id=None,
+        incomplete=False,
+        **kwargs,
+    ):
+        datetime_start = datetime.combine(date_start, datetime.min.time())
+        datetime_end = datetime.combine(date_end, datetime.max.time())
+
+        if (
+            (
+                obj_type == "COURSE"
+                and not info.context.user.has_perm(
+                    "alsijil.view_documentations_for_course_rule", Course.objects.get(id=obj_id)
+                )
+            )
+            or (
+                obj_type == "GROUP"
+                and not info.context.user.has_perm(
+                    "alsijil.view_documentations_for_group_rule", Group.objects.get(id=obj_id)
+                )
+            )
+            or (
+                obj_type == "TEACHER"
+                and not info.context.user.has_perm(
+                    "alsijil.view_documentations_for_teacher_rule", Person.objects.get(id=obj_id)
+                )
+            )
+        ):
+            raise PermissionDenied()
+
+        return Documentation.get_for_coursebook(
+            own, datetime_start, datetime_end, info.context, obj_type, obj_id, incomplete
+        )
+
+    @staticmethod
+    def resolve_groups_by_person(root, info, person=None):
+        if person:
+            person = Person.objects.get(pk=person)
+            if not info.context.user.has_perm("core.view_person_rule", person):
+                raise PermissionDenied()
+        elif has_person(info.context.user):
+            person = info.context.user.person
+        else:
+            raise PermissionDenied()
+
+        return Group.objects.filter(
+            Q(members=person) | Q(owners=person) | Q(parent_groups__owners=person)
+        )
+
+    @staticmethod
+    def resolve_courses_of_person(root, info, person=None):
+        if person:
+            person = Person.objects.get(pk=person)
+            if not info.context.user.has_perm("core.view_person_rule", person):
+                raise PermissionDenied()
+        elif has_person(info.context.user):
+            person = info.context.user.person
+        else:
+            raise PermissionDenied()
+
+        return Course.objects.filter(
+            Q(teachers=person)
+            | Q(groups__members=person)
+            | Q(groups__owners=person)
+            | Q(groups__parent_groups__owners=person)
+        )
+
+
+class Mutation(graphene.ObjectType):
+    create_or_update_documentations = DocumentationBatchCreateOrUpdateMutation.Field()
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
new file mode 100644
index 0000000000000000000000000000000000000000..3225db34e7c146c4eadcf34efcc11936f5df7311
--- /dev/null
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -0,0 +1,195 @@
+from datetime import datetime
+
+from django.core.exceptions import PermissionDenied
+from django.utils.timezone import localdate, localtime
+
+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
+from aleksis.apps.chronos.models import LessonEvent
+from aleksis.apps.chronos.schema import LessonEventType
+from aleksis.apps.cursus.models import Subject
+from aleksis.apps.cursus.schema import CourseType, SubjectType
+from aleksis.core.models import Person
+from aleksis.core.schema.base import (
+    DjangoFilterMixin,
+    PermissionsTypeMixin,
+)
+from aleksis.core.util.core_helpers import get_site_preferences
+
+from ..models import Documentation
+
+
+class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
+    class Meta:
+        model = Documentation
+        fields = (
+            "id",
+            "course",
+            "amends",
+            "subject",
+            "topic",
+            "homework",
+            "group_note",
+            "datetime_start",
+            "datetime_end",
+            "date_start",
+            "date_end",
+            "teachers",
+        )
+        filter_fields = {
+            "id": ["exact", "lte", "gte"],
+            "course__name": ["exact"],
+        }
+
+    course = graphene.Field(CourseType, required=False)
+    amends = graphene.Field(lambda: LessonEventType, required=False)
+    subject = graphene.Field(SubjectType, required=False)
+
+    future_notice = graphene.Boolean(required=False)
+
+    old_id = graphene.ID(required=False)
+
+    @staticmethod
+    def resolve_teachers(root: Documentation, info, **kwargs):
+        if not str(root.pk).startswith("DUMMY") and hasattr(root, "teachers"):
+            return root.teachers
+        elif root.amends.amends:
+            if root.amends.teachers:
+                return root.amends.teachers
+            else:
+                return root.amends.amends.teachers
+        return root.amends.teachers
+
+    @staticmethod
+    def resolve_future_notice(root: Documentation, info, **kwargs):
+        """Show whether the user can't edit the documentation because it's in the future."""
+        return not is_in_allowed_time_range(info.context.user, root) and can_edit_documentation(
+            info.context.user, root
+        )
+
+    @classmethod
+    def get_queryset(cls, queryset, info):
+        return get_objects_for_user(info.context.user, "alsijil.view_documentation", queryset)
+
+
+class DocumentationInputType(graphene.InputObjectType):
+    id = graphene.ID(required=True)
+    course = graphene.ID(required=False)
+    subject = graphene.ID(required=False)
+    teachers = graphene.List(graphene.ID, required=False)
+
+    topic = graphene.String(required=False)
+    homework = graphene.String(required=False)
+    group_note = graphene.String(required=False)
+
+
+class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
+    class Arguments:
+        input = graphene.List(DocumentationInputType)
+
+    documentations = graphene.List(DocumentationType)
+
+    @classmethod
+    def create_or_update(cls, info, doc):
+        _id = doc.id
+
+        # Sadly, we can't use the update_or_create method since create_defaults
+        # is only introduced in Django 5.0
+        if _id.startswith("DUMMY"):
+            dummy, lesson_event_id, datetime_start_iso, datetime_end_iso = _id.split(";")
+            lesson_event = LessonEvent.objects.get(id=lesson_event_id)
+
+            datetime_start = datetime.fromisoformat(datetime_start_iso).astimezone(
+                lesson_event.timezone
+            )
+            datetime_end = datetime.fromisoformat(datetime_end_iso).astimezone(
+                lesson_event.timezone
+            )
+
+            if info.context.user.has_perm(
+                "alsijil.add_documentation_for_lesson_event_rule", lesson_event
+            ) and (
+                get_site_preferences()["alsijil__allow_edit_future_documentations"] == "all"
+                or (
+                    get_site_preferences()["alsijil__allow_edit_future_documentations"]
+                    == "current_day"
+                    and datetime_start.date() <= localdate()
+                )
+                or (
+                    get_site_preferences()["alsijil__allow_edit_future_documentations"]
+                    == "current_time"
+                    and datetime_start <= localtime()
+                )
+            ):
+                if lesson_event.amends:
+                    if lesson_event.course:
+                        course = lesson_event.course
+                    else:
+                        course = lesson_event.amends.course
+
+                    if lesson_event.subject:
+                        subject = lesson_event.subject
+                    else:
+                        subject = lesson_event.amends.subject
+
+                    if lesson_event.teachers:
+                        teachers = lesson_event.teachers
+                    else:
+                        teachers = lesson_event.amends.teachers
+                else:
+                    course, subject, teachers = (
+                        lesson_event.course,
+                        lesson_event.subject,
+                        lesson_event.teachers,
+                    )
+
+                obj = Documentation.objects.create(
+                    datetime_start=datetime_start,
+                    datetime_end=datetime_end,
+                    amends=lesson_event,
+                    course=course,
+                    subject=subject,
+                    topic=doc.topic or "",
+                    homework=doc.homework or "",
+                    group_note=doc.group_note or "",
+                )
+                if doc.teachers is not None:
+                    obj.teachers.add(*doc.teachers)
+                else:
+                    obj.teachers.set(teachers.all())
+                obj.save()
+                return obj
+            raise PermissionDenied()
+        else:
+            obj = Documentation.objects.get(id=_id)
+
+            if not info.context.user.has_perm("alsijil.edit_documentation_rule", obj):
+                raise PermissionDenied()
+
+            if doc.topic is not None:
+                obj.topic = doc.topic
+            if doc.homework is not None:
+                obj.homework = doc.homework
+            if doc.group_note is not None:
+                obj.group_note = doc.group_note
+
+            if doc.subject is not None:
+                obj.subject = Subject.objects.get(pk=doc.subject)
+            if doc.teachers is not None:
+                obj.teachers.set(Person.objects.filter(pk__in=doc.teachers))
+
+            obj.save()
+            return obj
+
+    @classmethod
+    def mutate(cls, root, info, input):  # noqa
+        with create_revision():
+            set_user(info.context.user)
+            set_comment("Updated in coursebook")
+            objs = [cls.create_or_update(info, doc) for doc in input]
+
+        return DocumentationBatchCreateOrUpdateMutation(documentations=objs)
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 c3a450ec9e6b657370c5b36f598e9224e6472287..fe7746948d807f3afede2a8fd3a11b41358965f5 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -1,14 +1,18 @@
 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 rules import predicate
 
-from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod
+from aleksis.apps.chronos.models import Event, ExtraLesson, LessonEvent, LessonPeriod
+from aleksis.apps.cursus.models import Course
 from aleksis.core.models import Group, Person
+from aleksis.core.util.core_helpers import get_site_preferences
 from aleksis.core.util.predicates import check_object_permission
 
-from ..models import PersonalNote
+from ..models import Documentation, PersonalNote
 
 
 @predicate
@@ -290,3 +294,165 @@ def is_group_role_assignment_group_owner(user: User, obj: Union[Group, Person])
 def is_owner_of_any_group(user: User, obj):
     """Predicate which checks if the person is group owner of any group."""
     return Group.objects.filter(owners=user.person).exists()
+
+
+@predicate
+def is_course_teacher(user: User, obj: Course):
+    """Predicate for teachers of a course.
+
+    Checks whether the person linked to the user is a teacher in the course.
+    """
+    if obj:
+        return user.person in obj.teachers.all()
+    return False
+
+
+@predicate
+def is_lesson_event_teacher(user: User, obj: LessonEvent):
+    """Predicate for teachers of a lesson event.
+
+    Checks whether the person linked to the user is a teacher in the lesson event.
+    """
+    if obj:
+        return user.person in obj.all_teachers
+    return False
+
+
+@predicate
+def is_course_member(user: User, obj: Course):
+    """Predicate for members of a course.
+
+    Checks whether the person linked to the user is a member in the course.
+    """
+    if obj:
+        for g in obj.groups.all():
+            if user.person in g.members.all():
+                return True
+    return False
+
+
+@predicate
+def is_course_group_owner(user: User, obj: Course):
+    """Predicate for group owners of a course.
+
+    Checks whether the person linked to the user is a owner of any group
+    (or their respective parent groups) linked to the course.
+    """
+    if obj:
+        for g in obj.groups.all():
+            if user.person in g.owners.all():
+                return True
+            for pg in g.parent_groups.all():
+                if user.person in pg.owners.all():
+                    return True
+    return False
+
+
+@predicate
+def is_lesson_event_member(user: User, obj: LessonEvent):
+    """Predicate for members of a lesson event.
+
+    Checks whether the person linked to the user is a member in the lesson event,
+    or a members of the course, if the lesson event has one.
+    """
+    if obj:
+        for g in obj.groups.all():
+            if user.person in g.members.all():
+                return True
+
+    return False
+
+
+@predicate
+def is_lesson_event_group_owner(user: User, obj: LessonEvent):
+    """Predicate for group owners of a lesson event.
+
+    Checks whether the person linked to the user is a owner of any group
+    (or their respective parent groups) linked to the lesson event,
+    or a owner of any group linked to the course, if the lesson event has one.
+    """
+    if obj:
+        for g in obj.groups.all():
+            if user.person in g.owners.all():
+                return True
+            for pg in g.parent_groups.all():
+                if user.person in pg.owners.all():
+                    return True
+    return False
+
+
+@predicate
+def is_documentation_teacher(user: User, obj: Documentation):
+    """Predicate for teachers of a documentation.
+
+    Checks whether the person linked to the user is a teacher in the documentation.
+    """
+    if obj:
+        if not str(obj.pk).startswith("DUMMY") and hasattr(obj, "teachers"):
+            teachers = obj.teachers
+        elif obj.amends.amends:
+            teachers = obj.amends.teachers if obj.amends.teachers else obj.amends.amends.teachers
+        else:
+            teachers = obj.amends.teachers
+        return user.person in teachers.all()
+    return False
+
+
+@predicate
+def can_view_documentation(user: User, obj: Documentation):
+    """Predicate which checks if the user is allowed to view 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_member(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_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(
+        Q(teachers=user.person)
+        | Q(amends__in=allowed_lesson_events)
+        | Q(course__teachers=user.person)
+    ).exists()
+
+
+@predicate
+def can_edit_documentation(user: User, obj: Documentation):
+    """Predicate which checks if the user is allowed to edit or delete 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."""
+    if obj and (
+        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()
+        )
+        or (
+            get_site_preferences()["alsijil__allow_edit_future_documentations"] == "current_time"
+            and obj.datetime_start <= localtime()
+        )
+    ):
+        return True
+    return False
diff --git a/pyproject.toml b/pyproject.toml
index c19624053cb6d7c1c5779163f9cb66bda9bf9961..9f5bdea8a085f549aee9644fdb3c6ac29c6bcda6 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.dev0"
 packages = [
     { include = "aleksis" }
 ]
@@ -49,9 +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.0.dev0"
 
 [tool.poetry.extras]
 seatingplans = ["aleksis-app-stoelindeling"]