diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 2b030bab21f02faaa404bedbc4d93589fb54e9dc..1a7340fd9d033b40aa5f52df459b0c4315864e87 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,11 +9,38 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Changed
+~~~~~~~
+
+* Added a `Retry` button to the server error page
+
 Fixed
 ~~~~~
 
 * The ``reset password`` button on the login site used to overflow the card on smaller devices.
 
+`2.7.4`_ - 2022-02-09
+---------------------
+
+Changed
+~~~~~~~
+
+* Allow disabling query caching with cachalot
+* Add invitation key to success message when a person without e-mail address is invited by id
+
+Fixed
+~~~~~
+
+* Only exactly one person without e-mail address could be invited
+* No person was created and linked to the PersonInvitation object when invite by e-mail is used
+* No valid data in the second e-mail field of the signup form when it was disabled
+* Invitation options were displayed to superusers even when the feature was disabled
+* Inviting newly created persons for registration failed
+* Invited person was not displayed correctly in list of sent invitations
+* [Docker] Do not clear cache in migration container die to session invalidation issues
+* Notification email about user changes was broken
+* SQL cache invalidation could fail when hitting OOT database
+
 `2.7.3`_ - 2022-02-03
 ---------------------
 
@@ -735,3 +762,4 @@ Fixed
 .. _2.7.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.1
 .. _2.7.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.2
 .. _2.7.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.3
+.. _2.7.4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.4
diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 58bbba7f63869e1212c50ecd7131fdcd4e72999a..ef4184812f73d22bb1dcfa1ff84f74f722c3c774 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -18,6 +18,7 @@ from dj_cleavejs import CleaveWidget
 from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, Select2Widget
 from dynamic_preferences.forms import PreferenceForm
 from guardian.shortcuts import assign_perm
+from invitations.forms import InviteForm
 from material import Fieldset, Layout, Row
 
 from .mixins import ExtensibleForm, SchoolTermRelatedExtensibleForm
@@ -29,6 +30,7 @@ from .models import (
     GroupType,
     OAuthApplication,
     Person,
+    PersonInvitation,
     SchoolTerm,
 )
 from .registries import (
@@ -410,6 +412,31 @@ class InvitationCodeForm(forms.Form):
         self.fields["code"].widget = CleaveWidget(blocks=blocks, delimiter="-", uppercase=True)
 
 
+class PersonCreateInviteForm(InviteForm):
+    """Custom form to create a person and invite them."""
+
+    first_name = forms.CharField(label=_("First name"), required=True)
+    last_name = forms.CharField(label=_("Last name"), required=True)
+
+    layout = Layout(
+        Row("first_name", "last_name"),
+        Row("email"),
+    )
+
+    def clean_email(self):
+        if Person.objects.filter(email=self.cleaned_data["email"]).exists():
+            raise ValidationError(_("A person is using this e-mail address"))
+        return super().clean_email()
+
+    def save(self, email):
+        person = Person.objects.create(
+            first_name=self.cleaned_data["first_name"],
+            last_name=self.cleaned_data["last_name"],
+            email=email,
+        )
+        return PersonInvitation.create(email=email, person=person)
+
+
 class SelectPermissionForm(forms.Form):
     """Select a permission to assign."""
 
@@ -597,6 +624,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm):
 
             if person:
                 available_fields = [field.name for field in Person._meta.get_fields()]
+                self.fields["email2"].initial = person.email
                 for field in self.fields:
                     if field in available_fields and getattr(person, field):
                         self.fields[field].disabled = True
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po
index 639948d3fae74fb482f0919b2d67f3162378c6ee..a382635f245835c9c747b72cb4b661bd39eb7e04 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: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
@@ -38,7 +38,7 @@ msgstr ""
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265
 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:250
@@ -99,145 +99,157 @@ msgstr ""
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/forms.py:48 aleksis/core/forms.py:554
+#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:53
+#: aleksis/core/forms.py:55
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:54 aleksis/core/forms.py:563
+#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:56
+#: aleksis/core/forms.py:58
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:130
+#: aleksis/core/forms.py:132
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:134
+#: aleksis/core/forms.py:136
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:151 aleksis/core/models.py:130
+#: aleksis/core/forms.py:153 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:152
+#: aleksis/core/forms.py:154
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/forms.py:205
+#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: aleksis/core/menus.py:254 aleksis/core/models.py:153
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:154 aleksis/core/forms.py:565
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:155 aleksis/core/models.py:206
+#: aleksis/core/forms.py:157 aleksis/core/models.py:206
 #: aleksis/core/models.py:514
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:197 aleksis/core/forms.py:200
+#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:73
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:198 aleksis/core/forms.py:201
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:231
+#: aleksis/core/forms.py:233
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:234
+#: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:235
+#: aleksis/core/forms.py:237
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:274
+#: aleksis/core/forms.py:276
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:278
+#: aleksis/core/forms.py:280
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:398
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:397
+#: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:429
+#: aleksis/core/forms.py:418 aleksis/core/models.py:181
+msgid "First name"
+msgstr ""
+
+#: aleksis/core/forms.py:419 aleksis/core/models.py:182
+msgid "Last name"
+msgstr ""
+
+#: aleksis/core/forms.py:428
+msgid "A person is using this e-mail address"
+msgstr ""
+
+#: aleksis/core/forms.py:456
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:430
+#: aleksis/core/forms.py:457
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:483
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:459
+#: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:467
+#: aleksis/core/forms.py:494
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:472
+#: aleksis/core/forms.py:499
 msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
-#: aleksis/core/forms.py:559
+#: aleksis/core/forms.py:586
 msgid "Adress data"
 msgstr ""
 
-#: aleksis/core/forms.py:571
+#: aleksis/core/forms.py:598
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:578
+#: aleksis/core/forms.py:605
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:581
+#: aleksis/core/forms.py:608
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:747
+#: aleksis/core/forms.py:775
 msgid "No valid selection."
 msgstr ""
 
@@ -267,7 +279,7 @@ msgstr ""
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20
+#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
@@ -522,18 +534,10 @@ msgstr ""
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:178 aleksis/core/models.py:1219
+#: aleksis/core/models.py:178 aleksis/core/models.py:1227
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:181
-msgid "First name"
-msgstr ""
-
-#: aleksis/core/models.py:182
-msgid "Last name"
-msgstr ""
-
 #: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
@@ -822,7 +826,7 @@ msgstr ""
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1026 aleksis/core/models.py:1266
+#: aleksis/core/models.py:1026 aleksis/core/models.py:1274
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
@@ -911,55 +915,55 @@ msgstr ""
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1169
+#: aleksis/core/models.py:1177
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1173
+#: aleksis/core/models.py:1181
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1175
+#: aleksis/core/models.py:1183
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1177
+#: aleksis/core/models.py:1185
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1192
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1193
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1190
+#: aleksis/core/models.py:1198
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1193
+#: aleksis/core/models.py:1201
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1205
+#: aleksis/core/models.py:1213
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1206
+#: aleksis/core/models.py:1214
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1222
+#: aleksis/core/models.py:1230
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1260
+#: aleksis/core/models.py:1268
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1270
+#: aleksis/core/models.py:1278
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
@@ -1155,11 +1159,11 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:526
+#: aleksis/core/settings.py:529
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:527
+#: aleksis/core/settings.py:530
 msgid "German"
 msgstr ""
 
@@ -1173,14 +1177,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
-#: aleksis/core/tables.py:137
+#: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
-#: aleksis/core/tables.py:135
+#: aleksis/core/tables.py:136
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -2177,6 +2181,22 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
+#: aleksis/core/templates/invitations/disabled.html:5
+msgid "The invite feature is disabled"
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:13
+msgid "The invite feature is disabled."
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:15
+msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:16
+msgid "site preferences page"
+msgstr ""
+
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
 msgstr ""
@@ -2555,17 +2575,17 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:3
+#: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:6
+#: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:14
+#: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
 msgid ""
 "\n"
@@ -2965,148 +2985,148 @@ msgstr ""
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:414
+#: aleksis/core/views.py:417
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:433 aleksis/core/views.py:443
+#: aleksis/core/views.py:436 aleksis/core/views.py:446
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:493
+#: aleksis/core/views.py:496
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:590
+#: aleksis/core/views.py:593
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:606
+#: aleksis/core/views.py:609
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:674
+#: aleksis/core/views.py:677
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:693
+#: aleksis/core/views.py:696
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:717
+#: aleksis/core/views.py:720
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:734
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:763
+#: aleksis/core/views.py:766
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:797
+#: aleksis/core/views.py:800
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:825
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:852
+#: aleksis/core/views.py:855
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:885
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:886
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:904
+#: aleksis/core/views.py:907
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:914
+#: aleksis/core/views.py:917
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:949
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:976
+#: aleksis/core/views.py:979
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:986
+#: aleksis/core/views.py:989
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1060
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1059
+#: aleksis/core/views.py:1062
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1129
+#: aleksis/core/views.py:1138
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1220
+#: aleksis/core/views.py:1229
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1230
+#: aleksis/core/views.py:1239
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1240
+#: aleksis/core/views.py:1249
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1250
+#: aleksis/core/views.py:1259
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1260
+#: aleksis/core/views.py:1269
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1328
+#: aleksis/core/views.py:1337
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1337 aleksis/core/views.py:1341
+#: aleksis/core/views.py:1346 aleksis/core/views.py:1350
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1379
+#: aleksis/core/views.py:1388
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1386
+#: aleksis/core/views.py:1395
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1445
-msgid "Person was invited successfully."
+#: aleksis/core/views.py:1466
+msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1447
+#: aleksis/core/views.py:1477
 msgid "Person was already invited."
 msgstr ""
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
index 590f5ff9ab6b78cb5ebbc5738c367994cfd58aac..8a53fc2fc168227f37f344c17ae359b5d5764596 100644
--- a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
index d3dc00144fe56aebf7c76d7597bae467d0ddbadd..56ff3ab652cb345ae714d6b1eb8b54e7ae5f27a2 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
-"PO-Revision-Date: 2022-01-31 16:15+0000\n"
-"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\n"
+"PO-Revision-Date: 2022-02-08 23:24+0000\n"
+"Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/"
 "aleksis-core/de/>\n"
 "Language: de_DE\n"
@@ -25,7 +25,7 @@ msgstr "OpenID-Connect-Scope"
 
 #: aleksis/core/apps.py:167
 msgid "Given name, family name, link to profile and picture if existing."
-msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden"
+msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden."
 
 #: aleksis/core/apps.py:168
 msgid "Full home postal address"
@@ -39,7 +39,7 @@ msgstr "E-Mail-Adresse"
 msgid "Home and mobile phone"
 msgstr "Festnetz- und Mobilfunknummer"
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265
 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:250
@@ -100,145 +100,157 @@ msgstr "Benutzer"
 msgid "Group"
 msgstr "Gruppe"
 
-#: aleksis/core/forms.py:48 aleksis/core/forms.py:554
+#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
 msgstr "Basisdaten"
 
-#: aleksis/core/forms.py:53
+#: aleksis/core/forms.py:55
 msgid "Address"
 msgstr "Adresse"
 
-#: aleksis/core/forms.py:54 aleksis/core/forms.py:563
+#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 msgid "Contact data"
 msgstr "Kontaktdaten"
 
-#: aleksis/core/forms.py:56
+#: aleksis/core/forms.py:58
 msgid "Advanced personal data"
 msgstr "Zusätzliche persönliche Daten"
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "New user"
 msgstr "Neuer Benutzer"
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "Create a new account"
 msgstr "Neues Benutzerkonto erstellen"
 
-#: aleksis/core/forms.py:130
+#: aleksis/core/forms.py:132
 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."
 
-#: aleksis/core/forms.py:134
+#: aleksis/core/forms.py:136
 msgid "This username is already in use."
 msgstr "Dieser Benutzername wird bereits genutzt."
 
-#: aleksis/core/forms.py:151 aleksis/core/models.py:130
+#: aleksis/core/forms.py:153 aleksis/core/models.py:130
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/core/forms.py:152
+#: aleksis/core/forms.py:154
 msgid "Common data"
 msgstr "Allgemeine Daten"
 
-#: aleksis/core/forms.py:153 aleksis/core/forms.py:205
+#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: aleksis/core/menus.py:254 aleksis/core/models.py:153
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "Personen"
 
-#: aleksis/core/forms.py:154 aleksis/core/forms.py:565
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 msgid "Additional data"
 msgstr "Zusätzliche Datne"
 
-#: aleksis/core/forms.py:155 aleksis/core/models.py:206
+#: aleksis/core/forms.py:157 aleksis/core/models.py:206
 #: aleksis/core/models.py:514
 msgid "Photo"
 msgstr "Foto"
 
-#: aleksis/core/forms.py:197 aleksis/core/forms.py:200
+#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:73
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/core/forms.py:198 aleksis/core/forms.py:201
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:81
 msgid "Time"
 msgstr "Zeit"
 
-#: aleksis/core/forms.py:231
+#: aleksis/core/forms.py:233
 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:234
+#: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
 msgstr "Wer soll die Ankündigung sehen?"
 
-#: aleksis/core/forms.py:235
+#: aleksis/core/forms.py:237
 msgid "Write your announcement:"
 msgstr "Schreiben Sie ihre Ankündigung:"
 
-#: aleksis/core/forms.py:274
+#: 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:278
+#: aleksis/core/forms.py:280
 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."
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
 msgstr "Sie benötigen mindestens einen Empfänger."
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:398
 msgid "Invitation code"
 msgstr "Einladungscode"
 
-#: aleksis/core/forms.py:397
+#: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
 msgstr "Bitte geben Sie Ihren Einladungscode ein."
 
-#: aleksis/core/forms.py:429
+#: aleksis/core/forms.py:418 aleksis/core/models.py:181
+msgid "First name"
+msgstr "Vorname"
+
+#: aleksis/core/forms.py:419 aleksis/core/models.py:182
+msgid "Last name"
+msgstr "Nachname"
+
+#: aleksis/core/forms.py:428
+msgid "A person is using this e-mail address"
+msgstr "Eine Person nutzt diese E-Mail-Adresse"
+
+#: aleksis/core/forms.py:456
 msgid "Who should get the permission?"
 msgstr "Wer soll die Berechtigung erhalten?"
 
-#: aleksis/core/forms.py:430
+#: aleksis/core/forms.py:457
 msgid "On what?"
 msgstr "Auf was?"
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:483
 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:"
 
-#: aleksis/core/forms.py:459
+#: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
 msgstr "Vergebe die Berechtigung für alle Objekte"
 
-#: aleksis/core/forms.py:467
+#: 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:472
+#: aleksis/core/forms.py:499
 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."
 
-#: aleksis/core/forms.py:559
+#: aleksis/core/forms.py:586
 msgid "Adress data"
 msgstr "Adressdaten"
 
-#: aleksis/core/forms.py:571
+#: aleksis/core/forms.py:598
 msgid "Account data"
 msgstr "Kontodaten"
 
-#: aleksis/core/forms.py:578
+#: aleksis/core/forms.py:605
 msgid "Password"
 msgstr "Passwort"
 
-#: aleksis/core/forms.py:581
+#: aleksis/core/forms.py:608
 msgid "Password (again)"
 msgstr "Passwort wiederholen"
 
-#: aleksis/core/forms.py:747
+#: aleksis/core/forms.py:775
 msgid "No valid selection."
 msgstr "Keine gültige Auswahl."
 
@@ -268,7 +280,7 @@ msgstr "Kein Backupergebnis gefunden!"
 msgid "Login"
 msgstr "Anmelden"
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20
+#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr "Registrieren"
@@ -523,18 +535,10 @@ msgstr "weiblich"
 msgid "male"
 msgstr "männlich"
 
-#: aleksis/core/models.py:178 aleksis/core/models.py:1219
+#: aleksis/core/models.py:178 aleksis/core/models.py:1227
 msgid "Linked user"
 msgstr "Verknüpfter Benutzer"
 
-#: aleksis/core/models.py:181
-msgid "First name"
-msgstr "Vorname"
-
-#: aleksis/core/models.py:182
-msgid "Last name"
-msgstr "Nachname"
-
 #: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr "Zusätzliche Namen"
@@ -823,7 +827,7 @@ msgstr "Benutzerdefinierte Menüs"
 msgid "Menu"
 msgstr "Menü"
 
-#: aleksis/core/models.py:1026 aleksis/core/models.py:1266
+#: aleksis/core/models.py:1026 aleksis/core/models.py:1274
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Symbol"
@@ -912,55 +916,55 @@ msgstr "Kann Datenprüfungsprobleme lösen"
 msgid "E-Mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:1169
+#: aleksis/core/models.py:1177
 msgid "Owner"
 msgstr "Leiter"
 
-#: aleksis/core/models.py:1173
+#: aleksis/core/models.py:1181
 msgid "File expires at"
 msgstr "Datei abgelaufen am"
 
-#: aleksis/core/models.py:1175
+#: aleksis/core/models.py:1183
 msgid "Generated HTML file"
 msgstr "Generierte HTML-Datei"
 
-#: aleksis/core/models.py:1177
+#: aleksis/core/models.py:1185
 msgid "Generated PDF file"
 msgstr "Generierte PDF-Datei"
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1192
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1193
 msgid "PDF files"
 msgstr "PDF-Dateien"
 
-#: aleksis/core/models.py:1190
+#: aleksis/core/models.py:1198
 msgid "Task result"
 msgstr "Task-Ergebnis"
 
-#: aleksis/core/models.py:1193
+#: aleksis/core/models.py:1201
 msgid "Task user"
 msgstr "Task-Benutzer"
 
-#: aleksis/core/models.py:1205
+#: aleksis/core/models.py:1213
 msgid "Task user assignment"
 msgstr "Task-Benutzer-Zuordnung"
 
-#: aleksis/core/models.py:1206
+#: aleksis/core/models.py:1214
 msgid "Task user assignments"
 msgstr "Task-Benutzer-Zuordnungen"
 
-#: aleksis/core/models.py:1222
+#: aleksis/core/models.py:1230
 msgid "Additional attributes"
 msgstr "Zusätzliche Attribute"
 
-#: aleksis/core/models.py:1260
+#: aleksis/core/models.py:1268
 msgid "Allowed scopes that clients can request"
 msgstr "Erlaubte Scopes, die ein Client anfordern kann"
 
-#: aleksis/core/models.py:1270
+#: aleksis/core/models.py:1278
 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."
 
@@ -1156,11 +1160,11 @@ msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganze
 msgid "Country for phone number parsing"
 msgstr "Land für das Einlesen von Telefonnummern"
 
-#: aleksis/core/settings.py:526
+#: aleksis/core/settings.py:529
 msgid "English"
 msgstr "Englisch"
 
-#: aleksis/core/settings.py:527
+#: aleksis/core/settings.py:530
 msgid "German"
 msgstr "Deutsch"
 
@@ -1174,14 +1178,14 @@ msgid "Edit"
 msgstr "Bearbeiten"
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
-#: aleksis/core/tables.py:137
+#: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr "Aktionen"
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
-#: aleksis/core/tables.py:135
+#: aleksis/core/tables.py:136
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -2323,6 +2327,24 @@ msgstr "Einstellungen für %(instance)s"
 msgid "Save preferences"
 msgstr "Einstellungen speichern"
 
+#: aleksis/core/templates/invitations/disabled.html:5
+msgid "The invite feature is disabled"
+msgstr "Die Einladungsfunktion ist deaktiviert"
+
+#: aleksis/core/templates/invitations/disabled.html:13
+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 "
+
+#: aleksis/core/templates/invitations/disabled.html:16
+msgid "site preferences page"
+msgstr "Seiteneinstellungen"
+
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
 msgstr "Ihre Einladung akzeptieren"
@@ -2742,17 +2764,17 @@ msgstr ""
 "            Von %(trans_sender)s um %(trans_created_at)s\n"
 "        "
 
-#: aleksis/core/templates/templated_email/person_changed.email:3
+#: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
 msgstr "%(person)s hat Daten verändert!"
 
-#: aleksis/core/templates/templated_email/person_changed.email:6
+#: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
 msgstr "die Person %(person)s hat kürzlich die folgenden Felder geändert:"
 
-#: aleksis/core/templates/templated_email/person_changed.email:14
+#: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
 msgid ""
 "\n"
@@ -3255,152 +3277,157 @@ msgstr "Das Schuljahr wurde erstellt."
 msgid "The school term has been saved."
 msgstr "Das Schuljahr wurde gespeichert."
 
-#: aleksis/core/views.py:414
+#: aleksis/core/views.py:417
 msgid "The child groups were successfully saved."
 msgstr "Die Untergruppen wurden gespeichert."
 
-#: aleksis/core/views.py:433 aleksis/core/views.py:443
+#: aleksis/core/views.py:436 aleksis/core/views.py:446
 msgid "The person has been saved."
 msgstr "Die Person wurde gespeichert."
 
-#: aleksis/core/views.py:493
+#: aleksis/core/views.py:496
 msgid "The group has been saved."
 msgstr "Die Gruppe wurde gespeichert."
 
-#: aleksis/core/views.py:590
+#: aleksis/core/views.py:593
 msgid "The announcement has been saved."
 msgstr "Die Ankündigung wurde gespeichert."
 
-#: aleksis/core/views.py:606
+#: aleksis/core/views.py:609
 msgid "The announcement has been deleted."
 msgstr "Ankündigung wurde gelöscht."
 
-#: aleksis/core/views.py:674
+#: aleksis/core/views.py:677
 msgid "The requested preference registry does not exist"
 msgstr "Das angeforderte Einstellungsregister existiert nicht"
 
-#: aleksis/core/views.py:693
+#: aleksis/core/views.py:696
 msgid "The preferences have been saved successfully."
 msgstr "Die Einstellungen wurde gespeichert."
 
-#: aleksis/core/views.py:717
+#: aleksis/core/views.py:720
 msgid "The person has been deleted."
 msgstr "Die Person wurde gelöscht."
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:734
 msgid "The group has been deleted."
 msgstr "Die Gruppe wurde gelöscht."
 
-#: aleksis/core/views.py:763
+#: aleksis/core/views.py:766
 msgid "The additional_field has been saved."
 msgstr "Das zusätzliche Feld wurde gespeichert."
 
-#: aleksis/core/views.py:797
+#: aleksis/core/views.py:800
 msgid "The additional field has been deleted."
 msgstr "Das zusätzliche Feld wurde gelöscht."
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:825
 msgid "The group type has been saved."
 msgstr "Der Gruppentyp wurde gespeichert."
 
-#: aleksis/core/views.py:852
+#: aleksis/core/views.py:855
 msgid "The group type has been deleted."
 msgstr "Der Gruppentyp wurde gelöscht."
 
-#: aleksis/core/views.py:885
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr "Fortschritt: Datenprüfungen ausführen"
 
-#: aleksis/core/views.py:886
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr "Datenprüfungen laufen …"
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt."
 
-#: aleksis/core/views.py:888
+#: 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:904
+#: aleksis/core/views.py:907
 #, 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:914
+#: aleksis/core/views.py:917
 msgid "The requested solve option does not exist"
 msgstr "Die angeforderte Lösungsoption existiert nicht"
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:949
 msgid "The dashboard widget has been saved."
 msgstr "Das Dashboard-Widget wurde gespeichert."
 
-#: aleksis/core/views.py:976
+#: aleksis/core/views.py:979
 msgid "The dashboard widget has been created."
 msgstr "Das Dashboard-Widget wurde erstellt."
 
-#: aleksis/core/views.py:986
+#: aleksis/core/views.py:989
 msgid "The dashboard widget has been deleted."
 msgstr "Das Dashboard-Widget wurde gelöscht."
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1060
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1059
+#: aleksis/core/views.py:1062
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1129
+#: aleksis/core/views.py:1138
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr "Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}"
 
-#: aleksis/core/views.py:1220
+#: aleksis/core/views.py:1229
 msgid "We have successfully assigned the permissions."
 msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen."
 
-#: aleksis/core/views.py:1230
+#: aleksis/core/views.py:1239
 msgid "The global user permission has been deleted."
 msgstr "Die globale Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1240
+#: aleksis/core/views.py:1249
 msgid "The global group permission has been deleted."
 msgstr "Die globale Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1250
+#: aleksis/core/views.py:1259
 msgid "The object user permission has been deleted."
 msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1260
+#: aleksis/core/views.py:1269
 msgid "The object group permission has been deleted."
 msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1328
+#: aleksis/core/views.py:1337
 msgid "The requested PDF file does not exist"
 msgstr "Die angeforderte PDF-Datei existiert nicht"
 
-#: aleksis/core/views.py:1337 aleksis/core/views.py:1341
+#: aleksis/core/views.py:1346 aleksis/core/views.py:1350
 msgid "The requested task does not exist or is not accessible"
 msgstr "Der angeforderte Task existiert nicht oder ist nicht abrufbar"
 
-#: aleksis/core/views.py:1379
+#: aleksis/core/views.py:1388
 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:1386
+#: aleksis/core/views.py:1395
 msgid "The third-party account has been successfully disconnected."
 msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 
-#: aleksis/core/views.py:1445
-msgid "Person was invited successfully."
-msgstr "Person wurde erfolgreich eingeladen."
+#: aleksis/core/views.py:1466
+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:1447
+#: aleksis/core/views.py:1477
 msgid "Person was already invited."
 msgstr "Person wurde bereits eingeladen."
 
+#~ msgid "Person was invited successfully."
+#~ msgstr "Person wurde erfolgreich eingeladen."
+
 #, python-brace-format
 #~ msgid "Last backup {time_gone_since_backup}!"
 #~ msgstr "Letztes Backup: {time_gone_since_backup}!"
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
index 8ff775a37b0165883f3c2b0f3ff393c1478fd510..376788f8a7ea941b89dff0620fdbc78a40c106a5 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\n"
 "PO-Revision-Date: 2021-10-28 14:37+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core-js/de/>\n"
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po
index f6af991023e49cc6e460b705e34b730af558f233..ac9b5f99c721e75f4dd0e5bf94368eaee2c7867f 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: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
@@ -40,7 +40,7 @@ msgstr "Détails de contact"
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265
 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:250
@@ -105,53 +105,53 @@ msgstr ""
 msgid "Group"
 msgstr "groupe"
 
-#: aleksis/core/forms.py:48 aleksis/core/forms.py:554
+#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:53
+#: aleksis/core/forms.py:55
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:54 aleksis/core/forms.py:563
+#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 #, fuzzy
 #| msgid "Contact details"
 msgid "Contact data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:56
+#: aleksis/core/forms.py:58
 #, fuzzy
 #| msgid "Contact details"
 msgid "Advanced personal data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:130
+#: aleksis/core/forms.py:132
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:134
+#: aleksis/core/forms.py:136
 msgid "This username is already in use."
 msgstr "Cet nom est deja en utilisation."
 
-#: aleksis/core/forms.py:151 aleksis/core/models.py:130
+#: aleksis/core/forms.py:153 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:152
+#: aleksis/core/forms.py:154
 #, fuzzy
 #| msgid "Contact details"
 msgid "Common data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:153 aleksis/core/forms.py:205
+#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: aleksis/core/menus.py:254 aleksis/core/models.py:153
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
@@ -160,102 +160,114 @@ msgstr "Détails de contact"
 msgid "Persons"
 msgstr "Personne"
 
-#: aleksis/core/forms.py:154 aleksis/core/forms.py:565
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:155 aleksis/core/models.py:206
+#: aleksis/core/forms.py:157 aleksis/core/models.py:206
 #: aleksis/core/models.py:514
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:197 aleksis/core/forms.py:200
+#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:73
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/core/forms.py:198 aleksis/core/forms.py:201
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:231
+#: aleksis/core/forms.py:233
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:234
+#: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:235
+#: aleksis/core/forms.py:237
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:274
+#: aleksis/core/forms.py:276
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:278
+#: aleksis/core/forms.py:280
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:398
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:397
+#: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:429
+#: aleksis/core/forms.py:418 aleksis/core/models.py:181
+msgid "First name"
+msgstr "Prénom"
+
+#: aleksis/core/forms.py:419 aleksis/core/models.py:182
+msgid "Last name"
+msgstr "Nom de famille"
+
+#: aleksis/core/forms.py:428
+msgid "A person is using this e-mail address"
+msgstr ""
+
+#: aleksis/core/forms.py:456
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:430
+#: aleksis/core/forms.py:457
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:483
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:459
+#: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:467
+#: aleksis/core/forms.py:494
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:472
+#: aleksis/core/forms.py:499
 msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
-#: aleksis/core/forms.py:559
+#: aleksis/core/forms.py:586
 msgid "Adress data"
 msgstr ""
 
-#: aleksis/core/forms.py:571
+#: aleksis/core/forms.py:598
 #, fuzzy
 #| msgid "Contact details"
 msgid "Account data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:578
+#: aleksis/core/forms.py:605
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:581
+#: aleksis/core/forms.py:608
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:747
+#: aleksis/core/forms.py:775
 msgid "No valid selection."
 msgstr ""
 
@@ -285,7 +297,7 @@ msgstr ""
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20
+#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
@@ -558,18 +570,10 @@ msgstr ""
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:178 aleksis/core/models.py:1219
+#: aleksis/core/models.py:178 aleksis/core/models.py:1227
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:181
-msgid "First name"
-msgstr "Prénom"
-
-#: aleksis/core/models.py:182
-msgid "Last name"
-msgstr "Nom de famille"
-
 #: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
@@ -866,7 +870,7 @@ msgstr ""
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1026 aleksis/core/models.py:1266
+#: aleksis/core/models.py:1026 aleksis/core/models.py:1274
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
@@ -965,59 +969,59 @@ msgstr ""
 msgid "E-Mail address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1169
+#: aleksis/core/models.py:1177
 #, fuzzy
 #| msgid "Owners"
 msgid "Owner"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:1173
+#: aleksis/core/models.py:1181
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1175
+#: aleksis/core/models.py:1183
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1177
+#: aleksis/core/models.py:1185
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1192
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1193
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1190
+#: aleksis/core/models.py:1198
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1193
+#: aleksis/core/models.py:1201
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1205
+#: aleksis/core/models.py:1213
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1206
+#: aleksis/core/models.py:1214
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1222
+#: aleksis/core/models.py:1230
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional attributes"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1260
+#: aleksis/core/models.py:1268
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1270
+#: aleksis/core/models.py:1278
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
@@ -1221,11 +1225,11 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:526
+#: aleksis/core/settings.py:529
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:527
+#: aleksis/core/settings.py:530
 msgid "German"
 msgstr ""
 
@@ -1239,14 +1243,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
-#: aleksis/core/tables.py:137
+#: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
-#: aleksis/core/tables.py:135
+#: aleksis/core/tables.py:136
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -2261,6 +2265,22 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
+#: aleksis/core/templates/invitations/disabled.html:5
+msgid "The invite feature is disabled"
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:13
+msgid "The invite feature is disabled."
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:15
+msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:16
+msgid "site preferences page"
+msgstr ""
+
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
 msgstr ""
@@ -2656,17 +2676,17 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:3
+#: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:6
+#: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:14
+#: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
 msgid ""
 "\n"
@@ -3063,149 +3083,149 @@ msgstr ""
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:414
+#: aleksis/core/views.py:417
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:433 aleksis/core/views.py:443
+#: aleksis/core/views.py:436 aleksis/core/views.py:446
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:493
+#: aleksis/core/views.py:496
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:590
+#: aleksis/core/views.py:593
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:606
+#: aleksis/core/views.py:609
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:674
+#: aleksis/core/views.py:677
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:693
+#: aleksis/core/views.py:696
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:717
+#: aleksis/core/views.py:720
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:734
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:763
+#: aleksis/core/views.py:766
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:797
+#: aleksis/core/views.py:800
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:825
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:852
+#: aleksis/core/views.py:855
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:885
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:886
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:904
+#: aleksis/core/views.py:907
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:914
+#: aleksis/core/views.py:917
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:949
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:976
+#: aleksis/core/views.py:979
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:986
+#: aleksis/core/views.py:989
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1060
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1059
+#: aleksis/core/views.py:1062
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1129
+#: aleksis/core/views.py:1138
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1220
+#: aleksis/core/views.py:1229
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1230
+#: aleksis/core/views.py:1239
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1240
+#: aleksis/core/views.py:1249
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1250
+#: aleksis/core/views.py:1259
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1260
+#: aleksis/core/views.py:1269
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1328
+#: aleksis/core/views.py:1337
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1337 aleksis/core/views.py:1341
+#: aleksis/core/views.py:1346 aleksis/core/views.py:1350
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1379
+#: aleksis/core/views.py:1388
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1386
+#: aleksis/core/views.py:1395
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1445
-msgid "Person was invited successfully."
+#: aleksis/core/views.py:1466
+msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1447
+#: aleksis/core/views.py:1477
 #, fuzzy
 #| msgid "This username is already in use."
 msgid "Person was already invited."
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
index bcaf32c82d64028ea3c98b6a83b591efd6c44e9b..9f07be2903046e41680c481bea659aa95b695df7 100644
--- a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po
index 42102a24126b6d5d152efc1b08140f00b93a45f5..4b2afb73bbbc2fd8a426789859152fa2d1895395 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: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
@@ -44,7 +44,7 @@ msgstr "Inscriptio electronica"
 msgid "Home and mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265
 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:250
@@ -109,159 +109,173 @@ msgstr ""
 msgid "Group"
 msgstr "Grex"
 
-#: aleksis/core/forms.py:48 aleksis/core/forms.py:554
+#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:53
+#: aleksis/core/forms.py:55
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:54 aleksis/core/forms.py:563
+#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:56
+#: aleksis/core/forms.py:58
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Create a new account"
 msgstr "Personae et computi"
 
-#: aleksis/core/forms.py:130
+#: aleksis/core/forms.py:132
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:134
+#: aleksis/core/forms.py:136
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:151 aleksis/core/models.py:130
+#: aleksis/core/forms.py:153 aleksis/core/models.py:130
 msgid "School term"
 msgstr "Anus scolae"
 
-#: aleksis/core/forms.py:152
+#: aleksis/core/forms.py:154
 #, fuzzy
 #| msgid "Data management"
 msgid "Common data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:153 aleksis/core/forms.py:205
+#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: aleksis/core/menus.py:254 aleksis/core/models.py:153
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "personae"
 
-#: aleksis/core/forms.py:154 aleksis/core/forms.py:565
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional data"
 msgstr "addita nomines"
 
-#: aleksis/core/forms.py:155 aleksis/core/models.py:206
+#: aleksis/core/forms.py:157 aleksis/core/models.py:206
 #: aleksis/core/models.py:514
 msgid "Photo"
 msgstr "Photographia"
 
-#: aleksis/core/forms.py:197 aleksis/core/forms.py:200
+#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:73
 msgid "Date"
 msgstr "dies"
 
-#: aleksis/core/forms.py:198 aleksis/core/forms.py:201
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:81
 msgid "Time"
 msgstr "tempus"
 
-#: aleksis/core/forms.py:231
+#: aleksis/core/forms.py:233
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:234
+#: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
 msgstr "Quis nuntium videatne?"
 
-#: aleksis/core/forms.py:235
+#: aleksis/core/forms.py:237
 msgid "Write your announcement:"
 msgstr "Scribe nuntium:"
 
-#: aleksis/core/forms.py:274
+#: aleksis/core/forms.py:276
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:278
+#: aleksis/core/forms.py:280
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:398
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:397
+#: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:429
+#: aleksis/core/forms.py:418 aleksis/core/models.py:181
+msgid "First name"
+msgstr "Primus nomen"
+
+#: aleksis/core/forms.py:419 aleksis/core/models.py:182
+msgid "Last name"
+msgstr "Secondus nomen"
+
+#: aleksis/core/forms.py:428
+#, fuzzy
+#| msgid "E-mail address"
+msgid "A person is using this e-mail address"
+msgstr "Inscriptio electronica"
+
+#: aleksis/core/forms.py:456
 #, fuzzy
 #| msgid "Who should see the announcement?"
 msgid "Who should get the permission?"
 msgstr "Quis nuntium videatne?"
 
-#: aleksis/core/forms.py:430
+#: aleksis/core/forms.py:457
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:483
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:459
+#: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:467
+#: aleksis/core/forms.py:494
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:472
+#: aleksis/core/forms.py:499
 msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
-#: aleksis/core/forms.py:559
+#: aleksis/core/forms.py:586
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Adress data"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:571
+#: aleksis/core/forms.py:598
 #, fuzzy
 #| msgid "Data management"
 msgid "Account data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:578
+#: aleksis/core/forms.py:605
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:581
+#: aleksis/core/forms.py:608
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:747
+#: aleksis/core/forms.py:775
 msgid "No valid selection."
 msgstr ""
 
@@ -293,7 +307,7 @@ msgstr ""
 msgid "Login"
 msgstr "nomen profiteri"
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20
+#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
@@ -584,18 +598,10 @@ msgstr "femininum"
 msgid "male"
 msgstr "maskulinum"
 
-#: aleksis/core/models.py:178 aleksis/core/models.py:1219
+#: aleksis/core/models.py:178 aleksis/core/models.py:1227
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:181
-msgid "First name"
-msgstr "Primus nomen"
-
-#: aleksis/core/models.py:182
-msgid "Last name"
-msgstr "Secondus nomen"
-
 #: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr "addita nomines"
@@ -920,7 +926,7 @@ msgstr ""
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1026 aleksis/core/models.py:1266
+#: aleksis/core/models.py:1026 aleksis/core/models.py:1274
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Nota"
@@ -1023,57 +1029,57 @@ msgstr ""
 msgid "E-Mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:1169
+#: aleksis/core/models.py:1177
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1173
+#: aleksis/core/models.py:1181
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1175
+#: aleksis/core/models.py:1183
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1177
+#: aleksis/core/models.py:1185
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1192
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1193
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1190
+#: aleksis/core/models.py:1198
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1193
+#: aleksis/core/models.py:1201
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1205
+#: aleksis/core/models.py:1213
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1206
+#: aleksis/core/models.py:1214
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1222
+#: aleksis/core/models.py:1230
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional attributes"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1260
+#: aleksis/core/models.py:1268
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1270
+#: aleksis/core/models.py:1278
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
@@ -1285,11 +1291,11 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:526
+#: aleksis/core/settings.py:529
 msgid "English"
 msgstr "Britannicus"
 
-#: aleksis/core/settings.py:527
+#: aleksis/core/settings.py:530
 msgid "German"
 msgstr "Germanus"
 
@@ -1303,7 +1309,7 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
-#: aleksis/core/tables.py:137
+#: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 #, fuzzy
 #| msgid "Notifications"
@@ -1312,7 +1318,7 @@ msgstr "Nuntii"
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
-#: aleksis/core/tables.py:135
+#: aleksis/core/tables.py:136
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -2373,6 +2379,22 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
+#: aleksis/core/templates/invitations/disabled.html:5
+msgid "The invite feature is disabled"
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:13
+msgid "The invite feature is disabled."
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:15
+msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:16
+msgid "site preferences page"
+msgstr ""
+
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
 msgstr ""
@@ -2781,17 +2803,17 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:3
+#: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:6
+#: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:14
+#: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
 msgid ""
 "\n"
@@ -3188,151 +3210,151 @@ msgstr ""
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:414
+#: aleksis/core/views.py:417
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:433 aleksis/core/views.py:443
+#: aleksis/core/views.py:436 aleksis/core/views.py:446
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:493
+#: aleksis/core/views.py:496
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:590
+#: aleksis/core/views.py:593
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:606
+#: aleksis/core/views.py:609
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:674
+#: aleksis/core/views.py:677
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:693
+#: aleksis/core/views.py:696
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:717
+#: aleksis/core/views.py:720
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:734
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:763
+#: aleksis/core/views.py:766
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:797
+#: aleksis/core/views.py:800
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:825
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:852
+#: aleksis/core/views.py:855
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:885
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:886
+#: aleksis/core/views.py:889
 #, fuzzy
 #| msgid "System status"
 msgid "Run data checks …"
 msgstr "Status systemae"
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:904
+#: aleksis/core/views.py:907
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:914
+#: aleksis/core/views.py:917
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:949
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:976
+#: aleksis/core/views.py:979
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:986
+#: aleksis/core/views.py:989
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1060
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1059
+#: aleksis/core/views.py:1062
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1129
+#: aleksis/core/views.py:1138
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1220
+#: aleksis/core/views.py:1229
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1230
+#: aleksis/core/views.py:1239
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1240
+#: aleksis/core/views.py:1249
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1250
+#: aleksis/core/views.py:1259
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1260
+#: aleksis/core/views.py:1269
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1328
+#: aleksis/core/views.py:1337
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1337 aleksis/core/views.py:1341
+#: aleksis/core/views.py:1346 aleksis/core/views.py:1350
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1379
+#: aleksis/core/views.py:1388
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1386
+#: aleksis/core/views.py:1395
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1445
-msgid "Person was invited successfully."
+#: aleksis/core/views.py:1466
+msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1447
+#: aleksis/core/views.py:1477
 msgid "Person was already invited."
 msgstr ""
 
diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
index 427b5fbc842fe8bbbc70d795633af5070b404ec7..dfec73c5c894d3d686092593be9c21a811cd0535 100644
--- a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
index 249af254d7bb7b5d21874acf1a8e96798066594e..ab1f6b974dc48a296d3eead2faacea0232b1461d 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: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
@@ -37,7 +37,7 @@ msgstr ""
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265
 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:250
@@ -98,145 +98,157 @@ msgstr ""
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/forms.py:48 aleksis/core/forms.py:554
+#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:53
+#: aleksis/core/forms.py:55
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:54 aleksis/core/forms.py:563
+#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:56
+#: aleksis/core/forms.py:58
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:130
+#: aleksis/core/forms.py:132
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:134
+#: aleksis/core/forms.py:136
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:151 aleksis/core/models.py:130
+#: aleksis/core/forms.py:153 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:152
+#: aleksis/core/forms.py:154
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/forms.py:205
+#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: aleksis/core/menus.py:254 aleksis/core/models.py:153
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:154 aleksis/core/forms.py:565
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:155 aleksis/core/models.py:206
+#: aleksis/core/forms.py:157 aleksis/core/models.py:206
 #: aleksis/core/models.py:514
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:197 aleksis/core/forms.py:200
+#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:73
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:198 aleksis/core/forms.py:201
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:231
+#: aleksis/core/forms.py:233
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:234
+#: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:235
+#: aleksis/core/forms.py:237
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:274
+#: aleksis/core/forms.py:276
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:278
+#: aleksis/core/forms.py:280
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:398
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:397
+#: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:429
+#: aleksis/core/forms.py:418 aleksis/core/models.py:181
+msgid "First name"
+msgstr ""
+
+#: aleksis/core/forms.py:419 aleksis/core/models.py:182
+msgid "Last name"
+msgstr ""
+
+#: aleksis/core/forms.py:428
+msgid "A person is using this e-mail address"
+msgstr ""
+
+#: aleksis/core/forms.py:456
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:430
+#: aleksis/core/forms.py:457
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:483
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:459
+#: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:467
+#: aleksis/core/forms.py:494
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:472
+#: aleksis/core/forms.py:499
 msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
-#: aleksis/core/forms.py:559
+#: aleksis/core/forms.py:586
 msgid "Adress data"
 msgstr ""
 
-#: aleksis/core/forms.py:571
+#: aleksis/core/forms.py:598
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:578
+#: aleksis/core/forms.py:605
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:581
+#: aleksis/core/forms.py:608
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:747
+#: aleksis/core/forms.py:775
 msgid "No valid selection."
 msgstr ""
 
@@ -266,7 +278,7 @@ msgstr ""
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20
+#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
@@ -521,18 +533,10 @@ msgstr ""
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:178 aleksis/core/models.py:1219
+#: aleksis/core/models.py:178 aleksis/core/models.py:1227
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:181
-msgid "First name"
-msgstr ""
-
-#: aleksis/core/models.py:182
-msgid "Last name"
-msgstr ""
-
 #: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
@@ -821,7 +825,7 @@ msgstr ""
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1026 aleksis/core/models.py:1266
+#: aleksis/core/models.py:1026 aleksis/core/models.py:1274
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
@@ -910,55 +914,55 @@ msgstr ""
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1169
+#: aleksis/core/models.py:1177
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1173
+#: aleksis/core/models.py:1181
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1175
+#: aleksis/core/models.py:1183
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1177
+#: aleksis/core/models.py:1185
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1192
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1193
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1190
+#: aleksis/core/models.py:1198
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1193
+#: aleksis/core/models.py:1201
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1205
+#: aleksis/core/models.py:1213
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1206
+#: aleksis/core/models.py:1214
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1222
+#: aleksis/core/models.py:1230
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1260
+#: aleksis/core/models.py:1268
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1270
+#: aleksis/core/models.py:1278
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
@@ -1154,11 +1158,11 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:526
+#: aleksis/core/settings.py:529
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:527
+#: aleksis/core/settings.py:530
 msgid "German"
 msgstr ""
 
@@ -1172,14 +1176,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
-#: aleksis/core/tables.py:137
+#: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
-#: aleksis/core/tables.py:135
+#: aleksis/core/tables.py:136
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -2176,6 +2180,22 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
+#: aleksis/core/templates/invitations/disabled.html:5
+msgid "The invite feature is disabled"
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:13
+msgid "The invite feature is disabled."
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:15
+msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:16
+msgid "site preferences page"
+msgstr ""
+
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
 msgstr ""
@@ -2554,17 +2574,17 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:3
+#: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:6
+#: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:14
+#: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
 msgid ""
 "\n"
@@ -2960,149 +2980,149 @@ msgstr ""
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:414
+#: aleksis/core/views.py:417
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:433 aleksis/core/views.py:443
+#: aleksis/core/views.py:436 aleksis/core/views.py:446
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:493
+#: aleksis/core/views.py:496
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:590
+#: aleksis/core/views.py:593
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:606
+#: aleksis/core/views.py:609
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:674
+#: aleksis/core/views.py:677
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:693
+#: aleksis/core/views.py:696
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:717
+#: aleksis/core/views.py:720
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:734
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:763
+#: aleksis/core/views.py:766
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:797
+#: aleksis/core/views.py:800
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:825
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:852
+#: aleksis/core/views.py:855
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:885
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:886
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:904
+#: aleksis/core/views.py:907
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:914
+#: aleksis/core/views.py:917
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:949
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:976
+#: aleksis/core/views.py:979
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:986
+#: aleksis/core/views.py:989
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1060
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1059
+#: aleksis/core/views.py:1062
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1129
+#: aleksis/core/views.py:1138
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1220
+#: aleksis/core/views.py:1229
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1230
+#: aleksis/core/views.py:1239
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1240
+#: aleksis/core/views.py:1249
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1250
+#: aleksis/core/views.py:1259
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1260
+#: aleksis/core/views.py:1269
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1328
+#: aleksis/core/views.py:1337
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1337 aleksis/core/views.py:1341
+#: aleksis/core/views.py:1346 aleksis/core/views.py:1350
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1379
+#: aleksis/core/views.py:1388
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1386
+#: aleksis/core/views.py:1395
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1445
-msgid "Person was invited successfully."
+#: aleksis/core/views.py:1466
+msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1447
+#: aleksis/core/views.py:1477
 msgid "Person was already invited."
 msgstr ""
 
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
index 427b5fbc842fe8bbbc70d795633af5070b404ec7..dfec73c5c894d3d686092593be9c21a811cd0535 100644
--- a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
index 9437eabc1987ac629a51e68f29b3dcc250179441..2973720cd0f3f85a06ca9d68c21a2c09a92961a5 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: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
@@ -37,7 +37,7 @@ msgstr ""
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265
 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:250
@@ -98,145 +98,157 @@ msgstr ""
 msgid "Group"
 msgstr ""
 
-#: aleksis/core/forms.py:48 aleksis/core/forms.py:554
+#: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:53
+#: aleksis/core/forms.py:55
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:54 aleksis/core/forms.py:563
+#: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:56
+#: aleksis/core/forms.py:58
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:104
+#: aleksis/core/forms.py:106
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:130
+#: aleksis/core/forms.py:132
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:134
+#: aleksis/core/forms.py:136
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:151 aleksis/core/models.py:130
+#: aleksis/core/forms.py:153 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:152
+#: aleksis/core/forms.py:154
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/forms.py:205
+#: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: aleksis/core/menus.py:254 aleksis/core/models.py:153
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:154 aleksis/core/forms.py:565
+#: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:155 aleksis/core/models.py:206
+#: aleksis/core/forms.py:157 aleksis/core/models.py:206
 #: aleksis/core/models.py:514
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/forms.py:197 aleksis/core/forms.py:200
+#: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:73
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:198 aleksis/core/forms.py:201
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:231
+#: aleksis/core/forms.py:233
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:234
+#: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:235
+#: aleksis/core/forms.py:237
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:274
+#: aleksis/core/forms.py:276
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:278
+#: aleksis/core/forms.py:280
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:287
+#: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:398
 msgid "Invitation code"
 msgstr ""
 
-#: aleksis/core/forms.py:397
+#: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:429
+#: aleksis/core/forms.py:418 aleksis/core/models.py:181
+msgid "First name"
+msgstr ""
+
+#: aleksis/core/forms.py:419 aleksis/core/models.py:182
+msgid "Last name"
+msgstr ""
+
+#: aleksis/core/forms.py:428
+msgid "A person is using this e-mail address"
+msgstr ""
+
+#: aleksis/core/forms.py:456
 msgid "Who should get the permission?"
 msgstr ""
 
-#: aleksis/core/forms.py:430
+#: aleksis/core/forms.py:457
 msgid "On what?"
 msgstr ""
 
-#: aleksis/core/forms.py:456
+#: aleksis/core/forms.py:483
 msgid "Select objects which the permission should be granted for:"
 msgstr ""
 
-#: aleksis/core/forms.py:459
+#: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
 msgstr ""
 
-#: aleksis/core/forms.py:467
+#: aleksis/core/forms.py:494
 msgid "You must select at least one group or person which should get the permission."
 msgstr ""
 
-#: aleksis/core/forms.py:472
+#: aleksis/core/forms.py:499
 msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
-#: aleksis/core/forms.py:559
+#: aleksis/core/forms.py:586
 msgid "Adress data"
 msgstr ""
 
-#: aleksis/core/forms.py:571
+#: aleksis/core/forms.py:598
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:578
+#: aleksis/core/forms.py:605
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:581
+#: aleksis/core/forms.py:608
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:747
+#: aleksis/core/forms.py:775
 msgid "No valid selection."
 msgstr ""
 
@@ -266,7 +278,7 @@ msgstr ""
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20
+#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
@@ -521,18 +533,10 @@ msgstr ""
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:178 aleksis/core/models.py:1219
+#: aleksis/core/models.py:178 aleksis/core/models.py:1227
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:181
-msgid "First name"
-msgstr ""
-
-#: aleksis/core/models.py:182
-msgid "Last name"
-msgstr ""
-
 #: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
@@ -821,7 +825,7 @@ msgstr ""
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1026 aleksis/core/models.py:1266
+#: aleksis/core/models.py:1026 aleksis/core/models.py:1274
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
@@ -910,55 +914,55 @@ msgstr ""
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1169
+#: aleksis/core/models.py:1177
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1173
+#: aleksis/core/models.py:1181
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1175
+#: aleksis/core/models.py:1183
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1177
+#: aleksis/core/models.py:1185
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1184
+#: aleksis/core/models.py:1192
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1193
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1190
+#: aleksis/core/models.py:1198
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1193
+#: aleksis/core/models.py:1201
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1205
+#: aleksis/core/models.py:1213
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1206
+#: aleksis/core/models.py:1214
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1222
+#: aleksis/core/models.py:1230
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1260
+#: aleksis/core/models.py:1268
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1270
+#: aleksis/core/models.py:1278
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
@@ -1154,11 +1158,11 @@ msgstr ""
 msgid "Country for phone number parsing"
 msgstr ""
 
-#: aleksis/core/settings.py:526
+#: aleksis/core/settings.py:529
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:527
+#: aleksis/core/settings.py:530
 msgid "German"
 msgstr ""
 
@@ -1172,14 +1176,14 @@ msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
-#: aleksis/core/tables.py:137
+#: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
-#: aleksis/core/tables.py:135
+#: aleksis/core/tables.py:136
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
@@ -2176,6 +2180,22 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
+#: aleksis/core/templates/invitations/disabled.html:5
+msgid "The invite feature is disabled"
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:13
+msgid "The invite feature is disabled."
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:15
+msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
+msgstr ""
+
+#: aleksis/core/templates/invitations/disabled.html:16
+msgid "site preferences page"
+msgstr ""
+
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
 msgstr ""
@@ -2554,17 +2574,17 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:3
+#: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:6
+#: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
 msgstr ""
 
-#: aleksis/core/templates/templated_email/person_changed.email:14
+#: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
 msgid ""
 "\n"
@@ -2960,148 +2980,148 @@ msgstr ""
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:414
+#: aleksis/core/views.py:417
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:433 aleksis/core/views.py:443
+#: aleksis/core/views.py:436 aleksis/core/views.py:446
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:493
+#: aleksis/core/views.py:496
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:590
+#: aleksis/core/views.py:593
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:606
+#: aleksis/core/views.py:609
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:674
+#: aleksis/core/views.py:677
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:693
+#: aleksis/core/views.py:696
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:717
+#: aleksis/core/views.py:720
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:731
+#: aleksis/core/views.py:734
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:763
+#: aleksis/core/views.py:766
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:797
+#: aleksis/core/views.py:800
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:825
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:852
+#: aleksis/core/views.py:855
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:885
+#: aleksis/core/views.py:888
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:886
+#: aleksis/core/views.py:889
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:890
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:891
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:904
+#: aleksis/core/views.py:907
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:914
+#: aleksis/core/views.py:917
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:949
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:976
+#: aleksis/core/views.py:979
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:986
+#: aleksis/core/views.py:989
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1060
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1059
+#: aleksis/core/views.py:1062
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1129
+#: aleksis/core/views.py:1138
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1220
+#: aleksis/core/views.py:1229
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1230
+#: aleksis/core/views.py:1239
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1240
+#: aleksis/core/views.py:1249
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1250
+#: aleksis/core/views.py:1259
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1260
+#: aleksis/core/views.py:1269
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1328
+#: aleksis/core/views.py:1337
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1337 aleksis/core/views.py:1341
+#: aleksis/core/views.py:1346 aleksis/core/views.py:1350
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1379
+#: aleksis/core/views.py:1388
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1386
+#: aleksis/core/views.py:1395
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1445
-msgid "Person was invited successfully."
+#: aleksis/core/views.py:1466
+msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1447
+#: aleksis/core/views.py:1477
 msgid "Person was already invited."
 msgstr ""
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
index 427b5fbc842fe8bbbc70d795633af5070b404ec7..dfec73c5c894d3d686092593be9c21a811cd0535 100644
--- a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-31 17:03+0100\n"
+"POT-Creation-Date: 2022-02-08 23:16+0000\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"
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index d8f63e606073f92e8db799206012cfc9a998a5d8..812a9d254ca4bff2e9372ed7969d0cb2b811c176 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -1150,8 +1150,16 @@ class PersonInvitation(AbstractBaseInvitation, PureDjangoModel):
     def __str__(self) -> str:
         return f"{self.email} ({self.inviter})"
 
-    key_expired = Invitation.key_expired
+    @classmethod
+    def create(cls, email, inviter=None, **kwargs):
+        length = get_site_preferences()["auth__invite_code_length"]
+        packet_size = get_site_preferences()["auth__invite_code_packet_size"]
+        code = generate_random_code(length, packet_size)
 
+        instance = cls.objects.create(email=email, inviter=inviter, key=code, **kwargs)
+        return instance
+
+    key_expired = Invitation.key_expired
     send_invitation = Invitation.send_invitation
 
 
diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py
index ad1f55fcc44f470fac11c362c456451a56620785..022fa11a00671a3acb0775c2229a378bd3981342 100644
--- a/aleksis/core/rules.py
+++ b/aleksis/core/rules.py
@@ -329,7 +329,7 @@ rules.add_perm("core.can_change_password", can_change_password_predicate)
 invite_enabled_predicate = is_site_preference_set(section="auth", pref="invite_enabled")
 rules.add_perm("core.invite_enabled", invite_enabled_predicate)
 
-can_invite_predicate = has_person & has_global_perm("core.invite")
+can_invite_predicate = invite_enabled_predicate & has_person & has_global_perm("core.invite")
 rules.add_perm("core.can_invite", can_invite_predicate)
 
 # OAuth2 permissions
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index aaf341ef69d5618254053856f3d4b179db1e90c1..087762de88b667f90c942f3596a7df4991faf627 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -271,8 +271,9 @@ else:
 INSTALLED_APPS.append("cachalot")
 DEBUG_TOOLBAR_PANELS.append("cachalot.panels.CachalotPanel")
 CACHALOT_TIMEOUT = _settings.get("caching.cachalot.timeout", None)
-CACHALOT_DATABASES = set(["default"])
+CACHALOT_DATABASES = set(["default", "default_oot"])
 SILENCED_SYSTEM_CHECKS += ["cachalot.W001"]
+CACHALOT_ENABLED = _settings.get("caching.query_caching", True)
 
 SESSION_ENGINE = "django.contrib.sessions.backends.cache"
 SESSION_CACHE_ALIAS = "default"
@@ -371,6 +372,8 @@ INVITATIONS_INVITATION_EXPIRY = _settings.get("auth.invitation.expiry", 3)
 INVITATIONS_EMAIL_SUBJECT_PREFIX = ACCOUNT_EMAIL_SUBJECT_PREFIX
 # Use custom invitation model
 INVITATIONS_INVITATION_MODEL = "core.PersonInvitation"
+# Use custom invitation form
+INVITATIONS_INVITE_FORM = "aleksis.core.forms.PersonCreateInviteForm"
 # Display error message if invitation code is invalid
 INVITATIONS_GONE_ON_ACCEPT_ERROR = False
 # Mark invitation as accepted after signup
diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py
index ab19c80608f1a8966dab7ae2094eca7caf579252..f08460bd8654907cb56f655e01014342f8e59ab5 100644
--- a/aleksis/core/tables.py
+++ b/aleksis/core/tables.py
@@ -116,6 +116,7 @@ class InvitationCodeColumn(tables.Column):
 class InvitationsTable(tables.Table):
     """Table to list persons."""
 
+    person_id = PersonColumn()
     email = tables.EmailColumn()
     sent = tables.DateColumn()
     inviter_id = PersonColumn()
diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html
index 2abf1445494da40885904252ecbd0aa5bffed077..bf56e08db5b6fd6d6052585ce216bd50cbea3796 100644
--- a/aleksis/core/templates/500.html
+++ b/aleksis/core/templates/500.html
@@ -16,6 +16,10 @@
           {% endblocktrans %}
         </p>
         {% include "core/partials/admins_list.html" %}
+        <a href="javascript:window.location.reload()" class="btn green waves-effect waves-light">
+          <i class="material-icons left">refresh</i>
+          {% trans "Retry" %}
+        </a>
       </div>
     </div>
   </div>
diff --git a/aleksis/core/templates/account/signup.html b/aleksis/core/templates/account/signup.html
index b4a74179908dafc208d34c5b2c472f3bd73c3de4..8885e3902af13c609a69a595df3d125b66dc79ce 100644
--- a/aleksis/core/templates/account/signup.html
+++ b/aleksis/core/templates/account/signup.html
@@ -16,7 +16,9 @@
   <form method="post" action="{% url 'account_signup' %}">
     {% csrf_token %}
     {% form form=form %}{% endform %}
-    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+    {% if redirect_field_value %}
+      <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+    {% endif %}
     {% trans "Sign up" as caption %}
     {% include "core/partials/save_button.html" with caption=caption icon="how_to_reg" %}
   </form>
diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html
index 24e267db3caf7b6a9886f10269a4db654514f696..23f8ba29b30188dd4cdf5b76af23991a0f618119 100644
--- a/aleksis/core/templates/core/person/full.html
+++ b/aleksis/core/templates/core/person/full.html
@@ -48,7 +48,7 @@
           </a>
         {% endif %}
 
-        {% if can_invite and not person.user %}
+        {% if invite_enabled and can_invite and not person.user %}
           <a href="{% url "invite_person_by_id" person.id %}" class="btn waves-effect waves-light">
             <i class="material-icons left">card_giftcard</i>
             {% trans "Invite user" %}
diff --git a/aleksis/core/templates/invitations/disabled.html b/aleksis/core/templates/invitations/disabled.html
new file mode 100644
index 0000000000000000000000000000000000000000..2515a01f2437c7f617cc14fcee0226bedeacd341
--- /dev/null
+++ b/aleksis/core/templates/invitations/disabled.html
@@ -0,0 +1,21 @@
+{% extends "core/base.html" %}
+
+{% load i18n %}
+
+{% block browser_title %}{% blocktrans %}The invite feature is disabled{% endblocktrans %}{% endblock %}
+{% block no_page_title %}{% endblock %}
+
+{% block content %}
+  <div class="container">
+    <div class="card red">
+      <div class="card-content white-text">
+        <i class="material-icons small left">disabled_by_default</i>
+        <span class="card-title">{% blocktrans %}The invite feature is disabled.{% endblocktrans %}</span>
+        <p>
+          {% trans "To enable it, switch on the corresponding checkbox in the authentication section of the " %}
+          <a href="{% url "preferences_site" %}">{% trans "site preferences page" %}</a>.
+        </p>
+      </div>
+    </div>
+  </div>
+{% endblock %}
diff --git a/aleksis/core/templates/templated_email/person_changed.email b/aleksis/core/templates/templated_email/person_changed.email
index 068db0cc67f2b6f55e0f15a5d3e80f06a29594b4..e4cd967aebd4f3d9a0a46f5762fe86e1d019afba 100644
--- a/aleksis/core/templates/templated_email/person_changed.email
+++ b/aleksis/core/templates/templated_email/person_changed.email
@@ -1,5 +1,6 @@
-{% load i18n %}
 {% extends "templated_email/base.email" %}
+{% load i18n %}
+
 {% block subject_content %}{% blocktrans with person=person %}{{ person }} changed their data!{% endblocktrans %}{% endblock %}
 
 {% block plain_content %}
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index b5dcb004d040b64b22242b977702a104fb2ea33a..c91bae7f29c978d30e96361f92213eec7c5679d1 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -40,6 +40,7 @@ urlpatterns = [
         views.GenerateInvitationCode.as_view(),
         name="generate_invitation_code",
     ),
+    path("invitations/disabled", views.InviteDisabledView.as_view(), name="invite_disabled"),
     path("invitations/", include("invitations.urls")),
     path(
         "accounts/social/connections/<int:pk>/delete",
@@ -63,7 +64,7 @@ urlpatterns = [
     path("person/<int:id_>/", views.person, name="person_by_id"),
     path("person/<int:pk>/edit/", views.EditPersonView.as_view(), name="edit_person_by_id"),
     path("person/<int:id_>/delete/", views.delete_person, name="delete_person_by_id"),
-    path("person/<int:id_>/invite/", views.InvitePersonByID.as_view(), name="invite_person_by_id"),
+    path("person/<int:pk>/invite/", views.InvitePersonByID.as_view(), name="invite_person_by_id"),
     path("groups", views.groups, name="groups"),
     path("groups/additional_fields", views.additional_fields, name="additional_fields"),
     path("groups/child_groups/", views.groups_child_groups, name="groups_child_groups"),
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index fc83b605032013b7d0dbee06ce0b1ef8193c177d..6988dd53137f2d5ca364bcfd7091d9b1795e7f10 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -17,6 +17,8 @@ from django.utils.crypto import get_random_string
 from django.utils.functional import lazy
 from django.utils.module_loading import import_string
 
+from cachalot.api import invalidate
+from cachalot.signals import post_invalidation
 from cache_memoize import cache_memoize
 
 
@@ -403,6 +405,8 @@ class OOTRouter:
     default_db = "default"
     oot_db = "default_oot"
 
+    _cachalot_invalidating = []
+
     @property
     def oot_labels(self):
         return settings.DATABASE_OOT_LABELS
@@ -441,3 +445,20 @@ class OOTRouter:
             return False
 
         return None
+
+    @classmethod
+    def _invalidate_cachalot(cls, sender, **kwargs):
+        if sender in cls._cachalot_invalidating:
+            return
+        cls._cachalot_invalidating.append(sender)
+
+        if kwargs["db_alias"] == cls.default_db:
+            invalidate(sender, db_alias=cls.oot_db)
+        elif kwargs["db_alias"] == cls.oot_db:
+            invalidate(sender, db_alias=cls.default_db)
+
+        if sender in cls._cachalot_invalidating:
+            cls._cachalot_invalidating.remove(sender)
+
+
+post_invalidation.connect(OOTRouter._invalidate_cachalot)
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index c23498a8b611fb91872089aa3f09fb89cba0b4e9..7be99d6a0e67aa552f53822f3b9fcbc4abf9e87b 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -330,6 +330,9 @@ def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
     # Get groups where person is member of
     context["groups"] = person.member_of.all()
 
+    # Get whether the invitation feature is enabled in the preferences
+    context["invite_enabled"] = get_site_preferences()["auth__invite_enabled"]
+
     return render(request, "core/person/full.html", context)
 
 
@@ -1075,6 +1078,11 @@ class InvitePerson(PermissionRequiredMixin, SingleTableView, SendInvite):
     table_class = InvitationsTable
     context = {}
 
+    def dispatch(self, request, *args, **kwargs):
+        if not get_site_preferences()["auth__invite_enabled"]:
+            return HttpResponseRedirect(reverse_lazy("invite_disabled"))
+        return super().dispatch(request, *args, **kwargs)
+
     # Get queryset of invitations
     def get_context_data(self, **kwargs):
         queryset = kwargs.pop("object_list", None)
@@ -1102,6 +1110,7 @@ class EnterInvitationCode(FormView):
             accept_invitation(
                 invitation=invitation, request=self.request, signal_sender=self.request.user
             )
+            self.request.session["invitation_code_entered"] = True
             return redirect("account_signup")
         return redirect("invitations:accept-invite", code)
 
@@ -1406,11 +1415,13 @@ class AccountRegisterView(SignupView):
     """
 
     form_class = AccountRegisterForm
-    success_url = "index"
+    success_url = reverse_lazy("index")
 
     def dispatch(self, request, *args, **kwargs):
-        if not request.user.has_perm("core.can_register") and not request.session.get(
-            "account_verified_email"
+        if (
+            not request.user.has_perm("core.can_register")
+            and not request.session.get("account_verified_email")
+            and not request.session.get("invitation_code_entered")
         ):
             raise PermissionDenied()
         return super(AccountRegisterView, self).dispatch(request, *args, **kwargs)
@@ -1421,17 +1432,22 @@ class AccountRegisterView(SignupView):
         return kwargs
 
 
-class InvitePersonByID(View):
+class InvitePersonByID(PermissionRequiredMixin, SingleObjectMixin, View):
     """Custom view to invite person by their ID."""
 
+    model = Person
     success_url = reverse_lazy("persons")
+    permission_required = "core.can_invite"
+
+    def dispatch(self, request, *args, **kwargs):
+        if not get_site_preferences()["auth__invite_enabled"]:
+            return HttpResponseRedirect(reverse_lazy("invite_disabled"))
+        return super().dispatch(request, *args, **kwargs)
 
     def get(self, request, *args, **kwargs):
-        self.object = self.get_object()
-        success_url = reverze_lazy("person_by_id", self.object.pk)
-        person = self.object
+        person = self.get_object()
 
-        if not PersonInvitation.objects.filter(email=person.email).exists():
+        if not person.email or not PersonInvitation.objects.filter(email=person.email).exists():
             length = get_site_preferences()["auth__invite_code_length"]
             packet_size = get_site_preferences()["auth__invite_code_packet_size"]
             key = generate_random_code(length, packet_size)
@@ -1442,11 +1458,37 @@ class InvitePersonByID(View):
             invite.save()
 
             invite.send_invitation(self.request)
-            messages.success(self.request, _("Person was invited successfully."))
+
+            if person.email:
+                messages.success(
+                    self.request,
+                    _(
+                        "Person was invited successfully and an email "
+                        "with further instructions has been send to them."
+                    ),
+                )
+            else:
+                readable_key = "-".join(wrap(key, packet_size))
+                messages.success(
+                    self.request,
+                    f"{_('Person was invited successfully. Their key is')} {readable_key}.",
+                )
         else:
             messages.success(self.request, _("Person was already invited."))
 
-        return HttpResponseRedirect(success_url)
+        return HttpResponseRedirect(person.get_absolute_url())
+
+
+class InviteDisabledView(PermissionRequiredMixin, TemplateView):
+    """View to display a notice that the invite feature is disabled and how to enable it."""
+
+    template_name = "invitations/disabled.html"
+    permission_required = "core.change_site_preferences_rule"
+
+    def dispatch(self, request, *args, **kwargs):
+        if get_site_preferences()["auth__invite_enabled"]:
+            raise PermissionDenied()
+        return super().dispatch(request, *args, **kwargs)
 
 
 class LoginView(AllAuthLoginView):
diff --git a/docker-startup.sh b/docker-startup.sh
index 776b13310b1078da8d2687dd5a4af8c146c3c0df..1e02ce1d4bfdbd4373e93da8e2bd3f0c1ae02d56 100755
--- a/docker-startup.sh
+++ b/docker-startup.sh
@@ -48,11 +48,7 @@ wait_database() {
 
 prepare_database() {
 	# Migrate database; should only be run in app container or job
-	if aleksis-admin migrate --check >/dev/null 2>&1; then
-		aleksis-admin migrate && \
-		aleksis-admin clear_cache && \
-		aleksis-admin createinitialrevisions
-	fi
+	aleksis-admin migrate && aleksis-admin createinitialrevisions
 }
 
 # Wait for database to be reachable under all conditions
diff --git a/docs/_static/data_checks.png b/docs/_static/data_checks.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3ff5b36f2773ae2dfd6839f2dbcdad8b034397f
Binary files /dev/null and b/docs/_static/data_checks.png differ
diff --git a/docs/conf.py b/docs/conf.py
index 6e406af5c0c7d02362e47c38c7581a50a983b5e3..2acaa4acf472ffb6ea2a1124d9371644186cc5c6 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -31,7 +31,7 @@ author = "The AlekSIS Team"
 # The short X.Y version
 version = "2.7"
 # The full version, including alpha/beta/rc tags
-release = "2.7.4.dev0"
+release = "2.7.5.dev0"
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/docs/dev/02_install_apps.rst b/docs/dev/02_install_apps.rst
index bbfbb9b4007e533c1e910ae829ddf80f382b7d99..335f92f56735e0f1eb02eecdde626d5a074674ff 100644
--- a/docs/dev/02_install_apps.rst
+++ b/docs/dev/02_install_apps.rst
@@ -9,6 +9,26 @@ sub-folder of the meta repository. If you followed the documentation, they
 will already be checked out in the version required for the bundle you
 are running.
 
+Installing a development environment for own apps
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you are developing your own app, you probably do not want to
+ru na development environment from the `AlekSIS-Core` repository.
+
+Instead, simply install the environment using ``poetry install`` from
+your app repository – it will pull in `AlekSIS-Core` as a dependency
+automatically, and everything will work as described beforehand.
+
+.. note::
+   Take care not to mix up environments, especially if using ``poetry shell``.
+
+
+Using one virtual environment for everything
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+   This method is not encouraged for most use cases.
+
 Installing apps into the existing virtual environment of `AlekSIS-Core` can
 be easily done after starting `poetry shell`::
 
@@ -17,5 +37,6 @@ be easily done after starting `poetry shell`::
 Do not forget to run the maintenance tasks described earlier after
 installing any app.
 
-**Heads up:** This is not suitable for working on the core, because it
-will install the `AlekSIS-Core` version used by the app using `pip` again.
+.. note::
+   This is not suitable for working on the core, because it
+   will install the `AlekSIS-Core` version used by the app using `pip` again.
diff --git a/pyproject.toml b/pyproject.toml
index bb8c16a3dc4f72927e18e805b75396a48a04f173..12199f73cd28724dffa7087dcb6628ea68943fe1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-Core"
-version = "2.7.4.dev0"
+version = "2.7.5.dev0"
 packages = [
     { include = "aleksis" }
 ]