diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 50eb362cd2e9c0e79882d923b3386fd680b5338c..fe7a89aa0ed37c4d3b6bf684618a0f2f1c5ac001 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,12 +9,106 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+`3.0`_ - 2022-05-11
+-------------------
+
+Added
+~~~~~
+
+* GraphQL schema for Rooms
+* Provide API endpoint for system status.
+* [Dev] UpdateIndicator Vue Component to display the status of interactive pages
+* [Dev] DeleteDialog Vue Component to unify item deletion in the new frontend
+
+
+Changed
+~~~~~~~
+
+* Show message on successful logout to inform users properly.
+* Phone number country now has to be configured in config file insted of frontend.
+
+Fixed
+~~~~~
+
+* GraphQL endpoints for groups, persons, and notifications didn't expose all necessary fields.
+* Loading indicator in toolbar was not shown at the complete loading progress.
+* 404 page was sometimes shown while the page was still loading.
+* Setting of page height in the iframe was not working correctly.
+* App switched to offline state when the user was logged out/in.
+* The `Stop Impersonation` button is not shown due to an oversee when changing the type of the whoAmI query to an object of UserType
+* Offline fallback page for legacy pages was misleading sometimes.
+* Route changes in the Legacy-Component iframe didn't trigger a scroll to the top
+* Query strings did not get passed when navigating legacy pages inside of the SPA.
+* Retry button on error 500 page did not trigger a reload of the page.
+* When the Celery worker wasn't able to execute all tasks in time, notifications were sent multiple times.
+* Changing the maintenance mode state spawned another SPA instance in the iframe
+* Phone numbers couldn't be in regional format.
+* System status view wasn't accessible through new frontend if a check failed.
+* Progress page didn't show error message on failure.
+* Dynamic routes were not removed/hidden when the respective object registering it was deleted.
+* Django messages were not displayed in Vue frontend.
+* Links to data check objects did not work properly.
+* Backend cleanup task for Celery wasn't working.
+* URLs in invitation email were broken.
+* Invitation view didn't work.
+* Invitation emails were using wrong styling. 
+* GraphQL queries and mutations did not log exceptions.
+
+`3.0b3`_ - 2023-03-19
+---------------------
+
+Fixed
+~~~~~
+
+* Some GraphQL queries could return more data than permitted in related fields.
+
+`3.0b2`_ - 2023-03-09
+---------------------
+
+Changed
+~~~~~~~
+
+* Change default network policy of the Apollo client to `cache-and-network`.
+
+Fixed
+~~~~~
+
+* In case the status code of a response was not in the range between 200 and 299
+  but still indicates that the response should be delivered, e. g. in the case
+  of a redirected request, the service worker served the offline fallback page.
+* In some cases, the resize listener for the IFrame in the `LegacyBaseTemplate`
+  did not trigger.
+* [Dev] Allow apps to declare URLs in the non-legacy namespace again
+
+`3.0b1`_ - 2023-02-27
+---------------------
+
+Added
+~~~~~
+
+* Support for two factor authentication via email codes and Webauthn.
+
+`3.0b0`_ - 2023-02-15
+---------------------
+
+This release starts a new era of the AlekSIS® framework, by introducing a
+dynamic frontend app written in Vue.js which communicates with the backend
+through GraphQL.  Support for legacy views (Django templates and
+Materialize) was removed; while there is backwards compatibility for now,
+this is only used by official apps until their views are fully migrated.
+
+AlekSIS and its new frontend require Node.js version 18 or higher to run the
+Vite bundler. On Debian, this means that Debian 12 (bookworm) is needed, or
+Node.js must be installed from a third-party repository.
+
 Removed
 ~~~~~~~
 
 * Official support for views rendered server-side in Django is removed. The
   `LegacyBaseTemplate` provided for backwards compatibility must not be used
   by apps declaring a dependency on AlekSIS >= 3.0.
+* Support for deploying AlekSIS in sub-URLs
+* Support for production deployments without HTTPS
 
 Deprecated
 ~~~~~~~~~~
@@ -26,17 +120,17 @@ Added
 ~~~~~
 
 * Notification drawer in top nav bar
-* GraphQL queries and mutations for core data management
-* [Dev] Introduce new mechanism to register classes over all apps.
-* Data template for `room` model used for haystack search indexing moved to core.
-* Support for two factor authentication via email codes and Webauthn.
+* GraphQL queries for base system and some core data management
+* [Dev] New mechanism to register classes over all apps (RegistryObject)
+* Model for rooms
 
 Changed
 ~~~~~~~
 
 * Show languages in local language
-* Rewrite of frontend using Vuetify
-  * The runuwsgi dev server now starts a Vite dev server with HMR in the
+* Rewrite of frontend (base template) using Vuetify
+  * Frontend bundling migrated from Webpack to Vite (cf. installation docs)
+  * [Dev] The runuwsgi dev server now starts a Vite dev server with HMR in the
     background
 * OIDC scope "profile" now exposes the avatar instead of the official photo
 * Based on Django 4.0
@@ -55,26 +149,23 @@ Changed
 Fixed
 ~~~~~
 
-* The error page displayed when an ObjectOverview component is not able to get the required data was incomplete.
-* In some cases, the IFrame for legacy pages was not properly sized for its content.
-* When accessing the person overview page without a person ID, the avatar image was not displayed properly.
 * The system tried to send notifications for done background tasks
-  in addition to tasks started in the foreground.
-* 2FA via messages or phone calls didn't work.
+  in addition to tasks started in the foreground
+* 2FA via messages or phone calls didn't work after a faulty dependency
+  update
 * [Dev] Site reference on extensible models can no longer cause name clashes
-  because of its related name.
+  because of its related name
 
 Removed
 ~~~~~~~
 
-* Support for materialize-based frontend views (deprecated in 2.11)
-* Legacy support for person iCal feed URLs.
-* Django debug toolbar
+* iCal feed URLs for birthdays (will be reintroduced later)
+* [Dev] Django debug toolbar
   * It caused major performance issues and is not useful with the new
     frontend anymore
 
-`2.12.3` - 2023-03-07
----------------------
+`2.12.3`_ - 2023-03-07
+----------------------
 
 Fixed
 ~~~~~
@@ -1048,3 +1139,8 @@ Fixed
 .. _2.12.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.1
 .. _2.12.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.2
 .. _2.12.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.3
+.. _3.0b0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b0
+.. _3.0b1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b1
+.. _3.0b2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b2
+.. _3.0b3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b3
+.. _3.0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0
diff --git a/Dockerfile b/Dockerfile
index 44159bb3fd185d4eb11224e48139319c9468b019..2134ae81150a13dbab8282149a04df0fb8d20235 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@ FROM debian:bookworm-slim AS core
 
 # Build arguments
 ARG EXTRAS="ldap,s3,sentry"
-ARG APP_VERSION="==2.10.1.dev0+20220801181456.7ba74939"
+ARG APP_VERSION="==3.0b0"
 
 # Configure Python to be nice inside Docker and pip to stfu
 ENV PYTHONUNBUFFERED 1
@@ -64,6 +64,7 @@ RUN set -e; \
              ${ALEKSIS_static__root} \
              ${ALEKSIS_media__root} \
              ${ALEKSIS_backup__location}; \
+    dpkg-divert --rename --add /usr/lib/$(py3versions -d)/EXTERNALLY-MANAGED; \
     eatmydata pip install AlekSIS-Core\[$EXTRAS\]$APP_VERSION
 
 # Define entrypoint, volumes and uWSGI running on port 8000
diff --git a/README.rst b/README.rst
index 1a233ce7ae9e1b24e3cb0eaf088c17f41ef29a61..8c24dd27c0c4d0fb6fe9510d3ccb75447bfdd369 100644
--- a/README.rst
+++ b/README.rst
@@ -68,7 +68,7 @@ Licence
   Copyright © 2019, 2020, 2021, 2022, 2023 Dominik George <dominik.george@teckids.org>
   Copyright © 2019, 2020, 2021, 2022 Tom Teichler <tom.teichler@teckids.org>
   Copyright © 2019 mirabilos <thorsten.glaser@teckids.org>
-  Copyright © 2021, 2022 magicfelix <felix@felix-zauberer.de>
+  Copyright © 2021, 2022, 2023 magicfelix <felix@felix-zauberer.de>
   Copyright © 2021 Lloyd Meins <meinsll@katharineum.de>
   Copyright © 2022 Benedict Suska <benedict.suska@teckids.org>
   Copyright © 2022 Lukas Weichelt <lukas.weichelt@teckids.org>
diff --git a/aleksis/core/apps.py b/aleksis/core/apps.py
index 9b0518472c6309d33305188659de22700497aee5..e5e2d4008c132c24341d26f6532c254167b13741 100644
--- a/aleksis/core/apps.py
+++ b/aleksis/core/apps.py
@@ -3,6 +3,7 @@ from typing import Any, Optional
 import django.apps
 from django.apps import apps
 from django.conf import settings
+from django.contrib import messages
 from django.http import HttpRequest
 from django.utils.module_loading import autodiscover_modules
 from django.utils.translation import gettext as _
@@ -43,7 +44,7 @@ class CoreConfig(AppConfig):
         ([2019, 2020, 2021, 2022, 2023], "Dominik George", "dominik.george@teckids.org"),
         ([2019, 2020, 2021, 2022], "Tom Teichler", "tom.teichler@teckids.org"),
         ([2019], "mirabilos", "thorsten.glaser@teckids.org"),
-        ([2021, 2022], "magicfelix", "felix@felix-zauberer.de"),
+        ([2021, 2022, 2023], "magicfelix", "felix@felix-zauberer.de"),
         ([2021], "Lloyd Meins", "meinsll@katharineum.de"),
         ([2022], "Benedict Suska", "benedict.suska@teckids.org"),
         ([2022], "Lukas Weichelt", "lukas.weichelt@teckids.org"),
@@ -144,6 +145,11 @@ class CoreConfig(AppConfig):
             # Save the associated person to pick up defaults
             user.person.save()
 
+    def user_logged_out(
+        self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs
+    ) -> None:
+        messages.success(request, _("You have been logged out successfully."))
+
     @classmethod
     def get_all_scopes(cls) -> dict[str, str]:
         scopes = {
diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 92c120886e4a530cc566b8489cb09d3e38f5ba2e..efd6e34edae2dd9f6e01e02cc9c8c9a669ce7cd0 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -19,6 +19,7 @@ from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget,
 from dynamic_preferences.forms import PreferenceForm
 from guardian.shortcuts import assign_perm
 from invitations.forms import InviteForm
+from maintenance_mode.core import get_maintenance_mode
 from material import Fieldset, Layout, Row
 
 from .mixins import ExtensibleForm, SchoolTermRelatedExtensibleForm
@@ -860,3 +861,11 @@ class OAuthApplicationForm(forms.ModelForm):
             "redirect_uris",
             "skip_authorization",
         )
+
+
+class MaintenanceModeForm(forms.Form):
+    maintenance_mode = forms.BooleanField(
+        required=False,
+        initial=not get_maintenance_mode(),
+        widget=forms.HiddenInput,
+    )
diff --git a/aleksis/core/frontend/app/apollo.js b/aleksis/core/frontend/app/apollo.js
index c14ba118d0c4d14558f23a747a98b207067ff7b2..267997b9f93ba8d992a90093a93e650f32995811 100644
--- a/aleksis/core/frontend/app/apollo.js
+++ b/aleksis/core/frontend/app/apollo.js
@@ -70,7 +70,7 @@ const apolloOpts = {
           }
           // Add a snackbar on all errors returned by the GraphQL endpoint
           //  If App is offline, don't add snackbar since only the ping query is active
-          if (!vm.$root.offline) {
+          if (!vm.$root.offline && !vm.$root.invalidation) {
             vm.$root.snackbarItems.push({
               id: crypto.randomUUID(),
               timeout: 5000,
@@ -79,7 +79,7 @@ const apolloOpts = {
             });
           }
         }
-        if (networkError) {
+        if (networkError && !vm.$root.invalidation) {
           // Set app offline globally on network errors
           //  This will cause the offline logic to kick in, starting a ping check or
           //  similar recovery strategies depending on the app/navigator state
@@ -90,6 +90,7 @@ const apolloOpts = {
           vm.$root.offline = true;
         }
       },
+      fetchPolicy: "cache-and-network",
     },
   },
 };
diff --git a/aleksis/core/frontend/app/dateTimeFormats.js b/aleksis/core/frontend/app/dateTimeFormats.js
index a835b238ccb56b0cdfc465f3b7ea2341e45322f8..6a980fc8dab2fea0b74fec8ef042de413db35bee 100644
--- a/aleksis/core/frontend/app/dateTimeFormats.js
+++ b/aleksis/core/frontend/app/dateTimeFormats.js
@@ -19,6 +19,13 @@ const dateTimeFormats = {
       minute: "numeric",
       second: "numeric",
     },
+    longNumeric: {
+      year: "numeric",
+      month: "numeric",
+      day: "numeric",
+      hour: "numeric",
+      minute: "numeric",
+    },
   },
   de: {
     short: {
@@ -39,6 +46,13 @@ const dateTimeFormats = {
       minute: "numeric",
       second: "numeric",
     },
+    longNumeric: {
+      year: "numeric",
+      month: "numeric",
+      day: "numeric",
+      hour: "numeric",
+      minute: "numeric",
+    },
   },
 };
 
diff --git a/aleksis/core/frontend/components/LegacyBaseTemplate.vue b/aleksis/core/frontend/components/LegacyBaseTemplate.vue
index 324882b44c5efc85e4bef9c9fcce026cf1728320..790fc10c592bac5acc1e3bbadabcae63e065804f 100644
--- a/aleksis/core/frontend/components/LegacyBaseTemplate.vue
+++ b/aleksis/core/frontend/components/LegacyBaseTemplate.vue
@@ -59,13 +59,14 @@ export default {
       const location = this.$refs.contentIFrame.contentWindow.location;
       const url = new URL(location);
       const path = url.pathname.replace(/^\/django/, "");
+      const pathWithQueryString = path + encodeURI(url.search);
       const routePath =
         path.charAt(path.length - 1) === "/" &&
         this.$route.path.charAt(path.length - 1) !== "/"
           ? this.$route.path + "/"
           : this.$route.path;
       if (path !== routePath) {
-        this.$router.push(path);
+        this.$router.push(pathWithQueryString);
       }
 
       // Show loader if iframe starts to change its content, even if the $route stays the same
@@ -77,13 +78,24 @@ export default {
       const title = this.$refs.contentIFrame.contentWindow.document.title;
       this.$root.$setPageTitle(title);
 
-      // Adapt height of IFrame according to the height of its contents once and listen to resize events
-      this.iFrameHeight =
-        this.$refs.contentIFrame.contentDocument.body.scrollHeight;
-      this.$refs.contentIFrame.contentWindow.onresize = () => {
+      // Adapt height of IFrame according to the height of its contents once and observe height changes
+      if (
+        this.$refs.contentIFrame.contentDocument &&
+        this.$refs.contentIFrame.contentDocument.body
+      ) {
         this.iFrameHeight =
           this.$refs.contentIFrame.contentDocument.body.scrollHeight;
-      };
+        new ResizeObserver(() => {
+          if (
+            this.$refs.contentIFrame &&
+            this.$refs.contentIFrame.contentDocument &&
+            this.$refs.contentIFrame.contentDocument.body
+          ) {
+            this.iFrameHeight =
+              this.$refs.contentIFrame.contentDocument.body.scrollHeight;
+          }
+        }).observe(this.$refs.contentIFrame.contentDocument.body);
+      }
 
       this.$root.contentLoading = false;
     },
@@ -92,6 +104,10 @@ export default {
     $route() {
       // Show loading animation once route changes
       this.$root.contentLoading = true;
+
+      // Scroll to top only when route changes to not affect form submits etc.
+      // A small duration to avoid flashing of the UI
+      this.$vuetify.goTo(0, { duration: 10 });
     },
   },
   name: "LegacyBaseTemplate",
diff --git a/aleksis/core/frontend/components/app/App.vue b/aleksis/core/frontend/components/app/App.vue
index e11725a36e9dc33310750397a68305b3af05c566..b6919fbe8353c305cc88141e0bbcdd095bd4231c 100644
--- a/aleksis/core/frontend/components/app/App.vue
+++ b/aleksis/core/frontend/components/app/App.vue
@@ -45,7 +45,10 @@
         >
           <v-icon>mdi-update</v-icon>
         </v-btn>
-        <div v-if="whoAmI && whoAmI.isAuthenticated" class="d-flex">
+        <div
+          v-if="whoAmI && whoAmI.isAuthenticated && whoAmI.person"
+          class="d-flex"
+        >
           <notification-list v-if="!whoAmI.person.isDummy" />
           <account-menu
             :account-menu="accountMenu"
@@ -97,6 +100,7 @@
               checkPermission($route.meta.permission) ||
               $route.name === 'dashboard'
             "
+            @mounted="routeComponentMounted"
           />
           <error-page
             v-else-if="
@@ -226,6 +230,7 @@ import useRegisterSWMixin from "../../mixins/useRegisterSW";
 import offlineMixin from "../../mixins/offline";
 import menusMixin from "../../mixins/menus";
 import routesMixin from "../../mixins/routes";
+import error404Mixin from "../../mixins/error404";
 
 export default {
   data() {
@@ -250,7 +255,13 @@ export default {
     },
     messages: {
       query: gqlMessages,
-      pollInterval: 1000,
+    },
+  },
+  methods: {
+    routeComponentMounted() {
+      if (!this.$root.isLegacyBaseTemplate) {
+        this.$root.contentLoading = false;
+      }
     },
   },
   watch: {
@@ -272,10 +283,8 @@ export default {
     },
     $route: {
       handler(newRoute) {
-        if (newRoute.matched.length == 0) {
-          this.error404 = true;
-        } else {
-          this.error404 = false;
+        if (this.$apollo.queries.messages) {
+          this.$apollo.queries.messages.refetch();
         }
       },
       immediate: true,
@@ -291,7 +300,13 @@ export default {
     SideNav,
     SnackbarItem,
   },
-  mixins: [useRegisterSWMixin, offlineMixin, menusMixin, routesMixin],
+  mixins: [
+    useRegisterSWMixin,
+    offlineMixin,
+    menusMixin,
+    routesMixin,
+    error404Mixin,
+  ],
 };
 </script>
 
diff --git a/aleksis/core/frontend/components/app/whoAmI.graphql b/aleksis/core/frontend/components/app/whoAmI.graphql
index 12235e0ed7c320f46f0442c23e4a75dbba44c6cd..0b2877bd2cf15b5134c8e70978fb6b2218414e3a 100644
--- a/aleksis/core/frontend/components/app/whoAmI.graphql
+++ b/aleksis/core/frontend/components/app/whoAmI.graphql
@@ -3,6 +3,7 @@ query ($permissions: [String]!) {
     username
     isAuthenticated
     isAnonymous
+    isImpersonate
     person {
       photo {
         url
@@ -10,7 +11,6 @@ query ($permissions: [String]!) {
       fullName
       avatarUrl
       isDummy
-      isImpersonate
     }
     permissions: globalPermissionsByName(permissions: $permissions) {
       name
diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplication.vue b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplication.vue
new file mode 100644
index 0000000000000000000000000000000000000000..73d581937e36ff8f42133c25b73a967bff2ef503
--- /dev/null
+++ b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplication.vue
@@ -0,0 +1,82 @@
+<template>
+  <v-expansion-panel>
+    <v-expansion-panel-header v-slot="{ open }">
+      <div class="d-flex justify-start align-center">
+        <v-avatar
+          x-large
+          v-if="accessToken.application.icon.absoluteUrl"
+          class="mr-4"
+        >
+          <img
+            :src="accessToken.application.icon.absoluteUrl"
+            :alt="accessToken.application.name"
+          />
+        </v-avatar>
+        <v-avatar x-large v-else class="mr-4" color="secondary">
+          <v-icon color="white">mdi-apps</v-icon>
+        </v-avatar>
+        <div class="subtitle-1 font-weight-medium">
+          {{ accessToken.application.name }}
+        </div>
+      </div>
+    </v-expansion-panel-header>
+    <v-expansion-panel-content>
+      <v-list dense class="pa-0">
+        <v-list-item>
+          <v-list-item-content class="body-2">
+            {{
+              $t("oauth.authorized_application.access_since", {
+                date: $d(new Date(accessToken.created), "longNumeric"),
+              })
+            }}
+            ·
+            {{
+              $t("oauth.authorized_application.valid_until", {
+                date: $d(new Date(accessToken.expires), "longNumeric"),
+              })
+            }}
+          </v-list-item-content>
+          <v-list-item-action>
+            <v-btn color="primary" @click="deleteItem(accessToken)">
+              {{ $t("oauth.authorized_application.revoke") }}
+            </v-btn>
+          </v-list-item-action>
+        </v-list-item>
+        <v-list-item v-if="accessToken.scopes && accessToken.scopes.length > 0">
+          <div class="pr-4">
+            <v-list-item-content class="body-2">
+              {{ $t("oauth.authorized_application.has_access_to") }}
+            </v-list-item-content>
+          </div>
+          <v-list dense class="pa-0 flex-grow-1">
+            <div v-for="(scope, idx) in accessToken.scopes" :key="scope.name">
+              <v-list-item>
+                <v-list-item-content class="body-2">
+                  {{ scope.description }}
+                </v-list-item-content>
+              </v-list-item>
+              <v-divider v-if="idx < accessToken.scopes.length - 1" />
+            </div>
+          </v-list>
+        </v-list-item>
+      </v-list>
+    </v-expansion-panel-content>
+  </v-expansion-panel>
+</template>
+
+<script>
+export default {
+  name: "AuthorizedApplication",
+  props: {
+    accessToken: {
+      type: Object,
+      required: true,
+    },
+  },
+  methods: {
+    deleteItem(item) {
+      this.$emit("delete-item", item);
+    },
+  },
+};
+</script>
diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplications.vue b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplications.vue
new file mode 100644
index 0000000000000000000000000000000000000000..bbf35c8e7f3c2f9e71479c03feb86799b3328d7f
--- /dev/null
+++ b/aleksis/core/frontend/components/authorized_oauth_applications/AuthorizedApplications.vue
@@ -0,0 +1,70 @@
+<template>
+  <div>
+    <h1 class="mb-4">{{ $t("oauth.authorized_application.title") }}</h1>
+    <div v-if="$apollo.queries.accessTokens.loading">
+      <v-skeleton-loader type="card"></v-skeleton-loader>
+    </div>
+    <div v-else-if="accessTokens">
+      <v-card class="mb-4">
+        <v-card-title>
+          {{ $t("oauth.authorized_application.subtitle") }}
+        </v-card-title>
+        <v-card-text>
+          {{ $t("oauth.authorized_application.description") }}
+        </v-card-text>
+        <v-expansion-panels flat>
+          <authorized-application
+            v-for="(accessToken, index) in accessTokens"
+            :key="accessToken.id"
+            :access-token="accessToken"
+            @delete-item="openDeleteDialog"
+          />
+        </v-expansion-panels>
+      </v-card>
+    </div>
+    <delete-dialog
+      :item="deleteItem"
+      :gql-mutation="require('./revokeOauthToken.graphql')"
+      :gql-query="require('./accessTokens.graphql')"
+      v-model="deleteDialog"
+    >
+      <template #title>
+        {{ $t("oauth.authorized_application.revoke_question") }}
+      </template>
+      <template #body>
+        <span v-if="deleteItem">{{ deleteItem.application.name }}</span>
+      </template>
+      <template #deleteContent>
+        {{ $t("oauth.authorized_application.revoke") }}
+      </template>
+    </delete-dialog>
+  </div>
+</template>
+
+<script>
+import gqlAccessTokens from "./accessTokens.graphql";
+import AuthorizedApplication from "./AuthorizedApplication.vue";
+import DeleteDialog from "../generic/dialogs/DeleteDialog.vue";
+
+export default {
+  name: "AuthorizedApplications",
+  components: { DeleteDialog, AuthorizedApplication },
+  data() {
+    return {
+      deleteDialog: false,
+      deleteItem: null,
+    };
+  },
+  methods: {
+    openDeleteDialog(item) {
+      this.deleteItem = item;
+      this.deleteDialog = true;
+    },
+  },
+  apollo: {
+    accessTokens: {
+      query: gqlAccessTokens,
+    },
+  },
+};
+</script>
diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/accessTokens.graphql b/aleksis/core/frontend/components/authorized_oauth_applications/accessTokens.graphql
new file mode 100644
index 0000000000000000000000000000000000000000..68ab08b05d479b8149b3772406a81dd0673c3169
--- /dev/null
+++ b/aleksis/core/frontend/components/authorized_oauth_applications/accessTokens.graphql
@@ -0,0 +1,19 @@
+{
+  accessTokens: oauthAccessTokens {
+    id
+    created
+    updated
+    expires
+    scopes {
+      name
+      description
+    }
+    application {
+      id
+      name
+      icon {
+        absoluteUrl
+      }
+    }
+  }
+}
diff --git a/aleksis/core/frontend/components/authorized_oauth_applications/revokeOauthToken.graphql b/aleksis/core/frontend/components/authorized_oauth_applications/revokeOauthToken.graphql
new file mode 100644
index 0000000000000000000000000000000000000000..6b2f8adbde00d9e0e4f3419673324f8962266683
--- /dev/null
+++ b/aleksis/core/frontend/components/authorized_oauth_applications/revokeOauthToken.graphql
@@ -0,0 +1,5 @@
+mutation ($id: ID!) {
+  revokeOauthToken(id: $id) {
+    ok
+  }
+}
diff --git a/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue b/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue
index 5564ae8aa508268fc5ad1145bc14581fd3de08f9..954f745e411f2b5075549227a7cc5d3f16689948 100644
--- a/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue
+++ b/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue
@@ -33,7 +33,7 @@
           </message-box>
         </div>
         <message-box
-          v-if="progress.state === 'ERROR'"
+          v-if="progress.state === 'FAILURE'"
           dense
           type="error"
           transition="slide-x-transition"
@@ -60,13 +60,13 @@
       <v-card-actions
         v-if="
           progress &&
-          (progress.state === 'ERROR' || progress.state === 'SUCCESS')
+          (progress.state === 'FAILURE' || progress.state === 'SUCCESS')
         "
       >
         <back-button :href="progress.meta.backUrl" text />
         <v-spacer />
         <v-btn
-          v-if="progress.meta.additionalButton"
+          v-if="progress.meta.additionalButton && progress.state === 'SUCCESS'"
           :href="progress.meta.additionalButton.url"
           text
           color="primary"
@@ -108,7 +108,7 @@ export default {
   },
   watch: {
     state(newState) {
-      if (newState === "SUCCESS" || newState === "ERROR") {
+      if (newState === "SUCCESS" || newState === "FAILURE") {
         this.$apollo.queries.celeryProgressByTaskId.stopPolling();
         this.$apollo.mutate({
           mutation: gqlCeleryProgressFetched,
diff --git a/aleksis/core/frontend/components/generic/UpdateIndicator.vue b/aleksis/core/frontend/components/generic/UpdateIndicator.vue
new file mode 100644
index 0000000000000000000000000000000000000000..16d5558bf3f75cf99d789f501b8e856038ccc528
--- /dev/null
+++ b/aleksis/core/frontend/components/generic/UpdateIndicator.vue
@@ -0,0 +1,85 @@
+<template>
+  <v-tooltip bottom>
+    <template #activator="{ on, attrs }">
+      <v-btn
+        right
+        icon
+        v-bind="attrs"
+        v-on="on"
+        @click="handleClick"
+        :loading="status === $options.UPDATING"
+      >
+        <v-icon v-if="status !== $options.UPDATING" :color="color">
+          {{ icon }}
+        </v-icon>
+      </v-btn>
+    </template>
+    <span>{{ text }}</span>
+  </v-tooltip>
+</template>
+
+<script>
+export default {
+  ERROR: "ERROR", // Something went wrong
+  SAVED: "SAVED", // Everything alright
+  UPDATING: "UPDATING", // We are sending something to the server
+  CHANGES: "CHANGES", // the user changed something, but it has not been saved yet
+  name: "UpdateIndicator",
+  emits: ["manual-update"],
+  props: {
+    status: {
+      type: String,
+      required: true,
+    },
+  },
+  computed: {
+    text() {
+      switch (this.status) {
+        case this.$options.SAVED:
+          return this.$t("status.saved");
+        case this.$options.UPDATING:
+          return this.$t("status.updating");
+        case this.$options.CHANGES:
+          return this.$t("status.changes");
+        default:
+          return this.$t("status.error");
+      }
+    },
+    color() {
+      switch (this.status) {
+        case this.$options.SAVED:
+          return "success";
+        case this.$options.CHANGES:
+          return "secondary";
+        case this.$options.UPDATING:
+          return "secondary";
+        default:
+          return "error";
+      }
+    },
+    icon() {
+      switch (this.status) {
+        case this.$options.SAVED:
+          return "$success";
+        case this.$options.CHANGES:
+          return "mdi-dots-horizontal";
+        default:
+          return "$warning";
+      }
+    },
+    isAbleToClick() {
+      return (
+        this.status === this.$options.CHANGES ||
+        this.status === this.$options.ERROR
+      );
+    },
+  },
+  methods: {
+    handleClick() {
+      if (this.isAbleToClick) {
+        this.$emit("manual-update");
+      }
+    },
+  },
+};
+</script>
diff --git a/aleksis/core/frontend/components/generic/dialogs/DeleteDialog.vue b/aleksis/core/frontend/components/generic/dialogs/DeleteDialog.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a56e3960cd1ae29e60f966a44ae69adeb0332949
--- /dev/null
+++ b/aleksis/core/frontend/components/generic/dialogs/DeleteDialog.vue
@@ -0,0 +1,136 @@
+<template>
+  <ApolloMutation
+    v-if="dialogOpen"
+    :mutation="gqlMutation"
+    :variables="{ id: item.id }"
+    :update="update"
+    @done="close(true)"
+  >
+    <template #default="{ mutate, loading, error }">
+      <v-dialog v-model="dialogOpen" max-width="500px">
+        <v-card>
+          <v-card-title class="text-h5">
+            <slot name="title">
+              {{ $t("actions.confirm_deletion") }}
+            </slot>
+          </v-card-title>
+          <v-card-text>
+            <slot name="body">
+              <p class="text-body-1">{{ nameOfObject }}</p>
+            </slot>
+          </v-card-text>
+          <v-card-actions>
+            <v-spacer></v-spacer>
+            <v-btn text @click="close(false)" :disabled="loading">
+              <slot name="cancelContent">
+                {{ $t("actions.cancel") }}
+              </slot>
+            </v-btn>
+            <v-btn
+              color="error"
+              text
+              @click="mutate"
+              :loading="loading"
+              :disabled="loading"
+            >
+              <slot name="deleteContent">
+                {{ $t("actions.delete") }}
+              </slot>
+            </v-btn>
+          </v-card-actions>
+        </v-card>
+      </v-dialog>
+      <v-snackbar :value="error !== null">
+        {{ error }}
+
+        <template #action="{ attrs }">
+          <v-btn color="primary" text v-bind="attrs" @click="error = null" icon>
+            <v-icon>$close</v-icon>
+          </v-btn>
+        </template>
+      </v-snackbar>
+    </template>
+  </ApolloMutation>
+</template>
+
+<script>
+export default {
+  name: "DeleteDialog",
+  computed: {
+    nameOfObject() {
+      return this.itemAttribute in this.item || {}
+        ? this.item[this.itemAttribute]
+        : this.item.toString();
+    },
+    dialogOpen: {
+      get() {
+        return this.value;
+      },
+
+      set(val) {
+        this.$emit("input", val);
+      },
+    },
+  },
+  methods: {
+    update(store) {
+      if (!this.gqlQuery) {
+        // There is no GraphQL query to update
+        return;
+      }
+
+      // Read the data from cache for query
+      const storedData = store.readQuery({ query: this.gqlQuery });
+
+      if (!storedData) {
+        // There are no data in the cache yet
+        return;
+      }
+
+      const storedDataKey = Object.keys(storedData)[0];
+
+      // Remove item from stored data
+      const index = storedData[storedDataKey].findIndex(
+        (m) => m.id === this.item.id
+      );
+      storedData[storedDataKey].splice(index, 1);
+
+      // Write data back to the cache
+      store.writeQuery({ query: this.gqlQuery, data: storedData });
+    },
+    close(success) {
+      this.$emit("input", false);
+      if (success) {
+        this.$emit("success");
+      } else {
+        this.$emit("cancel");
+      }
+    },
+  },
+  props: {
+    value: {
+      type: Boolean,
+      required: true,
+    },
+    item: {
+      type: Object,
+      required: false,
+      default: () => ({}),
+    },
+    itemAttribute: {
+      type: String,
+      required: false,
+      default: "name",
+    },
+    gqlMutation: {
+      type: Object,
+      required: true,
+    },
+    gqlQuery: {
+      type: Object,
+      required: false,
+      default: null,
+    },
+  },
+};
+</script>
diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js
index 25df11b343a0708bbb6a1a378cfa1b17ab154749..f59aa8578b59addcb420d6165c6ef1672c669c30 100644
--- a/aleksis/core/frontend/index.js
+++ b/aleksis/core/frontend/index.js
@@ -65,11 +65,25 @@ const app = new Vue({
   render: (h) => h(App),
   data: () => ({
     showCacheAlert: false,
-    contentLoading: false,
+    contentLoading: true,
     offline: false,
     backgroundActive: true,
+    invalidation: false,
     snackbarItems: [],
   }),
+  computed: {
+    matchedComponents() {
+      if (this.$route.matched.length > 0) {
+        return this.$route.matched.map(
+          (route) => route.components.default.name
+        );
+      }
+      return [];
+    },
+    isLegacyBaseTemplate() {
+      return this.matchedComponents.includes("LegacyBaseTemplate");
+    },
+  },
   router,
   i18n,
 });
diff --git a/aleksis/core/frontend/messages/de.json b/aleksis/core/frontend/messages/de.json
index aa1318fe1b0a7062b68b7267305860bf918f7ee8..3fb6c19b89ea2dcdfd80a00c88496c4fabb89271 100644
--- a/aleksis/core/frontend/messages/de.json
+++ b/aleksis/core/frontend/messages/de.json
@@ -73,9 +73,14 @@
   },
   "actions": {
     "back": "Zurück",
+    "cancel": "Abbrechen",
     "close": "Schließen",
+    "confirm_deletion": "Sind Sie sicher, dass sie dieses Objekt löschen wollen?",
+    "delete": "Löschen",
     "edit": "Bearbeiten",
-    "search": "Suchen"
+    "save": "Speichern",
+    "search": "Suchen",
+    "stop_editing": "Bearbeiten beenden"
   },
   "administration": {
     "backend_admin": {
@@ -99,9 +104,9 @@
     "imprint": "Impressum",
     "logo": "Logo",
     "no_permission": "Sie haben nicht die nötigen Berechtigungen, um diese Seite aufzurufen. Bitte loggen Sie sich mit einem anderen Account ein.",
-    "no_permission_message_long": "Sie haben nicht die nötigen Berechtigungen, um diese Seite aufzurufen. Bitte loggen Sie sich mit einem anderen Account ein.",
+    "no_permission_message_long": "Sie haben keine Berichtigung, diese Seite zu sehen. Bitte melden Sie sich mit einem anderen Konto an.",
     "no_permission_message_short": "Keine Berechtigung",
-    "no_permission_redirect_text": "Zum Login gehen",
+    "no_permission_redirect_text": "Zur Anmeldung gehen",
     "person_is_dummy": "Ihr Administratorenkonto ist mit keiner Person verknüpft. Deshalb wurde Ihr Konto mit einer Dummyperson verknüpft.",
     "privacy_policy": "Datenschutzerklärung",
     "user_not_linked_to_person": "Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das bedeutet, dass Sie keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie sich an die Verwaltenden von AlekSIS an Ihrer Schule."
@@ -173,6 +178,17 @@
       "title": "OAuth-Anwendung",
       "title_plural": "OAuth-Anwendungen"
     },
+    "authorized_application": {
+      "access_since": "Zugriff seit {date}",
+      "description": "Die folgenden Drittanbieter-Anwendungen haben Zugriff auf Ihr Konto. Sie können den Zugriff für diejenigen, die Sie nicht mehr brauchen oder denen Sie nicht mehr vertrauen, jederzeit widerrufen.",
+      "has_access_to": "Hat Zugriff auf:",
+      "menu_title": "Drittanbieter-Anwendungen",
+      "revoke": "Zugriff widerrufen",
+      "revoke_question": "Sind Sie sicher, dass Sie den Zugriff für folgende Anwendung widerrufen wollen?",
+      "subtitle": "Drittanbieter-Anwendungen mit Zugriff auf Ihr Konto",
+      "title": "Drittanbieter-Anwendungen",
+      "valid_until": "Gültig bis {date}"
+    },
     "authorized_token": {
       "menu_title": "Autorisierte Anwendungen"
     }
@@ -225,5 +241,11 @@
     "dismiss": "Verwerfen",
     "new_version_available": "Es ist eine neue Version der App verfügbar",
     "update": "Aktualisieren"
+  },
+  "status": {
+    "changes": "Sie haben nicht gespeicherte Änderungen.",
+    "error": "Beim Speichern der letzten Änderungen ist ein Fehler aufgetreten.",
+    "saved": "Alle Änderungen sind gespeichert.",
+    "updating": "Änderungen werden synchronisiert."
   }
 }
diff --git a/aleksis/core/frontend/messages/en.json b/aleksis/core/frontend/messages/en.json
index 3adabc47bc60d1bfca2dfd74b0c4b31591c2ea88..8be55bd566f50295291d61b392fdfc23a63ba2e8 100644
--- a/aleksis/core/frontend/messages/en.json
+++ b/aleksis/core/frontend/messages/en.json
@@ -1,7 +1,6 @@
 {
   "about": {
     "about_aleksis": "About AlekSIS®",
-    "page_title": "About AlekSIS®",
     "about_aleksis_1": "This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and can be used by anyone.",
     "about_aleksis_2": "AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.",
     "free_open_source_licence": "Free/Open Source Licence",
@@ -15,10 +14,11 @@
     "more_information_eupl": "More information about the EUPL",
     "open_source": "Open Source",
     "other_licence": "Other Licence",
+    "page_title": "About AlekSIS®",
     "proprietary": "Proprietary",
+    "show_copyright": "Show copyright",
     "source_code": "Source Code",
-    "website_of_aleksis": "Website of AlekSIS",
-    "show_copyright": "Show copyright"
+    "website_of_aleksis": "Website of AlekSIS"
   },
   "accounts": {
     "change_password": {
@@ -45,37 +45,42 @@
       "menu_title": "Third-party Accounts"
     },
     "two_factor": {
+      "add_authentication_method": "Add Authentication Method",
+      "backup_codes_count": "You have no backup codes remaining.|You have only one backup code remaining.|You have {counter} backup codes remaining.",
+      "backup_codes_description": "If you can't use any of your devices, you can access your account using backup codes.",
+      "backup_codes_title": "Backup Codes",
+      "disable_button": "Disable Two-Factor Authentication",
+      "disable_description": "However we strongly discourage you to do so, you can also disable two-factor authentication for your account.",
+      "disable_title": "Disable Two-Factor Authentication",
+      "enable_button": "Enable Two-Factor Authentication",
+      "enable_description": "Two-factor authentication is not enabled for your account. Enable two-factor authentication for enhanced account security.",
+      "enable_title": "Two-Factor Authentication Currently Disabled",
       "menu_title": "2FA",
-      "title": "Two-Factor Authentication",
-      "primary_device_title": "Primary Authentication Device",
-      "primary_device_description": "While logging in, AlekSIS will ask you to confirm the login with the following device. If this device is not available, you can use a backup device.",
-      "other_devices_title": "Other Authentication Devices",
-      "other_devices_description": "If your primary authentication device is not available during logging in, you can use one of these devices:",
       "methods": {
-        "generator": "You generate one-time codes using a code generator.",
+        "call": "We will call you at your mobile phone and tell you a one-time code.",
         "email": "We will send you one-time codes to your e-mail address.",
+        "generator": "You generate one-time codes using a code generator.",
         "sms": "We will send you one-time codes to your mobile phone number.",
-        "call": "We will call you at your mobile phone and tell you a one-time code.",
         "webauthn": "You use a security key (either as external device or integrated in your personal device).",
         "yubikey": "You use a Yubikey to generate one-time codes."
       },
-      "add_authentication_method": "Add Authentication Method",
-      "backup_codes_title": "Backup Codes",
-      "backup_codes_description": "If you can't use any of your devices, you can access your account using backup codes.",
-      "backup_codes_count": "You have no backup codes remaining.|You have only one backup code remaining.|You have {counter} backup codes remaining.",
-      "disable_title": "Disable Two-Factor Authentication",
-      "disable_description": "However we strongly discourage you to do so, you can also disable two-factor authentication for your account.",
-      "disable_button": "Disable Two-Factor Authentication",
-      "enable_title": "Two-Factor Authentication Currently Disabled",
-      "enable_description": "Two-factor authentication is not enabled for your account. Enable two-factor authentication for enhanced account security.",
-      "enable_button": "Enable Two-Factor Authentication"
+      "other_devices_description": "If your primary authentication device is not available during logging in, you can use one of these devices:",
+      "other_devices_title": "Other Authentication Devices",
+      "primary_device_description": "While logging in, AlekSIS will ask you to confirm the login with the following device. If this device is not available, you can use a backup device.",
+      "primary_device_title": "Primary Authentication Device",
+      "title": "Two-Factor Authentication"
     }
   },
   "actions": {
     "back": "Back",
-    "search": "Search",
+    "cancel": "Cancel",
+    "close": "Close",
+    "confirm_deletion": "Are you sure you want to delete this item?",
+    "delete": "Delete",
     "edit": "Edit",
-    "close": "Close"
+    "save": "Save",
+    "search": "Search",
+    "stop_editing": "Stop editing"
   },
   "administration": {
     "backend_admin": {
@@ -97,13 +102,14 @@
   "base": {
     "about_aleksis": "About AlekSIS® — The Free School Information System",
     "imprint": "Imprint",
-    "person_is_dummy": "Your administrator account is not linked to any person. Therefore, a dummy person has been linked to your account.",
-    "privacy_policy": "Privacy Policy",
-    "user_not_linked_to_person": "Your user account is not linked to a person. This means you cannot access any school-related information. Please contact the managers of AlekSIS at your school.",
+    "logo": "Logo",
+    "no_permission": "",
     "no_permission_message_long": "You have no permission to view this page. Please login with an other account.",
     "no_permission_message_short": "No permission",
     "no_permission_redirect_text": "Go to login",
-    "logo": "Logo"
+    "person_is_dummy": "Your administrator account is not linked to any person. Therefore, a dummy person has been linked to your account.",
+    "privacy_policy": "Privacy Policy",
+    "user_not_linked_to_person": "Your user account is not linked to a person. This means you cannot access any school-related information. Please contact the managers of AlekSIS at your school."
   },
   "celery_progress": {
     "error_message": "The operation couldn't be finished successfully.",
@@ -111,11 +117,6 @@
     "running_tasks": "1 running task | {number} running tasks",
     "success_message": "The operation has been finished successfully."
   },
-  "download_pdf": {
-    "title": "Downloading PDF file ...",
-    "download": "Download",
-    "notice": "If the download does not start automatically, please click the button below."
-  },
   "dashboard": {
     "dashboard_widget": {
       "menu_title": "Dashboard Widgets",
@@ -127,6 +128,14 @@
   "data_check": {
     "menu_title": "Data Checks"
   },
+  "download_pdf": {
+    "download": "Download",
+    "notice": "If the download does not start automatically, please click the button below.",
+    "title": "Downloading PDF file ..."
+  },
+  "graphql": {
+    "snackbar_error_message": "There was an error retrieving the page data. Please try again."
+  },
   "group": {
     "additional_field": {
       "menu_title": "Additional Fields",
@@ -140,9 +149,9 @@
     },
     "groups_and_child_groups": "Groups and Child Groups",
     "menu_title": "Groups",
+    "ownership": "Group ownership",
     "title": "Group",
-    "title_plural": "Groups",
-    "ownership": "Group ownership"
+    "title_plural": "Groups"
   },
   "ical_feed": {
     "menu_title": "Calendar Feeds"
@@ -150,6 +159,13 @@
   "legacy": {
     "unworthy": "The life-form who created this view did not bow to the powers of the almighty Aleksolotl."
   },
+  "network_errors": {
+    "back_to_start": "Back to home page",
+    "error_404": "404",
+    "offline_notification": "You are offline. Some features may not work and some data may not be up to date.",
+    "page_not_found": "The requested page or resource could not be found.",
+    "snackbar_error_message": "A network error occurred. Please try again."
+  },
   "notifications": {
     "mark_as_read": "Mark as read",
     "more_information": "More information",
@@ -162,8 +178,19 @@
       "title": "OAuth Application",
       "title_plural": "OAuth Applications"
     },
+    "authorized_application": {
+      "access_since": "Access since {date}",
+      "description": "The following third-party applications have access to your account. You can revoke access at any time for those you don't need or trust anymore.",
+      "has_access_to": "Has access to:",
+      "menu_title": "Third-party Applications",
+      "revoke": "Revoke Access",
+      "revoke_question": "Are you sure you want to revoke access for this application?",
+      "subtitle": "Third-party Applications With Access to Your Account",
+      "title": "Third-party Applications",
+      "valid_until": "Valid until {date}"
+    },
     "authorized_token": {
-      "menu_title": "Authorized Applications"
+      "menu_title": ""
     }
   },
   "people": "People",
@@ -174,32 +201,32 @@
   },
   "person": {
     "account_menu_title": "Account",
-    "avatar": "Avatar",
     "additional_image": "Additional Image",
-    "no_additional_image": "The person didn't upload an additional Image",
-    "logged_in_as": "Logged in as",
-    "menu_title": "Persons",
-    "page_title": "Person",
-    "title": "Person",
-    "title_plural": "Persons",
-    "mobile": "mobile phone",
-    "home": "home phone",
-    "details": "Contact details",
+    "avatar": "Avatar",
     "children": "Children",
-    "guardians": "Guardians / Parents",
-    "no_persons": "No Persons",
     "delete": "Delete",
+    "details": "Contact details",
+    "guardians": "Guardians / Parents",
+    "home": "home phone",
     "impersonation": {
       "impersonate": "Impersonate",
-      "stop": "Stop Impersonation",
-      "impersonating": "Impersonating"
+      "impersonating": "Impersonating",
+      "stop": "Stop Impersonation"
     },
-    "invite": "Invite"
+    "invite": "Invite",
+    "logged_in_as": "Logged in as",
+    "menu_title": "Persons",
+    "mobile": "mobile phone",
+    "no_additional_image": "The person didn't upload an additional Image",
+    "no_persons": "No Persons",
+    "page_title": "Person",
+    "title": "Person",
+    "title_plural": "Persons"
   },
   "preferences": {
     "person": {
-      "menu_title": "Preferences",
-      "change_preferences": "Preferences"
+      "change_preferences": "Preferences",
+      "menu_title": "Preferences"
     },
     "site": {
       "menu_title": "Configuration"
@@ -210,19 +237,15 @@
     "title": "School Term",
     "title_plural": "School Terms"
   },
-  "network_errors": {
-    "error_404": "404",
-    "page_not_found": "The requested page or resource could not be found.",
-    "back_to_start": "Back to home page",
-    "snackbar_error_message": "A network error occurred. Please try again.",
-    "offline_notification": "You are offline. Some features may not work and some data may not be up to date."
-  },
   "service_worker": {
+    "dismiss": "Dismiss",
     "new_version_available": "A new version of the app is available",
-    "update": "Update",
-    "dismiss": "Dismiss"
+    "update": "Update"
   },
-  "graphql": {
-    "snackbar_error_message": "There was an error retrieving the page data. Please try again."
+  "status": {
+    "changes": "You have unsaved changes.",
+    "error": "There has been an error while saving the latest changes.",
+    "saved": "All changes are saved.",
+    "updating": "Changes are being synced."
   }
 }
diff --git a/aleksis/core/frontend/mixins/aleksis.js b/aleksis/core/frontend/mixins/aleksis.js
index 036e2eac71db6304bba88e2a01c3cfbe33edca51..59204a7f689d6280941ea5f72f2e8e8d591c59b9 100644
--- a/aleksis/core/frontend/mixins/aleksis.js
+++ b/aleksis/core/frontend/mixins/aleksis.js
@@ -20,7 +20,7 @@ const aleksisMixin = {
     },
   },
   mounted() {
-    this.$root.contentLoading = false;
+    this.$emit("mounted");
   },
   beforeDestroy() {
     // Unregister all safely added event listeners as to not leak them
diff --git a/aleksis/core/frontend/mixins/error404.js b/aleksis/core/frontend/mixins/error404.js
new file mode 100644
index 0000000000000000000000000000000000000000..343c2a4341a62447053ec505323c21be99f82066
--- /dev/null
+++ b/aleksis/core/frontend/mixins/error404.js
@@ -0,0 +1,26 @@
+/**
+ * Vue mixin containing code setting error 404 status.
+ *
+ * Only used by main App component, but factored out for readability.
+ */
+
+const error404Mixin = {
+  methods: {
+    set404() {
+      if (this.$route.matched.length === 0) {
+        this.error404 = true;
+        this.$root.contentLoading = false;
+      } else {
+        this.error404 = false;
+      }
+    },
+  },
+  mounted() {
+    this.$router.onReady(this.set404);
+    this.$router.afterEach((to, from) => {
+      this.set404();
+    });
+  },
+};
+
+export default error404Mixin;
diff --git a/aleksis/core/frontend/mixins/menus.js b/aleksis/core/frontend/mixins/menus.js
index ee07678848c93436fc15f4f015b056f7a7728aa1..9ba58bcaa84e72917e3057614fca6058df39af3a 100644
--- a/aleksis/core/frontend/mixins/menus.js
+++ b/aleksis/core/frontend/mixins/menus.js
@@ -55,7 +55,8 @@ const menusMixin = {
             : true) &&
           (route.meta.validators
             ? this.checkValidators(route.meta.validators)
-            : true)
+            : true) &&
+          !route.meta.hide
         ) {
           let menuItem = {
             ...route.meta,
@@ -83,7 +84,8 @@ const menusMixin = {
             : true) &&
           (route.meta.validators
             ? this.checkValidators(route.meta.validators)
-            : true)
+            : true) &&
+          !route.meta.hide
         ) {
           let menuItem = {
             ...route.meta,
diff --git a/aleksis/core/frontend/mixins/routes.js b/aleksis/core/frontend/mixins/routes.js
index 813edd5777e9868680d5a5d9e8e495d70ef35790..9adbdafc7426fcc19174f91266b978471f3a38e9 100644
--- a/aleksis/core/frontend/mixins/routes.js
+++ b/aleksis/core/frontend/mixins/routes.js
@@ -14,7 +14,7 @@ const routesMixin = {
   apollo: {
     dynamicRoutes: {
       query: gqlDynamicRoutes,
-      pollInterval: 60000,
+      pollInterval: 10000,
     },
   },
   watch: {
@@ -38,6 +38,8 @@ const routesMixin = {
                 menuPermission: route.menuPermission,
                 permission: route.routePermission,
                 newTab: route.menuNewTab,
+                dynamic: true,
+                hide: false,
               },
             };
 
@@ -49,6 +51,17 @@ const routesMixin = {
           }
         }
 
+        for (const route of this.$router
+          .getRoutes()
+          .filter((r) => r.meta.dynamic && !r.meta.hide)) {
+          if (
+            !(newDynamicRoutes.map((r) => r.routeName).indexOf(route.name) > -1)
+          ) {
+            let hiddenRoute = { ...route, meta: { ...route.meta, hide: true } };
+            this.$router.addRoute(hiddenRoute);
+          }
+        }
+
         this.getPermissionNames();
         this.buildMenus();
       },
diff --git a/aleksis/core/frontend/plugins/aleksis.js b/aleksis/core/frontend/plugins/aleksis.js
index 8c221c6d62953206b501aa7c7d949e808d2e63cd..c35b9127f78f6c26c3e5c052cc5732322f509090 100644
--- a/aleksis/core/frontend/plugins/aleksis.js
+++ b/aleksis/core/frontend/plugins/aleksis.js
@@ -123,15 +123,19 @@ AleksisVue.install = function (Vue) {
   Vue.prototype.$invalidateState = function () {
     console.info("Invalidating application state");
 
+    this.invalidation = true;
+
     this.$apollo
       .getClient()
       .resetStore()
       .then(
-        function () {
+        () => {
           console.info("GraphQL cache cleared");
+          this.invalidation = false;
         },
-        function (error) {
+        (error) => {
           console.error("Could not clear GraphQL cache:", error);
+          this.invalidation = false;
         }
       );
   };
@@ -156,6 +160,12 @@ AleksisVue.install = function (Vue) {
 
     // eslint-disable-next-line no-unused-vars
     this.$router.afterEach((to, from) => {
+      if (vm.isLegacyBaseTemplate) {
+        // Skip resetting loading state for legacy pages
+        // as they are probably not finished with loading yet
+        // LegacyBaseTemplate will reset the loading state later
+        return;
+      }
       vm.contentLoading = false;
     });
 
diff --git a/aleksis/core/frontend/routes.js b/aleksis/core/frontend/routes.js
index 215f4d1485644883eef42f14216735547abb041a..aa84f36c4aa9f634f081edb9338f8f264dc9c2fe 100644
--- a/aleksis/core/frontend/routes.js
+++ b/aleksis/core/frontend/routes.js
@@ -920,14 +920,14 @@ const routes = [
   },
   {
     path: "/oauth/authorized_tokens/",
-    component: () => import("./components/LegacyBaseTemplate.vue"),
-    props: {
-      byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
-    },
+    component: () =>
+      import(
+        "./components/authorized_oauth_applications/AuthorizedApplications.vue"
+      ),
     name: "core.oauth.authorizedTokens",
     meta: {
       inAccountMenu: true,
-      titleKey: "oauth.authorized_token.menu_title",
+      titleKey: "oauth.authorized_application.menu_title",
       icon: "mdi-gesture-tap-hold",
       permission: "core.manage_authorized_tokens_rule",
     },
@@ -1055,6 +1055,14 @@ const routes = [
       titleKey: "about.page_title",
     },
   },
+  {
+    path: "/invitations/accept-invite/:code",
+    component: () => import("./components/LegacyBaseTemplate.vue"),
+    props: {
+      byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+    },
+    name: "invitations.accept_invite",
+  },
 ];
 
 // This imports all known AlekSIS app entrypoints
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po
index fb1798fff0394bf91072242e77249e8c1ec34ba4..7c475008f800e2ab26d51154f5050eb6a6e1dc32 100644
--- a/aleksis/core/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-02-27 13:23+0100\n"
+"POT-Creation-Date: 2023-05-09 18:40+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"
@@ -18,28 +18,32 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+msgid "You have been logged out successfully."
+msgstr ""
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr ""
@@ -98,172 +102,172 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr ""
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr ""
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr ""
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr ""
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr ""
 
@@ -291,658 +295,658 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 msgid "Can view avatar image"
 msgstr ""
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr ""
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 msgid "Help text / description"
 msgstr ""
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 msgid "Can invite persons"
 msgstr ""
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr ""
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr ""
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr ""
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr ""
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 msgid "Additional button title"
 msgstr ""
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 msgid "Additional button URL"
 msgstr ""
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 msgid "Additional button icon"
 msgstr ""
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr ""
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr ""
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr ""
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr ""
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr ""
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr ""
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr ""
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr ""
 
@@ -1154,15 +1158,15 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr ""
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr ""
 
@@ -1174,14 +1178,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1230,7 +1234,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr ""
 
@@ -1544,62 +1548,62 @@ msgstr ""
 msgid "Edit default dashboard"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1821,83 +1825,83 @@ msgstr ""
 msgid "System checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 msgid "Date done"
 msgstr ""
 
@@ -2121,11 +2125,11 @@ msgstr ""
 msgid "Generate invitation code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr ""
 
@@ -2141,7 +2145,6 @@ msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
@@ -2215,43 +2218,19 @@ msgstr ""
 msgid "Disallow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-msgid "No authorized applications."
-msgstr ""
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr ""
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
+msgid "No connection to server."
 msgstr ""
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 
@@ -2369,6 +2348,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr ""
 
@@ -2436,6 +2417,23 @@ msgstr ""
 msgid "Count of objects with new problems"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, python-format
+msgid "Hello %(person)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr ""
@@ -2815,148 +2813,156 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+msgid "Maintenance mode was turned on successfully."
+msgstr ""
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr ""
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
index d5da39be87e2e7b0525ff3adfd98c109acb8efc6..549daede5b7b831b5f13648b3caa45f69e391e1b 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-02-27 13:23+0100\n"
-"PO-Revision-Date: 2023-02-27 12:57+0000\n"
+"POT-Creation-Date: 2023-05-09 18:40+0200\n"
+"PO-Revision-Date: 2023-05-09 18:45+0200\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core/de/>\n"
 "Language: de_DE\n"
@@ -18,28 +18,32 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+msgid "You have been logged out successfully."
+msgstr "Sie wurden erfolgreich abgemeldet."
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr "OpenID-Connect-Scope"
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden."
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr "Vollständige Postanschrift"
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 msgid "Email address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr "Festnetz- und Mobilfunknummer"
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr "Gruppen"
@@ -98,172 +102,187 @@ msgstr "Berechtigung"
 msgid "Content type"
 msgstr "Inhaltstyp"
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr "Benutzer"
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr "Gruppe"
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr "Basisdaten"
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr "Adresse"
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr "Kontaktdaten"
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr "Zusätzliche persönliche Daten"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr "Neuer Benutzer"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr "Neues Benutzerkonto erstellen"
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
-msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen."
+msgstr ""
+"Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen "
+"existierenden Benutzer auswählen."
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr "Dieser Benutzername wird bereits genutzt."
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 msgid "Common data"
 msgstr "Allgemeine Daten"
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "Personen"
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 msgid "Additional data"
 msgstr "Zusätzliche Daten"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr "Foto"
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr "Zeit"
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr "Von wann bis wann soll die Ankündigung angezeigt werden?"
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr "Wer soll die Ankündigung sehen?"
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr "Schreiben Sie ihre Ankündigung:"
 
-#: aleksis/core/forms.py:276
-msgid "You are not allowed to create announcements which are only valid in the past."
-msgstr "Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit gültig sind."
+#: aleksis/core/forms.py:277
+msgid ""
+"You are not allowed to create announcements which are only valid in the past."
+msgstr ""
+"Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit "
+"gültig sind."
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
-msgstr "Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit sein."
+msgstr ""
+"Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit "
+"sein."
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr "Sie benötigen mindestens einen Empfänger."
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr "Einladungscode"
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr "Bitte geben Sie Ihren Einladungscode ein."
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr "Vorname"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr "Nachname"
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr "Eine Person nutzt diese E-Mail-Adresse"
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr "Wer soll die Berechtigung erhalten?"
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr "Auf was?"
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
-msgstr "Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:"
+msgstr ""
+"Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:"
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr "Vergebe die Berechtigung für alle Objekte"
 
-#: aleksis/core/forms.py:494
-msgid "You must select at least one group or person which should get the permission."
-msgstr "Sie müssen mindestens eine Gruppe oder Person auswählen, welche die Berechtigung erhalten soll."
+#: aleksis/core/forms.py:495
+msgid ""
+"You must select at least one group or person which should get the permission."
+msgstr ""
+"Sie müssen mindestens eine Gruppe oder Person auswählen, welche die "
+"Berechtigung erhalten soll."
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
-msgstr "Sie müssen die Berechtigung auf alle Objekte oder für spezifische Objekte vergeben."
+msgstr ""
+"Sie müssen die Berechtigung auf alle Objekte oder für spezifische Objekte "
+"vergeben."
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr "Adressdaten"
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 msgid "Account data"
 msgstr "Kontodaten"
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr "Passwort"
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr "Passwort wiederholen"
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr "Die ausgewählte Aktion existiert nicht."
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
-msgstr "Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte auszuführen."
+msgstr ""
+"Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte "
+"auszuführen."
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr "Keine gültige Auswahl."
 
@@ -291,658 +310,667 @@ msgstr "Kein Backupergebnis gefunden!"
 msgid "Linked school term"
 msgstr "Zugeordnetes Schuljahr"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr "Boolean (Ja/Nein)"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr "Text (eine Zeile)"
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr "Datum und Uhrzeit"
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr "Dezimalzahl"
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr "Ganze Zahl"
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr "IP-Adresse"
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Boolean oder leer (Ja/Nein/weder)"
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr "Text (mehrzeilig)"
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr "URL / Link"
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr "Das Startdatum muss vor dem Enddatum liegen."
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
-msgstr "Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum."
+msgstr ""
+"Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum."
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "Schuljahre"
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr "Person"
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 msgid "Can view address"
 msgstr "Kann Adresse sehen"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "Can view contact details"
 msgstr "Kann Kontaktdetails sehen"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Can view photo"
 msgstr "Kann Foto sehen"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 msgid "Can view avatar image"
 msgstr "Kann Avatar-Bild sehen"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Can view persons groups"
 msgstr "Kann Gruppen einer Person sehen"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 msgid "Can view personal details"
 msgstr "Kann persönliche Daten sehen"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr "weiblich"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr "männlich"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr "andere"
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr "Verknüpfter Benutzer"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr "Zusätzliche Namen"
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr "Straße"
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr "Hausnummer"
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr "Postleitzahl"
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr "Ort"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr "Festnetz"
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr "Handy"
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr "Geburtsdatum"
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 msgid "Place of birth"
 msgstr "Geburtsort"
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr "Geschlecht"
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
-msgid "This is an official photo, used for official documents and for internal use cases."
-msgstr "Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne Zwecke."
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
+msgid ""
+"This is an official photo, used for official documents and for internal use "
+"cases."
+msgstr ""
+"Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne "
+"Zwecke."
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr "Bild/Avatar anzeigen"
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr "Dies ist ein Bild oder ein Avatar für die öffentliche Darstellung."
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr "Erziehungsberechtigte / Eltern"
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr "Primärgruppe"
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr "Beschreibung"
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr "Feldtitel"
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr "Feldtyp"
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr "Pflichtfeld"
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 msgid "Help text / description"
 msgstr "Hilfetext/Beschreibung"
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr "Kann Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 msgid "Can view statistics about group."
 msgstr "Kann Statistiken über Gruppen sehen."
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr "Mitglieder"
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr "Leiter/-innen"
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr "Übergeordnete Gruppen"
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr "Zusätzliche Felder"
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr "Anwendung"
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr "Aktivität"
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr "Aktivitäten"
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr "Absender"
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr "Empfänger"
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr "Link"
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr "Benachrichtigung schicken am"
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr "Gelesen"
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr "Versandt"
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr "Benachrichtigung"
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr "Benachrichtigungen"
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr "Link zur detaillierten Ansicht"
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr "Datum und Uhrzeit des Anzeigestarts"
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr "Anzeigezeitraum"
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr "Ankündigung"
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Ankündigungen"
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr "Widget-Titel"
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr "Widget aktivieren"
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr "Widget ist kaputt"
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr "Größe auf Mobilgeräten"
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 px, 12 Spalten"
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr "Größe auf Tablets"
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr "> 600px, 12 Spalten"
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr "Größe auf Desktopgeräten"
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr "> 992 px, 12 Spalten"
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr "Größe auf großen Desktopgeräten"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 px, 12 Spalten"
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr "Kann Standarddashboard bearbeiten"
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr "Symbol-URL"
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr "Externer-Link-Widget"
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr "Externer-Link-Widgets"
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr "Inhalt"
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr "Statischer-Inhalt-Widget"
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr "Statischer-Inhalt-Widgets"
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr "Reihenfolge"
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr "Teil des Standarddashboards"
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr "Reihenfolge der Dashboard-Widgets"
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr "Reihenfolgen der Dashboard-Widgets"
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr "Menü-ID"
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr "Benutzerdefiniertes Menü"
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr "Benutzerdefinierte Menüs"
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr "Menü"
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr "Benutzerdefiniertes Menüelement"
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr "Benutzerdefinierte Menüelemente"
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr "Titel des Typs"
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 msgid "Group type"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr "Gruppentypen"
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 msgid "Can view system status"
 msgstr "Kann Systemstatus sehen"
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr "Kann Daten verwalten"
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 msgid "Can impersonate"
 msgstr "Kann sich verkleiden"
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr "Kann Suche benutzen"
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr "Kann Konfiguration ändern"
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr "Kann Einstellungen einer Person verändern"
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr "Kann Einstellungen einer Gruppe verändern"
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr "Kann die PDF-Generierung testen"
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 msgid "Can invite persons"
 msgstr "Kann Personen einladen"
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr "Zugehörige Datenprüfungsaufgabe"
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr "Problem gelöst"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr "Benachrichtigung gesendet"
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr "Datenprüfungsergebnis"
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr "Datenprüfungsergebnisse"
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr "Kann Datenprüfungen ausführen"
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr "Kann Datenprüfungsprobleme lösen"
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 msgid "E-Mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr "Leiter"
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr "Datei abgelaufen am"
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr "Generierte HTML-Datei"
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr "Generierte PDF-Datei"
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr "PDF-Dateien"
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr "Task-Ergebnis"
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr "Task-Benutzer"
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr "Zurück-URL"
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr "Fortschritt-Titel"
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr "Fehlernachricht"
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr "Erfolgsnachricht"
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr "URL, auf die bei Erfolg weitergeleitet wird"
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 msgid "Additional button title"
 msgstr "Titel des zusätzlichen Buttons"
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 msgid "Additional button URL"
 msgstr "URL des zusätzlichen Buttons"
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 msgid "Additional button icon"
 msgstr "Symbol des zusätzlichen Buttons"
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr "Ergebnis abgerufen"
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr "Hintergrundaufgabe erfolgreich fertiggestellt"
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr "Die Hintergrundaufgabe '{}' wurde erfolgreich fertiggestellt."
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr "Hintergrundaufgabe fehlgeschlagen"
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr "Die Hintergrundaufgabe '{}' ist fehlgeschlagen."
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr "Hintergrundaufgabe"
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr "Task-Benutzer-Zuordnung"
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr "Task-Benutzer-Zuordnungen"
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 msgid "Additional attributes"
 msgstr "Zusätzliche Attribute"
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr "Erlaubte Scopes, die ein Client anfordern kann"
 
-#: aleksis/core/models.py:1404
-msgid "This image will be shown as icon in the authorization flow. It should be squared."
-msgstr "Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es sollte rechteckig sein."
+#: aleksis/core/models.py:1433
+msgid ""
+"This image will be shown as icon in the authorization flow. It should be "
+"squared."
+msgstr ""
+"Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es "
+"sollte rechteckig sein."
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 msgid "Can view room timetable"
 msgstr "Kann Raum-Stundenplan sehen"
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr "Raum"
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr "Räume"
 
@@ -1055,8 +1083,11 @@ msgid "Automatically create new persons for new users"
 msgstr "Erstelle automatisch neue Personen für neue Benutzer"
 
 #: aleksis/core/preferences.py:256
-msgid "Automatically link existing persons to new users by their e-mail address"
-msgstr "Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer E-Mail-Adresse"
+msgid ""
+"Automatically link existing persons to new users by their e-mail address"
+msgstr ""
+"Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer "
+"E-Mail-Adresse"
 
 #: aleksis/core/preferences.py:267
 msgid "Display name of the school"
@@ -1064,7 +1095,8 @@ msgstr "Sichtbarer Name der Schule"
 
 #: aleksis/core/preferences.py:278
 msgid "Official name of the school, e.g. as given by supervisory authority"
-msgstr "Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist"
+msgstr ""
+"Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist"
 
 #: aleksis/core/preferences.py:286
 msgid "Allow users to change their passwords"
@@ -1123,8 +1155,11 @@ msgid "Fields on person model which are editable by themselves."
 msgstr "Felder des Personen-Models welche von ihnen selbst editierbar sind."
 
 #: aleksis/core/preferences.py:424
-msgid "Editable fields on person model which should trigger a notification on change"
-msgstr "Editierbare Felder des Personen-Models welche eine Benachrichtigung für Änderungen auslösen soll"
+msgid ""
+"Editable fields on person model which should trigger a notification on change"
+msgstr ""
+"Editierbare Felder des Personen-Models welche eine Benachrichtigung für "
+"Änderungen auslösen soll"
 
 #: aleksis/core/preferences.py:438
 msgid "Contact for notification if a person changes their data"
@@ -1148,21 +1183,23 @@ msgstr "Automatisch das Dashboard und seine Widgets aktualisieren"
 
 #: aleksis/core/preferences.py:480
 msgid "Automatically update the dashboard and its widgets sitewide"
-msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen Seite)"
+msgstr ""
+"Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen "
+"Seite)"
 
 #: aleksis/core/preferences.py:490
 msgid "Country for phone number parsing"
 msgstr "Land für das Einlesen von Telefonnummern"
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr "Englisch"
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr "Deutsch"
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr "Ukrainisch"
 
@@ -1174,14 +1211,14 @@ msgid "Edit"
 msgstr "Bearbeiten"
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr "Aktionen"
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1205,12 +1242,14 @@ msgstr ""
 #: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
-"            If you think this is an error in AlekSIS, please contact your site\n"
+"            If you think this is an error in AlekSIS, please contact your "
+"site\n"
 "            administrators:\n"
 "          "
 msgstr ""
 "\n"
-"            Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n"
+"            Wenn Sie der Meinung sind, dass es sich um einen Fehler in "
+"AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n"
 "     Systemadministratoren:\n"
 "          "
 
@@ -1222,7 +1261,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Wenn Sie über einen Link auf einer externen Seite hierher gelangt sind,\n"
+"            Wenn Sie über einen Link auf einer externen Seite hierher "
+"gelangt sind,\n"
 "      ist es möglich, dass dieser veraltet war.\n"
 "          "
 
@@ -1237,16 +1277,18 @@ msgstr ""
 #: aleksis/core/templates/500.html:13
 msgid ""
 "\n"
-"            Your site administrators will automatically be notified about this\n"
+"            Your site administrators will automatically be notified about "
+"this\n"
 "            error. You can also contact them directly:\n"
 "          "
 msgstr ""
 "\n"
-"            Ihre Administratoren werden automatisch über diesen Fehler informiert.\n"
+"            Ihre Administratoren werden automatisch über diesen Fehler "
+"informiert.\n"
 "      Sie können diese auch direkt kontaktieren:\n"
 "          "
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr "Wiederholen"
 
@@ -1288,13 +1330,21 @@ msgstr "Bestätigen"
 
 #: aleksis/core/templates/account/email_confirm.html:12
 #, python-format
-msgid "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail address for user %(user_display)s."
-msgstr "Bitte bestätigen Sie, dass <a href=\"mailto:%(email)s\">%(email)s</a> eine E-Mail-Adresse für den Benutzer %(user_display)s ist."
+msgid ""
+"Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail "
+"address for user %(user_display)s."
+msgstr ""
+"Bitte bestätigen Sie, dass <a href=\"mailto:%(email)s\">%(email)s</a> eine E-"
+"Mail-Adresse für den Benutzer %(user_display)s ist."
 
 #: aleksis/core/templates/account/email_confirm.html:25
 #, python-format
-msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>."
-msgstr "Dieser E-Mail-Bestätigungslink ist abgelaufen oder nicht gültig. Bitte <a href=\"%(email_url)s\">fragen Sie eine neue E-Mail-Bestätigung an</a>."
+msgid ""
+"This e-mail confirmation link expired or is invalid. Please <a "
+"href=\"%(email_url)s\">issue a new e-mail confirmation request</a>."
+msgstr ""
+"Dieser E-Mail-Bestätigungslink ist abgelaufen oder nicht gültig. Bitte <a "
+"href=\"%(email_url)s\">fragen Sie eine neue E-Mail-Bestätigung an</a>."
 
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
@@ -1309,7 +1359,9 @@ msgstr "Passwort ändern"
 
 #: aleksis/core/templates/account/password_change.html:12
 msgid "Forgot your current password? Click here to reset it:"
-msgstr "Haben Sie Ihr aktuelles Passwort vergessen? Klicken Sie hier, um es zurückzusetzen:"
+msgstr ""
+"Haben Sie Ihr aktuelles Passwort vergessen? Klicken Sie hier, um es "
+"zurückzusetzen:"
 
 #: aleksis/core/templates/account/password_change.html:12
 msgid "Forgot Password?"
@@ -1328,11 +1380,13 @@ msgstr "Passwortänderung deaktiviert."
 msgid ""
 "\n"
 "            Users are not allowed to edit their own passwords. If you think\n"
-"            this is an error please contact one of your site administrators.\n"
+"            this is an error please contact one of your site "
+"administrators.\n"
 "          "
 msgstr ""
 "\n"
-"            Benutzer dürfen ihre eigenen Passwörter nicht ändern. Wenn Sie denken, \n"
+"            Benutzer dürfen ihre eigenen Passwörter nicht ändern. Wenn Sie "
+"denken, \n"
 "dass dies ein Fehler ist, kontaktieren Sie bitte einen der Administratoren:\n"
 "          "
 
@@ -1347,8 +1401,12 @@ msgid "Reset password"
 msgstr "Passwort zurücksetzen"
 
 #: aleksis/core/templates/account/password_reset.html:17
-msgid "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it."
-msgstr "Passwort vergessen? Geben Sie Ihre E-Mail-Adresse hier ein und wir werden Ihnen eine E-Mail zum Zurücksetzen des Passwortes schicken."
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll send you "
+"an e-mail allowing you to reset it."
+msgstr ""
+"Passwort vergessen? Geben Sie Ihre E-Mail-Adresse hier ein und wir werden "
+"Ihnen eine E-Mail zum Zurücksetzen des Passwortes schicken."
 
 #: aleksis/core/templates/account/password_reset.html:30
 msgid ""
@@ -1371,7 +1429,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Wir haben Ihnen eine E-Mail gesendet. Bitte kontaktieren Sie einen der Administratoren,\n"
+"            Wir haben Ihnen eine E-Mail gesendet. Bitte kontaktieren Sie "
+"einen der Administratoren,\n"
 "wenn Sie diese nicht innerhalb weniger Minuten erhalten.\n"
 "          "
 
@@ -1383,12 +1442,16 @@ msgstr "Ungültiges Token"
 #, python-format
 msgid ""
 "\n"
-"              The password reset link was invalid, possibly because it has already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n"
+"              The password reset link was invalid, possibly because it has "
+"already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n"
 "              class=\"blue-text text-lighten-2\">new password reset</a>.\n"
 "            "
 msgstr ""
 "\n"
-"              Der Link zum Zurücksetzen des Passwortes war falsch, wahrscheinlich, weil er bereits benutzt wurde. Bitte starten Sie eine neue Anfrage <a href=\"%(passwd_reset_url)s\"              class=\"blue-text text-lighten-2\">zum Zurücksetzen des Passwortes</a>.\n"
+"              Der Link zum Zurücksetzen des Passwortes war falsch, "
+"wahrscheinlich, weil er bereits benutzt wurde. Bitte starten Sie eine neue "
+"Anfrage <a href=\"%(passwd_reset_url)s\"              class=\"blue-text text-"
+"lighten-2\">zum Zurücksetzen des Passwortes</a>.\n"
 "            "
 
 #: aleksis/core/templates/account/password_reset_from_key.html:25
@@ -1437,8 +1500,11 @@ msgstr "Registrierung"
 
 #: aleksis/core/templates/account/signup.html:12
 #, python-format
-msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
-msgstr "Haben Sie bereits ein Konto? Dann <a href=\"%(login_url)s\">melden Sie sich bitte an</a>."
+msgid ""
+"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
+msgstr ""
+"Haben Sie bereits ein Konto? Dann <a href=\"%(login_url)s\">melden Sie sich "
+"bitte an</a>."
 
 #: aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
@@ -1462,7 +1528,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Die Registrierung ist aktuell geschlossen. Wenn Sie denken, dass dies ein Fehler ist,\n"
+"            Die Registrierung ist aktuell geschlossen. Wenn Sie denken, dass "
+"dies ein Fehler ist,\n"
 " kontaktieren Sie bitte einen Ihrer Systemadministratoren.\n"
 "          "
 
@@ -1482,13 +1549,17 @@ msgstr "Verifizieren Sie Ihre E-Mail!"
 #: aleksis/core/templates/account/verification_sent.html:16
 msgid ""
 "\n"
-"            This part of the site requires us to verify that you are who you claim to be.\n"
-"            For this purpose, we require that you verify ownership of your e-mail address.\n"
+"            This part of the site requires us to verify that you are who you "
+"claim to be.\n"
+"            For this purpose, we require that you verify ownership of your e-"
+"mail address.\n"
 "          "
 msgstr ""
 "\n"
-"            Dieser Teil der Anwendung setzt voraus, dass wir verifizieren, dass Sie die Person sind, die sie vorgeben, zu sein.\n"
-"Zu diesem Zweck setzen wir voraus, dass Sie die Inhaberschaft Ihrer E-Mail-Adresse bestätigen.\n"
+"            Dieser Teil der Anwendung setzt voraus, dass wir verifizieren, "
+"dass Sie die Person sind, die sie vorgeben, zu sein.\n"
+"Zu diesem Zweck setzen wir voraus, dass Sie die Inhaberschaft Ihrer E-Mail-"
+"Adresse bestätigen.\n"
 "          "
 
 #: aleksis/core/templates/account/verification_sent.html:22
@@ -1502,7 +1573,8 @@ msgstr ""
 "\n"
 "            Wir haben Ihnen eine E-Mail zur Verifizierung geschickt.\n"
 "Bitte klicken Sie auf den Link in dieser E-Mail.\n"
-"Bitte kontaktieren Sie uns, wenn Sie diese nicht binnen weniger Minuten erhalten.\n"
+"Bitte kontaktieren Sie uns, wenn Sie diese nicht binnen weniger Minuten "
+"erhalten.\n"
 "          "
 
 #: aleksis/core/templates/core/additional_field/edit.html:6
@@ -1571,7 +1643,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Es ist ein Problem dabei aufgetreten, das Widget \"%(title)s\" zu laden.\n"
+"            Es ist ein Problem dabei aufgetreten, das Widget \"%(title)s\" "
+"zu laden.\n"
 "Sie brauchen nichts weiter machen.\n"
 "          "
 
@@ -1601,20 +1674,20 @@ msgstr "%(name)s erstellen"
 msgid "Edit default dashboard"
 msgstr "Standard-Dashboard bearbeiten"
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr "Datenprüfungen"
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr "Daten erneut prüfen"
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr "Das System hat einige Problemen mit Ihren Daten gefunden."
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
@@ -1622,43 +1695,43 @@ msgstr ""
 "Bitte gehen Sie alle Daten durch und prüfen Sie, ob weitere Aktionen\n"
 "notwendig sind."
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr "Alles ist gut."
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr "Das System hat keine Probleme mit Ihren Daten entdeckt."
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr "Gefundene Probleme"
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr "Betroffenes Objekt"
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr "Entdecktes Problem"
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr "Details anzeigen"
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr "Optionen, das Problem zu lösen"
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr "Objekt anzeigen"
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr "Registrierte Prüfungen"
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1677,29 +1750,42 @@ msgstr "Dashboard bearbeiten"
 #: aleksis/core/templates/core/edit_dashboard.html:24
 msgid ""
 "\n"
-"          On this page you can arrange your personal dashboard. You can drag any items from \"Available widgets\" to \"Your\n"
-"          Dashboard\" or change the order by moving the widgets. After you have finished, please don't forget to click on\n"
+"          On this page you can arrange your personal dashboard. You can drag "
+"any items from \"Available widgets\" to \"Your\n"
+"          Dashboard\" or change the order by moving the widgets. After you "
+"have finished, please don't forget to click on\n"
 "          \"Save\".\n"
 "        "
 msgstr ""
 "\n"
-"          Auf dieser Seite können Sie Ihr persönliches Dashboard zusammenstallen. Sie können beliebige Elemente von den \"Verfügbaren Widgets\" \n"
-"in \"Ihr Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets bewegen. Wenn Sie fertig sind, vergessen Sie bitte nicht, \n"
+"          Auf dieser Seite können Sie Ihr persönliches Dashboard "
+"zusammenstallen. Sie können beliebige Elemente von den \"Verfügbaren "
+"Widgets\" \n"
+"in \"Ihr Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die "
+"Widgets bewegen. Wenn Sie fertig sind, vergessen Sie bitte nicht, \n"
 "auf \"Speichern\" zu drücken.\n"
 "        "
 
 #: aleksis/core/templates/core/edit_dashboard.html:30
 msgid ""
 "\n"
-"          On this page you can arrange the default dashboard which is shown when a user doesn't arrange his own\n"
-"          dashboard. You can drag any items from \"Available widgets\" to \"Default Dashboard\" or change the order\n"
-"          by moving the widgets. After you have finished, please don't forget to click on \"Save\".\n"
+"          On this page you can arrange the default dashboard which is shown "
+"when a user doesn't arrange his own\n"
+"          dashboard. You can drag any items from \"Available widgets\" to "
+"\"Default Dashboard\" or change the order\n"
+"          by moving the widgets. After you have finished, please don't "
+"forget to click on \"Save\".\n"
 "        "
 msgstr ""
 "\n"
-"          Auf dieser Seite können Sie Ihr das Standard-Dashboard zusammenstallen, welches angezeigt wird, wenn ein Benutzer kein eigenes definiert. \n"
-"Sie können beliebige Elemente von den \"Verfügbaren Widgets\" in \"Standard-Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets bewegen. \n"
-"Wenn Sie fertig sind, vergessen Sie bitte nicht, auf \"Speichern\" zu drücken.\n"
+"          Auf dieser Seite können Sie Ihr das Standard-Dashboard "
+"zusammenstallen, welches angezeigt wird, wenn ein Benutzer kein eigenes "
+"definiert. \n"
+"Sie können beliebige Elemente von den \"Verfügbaren Widgets\" in \"Standard-"
+"Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets "
+"bewegen. \n"
+"Wenn Sie fertig sind, vergessen Sie bitte nicht, auf \"Speichern\" zu "
+"drücken.\n"
 "        "
 
 #: aleksis/core/templates/core/edit_dashboard.html:48
@@ -1722,12 +1808,15 @@ msgstr "Kindgruppen zu Gruppen zuordnen"
 #: aleksis/core/templates/core/group/child_groups.html:18
 msgid ""
 "\n"
-"          You can use this to assign child groups to groups. Please use the filters below to select groups you want to\n"
+"          You can use this to assign child groups to groups. Please use the "
+"filters below to select groups you want to\n"
 "          change and click \"Next\".\n"
 "        "
 msgstr ""
 "\n"
-"          Sie können diese Seite verwenden, um Kindgruppen zu Gruppen zuzuordnen. Bitte nutzen Sie die folgenden Filter, um die Gruppen auszuwählen, die Sie \n"
+"          Sie können diese Seite verwenden, um Kindgruppen zu Gruppen "
+"zuzuordnen. Bitte nutzen Sie die folgenden Filter, um die Gruppen "
+"auszuwählen, die Sie \n"
 "          ändern möchten und klicken auf \"Weiter\".\n"
 "        "
 
@@ -1768,14 +1857,18 @@ msgstr "Bitte seien Sie vorsichtig!"
 #: aleksis/core/templates/core/group/child_groups.html:79
 msgid ""
 "\n"
-"            If you click \"Back\" or \"Next\" the current group assignments are not saved.\n"
-"            If you click \"Save\", you will overwrite all existing child group relations for this group with what you\n"
+"            If you click \"Back\" or \"Next\" the current group assignments "
+"are not saved.\n"
+"            If you click \"Save\", you will overwrite all existing child "
+"group relations for this group with what you\n"
 "            selected on this page.\n"
 "          "
 msgstr ""
 "\n"
-"            Wenn Sie auf \"Zurück\" oder \"Weiter\" klicken, werden die aktuellen Gruppenzuordnungen nicht gespeichert.\n"
-"Wenn Sie auf \"Speichern\" klicken, werden alle existierenden Zuordnungen von Kindgruppen für diese Gruppe\n"
+"            Wenn Sie auf \"Zurück\" oder \"Weiter\" klicken, werden die "
+"aktuellen Gruppenzuordnungen nicht gespeichert.\n"
+"Wenn Sie auf \"Speichern\" klicken, werden alle existierenden Zuordnungen "
+"von Kindgruppen für diese Gruppe\n"
 "mit dem überschrieben, was Sie auf dieser Seite ausgewählt haben.\n"
 "          "
 
@@ -1873,13 +1966,16 @@ msgstr "Startseite"
 #: aleksis/core/templates/core/index.html:34
 msgid ""
 "\n"
-"        You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n"
+"        You didn't customise your dashboard so that you see the system "
+"default. Please click on \"Edit dashboard\" to\n"
 "        customise your personal dashboard.\n"
 "      "
 msgstr ""
 "\n"
-"        Sie haben Ihr Dashboard nicht angepasst, sodass Sie das Standard-Dashboard sehen.\n"
-"Bitte klicken Sie auf \"Dashboard bearbeiten\", um Ihr persönliches Dashboard anzupassen.\n"
+"        Sie haben Ihr Dashboard nicht angepasst, sodass Sie das Standard-"
+"Dashboard sehen.\n"
+"Bitte klicken Sie auf \"Dashboard bearbeiten\", um Ihr persönliches "
+"Dashboard anzupassen.\n"
 "      "
 
 #: aleksis/core/templates/core/index.html:44
@@ -1915,92 +2011,98 @@ msgstr "Systemstatus"
 msgid "System checks"
 msgstr "Systemprüfungen"
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr "Wartungsmodus aktiviert"
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the "
+"site.\n"
+"                "
 msgstr ""
 "\n"
-"                Nur Administratoren und Besucher von internen IP-Adressen können die Seite aufrufen.\n"
-"              "
+"                  Nur Administratoren und Besucher von internen IP-Adressen "
+"können die Seite aufrufen.\n"
+"                "
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr "Wartungsmodus deaktiviert"
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr "Jeder kann die Seite aufrufen."
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr "Debug-Modus aktiviert"
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
-"                The web server throws back debug information on errors. Do not use in production!\n"
+"                The web server throws back debug information on errors. Do "
+"not use in production!\n"
 "              "
 msgstr ""
 "\n"
-"                Der Server gibt Debug-Informationen bei Fehlern zurück. Nicht im Produktivbetrieb nutzen!\n"
+"                Der Server gibt Debug-Informationen bei Fehlern zurück. "
+"Nicht im Produktivbetrieb nutzen!\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr "Debug-Modus deaktivert"
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
-"                Debug mode is disabled. Default error pages are displayed on errors.\n"
+"                Debug mode is disabled. Default error pages are displayed on "
+"errors.\n"
 "              "
 msgstr ""
 "\n"
-"                Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden bei Fehlern angezeigt.\n"
+"                Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden "
+"bei Fehlern angezeigt.\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr "Systemprüfungen"
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr "Dienst"
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr "Status"
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr "Dauer"
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr "Sekunden"
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr "Celery Task-Ergebnisse"
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr "Task"
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr "ID"
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 msgid "Date done"
 msgstr "Erledigungszeitpunkt"
 
@@ -2012,11 +2114,13 @@ msgstr "PDF-Generierung testen"
 #: aleksis/core/templates/core/pages/test_pdf.html:14
 msgid ""
 "\n"
-"        This simple view can be used to ensure the correct function of the built-in PDF generation system.\n"
+"        This simple view can be used to ensure the correct function of the "
+"built-in PDF generation system.\n"
 "      "
 msgstr ""
 "\n"
-"        Diese einfache Seite kann genutzt werden, um die korrekte Funktionalität des eingebauten PDF-Generierungssystem zu testen.\n"
+"        Diese einfache Seite kann genutzt werden, um die korrekte "
+"Funktionalität des eingebauten PDF-Generierungssystem zu testen.\n"
 "      "
 
 #: aleksis/core/templates/core/partials/announcements.html:8
@@ -2074,11 +2178,13 @@ msgstr "Unbekannt"
 #: aleksis/core/templates/core/partials/splash_screen.html:11
 msgid ""
 "\n"
-"      This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n"
+"      This webbrowser doesn't support JavaScript, or its execution is "
+"blocked. Please use another browser to continue.\n"
 "    "
 msgstr ""
 "\n"
-"      Dieser Webbrowser unterstützt kein JavaScript oder die Ausführung wurde blockiert. Bitte nutzen Sie einen anderen Browser, um fortzufahren.\n"
+"      Dieser Webbrowser unterstützt kein JavaScript oder die Ausführung "
+"wurde blockiert. Bitte nutzen Sie einen anderen Browser, um fortzufahren.\n"
 "    "
 
 #: aleksis/core/templates/core/partials/splash_screen.html:17
@@ -2088,7 +2194,8 @@ msgid ""
 "    "
 msgstr ""
 "\n"
-"      Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später erneut.\n"
+"      Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später "
+"erneut.\n"
 "    "
 
 #: aleksis/core/templates/core/perms/assign.html:12
@@ -2201,8 +2308,12 @@ msgid "The invite feature is disabled."
 msgstr "Die Einladungsfunktion ist deaktiviert."
 
 #: aleksis/core/templates/invitations/disabled.html:15
-msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
-msgstr "Um sie zu aktivieren, nutzen Sie die Checkbox im Abschnitt \"Authentifikation\" der "
+msgid ""
+"To enable it, switch on the corresponding checkbox in the authentication "
+"section of the "
+msgstr ""
+"Um sie zu aktivieren, nutzen Sie die Checkbox im Abschnitt "
+"\"Authentifikation\" der "
 
 #: aleksis/core/templates/invitations/disabled.html:16
 msgid "site preferences page"
@@ -2246,11 +2357,11 @@ msgstr "Mit E-Mail-Adresse einladen"
 msgid "Generate invitation code"
 msgstr "Einladungscode generieren"
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr "Code generieren"
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr "Einladungen"
 
@@ -2266,7 +2377,6 @@ msgstr "OAuth2-Anwendung registrieren"
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr "Abbrechen"
@@ -2340,49 +2450,28 @@ msgstr "Erlauben"
 msgid "Disallow"
 msgstr "Verbieten"
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr "Zugriff zurückziehen"
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr "Sind Sie sicher, dass Sie den Zugriff für diese Anwendung zurückziehen möchten?"
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr "Zurückziehen"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr "Autorisierte Anwendungen"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-msgid "No authorized applications."
-msgstr "Keine autorisierten Anwendungen."
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr "Netzwerkfehler"
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
-msgstr "Seite nicht offline verfügbar."
+msgid "No connection to server."
+msgstr "Keine Verbindung zum Server."
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please "
+"check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system "
+"administrators:\n"
 "    "
 msgstr ""
 "\n"
-"      Diese Seite ist offline nicht verfügbar. Da Sie vermutliche keine Internetverbindung haben, prüfen Sie, ob Ihr WLAN oder mobile Daten angeschaltet sind, \n"
-"      und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie verbunden sind, kontaktieren Sie bitte die \n"
-"      Systemadministratoren:\n"
+"      Diese Seite ist ohne eine Verbindung zum Server nicht verfügbar. Bitte "
+"prüfen Sie Ihre Internetverbindung und probieren Sie es erneut.\n"
+"      Wenn Sie verbunden sind und der Fehler weiterhin auftritt, "
+"kontaktieren Sie bitte die Systemadministratoren:\n"
 "    "
 
 #: aleksis/core/templates/search/search.html:8
@@ -2417,12 +2506,14 @@ msgstr "Anmeldung über Drittanbieter-Konto fehlgeschlagen."
 #: aleksis/core/templates/socialaccount/authentication_error.html:15
 msgid ""
 "\n"
-"            An error occurred while attempting to login via your third-party account.\n"
+"            An error occurred while attempting to login via your third-party "
+"account.\n"
 "            Please contact one of your site administrators.\n"
 "          "
 msgstr ""
 "\n"
-"            Beim dem Versuch, die Anmeldung über Ihr Drittanbieter-Konto durchzuführen, ist ein Fehler aufgetreten.\n"
+"            Beim dem Versuch, die Anmeldung über Ihr Drittanbieter-Konto "
+"durchzuführen, ist ein Fehler aufgetreten.\n"
 "            Kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n"
 "          "
 
@@ -2437,7 +2528,8 @@ msgstr "Löschen"
 
 #: aleksis/core/templates/socialaccount/connections.html:34
 msgid "You currently have no third-party accounts connected to this account."
-msgstr "Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden."
+msgstr ""
+"Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden."
 
 #: aleksis/core/templates/socialaccount/connections.html:37
 msgid "Add a Third-party Account"
@@ -2446,12 +2538,15 @@ msgstr "Ein Drittanbieter-Konto hinzufügen"
 #: aleksis/core/templates/socialaccount/login.html:12
 #, python-format
 msgid "You are about to connect a new third party account from %(provider)s."
-msgstr "Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden."
+msgstr ""
+"Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden."
 
 #: aleksis/core/templates/socialaccount/login.html:23
 #, python-format
 msgid "You are about to sign in using a third party account from %(provider)s."
-msgstr "Sie sind dabei, sich mit einem Drittanbieterkonto von %(provider)s anzumelden."
+msgstr ""
+"Sie sind dabei, sich mit einem Drittanbieterkonto von %(provider)s "
+"anzumelden."
 
 #: aleksis/core/templates/socialaccount/login.html:28
 msgid "Continue"
@@ -2467,11 +2562,15 @@ msgstr "Login abgebrochen"
 #, python-format
 msgid ""
 "\n"
-"            You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s\">sign in</a>.\n"
+"            You decided to cancel logging in to our site using one of your "
+"existing accounts. If this was a mistake, please proceed to <a "
+"href=\"%(login_url)s\">sign in</a>.\n"
 "          "
 msgstr ""
 "\n"
-"            Sie haben sich entschieden, die Anmeldung mit einem Ihrer bestehenden Konten bei uns abzubrechen. Wenn dies ein Fehler war, <a href=\"%(login_url)s\">fahren Sie bitte mit dem Login fort</a>.\n"
+"            Sie haben sich entschieden, die Anmeldung mit einem Ihrer "
+"bestehenden Konten bei uns abzubrechen. Wenn dies ein Fehler war, <a "
+"href=\"%(login_url)s\">fahren Sie bitte mit dem Login fort</a>.\n"
 "          "
 
 #: aleksis/core/templates/socialaccount/signup.html:12
@@ -2480,7 +2579,8 @@ msgid ""
 "You are about to use your %(provider_name)s account to login to\n"
 "        %(site_name)s. As a final step, please complete the following form:"
 msgstr ""
-"Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung bei %(site_name)s zu nutzen. \n"
+"Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung bei %(site_name)s "
+"zu nutzen. \n"
 "Als ein letzter Schritt vervollständigen Sie bitte das folgende Formular:"
 
 #: aleksis/core/templates/socialaccount/snippets/provider_list.html:12
@@ -2517,6 +2617,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr "Hallo"
 
@@ -2528,7 +2630,8 @@ msgstr "Celery-Task %(task_name)s fehlgeschlagen!"
 #: aleksis/core/templates/templated_email/celery_failure.email:7
 #, python-format
 msgid "the celery task %(task_name)s failed with following information:"
-msgstr "der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:"
+msgstr ""
+"der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:10
 #: aleksis/core/templates/templated_email/celery_failure.email:29
@@ -2558,7 +2661,8 @@ msgid ""
 "    "
 msgstr ""
 "\n"
-"      der Celery-Task  %(task_name)s ist mit folgenden Informationen fehlgeschlagen:\n"
+"      der Celery-Task  %(task_name)s ist mit folgenden Informationen "
+"fehlgeschlagen:\n"
 "    "
 
 #: aleksis/core/templates/templated_email/data_checks.email:3
@@ -2568,21 +2672,25 @@ msgstr "Das System hat einige neue Probleme mit Ihren Daten entdeckt."
 #: aleksis/core/templates/templated_email/data_checks.email:6
 msgid ""
 "the system detected some new problems with your data.\n"
-"Please take some time to inspect them and solve the issues or mark them as ignored."
+"Please take some time to inspect them and solve the issues or mark them as "
+"ignored."
 msgstr ""
 "das System hat einige neue Probleme mit Ihren Daten entdeckt.\n"
-"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder als ignoriert zu markieren."
+"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder "
+"als ignoriert zu markieren."
 
 #: aleksis/core/templates/templated_email/data_checks.email:15
 msgid ""
 "\n"
 "   the system detected some new problems with your data.\n"
-"   Please take some time to inspect them and solve the issues or mark them as ignored.\n"
+"   Please take some time to inspect them and solve the issues or mark them "
+"as ignored.\n"
 "  "
 msgstr ""
 "\n"
 "   das System hat einige neue Probleme mit Ihren Daten entdeckt.\n"
-"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder als ignoriert zu markieren.\n"
+"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder "
+"als ignoriert zu markieren.\n"
 "  "
 
 #: aleksis/core/templates/templated_email/data_checks.email:23
@@ -2593,6 +2701,27 @@ msgstr "Problembeschreibung"
 msgid "Count of objects with new problems"
 msgstr "Anzahl der Objekte mit neuen Problemen"
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr "Einladung zur Registrierung auf %(site)s"
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, python-format
+msgid "Hello %(person)s"
+msgstr "Hallo %(person)s"
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid ""
+"you have been invited to register on %(site)s. If you would like to accept "
+"this invitation, please click on the following link:"
+msgstr ""
+"Sie wurden eingeladen, sich auf %(site)s zu registrieren. Wenn Sie diese "
+"Einladung annehmen möchten, klicken Sie bitte auf folgenden Link:"
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr "Neue Benachrichtigung für"
@@ -2665,16 +2794,21 @@ msgid ""
 "\n"
 "        Backup tokens can be used when your primary and backup\n"
 "        phone numbers aren't available. The backup tokens below can be used\n"
-"        for login verification. If you've used up all your backup tokens, you\n"
-"        can generate a new set of backup tokens. Only the backup tokens shown\n"
+"        for login verification. If you've used up all your backup tokens, "
+"you\n"
+"        can generate a new set of backup tokens. Only the backup tokens "
+"shown\n"
 "        below will be valid.\n"
 "      "
 msgstr ""
 "\n"
 "        Backup-Token können genutzt werden, wenn Ihre primären und Backup-\n"
-"        Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können für\n"
-"        die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-Tokens genutzt haben,\n"
-"        müssen Sie neue generieren. Nur gültige Backup-Tokens werden angezeigt.\n"
+"        Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können "
+"für\n"
+"        die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-"
+"Tokens genutzt haben,\n"
+"        müssen Sie neue generieren. Nur gültige Backup-Tokens werden "
+"angezeigt.\n"
 "      "
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:33
@@ -2724,7 +2858,9 @@ msgstr ""
 
 #: aleksis/core/templates/two_factor/core/login.html:51
 msgid "Please login with your account to use the external application."
-msgstr "Bitte melden Sie sich mit Ihrem Konto an, um die externe Anwendung zu benutzen."
+msgstr ""
+"Bitte melden Sie sich mit Ihrem Konto an, um die externe Anwendung zu "
+"benutzen."
 
 #: aleksis/core/templates/two_factor/core/login.html:58
 msgid "Please login to see this page."
@@ -2733,7 +2869,8 @@ msgstr "Bitte melden Sie sich an, um diese Seite zu sehen."
 #: aleksis/core/templates/two_factor/core/login.html:69
 msgid ""
 "\n"
-"                        We are calling your phone right now, please enter the\n"
+"                        We are calling your phone right now, please enter "
+"the\n"
 "                        digits you hear.\n"
 "                      "
 msgstr ""
@@ -2745,7 +2882,8 @@ msgstr ""
 #: aleksis/core/templates/two_factor/core/login.html:74
 msgid ""
 "\n"
-"                        We sent you a text message, please enter the code we sent.\n"
+"                        We sent you a text message, please enter the code we "
+"sent.\n"
 "                      "
 msgstr ""
 "\n"
@@ -2756,7 +2894,8 @@ msgstr ""
 #: aleksis/core/templates/two_factor/core/login.html:78
 msgid ""
 "\n"
-"                        We sent you an email, please enter the code we sent.\n"
+"                        We sent you an email, please enter the code we "
+"sent.\n"
 "                      "
 msgstr ""
 "\n"
@@ -2767,17 +2906,20 @@ msgstr ""
 #: aleksis/core/templates/two_factor/core/login.html:82
 msgid ""
 "\n"
-"                        Please use your Webauthn-compatible device to authenticate.\n"
+"                        Please use your Webauthn-compatible device to "
+"authenticate.\n"
 "                      "
 msgstr ""
 "\n"
-"                        Bitte nutzen Sie Ihr Webauthn-kompatibles Gerät, um sich zu authentifizieren.\n"
+"                        Bitte nutzen Sie Ihr Webauthn-kompatibles Gerät, um "
+"sich zu authentifizieren.\n"
 "                      "
 
 #: aleksis/core/templates/two_factor/core/login.html:86
 msgid ""
 "\n"
-"                        Please enter the code generated by your code generator.\n"
+"                        Please enter the code generated by your code "
+"generator.\n"
 "                      "
 msgstr ""
 "\n"
@@ -2788,14 +2930,19 @@ msgstr ""
 #: aleksis/core/templates/two_factor/core/login.html:91
 msgid ""
 "\n"
-"                      Use this form for entering backup tokens for logging in.\n"
-"                      These tokens have been generated for you to print and keep safe. Please\n"
-"                      enter one of these backup tokens to login to your account.\n"
+"                      Use this form for entering backup tokens for logging "
+"in.\n"
+"                      These tokens have been generated for you to print and "
+"keep safe. Please\n"
+"                      enter one of these backup tokens to login to your "
+"account.\n"
 "                    "
 msgstr ""
 "\n"
-"                      Nutzen Sie dieses Formular um Ihre Backup-Tokens zum Anmelden einzugeben.\n"
-"                Diese Tokens wurden für Sie generiert, um diese gut aufzubewahren. Bitte\n"
+"                      Nutzen Sie dieses Formular um Ihre Backup-Tokens zum "
+"Anmelden einzugeben.\n"
+"                Diese Tokens wurden für Sie generiert, um diese gut "
+"aufzubewahren. Bitte\n"
 "                geben Sie einen dieser Tokens ein, um sich einzuloggen.\n"
 "                    "
 
@@ -2826,11 +2973,13 @@ msgstr "Zugriff verwehrt"
 #: aleksis/core/templates/two_factor/core/otp_required.html:10
 msgid ""
 "The page you requested enforces users to verify using\n"
-"          two-factor authentication for security reasons. You need to enable this\n"
+"          two-factor authentication for security reasons. You need to enable "
+"this\n"
 "          security feature in order to access this page."
 msgstr ""
 "Die von Ihnen gewünschte Seite erfordert aus Sicherheitsgründen\n"
-"          eine Verifizierung durch Zwei-Faktor-Authentifizierung. Sie müssen diese\n"
+"          eine Verifizierung durch Zwei-Faktor-Authentifizierung. Sie müssen "
+"diese\n"
 "          Sicherheitsfunktion aktivieren, um die Seite aufzurufen."
 
 #: aleksis/core/templates/two_factor/core/otp_required.html:16
@@ -2874,7 +3023,8 @@ msgid ""
 msgstr ""
 "\n"
 "        Sie sind dabei, Ihre Kontosicherheit auf das\n"
-"       nächste Level zu erhöhen. Bitte folgen Sie den Schritten im Assistenten, um eine\n"
+"       nächste Level zu erhöhen. Bitte folgen Sie den Schritten im "
+"Assistenten, um eine\n"
 "       Zwei-Faktor-Authentifizierungs-Methode zu Ihrem Konto hinzuzufügen.\n"
 "      "
 
@@ -2885,19 +3035,22 @@ msgid ""
 "      "
 msgstr ""
 "\n"
-"        Bitte wählen Sie aus, welche Authentifikationsmethode Sie nutzen wollen:\n"
+"        Bitte wählen Sie aus, welche Authentifikationsmethode Sie nutzen "
+"wollen:\n"
 "      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:27
 msgid ""
 "\n"
 "        To start using a code generator, please use your\n"
-"        favourite two-factor authentication (TOTP) app to scan the QR code below.\n"
+"        favourite two-factor authentication (TOTP) app to scan the QR code "
+"below.\n"
 "        Then enter the token generated by the app.\n"
 "      "
 msgstr ""
 "\n"
-"        Um mit dem Code-Generator zu starten, benutzen Sie bitte Ihre favorisierte\n"
+"        Um mit dem Code-Generator zu starten, benutzen Sie bitte Ihre "
+"favorisierte\n"
 "App für Zwei-Faktor-Authentifizierung (TOTP), um diesen QR-Code zu scannen.\n"
 "Dann geben Sie den in der App angezeigten Code ein:\n"
 "      "
@@ -2911,7 +3064,8 @@ msgid ""
 msgstr ""
 "\n"
 "        Bitte geben Sie die Telefonnummer des Gerätes an,\n"
-"        an die die SMS-Nachrichten geschickt werden sollen. Diese Nummer wird im nächsten Schritt überprüft.\n"
+"        an die die SMS-Nachrichten geschickt werden sollen. Diese Nummer "
+"wird im nächsten Schritt überprüft.\n"
 "      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:45
@@ -2933,17 +3087,20 @@ msgid ""
 "      "
 msgstr ""
 "\n"
-"        Wir haben Ihnen eine E-Mail geschickt, bitte geben Sie den Code ein, den wir geschickt haben.\n"
+"        Wir haben Ihnen eine E-Mail geschickt, bitte geben Sie den Code ein, "
+"den wir geschickt haben.\n"
 "      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:60
 msgid ""
 "\n"
-"            We are calling your phone right now, please enter the digits you hear.\n"
+"            We are calling your phone right now, please enter the digits you "
+"hear.\n"
 "          "
 msgstr ""
 "\n"
-"            Wir rufen Ihr Telefon jetzt an, bitte geben Sie die Zahlen ein, die Sie hören.\n"
+"            Wir rufen Ihr Telefon jetzt an, bitte geben Sie die Zahlen ein, "
+"die Sie hören.\n"
 "          "
 
 #: aleksis/core/templates/two_factor/core/setup.html:66
@@ -2953,23 +3110,30 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Wir haben Ihnen eine SMS geschickt, bitte geben Sie den Code ein, den wir geschickt haben.\n"
+"            Wir haben Ihnen eine SMS geschickt, bitte geben Sie den Code "
+"ein, den wir geschickt haben.\n"
 "          "
 
 #: aleksis/core/templates/two_factor/core/setup.html:73
 msgid ""
 "\n"
-"          We've encountered an issue with the selected authentication method. Please\n"
-"          go back and verify that you entered your information correctly, try\n"
-"          again, or use a different authentication method instead. If the issue\n"
+"          We've encountered an issue with the selected authentication "
+"method. Please\n"
+"          go back and verify that you entered your information correctly, "
+"try\n"
+"          again, or use a different authentication method instead. If the "
+"issue\n"
 "          persists, contact the site administrator.\n"
 "        "
 msgstr ""
 "\n"
-"          Mit der ausgewählten Authentifizierungsmethode ist ein Fehler aufgetreten. \n"
-"Bitte gehen Sie zurück und überprüfen, dass Sie die Informationen korrekt eingegeben haben, versuchen Sie es erneut,\n"
+"          Mit der ausgewählten Authentifizierungsmethode ist ein Fehler "
+"aufgetreten. \n"
+"Bitte gehen Sie zurück und überprüfen, dass Sie die Informationen korrekt "
+"eingegeben haben, versuchen Sie es erneut,\n"
 "oder benutzen Sie stattdessen eine andere Authentifizierungsmethode. \n"
-"Wenn der Fehler bestehen bleibt, kontaktieren Sie bitte einen der Administratoren.\n"
+"Wenn der Fehler bestehen bleibt, kontaktieren Sie bitte einen der "
+"Administratoren.\n"
 "        "
 
 #: aleksis/core/templates/two_factor/core/setup.html:83
@@ -2994,11 +3158,13 @@ msgstr "Zwei-Faktor-Authentifizierung erfolgreich aktiviert"
 #: aleksis/core/templates/two_factor/core/setup_complete.html:13
 msgid ""
 "\n"
-"        Congratulations, you've successfully enabled two-factor authentication.\n"
+"        Congratulations, you've successfully enabled two-factor "
+"authentication.\n"
 "      "
 msgstr ""
 "\n"
-"        Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich aktiviert.\n"
+"        Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich "
+"aktiviert.\n"
 "      "
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:22
@@ -3015,14 +3181,17 @@ msgstr "Backup-Codes generieren"
 msgid ""
 "\n"
 "          However, it might happen that you don't have access to\n"
-"          your primary device. To enable account recovery, generate backup codes\n"
+"          your primary device. To enable account recovery, generate backup "
+"codes\n"
 "          or add other authentication methods.\n"
 "        "
 msgstr ""
 "\n"
-"          Es kann passieren, dass Sie keinen Zugriff auf Ihr primäres Gerät haben. \n"
+"          Es kann passieren, dass Sie keinen Zugriff auf Ihr primäres Gerät "
+"haben. \n"
 "Um die Konto-Wiederherstellung zu aktivieren,\n"
-"generieren Sie Backup-Codes oder fügen Sie eine andere Authentifizierungs-Methode hinzu.\n"
+"generieren Sie Backup-Codes oder fügen Sie eine andere Authentifizierungs-"
+"Methode hinzu.\n"
 "        "
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:48
@@ -3035,8 +3204,12 @@ msgid "Disable Two-Factor Authentication"
 msgstr "Zwei-Faktor-Authentifizierung deaktiveren"
 
 #: aleksis/core/templates/two_factor/profile/disable.html:12
-msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?"
-msgstr "Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das verschlechtert Ihre Kontosicherheit. Sind Sie sicher?"
+msgid ""
+"You are about to disable two-factor authentication. This weakens your "
+"account security, are you sure?"
+msgstr ""
+"Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das "
+"verschlechtert Ihre Kontosicherheit. Sind Sie sicher?"
 
 #: aleksis/core/templates/two_factor/profile/disable.html:26
 msgid "Disable"
@@ -3070,152 +3243,190 @@ msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten."
 msgid "Download PDF"
 msgstr "PDF herunterladen"
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr "Das Schuljahr wurde erstellt."
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr "Das Schuljahr wurde gespeichert."
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr "Die Untergruppen wurden gespeichert."
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr "Die Person wurde gespeichert."
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr "Die Gruppe wurde gespeichert."
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+msgid "Maintenance mode was turned on successfully."
+msgstr "Der Wartungsmodus wurde erfolgreich angeschaltet."
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr "Der Wartungsmodus wurde erfolgreich ausgeschaltet."
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr "Die Ankündigung wurde gespeichert."
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr "Ankündigung wurde gelöscht."
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr "Das angeforderte Einstellungsregister existiert nicht"
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr "Die Einstellungen wurde gespeichert."
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr "Die Person wurde gelöscht."
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr "Die Gruppe wurde gelöscht."
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr "Das zusätzliche Feld wurde gespeichert."
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr "Das zusätzliche Feld wurde gelöscht."
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr "Der Gruppentyp wurde gespeichert."
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr "Der Gruppentyp wurde gelöscht."
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr "Fortschritt: Datenprüfungen ausführen"
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr "Datenprüfungen laufen …"
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt."
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen."
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr "Die Lösungsoption \"{solve_option_obj.verbose_name}\" "
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr "Die angeforderte Lösungsoption existiert nicht"
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr "Das Dashboard-Widget wurde gespeichert."
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr "Das Dashboard-Widget wurde erstellt."
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr "Das Dashboard-Widget wurde gelöscht."
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
-msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
+msgstr ""
+"Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
-msgstr "Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}"
+msgstr ""
+"Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}"
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen."
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr "Die globale Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr "Die globale Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1352
-msgid "The third-party account could not be disconnected because it is the only login method available."
-msgstr "Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige verfügbare Anmeldeoption ist."
+#: aleksis/core/views.py:1382
+msgid ""
+"The third-party account could not be disconnected because it is the only "
+"login method available."
+msgstr ""
+"Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige "
+"verfügbare Anmeldeoption ist."
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 
-#: aleksis/core/views.py:1435
-msgid "Person was invited successfully and an email with further instructions has been send to them."
-msgstr "Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren Anweisungen wurde an sie verschickt."
+#: aleksis/core/views.py:1465
+msgid ""
+"Person was invited successfully and an email with further instructions has "
+"been send to them."
+msgstr ""
+"Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren "
+"Anweisungen wurde an sie verschickt."
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr "Person wurde bereits eingeladen."
 
+#~ msgid "Revoke access"
+#~ msgstr "Zugriff zurückziehen"
+
+#~ msgid "Are you sure to revoke the access for this application?"
+#~ msgstr ""
+#~ "Sind Sie sicher, dass Sie den Zugriff für diese Anwendung zurückziehen "
+#~ "möchten?"
+
+#~ msgid "Revoke"
+#~ msgstr "Zurückziehen"
+
+#~ msgid "Authorized applications"
+#~ msgstr "Autorisierte Anwendungen"
+
+#~ msgid "No authorized applications."
+#~ msgstr "Keine autorisierten Anwendungen."
+
+#~ msgid "Page not available offline."
+#~ msgstr "Seite nicht offline verfügbar."
+
 #~ msgid ""
 #~ "The maintenance mode is currently enabled. Please try again\n"
 #~ "          later."
@@ -3225,11 +3436,14 @@ msgstr "Person wurde bereits eingeladen."
 
 #~ msgid ""
 #~ "\n"
-#~ "            This page is currently unavailable. If this error persists, contact your site administrators:\n"
+#~ "            This page is currently unavailable. If this error persists, "
+#~ "contact your site administrators:\n"
 #~ "          "
 #~ msgstr ""
 #~ "\n"
-#~ "            Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler bestehen bleibt, kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n"
+#~ "            Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler "
+#~ "bestehen bleibt, kontaktieren Sie bitte einen Ihrer "
+#~ "Systemadministratoren:\n"
 #~ "          "
 
 #~ msgid ""
@@ -3238,7 +3452,8 @@ msgstr "Person wurde bereits eingeladen."
 #~ "          security."
 #~ msgstr ""
 #~ "Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account aktiviert.\n"
-#~ "          Aktivieren Sie Zwei-Faktor-Authentifizierung für eine verbesserte\n"
+#~ "          Aktivieren Sie Zwei-Faktor-Authentifizierung für eine "
+#~ "verbesserte\n"
 #~ "          Accountsicherheit."
 
 #~ msgid "Add Phone Number"
@@ -3265,7 +3480,8 @@ msgstr "Person wurde bereits eingeladen."
 #~ "        send backup tokens to the phone numbers listed below."
 #~ msgstr ""
 #~ "Wenn Ihre primäre Methode nicht verfügbar ist, sind wir in der Lage,\n"
-#~ "        Backup-Tokens zu den unten aufgelisteten Telefonnummern zu schicken."
+#~ "        Backup-Tokens zu den unten aufgelisteten Telefonnummern zu "
+#~ "schicken."
 
 #~ msgid "Unregister"
 #~ msgstr "Abmelden"
@@ -3306,7 +3522,8 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgstr ""
 #~ "\n"
 #~ "        Wir raten Ihnen jedoch dringend davon ab.\n"
-#~ "        Sie können jedoch auch die Zwei-Faktor-Authentifizierung für Ihr Konto deaktivieren.\n"
+#~ "        Sie können jedoch auch die Zwei-Faktor-Authentifizierung für Ihr "
+#~ "Konto deaktivieren.\n"
 #~ "      "
 
 #~ msgid ""
@@ -3317,8 +3534,10 @@ msgstr "Person wurde bereits eingeladen."
 #~ "      "
 #~ msgstr ""
 #~ "\n"
-#~ "        Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account aktiviert.\n"
-#~ "          Aktivieren Sie Zwei-Faktor-Authentifizierung für eine verbesserte\n"
+#~ "        Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account "
+#~ "aktiviert.\n"
+#~ "          Aktivieren Sie Zwei-Faktor-Authentifizierung für eine "
+#~ "verbesserte\n"
 #~ "          Accountsicherheit.\n"
 #~ "      "
 
@@ -3337,7 +3556,9 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgstr "%(name)s wurde am %(birthday)s geboren"
 
 #~ msgid "You must grant the permission to all objects and/or to some objects."
-#~ msgstr "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte vergeben."
+#~ msgstr ""
+#~ "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte "
+#~ "vergeben."
 
 #~ msgid "Dashboard"
 #~ msgstr "Dashboard"
@@ -3428,8 +3649,14 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgid "ICal Feeds"
 #~ msgstr "iCal-Feeds"
 
-#~ msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
-#~ msgstr "Dies sind URLs für verschiedene Kalender-Feeds im iCal-Format (.ics). Sie können so viele erstellen, wie sie wollen, und in Ihre Kalender-Software importieren."
+#~ msgid ""
+#~ "These are URLs for different Calendar Feeds in the iCal (.ics) format. "
+#~ "You can create as many as you want and import them in your calendar "
+#~ "software."
+#~ msgstr ""
+#~ "Dies sind URLs für verschiedene Kalender-Feeds im iCal-Format (.ics). Sie "
+#~ "können so viele erstellen, wie sie wollen, und in Ihre Kalender-Software "
+#~ "importieren."
 
 #~ msgid "Your iCal URLs"
 #~ msgstr "Deine iCal-URLs"
@@ -3454,24 +3681,30 @@ msgstr "Person wurde bereits eingeladen."
 
 #~ msgid ""
 #~ "\n"
-#~ "              This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n"
-#~ "              to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n"
+#~ "              This platform is powered by AlekSIS®, a web-based school "
+#~ "information system (SIS) which can be used\n"
+#~ "              to manage and/or publish organisational artifacts of "
+#~ "educational institutions. AlekSIS is free software and\n"
 #~ "              can be used by anyone.\n"
 #~ "            "
 #~ msgstr ""
 #~ "\n"
-#~ "              Diese Plattform wird mit AlekSIS®, einem webbasierten Schulinformationssystem (SIS), \n"
-#~ "welches für die Verwaltung und/oder Veröffentlichung von Bildungseinrichtungen verwendet werden kann.\n"
+#~ "              Diese Plattform wird mit AlekSIS®, einem webbasierten "
+#~ "Schulinformationssystem (SIS), \n"
+#~ "welches für die Verwaltung und/oder Veröffentlichung von "
+#~ "Bildungseinrichtungen verwendet werden kann.\n"
 #~ "AlekSIS ist freie Software und kann von jedem benutzt werden.\n"
 #~ "            "
 
 #~ msgid ""
 #~ "\n"
-#~ "              AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n"
+#~ "              AlekSIS® is a registered trademark of the AlekSIS open "
+#~ "source project, represented by Teckids e.V.\n"
 #~ "            "
 #~ msgstr ""
 #~ "\n"
-#~ "              AlekSIS® ist eine eingetragene Wortmarke des Open-Source-Projektes AlekSIS, vertreten durch den Teckids e.V.\n"
+#~ "              AlekSIS® ist eine eingetragene Wortmarke des Open-Source-"
+#~ "Projektes AlekSIS, vertreten durch den Teckids e.V.\n"
 #~ "            "
 
 #~ msgid "Website of AlekSIS"
@@ -3485,14 +3718,18 @@ msgstr "Person wurde bereits eingeladen."
 
 #~ msgid ""
 #~ "\n"
-#~ "              The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n"
-#~ "              information from third-party apps, if installed, refer to the respective components below. The\n"
+#~ "              The core and the official apps of AlekSIS are licenced "
+#~ "under the EUPL, version 1.2 or later. For licence\n"
+#~ "              information from third-party apps, if installed, refer to "
+#~ "the respective components below. The\n"
 #~ "              licences are marked like this:\n"
 #~ "            "
 #~ msgstr ""
 #~ "\n"
-#~ "              Der Core und die offiziellen Apps von AlekSIS sind unter der EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen\n"
-#~ "zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der jeweiligen App weiter unten auf dieser Seite. Die Lizenzen\n"
+#~ "              Der Core und die offiziellen Apps von AlekSIS sind unter "
+#~ "der EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen\n"
+#~ "zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der "
+#~ "jeweiligen App weiter unten auf dieser Seite. Die Lizenzen\n"
 #~ "sind wie folgt markiert:\n"
 #~ "            "
 
@@ -3510,20 +3747,24 @@ msgstr "Person wurde bereits eingeladen."
 
 #~ msgid ""
 #~ "\n"
-#~ "              Without activated JavaScript the progress status can't be updated.\n"
+#~ "              Without activated JavaScript the progress status can't be "
+#~ "updated.\n"
 #~ "            "
 #~ msgstr ""
 #~ "\n"
-#~ "              Ohne aktiviertes JavaScript kann der Fortschritt leider nicht aktualisiert werden.\n"
+#~ "              Ohne aktiviertes JavaScript kann der Fortschritt leider "
+#~ "nicht aktualisiert werden.\n"
 #~ "            "
 
 #~ msgid ""
 #~ "\n"
-#~ "                Only admin and visitors from internal IPs can access thesite.\n"
+#~ "                Only admin and visitors from internal IPs can access "
+#~ "thesite.\n"
 #~ "              "
 #~ msgstr ""
 #~ "\n"
-#~ "                Nur Administratoren und Besucher von internen IP-Adressen können die Seite aufrufen.\n"
+#~ "                Nur Administratoren und Besucher von internen IP-Adressen "
+#~ "können die Seite aufrufen.\n"
 #~ "              "
 
 #~ msgid "Language"
@@ -3534,12 +3775,14 @@ msgstr "Person wurde bereits eingeladen."
 
 #~ msgid ""
 #~ "\n"
-#~ "            Your administrator account is not linked to any person. Therefore,\n"
+#~ "            Your administrator account is not linked to any person. "
+#~ "Therefore,\n"
 #~ "            a dummy person has been linked to your account.\n"
 #~ "          "
 #~ msgstr ""
 #~ "\n"
-#~ "            Ihr Administratorenkonto ist mit keiner Person verknüpft. Deshalb\n"
+#~ "            Ihr Administratorenkonto ist mit keiner Person verknüpft. "
+#~ "Deshalb\n"
 #~ "            wurde Ihr Konto mit einer Dummyperson verknüpft.\n"
 #~ "          "
 
@@ -3551,8 +3794,10 @@ msgstr "Person wurde bereits eingeladen."
 #~ "          "
 #~ msgstr ""
 #~ "\n"
-#~ "            Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das bedeutet, dass Sie\n"
-#~ "        keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie sich an\n"
+#~ "            Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das "
+#~ "bedeutet, dass Sie\n"
+#~ "        keine schulbezogenen Informationen aufrufen können. Bitte wenden "
+#~ "Sie sich an\n"
 #~ "        die Verwaltenden von AlekSIS an Ihrer Schule.\n"
 #~ "          "
 
@@ -3575,21 +3820,27 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgstr "Erfolg!"
 
 #~ msgid "Please return to your application and enter this code:"
-#~ msgstr "Bitte gehen Sie zurück in Ihre Anwendung und geben Sie diesen Code ein:"
+#~ msgstr ""
+#~ "Bitte gehen Sie zurück in Ihre Anwendung und geben Sie diesen Code ein:"
 
 #~ msgid "No internet connection."
 #~ msgstr "Keine Internetverbindung."
 
 #~ msgid ""
 #~ "\n"
-#~ "      There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n"
-#~ "      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
+#~ "      There was an error accessing this page. You probably don't have an "
+#~ "internet connection. Check to see if your WiFi\n"
+#~ "      or mobile data is turned on and try again. If you think you are "
+#~ "connected, please contact the system\n"
 #~ "      administrators:\n"
 #~ "    "
 #~ msgstr ""
 #~ "\n"
-#~ "      Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell haben Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile Daten aktiv sind, \n"
-#~ "      und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie mit dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer \n"
+#~ "      Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell "
+#~ "haben Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile "
+#~ "Daten aktiv sind, \n"
+#~ "      und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie "
+#~ "mit dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer \n"
 #~ "      Systemadministratoren:\n"
 #~ "    "
 
@@ -3685,7 +3936,8 @@ msgstr "Person wurde bereits eingeladen."
 #~ "   <li>ID des Tasks: %(task_id)s</li>\n"
 #~ "   <li>Aufgetretene Exception: %(exception)s</li>\n"
 #~ "   <li>Argumente, mit denen der Task aufgerufen wurde: %(args)s</li>\n"
-#~ "   <li>Keyword-Argumente, mit denen der Task aufgerufen wurde: %(kwargs)s</li>\n"
+#~ "   <li>Keyword-Argumente, mit denen der Task aufgerufen wurde: "
+#~ "%(kwargs)s</li>\n"
 #~ "   <li>Stacktrace: %(traceback)s</li>\n"
 #~ " </ul>\n"
 #~ " "
@@ -3704,8 +3956,12 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgstr "Zustimmungen"
 
 #, python-brace-format
-#~ msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
-#~ msgstr "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen und stimme ihr zu."
+#~ msgid ""
+#~ "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree "
+#~ "with them."
+#~ msgstr ""
+#~ "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen "
+#~ "und stimme ihr zu."
 
 #~ msgid "You must type the same password each time."
 #~ msgstr "Sie müssen zweimal das gleiche Passwort eingeben."
@@ -3714,8 +3970,12 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgstr "Verkleidung"
 
 #, python-format
-#~ msgid "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change your e-mail address</a>"
-#~ msgstr "<strong>Hinweis:</strong> Sie können immer noch <a href=\"%(email_url)s\"> Ihre E-Mail-Adresse ändern</a>"
+#~ msgid ""
+#~ "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change "
+#~ "your e-mail address</a>"
+#~ msgstr ""
+#~ "<strong>Hinweis:</strong> Sie können immer noch <a "
+#~ "href=\"%(email_url)s\"> Ihre E-Mail-Adresse ändern</a>"
 
 #~ msgid "Impress"
 #~ msgstr "Impressum"
@@ -3737,7 +3997,9 @@ msgstr "Person wurde bereits eingeladen."
 
 #, python-format
 #~ msgid "Are you sure to delete the application %(application_name)s?"
-#~ msgstr "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen möchten?"
+#~ msgstr ""
+#~ "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen "
+#~ "möchten?"
 
 #~ msgid "Authorization Grant Type"
 #~ msgstr "Authorization Grant-Typ"
@@ -3762,17 +4024,23 @@ msgstr "Person wurde bereits eingeladen."
 
 #~ msgid ""
 #~ "\n"
-#~ "        You can use this form to assign user accounts to persons. Use the\n"
-#~ "        dropdowns to select existing accounts; use the text fields to create new\n"
-#~ "        accounts on-the-fly. The latter will create a new account with the\n"
+#~ "        You can use this form to assign user accounts to persons. Use "
+#~ "the\n"
+#~ "        dropdowns to select existing accounts; use the text fields to "
+#~ "create new\n"
+#~ "        accounts on-the-fly. The latter will create a new account with "
+#~ "the\n"
 #~ "        entered username and copy all other details from the person.\n"
 #~ "      "
 #~ msgstr ""
 #~ "\n"
-#~ "        Sie können dieses Formular nutzen, um Benutzerkonten Personen zuzuweisen. Nutzen Sie das\n"
-#~ "    Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie das Textfeld, um einen neuen Benutzer zu\n"
+#~ "        Sie können dieses Formular nutzen, um Benutzerkonten Personen "
+#~ "zuzuweisen. Nutzen Sie das\n"
+#~ "    Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen "
+#~ "Sie das Textfeld, um einen neuen Benutzer zu\n"
 #~ "    erstellen. Letzteres erstellt ein neues Benutzerkonto mit dem\n"
-#~ "    eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n"
+#~ "    eingegebenen Benutzernamen und kopiert alle anderen Daten der "
+#~ "Person.\n"
 #~ "      "
 
 #~ msgid "Existing account"
@@ -3798,7 +4066,8 @@ msgstr "Person wurde bereits eingeladen."
 #~ "We sent you a text message, please enter the tokens we\n"
 #~ "              sent."
 #~ msgstr ""
-#~ "Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens ein,\n"
+#~ "Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens "
+#~ "ein,\n"
 #~ "              die wir Ihnen geschickt haben."
 
 #~ msgid "French"
@@ -3807,8 +4076,12 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgid "Norwegian (bokmål)"
 #~ msgstr "Norwegisch (bokmål)"
 
-#~ msgid "The data check has been started. Please note that it may take a while before you are able to fetch the data on this page."
-#~ msgstr "Die Datenüberprüfung wurde gestartet. Bitte beachten Sie, dass es eine Weile dauern kann, bevor Sie auf dieser Seite Ergebnisse abrufen können."
+#~ msgid ""
+#~ "The data check has been started. Please note that it may take a while "
+#~ "before you are able to fetch the data on this page."
+#~ msgstr ""
+#~ "Die Datenüberprüfung wurde gestartet. Bitte beachten Sie, dass es eine "
+#~ "Weile dauern kann, bevor Sie auf dieser Seite Ergebnisse abrufen können."
 
 #~ msgid "The data check has finished."
 #~ msgstr "Die Datenüberprüfung wurde beendet."
@@ -3862,7 +4135,8 @@ msgstr "Person wurde bereits eingeladen."
 #~ "     "
 #~ msgstr ""
 #~ "\n"
-#~ "      Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n"
+#~ "      Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS "
+#~ "handelt, kontaktieren Sie bitte einen Ihrer\n"
 #~ "     Systemadministratoren:\n"
 #~ "     "
 
@@ -3936,7 +4210,9 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgstr "Markdown-Anleitung (Hilfe)"
 
 #~ msgid "You are not allowed to mark notifications from other users as read!"
-#~ msgstr "Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als gelesen zu markieren!"
+#~ msgstr ""
+#~ "Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als "
+#~ "gelesen zu markieren!"
 
 #, fuzzy
 #~ msgid "School name"
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po
index 225b1a398e823d1b3a053bfd39c4ba7130561b07..2b3c3874af650baf3f812cf740ee2a3f1a9af29e 100644
--- a/aleksis/core/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-02-27 13:23+0100\n"
+"POT-Creation-Date: 2023-05-09 18:40+0200\n"
 "PO-Revision-Date: 2021-06-16 12:00+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n"
@@ -18,30 +18,34 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.4\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+msgid "You have been logged out successfully."
+msgstr ""
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 #, fuzzy
 #| msgid "Contact details"
 msgid "Email address"
 msgstr "Détails de contact"
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #, fuzzy
 #| msgid "Group"
@@ -104,184 +108,184 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr "groupe"
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 #, fuzzy
 #| msgid "Contact details"
 msgid "Contact data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 #, fuzzy
 #| msgid "Contact details"
 msgid "Advanced personal data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr "Cet nom est deja en utilisation."
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 #, fuzzy
 #| msgid "Contact details"
 msgid "Common data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 #, fuzzy
 #| msgid "Person"
 msgid "Persons"
 msgstr "Personne"
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr "Prénom"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr "Nom de famille"
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr ""
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr ""
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 #, fuzzy
 #| msgid "Contact details"
 msgid "Account data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr ""
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr ""
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr ""
 
@@ -309,494 +313,494 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 #, fuzzy
 #| msgid "Contact details"
 msgid "Start date"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr "Personne"
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view photo"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view avatar image"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view persons groups"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view personal details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr ""
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 #, fuzzy
 #| msgid "Date of birth"
 msgid "Place of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr "Sexe"
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr "Description"
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 #, fuzzy
 #| msgid "Description"
 msgid "Help text / description"
 msgstr "Description"
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view statistics about group."
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Groupe"
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -804,211 +808,211 @@ msgstr "Groupe"
 msgid "Group types"
 msgstr "Groupe"
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view system status"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can impersonate"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can invite persons"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 #, fuzzy
 #| msgid "Contact details"
 msgid "E-Mail address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 #, fuzzy
 #| msgid "Owners"
 msgid "Owner"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr ""
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr ""
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr ""
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr ""
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional button title"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional button URL"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional button icon"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr ""
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr ""
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr ""
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr ""
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr ""
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr ""
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional attributes"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view room timetable"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr ""
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr ""
 
@@ -1230,15 +1234,15 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr ""
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr ""
 
@@ -1250,14 +1254,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1306,7 +1310,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr ""
 
@@ -1624,64 +1628,64 @@ msgstr "Détails de contact"
 msgid "Edit default dashboard"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 #, fuzzy
 #| msgid "Contact details"
 msgid "Show details"
 msgstr "Détails de contact"
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1907,83 +1911,83 @@ msgstr ""
 msgid "System checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 #, fuzzy
 #| msgid "Date"
 msgid "Date done"
@@ -2215,11 +2219,11 @@ msgstr "Détails de contact"
 msgid "Generate invitation code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr ""
 
@@ -2237,7 +2241,6 @@ msgstr "Détails de contact"
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
@@ -2316,45 +2319,19 @@ msgstr ""
 msgid "Disallow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-#, fuzzy
-#| msgid "Contact details"
-msgid "No authorized applications."
-msgstr "Détails de contact"
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr ""
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
+msgid "No connection to server."
 msgstr ""
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 
@@ -2472,6 +2449,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr ""
 
@@ -2545,6 +2524,23 @@ msgstr "Description"
 msgid "Count of objects with new problems"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, python-format
+msgid "Hello %(person)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr ""
@@ -2925,154 +2921,167 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+msgid "Maintenance mode was turned on successfully."
+msgstr ""
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 #, fuzzy
 #| msgid "This username is already in use."
 msgid "Person was already invited."
 msgstr "Cet nom est deja en utilisation."
 
+#, fuzzy
+#~| msgid "Contact details"
+#~ msgid "No authorized applications."
+#~ msgstr "Détails de contact"
+
 #, fuzzy
 #~| msgid "Contact details"
 #~ msgid "Invite person"
diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po
index eac7e9fda18c24a985b1eabe0c42196bad449502..1b6172ee3bd421884b89c300b56ff44c0edd5683 100644
--- a/aleksis/core/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/core/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: 2023-02-27 13:23+0100\n"
+"POT-Creation-Date: 2023-05-09 18:40+0200\n"
 "PO-Revision-Date: 2020-12-19 12:57+0000\n"
 "Last-Translator: Julian <leuckerj@gmail.com>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n"
@@ -18,34 +18,38 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.3.2\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+msgid "You have been logged out successfully."
+msgstr ""
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Full home postal address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Email address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 #, fuzzy
 #| msgid "Mobile phone"
 msgid "Home and mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr "Greges"
@@ -108,188 +112,188 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr "Grex"
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Create a new account"
 msgstr "Personae et computi"
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr "Anus scolae"
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 #, fuzzy
 #| msgid "Data management"
 msgid "Common data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "personae"
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional data"
 msgstr "addita nomines"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr "Photographia"
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr "dies"
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr "tempus"
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr "Quis nuntium videatne?"
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr "Scribe nuntium:"
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr "Primus nomen"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 #, fuzzy
 #| msgid "E-mail address"
 msgid "A person is using this e-mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 #, fuzzy
 #| msgid "Who should see the announcement?"
 msgid "Who should get the permission?"
 msgstr "Quis nuntium videatne?"
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr ""
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Address data"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 #, fuzzy
 #| msgid "Data management"
 msgid "Account data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr ""
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr ""
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr ""
 
@@ -321,266 +325,266 @@ msgstr ""
 msgid "Linked school term"
 msgstr "Muta anum scolae"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr "Dies et hora"
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 #, fuzzy
 #| msgid "E-mail address"
 msgid "IP address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr "Nomen"
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "ani scolae"
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr "Persona"
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view photo"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view avatar image"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view persons groups"
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can view personal details"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr "femininum"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr "maskulinum"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr ""
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr "Breve nomen"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr "Via"
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr "Numerus domini"
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr "Numerus directorius"
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr "Urbs"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr "Numerus telephoni domi"
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 #, fuzzy
 #| msgid "Date of birth"
 msgid "Place of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr "Genus"
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr "Parentes"
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr "Descriptio"
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 #, fuzzy
 #| msgid "Site description"
 msgid "Help text / description"
 msgstr "Descriptio paginae"
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional field for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional fields for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view statistics about group."
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 #, fuzzy
@@ -588,259 +592,259 @@ msgstr ""
 msgid "Additional fields"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titulus"
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr "Mittens"
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Nota"
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 #, fuzzy
 #| msgid "Notification"
 msgid "Send notification at"
 msgstr "Nuntius"
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipient"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipients"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget Title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget is broken"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Can edit default dashboard"
 msgstr "Forum"
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widgets"
 msgstr "Forum"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 #, fuzzy
 #| msgid "Icon"
 msgid "Icon URL"
 msgstr "Nota"
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget order"
 msgstr "Forum"
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget orders"
 msgstr "Forum"
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Grex"
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -848,215 +852,215 @@ msgstr "Grex"
 msgid "Group types"
 msgstr "Greges"
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 #, fuzzy
 #| msgid "System status"
 msgid "Can view system status"
 msgstr "Status systemae"
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 #, fuzzy
 #| msgid "Data management"
 msgid "Can manage data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can impersonate"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can invite persons"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification sent"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 #, fuzzy
 #| msgid "E-mail address"
 msgid "E-Mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 #, fuzzy
 #| msgid "Icon"
 msgid "Back URL"
 msgstr "Nota"
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr ""
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr ""
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr ""
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional button title"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional button URL"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional button icon"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr ""
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr ""
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr ""
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr ""
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr ""
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr ""
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional attributes"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view room timetable"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr ""
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr ""
 
@@ -1286,15 +1290,15 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr "Britannicus"
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr "Germanus"
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr ""
 
@@ -1306,7 +1310,7 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 #, fuzzy
 #| msgid "Notifications"
@@ -1315,7 +1319,7 @@ msgstr "Nuntii"
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1364,7 +1368,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr ""
 
@@ -1704,66 +1708,66 @@ msgstr "Simulandum aliquem finire"
 msgid "Edit default dashboard"
 msgstr "Forum"
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 #, fuzzy
 #| msgid "System status"
 msgid "Data checks"
 msgstr "Status systemae"
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 #, fuzzy
 #| msgid "System status"
 msgid "Registered checks"
 msgstr "Status systemae"
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1999,87 +2003,87 @@ msgstr "Status systemae"
 msgid "System checks"
 msgstr "Status systemae"
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 #, fuzzy
 #| msgid "System status"
 msgid "System health checks"
 msgstr "Status systemae"
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 #, fuzzy
 #| msgid "System status"
 msgid "Status"
 msgstr "Status systemae"
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 #, fuzzy
 #| msgid "Date"
 msgid "Date done"
@@ -2317,11 +2321,11 @@ msgstr "Inscriptio electronica"
 msgid "Generate invitation code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr ""
 
@@ -2339,7 +2343,6 @@ msgstr "Nuntii"
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
@@ -2424,47 +2427,19 @@ msgstr ""
 msgid "Disallow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-#, fuzzy
-#| msgid "Notifications"
-msgid "Authorized applications"
-msgstr "Nuntii"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-#, fuzzy
-#| msgid "Notifications"
-msgid "No authorized applications."
-msgstr "Nuntii"
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr ""
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
+msgid "No connection to server."
 msgstr ""
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 
@@ -2584,6 +2559,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr ""
 
@@ -2657,6 +2634,23 @@ msgstr "Descriptio paginae"
 msgid "Count of objects with new problems"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, python-format
+msgid "Hello %(person)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 #, fuzzy
 #| msgid "Notification"
@@ -3044,156 +3038,174 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+msgid "Maintenance mode was turned on successfully."
+msgstr ""
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "The additional field has been saved."
 msgstr "addita nomines"
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 #, fuzzy
 #| msgid "System status"
 msgid "Run data checks …"
 msgstr "Status systemae"
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr ""
 
+#, fuzzy
+#~| msgid "Notifications"
+#~ msgid "Authorized applications"
+#~ msgstr "Nuntii"
+
+#, fuzzy
+#~| msgid "Notifications"
+#~ msgid "No authorized applications."
+#~ msgstr "Nuntii"
+
 #~ msgid "Dashboard"
 #~ msgstr "Forum"
 
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
index 7b3dcf5cecf2eb898338532c3ca412d75eda3df5..fb8bc425d974f814c8bf58710d9b1b06d975be5a 100644
--- a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-02-27 13:23+0100\n"
+"POT-Creation-Date: 2023-05-09 18:40+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"
@@ -17,28 +17,32 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+msgid "You have been logged out successfully."
+msgstr ""
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr ""
@@ -97,172 +101,172 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr ""
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr ""
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr ""
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr ""
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr ""
 
@@ -290,658 +294,658 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 msgid "Can view avatar image"
 msgstr ""
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr ""
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 msgid "Help text / description"
 msgstr ""
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 msgid "Can invite persons"
 msgstr ""
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr ""
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr ""
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr ""
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr ""
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 msgid "Additional button title"
 msgstr ""
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 msgid "Additional button URL"
 msgstr ""
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 msgid "Additional button icon"
 msgstr ""
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr ""
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr ""
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr ""
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr ""
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr ""
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr ""
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr ""
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr ""
 
@@ -1153,15 +1157,15 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr ""
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr ""
 
@@ -1173,14 +1177,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1229,7 +1233,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr ""
 
@@ -1543,62 +1547,62 @@ msgstr ""
 msgid "Edit default dashboard"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1820,83 +1824,83 @@ msgstr ""
 msgid "System checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 msgid "Date done"
 msgstr ""
 
@@ -2120,11 +2124,11 @@ msgstr ""
 msgid "Generate invitation code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr ""
 
@@ -2140,7 +2144,6 @@ msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
@@ -2214,43 +2217,19 @@ msgstr ""
 msgid "Disallow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-msgid "No authorized applications."
-msgstr ""
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr ""
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
+msgid "No connection to server."
 msgstr ""
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 
@@ -2368,6 +2347,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr ""
 
@@ -2435,6 +2416,23 @@ msgstr ""
 msgid "Count of objects with new problems"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, python-format
+msgid "Hello %(person)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr ""
@@ -2814,149 +2812,157 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+msgid "Maintenance mode was turned on successfully."
+msgstr ""
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr ""
 
diff --git a/aleksis/core/locale/ru/LC_MESSAGES/django.po b/aleksis/core/locale/ru/LC_MESSAGES/django.po
index bbc0d0554c170e9e0c1954b5076d624da0e2e8e1..ac2e3f0fd5a295ab08281388f545cbe3bfed179b 100644
--- a/aleksis/core/locale/ru/LC_MESSAGES/django.po
+++ b/aleksis/core/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: 2023-02-27 13:23+0100\n"
+"POT-Creation-Date: 2023-05-09 18:40+0200\n"
 "PO-Revision-Date: 2023-02-08 22:40+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-core/ru/>\n"
@@ -18,28 +18,34 @@ msgstr ""
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+#, fuzzy
+#| msgid "The preferences have been saved successfully."
+msgid "You have been logged out successfully."
+msgstr "Свойства сохранены."
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr "Граница действия OpenID Connect"
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr "Имя, фамилия, ссылка на профиль и фото, если есть."
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr "Полный домашний почтовый адрес"
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 msgid "Email address"
 msgstr "Адрес эл.почты"
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr "Домашний и мобильный телефоны"
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr "Группы"
@@ -98,172 +104,172 @@ msgstr "Разрешение"
 msgid "Content type"
 msgstr "Тип содержимого"
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr "Пользователь"
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr "Группа"
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr "Основные данные"
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr "Адрес"
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr "Контактные данные"
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr "Дополнительные личные данные"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr "Новый пользователь"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr "Создать новую учётную запись"
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr "После выбора существующего пользователя создать новый логин нельзя."
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr "Этот логин уже занят."
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr "Учебный год"
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 msgid "Common data"
 msgstr "Общие данные"
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "Люди"
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 msgid "Additional data"
 msgstr "Дополнительные данные"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr "Фото"
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr "Дата"
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr "Время"
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr "С какого и по какое время это объявление должно отображаться?"
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr "Кто должен видеть это объявление?"
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr "Напишите свое объявление:"
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr "Объявления для прошлого Вам создавать не разрешено."
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr "Дата и время начала должны быть до даты и времени окончания."
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr "Нужен хотя бы один получатель."
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr "Код приглашения"
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr "Укажите, пожалуйста, код приглашения."
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr "Имя"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr "Фамилия"
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr "Этот эл.адрес кем-то используется"
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr "Кто должен получить такое разрешение?"
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr "В случае чего?"
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr "Отметьте объекты, к которым будет предоставлен доступ:"
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr "Предоставить доступ ко всем объектам"
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr "Вам нужно выбрать хотя бы одну группу или физлицо, кто получит доступ."
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr "Вы должны предоставить доступ ко всем или к конкретным объектам."
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr "Подробности адреса"
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 msgid "Account data"
 msgstr "Данные учётной записи"
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr "Пароль"
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr "Пароль (ещё раз)"
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr "Выбранное действие не существует."
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr "У Вас нет разрешения на запуск {} на всех выбранных объектах."
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr "Неправильный выбор."
 
@@ -291,658 +297,658 @@ msgstr "Результат резервного копирования не на
 msgid "Linked school term"
 msgstr "Связанный учебный год"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr "Булево (Да/Нет)"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr "Текст (одна строка)"
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr "Дата и время"
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr "Десятичное число"
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr "Адрес эл.почты"
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr "Целое"
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr "IP адрес"
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Булево или пустое (Да/Нет/Ничего)"
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr "Текст (многострочный)"
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr "URL / Ссылка"
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr "Имя"
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr "Дата начала"
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr "Дата окончания"
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr "Дата начала должна быть ранее даты окончания."
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr "На это время или на его часть уже запланирован учебный год."
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "Учебный год"
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr "Физлицо"
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 msgid "Can view address"
 msgstr "Может видеть адрес"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "Can view contact details"
 msgstr "Может видеть контактные данные"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Can view photo"
 msgstr "Может видеть фото"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 msgid "Can view avatar image"
 msgstr "Может видеть аватар"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Can view persons groups"
 msgstr "Может видеть группы лиц"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 msgid "Can view personal details"
 msgstr "Может видеть личные данные"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr "жен"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr "муж"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr "другой"
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr "Связанный пользователь"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr "Дополнительные имена"
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr "Короткое имя"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr "Улица"
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr "Номер дома"
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr "Почтовый индекс"
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr "Город/место"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr "Домашний телефон"
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr "Мобильный телефон"
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr "Дата рождения"
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 msgid "Place of birth"
 msgstr "Место рождения"
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr "Пол"
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr "Это официальное фото, которое используется для документов и внутренних нужд."
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr "Отобразить фото/аватар"
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr "Это фото или аватар для общего отображения."
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr "Опекуны / Родители"
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr "Основная группа"
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr "Описание"
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr "Название поля"
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr "Тип поля"
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr "Необходимое"
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 msgid "Help text / description"
 msgstr "Вспомогательный текст / описание"
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr "Дополнительное поле для групп"
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr "Дополнительные поля для групп"
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr "Может определять дочерние группы в группы"
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 msgid "Can view statistics about group."
 msgstr "Может видеть статистику группы."
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 msgid "Long name"
 msgstr "Длинное имя"
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr "Участники"
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr "Владельцы"
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr "Родительские группы"
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr "Тип группы"
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr "Дополнительные поля"
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Название"
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr "Приложение"
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr "Активность"
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr "Активности"
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr "Отправитель"
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr "Получатель"
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr "Ссылка"
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Иконка"
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr "Отправить уведомление в"
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr "Читать"
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr "Отправлено"
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr "Уведомление"
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr "Уведомления"
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr "Ссылка на подробный обзор"
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr "Дата и время, с которого показывать"
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr "Дата и время, по какое показывать"
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr "Объявление"
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Объявление"
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr "Получатель объявления"
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr "Получатели объявления"
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr "Название виджета"
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr "Активировать виджет"
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr "Виджет поломался"
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr "Размер на мобильных"
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 пикс, 12 столбцов"
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr "Размер на планшетах"
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr "> 600 пикс, 12 столбцов"
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr "Размер на ПК"
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr "> 992 пикс, 12 столбцов"
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr "Размер для больших экранов"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 пикс, 12 столбцов"
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr "Может редактировать типовую/стандартную информпанель"
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr "Виджет информпанели"
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr "Виджеты информпанели"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr "Иконка URL"
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr "Внешняя ссылка на виджет"
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr "Внешние ссылки на виджеты"
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr "Содержимое"
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr "Виджет с постоянным содержимым"
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr "Виджеты с постоянным содержимым"
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr "Виджет информпанели"
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr "Порядок"
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr "Часть типовой информпанели"
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr "Порядок виджета на информпанели"
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr "Порядок виджетов на информпанели"
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr "Меню ID"
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr "Пользовательское меню"
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr "Пользовательские меню"
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr "Меню"
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr "Пункт пользовательского меню"
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr "Пункты пользовательского меню"
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr "Название типа"
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 msgid "Group type"
 msgstr "Тип группы"
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr "Типы групп"
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 msgid "Can view system status"
 msgstr "Может просматривать состояние системы"
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr "Может управлять данными"
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 msgid "Can impersonate"
 msgstr "Может маскироваться"
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr "Может использовать поиск"
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr "Может менять свойства сайта"
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr "Может менять персональные свойства"
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr "Может менять свойства группы"
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr "Может генерировать тестовые PDF"
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 msgid "Can invite persons"
 msgstr "Может приглашать других"
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr "Задание проверки связанных данных"
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr "Проблема решена"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr "Уведомление отправлено"
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr "Результат проверки данных"
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr "Результаты проверки данных"
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr "Может запускать проверки данных"
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr "Может решать проблемы проверки данных"
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 msgid "E-Mail address"
 msgstr "Адрес эл.почты"
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr "Владелец"
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr "Файл действителен до"
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr "Сгенерированный файл HTML"
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr "Сгенерированный файл PDF"
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr "Файл PDF"
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr "Файлы PDF"
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr "Результат задания"
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr "Пользователь задания"
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr "URL для возврата"
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr "Название процесса"
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr "Сообщение об ошибке"
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr "Сообщение об успехе"
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr "URL для перенаправления в случае успеха"
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 msgid "Additional button title"
 msgstr "Название дополнительной кнопки"
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 msgid "Additional button URL"
 msgstr "URL дополнительной кнопки"
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 msgid "Additional button icon"
 msgstr "Иконка дополнительной кнопки"
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr "Полученный результат"
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr "Фоновое задание успешно завершено"
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr "Фоновое задание \"{}\" успешно завершено."
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr "Ошибка фонового задания"
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr "Ошибка фонового задания \"{}\"."
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr "Фоновое задание"
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr "Назначение пользователя задания"
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr "Назначения пользователей задания"
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 msgid "Additional attributes"
 msgstr "Дополнительные атрибуты"
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr "Разрешённые пределы действия, которые могут запрашивать клиенты"
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr "Это изображение будет использоваться в качестве значка во время авторизации. Должно быть квадратным."
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 msgid "Can view room timetable"
 msgstr "Может просмативать расписание комнаты"
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr "Комната"
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr "Комнаты"
 
@@ -1154,15 +1160,15 @@ msgstr "Автоматически обновлять информпанель 
 msgid "Country for phone number parsing"
 msgstr "Страна для парсинга номера телефона"
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr "Английский"
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr "Немецкий"
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr "Украинский"
 
@@ -1174,14 +1180,14 @@ msgid "Edit"
 msgstr "Редактировать"
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr "Действия"
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1246,7 +1252,7 @@ msgstr ""
 "            Вы также можете обратиться к ним непосредственно:\n"
 "          "
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr "Попытаться ещё"
 
@@ -1602,20 +1608,20 @@ msgstr "Создать %(name)s"
 msgid "Edit default dashboard"
 msgstr "Редактировать стандартную информпанель"
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr "Проверки данных"
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr "Проверить данные ещё раз"
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr "Система обнаружила некоторые проблемы с Вашими данными."
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
@@ -1623,43 +1629,43 @@ msgstr ""
 "Пожалуйста, пересмотрите внимательно все данные и проверьте не нужно ли\n"
 "          что-то сделать."
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr "Всё прекрасно."
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr "Система не обнаружила никаких проблем с Вашими данными."
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr "Обнаруженные проблемы"
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr "Зависимые объекты"
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr "Обнаружена проблема"
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr "Подробнее"
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr "Варианты решения проблемы"
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr "Посмотреть объект"
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr "Зарегистрированные проверки"
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1916,33 +1922,38 @@ msgstr "Состояние системы"
 msgid "System checks"
 msgstr "Системные проверки"
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr "Включен режим обслуживания"
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| "                Only admin and visitors from internal IPs can access the site.\n"
+#| "              "
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 "\n"
 "                Доступ к сайту имеют только администратор и пользователи с внутренними IP-адресами.\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr "Режим обслуживания выключен"
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr "Доступ к сайту есть у всех."
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr "Режим отладки включен"
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
@@ -1952,11 +1963,11 @@ msgstr ""
 "                Веб-сервер во время ошибок пишет отладочную информацию. Не используйте в продакшене!\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr "Режим отладки отключен"
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
@@ -1966,42 +1977,42 @@ msgstr ""
 "                Режим отладки отключен. В случае ошибок будут отображаться стандартные страницы об ошибках.\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr "Проверки работы системы"
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr "Служба"
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr "Состояние"
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr "Продолжительность"
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr "сек"
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr "Результаты выполнения Celery"
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr "Задания"
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr "ID"
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 msgid "Date done"
 msgstr "Время завершения"
 
@@ -2250,11 +2261,11 @@ msgstr "Приглашение по эл.почте"
 msgid "Generate invitation code"
 msgstr "Создать код приглашения"
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr "Генерирование кода"
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr "Приглашения"
 
@@ -2270,7 +2281,6 @@ msgstr "Регистрация приложения OAuth2"
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr "Отменить"
@@ -2344,43 +2354,26 @@ msgstr "Разрешить"
 msgid "Disallow"
 msgstr "Запретить"
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr "Отозвать доступ"
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr "Ви действительно хотите отозвать доступ для этого приложения?"
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr "Отозвать"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr "Авторизованные приложения"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-msgid "No authorized applications."
-msgstr "Авторизованных приложений нет."
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr "Ошибка сети"
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
-msgstr "В автономном режиме страница не доступна."
+msgid "No connection to server."
+msgstr ""
 
 #: aleksis/core/templates/offline.html:14
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| "      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
+#| "      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
+#| "      administrators:\n"
+#| "    "
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 "\n"
@@ -2521,6 +2514,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr "Привет"
 
@@ -2597,6 +2592,24 @@ msgstr "Описание проблемы"
 msgid "Count of objects with new problems"
 msgstr "Количество объектов с новыми проблемами"
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, fuzzy, python-format
+#| msgid "Selected persons"
+msgid "Hello %(person)s"
+msgstr "Выбранные физлица"
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr "Новое уведомление для"
@@ -3138,152 +3151,180 @@ msgstr "Во время создания файла PDF возникла про
 msgid "Download PDF"
 msgstr "Скачать PDF"
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr "Учебный год создан."
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr "Учебный год сохранён."
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr "Дочерние группы сохранены."
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr "Физлицо сохранено."
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr "Группа сохранена."
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+#, fuzzy
+#| msgid "The data checks were run successfully."
+msgid "Maintenance mode was turned on successfully."
+msgstr "Проверка данных успешно запущена."
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr "Объявление сохранено."
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr "Объявление удалено."
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr "Журнал с запрошенными свойствами не существует"
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr "Свойства сохранены."
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr "Физлицо удалено."
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr "Группа удалена."
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr "Дополнительное поле сохранено."
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr "Дополнительное поле удалено."
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr "Тип группы сохранён."
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr "Тип группы удалён."
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr "В процессе: Запуск проверки данных"
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr "Запускается проверка данных …"
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr "Проверка данных успешно запущена."
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr "Во время запуска проверки данных возникла проблема."
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr "Вариант решения \"{solve_option_obj.verbose_name}\" "
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr "Запрошенный вариант решения не существует"
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr "Виджет информпанели сохранён."
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr "Виджет информпанели создан."
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr "Виджет информпанели удалён."
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ваша конфигурация информпанели сохранена."
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Конфигурация типовой/стандартной информпанели."
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr "Приглашение успешно создано. Код приглашения: {code}"
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr "Мы успешно назначили доступы."
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr "Глобальный пользовательский доступ удалён."
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr "Глобальный групповой доступ удалён."
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr "Объектный пользовательский доступ удалён."
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr "Объектный групповой доступ удалён."
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr "Учётную запись третьей стороны нельзя отключить, т.к. это единственный способ входа."
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr "Учётная запись третьей стороны успешно отключена."
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr "Владелец указанного эл.адреса успешно приглашён. Инструкции о дальнейших действиях отправлены на эл.почту."
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr "Кто-то уже пригласил его/её."
 
+#~ msgid "Revoke access"
+#~ msgstr "Отозвать доступ"
+
+#~ msgid "Are you sure to revoke the access for this application?"
+#~ msgstr "Ви действительно хотите отозвать доступ для этого приложения?"
+
+#~ msgid "Revoke"
+#~ msgstr "Отозвать"
+
+#~ msgid "Authorized applications"
+#~ msgstr "Авторизованные приложения"
+
+#~ msgid "No authorized applications."
+#~ msgstr "Авторизованных приложений нет."
+
+#~ msgid "Page not available offline."
+#~ msgstr "В автономном режиме страница не доступна."
+
 #~ msgid ""
 #~ "\n"
 #~ "            This page is currently unavailable. If this error persists, contact your site administrators:\n"
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
index 2ceb99c7153d0eb412ca3504ce97224f6b6909fd..1b5c47ccd08980e07aac8228d3be70924eca2ede 100644
--- a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-02-27 13:23+0100\n"
+"POT-Creation-Date: 2023-05-09 18:40+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"
@@ -17,28 +17,32 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+msgid "You have been logged out successfully."
+msgstr ""
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr ""
@@ -97,172 +101,172 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr ""
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr ""
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr ""
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr ""
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr ""
 
@@ -290,658 +294,658 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 msgid "Can view avatar image"
 msgstr ""
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr ""
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 msgid "Help text / description"
 msgstr ""
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 msgid "Can invite persons"
 msgstr ""
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr ""
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr ""
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr ""
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr ""
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 msgid "Additional button title"
 msgstr ""
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 msgid "Additional button URL"
 msgstr ""
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 msgid "Additional button icon"
 msgstr ""
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr ""
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr ""
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr ""
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr ""
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr ""
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr ""
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr ""
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr ""
 
@@ -1153,15 +1157,15 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr ""
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr ""
 
@@ -1173,14 +1177,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1229,7 +1233,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr ""
 
@@ -1543,62 +1547,62 @@ msgstr ""
 msgid "Edit default dashboard"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1820,83 +1824,83 @@ msgstr ""
 msgid "System checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
 "              "
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr ""
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 msgid "Date done"
 msgstr ""
 
@@ -2120,11 +2124,11 @@ msgstr ""
 msgid "Generate invitation code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr ""
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr ""
 
@@ -2140,7 +2144,6 @@ msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
@@ -2214,43 +2217,19 @@ msgstr ""
 msgid "Disallow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-msgid "No authorized applications."
-msgstr ""
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr ""
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
+msgid "No connection to server."
 msgstr ""
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 
@@ -2368,6 +2347,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr ""
 
@@ -2435,6 +2416,23 @@ msgstr ""
 msgid "Count of objects with new problems"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, python-format
+msgid "Hello %(person)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr ""
@@ -2814,148 +2812,156 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+msgid "Maintenance mode was turned on successfully."
+msgstr ""
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr ""
diff --git a/aleksis/core/locale/uk/LC_MESSAGES/django.po b/aleksis/core/locale/uk/LC_MESSAGES/django.po
index 47a3acdd5c56fcab325159574991bae5ef8c6a8a..ee55e2d09212a1cac0e020242e4c95b47d08c531 100644
--- a/aleksis/core/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/uk/LC_MESSAGES/django.po
@@ -18,28 +18,34 @@ msgstr ""
 "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:151
+#, fuzzy
+#| msgid "The preferences have been saved successfully."
+msgid "You have been logged out successfully."
+msgstr "Властивості збережені."
+
+#: aleksis/core/apps.py:161
 msgid "OpenID Connect scope"
 msgstr "Межа дії OpenID Connect"
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:162
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr "Ім'я, прізвище, посилання на профіль та фото, якщо є в наявності."
 
-#: aleksis/core/apps.py:157
+#: aleksis/core/apps.py:163
 msgid "Full home postal address"
 msgstr "Повна домашня поштова адреса"
 
-#: aleksis/core/apps.py:158
+#: aleksis/core/apps.py:164
 msgid "Email address"
 msgstr "Ел.адреса"
 
-#: aleksis/core/apps.py:159
+#: aleksis/core/apps.py:165
 msgid "Home and mobile phone"
 msgstr "Домашній та мобільний телефони"
 
-#: aleksis/core/apps.py:160 aleksis/core/forms.py:220
-#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:166 aleksis/core/forms.py:221
+#: aleksis/core/models.py:495 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 msgid "Groups"
 msgstr "Групи"
@@ -98,172 +104,172 @@ msgstr "Дозвіл"
 msgid "Content type"
 msgstr "Тип змісту"
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:720
+#: aleksis/core/filters.py:113 aleksis/core/models.py:721
 msgid "User"
 msgstr "Користувач"
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:493
+#: aleksis/core/filters.py:135 aleksis/core/models.py:494
 msgid "Group"
 msgstr "Група"
 
-#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
+#: aleksis/core/forms.py:51 aleksis/core/forms.py:582
 msgid "Base data"
 msgstr "Основні дані"
 
-#: aleksis/core/forms.py:55 aleksis/core/tables.py:47
+#: aleksis/core/forms.py:56 aleksis/core/tables.py:47
 msgid "Address"
 msgstr "Адреса"
 
-#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
+#: aleksis/core/forms.py:57 aleksis/core/forms.py:591
 msgid "Contact data"
 msgstr "Контактні дані"
 
-#: aleksis/core/forms.py:58
+#: aleksis/core/forms.py:59
 msgid "Advanced personal data"
 msgstr "Додаткові особисті дані"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "New user"
 msgstr "Новий користувач"
 
-#: aleksis/core/forms.py:106
+#: aleksis/core/forms.py:107
 msgid "Create a new account"
 msgstr "Створити новий обліковий запис"
 
-#: aleksis/core/forms.py:132
+#: aleksis/core/forms.py:133
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr "Обравши вже існуючого користувача неможливо створити новий логін."
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:137
 msgid "This username is already in use."
 msgstr "Такий логін вже зайнятий."
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:141
+#: aleksis/core/forms.py:154 aleksis/core/models.py:142
 msgid "School term"
 msgstr "Навчальний рік"
 
-#: aleksis/core/forms.py:154
+#: aleksis/core/forms.py:155
 msgid "Common data"
 msgstr "Загальні дані"
 
-#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:208
+#: aleksis/core/models.py:165 aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "Особи"
 
-#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:593
 msgid "Additional data"
 msgstr "Додаткові дані"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:217
-#: aleksis/core/models.py:546 aleksis/core/tables.py:46
+#: aleksis/core/forms.py:158 aleksis/core/models.py:218
+#: aleksis/core/models.py:547 aleksis/core/tables.py:46
 msgid "Photo"
 msgstr "Фото"
 
-#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:84
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:85
 msgid "Date"
 msgstr "Дата"
 
-#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:92
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:93
 msgid "Time"
 msgstr "Час"
 
-#: aleksis/core/forms.py:233
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr "З якого по який час повинно відображатися це оголошення?"
 
-#: aleksis/core/forms.py:236
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr "Хто повинен бачити це оголошення?"
 
-#: aleksis/core/forms.py:237
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr "Складіть своє оголошеня:"
 
-#: aleksis/core/forms.py:276
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr "Оголошення для минулого Вам створювати не дозволено."
 
-#: aleksis/core/forms.py:280
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr "Дата і час початку повинні бути раніше за дату і час закінчення."
 
-#: aleksis/core/forms.py:289
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr "Вам потрібен принаймні один отримувач."
 
-#: aleksis/core/forms.py:398
+#: aleksis/core/forms.py:399
 msgid "Invitation code"
 msgstr "Код запрошення"
 
-#: aleksis/core/forms.py:399
+#: aleksis/core/forms.py:400
 msgid "Please enter your invitation code."
 msgstr "Напишіть, будь ласка, свій код запрошення."
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:192
+#: aleksis/core/forms.py:419 aleksis/core/models.py:193
 msgid "First name"
 msgstr "Ім'я"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:193
+#: aleksis/core/forms.py:420 aleksis/core/models.py:194
 msgid "Last name"
 msgstr "Прізвище"
 
-#: aleksis/core/forms.py:428
+#: aleksis/core/forms.py:429
 msgid "A person is using this e-mail address"
 msgstr "Цією ел.адресою хтось користується"
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:457
 msgid "Who should get the permission?"
 msgstr "Хто повинен отримати такий дозвіл?"
 
-#: aleksis/core/forms.py:457
+#: aleksis/core/forms.py:458
 msgid "On what?"
 msgstr "В разі чого?"
 
-#: aleksis/core/forms.py:483
+#: aleksis/core/forms.py:484
 msgid "Select objects which the permission should be granted for:"
 msgstr "Оберіть об'єкти, до яких буде наданий дозвіл:"
 
-#: aleksis/core/forms.py:486
+#: aleksis/core/forms.py:487
 msgid "Grant the permission for all objects"
 msgstr "Надати дозвіл до всіх об'єктів"
 
-#: aleksis/core/forms.py:494
+#: aleksis/core/forms.py:495
 msgid "You must select at least one group or person which should get the permission."
 msgstr "Ви повинні обрати принаймні одну групу або особу, хто буде мати дозвіл."
 
-#: aleksis/core/forms.py:499
+#: aleksis/core/forms.py:500
 msgid "You must grant the permission to all objects or to specific objects."
 msgstr "Ви повинні надати дозвіл до всіх або до конкретних об'єктів."
 
-#: aleksis/core/forms.py:586
+#: aleksis/core/forms.py:587
 msgid "Address data"
 msgstr "Дані адреси"
 
-#: aleksis/core/forms.py:598
+#: aleksis/core/forms.py:599
 msgid "Account data"
 msgstr "Дані облікового запису"
 
-#: aleksis/core/forms.py:605
+#: aleksis/core/forms.py:606
 msgid "Password"
 msgstr "Пароль"
 
-#: aleksis/core/forms.py:608
+#: aleksis/core/forms.py:609
 msgid "Password (again)"
 msgstr "Пароль (ще раз)"
 
-#: aleksis/core/forms.py:761
+#: aleksis/core/forms.py:762
 msgid "The selected action does not exist."
 msgstr "Обрана дія не існує."
 
-#: aleksis/core/forms.py:772
+#: aleksis/core/forms.py:773
 msgid "You do not have permission to run {} on all selected objects."
 msgstr "У Вас відсутній дозвіл на запуск {} на усіх обраних об'єктах."
 
-#: aleksis/core/forms.py:828
+#: aleksis/core/forms.py:829
 msgid "No valid selection."
 msgstr "Неправильний вибір."
 
@@ -291,658 +297,658 @@ msgstr "Результат резервного копіювання не зна
 msgid "Linked school term"
 msgstr "Пов'язаний навчальний рік"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:83
 msgid "Boolean (Yes/No)"
 msgstr "Логічне (Так/Ні)"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:84
 msgid "Text (one line)"
 msgstr "Текст (один рядок)"
 
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:86
 msgid "Date and time"
 msgstr "Дата і час"
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:87
 msgid "Decimal number"
 msgstr "Десятичне число"
 
-#: aleksis/core/models.py:87 aleksis/core/models.py:210
+#: aleksis/core/models.py:88 aleksis/core/models.py:211
 msgid "E-mail address"
 msgstr "Адреса ел.пошти"
 
-#: aleksis/core/models.py:88
+#: aleksis/core/models.py:89
 msgid "Integer"
 msgstr "Ціле"
 
-#: aleksis/core/models.py:89
+#: aleksis/core/models.py:90
 msgid "IP address"
 msgstr "IP адреса"
 
-#: aleksis/core/models.py:90
+#: aleksis/core/models.py:91
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Логічне або порожнє (Так/Ні/Нічого)"
 
-#: aleksis/core/models.py:91
+#: aleksis/core/models.py:92
 msgid "Text (multi-line)"
 msgstr "Текст (багаторядковий)"
 
-#: aleksis/core/models.py:93
+#: aleksis/core/models.py:94
 msgid "URL / Link"
 msgstr "URL / Посилання"
 
-#: aleksis/core/models.py:105 aleksis/core/models.py:1077
+#: aleksis/core/models.py:106 aleksis/core/models.py:1078
 msgid "Name"
 msgstr "Повне ім'я"
 
-#: aleksis/core/models.py:107
+#: aleksis/core/models.py:108
 msgid "Start date"
 msgstr "Дата початку"
 
-#: aleksis/core/models.py:108
+#: aleksis/core/models.py:109
 msgid "End date"
 msgstr "Дата закінчення"
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:128
 msgid "The start date must be earlier than the end date."
 msgstr "Початкова дата повинна бути раніше кінцевої."
 
-#: aleksis/core/models.py:134
+#: aleksis/core/models.py:135
 msgid "There is already a school term for this time or a part of this time."
 msgstr "На цей час або на частину цього часу вже припадає навчальний рік."
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:143
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "Навчальний рік"
 
-#: aleksis/core/models.py:163 aleksis/core/models.py:1026
+#: aleksis/core/models.py:164 aleksis/core/models.py:1027
 msgid "Person"
 msgstr "Особа"
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:167
 msgid "Can view address"
 msgstr "Може бачити адресу"
 
-#: aleksis/core/models.py:167
+#: aleksis/core/models.py:168
 msgid "Can view contact details"
 msgstr "Може бачити контактні дані"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:169
 msgid "Can view photo"
 msgstr "Може бачити фото"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:170
 msgid "Can view avatar image"
 msgstr "Може бачити аватар"
 
-#: aleksis/core/models.py:170
+#: aleksis/core/models.py:171
 msgid "Can view persons groups"
 msgstr "Може бачити групи особи"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:172
 msgid "Can view personal details"
 msgstr "Може бачити особисті дані"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "female"
 msgstr "жін"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "male"
 msgstr "чол"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "other"
 msgstr "інший"
 
-#: aleksis/core/models.py:189 aleksis/core/models.py:1353
+#: aleksis/core/models.py:190 aleksis/core/models.py:1382
 msgid "Linked user"
 msgstr "Пов'язаний користувач"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Additional name(s)"
 msgstr "Додаткові імена"
 
-#: aleksis/core/models.py:199 aleksis/core/models.py:511
-#: aleksis/core/models.py:1439
+#: aleksis/core/models.py:200 aleksis/core/models.py:512
+#: aleksis/core/models.py:1468
 msgid "Short name"
 msgstr "Коротке ім'я"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Street"
 msgstr "Вулиця"
 
-#: aleksis/core/models.py:203
+#: aleksis/core/models.py:204
 msgid "Street number"
 msgstr "Номер будинку"
 
-#: aleksis/core/models.py:204
+#: aleksis/core/models.py:205
 msgid "Postal code"
 msgstr "Поштовий індекс"
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:206
 msgid "Place"
 msgstr "Місто"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:208
 msgid "Home phone"
 msgstr "Домашній телефон"
 
-#: aleksis/core/models.py:208
+#: aleksis/core/models.py:209
 msgid "Mobile phone"
 msgstr "Мобільний телефон"
 
-#: aleksis/core/models.py:212
+#: aleksis/core/models.py:213
 msgid "Date of birth"
 msgstr "Дата народження"
 
-#: aleksis/core/models.py:213
+#: aleksis/core/models.py:214
 msgid "Place of birth"
 msgstr "Місце народження"
 
-#: aleksis/core/models.py:214
+#: aleksis/core/models.py:215
 msgid "Sex"
 msgstr "Стать"
 
-#: aleksis/core/models.py:221 aleksis/core/models.py:550
+#: aleksis/core/models.py:222 aleksis/core/models.py:551
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr "Це офіційне фото, яке використовується для документів та внутрішніх потреб."
 
-#: aleksis/core/models.py:226 aleksis/core/models.py:554
+#: aleksis/core/models.py:227 aleksis/core/models.py:555
 msgid "Display picture / Avatar"
 msgstr "Відобразити фото/аватар"
 
-#: aleksis/core/models.py:229 aleksis/core/models.py:557
+#: aleksis/core/models.py:230 aleksis/core/models.py:558
 msgid "This is a picture or an avatar for public display."
 msgstr "Це фото або аватар для загального відображення."
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:235
 msgid "Guardians / Parents"
 msgstr "Опікуни / батьки"
 
-#: aleksis/core/models.py:241
+#: aleksis/core/models.py:242
 msgid "Primary group"
 msgstr "Основна група"
 
-#: aleksis/core/models.py:244 aleksis/core/models.py:724
-#: aleksis/core/models.py:748 aleksis/core/models.py:843
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:245 aleksis/core/models.py:725
+#: aleksis/core/models.py:749 aleksis/core/models.py:844
+#: aleksis/core/models.py:1113
 msgid "Description"
 msgstr "Опис"
 
-#: aleksis/core/models.py:464
+#: aleksis/core/models.py:465
 msgid "Title of field"
 msgstr "Назва поля"
 
-#: aleksis/core/models.py:466
+#: aleksis/core/models.py:467
 msgid "Type of field"
 msgstr "Тип поля"
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:469
 msgid "Required"
 msgstr "Необхідне"
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:470
 msgid "Help text / description"
 msgstr "Допоміжний текст/опис"
 
-#: aleksis/core/models.py:475
+#: aleksis/core/models.py:476
 msgid "Addtitional field for groups"
 msgstr "Додаткове поле для груп"
 
-#: aleksis/core/models.py:476
+#: aleksis/core/models.py:477
 msgid "Addtitional fields for groups"
 msgstr "Додаткові поля для груп"
 
-#: aleksis/core/models.py:496
+#: aleksis/core/models.py:497
 msgid "Can assign child groups to groups"
 msgstr "Може призначати підлеглі групи до груп"
 
-#: aleksis/core/models.py:497
+#: aleksis/core/models.py:498
 msgid "Can view statistics about group."
 msgstr "Може бачити статистику групи."
 
-#: aleksis/core/models.py:509 aleksis/core/models.py:1440
+#: aleksis/core/models.py:510 aleksis/core/models.py:1469
 msgid "Long name"
 msgstr "Довге ім'я"
 
-#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105
+#: aleksis/core/models.py:520 aleksis/core/templates/core/group/full.html:105
 msgid "Members"
 msgstr "Учасники"
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102
+#: aleksis/core/models.py:523 aleksis/core/templates/core/group/full.html:102
 msgid "Owners"
 msgstr "Власники"
 
-#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59
+#: aleksis/core/models.py:530 aleksis/core/templates/core/group/full.html:59
 msgid "Parent groups"
 msgstr "Батьківські групи"
 
-#: aleksis/core/models.py:537
+#: aleksis/core/models.py:538
 msgid "Type of group"
 msgstr "Тип групи"
 
-#: aleksis/core/models.py:542
+#: aleksis/core/models.py:543
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr "Додаткові поля"
 
-#: aleksis/core/models.py:723 aleksis/core/models.py:747
-#: aleksis/core/models.py:842 aleksis/core/models.py:1270
+#: aleksis/core/models.py:724 aleksis/core/models.py:748
+#: aleksis/core/models.py:843 aleksis/core/models.py:1299
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Назва"
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:727
 msgid "Application"
 msgstr "Додаток"
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:733
 msgid "Activity"
 msgstr "Активність"
 
-#: aleksis/core/models.py:733
+#: aleksis/core/models.py:734
 msgid "Activities"
 msgstr "Активності"
 
-#: aleksis/core/models.py:739
+#: aleksis/core/models.py:740
 msgid "Sender"
 msgstr "Відправник"
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:745
 msgid "Recipient"
 msgstr "Отримувач"
 
-#: aleksis/core/models.py:749 aleksis/core/models.py:1078
+#: aleksis/core/models.py:750 aleksis/core/models.py:1079
 msgid "Link"
 msgstr "Посилання"
 
-#: aleksis/core/models.py:752 aleksis/core/models.py:1079
-#: aleksis/core/models.py:1400
+#: aleksis/core/models.py:753 aleksis/core/models.py:1080
+#: aleksis/core/models.py:1429
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Піктограма"
 
-#: aleksis/core/models.py:755
+#: aleksis/core/models.py:756
 msgid "Send notification at"
 msgstr "Надіслати сповіщення о"
 
-#: aleksis/core/models.py:757
+#: aleksis/core/models.py:758
 msgid "Read"
 msgstr "Читати"
 
-#: aleksis/core/models.py:758
+#: aleksis/core/models.py:759
 msgid "Sent"
 msgstr "Надіслано"
 
-#: aleksis/core/models.py:775
+#: aleksis/core/models.py:776
 msgid "Notification"
 msgstr "Сповіщення"
 
-#: aleksis/core/models.py:776 aleksis/core/preferences.py:29
+#: aleksis/core/models.py:777 aleksis/core/preferences.py:29
 msgid "Notifications"
 msgstr "Сповіщення"
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:845
 msgid "Link to detailed view"
 msgstr "Посилання на детальний перегляд"
 
-#: aleksis/core/models.py:847
+#: aleksis/core/models.py:848
 msgid "Date and time from when to show"
 msgstr "Дата і час, з якого показувати"
 
-#: aleksis/core/models.py:850
+#: aleksis/core/models.py:851
 msgid "Date and time until when to show"
 msgstr "Дата і час, до якого показувати"
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:876
 msgid "Announcement"
 msgstr "Оголошення"
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:877
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Оголошення"
 
-#: aleksis/core/models.py:913
+#: aleksis/core/models.py:914
 msgid "Announcement recipient"
 msgstr "Отримувач оголошення"
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:915
 msgid "Announcement recipients"
 msgstr "Отримувачі оголошення"
 
-#: aleksis/core/models.py:934
+#: aleksis/core/models.py:935
 msgid "Widget Title"
 msgstr "Назва віджета"
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:936
 msgid "Activate Widget"
 msgstr "Активувати віджет"
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:937
 msgid "Widget is broken"
 msgstr "Віджет зламався"
 
-#: aleksis/core/models.py:939
+#: aleksis/core/models.py:940
 msgid "Size on mobile devices"
 msgstr "Розмір на мобільних"
 
-#: aleksis/core/models.py:940
+#: aleksis/core/models.py:941
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 пікс, 12 стовпчиків"
 
-#: aleksis/core/models.py:945
+#: aleksis/core/models.py:946
 msgid "Size on tablet devices"
 msgstr "Розмір на планшетах"
 
-#: aleksis/core/models.py:946
+#: aleksis/core/models.py:947
 msgid "> 600 px, 12 columns"
 msgstr "> 600 пікс, 12 стовпчиків"
 
-#: aleksis/core/models.py:951
+#: aleksis/core/models.py:952
 msgid "Size on desktop devices"
 msgstr "Розмір на ПК"
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:953
 msgid "> 992 px, 12 columns"
 msgstr "> 992 пікс, 12 стовпчиків"
 
-#: aleksis/core/models.py:957
+#: aleksis/core/models.py:958
 msgid "Size on large desktop devices"
 msgstr "Розмір на великих екранах"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:959
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 пікс, 12 стовпчиків"
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:990
 msgid "Can edit default dashboard"
 msgstr "Може редагувати типову/стандартну інформпанель"
 
-#: aleksis/core/models.py:990
+#: aleksis/core/models.py:991
 msgid "Dashboard Widget"
 msgstr "Віджет інформпанелі"
 
-#: aleksis/core/models.py:991
+#: aleksis/core/models.py:992
 msgid "Dashboard Widgets"
 msgstr "Віджети інформпанелі"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:998
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:999
 msgid "Icon URL"
 msgstr "Піктограма URL"
 
-#: aleksis/core/models.py:1004
+#: aleksis/core/models.py:1005
 msgid "External link widget"
 msgstr "Зовнішнє посилання на віджет"
 
-#: aleksis/core/models.py:1005
+#: aleksis/core/models.py:1006
 msgid "External link widgets"
 msgstr "Зовнішні посилання на віджети"
 
-#: aleksis/core/models.py:1011
+#: aleksis/core/models.py:1012
 msgid "Content"
 msgstr "Зміст"
 
-#: aleksis/core/models.py:1017
+#: aleksis/core/models.py:1018
 msgid "Static content widget"
 msgstr "Віджет з постійним змістом"
 
-#: aleksis/core/models.py:1018
+#: aleksis/core/models.py:1019
 msgid "Static content widgets"
 msgstr "Віджети з постійним змістом"
 
-#: aleksis/core/models.py:1023
+#: aleksis/core/models.py:1024
 msgid "Dashboard widget"
 msgstr "Віджет інформпанелі"
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1029
 msgid "Order"
 msgstr "Порядок"
 
-#: aleksis/core/models.py:1029
+#: aleksis/core/models.py:1030
 msgid "Part of the default dashboard"
 msgstr "Частина типової інформпанелі"
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1045
 msgid "Dashboard widget order"
 msgstr "Порядок віджету на інформпанелі"
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1046
 msgid "Dashboard widget orders"
 msgstr "Порядок віджетів на інформпанелі"
 
-#: aleksis/core/models.py:1051
+#: aleksis/core/models.py:1052
 msgid "Menu ID"
 msgstr "Меню ID"
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1065
 msgid "Custom menu"
 msgstr "Користувацьке меню"
 
-#: aleksis/core/models.py:1065
+#: aleksis/core/models.py:1066
 msgid "Custom menus"
 msgstr "Користувацькі меню"
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1076
 msgid "Menu"
 msgstr "Меню"
 
-#: aleksis/core/models.py:1085
+#: aleksis/core/models.py:1086
 msgid "Custom menu item"
 msgstr "Пункт користувацького меню"
 
-#: aleksis/core/models.py:1086
+#: aleksis/core/models.py:1087
 msgid "Custom menu items"
 msgstr "Пункти користувацького меню"
 
-#: aleksis/core/models.py:1111
+#: aleksis/core/models.py:1112
 msgid "Title of type"
 msgstr "Назва типу"
 
-#: aleksis/core/models.py:1118 aleksis/core/templates/core/group/full.html:50
+#: aleksis/core/models.py:1119 aleksis/core/templates/core/group/full.html:50
 msgid "Group type"
 msgstr "Тип групи"
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1120
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr "Типи груп"
 
-#: aleksis/core/models.py:1132
+#: aleksis/core/models.py:1133
 msgid "Can view system status"
 msgstr "Може переглядати стан системи"
 
-#: aleksis/core/models.py:1133
+#: aleksis/core/models.py:1134
 msgid "Can manage data"
 msgstr "Може керувати даними"
 
-#: aleksis/core/models.py:1134
+#: aleksis/core/models.py:1135
 msgid "Can impersonate"
 msgstr "Може маскуватися"
 
-#: aleksis/core/models.py:1135
+#: aleksis/core/models.py:1136
 msgid "Can use search"
 msgstr "Може шукати"
 
-#: aleksis/core/models.py:1136
+#: aleksis/core/models.py:1137
 msgid "Can change site preferences"
 msgstr "Може змінювати властивості сайту"
 
-#: aleksis/core/models.py:1137
+#: aleksis/core/models.py:1138
 msgid "Can change person preferences"
 msgstr "Може змінювати властивості особи"
 
-#: aleksis/core/models.py:1138
+#: aleksis/core/models.py:1139
 msgid "Can change group preferences"
 msgstr "Може змінювати властивості групи"
 
-#: aleksis/core/models.py:1139
+#: aleksis/core/models.py:1140
 msgid "Can test PDF generation"
 msgstr "Може генерувати тестові PDF"
 
-#: aleksis/core/models.py:1140
+#: aleksis/core/models.py:1141
 msgid "Can invite persons"
 msgstr "Може запрошувати осіб"
 
-#: aleksis/core/models.py:1176
+#: aleksis/core/models.py:1177
 msgid "Related data check task"
 msgstr "Завдання перевірки пов'язаних даних"
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1185
 msgid "Issue solved"
 msgstr "Проблема вирішена"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1186
 msgid "Notification sent"
 msgstr "Сповіщення надіслане"
 
-#: aleksis/core/models.py:1198
+#: aleksis/core/models.py:1199
 msgid "Data check result"
 msgstr "Результат перевірки даних"
 
-#: aleksis/core/models.py:1199
+#: aleksis/core/models.py:1200
 msgid "Data check results"
 msgstr "Результати перевірки даних"
 
-#: aleksis/core/models.py:1201
+#: aleksis/core/models.py:1202
 msgid "Can run data checks"
 msgstr "Може запускати перевірки даних"
 
-#: aleksis/core/models.py:1202
+#: aleksis/core/models.py:1203
 msgid "Can solve data check problems"
 msgstr "Може розв'язувати проблеми перевірки даних"
 
-#: aleksis/core/models.py:1209
+#: aleksis/core/models.py:1210
 msgid "E-Mail address"
 msgstr "Адреса ел.пошти"
 
-#: aleksis/core/models.py:1241
+#: aleksis/core/models.py:1270
 msgid "Owner"
 msgstr "Власник"
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1274
 msgid "File expires at"
 msgstr "Файл дійсний до"
 
-#: aleksis/core/models.py:1248
+#: aleksis/core/models.py:1277
 msgid "Generated HTML file"
 msgstr "Згенерований файл HTML"
 
-#: aleksis/core/models.py:1251
+#: aleksis/core/models.py:1280
 msgid "Generated PDF file"
 msgstr "Згенерований файл PDF"
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1287
 msgid "PDF file"
 msgstr "Файл PDF"
 
-#: aleksis/core/models.py:1259
+#: aleksis/core/models.py:1288
 msgid "PDF files"
 msgstr "Файли PDF"
 
-#: aleksis/core/models.py:1264
+#: aleksis/core/models.py:1293
 msgid "Task result"
 msgstr "Результат завдання"
 
-#: aleksis/core/models.py:1267
+#: aleksis/core/models.py:1296
 msgid "Task user"
 msgstr "Користувач завдання"
 
-#: aleksis/core/models.py:1271
+#: aleksis/core/models.py:1300
 msgid "Back URL"
 msgstr "URL для повернення"
 
-#: aleksis/core/models.py:1272
+#: aleksis/core/models.py:1301
 msgid "Progress title"
 msgstr "Назва процесу"
 
-#: aleksis/core/models.py:1273
+#: aleksis/core/models.py:1302
 msgid "Error message"
 msgstr "Повідомлення про помилку"
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1303
 msgid "Success message"
 msgstr "Повідомлення про успіх"
 
-#: aleksis/core/models.py:1275
+#: aleksis/core/models.py:1304
 msgid "Redirect on success URL"
 msgstr "Посилання для перенаправлення в разі успіху"
 
-#: aleksis/core/models.py:1277
+#: aleksis/core/models.py:1306
 msgid "Additional button title"
 msgstr "Назва додаткової кнопки"
 
-#: aleksis/core/models.py:1279
+#: aleksis/core/models.py:1308
 msgid "Additional button URL"
 msgstr "Посилання додаткової кнопки"
 
-#: aleksis/core/models.py:1281
+#: aleksis/core/models.py:1310
 msgid "Additional button icon"
 msgstr "Піктограма додаткової кнопки"
 
-#: aleksis/core/models.py:1283
+#: aleksis/core/models.py:1312
 msgid "Result fetched"
 msgstr "Отриманий результат"
 
-#: aleksis/core/models.py:1308
+#: aleksis/core/models.py:1337
 msgid "Background task completed successfully"
 msgstr "Фонове завдання успішно завершене"
 
-#: aleksis/core/models.py:1309
+#: aleksis/core/models.py:1338
 msgid "The background task '{}' has been completed successfully."
 msgstr "Фонове завдання '{}' було успішно завершене."
 
-#: aleksis/core/models.py:1315
+#: aleksis/core/models.py:1344
 msgid "Background task failed"
 msgstr "Збій фонового завдання"
 
-#: aleksis/core/models.py:1316
+#: aleksis/core/models.py:1345
 msgid "The background task '{}' has failed."
 msgstr "У фонового завдання '{}' стався збій."
 
-#: aleksis/core/models.py:1325
+#: aleksis/core/models.py:1354
 msgid "Background task"
 msgstr "Фонове завдання"
 
-#: aleksis/core/models.py:1339
+#: aleksis/core/models.py:1368
 msgid "Task user assignment"
 msgstr "Призначення користувача завдання"
 
-#: aleksis/core/models.py:1340
+#: aleksis/core/models.py:1369
 msgid "Task user assignments"
 msgstr "Призначення користувачів завдання"
 
-#: aleksis/core/models.py:1356
+#: aleksis/core/models.py:1385
 msgid "Additional attributes"
 msgstr "Додаткові атрибути"
 
-#: aleksis/core/models.py:1394
+#: aleksis/core/models.py:1423
 msgid "Allowed scopes that clients can request"
 msgstr "Дозволені межі дії, які можуть запитувати клієнти"
 
-#: aleksis/core/models.py:1404
+#: aleksis/core/models.py:1433
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr "Це зображення буде іконкою під час авторизації. Воно повинне бути квадратним."
 
-#: aleksis/core/models.py:1449
+#: aleksis/core/models.py:1478
 msgid "Can view room timetable"
 msgstr "Може переглядати розклад кімнати"
 
-#: aleksis/core/models.py:1451
+#: aleksis/core/models.py:1480
 msgid "Room"
 msgstr "Кімната"
 
-#: aleksis/core/models.py:1452
+#: aleksis/core/models.py:1481
 msgid "Rooms"
 msgstr "Кімнати"
 
@@ -1154,15 +1160,15 @@ msgstr "Автоматично оновлювати інформпанель т
 msgid "Country for phone number parsing"
 msgstr "Країна для розбору номера телефона"
 
-#: aleksis/core/settings.py:549
+#: aleksis/core/settings.py:551
 msgid "English"
 msgstr "Англійська"
 
-#: aleksis/core/settings.py:550
+#: aleksis/core/settings.py:552
 msgid "German"
 msgstr "Німецька"
 
-#: aleksis/core/settings.py:551
+#: aleksis/core/settings.py:553
 msgid "Ukrainian"
 msgstr "Українська"
 
@@ -1174,14 +1180,14 @@ msgid "Edit"
 msgstr "Редагувати"
 
 #: aleksis/core/tables.py:27 aleksis/core/tables.py:148
-#: aleksis/core/tables.py:192
+#: aleksis/core/tables.py:185
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr "Дії"
 
 #: aleksis/core/tables.py:115 aleksis/core/tables.py:116
 #: aleksis/core/tables.py:130 aleksis/core/tables.py:146
-#: aleksis/core/tables.py:190
+#: aleksis/core/tables.py:183
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:33
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -1246,7 +1252,7 @@ msgstr ""
 "            Ви також можете звернутися до них безпосередньо:\n"
 "          "
 
-#: aleksis/core/templates/500.html:21
+#: aleksis/core/templates/500.html:21 aleksis/core/templates/offline.html:22
 msgid "Retry"
 msgstr "Спробувати ще"
 
@@ -1602,20 +1608,20 @@ msgstr "Створити %(name)s"
 msgid "Edit default dashboard"
 msgstr "Редагувати типову/стандартну інформпанель"
 
-#: aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
+#: aleksis/core/templates/core/data_check/list.html:11
 msgid "Data checks"
 msgstr "Перевірки даних"
 
-#: aleksis/core/templates/core/data_check/list.html:15
+#: aleksis/core/templates/core/data_check/list.html:16
 msgid "Check data again"
 msgstr "Перевірити дані ще раз"
 
-#: aleksis/core/templates/core/data_check/list.html:22
+#: aleksis/core/templates/core/data_check/list.html:23
 msgid "The system detected some problems with your data."
 msgstr "Система виявила деякі проблеми з Вашими даними."
 
-#: aleksis/core/templates/core/data_check/list.html:23
+#: aleksis/core/templates/core/data_check/list.html:24
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
@@ -1623,43 +1629,43 @@ msgstr ""
 "Будь ласка, уважно перегляньте усі дані і перевірте чи не потрібно\n"
 "          щось зробити."
 
-#: aleksis/core/templates/core/data_check/list.html:31
+#: aleksis/core/templates/core/data_check/list.html:32
 msgid "Everything is fine."
 msgstr "Все чудово."
 
-#: aleksis/core/templates/core/data_check/list.html:32
+#: aleksis/core/templates/core/data_check/list.html:33
 msgid "The system hasn't detected any problems with your data."
 msgstr "Система не виявила жодних проблем з Вашими даними."
 
-#: aleksis/core/templates/core/data_check/list.html:40
+#: aleksis/core/templates/core/data_check/list.html:41
 msgid "Detected problems"
 msgstr "Виявлені проблеми"
 
-#: aleksis/core/templates/core/data_check/list.html:45
+#: aleksis/core/templates/core/data_check/list.html:46
 msgid "Affected object"
 msgstr "Залежні об'єкти"
 
-#: aleksis/core/templates/core/data_check/list.html:46
+#: aleksis/core/templates/core/data_check/list.html:47
 msgid "Detected problem"
 msgstr "Виявлена проблема"
 
-#: aleksis/core/templates/core/data_check/list.html:47
+#: aleksis/core/templates/core/data_check/list.html:48
 msgid "Show details"
 msgstr "Детальніше"
 
-#: aleksis/core/templates/core/data_check/list.html:48
+#: aleksis/core/templates/core/data_check/list.html:49
 msgid "Options to solve the problem"
 msgstr "Варіанти вирішення проблеми"
 
-#: aleksis/core/templates/core/data_check/list.html:63
+#: aleksis/core/templates/core/data_check/list.html:65
 msgid "Show object"
 msgstr "Переглянути об'єкт"
 
-#: aleksis/core/templates/core/data_check/list.html:86
+#: aleksis/core/templates/core/data_check/list.html:89
 msgid "Registered checks"
 msgstr "Зареєстровані перевірки"
 
-#: aleksis/core/templates/core/data_check/list.html:90
+#: aleksis/core/templates/core/data_check/list.html:93
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1916,33 +1922,38 @@ msgstr "Стан системи"
 msgid "System checks"
 msgstr "Системні перевірки"
 
-#: aleksis/core/templates/core/pages/system_status.html:22
+#: aleksis/core/templates/core/pages/system_status.html:26
 msgid "Maintenance mode enabled"
 msgstr "Активований режим обслуговування"
 
-#: aleksis/core/templates/core/pages/system_status.html:24
+#: aleksis/core/templates/core/pages/system_status.html:28
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| "                Only admin and visitors from internal IPs can access the site.\n"
+#| "              "
 msgid ""
 "\n"
-"                Only admin and visitors from internal IPs can access the site.\n"
-"              "
+"                  Only admin and visitors from internal IPs can access the site.\n"
+"                "
 msgstr ""
 "\n"
 "                Доступ до сайту мають лише адміністратор та відвідувачі з внутрішніми IP-адресами.\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:36
+#: aleksis/core/templates/core/pages/system_status.html:39
 msgid "Maintenance mode disabled"
 msgstr "Режим обслуговування деактивований"
 
-#: aleksis/core/templates/core/pages/system_status.html:37
+#: aleksis/core/templates/core/pages/system_status.html:40
 msgid "Everyone can access the site."
 msgstr "Доступ до сайту мають усі."
 
-#: aleksis/core/templates/core/pages/system_status.html:47
+#: aleksis/core/templates/core/pages/system_status.html:51
 msgid "Debug mode enabled"
 msgstr "Активований режим налагодження"
 
-#: aleksis/core/templates/core/pages/system_status.html:49
+#: aleksis/core/templates/core/pages/system_status.html:53
 msgid ""
 "\n"
 "                The web server throws back debug information on errors. Do not use in production!\n"
@@ -1952,11 +1963,11 @@ msgstr ""
 "                Веб-сервер кидає під час помилок інформацію щодо налагодження. Не використовуйте в продакшені!\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:56
+#: aleksis/core/templates/core/pages/system_status.html:60
 msgid "Debug mode disabled"
 msgstr "Режим налагодження деактивований"
 
-#: aleksis/core/templates/core/pages/system_status.html:58
+#: aleksis/core/templates/core/pages/system_status.html:62
 msgid ""
 "\n"
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
@@ -1966,42 +1977,42 @@ msgstr ""
 "                Режим налагодження деактивований. В разі збоїв відображатимуться типові сторінки помилок.\n"
 "              "
 
-#: aleksis/core/templates/core/pages/system_status.html:71
+#: aleksis/core/templates/core/pages/system_status.html:75
 msgid "System health checks"
 msgstr "Перевірки роботи системи"
 
-#: aleksis/core/templates/core/pages/system_status.html:77
+#: aleksis/core/templates/core/pages/system_status.html:81
 msgid "Service"
 msgstr "Служба"
 
-#: aleksis/core/templates/core/pages/system_status.html:78
-#: aleksis/core/templates/core/pages/system_status.html:119
+#: aleksis/core/templates/core/pages/system_status.html:82
+#: aleksis/core/templates/core/pages/system_status.html:123
 msgid "Status"
 msgstr "Стан"
 
-#: aleksis/core/templates/core/pages/system_status.html:79
+#: aleksis/core/templates/core/pages/system_status.html:83
 msgid "Time taken"
 msgstr "Тривалість"
 
-#: aleksis/core/templates/core/pages/system_status.html:100
+#: aleksis/core/templates/core/pages/system_status.html:104
 msgid "seconds"
 msgstr "сек"
 
-#: aleksis/core/templates/core/pages/system_status.html:111
+#: aleksis/core/templates/core/pages/system_status.html:115
 msgid "Celery task results"
 msgstr "Результати виконання Celery"
 
-#: aleksis/core/templates/core/pages/system_status.html:116
+#: aleksis/core/templates/core/pages/system_status.html:120
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
 msgstr "Завдання"
 
-#: aleksis/core/templates/core/pages/system_status.html:117
+#: aleksis/core/templates/core/pages/system_status.html:121
 msgid "ID"
 msgstr "ID"
 
-#: aleksis/core/templates/core/pages/system_status.html:118
+#: aleksis/core/templates/core/pages/system_status.html:122
 msgid "Date done"
 msgstr "Час завершення"
 
@@ -2247,11 +2258,11 @@ msgstr "Запрошення ел.поштою"
 msgid "Generate invitation code"
 msgstr "Створити код запрошення"
 
-#: aleksis/core/templates/invitations/forms/_invite.html:29
+#: aleksis/core/templates/invitations/forms/_invite.html:30
 msgid "Generate code"
 msgstr "Генерація коду"
 
-#: aleksis/core/templates/invitations/forms/_invite.html:33
+#: aleksis/core/templates/invitations/forms/_invite.html:34
 msgid "Invitations"
 msgstr "Запрошення"
 
@@ -2267,7 +2278,6 @@ msgstr "Реєстрація додатку OAuth2"
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:14
 #: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr "Скасувати"
@@ -2341,43 +2351,26 @@ msgstr "Дозволити"
 msgid "Disallow"
 msgstr "Заборонити"
 
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
-msgid "Revoke access"
-msgstr "Відкликати доступ"
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
-msgid "Are you sure to revoke the access for this application?"
-msgstr "Ви дійсно хочете відкликати доступ для цього додатку?"
-
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
-msgid "Revoke"
-msgstr "Відкликати"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
-msgid "Authorized applications"
-msgstr "Авторизовані додатки"
-
-#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
-msgid "No authorized applications."
-msgstr "Авторизованих додатків немає."
-
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
 msgstr "Помилка мережі"
 
 #: aleksis/core/templates/offline.html:10
-msgid "Page not available offline."
-msgstr "Сторінка в автономному режимі не доступна."
+msgid "No connection to server."
+msgstr ""
 
 #: aleksis/core/templates/offline.html:14
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| "      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
+#| "      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
+#| "      administrators:\n"
+#| "    "
 msgid ""
 "\n"
-"      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n"
-"      or mobile data is turned on and try again. If you think you are connected, please contact the system\n"
-"      administrators:\n"
+"      This page is not available without a connection to the server. Please check your internet connection and try again.\n"
+"      If you are connected and the error persists, please contact the system administrators:\n"
 "    "
 msgstr ""
 "\n"
@@ -2518,6 +2511,8 @@ msgstr ""
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
 msgid "Hello"
 msgstr "Привіт"
 
@@ -2594,6 +2589,24 @@ msgstr "Опис проблеми"
 msgid "Count of objects with new problems"
 msgstr "Кількість об'єктів з новими проблемами"
 
+#: aleksis/core/templates/templated_email/invitation.email:4
+#, python-format
+msgid "Invitation to register on %(site)s"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/invitation.email:6
+#: aleksis/core/templates/templated_email/invitation.email:14
+#, fuzzy, python-format
+#| msgid "Selected persons"
+msgid "Hello %(person)s"
+msgstr "Позначені особи"
+
+#: aleksis/core/templates/templated_email/invitation.email:9
+#: aleksis/core/templates/templated_email/invitation.email:18
+#, python-format
+msgid "you have been invited to register on %(site)s. If you would like to accept this invitation, please click on the following link:"
+msgstr ""
+
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
 msgstr "Нове сповіщення для"
@@ -3069,152 +3082,180 @@ msgstr "Під час створення файлу PDF виникла проб
 msgid "Download PDF"
 msgstr "Звантажити PDF"
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:285
 msgid "The school term has been created."
 msgstr "Навчальний рік створений."
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:297
 msgid "The school term has been saved."
 msgstr "Навчальний рік збережений."
 
-#: aleksis/core/views.py:396
+#: aleksis/core/views.py:401
 msgid "The child groups were successfully saved."
 msgstr "Підлеглі групи збережені."
 
-#: aleksis/core/views.py:415 aleksis/core/views.py:425
+#: aleksis/core/views.py:420 aleksis/core/views.py:430
 msgid "The person has been saved."
 msgstr "Особа збережена."
 
-#: aleksis/core/views.py:475
+#: aleksis/core/views.py:480
 msgid "The group has been saved."
 msgstr "Група збережена."
 
-#: aleksis/core/views.py:558
+#: aleksis/core/views.py:528
+#, fuzzy
+#| msgid "The data checks were run successfully."
+msgid "Maintenance mode was turned on successfully."
+msgstr "Перевірка даних успішно запущена."
+
+#: aleksis/core/views.py:530
+msgid "Maintenance mode was turned off successfully."
+msgstr ""
+
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr "Оголошення збережене."
 
-#: aleksis/core/views.py:574
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr "Оголошення видалене."
 
-#: aleksis/core/views.py:643
+#: aleksis/core/views.py:673
 msgid "The requested preference registry does not exist"
 msgstr "Журналу із запитаними властивостями не існує"
 
-#: aleksis/core/views.py:662
+#: aleksis/core/views.py:692
 msgid "The preferences have been saved successfully."
 msgstr "Властивості збережені."
 
-#: aleksis/core/views.py:686
+#: aleksis/core/views.py:716
 msgid "The person has been deleted."
 msgstr "Особа видалена."
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:730
 msgid "The group has been deleted."
 msgstr "Група видалена."
 
-#: aleksis/core/views.py:732
+#: aleksis/core/views.py:762
 msgid "The additional field has been saved."
 msgstr "Додаткове поле збережене."
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:797
 msgid "The additional field has been deleted."
 msgstr "Додаткове поле видалене."
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:822
 msgid "The group type has been saved."
 msgstr "Тип групи збережений."
 
-#: aleksis/core/views.py:823
+#: aleksis/core/views.py:853
 msgid "The group type has been deleted."
 msgstr "Тип групи видалений."
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr "Перебіг: Запуск перевірки даних"
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr "Запускається перевірка даних …"
 
-#: aleksis/core/views.py:860
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr "Перевірка даних успішно запущена."
 
-#: aleksis/core/views.py:861
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr "Під час запуску перевірки даних виникла проблема."
 
-#: aleksis/core/views.py:878
+#: aleksis/core/views.py:908
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr "Варіант розв'язання \"{solve_option_obj.verbose_name}\" "
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:918
 msgid "The requested solve option does not exist"
 msgstr "Запитаний варіант розв'язання не існує"
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:951
 msgid "The dashboard widget has been saved."
 msgstr "Віджет інформпанелі збережений."
 
-#: aleksis/core/views.py:951
+#: aleksis/core/views.py:981
 msgid "The dashboard widget has been created."
 msgstr "Віджет інформпанелі створений."
 
-#: aleksis/core/views.py:961
+#: aleksis/core/views.py:991
 msgid "The dashboard widget has been deleted."
 msgstr "Віджет інформпанелі видалений."
 
-#: aleksis/core/views.py:1033
+#: aleksis/core/views.py:1063
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ваша конфігурація інформпанелі збережена."
 
-#: aleksis/core/views.py:1035
+#: aleksis/core/views.py:1065
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Конфігурація типової/стандартної інформпанелі збережена."
 
-#: aleksis/core/views.py:1106
+#: aleksis/core/views.py:1136
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr "Запрошення успішно створене. Код запрошення: {code}"
 
-#: aleksis/core/views.py:1203
+#: aleksis/core/views.py:1233
 msgid "We have successfully assigned the permissions."
 msgstr "Ми успішно призначили дозволи."
 
-#: aleksis/core/views.py:1213
+#: aleksis/core/views.py:1243
 msgid "The global user permission has been deleted."
 msgstr "Глобальний користувацький дозвіл видалений."
 
-#: aleksis/core/views.py:1223
+#: aleksis/core/views.py:1253
 msgid "The global group permission has been deleted."
 msgstr "Глобальний груповий дозвіл видалений."
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1263
 msgid "The object user permission has been deleted."
 msgstr "Об'єктний користувацький дозвіл видалений."
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1273
 msgid "The object group permission has been deleted."
 msgstr "Об'єктний груповий дозвіл видалений."
 
-#: aleksis/core/views.py:1352
+#: aleksis/core/views.py:1382
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr "Обліковий запис третьої сторони не можна від'єднати оскільки він єдиний спосіб для входу."
 
-#: aleksis/core/views.py:1359
+#: aleksis/core/views.py:1389
 msgid "The third-party account has been successfully disconnected."
 msgstr "Обліковий запис третьої сторони успішно від'єднаний."
 
-#: aleksis/core/views.py:1435
+#: aleksis/core/views.py:1465
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr "Особа успішно запрошена. Лист з інструкціями щодо наступних дій надісланий на її ел.пошту."
 
-#: aleksis/core/views.py:1446
+#: aleksis/core/views.py:1476
 msgid "Person was already invited."
 msgstr "Особа вже була запрошена."
 
+#~ msgid "Revoke access"
+#~ msgstr "Відкликати доступ"
+
+#~ msgid "Are you sure to revoke the access for this application?"
+#~ msgstr "Ви дійсно хочете відкликати доступ для цього додатку?"
+
+#~ msgid "Revoke"
+#~ msgstr "Відкликати"
+
+#~ msgid "Authorized applications"
+#~ msgstr "Авторизовані додатки"
+
+#~ msgid "No authorized applications."
+#~ msgstr "Авторизованих додатків немає."
+
+#~ msgid "Page not available offline."
+#~ msgstr "Сторінка в автономному режимі не доступна."
+
 #~ msgid ""
 #~ "\n"
 #~ "            This page is currently unavailable. If this error persists, contact your site administrators:\n"
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 1a370c2c68af1569f92a9cc09ada7f8b5f671649..d90790427fb3c22531ec0cda50e9c48eb615e196 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -13,6 +13,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.postgres.fields import ArrayField
 from django.contrib.sites.models import Site
+from django.contrib.sites.shortcuts import get_current_site
 from django.core.exceptions import ValidationError
 from django.core.validators import MaxValueValidator
 from django.db import models, transaction
@@ -769,7 +770,7 @@ class Notification(ExtensibleModel, TimeStampedModel):
     def send(self, resend: bool = False) -> Optional[AsyncResult]:
         """Send the notification to the recipient."""
         if not self.sent or resend:
-            return send_notification.delay(self.pk, resend=True)
+            return send_notification.delay(self.pk, resend=resend)
 
     class Meta:
         verbose_name = _("Notification")
@@ -1223,8 +1224,36 @@ class PersonInvitation(AbstractBaseInvitation, PureDjangoModel):
         instance = cls.objects.create(email=email, inviter=inviter, key=code, **kwargs)
         return instance
 
+    def send_invitation(self, request, **kwargs):
+        """Send the invitation email to the person."""
+        current_site = get_current_site(request)
+        invite_url = reverse("invitations:accept-invite", args=[self.key])
+        invite_url = request.build_absolute_uri(invite_url).replace("/django", "")
+        context = kwargs
+        context.update(
+            {
+                "invite_url": invite_url,
+                "site_name": current_site.name,
+                "email": self.email,
+                "inviter": self.inviter,
+                "person": self.person,
+            },
+        )
+
+        send_email(template_name="invitation", recipient_list=[self.email], context=context)
+
+        self.sent = timezone.now()
+        self.save()
+
+        signals.invite_url_sent.send(
+            sender=self.__class__,
+            instance=self,
+            invite_url_sent=invite_url,
+            inviter=self.inviter,
+        )
+
     key_expired = Invitation.key_expired
-    send_invitation = Invitation.send_invitation
+    send_invitation = send_invitation
 
 
 class PDFFile(ExtensibleModel):
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index 631a9337654db24782f823dd956c286855ca7792..7d10c2ae5c4a7b2538ad907c227033ea6a0ef0f2 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -3,7 +3,6 @@ from django.forms import EmailField, ImageField, URLField
 from django.forms.widgets import SelectMultiple
 from django.utils.translation import gettext_lazy as _
 
-import pycountry
 from colorfield.widgets import ColorWidget
 from dynamic_preferences.preferences import Section
 from dynamic_preferences.types import (
@@ -478,13 +477,3 @@ class AutoUpdatingDashboardSite(BooleanPreference):
     name = "automatically_update_dashboard_site"
     default = True
     verbose_name = _("Automatically update the dashboard and its widgets sitewide")
-
-
-@site_preferences_registry.register
-class PhoneNumberCountry(ChoicePreference):
-    section = internationalisation
-    name = "phone_number_country"
-    required = True
-    default = "GB"
-    choices = [(x.alpha_2, x.alpha_2) for x in pycountry.countries]
-    verbose_name = _("Country for phone number parsing")
diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py
index b95f3bbac10a21aada6afeb25acfab9b01b70ef6..6d77fcd70fb32712c4358a9bcec5a03e306140d5 100644
--- a/aleksis/core/rules.py
+++ b/aleksis/core/rules.py
@@ -60,49 +60,49 @@ rules.add_perm("core.view_persons_rule", view_persons_predicate)
 
 # View person
 view_person_predicate = has_person & (
-    has_global_perm("core.view_person") | has_object_perm("core.view_person") | is_current_person
+    is_current_person | has_global_perm("core.view_person") | has_object_perm("core.view_person")
 )
 rules.add_perm("core.view_person_rule", view_person_predicate)
 
 # View person address
 view_address_predicate = has_person & (
-    has_global_perm("core.view_address") | has_object_perm("core.view_address") | is_current_person
+    is_current_person | has_global_perm("core.view_address") | has_object_perm("core.view_address")
 )
 rules.add_perm("core.view_address_rule", view_address_predicate)
 
 # View person contact details
 view_contact_details_predicate = has_person & (
-    has_global_perm("core.view_contact_details")
+    is_current_person
+    | has_global_perm("core.view_contact_details")
     | has_object_perm("core.view_contact_details")
-    | is_current_person
 )
 rules.add_perm("core.view_contact_details_rule", view_contact_details_predicate)
 
 # View person photo
 view_photo_predicate = has_person & (
-    has_global_perm("core.view_photo") | has_object_perm("core.view_photo") | is_current_person
+    is_current_person | has_global_perm("core.view_photo") | has_object_perm("core.view_photo")
 )
 rules.add_perm("core.view_photo_rule", view_photo_predicate)
 
 # View person avatar image
 view_avatar_predicate = has_person & (
-    has_global_perm("core.view_avatar") | has_object_perm("core.view_avatar") | is_current_person
+    is_current_person | has_global_perm("core.view_avatar") | has_object_perm("core.view_avatar")
 )
 rules.add_perm("core.view_avatar_rule", view_avatar_predicate)
 
 # View persons groups
 view_groups_predicate = has_person & (
-    has_global_perm("core.view_person_groups")
+    is_current_person
+    | has_global_perm("core.view_person_groups")
     | has_object_perm("core.view_person_groups")
-    | is_current_person
 )
 rules.add_perm("core.view_person_groups_rule", view_groups_predicate)
 
 # Edit person
 edit_person_predicate = has_person & (
-    has_global_perm("core.change_person")
+    is_current_person & is_site_preference_set("account", "editable_fields_person")
+    | has_global_perm("core.change_person")
     | has_object_perm("core.change_person")
-    | is_current_person & is_site_preference_set("account", "editable_fields_person")
 )
 rules.add_perm("core.edit_person_rule", edit_person_predicate)
 
@@ -191,9 +191,9 @@ rules.add_perm(
 
 # View person personal details
 view_personal_details_predicate = has_person & (
-    has_global_perm("core.view_personal_details")
+    is_current_person
+    | has_global_perm("core.view_personal_details")
     | has_object_perm("core.view_personal_details")
-    | is_current_person
 )
 rules.add_perm("core.view_personal_details_rule", view_personal_details_predicate)
 
@@ -206,9 +206,9 @@ rules.add_perm("core.change_site_preferences_rule", change_site_preferences)
 
 # Change person preferences
 change_person_preferences = has_person & (
-    has_global_perm("core.change_person_preferences")
+    is_current_person
+    | has_global_perm("core.change_person_preferences")
     | has_object_perm("core.change_person_preferences")
-    | is_current_person
 )
 rules.add_perm("core.change_person_preferences_rule", change_person_preferences)
 
@@ -251,6 +251,12 @@ view_additional_fields_predicate = has_person & (
 )
 rules.add_perm("core.view_additionalfields_rule", view_additional_fields_predicate)
 
+# View group type
+view_group_type_predicate = has_person & (
+    has_global_perm("core.view_grouptype") | has_object_perm("core.view_grouptype")
+)
+rules.add_perm("core.view_grouptype_rule", view_group_type_predicate)
+
 # Edit group type
 change_group_type_predicate = has_person & (
     has_global_perm("core.change_grouptype") | has_object_perm("core.change_grouptype")
diff --git a/aleksis/core/schema/__init__.py b/aleksis/core/schema/__init__.py
index deab0e28b5d93e854a020aad687a618817196536..a11fbb427d3c585ec145c83446dbab9cc7b856e4 100644
--- a/aleksis/core/schema/__init__.py
+++ b/aleksis/core/schema/__init__.py
@@ -9,7 +9,15 @@ from haystack.inputs import AutoQuery
 from haystack.query import SearchQuerySet
 from haystack.utils.loading import UnifiedIndex
 
-from ..models import CustomMenu, DynamicRoute, Notification, PDFFile, Person, TaskUserAssignment
+from ..models import (
+    CustomMenu,
+    DynamicRoute,
+    Notification,
+    OAuthAccessToken,
+    PDFFile,
+    Person,
+    TaskUserAssignment,
+)
 from ..util.apps import AppConfig
 from ..util.core_helpers import get_allowed_object_ids, get_app_module, get_app_packages, has_person
 from .celery_progress import CeleryProgressFetchedMutation, CeleryProgressType
@@ -19,6 +27,7 @@ from .group import GroupType  # noqa
 from .installed_apps import AppType
 from .message import MessageType
 from .notification import MarkNotificationReadMutation, NotificationType
+from .oauth import OAuthAccessTokenType, OAuthRevokeTokenMutation
 from .pdf import PDFFileType
 from .person import PersonMutation, PersonType
 from .school_term import SchoolTermType  # noqa
@@ -59,6 +68,8 @@ class Query(graphene.ObjectType):
 
     two_factor = graphene.Field(TwoFactorType)
 
+    oauth_access_tokens = graphene.List(OAuthAccessTokenType)
+
     def resolve_ping(root, info, payload) -> str:
         return payload
 
@@ -139,7 +150,7 @@ class Query(graphene.ObjectType):
             return None
 
     def resolve_messages(root, info, **kwargs):
-        return get_messages(info)
+        return get_messages(info.context)
 
     def resolve_custom_menu_by_name(root, info, name, **kwargs):
         return CustomMenu.get_default(name)
@@ -157,6 +168,10 @@ class Query(graphene.ObjectType):
             return None
         return info.context.user
 
+    @staticmethod
+    def resolve_oauth_access_tokens(root, info, **kwargs):
+        return OAuthAccessToken.objects.filter(user=info.context.user)
+
 
 class Mutation(graphene.ObjectType):
     update_person = PersonMutation.Field()
@@ -165,6 +180,8 @@ class Mutation(graphene.ObjectType):
 
     celery_progress_fetched = CeleryProgressFetchedMutation.Field()
 
+    revoke_oauth_token = OAuthRevokeTokenMutation.Field()
+
 
 def build_global_schema():
     """Build global GraphQL schema from all apps."""
diff --git a/aleksis/core/schema/base.py b/aleksis/core/schema/base.py
index e927dadccaaab7b2bf39c2110286970222f70f5b..36d4f0647bd25d56b58e14fc4b737a3893e20372 100644
--- a/aleksis/core/schema/base.py
+++ b/aleksis/core/schema/base.py
@@ -1,3 +1,6 @@
+from django.core.exceptions import PermissionDenied
+from django.db.models import Model
+
 import graphene
 from graphene_django import DjangoObjectType
 
@@ -24,3 +27,23 @@ class FieldFileType(graphene.ObjectType):
 
     def resolve_absolute_url(root, info, **kwargs):
         return info.context.build_absolute_uri(root.url) if root else ""
+
+
+class DeleteMutation(graphene.Mutation):
+    """Mutation to delete an object."""
+
+    klass: Model = None
+    permission_required: str = ""
+    ok = graphene.Boolean()
+
+    class Arguments:
+        id = graphene.ID()  # noqa
+
+    @classmethod
+    def mutate(cls, root, info, **kwargs):
+        obj = cls.klass.objects.get(pk=kwargs["id"])
+        if info.context.user.has_perm(cls.permission_required, obj):
+            obj.delete()
+            return cls(ok=True)
+        else:
+            raise PermissionDenied()
diff --git a/aleksis/core/schema/group.py b/aleksis/core/schema/group.py
index 327daff3dd09d54053b683ba4cefb71da8ba6e5b..433eeaa825868ef588047d1af1f72313a0e9ec56 100644
--- a/aleksis/core/schema/group.py
+++ b/aleksis/core/schema/group.py
@@ -1,8 +1,59 @@
+from django.core.exceptions import PermissionDenied
+
 from graphene_django import DjangoObjectType
+from guardian.shortcuts import get_objects_for_user
 
-from ..models import Group
+from ..models import Group, Person
+from ..util.core_helpers import has_person
 
 
 class GroupType(DjangoObjectType):
     class Meta:
         model = Group
+        fields = [
+            "id",
+            "school_term",
+            "name",
+            "short_name",
+            "members",
+            "owners",
+            "parent_groups",
+            "group_type",
+            "additional_fields",
+            "photo",
+            "avatar",
+        ]
+
+    @staticmethod
+    def resolve_parent_groups(root, info, **kwargs):
+        return get_objects_for_user(info.context.user, "core.view_group", root.parent_groups.all())
+
+    @staticmethod
+    def resolve_members(root, info, **kwargs):
+        persons = get_objects_for_user(info.context.user, "core.view_person", root.members.all())
+        if has_person(info.context.user) and [
+            m for m in root.members.all() if m.pk == info.context.user.person.pk
+        ]:
+            persons = (persons | Person.objects.get(pk=info.context.user.person.pk)).distinct()
+        return persons
+
+    @staticmethod
+    def resolve_owners(root, info, **kwargs):
+        persons = get_objects_for_user(info.context.user, "core.view_person", root.owners.all())
+        if has_person(info.context.user) and [
+            o for o in root.owners.all() if o.pk == info.context.user.person.pk
+        ]:
+            persons = (persons | Person.objects.get(pk=info.context.user.person.pk)).distinct()
+        return persons
+
+    @staticmethod
+    def resolve_group_type(root, info, **kwargs):
+        if info.context.user.has_perm("core.view_grouptype_rule", root.group_type):
+            return root.group_type
+        raise PermissionDenied()
+
+    @staticmethod
+    def resolve_additional_fields(root, info, **kwargs):
+        return get_objects_for_user(
+            info.context.user, "core.view_additionalfield", root.additional_fields.all()
+        )
diff --git a/aleksis/core/schema/notification.py b/aleksis/core/schema/notification.py
index 1e10a74e1e4e7b13c56063fb63dd978a8947adf4..c98bb011466001cc848b4cb8efd5ba14dce428cc 100644
--- a/aleksis/core/schema/notification.py
+++ b/aleksis/core/schema/notification.py
@@ -9,6 +9,26 @@ from ..models import Notification
 class NotificationType(DjangoObjectType):
     class Meta:
         model = Notification
+        fields = [
+            "id",
+            "sender",
+            "recipient",
+            "title",
+            "description",
+            "link",
+            "icon",
+            "send_at",
+            "read",
+            "sent",
+            "created",
+            "modified",
+        ]
+
+    @staticmethod
+    def resolve_recipient(root, info, **kwargs):
+        if info.context.user.has_perm("core.view_person_rule", root.recipient):
+            return root.recipient
+        raise PermissionDenied()
 
 
 class MarkNotificationReadMutation(graphene.Mutation):
diff --git a/aleksis/core/schema/oauth.py b/aleksis/core/schema/oauth.py
new file mode 100644
index 0000000000000000000000000000000000000000..c51527d0bb316f2768a844e71697a0eeb8c29100
--- /dev/null
+++ b/aleksis/core/schema/oauth.py
@@ -0,0 +1,44 @@
+import graphene
+from graphene_django import DjangoObjectType
+
+from aleksis.core.models import OAuthAccessToken, OAuthApplication
+
+from .base import FieldFileType
+
+
+class OAuthScope(graphene.ObjectType):
+    name = graphene.String()
+    description = graphene.String()
+
+
+class OAuthApplicationType(DjangoObjectType):
+    icon = graphene.Field(FieldFileType)
+
+    class Meta:
+        model = OAuthApplication
+        fields = ["id", "name", "icon"]
+
+
+class OAuthAccessTokenType(DjangoObjectType):
+    scopes = graphene.List(OAuthScope)
+
+    @staticmethod
+    def resolve_scopes(root: OAuthAccessToken, info, **kwargs):
+        return [OAuthScope(name=key, description=value) for key, value in root.scopes.items()]
+
+    class Meta:
+        model = OAuthAccessToken
+        fields = ["id", "application", "expires", "created", "updated"]
+
+
+class OAuthRevokeTokenMutation(graphene.Mutation):
+    class Arguments:
+        id = graphene.ID()  # noqa
+
+    ok = graphene.Boolean()
+
+    @staticmethod
+    def mutate(root, info, id):  # noqa
+        token = OAuthAccessToken.objects.get(id=id, user=info.context.user)
+        token.delete()
+        return OAuthRevokeTokenMutation(ok=True)
diff --git a/aleksis/core/schema/pdf.py b/aleksis/core/schema/pdf.py
index a87eabf7bc60b23c04f8d6a3b334e03e61522a8e..bcb782bc981a4fa5d0250d0646fdcb5107805bc2 100644
--- a/aleksis/core/schema/pdf.py
+++ b/aleksis/core/schema/pdf.py
@@ -1,3 +1,5 @@
+from django.core.exceptions import PermissionDenied
+
 import graphene
 from graphene_django import DjangoObjectType
 
@@ -11,3 +13,9 @@ class PDFFileType(DjangoObjectType):
     class Meta:
         model = PDFFile
         exclude = ["html_file"]
+
+    @staticmethod
+    def resolve_person(root, info, **kwargs):
+        if info.context.user.has_perm("core.view_person_rule", root.person):
+            return root.person
+        raise PermissionDenied()
diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py
index 821cade46c4ca76539e284bd1311a6992869e782..6eed201487348034b2d9b1cba616046b1794dbf2 100644
--- a/aleksis/core/schema/person.py
+++ b/aleksis/core/schema/person.py
@@ -6,10 +6,11 @@ from django.utils import timezone
 import graphene
 from graphene_django import DjangoObjectType
 from graphene_django.forms.mutation import DjangoModelFormMutation
+from guardian.shortcuts import get_objects_for_user
 
 from ..forms import PersonForm
 from ..models import DummyPerson, Person
-from ..util.core_helpers import get_site_preferences, is_impersonate
+from ..util.core_helpers import get_site_preferences, has_person
 from .base import FieldFileType
 from .notification import NotificationType
 
@@ -24,6 +25,32 @@ class PersonPreferencesType(graphene.ObjectType):
 class PersonType(DjangoObjectType):
     class Meta:
         model = Person
+        fields = [
+            "id",
+            "user",
+            "first_name",
+            "last_name",
+            "additional_name",
+            "short_name",
+            "street",
+            "housenumber",
+            "postal_code",
+            "place",
+            "phone_number",
+            "mobile_number",
+            "email",
+            "date_of_birth",
+            "place_of_birth",
+            "sex",
+            "photo",
+            "avatar",
+            "guardians",
+            "primary_group",
+            "description",
+            "children",
+            "owner_of",
+            "member_of",
+        ]
 
     full_name = graphene.String()
     username = graphene.String()
@@ -38,7 +65,6 @@ class PersonType(DjangoObjectType):
     unread_notifications_count = graphene.Int()
 
     is_dummy = graphene.Boolean()
-    is_impersonate = graphene.Boolean()
     preferences = graphene.Field(PersonPreferencesType)
 
     can_edit_person = graphene.Boolean()
@@ -94,24 +120,29 @@ class PersonType(DjangoObjectType):
 
     def resolve_children(root, info, **kwargs):  # noqa
         if info.context.user.has_perm("core.view_personal_details_rule", root):
-            return root.children.all()
+            return get_objects_for_user(info.context.user, "core.view_person", root.children.all())
         return []
 
     def resolve_guardians(root, info, **kwargs):  # noqa
         if info.context.user.has_perm("core.view_personal_details_rule", root):
-            return root.guardians.all()
+            return get_objects_for_user(info.context.user, "core.view_person", root.guardians.all())
         return []
 
     def resolve_member_of(root, info, **kwargs):  # noqa
         if info.context.user.has_perm("core.view_person_groups_rule", root):
-            return root.member_of.all()
+            return get_objects_for_user(info.context.user, "core.view_group", root.member_of.all())
         return []
 
     def resolve_owner_of(root, info, **kwargs):  # noqa
         if info.context.user.has_perm("core.view_person_groups_rule", root):
-            return root.owner_of.all()
+            return get_objects_for_user(info.context.user, "core.view_group", root.owner_of.all())
         return []
 
+    def resolve_primary_group(root, info, **kwargs):  # noqa
+        if info.context.user.has_perm("core.view_group_rule", root.primary_group):
+            return root.primary_group
+        raise PermissionDenied()
+
     def resolve_username(root, info, **kwargs):  # noqa
         return root.user.username if root.user else None
 
@@ -167,11 +198,12 @@ class PersonType(DjangoObjectType):
     def resolve_is_dummy(root: Union[Person, DummyPerson], info, **kwargs):
         return root.is_dummy if hasattr(root, "is_dummy") else False
 
-    def resolve_is_impersonate(root: Person, info, **kwargs):
-        return is_impersonate(info.context)
-
     def resolve_notifications(root: Person, info, **kwargs):
-        return root.notifications.filter(send_at__lte=timezone.now()).order_by("read", "-created")
+        if has_person(info.context.user) and info.context.user.person == root:
+            return root.notifications.filter(send_at__lte=timezone.now()).order_by(
+                "read", "-created"
+            )
+        raise PermissionDenied()
 
     def resolve_can_edit_person(root, info, **kwargs):  # noqa
         return info.context.user.has_perm("core.edit_person_rule", root)
diff --git a/aleksis/core/schema/room.py b/aleksis/core/schema/room.py
new file mode 100644
index 0000000000000000000000000000000000000000..d4f76700793d2f7eededaac1b0361ebeff1a6a5a
--- /dev/null
+++ b/aleksis/core/schema/room.py
@@ -0,0 +1,9 @@
+from graphene_django import DjangoObjectType
+
+from ..models import Room
+
+
+class RoomType(DjangoObjectType):
+    class Meta:
+        model = Room
+        fields = ("id", "name", "short_name")
diff --git a/aleksis/core/schema/user.py b/aleksis/core/schema/user.py
index 1c1ff08ea2c4c77a6ab68af9e389a36db66a764c..7104a64b6acfa4f0891a9371304df9609569723d 100644
--- a/aleksis/core/schema/user.py
+++ b/aleksis/core/schema/user.py
@@ -12,6 +12,7 @@ class UserType(graphene.ObjectType):
 
     is_authenticated = graphene.Boolean(required=True)
     is_anonymous = graphene.Boolean(required=True)
+    is_impersonate = graphene.Boolean()
 
     person = graphene.Field(PersonType)
 
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index c12ae3371376a0836bdd9898753e7f8d28317daa..fbe25a785c289e415445b6cf52bc9ff43bfeb477 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -68,7 +68,8 @@ DJANGO_VITE_DEV_SERVER_PORT = DEV_SERVER_PORT + 1
 
 ALLOWED_HOSTS = _settings.get("http.allowed_hosts", [getfqdn(), "localhost", "127.0.0.1", "[::1]"])
 BASE_URL = _settings.get(
-    "http.base_url", f"http://localhost:{DEV_SERVER_PORT}" if DEBUG else f"//{ALLOWED_HOSTS[0]}"
+    "http.base_url",
+    f"http://localhost:{DEV_SERVER_PORT}" if DEBUG else f"https://{ALLOWED_HOSTS[0]}",
 )
 
 
@@ -554,6 +555,8 @@ LANGUAGE_CODE = _settings.get("l10n.lang", "en")
 TIME_ZONE = _settings.get("l10n.tz", "UTC")
 USE_TZ = True
 
+PHONENUMBER_DEFAULT_REGION = _settings.get("l10n.phone_number_country", None)
+
 # Static files (CSS, JavaScript, Images)
 # https://docs.djangoproject.com/en/2.1/howto/static-files/
 
diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py
index c912d13477c607e3374b3c8b4619338a8cb8a6a0..5411cad4747bc8c5de011fcdd2abcde432842236 100644
--- a/aleksis/core/tables.py
+++ b/aleksis/core/tables.py
@@ -152,13 +152,6 @@ class DashboardWidgetTable(tables.Table):
         return record._meta.verbose_name
 
 
-class PersonColumn(tables.Column):
-    """Returns person object from given id."""
-
-    def render(self, value):
-        return Person.objects.get(pk=value)
-
-
 class InvitationCodeColumn(tables.Column):
     """Returns invitation code in a more readable format."""
 
@@ -170,10 +163,10 @@ class InvitationCodeColumn(tables.Column):
 class InvitationsTable(tables.Table):
     """Table to list persons."""
 
-    person_id = PersonColumn()
+    person = tables.Column()
     email = tables.EmailColumn()
     sent = tables.DateColumn()
-    inviter_id = PersonColumn()
+    inviter = tables.Column()
     key = InvitationCodeColumn()
     accepted = tables.BooleanColumn(
         yesno="check,cancel", attrs={"span": {"class": "material-icons"}}
diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html
index d008cd5405f4e5eee73ddf175cab87057e563785..a2ea5c902dba89f34241403e85d0e8af8d8f9a5d 100644
--- a/aleksis/core/templates/500.html
+++ b/aleksis/core/templates/500.html
@@ -16,7 +16,7 @@
           {% endblocktrans %}
         </p>
         {% include "core/partials/admins_list.html" %}
-        <a href="javascript:window.location.reload()" class="btn green waves-effect waves-light">
+        <a onClick="window.location.reload();" class="btn secondary waves-effect waves-light">
           <i class="material-icons left">refresh</i>
           {% trans "Retry" %}
         </a>
diff --git a/aleksis/core/templates/core/data_check/list.html b/aleksis/core/templates/core/data_check/list.html
index b192dcdc1623a05fa3ad7b3568b4b8bdc3622abf..00b0ceb3a9eefdb473b6fe97a2d2d693aee59b61 100644
--- a/aleksis/core/templates/core/data_check/list.html
+++ b/aleksis/core/templates/core/data_check/list.html
@@ -2,6 +2,7 @@
 
 {% extends "core/base.html" %}
 {% load data_helpers %}
+{% load html_helpers %}
 
 {% load i18n %}
 {% load render_table from django_tables2 %}
@@ -59,9 +60,11 @@
                 <td>{{ result.related_object }}</td>
                 <td>{{ result.related_check.problem_name }}</td>
                 <td>
-                  <a class="btn-flat waves-effect waves-light" href="{{ result.related_object.get_absolute_url }}">
+		  {% if result.related_object.get_absolute_url %}
+                  <a class="btn-flat waves-effect waves-light" href="{{ result.related_object.get_absolute_url|remove_prefix:"/django/" }}" target="_blank">
                     {% trans "Show object" %}
                   </a>
+		  {% endif %}
                 </td>
                 <td>
                   {% for option_name, option in result.related_check.solve_options.items %}
diff --git a/aleksis/core/templates/core/pages/system_status.html b/aleksis/core/templates/core/pages/system_status.html
index 7f0e7bff0840029b500620662cd4681ac6bddded..00c0010d9f150fbd6e0b6bd3cf7f60684c08b350 100644
--- a/aleksis/core/templates/core/pages/system_status.html
+++ b/aleksis/core/templates/core/pages/system_status.html
@@ -13,30 +13,34 @@
 
       {# Maintenance mode #}
       <div class="row">
-        {% if maintenance_mode %}
-          <a class="btn-flat btn-flat-medium right waves-effect waves-red no-padding"
-             href="{% url 'maintenance_mode_off' %}">
-            <i class="material-icons iconify small red-text center" data-icon="mdi:power"></i>
-          </a>
-          <div>
-            <p class="flow-text">{% blocktrans %}Maintenance mode enabled{% endblocktrans %}</p>
-            <p class="grey-text">
-              {% blocktrans %}
-                Only admin and visitors from internal IPs can access the site.
-              {% endblocktrans %}
-            </p>
-          </div>
-          <span class="badge badge-danger mdi mdi-power"><a href="{% url 'maintenance_mode_off' %}"></a></span>
-        {% else %}
-          <a class="btn-flat btn-flat-medium right waves-effect waves-green no-padding"
-             href="{% url 'maintenance_mode_on' %}">
-            <i class="material-icons iconify small green-text center" data-icon="mdi:power"></i>
-          </a>
-          <div>
-            <p class="flow-text">{% blocktrans %}Maintenance mode disabled{% endblocktrans %}</p>
-            <p class="grey-text">{% blocktrans %}Everyone can access the site.{% endblocktrans %}</p>
-          </div>
-        {% endif %}
+        <form method="POST">
+          {% csrf_token %}
+          {{ form }}
+
+          {% if maintenance_mode %}
+            <button class="btn-flat btn-flat-medium right waves-effect waves-red no-padding"
+               type="submit">
+              <i class="material-icons iconify small red-text center" data-icon="mdi:power"></i>
+            </button>
+            <div>
+              <p class="flow-text">{% blocktrans %}Maintenance mode enabled{% endblocktrans %}</p>
+              <p class="grey-text">
+                {% blocktrans %}
+                  Only admin and visitors from internal IPs can access the site.
+                {% endblocktrans %}
+              </p>
+            </div>
+          {% else %}
+            <button class="btn-flat btn-flat-medium right waves-effect waves-green no-padding"
+               type="submit">
+              <i class="material-icons iconify small green-text center" data-icon="mdi:power"></i>
+            </button>
+            <div>
+              <p class="flow-text">{% blocktrans %}Maintenance mode disabled{% endblocktrans %}</p>
+              <p class="grey-text">{% blocktrans %}Everyone can access the site.{% endblocktrans %}</p>
+            </div>
+          {% endif %}
+        </form>
       </div>
 
       {# Debug mode #}
diff --git a/aleksis/core/templates/invitations/forms/_invite.html b/aleksis/core/templates/invitations/forms/_invite.html
index 297997e0b04f3d99a1e1279c8900d0bcc9c50024..4378ff639af86da13091094d70cf1d4b295085be 100644
--- a/aleksis/core/templates/invitations/forms/_invite.html
+++ b/aleksis/core/templates/invitations/forms/_invite.html
@@ -19,13 +19,14 @@
         {% csrf_token %}
         {% form form=form %}{% endform %}
         {% trans "Invite" as caption %}
-        {% include "core/partials/save_button.html" with caption=caption icon="card_giftcard" %}
+        {% include "core/partials/save_button.html" with caption=caption icon="mdi:account-multiple-plus" %}
       </form>
     </div>
     <div class="col s6">        
       <h5>{% trans "Generate invitation code" %}</h5>
 
       <a class="btn waves-effect waves-light hundred-percent" href="{% url 'generate_invitation_code' %}">
+        <i class="material-icons iconify left" data-icon="mdi:account-multiple-plus"></i>
         {% trans "Generate code" %}
       </a>
     </div>
diff --git a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html b/aleksis/core/templates/oauth2_provider/authorized-token-delete.html
deleted file mode 100644
index ece2011b6e6170bd8ed845f8464302bb1e6fb8fb..0000000000000000000000000000000000000000
--- a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{% extends "core/base.html" %}
-
-{% load i18n %}
-
-{% block browser_title %}{% trans "Revoke access" %}{% endblock %}
-{% block page_title %}{% trans "Revoke access" %}{% endblock %}
-
-{% block content %}
-  <div class="alert info">
-    <p>
-      <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
-      {% trans "Are you sure to revoke the access for this application?" %}
-    </p>
-  </div>
-
-  <form method="post">
-    {% csrf_token %}
-    <a class="btn waves-effect waves-light red" href="{% url "oauth2_applications" %}">
-      <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i>
-      {% trans "Revoke" %}
-    </a>
-    <a class="btn waves-effect waves-light" href="{% url "oauth2_applications" %}">
-      <i class="material-icons iconify left" data-icon="mdi:close"></i>
-      {% trans "Cancel" %}
-    </a>
-  </form>
-{% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/authorized-tokens.html b/aleksis/core/templates/oauth2_provider/authorized-tokens.html
deleted file mode 100644
index dfe058056fb4ffaabd2a44eaac04adaa8aa3ad3b..0000000000000000000000000000000000000000
--- a/aleksis/core/templates/oauth2_provider/authorized-tokens.html
+++ /dev/null
@@ -1,37 +0,0 @@
-{% extends "core/base.html" %}
-
-{% load i18n %}
-
-{% block browser_title %}{% blocktrans %}Authorized applications{% endblocktrans %}{% endblock %}
-{% block page_title %}{% trans "Authorized applications" %}{% endblock %}
-
-{% block content %}
-  {% if authorized_tokens %}
-    <div class="row">
-      {% for authorized_token in authorized_tokens %}
-        <div class="col s12 m6 l4 xl3">
-          <div class="card">
-            <div class="card-content">
-              <div class="card-title">{{ authorized_token.application }}</div>
-              {% for scope_name, scope_description in authorized_token.scopes.items %}
-                <p>
-                  {{ scope_name }}: {{ scope_description }}
-                </p>
-              {% endfor %}
-            </div>
-            <div class="card-action">
-              <a href="{% url 'oauth2_provider:authorized-token-delete' authorized_token.pk %}">{% trans "Revoke access" %}</a>
-            </div>
-          </div>
-        </div>
-      {% endfor %}
-    </div>
-  {% else %}
-    <div class="alert info">
-      <p>
-        <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
-        {% trans "No authorized applications." %}
-      </p>
-    </div>
-  {% endif %}
-{% endblock %}
diff --git a/aleksis/core/templates/offline.html b/aleksis/core/templates/offline.html
index 77537353bc1615426bab6e836519954c4a803da6..8bb50d53c202d2688e8c0da947b080cad1c52f28 100644
--- a/aleksis/core/templates/offline.html
+++ b/aleksis/core/templates/offline.html
@@ -7,15 +7,18 @@
 {% block content %}
   <h3>
     <i class="material-icons iconify left medium" style="font-size: 2.92rem;" data-icon="mdi:wifi-strength-alert-outline"></i>
-    {% blocktrans %}Page not available offline.{% endblocktrans %}
+    {% blocktrans %}No connection to server.{% endblocktrans %}
   </h3>
 
   <p class="flow-text">
     {% blocktrans %}
-      This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi
-      or mobile data is turned on and try again. If you think you are connected, please contact the system
-      administrators:
+      This page is not available without a connection to the server. Please check your internet connection and try again.
+      If you are connected and the error persists, please contact the system administrators:
     {% endblocktrans %}
   </p>
   {% include "core/partials/admins_list.html" %}
+  <a onClick="window.location.reload();" class="btn secondary waves-effect waves-light">
+    <i class="material-icons left">refresh</i>
+    {% trans "Retry" %}
+  </a>
 {% endblock %}
diff --git a/aleksis/core/templates/templated_email/invitation.email b/aleksis/core/templates/templated_email/invitation.email
new file mode 100644
index 0000000000000000000000000000000000000000..3bf0311b61dbadc6eba025a1ae801a95c0d87521
--- /dev/null
+++ b/aleksis/core/templates/templated_email/invitation.email
@@ -0,0 +1,24 @@
+{% extends "templated_email/base.email" %}
+{% load i18n %}
+
+{% block subject_content %}{% blocktrans with site=site_name %}Invitation to register on {{ site }}{% endblocktrans %}{% endblock %}
+
+{% block plain_greeting %}{% if person %}{% blocktrans with person=person.addressing_name %}Hello {{ person }}{% endblocktrans %}{% else %}{% trans "Hello" %}{% endif %},{% endblock %}
+
+{% block plain_content %}
+{% blocktrans with site=site_name %}you have been invited to register on {{ site }}. If you would like to accept this invitation, please click on the following link:{% endblocktrans %}
+
+{{ invite_url }}
+{% endblock %}
+
+{% block html_greeting %}{% if person %}{% blocktrans with person=person.addressing_name %}Hello {{ person }}{% endblocktrans %}{% else %}{% trans "Hello" %}{% endif %},{% endblock %}
+
+{% block html_content %}
+ <p>
+  {% blocktrans with site=site_name %}you have been invited to register on {{ site }}. If you would like to accept this invitation, please click on the following link:{% endblocktrans %}
+ </p>
+
+ <a href="{{ invite_url}}">
+  {{ invite_url }}
+ </a>
+{% endblock %}
diff --git a/aleksis/core/templatetags/html_helpers.py b/aleksis/core/templatetags/html_helpers.py
index 8ca5be151d2edc39bf6787e9e51eabb3350714a0..98608a084574994400bffe46c50f944b52296e24 100644
--- a/aleksis/core/templatetags/html_helpers.py
+++ b/aleksis/core/templatetags/html_helpers.py
@@ -1,5 +1,6 @@
 import random
 import string
+from urllib.parse import urlparse
 
 from django import template
 from django.shortcuts import reverse
@@ -28,6 +29,24 @@ def add_class_to_el(value: str, arg: str) -> str:
     return str(soup)
 
 
+@register.filter
+def remove_prefix(value: str, prefix: str) -> str:
+    """Remove prefix of a url.
+
+    :Example:
+
+    .. code-block::
+
+        {{ object.get_absolute_url|remove_prefix: "/django/" }}
+    """
+    url = urlparse(value)
+
+    if url.path.startswith(prefix):
+        url = url._replace(path=url.path[len(prefix) :])
+
+    return url.geturl()
+
+
 @register.simple_tag
 def generate_random_id(prefix: str, length: int = 10) -> str:
     """Generate a random ID for templates.
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index f5e5899063678abc338ac971d1df3f55db3d0430..9792fcb75cd1e7197cda1f1e6707c3eb42ed1d3e 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -11,7 +11,6 @@ from django.views.i18n import JavaScriptCatalog
 
 import calendarweek.django
 from ckeditor_uploader import views as ckeditor_uploader_views
-from graphene_django.views import GraphQLView
 from health_check.urls import urlpatterns as health_urls
 from maintenance_mode.decorators import force_maintenance_mode_off
 from oauth2_provider.views import ConnectDiscoveryInfoView
@@ -26,14 +25,23 @@ urlpatterns = [
     path("sw.js", views.ServiceWorkerView.as_view(), name="service_worker"),
     path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")),
     path("__icons__/", include("dj_iconify.urls")),
-    path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True)), name="graphql"),
+    path(
+        "graphql/",
+        csrf_exempt(views.LoggingGraphQLView.as_view(graphiql=True)),
+        name="graphql",
+    ),
     path("logo", force_maintenance_mode_off(views.LogoView.as_view()), name="logo"),
     path(
         ".well-known/openid-configuration/",
         ConnectDiscoveryInfoView.as_view(),
         name="oidc_configuration",
     ),
+    path("oauth/applications/", views.TemplateView.as_view(template_name="core/vue_index.html")),
+    path(
+        "oauth/authorized_tokens/", views.TemplateView.as_view(template_name="core/vue_index.html")
+    ),
     path("oauth/", include("oauth2_provider.urls", namespace="oauth2_provider")),
+    path("system_status/", views.SystemStatusAPIView.as_view(), name="system_status_api"),
     path(
         "django/",
         include(
@@ -60,7 +68,6 @@ urlpatterns = [
                     views.SocialAccountDeleteView.as_view(),
                     name="delete_social_account_by_pk",
                 ),
-                path("vue_dummy/", views.vue_dummy, name="vue_dummy"),
                 path("offline/", views.OfflineView.as_view(), name="offline"),
                 path(
                     "invitations/send-invite/", views.InvitePerson.as_view(), name="invite_person"
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index e9536003df379d5f97d1cf895d27c2a7b1623600..c1de17adafc9bc33205a364b619b4c23c5b1e897 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -16,6 +16,7 @@ from django.http import (
     Http404,
     HttpRequest,
     HttpResponse,
+    HttpResponseBadRequest,
     HttpResponseRedirect,
     HttpResponseServerError,
     JsonResponse,
@@ -45,6 +46,8 @@ from django_celery_results.models import TaskResult
 from django_filters.views import FilterView
 from django_tables2 import RequestConfig, SingleTableMixin, SingleTableView
 from dynamic_preferences.forms import preference_form_builder
+from graphene_django.views import GraphQLView
+from graphql import GraphQLError
 from guardian.shortcuts import GroupObjectPermission, UserObjectPermission, get_objects_for_user
 from haystack.generic_views import SearchView
 from haystack.inputs import AutoQuery
@@ -52,6 +55,7 @@ from haystack.query import SearchQuerySet
 from haystack.utils.loading import UnifiedIndex
 from health_check.views import MainView
 from invitations.views import SendInvite
+from maintenance_mode.core import set_maintenance_mode
 from oauth2_provider.exceptions import OAuthToolkitError
 from oauth2_provider.models import get_application_model
 from oauth2_provider.views import AuthorizationView
@@ -85,6 +89,7 @@ from .forms import (
     EditGroupTypeForm,
     GroupPreferenceForm,
     InvitationCodeForm,
+    MaintenanceModeForm,
     OAuthApplicationForm,
     PersonForm,
     PersonPreferenceForm,
@@ -490,7 +495,6 @@ class SystemStatus(PermissionRequiredMixin, MainView):
     context = {}
 
     def get(self, request, *args, **kwargs):
-        status_code = 500 if self.errors else 200
         task_results = []
 
         if app.control.inspect().registered_tasks():
@@ -502,11 +506,42 @@ class SystemStatus(PermissionRequiredMixin, MainView):
 
         context = {
             "plugins": self.plugins,
-            "status_code": status_code,
             "tasks": task_results,
             "DEBUG": settings.DEBUG,
+            "form": MaintenanceModeForm(),
         }
-        return self.render_to_response(context, status=status_code)
+        return self.render_to_response(context)
+
+    def post(self, request, *args, **kwargs):
+        form = MaintenanceModeForm(request.POST)
+
+        if form.is_valid():
+            mode = form.cleaned_data.get("maintenance_mode")
+        else:
+            return HttpResponseBadRequest()
+
+        if not request.user.is_superuser:
+            return self.handle_no_permission()
+
+        set_maintenance_mode(mode)
+        if mode:
+            messages.success(request, _("Maintenance mode was turned on successfully."))
+        else:
+            messages.success(request, _("Maintenance mode was turned off successfully."))
+
+        return self.get(request, *args, **kwargs)
+
+
+class SystemStatusAPIView(PermissionRequiredMixin, MainView):
+    """Provide information about system status as JSON."""
+
+    permission_required = "core.view_system_status_rule"
+
+    @method_decorator(never_cache)
+    def get(self, request, *args, **kwargs):
+        status_code = 500 if self.errors else 200
+
+        return self.render_to_response_json(self.plugins, status_code)
 
 
 class TestPDFGenerationView(PermissionRequiredMixin, RenderPDFView):
@@ -514,11 +549,6 @@ class TestPDFGenerationView(PermissionRequiredMixin, RenderPDFView):
     permission_required = "core.test_pdf_rule"
 
 
-def vue_dummy(request: HttpRequest) -> HttpResponse:
-    # FIXME remove together with URL route and template
-    return render(request, "core/vue_dummy.html", {})
-
-
 @pwa_cache
 @permission_required("core.view_announcements_rule")
 def announcements(request: HttpRequest) -> HttpResponse:
@@ -1543,3 +1573,15 @@ class TwoFactorLoginView(two_factor_views.LoginView):
         other_devices = list(filter(lambda x: not isinstance(x, type(main_device)), other_devices))
 
         return other_devices
+
+
+class LoggingGraphQLView(GraphQLView):
+    """GraphQL view that raises unknown exceptions instead of blindly catching them."""
+
+    def execute_graphql_request(self, *args, **kwargs):
+        result = super().execute_graphql_request(*args, **kwargs)
+        errors = result.errors or []
+        for error in errors:
+            if not isinstance(error.original_error, GraphQLError):
+                raise error
+        return result
diff --git a/aleksis/core/vite.config.js b/aleksis/core/vite.config.js
index 2b73a5f14dd8096530c7fd64356302cd47943979..287534f096c186bc428de742c4e5ff56b71e8eab 100644
--- a/aleksis/core/vite.config.js
+++ b/aleksis/core/vite.config.js
@@ -239,7 +239,7 @@ export default defineConfig({
               plugins: [
                 {
                   fetchDidSucceed: async ({ request, response }) => {
-                    if (response.ok) {
+                    if (response.status < 500) {
                       return response;
                     }
                     throw new Error(
diff --git a/docs/admin/10_install.rst b/docs/admin/10_install.rst
index 322d39023183a171b29f2fffc4a55988441a89c7..03ffc97b1e73b28561f2283338773672e4c41a73 100644
--- a/docs/admin/10_install.rst
+++ b/docs/admin/10_install.rst
@@ -16,7 +16,7 @@ AlekSIS will need and use the following paths:
  * `/var/lib/aleksis/media` for file storage (Django media)
  * `/var/backups/aleksis` for backups of database and media files
  * `/usr/local/share/aleksis/static` for static files
- * `//var/cache/aleksis` for building frontend assets etc.
+ * `/var/cache/aleksis` for building frontend assets etc.
 
 You can change any of the paths as you like.
 
@@ -27,12 +27,13 @@ Prerequisites
 
 For an installation on a dedicated server, the following prerequisites are needed:
 
- * Debian 11
+ * Debian 12 or newer, or comparable distribution
  * PostgreSQL
  * Redis
  * uWSGI
  * nginx
- * Python 3.9
+ * Python 3.9 or newer
+ * Node.js 18 or newer
  * Some system dependencies to build Python modules and manage frontend files
  * System locales for all supported languages
  * The aforementioned paths
@@ -49,6 +50,7 @@ Install some packages from the Debian package system.
                nginx-full \
                python3 \
                python3-dev \
+               python3-pip \
                libpq-dev \
                yarnpkg \
                python3-virtualenv \
@@ -143,7 +145,7 @@ You only need to install these additional dependencies if installing the meta-pa
 After that, you can install the aleksis meta-package, or only `aleksis-core`:
 
 .. code-block:: shell
-   pip3 install aleksis
+   pip3 install --break-system-packages aleksis
    aleksis-admin vite build
    aleksis-admin collectstatic
    aleksis-admin migrate
@@ -176,7 +178,7 @@ editor and inserting:
    master = true
    enable-threads = true
    processes = 20
-   wsgi-file = /usr/local/lib/python3.9/dist-packages/aleksis/core/wsgi.py
+   wsgi-file = /usr/local/lib/python3.11/dist-packages/aleksis/core/wsgi.py
    chdir = /var/lib/aleksis
    lazy = true
    lazy-apps = true
diff --git a/docs/admin/16_config_options.rst b/docs/admin/16_config_options.rst
index 15e474708a76f1261efa820c9129ca204800d4c6..531cb284deb1bd5dc450a514c87484c9d546e0f1 100644
--- a/docs/admin/16_config_options.rst
+++ b/docs/admin/16_config_options.rst
@@ -15,6 +15,12 @@ Example configuration file::
     media = { root = "/srv/www/aleksis/data/media", url = "/media/" }
     secret_key = "Xoc8eiwah3neehid2Xi3oomoh4laem"
 
+    # Localization
+    [l10n]
+    lang = "en"
+    tz = "Europe/Berlin"
+    phone_number_country = "DE"
+
     # Admin contat, optional
     [contact]
     admins = [["AlekSIS - Admins", "root@example.com"]]
diff --git a/docs/conf.py b/docs/conf.py
index dab0f125dc0ba33126d36fc975a5c5bd4f0b91f8..3287243f133810dce0b9a34d65d4c9fb2913a89f 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -31,7 +31,7 @@ author = "The AlekSIS Team"
 # The short X.Y version
 version = "3.0"
 # The full version, including alpha/beta/rc tags
-release = "3.0.dev3"
+release = "3.0.1.dev0"
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/pyproject.toml b/pyproject.toml
index 6c6616fda401bcf8dfe63a91f81fd16f1416434c..f5f4f37bd1b7e4dfb02607cb9f3307d5cc942ef6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-Core"
-version = "3.0.dev3"
+version = "3.0.1.dev0"
 packages = [
     { include = "aleksis" }
 ]
@@ -40,7 +40,7 @@ keywords = ["SIS", "education", "school", "digitisation", "school apps"]
 classifiers = [
     "Development Status :: 5 - Production/Stable",
     "Environment :: Web Environment",
-    "Framework :: Django :: 4.0",
+    "Framework :: Django :: 4.1",
     "Intended Audience :: Developers",
     "Intended Audience :: Education",
     "Topic :: Education",
@@ -81,7 +81,7 @@ html2text = "^2020.0.0"
 django-ckeditor = "^6.0.0"
 calendarweek = "^0.5.0"
 Celery = {version="^5.2", extras=["django", "redis"]}
-django-celery-results = "^2.0.1"
+django-celery-results = "^2.5.1"
 django-celery-beat = "^2.2.0"
 django-celery-email = "^3.0.0"
 django-jsonstore = "^0.5.0"
@@ -100,13 +100,13 @@ django-favicon-plus-reloaded = "^1.1.5"
 django-health-check = "^3.12.1"
 psutil = "^5.7.0"
 celery-progress = "^0.1.0"
-django-cachalot = "^2.3.2"
+django-cachalot = "^2.5.3"
 django-prometheus = "^2.1.0"
 django-model-utils = "^4.0.0"
 bs4 = "^0.0.1"
 django-invitations = "^2.0.0"
 django-cleavejs = "^0.1.0"
-django-allauth = "^0.52.0"
+django-allauth = "^0.53.0"
 django-uwsgi-ng = "^2.0"
 django-extensions = "^3.1.1"
 ipython = "^8.0.0"
@@ -134,7 +134,7 @@ s3 = ["boto3", "django-storages"]
 sentry = ["sentry-sdk"]
 
 [tool.poetry.dev-dependencies]
-aleksis-builddeps = "*"
+aleksis-builddeps = {version=">=2023.1.dev0", allow-prereleases=true}
 uwsgi = "^2.0"
 
 [tool.poetry.scripts]