diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po
index 1ec59a49caf44641b442796d8e1ec3ebd502344d..006b19e86a29539d999b3590041519e582ad5a1d 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: 2021-12-28 12:13+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,30 +18,30 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:154
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:155
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:156
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:157
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:158
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:157 aleksis/core/forms.py:223 aleksis/core/menus.py:265
-#: aleksis/core/models.py:414 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:159 aleksis/core/forms.py:223 aleksis/core/menus.py:265
+#: aleksis/core/models.py:449 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:152
+#: aleksis/core/templates/core/person/full.html:242
 msgid "Groups"
 msgstr ""
 
@@ -66,8 +66,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
-#: aleksis/core/templates/core/base.html:105
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105
+#: aleksis/core/templates/core/base.html:106
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -75,27 +75,27 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:58
+#: aleksis/core/filters.py:59
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:70
+#: aleksis/core/filters.py:71
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/filters.py:91
+#: aleksis/core/filters.py:92
 msgid "Permission"
 msgstr ""
 
-#: aleksis/core/filters.py:99
+#: aleksis/core/filters.py:100
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:112 aleksis/core/models.py:581
+#: aleksis/core/filters.py:113 aleksis/core/models.py:675
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:134 aleksis/core/models.py:413
+#: aleksis/core/filters.py:135 aleksis/core/models.py:448
 msgid "Group"
 msgstr ""
 
@@ -103,60 +103,65 @@ msgstr ""
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:54
+#: aleksis/core/forms.py:53
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/forms.py:568
+#: aleksis/core/forms.py:54 aleksis/core/forms.py:568
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:57
+#: aleksis/core/forms.py:56
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:135
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:140
+#: aleksis/core/forms.py:139
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:129
+#: aleksis/core/forms.py:156 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:158
+#: aleksis/core/forms.py:157
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:159 aleksis/core/forms.py:210
-#: aleksis/core/menus.py:254 aleksis/core/models.py:152
+#: aleksis/core/forms.py:158 aleksis/core/forms.py:210
+#: 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:160 aleksis/core/forms.py:570
+#: aleksis/core/forms.py:159 aleksis/core/forms.py:570
 msgid "Additional data"
 msgstr ""
 
+#: aleksis/core/forms.py:160 aleksis/core/models.py:206
+#: aleksis/core/models.py:501
+msgid "Photo"
+msgstr ""
+
 #: aleksis/core/forms.py:202 aleksis/core/forms.py:205
-#: aleksis/core/models.py:72
+#: aleksis/core/models.py:73
 msgid "Date"
 msgstr ""
 
 #: aleksis/core/forms.py:203 aleksis/core/forms.py:206
-#: aleksis/core/models.py:80
+#: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
@@ -259,8 +264,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:22
-#: aleksis/core/templates/two_factor/core/login.html:76
+#: aleksis/core/templates/two_factor/core/login.html:32
+#: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
@@ -277,8 +282,8 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:627
-#: aleksis/core/preferences.py:28
+#: aleksis/core/menus.py:41 aleksis/core/models.py:721
+#: aleksis/core/preferences.py:29
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
@@ -335,13 +340,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:141 aleksis/core/models.py:727
+#: aleksis/core/menus.py:141 aleksis/core/models.py:821
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:152 aleksis/core/models.py:130
+#: aleksis/core/menus.py:152 aleksis/core/models.py:131
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -393,7 +398,7 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:276 aleksis/core/models.py:981
+#: aleksis/core/menus.py:276 aleksis/core/models.py:1075
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
@@ -403,7 +408,7 @@ msgstr ""
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:298 aleksis/core/models.py:462
+#: aleksis/core/menus.py:298 aleksis/core/models.py:497
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
@@ -423,722 +428,740 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:70
+#: aleksis/core/models.py:71
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:71
+#: aleksis/core/models.py:72
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:73
+#: aleksis/core/models.py:74
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:74
+#: aleksis/core/models.py:75
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:75 aleksis/core/models.py:198
+#: aleksis/core/models.py:76 aleksis/core/models.py:199
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:77
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:78
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:79
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:80
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:82
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:93 aleksis/core/models.py:950
+#: aleksis/core/models.py:94 aleksis/core/models.py:1044
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:95
+#: aleksis/core/models.py:96
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:96
+#: aleksis/core/models.py:97
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:115
+#: aleksis/core/models.py:116
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:122
+#: aleksis/core/models.py:123
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:151 aleksis/core/models.py:899
+#: aleksis/core/models.py:152 aleksis/core/models.py:993
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:154
+#: aleksis/core/models.py:155
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:157
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:157
+#: aleksis/core/models.py:158
+msgid "Can view avatar image"
+msgstr ""
+
+#: aleksis/core/models.py:159
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:158
+#: aleksis/core/models.py:160
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:176 aleksis/core/models.py:1144
+#: aleksis/core/models.py:178 aleksis/core/models.py:1238
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:178
-msgid "Is person active?"
-msgstr ""
-
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:187 aleksis/core/models.py:431
+#: aleksis/core/models.py:188 aleksis/core/models.py:466
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:192
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:192
+#: aleksis/core/models.py:193
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:193
+#: aleksis/core/models.py:194
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:197
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:200
+#: aleksis/core/models.py:201
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:204
-msgid "Photo"
+#: aleksis/core/models.py:210 aleksis/core/models.py:505
+msgid "This is an official photo, used for official documents and for internal use cases."
+msgstr ""
+
+#: aleksis/core/models.py:215 aleksis/core/models.py:509
+msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:208 aleksis/core/templates/core/person/full.html:145
+#: aleksis/core/models.py:218 aleksis/core/models.py:512
+msgid "This is a picture or an avatar for public display."
+msgstr ""
+
+#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:231
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:215
+#: aleksis/core/models.py:230
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:218 aleksis/core/models.py:585
-#: aleksis/core/models.py:609 aleksis/core/models.py:694
-#: aleksis/core/models.py:974 aleksis/core/templates/core/person/full.html:128
+#: aleksis/core/models.py:233 aleksis/core/models.py:679
+#: aleksis/core/models.py:703 aleksis/core/models.py:788
+#: aleksis/core/models.py:1068
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:386
+#: aleksis/core/models.py:421
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:388
+#: aleksis/core/models.py:423
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:395
+#: aleksis/core/models.py:430
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:431
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:416
+#: aleksis/core/models.py:451
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:417
+#: aleksis/core/models.py:452
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:429
+#: aleksis/core/models.py:464
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:439 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:474 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:442 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:477 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:449 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:484 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:492
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:584 aleksis/core/models.py:608
-#: aleksis/core/models.py:693
+#: aleksis/core/models.py:678 aleksis/core/models.py:702
+#: aleksis/core/models.py:787
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:681
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:593
+#: aleksis/core/models.py:687
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:594
+#: aleksis/core/models.py:688
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:600
+#: aleksis/core/models.py:694
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:605
+#: aleksis/core/models.py:699
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:610 aleksis/core/models.py:951
+#: aleksis/core/models.py:704 aleksis/core/models.py:1045
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:612
+#: aleksis/core/models.py:706
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:613
+#: aleksis/core/models.py:707
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:626
+#: aleksis/core/models.py:720
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:695
+#: aleksis/core/models.py:789
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:698
+#: aleksis/core/models.py:792
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:701
+#: aleksis/core/models.py:795
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:820
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:858
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:765
+#: aleksis/core/models.py:859
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:914
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:915
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:822
+#: aleksis/core/models.py:916
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:825
+#: aleksis/core/models.py:919
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:826
+#: aleksis/core/models.py:920
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:925
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:832
+#: aleksis/core/models.py:926
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:931
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:838
+#: aleksis/core/models.py:932
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:937
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:938
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:969
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:970
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:971
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:883
+#: aleksis/core/models.py:977
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:978
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:890
+#: aleksis/core/models.py:984
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:891
+#: aleksis/core/models.py:985
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:896
+#: aleksis/core/models.py:990
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:995
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:996
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:917
+#: aleksis/core/models.py:1011
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:1012
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:924
+#: aleksis/core/models.py:1018
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:1031
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:938
+#: aleksis/core/models.py:1032
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:1042
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:1046 aleksis/core/models.py:1285
+#: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:1052
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:1053
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:1067
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:980 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1074 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:994
+#: aleksis/core/models.py:1088
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:1089
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:1090
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:1091
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:1092
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:999
+#: aleksis/core/models.py:1093
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1000
+#: aleksis/core/models.py:1094
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1001
+#: aleksis/core/models.py:1095
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1037
+#: aleksis/core/models.py:1131
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1139
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1046
+#: aleksis/core/models.py:1140
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1153
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1154
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1062
+#: aleksis/core/models.py:1156
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1063
+#: aleksis/core/models.py:1157
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1070
+#: aleksis/core/models.py:1164
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1094
+#: aleksis/core/models.py:1188
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1098
+#: aleksis/core/models.py:1192
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1100
+#: aleksis/core/models.py:1194
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1102
+#: aleksis/core/models.py:1196
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1109
+#: aleksis/core/models.py:1203
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1110
+#: aleksis/core/models.py:1204
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1209
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1212
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1130
+#: aleksis/core/models.py:1224
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1131
+#: aleksis/core/models.py:1225
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1147
+#: aleksis/core/models.py:1241
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1279
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/preferences.py:24
-msgid "General"
+#: aleksis/core/models.py:1289
+msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
 #: aleksis/core/preferences.py:25
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:26
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:27
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:28
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Accounts"
 msgstr ""
 
-#: aleksis/core/preferences.py:31
+#: aleksis/core/preferences.py:32
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:32
+#: aleksis/core/preferences.py:33
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:43
+#: aleksis/core/preferences.py:44
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:54
+#: aleksis/core/preferences.py:55
 msgid "Site description"
 msgstr ""
 
-#: aleksis/core/preferences.py:65
+#: aleksis/core/preferences.py:66
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:77
+#: aleksis/core/preferences.py:78
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:88
+#: aleksis/core/preferences.py:89
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:98
+#: aleksis/core/preferences.py:99
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:108
+#: aleksis/core/preferences.py:109
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:119
+#: aleksis/core/preferences.py:120
 msgid "Mail out name"
 msgstr ""
 
-#: aleksis/core/preferences.py:130
+#: aleksis/core/preferences.py:131
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:142
+#: aleksis/core/preferences.py:143
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:154
+#: aleksis/core/preferences.py:155
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:166
+#: aleksis/core/preferences.py:167
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:182
+#: aleksis/core/preferences.py:183
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:194
+#: aleksis/core/preferences.py:195
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:205
+#: aleksis/core/preferences.py:206
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:217
+#: aleksis/core/preferences.py:218
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:226
+#: aleksis/core/preferences.py:227
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:237
+#: aleksis/core/preferences.py:238
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:248
+#: aleksis/core/preferences.py:249
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
+#: aleksis/core/preferences.py:257
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:264
+#: aleksis/core/preferences.py:265
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:272
+#: aleksis/core/preferences.py:273
 msgid "Enable invitations"
 msgstr ""
 
-#: aleksis/core/preferences.py:280
+#: aleksis/core/preferences.py:281
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:288
+#: aleksis/core/preferences.py:289
 msgid "Size of packets. (Default 5: abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:298
+#: aleksis/core/preferences.py:300
 msgid "Allowed Grant Flows for OAuth applications"
 msgstr ""
 
-#: aleksis/core/preferences.py:311
+#: aleksis/core/preferences.py:313
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:323
+#: aleksis/core/preferences.py:325
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:334
+#: aleksis/core/preferences.py:336
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:345
+#: aleksis/core/preferences.py:347
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:354
+#: aleksis/core/preferences.py:356
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:365
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:376
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:390
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:401
+#: aleksis/core/preferences.py:403
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:411
+#: aleksis/core/preferences.py:413
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:412
+#: aleksis/core/preferences.py:414
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:422
+#: aleksis/core/preferences.py:424
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:432
+#: aleksis/core/preferences.py:434
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:507
+#: aleksis/core/preferences.py:444
+msgid "Country for phone number parsing"
+msgstr ""
+
+#: aleksis/core/settings.py:518
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:508
+#: aleksis/core/settings.py:519
 msgid "German"
 msgstr ""
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
-#: aleksis/core/templates/core/person/full.html:24
+#: aleksis/core/templates/core/person/full.html:26
+#: aleksis/core/templates/core/person/full.html:98
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
@@ -1155,14 +1178,14 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
-#: aleksis/core/templates/core/person/full.html:31
+#: aleksis/core/templates/core/person/full.html:33
+#: aleksis/core/templates/core/person/full.html:105
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
-#: aleksis/core/templates/403.html:14 aleksis/core/templates/404.html:10
-#: aleksis/core/templates/500.html:10
-#: aleksis/core/templates/oauth2_provider/authorize.html:47
+#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
+#: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
 msgstr ""
@@ -1173,7 +1196,7 @@ msgid ""
 "          object."
 msgstr ""
 
-#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:17
+#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
 "            If you think this is an error in AlekSIS, please contact your site\n"
@@ -1181,13 +1204,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/404.html:10
-msgid ""
-"The requested page or object was not\n"
-"          found."
-msgstr ""
-
-#: aleksis/core/templates/404.html:13
+#: aleksis/core/templates/404.html:12
 msgid ""
 "\n"
 "            If you were redirected by a link on an external page,\n"
@@ -1252,6 +1269,7 @@ msgstr ""
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
+#: aleksis/core/templates/socialaccount/login.html:17
 msgid "Confirm"
 msgstr ""
 
@@ -1296,7 +1314,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:81
+#: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
 msgstr ""
 
@@ -1472,15 +1490,15 @@ msgstr ""
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:175
+#: aleksis/core/templates/core/base.html:179
 msgid "About AlekSIS® — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:183
+#: aleksis/core/templates/core/base.html:187
 msgid "Imprint"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:191
+#: aleksis/core/templates/core/base.html:195
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1570,15 +1588,15 @@ msgstr ""
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:62
+#: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:84
+#: aleksis/core/templates/core/data_check/list.html:86
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:88
+#: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1700,7 +1718,8 @@ msgid "Edit group"
 msgstr ""
 
 #: aleksis/core/templates/core/group/full.html:38
-#: aleksis/core/templates/core/person/full.html:38
+#: aleksis/core/templates/core/person/full.html:40
+#: aleksis/core/templates/core/person/full.html:112
 msgid "Change preferences"
 msgstr ""
 
@@ -2094,19 +2113,33 @@ msgstr ""
 msgid "Edit person"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:45
+#: aleksis/core/templates/core/person/full.html:47
+#: aleksis/core/templates/core/person/full.html:119
 msgid "Impersonate"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:51
+#: aleksis/core/templates/core/person/full.html:54
+#: aleksis/core/templates/core/person/full.html:126
 msgid "Invite user"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:57
+#: aleksis/core/templates/core/person/full.html:133
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:138
+#: aleksis/core/templates/core/person/full.html:168
+msgid "home number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:174
+msgid "mobile number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:216
+msgid "This person didn't upload a personal photo."
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:224
 msgid "Children"
 msgstr ""
 
@@ -2205,27 +2238,27 @@ msgstr ""
 msgid "OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+#: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#: aleksis/core/templates/oauth2_provider/application/detail.html:79
 msgid "Skip Authorisation"
 msgstr ""
 
@@ -2238,24 +2271,30 @@ msgstr ""
 msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/list.html:20
+#: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
 msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
-#: aleksis/core/templates/oauth2_provider/authorize.html:16
+#: aleksis/core/templates/socialaccount/login.html:5
+#: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:18
+#: aleksis/core/templates/oauth2_provider/authorize.html:23
+#, python-format
+msgid "Authorize %(name)s"
+msgstr ""
+
+#: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:33
+#: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:36
+#: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
 msgstr ""
 
@@ -2358,6 +2397,20 @@ msgstr ""
 msgid "Add a Third-party Account"
 msgstr ""
 
+#: aleksis/core/templates/socialaccount/login.html:12
+#, python-format
+msgid "You are about to connect a new third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:23
+#, python-format
+msgid "You are about to sign in using a third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:28
+msgid "Continue"
+msgstr ""
+
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
@@ -2402,10 +2455,13 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/data_checks.email:4
-msgid "The system detected some new problems with your data."
+#: aleksis/core/templates/templated_email/celery_failure.email:4
+#, python-format
+msgid " Celery task %(task_name)s failed!"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:8
+#: aleksis/core/templates/templated_email/celery_failure.email:26
 #: aleksis/core/templates/templated_email/data_checks.email:8
 #: aleksis/core/templates/templated_email/data_checks.email:24
 #: aleksis/core/templates/templated_email/person_changed.email:8
@@ -2413,6 +2469,54 @@ msgstr ""
 msgid "Hello,"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:9
+#, python-format
+msgid ""
+"\n"
+"   the celery task %(task_name)s failed with following information:\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:14
+#, python-format
+msgid ""
+"\n"
+" * Task name: %(task_name)s\n"
+" * Task: %(task)s\n"
+" * Id of the task: %(task_id)s\n"
+" * Exception instance raised: %(exception)s\n"
+" * Positional arguments the task was called with: %(args)s\n"
+" * Keyword arguments the task was called with: %(kwargs)s\n"
+" * Stack trace object: %(traceback)s\n"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:28
+#, python-format
+msgid ""
+"\n"
+"    the celery task %(task_name)s failed with following information:\n"
+"  "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:34
+#, python-format
+msgid ""
+"\n"
+"   <li>Task name: %(task_name)s</li>\n"
+"   <li>Task: %(task)s</li>\n"
+"   <li>Id of the task: %(task_id)s</li>\n"
+"   <li>Exception instance raised: %(exception)s</li>\n"
+"   <li>Positional arguments the task was called with: %(args)s</li>\n"
+"   <li>Keyword arguments the task was called with: %(kwargs)s</li>\n"
+"   <li>Stack trace object: %(traceback)s</li>\n"
+" </ul>\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/data_checks.email:4
+msgid "The system detected some new problems with your data."
+msgstr ""
+
 #: aleksis/core/templates/templated_email/data_checks.email:10
 msgid ""
 "\n"
@@ -2537,21 +2641,30 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:20
+#: aleksis/core/templates/two_factor/core/login.html:27
+#, python-format
+msgid "Login for %(name)s"
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:28
+#: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:36
+#: aleksis/core/templates/two_factor/core/login.html:47
+msgid "Please login with your account to use the external application."
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:46
+#: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
 "\n"
 "                        We are calling your phone right now, please enter the\n"
@@ -2559,7 +2672,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:51
+#: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
 "\n"
 "                        We sent you a text message, please enter the tokens we\n"
@@ -2567,7 +2680,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:56
+#: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
 "\n"
 "                        Please enter the tokens generated by your token\n"
@@ -2575,7 +2688,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:62
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
 "\n"
 "                      Use this form for entering backup tokens for logging in.\n"
@@ -2584,23 +2697,23 @@ msgid ""
 "                    "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:90
+#: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:92
+#: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:102
+#: aleksis/core/templates/two_factor/core/login.html:121
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:105
+#: aleksis/core/templates/two_factor/core/login.html:124
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:116
+#: aleksis/core/templates/two_factor/core/login.html:135
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2869,140 +2982,156 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:283
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:295
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:416
+#: aleksis/core/views.py:412
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:435 aleksis/core/views.py:445
+#: aleksis/core/views.py:431 aleksis/core/views.py:441
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:495
+#: aleksis/core/views.py:491
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:592
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:608
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:695
+#: aleksis/core/views.py:672
+msgid "The requested preference registry does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:691
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:719
+#: aleksis/core/views.py:715
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:729
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:765
+#: aleksis/core/views.py:761
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:799
+#: aleksis/core/views.py:795
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:824
+#: aleksis/core/views.py:820
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:854
+#: aleksis/core/views.py:850
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:883
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:884
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:889
+#: aleksis/core/views.py:885
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:890
+#: aleksis/core/views.py:886
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:906
+#: aleksis/core/views.py:902
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:948
+#: aleksis/core/views.py:912
+msgid "The requested solve option does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:944
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:978
+#: aleksis/core/views.py:974
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:988
+#: aleksis/core/views.py:984
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1055
+#: aleksis/core/views.py:1051
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1053
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1127
+#: aleksis/core/views.py:1123
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1218
+#: aleksis/core/views.py:1214
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1228
+#: aleksis/core/views.py:1224
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1238
+#: aleksis/core/views.py:1234
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1248
+#: aleksis/core/views.py:1244
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1258
+#: aleksis/core/views.py:1254
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1377
+#: aleksis/core/views.py:1322
+msgid "The requested PDF file does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:1331 aleksis/core/views.py:1335
+msgid "The requested task does not exist or is not accessible"
+msgstr ""
+
+#: aleksis/core/views.py:1373
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1384
+#: aleksis/core/views.py:1380
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1441
+#: aleksis/core/views.py:1437
 msgid "Person was invited successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1443
+#: aleksis/core/views.py:1439
 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 ac0e765ef8e4c2d7ac490397fcd99e22fd921846..32736f42b6b0aafe6f26134f8b74932ab943730f 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: 2021-12-28 12:14+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\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"
@@ -30,6 +30,6 @@ msgstr ""
 msgid "OK"
 msgstr ""
 
-#: aleksis/core/static/js/main.js:128
+#: aleksis/core/static/js/main.js:131
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr ""
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
index 6a7afee49da25f0111b97b04ca8f4f51eb7aeba8..3180e0bc31999f5a1306b4daaf6883d8fca164a6 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,11 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 12:13+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\n"
 "PO-Revision-Date: 2021-12-29 13:20+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
-"Language-Team: German <https://translate.edugit.org/projects/aleksis/"
-"aleksis-core/de/>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core/de/>\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,30 +18,30 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.8\n"
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:154
 msgid "OpenID Connect scope"
 msgstr "OpenID-Connect-Scope"
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:155
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden"
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:156
 msgid "Full home postal address"
 msgstr "Vollständige Postanschrift"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:157
 msgid "Email address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:158
 msgid "Home and mobile phone"
 msgstr "Festnetz- und Mobilfunknummer"
 
-#: aleksis/core/apps.py:157 aleksis/core/forms.py:223 aleksis/core/menus.py:265
-#: aleksis/core/models.py:414 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:159 aleksis/core/forms.py:223 aleksis/core/menus.py:265
+#: aleksis/core/models.py:449 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:152
+#: aleksis/core/templates/core/person/full.html:242
 msgid "Groups"
 msgstr "Gruppen"
 
@@ -67,8 +66,8 @@ msgstr "Sicherstellen, dass es keine kaputten Dashboard-Widgets gibt."
 msgid "The DashboardWidget was reported broken automatically."
 msgstr "Das Dashboard-Widget wurde automatisch als kaputt gemeldet."
 
-#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
-#: aleksis/core/templates/core/base.html:105
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105
+#: aleksis/core/templates/core/base.html:106
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -76,27 +75,27 @@ msgstr "Das Dashboard-Widget wurde automatisch als kaputt gemeldet."
 msgid "Search"
 msgstr "Suchen"
 
-#: aleksis/core/filters.py:58
+#: aleksis/core/filters.py:59
 msgid "Search by name"
 msgstr "Nach Namen suchen"
 
-#: aleksis/core/filters.py:70
+#: aleksis/core/filters.py:71
 msgid "Search by contact details"
 msgstr "Nach Kontaktdetails suchen"
 
-#: aleksis/core/filters.py:91
+#: aleksis/core/filters.py:92
 msgid "Permission"
 msgstr "Berechtigung"
 
-#: aleksis/core/filters.py:99
+#: aleksis/core/filters.py:100
 msgid "Content type"
 msgstr "Inhaltstyp"
 
-#: aleksis/core/filters.py:112 aleksis/core/models.py:581
+#: aleksis/core/filters.py:113 aleksis/core/models.py:675
 msgid "User"
 msgstr "Benutzer"
 
-#: aleksis/core/filters.py:134 aleksis/core/models.py:413
+#: aleksis/core/filters.py:135 aleksis/core/models.py:448
 msgid "Group"
 msgstr "Gruppe"
 
@@ -104,60 +103,65 @@ msgstr "Gruppe"
 msgid "Base data"
 msgstr "Basisdaten"
 
-#: aleksis/core/forms.py:54
+#: aleksis/core/forms.py:53
 msgid "Address"
 msgstr "Adresse"
 
-#: aleksis/core/forms.py:55 aleksis/core/forms.py:568
+#: aleksis/core/forms.py:54 aleksis/core/forms.py:568
 msgid "Contact data"
 msgstr "Kontaktdaten"
 
-#: aleksis/core/forms.py:57
+#: aleksis/core/forms.py:56
 msgid "Advanced personal data"
 msgstr "Zusätzliche persönliche Daten"
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "New user"
 msgstr "Neuer Benutzer"
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "Create a new account"
 msgstr "Neues Benutzerkonto erstellen"
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:135
 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:140
+#: aleksis/core/forms.py:139
 msgid "This username is already in use."
 msgstr "Dieser Benutzername wird bereits genutzt."
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:129
+#: aleksis/core/forms.py:156 aleksis/core/models.py:130
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/core/forms.py:158
+#: aleksis/core/forms.py:157
 msgid "Common data"
 msgstr "Allgemeine Daten"
 
-#: aleksis/core/forms.py:159 aleksis/core/forms.py:210
-#: aleksis/core/menus.py:254 aleksis/core/models.py:152
+#: aleksis/core/forms.py:158 aleksis/core/forms.py:210
+#: 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:160 aleksis/core/forms.py:570
+#: aleksis/core/forms.py:159 aleksis/core/forms.py:570
 msgid "Additional data"
 msgstr "Zusätzliche Datne"
 
+#: aleksis/core/forms.py:160 aleksis/core/models.py:206
+#: aleksis/core/models.py:501
+msgid "Photo"
+msgstr "Foto"
+
 #: aleksis/core/forms.py:202 aleksis/core/forms.py:205
-#: aleksis/core/models.py:72
+#: aleksis/core/models.py:73
 msgid "Date"
 msgstr "Datum"
 
 #: aleksis/core/forms.py:203 aleksis/core/forms.py:206
-#: aleksis/core/models.py:80
+#: aleksis/core/models.py:81
 msgid "Time"
 msgstr "Zeit"
 
@@ -260,8 +264,8 @@ msgid "{task.status} - {task.result}"
 msgstr "{task.status} - {task.result}"
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:22
-#: aleksis/core/templates/two_factor/core/login.html:76
+#: aleksis/core/templates/two_factor/core/login.html:32
+#: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr "Anmelden"
 
@@ -278,8 +282,8 @@ msgstr "Einladung akzeptieren"
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:627
-#: aleksis/core/preferences.py:28
+#: aleksis/core/menus.py:41 aleksis/core/models.py:721
+#: aleksis/core/preferences.py:29
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
@@ -336,13 +340,13 @@ msgstr "Autorisierte Anwendungen"
 msgid "Admin"
 msgstr "Admin"
 
-#: aleksis/core/menus.py:141 aleksis/core/models.py:727
+#: aleksis/core/menus.py:141 aleksis/core/models.py:821
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Ankündigungen"
 
-#: aleksis/core/menus.py:152 aleksis/core/models.py:130
+#: aleksis/core/menus.py:152 aleksis/core/models.py:131
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -394,7 +398,7 @@ msgstr "OAuth2-Anwendungen"
 msgid "People"
 msgstr "Leute"
 
-#: aleksis/core/menus.py:276 aleksis/core/models.py:981
+#: aleksis/core/menus.py:276 aleksis/core/models.py:1075
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
@@ -404,7 +408,7 @@ msgstr "Gruppentypen"
 msgid "Groups and child groups"
 msgstr "Gruppen und Kindgruppen"
 
-#: aleksis/core/menus.py:298 aleksis/core/models.py:462
+#: aleksis/core/menus.py:298 aleksis/core/models.py:497
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
@@ -424,722 +428,742 @@ msgstr "Kindgruppen zu Gruppen zuordnen"
 msgid "Linked school term"
 msgstr "Zugeordnetes Schuljahr"
 
-#: aleksis/core/models.py:70
+#: aleksis/core/models.py:71
 msgid "Boolean (Yes/No)"
 msgstr "Boolean (Ja/Nein)"
 
-#: aleksis/core/models.py:71
+#: aleksis/core/models.py:72
 msgid "Text (one line)"
 msgstr "Text (eine Zeile)"
 
-#: aleksis/core/models.py:73
+#: aleksis/core/models.py:74
 msgid "Date and time"
 msgstr "Datum und Uhrzeit"
 
-#: aleksis/core/models.py:74
+#: aleksis/core/models.py:75
 msgid "Decimal number"
 msgstr "Dezimalzahl"
 
-#: aleksis/core/models.py:75 aleksis/core/models.py:198
+#: aleksis/core/models.py:76 aleksis/core/models.py:199
 msgid "E-mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:77
 msgid "Integer"
 msgstr "Ganze Zahl"
 
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:78
 msgid "IP address"
 msgstr "IP-Adresse"
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:79
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Boolean oder leer (Ja/Nein/weder)"
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:80
 msgid "Text (multi-line)"
 msgstr "Text (mehrzeilig)"
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:82
 msgid "URL / Link"
 msgstr "URL / Link"
 
-#: aleksis/core/models.py:93 aleksis/core/models.py:950
+#: aleksis/core/models.py:94 aleksis/core/models.py:1044
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/core/models.py:95
+#: aleksis/core/models.py:96
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/core/models.py:96
+#: aleksis/core/models.py:97
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/core/models.py:115
+#: aleksis/core/models.py:116
 msgid "The start date must be earlier than the end date."
 msgstr "Das Startdatum muss vor dem Enddatum liegen."
 
-#: aleksis/core/models.py:122
+#: aleksis/core/models.py:123
 msgid "There is already a school term for this time or a part of this time."
 msgstr "Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum."
 
-#: aleksis/core/models.py:151 aleksis/core/models.py:899
+#: aleksis/core/models.py:152 aleksis/core/models.py:993
 msgid "Person"
 msgstr "Person"
 
-#: aleksis/core/models.py:154
+#: aleksis/core/models.py:155
 msgid "Can view address"
 msgstr "Kann Adresse sehen"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "Can view contact details"
 msgstr "Kann Kontaktdetails sehen"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:157
 msgid "Can view photo"
 msgstr "Kann Foto sehen"
 
-#: aleksis/core/models.py:157
+#: aleksis/core/models.py:158
+#, fuzzy
+#| msgid "Can view address"
+msgid "Can view avatar image"
+msgstr "Kann Adresse sehen"
+
+#: aleksis/core/models.py:159
 msgid "Can view persons groups"
 msgstr "Kann Gruppen einer Person sehen"
 
-#: aleksis/core/models.py:158
+#: aleksis/core/models.py:160
 msgid "Can view personal details"
 msgstr "Kann persönliche Daten sehen"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "female"
 msgstr "weiblich"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "male"
 msgstr "männlich"
 
-#: aleksis/core/models.py:176 aleksis/core/models.py:1144
+#: aleksis/core/models.py:178 aleksis/core/models.py:1238
 msgid "Linked user"
 msgstr "Verknüpfter Benutzer"
 
-#: aleksis/core/models.py:178
-msgid "Is person active?"
-msgstr "Ist die Person aktiv?"
-
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "First name"
 msgstr "Vorname"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "Last name"
 msgstr "Nachname"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr "Zusätzliche Namen"
 
-#: aleksis/core/models.py:187 aleksis/core/models.py:431
+#: aleksis/core/models.py:188 aleksis/core/models.py:466
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Street"
 msgstr "Straße"
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:192
 msgid "Street number"
 msgstr "Hausnummer"
 
-#: aleksis/core/models.py:192
+#: aleksis/core/models.py:193
 msgid "Postal code"
 msgstr "Postleitzahl"
 
-#: aleksis/core/models.py:193
+#: aleksis/core/models.py:194
 msgid "Place"
 msgstr "Ort"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Home phone"
 msgstr "Festnetz"
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:197
 msgid "Mobile phone"
 msgstr "Handy"
 
-#: aleksis/core/models.py:200
+#: aleksis/core/models.py:201
 msgid "Date of birth"
 msgstr "Geburtsdatum"
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Place of birth"
 msgstr "Geburtsort"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Sex"
 msgstr "Geschlecht"
 
-#: aleksis/core/models.py:204
-msgid "Photo"
-msgstr "Foto"
+#: aleksis/core/models.py:210 aleksis/core/models.py:505
+msgid "This is an official photo, used for official documents and for internal use cases."
+msgstr ""
 
-#: aleksis/core/models.py:208 aleksis/core/templates/core/person/full.html:145
+#: aleksis/core/models.py:215 aleksis/core/models.py:509
+msgid "Display picture / Avatar"
+msgstr ""
+
+#: aleksis/core/models.py:218 aleksis/core/models.py:512
+msgid "This is a picture or an avatar for public display."
+msgstr ""
+
+#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:231
 msgid "Guardians / Parents"
 msgstr "Erziehungsberechtigte / Eltern"
 
-#: aleksis/core/models.py:215
+#: aleksis/core/models.py:230
 msgid "Primary group"
 msgstr "Primärgruppe"
 
-#: aleksis/core/models.py:218 aleksis/core/models.py:585
-#: aleksis/core/models.py:609 aleksis/core/models.py:694
-#: aleksis/core/models.py:974 aleksis/core/templates/core/person/full.html:128
+#: aleksis/core/models.py:233 aleksis/core/models.py:679
+#: aleksis/core/models.py:703 aleksis/core/models.py:788
+#: aleksis/core/models.py:1068
 msgid "Description"
 msgstr "Beschreibung"
 
-#: aleksis/core/models.py:386
+#: aleksis/core/models.py:421
 msgid "Title of field"
 msgstr "Feldtitel"
 
-#: aleksis/core/models.py:388
+#: aleksis/core/models.py:423
 msgid "Type of field"
 msgstr "Feldtyp"
 
-#: aleksis/core/models.py:395
+#: aleksis/core/models.py:430
 msgid "Addtitional field for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:431
 msgid "Addtitional fields for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:416
+#: aleksis/core/models.py:451
 msgid "Can assign child groups to groups"
 msgstr "Kann Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/models.py:417
+#: aleksis/core/models.py:452
 msgid "Can view statistics about group."
 msgstr "Kann Statistiken über Gruppen sehen."
 
-#: aleksis/core/models.py:429
+#: aleksis/core/models.py:464
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/core/models.py:439 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:474 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr "Mitglieder"
 
-#: aleksis/core/models.py:442 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:477 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Leiter/-innen"
 
-#: aleksis/core/models.py:449 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:484 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr "Ãœbergeordnete Gruppen"
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:492
 msgid "Type of group"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:584 aleksis/core/models.py:608
-#: aleksis/core/models.py:693
+#: aleksis/core/models.py:678 aleksis/core/models.py:702
+#: aleksis/core/models.py:787
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:681
 msgid "Application"
 msgstr "Anwendung"
 
-#: aleksis/core/models.py:593
+#: aleksis/core/models.py:687
 msgid "Activity"
 msgstr "Aktivität"
 
-#: aleksis/core/models.py:594
+#: aleksis/core/models.py:688
 msgid "Activities"
 msgstr "Aktivitäten"
 
-#: aleksis/core/models.py:600
+#: aleksis/core/models.py:694
 msgid "Sender"
 msgstr "Absender"
 
-#: aleksis/core/models.py:605
+#: aleksis/core/models.py:699
 msgid "Recipient"
 msgstr "Empfänger"
 
-#: aleksis/core/models.py:610 aleksis/core/models.py:951
+#: aleksis/core/models.py:704 aleksis/core/models.py:1045
 msgid "Link"
 msgstr "Link"
 
-#: aleksis/core/models.py:612
+#: aleksis/core/models.py:706
 msgid "Read"
 msgstr "Gelesen"
 
-#: aleksis/core/models.py:613
+#: aleksis/core/models.py:707
 msgid "Sent"
 msgstr "Versandt"
 
-#: aleksis/core/models.py:626
+#: aleksis/core/models.py:720
 msgid "Notification"
 msgstr "Benachrichtigung"
 
-#: aleksis/core/models.py:695
+#: aleksis/core/models.py:789
 msgid "Link to detailed view"
 msgstr "Link zur detaillierten Ansicht"
 
-#: aleksis/core/models.py:698
+#: aleksis/core/models.py:792
 msgid "Date and time from when to show"
 msgstr "Datum und Uhrzeit des Anzeigestarts"
 
-#: aleksis/core/models.py:701
+#: aleksis/core/models.py:795
 msgid "Date and time until when to show"
 msgstr "Anzeigezeitraum"
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:820
 msgid "Announcement"
 msgstr "Ankündigung"
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:858
 msgid "Announcement recipient"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:765
+#: aleksis/core/models.py:859
 msgid "Announcement recipients"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:914
 msgid "Widget Title"
 msgstr "Widget-Titel"
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:915
 msgid "Activate Widget"
 msgstr "Widget aktivieren"
 
-#: aleksis/core/models.py:822
+#: aleksis/core/models.py:916
 msgid "Widget is broken"
 msgstr "Widget ist kaputt"
 
-#: aleksis/core/models.py:825
+#: aleksis/core/models.py:919
 msgid "Size on mobile devices"
 msgstr "Größe auf Mobilgeräten"
 
-#: aleksis/core/models.py:826
+#: aleksis/core/models.py:920
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 px, 12 Spalten"
 
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:925
 msgid "Size on tablet devices"
 msgstr "Größe auf Tablets"
 
-#: aleksis/core/models.py:832
+#: aleksis/core/models.py:926
 msgid "> 600 px, 12 columns"
 msgstr "> 600px, 12 Spalten"
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:931
 msgid "Size on desktop devices"
 msgstr "Größe auf Desktopgeräten"
 
-#: aleksis/core/models.py:838
+#: aleksis/core/models.py:932
 msgid "> 992 px, 12 columns"
 msgstr "> 992 px, 12 Spalten"
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:937
 msgid "Size on large desktop devices"
 msgstr "Größe auf großen Desktopgeräten"
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:938
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 px, 12 Spalten"
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:969
 msgid "Can edit default dashboard"
 msgstr "Kann Standarddashboard bearbeiten"
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:970
 msgid "Dashboard Widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:971
 msgid "Dashboard Widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/models.py:883
+#: aleksis/core/models.py:977
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:978
 msgid "Icon URL"
 msgstr "Symbol-URL"
 
-#: aleksis/core/models.py:890
+#: aleksis/core/models.py:984
 msgid "External link widget"
 msgstr "Externer-Link-Widget"
 
-#: aleksis/core/models.py:891
+#: aleksis/core/models.py:985
 msgid "External link widgets"
 msgstr "Externer-Link-Widgets"
 
-#: aleksis/core/models.py:896
+#: aleksis/core/models.py:990
 msgid "Dashboard widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:995
 msgid "Order"
 msgstr "Reihenfolge"
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:996
 msgid "Part of the default dashboard"
 msgstr "Teil des Standarddashboards"
 
-#: aleksis/core/models.py:917
+#: aleksis/core/models.py:1011
 msgid "Dashboard widget order"
 msgstr "Reihenfolge der Dashboard-Widgets"
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:1012
 msgid "Dashboard widget orders"
 msgstr "Reihenfolgen der Dashboard-Widgets"
 
-#: aleksis/core/models.py:924
+#: aleksis/core/models.py:1018
 msgid "Menu ID"
 msgstr "Menü-ID"
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:1031
 msgid "Custom menu"
 msgstr "Benutzerdefiniertes Menü"
 
-#: aleksis/core/models.py:938
+#: aleksis/core/models.py:1032
 msgid "Custom menus"
 msgstr "Benutzerdefinierte Menüs"
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:1042
 msgid "Menu"
 msgstr "Menü"
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:1046 aleksis/core/models.py:1285
+#: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:1052
 msgid "Custom menu item"
 msgstr "Benutzerdefiniertes Menüelement"
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:1053
 msgid "Custom menu items"
 msgstr "Benutzerdefinierte Menüelemente"
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:1067
 msgid "Title of type"
 msgstr "Titel des Typs"
 
-#: aleksis/core/models.py:980 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1074 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:994
+#: aleksis/core/models.py:1088
 msgid "Can view system status"
 msgstr "Kann Systemstatus sehen"
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:1089
 msgid "Can manage data"
 msgstr "Kann Daten verwalten"
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:1090
 msgid "Can impersonate"
 msgstr "Kann sich verkleiden"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:1091
 msgid "Can use search"
 msgstr "Kann Suche benutzen"
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:1092
 msgid "Can change site preferences"
 msgstr "Kann Konfiguration ändern"
 
-#: aleksis/core/models.py:999
+#: aleksis/core/models.py:1093
 msgid "Can change person preferences"
 msgstr "Kann Einstellungen einer Person verändern"
 
-#: aleksis/core/models.py:1000
+#: aleksis/core/models.py:1094
 msgid "Can change group preferences"
 msgstr "Kann Einstellungen einer Gruppe verändern"
 
-#: aleksis/core/models.py:1001
+#: aleksis/core/models.py:1095
 msgid "Can test PDF generation"
 msgstr "Kann die PDF-Generierung testen"
 
-#: aleksis/core/models.py:1037
+#: aleksis/core/models.py:1131
 msgid "Related data check task"
 msgstr "Zugehörige Datenprüfungsaufgabe"
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1139
 msgid "Issue solved"
 msgstr "Problem gelöst"
 
-#: aleksis/core/models.py:1046
+#: aleksis/core/models.py:1140
 msgid "Notification sent"
 msgstr "Benachrichtigung gesendet"
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1153
 msgid "Data check result"
 msgstr "Datenprüfungsergebnis"
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1154
 msgid "Data check results"
 msgstr "Datenprüfungsergebnisse"
 
-#: aleksis/core/models.py:1062
+#: aleksis/core/models.py:1156
 msgid "Can run data checks"
 msgstr "Kann Datenprüfungen ausführen"
 
-#: aleksis/core/models.py:1063
+#: aleksis/core/models.py:1157
 msgid "Can solve data check problems"
 msgstr "Kann Datenprüfungsprobleme lösen"
 
-#: aleksis/core/models.py:1070
+#: aleksis/core/models.py:1164
 msgid "E-Mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:1094
+#: aleksis/core/models.py:1188
 msgid "Owner"
 msgstr "Leiter"
 
-#: aleksis/core/models.py:1098
+#: aleksis/core/models.py:1192
 msgid "File expires at"
 msgstr "Datei abgelaufen am"
 
-#: aleksis/core/models.py:1100
+#: aleksis/core/models.py:1194
 msgid "Generated HTML file"
 msgstr "Generierte HTML-Datei"
 
-#: aleksis/core/models.py:1102
+#: aleksis/core/models.py:1196
 msgid "Generated PDF file"
 msgstr "Generierte PDF-Datei"
 
-#: aleksis/core/models.py:1109
+#: aleksis/core/models.py:1203
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/core/models.py:1110
+#: aleksis/core/models.py:1204
 msgid "PDF files"
 msgstr "PDF-Dateien"
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1209
 msgid "Task result"
 msgstr "Task-Ergebnis"
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1212
 msgid "Task user"
 msgstr "Task-Benutzer"
 
-#: aleksis/core/models.py:1130
+#: aleksis/core/models.py:1224
 msgid "Task user assignment"
 msgstr "Task-Benutzer-Zuordnung"
 
-#: aleksis/core/models.py:1131
+#: aleksis/core/models.py:1225
 msgid "Task user assignments"
 msgstr "Task-Benutzer-Zuordnungen"
 
-#: aleksis/core/models.py:1147
+#: aleksis/core/models.py:1241
 msgid "Additional attributes"
 msgstr "Zusätzliche Attribute"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1279
 msgid "Allowed scopes that clients can request"
 msgstr "Erlaubte Scopes, die ein Client anfordern kann"
 
-#: aleksis/core/preferences.py:24
+#: aleksis/core/models.py:1289
+msgid "This image will be shown as icon in the authorization flow. It should be squared."
+msgstr ""
+
+#: aleksis/core/preferences.py:25
 msgid "General"
 msgstr "Allgemein"
 
-#: aleksis/core/preferences.py:25
+#: aleksis/core/preferences.py:26
 msgid "School"
 msgstr "Schule"
 
-#: aleksis/core/preferences.py:26
+#: aleksis/core/preferences.py:27
 msgid "Theme"
 msgstr "Theme"
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Mail"
 msgstr "E-Mail"
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Footer"
 msgstr "Fußbereich"
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Accounts"
 msgstr "Konten"
 
-#: aleksis/core/preferences.py:31
+#: aleksis/core/preferences.py:32
 msgid "Authentication"
 msgstr "Authentifizierung"
 
-#: aleksis/core/preferences.py:32
+#: aleksis/core/preferences.py:33
 msgid "Internationalisation"
 msgstr "Internationalisierung"
 
-#: aleksis/core/preferences.py:43
+#: aleksis/core/preferences.py:44
 msgid "Site title"
 msgstr "Seitentitel"
 
-#: aleksis/core/preferences.py:54
+#: aleksis/core/preferences.py:55
 msgid "Site description"
 msgstr "Seitenbeschreibung"
 
-#: aleksis/core/preferences.py:65
+#: aleksis/core/preferences.py:66
 msgid "Primary colour"
 msgstr "Primärfarbe"
 
-#: aleksis/core/preferences.py:77
+#: aleksis/core/preferences.py:78
 msgid "Secondary colour"
 msgstr "Akzentfarbe"
 
-#: aleksis/core/preferences.py:88
+#: aleksis/core/preferences.py:89
 msgid "Logo"
 msgstr "Logo"
 
-#: aleksis/core/preferences.py:98
+#: aleksis/core/preferences.py:99
 msgid "Favicon"
 msgstr "Favicon"
 
-#: aleksis/core/preferences.py:108
+#: aleksis/core/preferences.py:109
 msgid "PWA-Icon"
 msgstr "PWA-Icon"
 
-#: aleksis/core/preferences.py:119
+#: aleksis/core/preferences.py:120
 msgid "Mail out name"
 msgstr "Ausgangsmailname"
 
-#: aleksis/core/preferences.py:130
+#: aleksis/core/preferences.py:131
 msgid "Mail out address"
 msgstr "E-Mail-Ausgangsadresse"
 
-#: aleksis/core/preferences.py:142
+#: aleksis/core/preferences.py:143
 msgid "Link to privacy policy"
 msgstr "Link zur Datenschutzerklärung"
 
-#: aleksis/core/preferences.py:154
+#: aleksis/core/preferences.py:155
 msgid "Link to imprint"
 msgstr "Link zum Impressum"
 
-#: aleksis/core/preferences.py:166
+#: aleksis/core/preferences.py:167
 msgid "Name format for addressing"
 msgstr "Namensformat für Anreden"
 
-#: aleksis/core/preferences.py:182
+#: aleksis/core/preferences.py:183
 msgid "Channels to use for notifications"
 msgstr "Aktivierte Benachrichtungskanäle"
 
-#: aleksis/core/preferences.py:194
+#: aleksis/core/preferences.py:195
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr "Regulärer Ausdruck um Primärgruppen zu finden, z. B.  '^Class .*'"
 
-#: aleksis/core/preferences.py:205
+#: aleksis/core/preferences.py:206
 msgid "Field on person to match primary group against"
 msgstr "Feld um Primärgruppen zu finden"
 
-#: aleksis/core/preferences.py:217
+#: aleksis/core/preferences.py:218
 msgid "Automatically create new persons for new users"
 msgstr "Erstelle automatisch neue Personen für neue Benutzer"
 
-#: aleksis/core/preferences.py:226
+#: aleksis/core/preferences.py:227
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr "Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer E-Mail-Adresse"
 
-#: aleksis/core/preferences.py:237
+#: aleksis/core/preferences.py:238
 msgid "Display name of the school"
 msgstr "Sichtbarer Name der Schule"
 
-#: aleksis/core/preferences.py:248
+#: aleksis/core/preferences.py:249
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr "Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist"
 
-#: aleksis/core/preferences.py:256
+#: aleksis/core/preferences.py:257
 msgid "Allow users to change their passwords"
 msgstr "Erlaube Benutzern, ihr Passwort zu ändern"
 
-#: aleksis/core/preferences.py:264
+#: aleksis/core/preferences.py:265
 msgid "Enable signup"
 msgstr "Registrierung aktivieren"
 
-#: aleksis/core/preferences.py:272
+#: aleksis/core/preferences.py:273
 msgid "Enable invitations"
 msgstr "Einladungen aktivieren"
 
-#: aleksis/core/preferences.py:280
+#: aleksis/core/preferences.py:281
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
 msgstr "Länge des Einladungscodes. (Standard: 3: abcde-acbde-abcde)"
 
-#: aleksis/core/preferences.py:288
+#: aleksis/core/preferences.py:289
 msgid "Size of packets. (Default 5: abcde)"
 msgstr "Größe der Pakete. (Standard 5: abcde)"
 
-#: aleksis/core/preferences.py:298
+#: aleksis/core/preferences.py:300
 msgid "Allowed Grant Flows for OAuth applications"
 msgstr "Erlaubte Grant Flows für OAuth-Anwendungen"
 
-#: aleksis/core/preferences.py:311
+#: aleksis/core/preferences.py:313
 msgid "Available languages"
 msgstr "Verfügbare Sprachen"
 
-#: aleksis/core/preferences.py:323
+#: aleksis/core/preferences.py:325
 msgid "Send emails if data checks detect problems"
 msgstr "E-Mails versenden, wenn Datenprüfungen Probleme finden"
 
-#: aleksis/core/preferences.py:334
+#: aleksis/core/preferences.py:336
 msgid "Email recipients for data checks problem emails"
 msgstr "E-Mailempfänger für Datenprüfungsproblem-E-Mails"
 
-#: aleksis/core/preferences.py:345
+#: aleksis/core/preferences.py:347
 msgid "Email recipient groups for data checks problem emails"
 msgstr "E-Mail-Empfängergruppen für Datenprüfungsproblem-E-Mails"
 
-#: aleksis/core/preferences.py:354
+#: aleksis/core/preferences.py:356
 msgid "Show dashboard to users without login"
 msgstr "Zeige Dashboard für Benutzer ohne Login"
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:365
 msgid "Allow users to edit their dashboard"
 msgstr "Erlaube Benutzern, ihr Dashboard zu bearbeiten"
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:376
 msgid "Fields on person model which are editable by themselves."
 msgstr "Felder des Personen-Models welche von ihnen selbst editierbar sind."
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:390
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr "Editierbare Felder des Personen-Models welche eine Benachrichtigung für Änderungen auslösen soll"
 
-#: aleksis/core/preferences.py:401
+#: aleksis/core/preferences.py:403
 msgid "Contact for notification if a person changes their data"
 msgstr "Kontakt für Benachrichtigung, wenn eine Person ihre Daten ändert"
 
-#: aleksis/core/preferences.py:411
+#: aleksis/core/preferences.py:413
 msgid "PDF file expiration duration"
 msgstr "PDF-Datei-Ablaufdauer"
 
-#: aleksis/core/preferences.py:412
+#: aleksis/core/preferences.py:414
 msgid "in minutes"
 msgstr "in Minuten"
 
-#: aleksis/core/preferences.py:422
+#: aleksis/core/preferences.py:424
 msgid "Automatically update the dashboard and its widgets"
 msgstr "Automatisch das Dashboard und seine Widgets aktualisieren"
 
-#: aleksis/core/preferences.py:432
+#: aleksis/core/preferences.py:434
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen Seite)"
 
-#: aleksis/core/settings.py:507
+#: aleksis/core/preferences.py:444
+msgid "Country for phone number parsing"
+msgstr ""
+
+#: aleksis/core/settings.py:518
 msgid "English"
 msgstr "Englisch"
 
-#: aleksis/core/settings.py:508
+#: aleksis/core/settings.py:519
 msgid "German"
 msgstr "Deutsch"
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
-#: aleksis/core/templates/core/person/full.html:24
+#: aleksis/core/templates/core/person/full.html:26
+#: aleksis/core/templates/core/person/full.html:98
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr "Bearbeiten"
@@ -1156,14 +1180,14 @@ msgstr "Aktionen"
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
-#: aleksis/core/templates/core/person/full.html:31
+#: aleksis/core/templates/core/person/full.html:33
+#: aleksis/core/templates/core/person/full.html:105
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr "Löschen"
 
-#: aleksis/core/templates/403.html:14 aleksis/core/templates/404.html:10
-#: aleksis/core/templates/500.html:10
-#: aleksis/core/templates/oauth2_provider/authorize.html:47
+#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
+#: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
 msgstr "Fehler"
@@ -1176,7 +1200,7 @@ msgstr ""
 "Es ist Ihnen nicht erlaubt, auf die angefragte Seite oder das angefragte\n"
 "             Objekt zuzugreifen."
 
-#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:17
+#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
 "            If you think this is an error in AlekSIS, please contact your site\n"
@@ -1188,15 +1212,7 @@ msgstr ""
 "     Systemadministratoren:\n"
 "          "
 
-#: aleksis/core/templates/404.html:10
-msgid ""
-"The requested page or object was not\n"
-"          found."
-msgstr ""
-"Die angefragte Seite oder das angefragte Objekt wurde nicht\n"
-"            gefunden."
-
-#: aleksis/core/templates/404.html:13
+#: aleksis/core/templates/404.html:12
 msgid ""
 "\n"
 "            If you were redirected by a link on an external page,\n"
@@ -1280,6 +1296,7 @@ msgstr "Ihr AlekSIS-Team"
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
+#: aleksis/core/templates/socialaccount/login.html:17
 msgid "Confirm"
 msgstr "Bestätigen"
 
@@ -1328,7 +1345,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:81
+#: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
 msgstr "Passwort zurücksetzen"
 
@@ -1533,15 +1550,15 @@ msgstr "Es gibt aktuell keine Ankündigungen."
 msgid "Logged in as"
 msgstr "Angemeldet als"
 
-#: aleksis/core/templates/core/base.html:175
+#: aleksis/core/templates/core/base.html:179
 msgid "About AlekSIS® — The Free School Information System"
 msgstr "Über AlekSIS® — The Free School Information System"
 
-#: aleksis/core/templates/core/base.html:183
+#: aleksis/core/templates/core/base.html:187
 msgid "Imprint"
 msgstr "Impressum"
 
-#: aleksis/core/templates/core/base.html:191
+#: aleksis/core/templates/core/base.html:195
 msgid "Privacy Policy"
 msgstr "Datenschutzerklärung"
 
@@ -1637,15 +1654,15 @@ msgstr "Details anzeigen"
 msgid "Options to solve the problem"
 msgstr "Optionen, das Problem zu lösen"
 
-#: aleksis/core/templates/core/data_check/list.html:62
+#: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
 msgstr "Objekt anzeigen"
 
-#: aleksis/core/templates/core/data_check/list.html:84
+#: aleksis/core/templates/core/data_check/list.html:86
 msgid "Registered checks"
 msgstr "Registrierte Prüfungen"
 
-#: aleksis/core/templates/core/data_check/list.html:88
+#: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1792,7 +1809,8 @@ msgid "Edit group"
 msgstr "Gruppe editieren"
 
 #: aleksis/core/templates/core/group/full.html:38
-#: aleksis/core/templates/core/person/full.html:38
+#: aleksis/core/templates/core/person/full.html:40
+#: aleksis/core/templates/core/person/full.html:112
 msgid "Change preferences"
 msgstr "Einstellungen ändern"
 
@@ -2242,19 +2260,37 @@ msgstr "Person erstellen"
 msgid "Edit person"
 msgstr "Person editieren"
 
-#: aleksis/core/templates/core/person/full.html:45
+#: aleksis/core/templates/core/person/full.html:47
+#: aleksis/core/templates/core/person/full.html:119
 msgid "Impersonate"
 msgstr "Verkleiden"
 
-#: aleksis/core/templates/core/person/full.html:51
+#: aleksis/core/templates/core/person/full.html:54
+#: aleksis/core/templates/core/person/full.html:126
 msgid "Invite user"
 msgstr "Benutzer einladen"
 
-#: aleksis/core/templates/core/person/full.html:57
+#: aleksis/core/templates/core/person/full.html:133
 msgid "Contact details"
 msgstr "Kontaktdetails"
 
-#: aleksis/core/templates/core/person/full.html:138
+#: aleksis/core/templates/core/person/full.html:168
+#, fuzzy
+#| msgid "Street number"
+msgid "home number"
+msgstr "Hausnummer"
+
+#: aleksis/core/templates/core/person/full.html:174
+#, fuzzy
+#| msgid "Decimal number"
+msgid "mobile number"
+msgstr "Dezimalzahl"
+
+#: aleksis/core/templates/core/person/full.html:216
+msgid "This person didn't upload a personal photo."
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:224
 msgid "Children"
 msgstr "Kinder"
 
@@ -2357,27 +2393,27 @@ msgstr "Abbrechen"
 msgid "OAuth2 Application"
 msgstr "OAuth2-Anwendung"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
 msgstr "Client-ID"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
 msgstr "Client-Secret"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
 msgstr "Client-Typ"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+#: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
 msgstr "Erlaubte Scopes"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
 msgstr "Weiterleitungs-URLs"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#: aleksis/core/templates/oauth2_provider/application/detail.html:79
 msgid "Skip Authorisation"
 msgstr "Authentifizierung überspringen"
 
@@ -2390,24 +2426,31 @@ msgstr "OAuth2-Anwendung bearbeiten"
 msgid "Register new application"
 msgstr "Neue Anwendung registrieren"
 
-#: aleksis/core/templates/oauth2_provider/application/list.html:20
+#: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
 msgstr "Keine Anwendungen definiert."
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
-#: aleksis/core/templates/oauth2_provider/authorize.html:16
+#: aleksis/core/templates/socialaccount/login.html:5
+#: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
 msgstr "Autorisieren"
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:18
+#: aleksis/core/templates/oauth2_provider/authorize.html:23
+#, fuzzy, python-format
+#| msgid "Authorized tokens"
+msgid "Authorize %(name)s"
+msgstr "Autorisierte Tokens"
+
+#: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
 msgstr "Die Anwendung fordert Zugriff auf die folgenden Bereiche an:"
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:33
+#: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
 msgstr "Erlauben"
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:36
+#: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
 msgstr "Verbieten"
 
@@ -2521,6 +2564,22 @@ msgstr "Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden."
 msgid "Add a Third-party Account"
 msgstr "Ein Drittanbieter-Konto hinzufügen"
 
+#: aleksis/core/templates/socialaccount/login.html:12
+#, python-format
+msgid "You are about to connect a new third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:23
+#, python-format
+msgid "You are about to sign in using a third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:28
+#, fuzzy
+#| msgid "Content type"
+msgid "Continue"
+msgstr "Inhaltstyp"
+
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
@@ -2579,10 +2638,13 @@ msgstr ""
 "          Keine Drittanbieter verfügbar.\n"
 "        "
 
-#: aleksis/core/templates/templated_email/data_checks.email:4
-msgid "The system detected some new problems with your data."
-msgstr "Das System hat einige neue Probleme mit Ihren Daten entdeckt."
+#: aleksis/core/templates/templated_email/celery_failure.email:4
+#, python-format
+msgid " Celery task %(task_name)s failed!"
+msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:8
+#: aleksis/core/templates/templated_email/celery_failure.email:26
 #: aleksis/core/templates/templated_email/data_checks.email:8
 #: aleksis/core/templates/templated_email/data_checks.email:24
 #: aleksis/core/templates/templated_email/person_changed.email:8
@@ -2590,6 +2652,68 @@ msgstr "Das System hat einige neue Probleme mit Ihren Daten entdeckt."
 msgid "Hello,"
 msgstr "Hallo,"
 
+#: aleksis/core/templates/templated_email/celery_failure.email:9
+#, fuzzy, python-format
+#| msgid ""
+#| "\n"
+#| "   the person %(person)s recently changed the following fields:\n"
+#| " "
+msgid ""
+"\n"
+"   the celery task %(task_name)s failed with following information:\n"
+" "
+msgstr ""
+"\n"
+"   die Person %(person)s hat kürzlich die folgenden Felder geändert:\n"
+" "
+
+#: aleksis/core/templates/templated_email/celery_failure.email:14
+#, python-format
+msgid ""
+"\n"
+" * Task name: %(task_name)s\n"
+" * Task: %(task)s\n"
+" * Id of the task: %(task_id)s\n"
+" * Exception instance raised: %(exception)s\n"
+" * Positional arguments the task was called with: %(args)s\n"
+" * Keyword arguments the task was called with: %(kwargs)s\n"
+" * Stack trace object: %(traceback)s\n"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:28
+#, fuzzy, python-format
+#| msgid ""
+#| "\n"
+#| "    the person %(person)s recently changed the following fields:\n"
+#| "  "
+msgid ""
+"\n"
+"    the celery task %(task_name)s failed with following information:\n"
+"  "
+msgstr ""
+"\n"
+"    die Person %(person)s hat kürzlich die folgenden Felder geändert:\n"
+"  "
+
+#: aleksis/core/templates/templated_email/celery_failure.email:34
+#, python-format
+msgid ""
+"\n"
+"   <li>Task name: %(task_name)s</li>\n"
+"   <li>Task: %(task)s</li>\n"
+"   <li>Id of the task: %(task_id)s</li>\n"
+"   <li>Exception instance raised: %(exception)s</li>\n"
+"   <li>Positional arguments the task was called with: %(args)s</li>\n"
+"   <li>Keyword arguments the task was called with: %(kwargs)s</li>\n"
+"   <li>Stack trace object: %(traceback)s</li>\n"
+" </ul>\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/data_checks.email:4
+msgid "The system detected some new problems with your data."
+msgstr "Das System hat einige neue Probleme mit Ihren Daten entdeckt."
+
 #: aleksis/core/templates/templated_email/data_checks.email:10
 msgid ""
 "\n"
@@ -2743,11 +2867,17 @@ msgstr "Zurück zur Kontosicherheit"
 msgid "Generate Tokens"
 msgstr "Tokens generieren"
 
-#: aleksis/core/templates/two_factor/core/login.html:20
+#: aleksis/core/templates/two_factor/core/login.html:27
+#, fuzzy, python-format
+#| msgid "Create %(name)s"
+msgid "Login for %(name)s"
+msgstr "%(name)s erstellen"
+
+#: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
 msgstr "Anmeldung mit Benutzername und Passwort"
 
-#: aleksis/core/templates/two_factor/core/login.html:28
+#: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
@@ -2755,11 +2885,15 @@ msgstr ""
 "Sie haben keine Berichtigung, um diese Seite aufzurufen. \n"
 "Bitte loggen Sie sich mit einem anderen Account ein."
 
-#: aleksis/core/templates/two_factor/core/login.html:36
+#: aleksis/core/templates/two_factor/core/login.html:47
+msgid "Please login with your account to use the external application."
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
 msgstr "Bitte melden Sie sich an, um diese Seite zu sehen."
 
-#: aleksis/core/templates/two_factor/core/login.html:46
+#: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
 "\n"
 "                        We are calling your phone right now, please enter the\n"
@@ -2771,7 +2905,7 @@ msgstr ""
 "            bitte geben Sie die Zahlen ein, die Sie hören.\n"
 "                      "
 
-#: aleksis/core/templates/two_factor/core/login.html:51
+#: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
 "\n"
 "                        We sent you a text message, please enter the tokens we\n"
@@ -2783,7 +2917,7 @@ msgstr ""
 "            bitte geben Sie die Token ein, die wir geschickt haben.\n"
 "                      "
 
-#: aleksis/core/templates/two_factor/core/login.html:56
+#: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
 "\n"
 "                        Please enter the tokens generated by your token\n"
@@ -2795,7 +2929,7 @@ msgstr ""
 "              generierten Token ein.\n"
 "                      "
 
-#: aleksis/core/templates/two_factor/core/login.html:62
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
 "\n"
 "                      Use this form for entering backup tokens for logging in.\n"
@@ -2809,23 +2943,23 @@ msgstr ""
 "                geben Sie einen dieser Tokens ein, um sich einzuloggen.\n"
 "                    "
 
-#: aleksis/core/templates/two_factor/core/login.html:90
+#: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
 msgstr "Gerät aktuell nicht verfügbar?"
 
-#: aleksis/core/templates/two_factor/core/login.html:92
+#: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr "Oder, alternativ, nutzen Sie eins Ihrer Backup-Telefone:"
 
-#: aleksis/core/templates/two_factor/core/login.html:102
+#: aleksis/core/templates/two_factor/core/login.html:121
 msgid "As a last resort, you can use a backup token:"
 msgstr "Als letzte Möglichkeit können Sie einen Backup-Token nutzen:"
 
-#: aleksis/core/templates/two_factor/core/login.html:105
+#: aleksis/core/templates/two_factor/core/login.html:124
 msgid "Use Backup Token"
 msgstr "Backup-Token nutzen"
 
-#: aleksis/core/templates/two_factor/core/login.html:116
+#: aleksis/core/templates/two_factor/core/login.html:135
 msgid "Use alternative login options"
 msgstr "Alternative Anmeldemöglichkeiten nutzen"
 
@@ -3166,144 +3300,174 @@ msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten."
 msgid "Download PDF"
 msgstr "PDF herunterladen"
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:283
 msgid "The school term has been created."
 msgstr "Das Schuljahr wurde erstellt."
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:295
 msgid "The school term has been saved."
 msgstr "Das Schuljahr wurde gespeichert."
 
-#: aleksis/core/views.py:416
+#: aleksis/core/views.py:412
 msgid "The child groups were successfully saved."
 msgstr "Die Untergruppen wurden gespeichert."
 
-#: aleksis/core/views.py:435 aleksis/core/views.py:445
+#: aleksis/core/views.py:431 aleksis/core/views.py:441
 msgid "The person has been saved."
 msgstr "Die Person wurde gespeichert."
 
-#: aleksis/core/views.py:495
+#: aleksis/core/views.py:491
 msgid "The group has been saved."
 msgstr "Die Gruppe wurde gespeichert."
 
-#: aleksis/core/views.py:592
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr "Die Ankündigung wurde gespeichert."
 
-#: aleksis/core/views.py:608
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr "Ankündigung wurde gelöscht."
 
-#: aleksis/core/views.py:695
+#: aleksis/core/views.py:672
+msgid "The requested preference registry does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:691
 msgid "The preferences have been saved successfully."
 msgstr "Die Einstellungen wurde gespeichert."
 
-#: aleksis/core/views.py:719
+#: aleksis/core/views.py:715
 msgid "The person has been deleted."
 msgstr "Die Person wurde gelöscht."
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:729
 msgid "The group has been deleted."
 msgstr "Die Gruppe wurde gelöscht."
 
-#: aleksis/core/views.py:765
+#: aleksis/core/views.py:761
 msgid "The additional_field has been saved."
 msgstr "Das zusätzliche Feld wurde gespeichert."
 
-#: aleksis/core/views.py:799
+#: aleksis/core/views.py:795
 msgid "The additional field has been deleted."
 msgstr "Das zusätzliche Feld wurde gelöscht."
 
-#: aleksis/core/views.py:824
+#: aleksis/core/views.py:820
 msgid "The group type has been saved."
 msgstr "Der Gruppentyp wurde gespeichert."
 
-#: aleksis/core/views.py:854
+#: aleksis/core/views.py:850
 msgid "The group type has been deleted."
 msgstr "Der Gruppentyp wurde gelöscht."
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:883
 msgid "Progress: Run data checks"
 msgstr "Fortschritt: Datenprüfungen ausführen"
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:884
 msgid "Run data checks …"
 msgstr "Datenprüfungen laufen …"
 
-#: aleksis/core/views.py:889
+#: aleksis/core/views.py:885
 msgid "The data checks were run successfully."
 msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt."
 
-#: aleksis/core/views.py:890
+#: aleksis/core/views.py:886
 msgid "There was a problem while running data checks."
 msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen."
 
-#: aleksis/core/views.py:906
+#: aleksis/core/views.py:902
 #, 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:948
+#: aleksis/core/views.py:912
+#, fuzzy
+#| msgid "The backup folder doesn't exist."
+msgid "The requested solve option does not exist"
+msgstr "Der Backup-Ordner existiert nicht."
+
+#: aleksis/core/views.py:944
 msgid "The dashboard widget has been saved."
 msgstr "Das Dashboard-Widget wurde gespeichert."
 
-#: aleksis/core/views.py:978
+#: aleksis/core/views.py:974
 msgid "The dashboard widget has been created."
 msgstr "Das Dashboard-Widget wurde erstellt."
 
-#: aleksis/core/views.py:988
+#: aleksis/core/views.py:984
 msgid "The dashboard widget has been deleted."
 msgstr "Das Dashboard-Widget wurde gelöscht."
 
-#: aleksis/core/views.py:1055
+#: aleksis/core/views.py:1051
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1053
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1127
+#: aleksis/core/views.py:1123
 #, 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:1218
+#: aleksis/core/views.py:1214
 msgid "We have successfully assigned the permissions."
 msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen."
 
-#: aleksis/core/views.py:1228
+#: aleksis/core/views.py:1224
 msgid "The global user permission has been deleted."
 msgstr "Die globale Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1238
+#: aleksis/core/views.py:1234
 msgid "The global group permission has been deleted."
 msgstr "Die globale Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1248
+#: aleksis/core/views.py:1244
 msgid "The object user permission has been deleted."
 msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1258
+#: aleksis/core/views.py:1254
 msgid "The object group permission has been deleted."
 msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1377
+#: aleksis/core/views.py:1322
+#, fuzzy
+#| msgid "The backup folder doesn't exist."
+msgid "The requested PDF file does not exist"
+msgstr "Der Backup-Ordner existiert nicht."
+
+#: aleksis/core/views.py:1331 aleksis/core/views.py:1335
+msgid "The requested task does not exist or is not accessible"
+msgstr ""
+
+#: aleksis/core/views.py:1373
 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:1384
+#: aleksis/core/views.py:1380
 msgid "The third-party account has been successfully disconnected."
 msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 
-#: aleksis/core/views.py:1441
+#: aleksis/core/views.py:1437
 msgid "Person was invited successfully."
 msgstr "Person wurde erfolgreich eingeladen."
 
-#: aleksis/core/views.py:1443
+#: aleksis/core/views.py:1439
 msgid "Person was already invited."
 msgstr "Person wurde bereits eingeladen."
 
+#~ msgid "Is person active?"
+#~ msgstr "Ist die Person aktiv?"
+
+#~ msgid ""
+#~ "The requested page or object was not\n"
+#~ "          found."
+#~ msgstr ""
+#~ "Die angefragte Seite oder das angefragte Objekt wurde nicht\n"
+#~ "            gefunden."
+
 #~ msgid "Consents"
 #~ msgstr "Zustimmungen"
 
@@ -3324,9 +3488,6 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgid "Impress"
 #~ msgstr "Impressum"
 
-#~ msgid "The backup folder doesn't exist."
-#~ msgstr "Der Backup-Ordner existiert nicht."
-
 #~ msgid "Can add oauth applications"
 #~ msgstr "Kann OAuth-Anwendungen hinzufügen"
 
@@ -3388,9 +3549,6 @@ msgstr "Person wurde bereits eingeladen."
 #~ msgid "New account"
 #~ msgstr "Neues Konto"
 
-#~ msgid "Authorized tokens"
-#~ msgstr "Autorisierte Tokens"
-
 #~ msgid "No authorized tokens defined."
 #~ msgstr "Keine autorisierten Token definiert."
 
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
index 188d883c0746a8cb64414091b5e0fa2f8b247805..c200f5e702d1c768bb37d4cfbb445c47374bb36e 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: 2021-12-28 12:14+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\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"
@@ -30,6 +30,6 @@ msgstr "Abbrechen"
 msgid "OK"
 msgstr "OK"
 
-#: aleksis/core/static/js/main.js:128
+#: aleksis/core/static/js/main.js:131
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr "Diese Seite enthält vielleicht veraltete Informationen, da es keine Internetverbindung gibt."
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po
index 48ad0ea73dda60181ae19660fa021259b0f49ab0..180b285e79aac4b3d5c82e62073edec9c4ccbc03 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: 2021-12-28 12:13+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\n"
 "PO-Revision-Date: 2021-06-16 12:00+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n"
@@ -18,32 +18,32 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.4\n"
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:154
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:155
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:156
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:157
 #, fuzzy
 #| msgid "Contact details"
 msgid "Email address"
 msgstr "Détails de contact"
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:158
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:157 aleksis/core/forms.py:223 aleksis/core/menus.py:265
-#: aleksis/core/models.py:414 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:159 aleksis/core/forms.py:223 aleksis/core/menus.py:265
+#: aleksis/core/models.py:449 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:152
+#: aleksis/core/templates/core/person/full.html:242
 #, fuzzy
 #| msgid "Group"
 msgid "Groups"
@@ -70,8 +70,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
-#: aleksis/core/templates/core/base.html:105
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105
+#: aleksis/core/templates/core/base.html:106
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -79,29 +79,29 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:58
+#: aleksis/core/filters.py:59
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:70
+#: aleksis/core/filters.py:71
 #, fuzzy
 #| msgid "Contact details"
 msgid "Search by contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/filters.py:91
+#: aleksis/core/filters.py:92
 msgid "Permission"
 msgstr ""
 
-#: aleksis/core/filters.py:99
+#: aleksis/core/filters.py:100
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:112 aleksis/core/models.py:581
+#: aleksis/core/filters.py:113 aleksis/core/models.py:675
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:134 aleksis/core/models.py:413
+#: aleksis/core/filters.py:135 aleksis/core/models.py:448
 msgid "Group"
 msgstr "groupe"
 
@@ -109,50 +109,50 @@ msgstr "groupe"
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:54
+#: aleksis/core/forms.py:53
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/forms.py:568
+#: aleksis/core/forms.py:54 aleksis/core/forms.py:568
 #, fuzzy
 #| msgid "Contact details"
 msgid "Contact data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:57
+#: aleksis/core/forms.py:56
 #, fuzzy
 #| msgid "Contact details"
 msgid "Advanced personal data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:135
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:140
+#: aleksis/core/forms.py:139
 msgid "This username is already in use."
 msgstr "Cet nom est deja en utilisation."
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:129
+#: aleksis/core/forms.py:156 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:158
+#: aleksis/core/forms.py:157
 #, fuzzy
 #| msgid "Contact details"
 msgid "Common data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:159 aleksis/core/forms.py:210
-#: aleksis/core/menus.py:254 aleksis/core/models.py:152
+#: aleksis/core/forms.py:158 aleksis/core/forms.py:210
+#: 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
 #, fuzzy
@@ -160,19 +160,24 @@ msgstr "Détails de contact"
 msgid "Persons"
 msgstr "Personne"
 
-#: aleksis/core/forms.py:160 aleksis/core/forms.py:570
+#: aleksis/core/forms.py:159 aleksis/core/forms.py:570
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional data"
 msgstr "Détails de contact"
 
+#: aleksis/core/forms.py:160 aleksis/core/models.py:206
+#: aleksis/core/models.py:501
+msgid "Photo"
+msgstr ""
+
 #: aleksis/core/forms.py:202 aleksis/core/forms.py:205
-#: aleksis/core/models.py:72
+#: aleksis/core/models.py:73
 msgid "Date"
 msgstr "Date"
 
 #: aleksis/core/forms.py:203 aleksis/core/forms.py:206
-#: aleksis/core/models.py:80
+#: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
@@ -277,8 +282,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:22
-#: aleksis/core/templates/two_factor/core/login.html:76
+#: aleksis/core/templates/two_factor/core/login.html:32
+#: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
@@ -295,8 +300,8 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:627
-#: aleksis/core/preferences.py:28
+#: aleksis/core/menus.py:41 aleksis/core/models.py:721
+#: aleksis/core/preferences.py:29
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
@@ -353,13 +358,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:141 aleksis/core/models.py:727
+#: aleksis/core/menus.py:141 aleksis/core/models.py:821
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:152 aleksis/core/models.py:130
+#: aleksis/core/menus.py:152 aleksis/core/models.py:131
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -411,7 +416,7 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:276 aleksis/core/models.py:981
+#: aleksis/core/menus.py:276 aleksis/core/models.py:1075
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -423,7 +428,7 @@ msgstr "Groupe"
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:298 aleksis/core/models.py:462
+#: aleksis/core/menus.py:298 aleksis/core/models.py:497
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
@@ -445,762 +450,782 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:70
+#: aleksis/core/models.py:71
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:71
+#: aleksis/core/models.py:72
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:73
+#: aleksis/core/models.py:74
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:74
+#: aleksis/core/models.py:75
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:75 aleksis/core/models.py:198
+#: aleksis/core/models.py:76 aleksis/core/models.py:199
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:77
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:78
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:79
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:80
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:82
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:93 aleksis/core/models.py:950
+#: aleksis/core/models.py:94 aleksis/core/models.py:1044
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:95
+#: aleksis/core/models.py:96
 #, fuzzy
 #| msgid "Contact details"
 msgid "Start date"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:96
+#: aleksis/core/models.py:97
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:115
+#: aleksis/core/models.py:116
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:122
+#: aleksis/core/models.py:123
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:151 aleksis/core/models.py:899
+#: aleksis/core/models.py:152 aleksis/core/models.py:993
 msgid "Person"
 msgstr "Personne"
 
-#: aleksis/core/models.py:154
+#: aleksis/core/models.py:155
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:157
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view photo"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:157
+#: aleksis/core/models.py:158
+#, fuzzy
+#| msgid "Contact details"
+msgid "Can view avatar image"
+msgstr "Détails de contact"
+
+#: aleksis/core/models.py:159
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view persons groups"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:158
+#: aleksis/core/models.py:160
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view personal details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:176 aleksis/core/models.py:1144
+#: aleksis/core/models.py:178 aleksis/core/models.py:1238
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:178
-msgid "Is person active?"
-msgstr ""
-
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "First name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "Last name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:187 aleksis/core/models.py:431
+#: aleksis/core/models.py:188 aleksis/core/models.py:466
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:192
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:192
+#: aleksis/core/models.py:193
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:193
+#: aleksis/core/models.py:194
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:197
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:200
+#: aleksis/core/models.py:201
 msgid "Date of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 #, fuzzy
 #| msgid "Date of birth"
 msgid "Place of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Sex"
 msgstr "Sexe"
 
-#: aleksis/core/models.py:204
-msgid "Photo"
+#: aleksis/core/models.py:210 aleksis/core/models.py:505
+msgid "This is an official photo, used for official documents and for internal use cases."
+msgstr ""
+
+#: aleksis/core/models.py:215 aleksis/core/models.py:509
+msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:208 aleksis/core/templates/core/person/full.html:145
+#: aleksis/core/models.py:218 aleksis/core/models.py:512
+msgid "This is a picture or an avatar for public display."
+msgstr ""
+
+#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:231
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:215
+#: aleksis/core/models.py:230
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:218 aleksis/core/models.py:585
-#: aleksis/core/models.py:609 aleksis/core/models.py:694
-#: aleksis/core/models.py:974 aleksis/core/templates/core/person/full.html:128
+#: aleksis/core/models.py:233 aleksis/core/models.py:679
+#: aleksis/core/models.py:703 aleksis/core/models.py:788
+#: aleksis/core/models.py:1068
 msgid "Description"
 msgstr "Description"
 
-#: aleksis/core/models.py:386
+#: aleksis/core/models.py:421
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:388
+#: aleksis/core/models.py:423
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:395
+#: aleksis/core/models.py:430
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:431
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:416
+#: aleksis/core/models.py:451
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:417
+#: aleksis/core/models.py:452
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view statistics about group."
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:429
+#: aleksis/core/models.py:464
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:439 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:474 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:442 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:477 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:449 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:484 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:492
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:584 aleksis/core/models.py:608
-#: aleksis/core/models.py:693
+#: aleksis/core/models.py:678 aleksis/core/models.py:702
+#: aleksis/core/models.py:787
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:681
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:593
+#: aleksis/core/models.py:687
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:594
+#: aleksis/core/models.py:688
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:600
+#: aleksis/core/models.py:694
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:605
+#: aleksis/core/models.py:699
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:610 aleksis/core/models.py:951
+#: aleksis/core/models.py:704 aleksis/core/models.py:1045
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:612
+#: aleksis/core/models.py:706
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:613
+#: aleksis/core/models.py:707
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:626
+#: aleksis/core/models.py:720
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:695
+#: aleksis/core/models.py:789
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:698
+#: aleksis/core/models.py:792
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:701
+#: aleksis/core/models.py:795
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:820
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:858
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:765
+#: aleksis/core/models.py:859
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:914
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:915
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:822
+#: aleksis/core/models.py:916
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:825
+#: aleksis/core/models.py:919
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:826
+#: aleksis/core/models.py:920
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:925
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:832
+#: aleksis/core/models.py:926
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:931
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:838
+#: aleksis/core/models.py:932
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:937
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:938
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:969
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:970
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:971
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:883
+#: aleksis/core/models.py:977
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:978
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:890
+#: aleksis/core/models.py:984
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:891
+#: aleksis/core/models.py:985
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:896
+#: aleksis/core/models.py:990
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:995
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:996
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:917
+#: aleksis/core/models.py:1011
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:1012
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:924
+#: aleksis/core/models.py:1018
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:1031
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:938
+#: aleksis/core/models.py:1032
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:1042
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:1046 aleksis/core/models.py:1285
+#: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:1052
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:1053
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:1067
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:980 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1074 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Groupe"
 
-#: aleksis/core/models.py:994
+#: aleksis/core/models.py:1088
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view system status"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:1089
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:1090
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can impersonate"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:1091
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:1092
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:999
+#: aleksis/core/models.py:1093
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1000
+#: aleksis/core/models.py:1094
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1001
+#: aleksis/core/models.py:1095
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1037
+#: aleksis/core/models.py:1131
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1139
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1046
+#: aleksis/core/models.py:1140
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1153
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1154
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1062
+#: aleksis/core/models.py:1156
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1063
+#: aleksis/core/models.py:1157
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1070
+#: aleksis/core/models.py:1164
 #, fuzzy
 #| msgid "Contact details"
 msgid "E-Mail address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1094
+#: aleksis/core/models.py:1188
 #, fuzzy
 #| msgid "Owners"
 msgid "Owner"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:1098
+#: aleksis/core/models.py:1192
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1100
+#: aleksis/core/models.py:1194
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1102
+#: aleksis/core/models.py:1196
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1109
+#: aleksis/core/models.py:1203
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1110
+#: aleksis/core/models.py:1204
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1209
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1212
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1130
+#: aleksis/core/models.py:1224
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1131
+#: aleksis/core/models.py:1225
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1147
+#: aleksis/core/models.py:1241
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional attributes"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1279
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/preferences.py:24
-msgid "General"
+#: aleksis/core/models.py:1289
+msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
 #: aleksis/core/preferences.py:25
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:26
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:27
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:28
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 #, fuzzy
 #| msgid "Contact details"
 msgid "Accounts"
 msgstr "Détails de contact"
 
-#: aleksis/core/preferences.py:31
+#: aleksis/core/preferences.py:32
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:32
+#: aleksis/core/preferences.py:33
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:43
+#: aleksis/core/preferences.py:44
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:54
+#: aleksis/core/preferences.py:55
 #, fuzzy
 #| msgid "Description"
 msgid "Site description"
 msgstr "Description"
 
-#: aleksis/core/preferences.py:65
+#: aleksis/core/preferences.py:66
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:77
+#: aleksis/core/preferences.py:78
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:88
+#: aleksis/core/preferences.py:89
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:98
+#: aleksis/core/preferences.py:99
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:108
+#: aleksis/core/preferences.py:109
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:119
+#: aleksis/core/preferences.py:120
 #, fuzzy
 #| msgid "Last name"
 msgid "Mail out name"
 msgstr "Nom de famille"
 
-#: aleksis/core/preferences.py:130
+#: aleksis/core/preferences.py:131
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:142
+#: aleksis/core/preferences.py:143
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:154
+#: aleksis/core/preferences.py:155
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:166
+#: aleksis/core/preferences.py:167
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:182
+#: aleksis/core/preferences.py:183
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:194
+#: aleksis/core/preferences.py:195
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:205
+#: aleksis/core/preferences.py:206
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:217
+#: aleksis/core/preferences.py:218
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:226
+#: aleksis/core/preferences.py:227
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:237
+#: aleksis/core/preferences.py:238
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:248
+#: aleksis/core/preferences.py:249
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
+#: aleksis/core/preferences.py:257
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:264
+#: aleksis/core/preferences.py:265
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:272
+#: aleksis/core/preferences.py:273
 msgid "Enable invitations"
 msgstr ""
 
-#: aleksis/core/preferences.py:280
+#: aleksis/core/preferences.py:281
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:288
+#: aleksis/core/preferences.py:289
 msgid "Size of packets. (Default 5: abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:298
+#: aleksis/core/preferences.py:300
 #, fuzzy
 #| msgid "Contact details"
 msgid "Allowed Grant Flows for OAuth applications"
 msgstr "Détails de contact"
 
-#: aleksis/core/preferences.py:311
+#: aleksis/core/preferences.py:313
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:323
+#: aleksis/core/preferences.py:325
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:334
+#: aleksis/core/preferences.py:336
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:345
+#: aleksis/core/preferences.py:347
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:354
+#: aleksis/core/preferences.py:356
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:365
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:376
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:390
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:401
+#: aleksis/core/preferences.py:403
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:411
+#: aleksis/core/preferences.py:413
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:412
+#: aleksis/core/preferences.py:414
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:422
+#: aleksis/core/preferences.py:424
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:432
+#: aleksis/core/preferences.py:434
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:507
+#: aleksis/core/preferences.py:444
+msgid "Country for phone number parsing"
+msgstr ""
+
+#: aleksis/core/settings.py:518
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:508
+#: aleksis/core/settings.py:519
 msgid "German"
 msgstr ""
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
-#: aleksis/core/templates/core/person/full.html:24
+#: aleksis/core/templates/core/person/full.html:26
+#: aleksis/core/templates/core/person/full.html:98
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
@@ -1217,14 +1242,14 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
-#: aleksis/core/templates/core/person/full.html:31
+#: aleksis/core/templates/core/person/full.html:33
+#: aleksis/core/templates/core/person/full.html:105
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
-#: aleksis/core/templates/403.html:14 aleksis/core/templates/404.html:10
-#: aleksis/core/templates/500.html:10
-#: aleksis/core/templates/oauth2_provider/authorize.html:47
+#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
+#: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
 msgstr ""
@@ -1235,7 +1260,7 @@ msgid ""
 "          object."
 msgstr ""
 
-#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:17
+#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
 "            If you think this is an error in AlekSIS, please contact your site\n"
@@ -1243,13 +1268,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/404.html:10
-msgid ""
-"The requested page or object was not\n"
-"          found."
-msgstr ""
-
-#: aleksis/core/templates/404.html:13
+#: aleksis/core/templates/404.html:12
 msgid ""
 "\n"
 "            If you were redirected by a link on an external page,\n"
@@ -1314,6 +1333,7 @@ msgstr ""
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
+#: aleksis/core/templates/socialaccount/login.html:17
 msgid "Confirm"
 msgstr ""
 
@@ -1358,7 +1378,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:81
+#: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
 msgstr ""
 
@@ -1534,15 +1554,15 @@ msgstr ""
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:175
+#: aleksis/core/templates/core/base.html:179
 msgid "About AlekSIS® — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:183
+#: aleksis/core/templates/core/base.html:187
 msgid "Imprint"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:191
+#: aleksis/core/templates/core/base.html:195
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1638,15 +1658,15 @@ msgstr "Détails de contact"
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:62
+#: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:84
+#: aleksis/core/templates/core/data_check/list.html:86
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:88
+#: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1768,7 +1788,8 @@ msgid "Edit group"
 msgstr ""
 
 #: aleksis/core/templates/core/group/full.html:38
-#: aleksis/core/templates/core/person/full.html:38
+#: aleksis/core/templates/core/person/full.html:40
+#: aleksis/core/templates/core/person/full.html:112
 msgid "Change preferences"
 msgstr ""
 
@@ -2172,21 +2193,35 @@ msgstr "Détails de contact"
 msgid "Edit person"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:45
+#: aleksis/core/templates/core/person/full.html:47
+#: aleksis/core/templates/core/person/full.html:119
 #, fuzzy
 #| msgid "Contact details"
 msgid "Impersonate"
 msgstr "Détails de contact"
 
-#: aleksis/core/templates/core/person/full.html:51
+#: aleksis/core/templates/core/person/full.html:54
+#: aleksis/core/templates/core/person/full.html:126
 msgid "Invite user"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:57
+#: aleksis/core/templates/core/person/full.html:133
 msgid "Contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/templates/core/person/full.html:138
+#: aleksis/core/templates/core/person/full.html:168
+msgid "home number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:174
+msgid "mobile number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:216
+msgid "This person didn't upload a personal photo."
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:224
 msgid "Children"
 msgstr ""
 
@@ -2291,27 +2326,27 @@ msgstr ""
 msgid "OAuth2 Application"
 msgstr "Détails de contact"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+#: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#: aleksis/core/templates/oauth2_provider/application/detail.html:79
 msgid "Skip Authorisation"
 msgstr ""
 
@@ -2326,24 +2361,31 @@ msgstr "Détails de contact"
 msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/list.html:20
+#: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
 msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
-#: aleksis/core/templates/oauth2_provider/authorize.html:16
+#: aleksis/core/templates/socialaccount/login.html:5
+#: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:18
+#: aleksis/core/templates/oauth2_provider/authorize.html:23
+#, fuzzy, python-format
+#| msgid "Contact details"
+msgid "Authorize %(name)s"
+msgstr "Détails de contact"
+
+#: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:33
+#: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:36
+#: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
 msgstr ""
 
@@ -2448,6 +2490,20 @@ msgstr ""
 msgid "Add a Third-party Account"
 msgstr ""
 
+#: aleksis/core/templates/socialaccount/login.html:12
+#, python-format
+msgid "You are about to connect a new third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:23
+#, python-format
+msgid "You are about to sign in using a third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:28
+msgid "Continue"
+msgstr ""
+
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
@@ -2492,10 +2548,13 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/data_checks.email:4
-msgid "The system detected some new problems with your data."
+#: aleksis/core/templates/templated_email/celery_failure.email:4
+#, python-format
+msgid " Celery task %(task_name)s failed!"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:8
+#: aleksis/core/templates/templated_email/celery_failure.email:26
 #: aleksis/core/templates/templated_email/data_checks.email:8
 #: aleksis/core/templates/templated_email/data_checks.email:24
 #: aleksis/core/templates/templated_email/person_changed.email:8
@@ -2503,6 +2562,54 @@ msgstr ""
 msgid "Hello,"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:9
+#, python-format
+msgid ""
+"\n"
+"   the celery task %(task_name)s failed with following information:\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:14
+#, python-format
+msgid ""
+"\n"
+" * Task name: %(task_name)s\n"
+" * Task: %(task)s\n"
+" * Id of the task: %(task_id)s\n"
+" * Exception instance raised: %(exception)s\n"
+" * Positional arguments the task was called with: %(args)s\n"
+" * Keyword arguments the task was called with: %(kwargs)s\n"
+" * Stack trace object: %(traceback)s\n"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:28
+#, python-format
+msgid ""
+"\n"
+"    the celery task %(task_name)s failed with following information:\n"
+"  "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:34
+#, python-format
+msgid ""
+"\n"
+"   <li>Task name: %(task_name)s</li>\n"
+"   <li>Task: %(task)s</li>\n"
+"   <li>Id of the task: %(task_id)s</li>\n"
+"   <li>Exception instance raised: %(exception)s</li>\n"
+"   <li>Positional arguments the task was called with: %(args)s</li>\n"
+"   <li>Keyword arguments the task was called with: %(kwargs)s</li>\n"
+"   <li>Stack trace object: %(traceback)s</li>\n"
+" </ul>\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/data_checks.email:4
+msgid "The system detected some new problems with your data."
+msgstr ""
+
 #: aleksis/core/templates/templated_email/data_checks.email:10
 msgid ""
 "\n"
@@ -2629,21 +2736,31 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:20
+#: aleksis/core/templates/two_factor/core/login.html:27
+#, fuzzy, python-format
+#| msgid "Contact details"
+msgid "Login for %(name)s"
+msgstr "Détails de contact"
+
+#: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:28
+#: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:36
+#: aleksis/core/templates/two_factor/core/login.html:47
+msgid "Please login with your account to use the external application."
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:46
+#: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
 "\n"
 "                        We are calling your phone right now, please enter the\n"
@@ -2651,7 +2768,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:51
+#: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
 "\n"
 "                        We sent you a text message, please enter the tokens we\n"
@@ -2659,7 +2776,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:56
+#: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
 "\n"
 "                        Please enter the tokens generated by your token\n"
@@ -2667,7 +2784,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:62
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
 "\n"
 "                      Use this form for entering backup tokens for logging in.\n"
@@ -2676,23 +2793,23 @@ msgid ""
 "                    "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:90
+#: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:92
+#: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:102
+#: aleksis/core/templates/two_factor/core/login.html:121
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:105
+#: aleksis/core/templates/two_factor/core/login.html:124
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:116
+#: aleksis/core/templates/two_factor/core/login.html:135
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2957,141 +3074,157 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:283
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:295
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:416
+#: aleksis/core/views.py:412
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:435 aleksis/core/views.py:445
+#: aleksis/core/views.py:431 aleksis/core/views.py:441
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:495
+#: aleksis/core/views.py:491
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:592
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:608
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:695
+#: aleksis/core/views.py:672
+msgid "The requested preference registry does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:691
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:719
+#: aleksis/core/views.py:715
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:729
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:765
+#: aleksis/core/views.py:761
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:799
+#: aleksis/core/views.py:795
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:824
+#: aleksis/core/views.py:820
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:854
+#: aleksis/core/views.py:850
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:883
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:884
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:889
+#: aleksis/core/views.py:885
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:890
+#: aleksis/core/views.py:886
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:906
+#: aleksis/core/views.py:902
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:948
+#: aleksis/core/views.py:912
+msgid "The requested solve option does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:944
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:978
+#: aleksis/core/views.py:974
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:988
+#: aleksis/core/views.py:984
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1055
+#: aleksis/core/views.py:1051
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1053
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1127
+#: aleksis/core/views.py:1123
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1218
+#: aleksis/core/views.py:1214
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1228
+#: aleksis/core/views.py:1224
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1238
+#: aleksis/core/views.py:1234
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1248
+#: aleksis/core/views.py:1244
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1258
+#: aleksis/core/views.py:1254
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1377
+#: aleksis/core/views.py:1322
+msgid "The requested PDF file does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:1331 aleksis/core/views.py:1335
+msgid "The requested task does not exist or is not accessible"
+msgstr ""
+
+#: aleksis/core/views.py:1373
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1384
+#: aleksis/core/views.py:1380
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1441
+#: aleksis/core/views.py:1437
 msgid "Person was invited successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1443
+#: aleksis/core/views.py:1439
 #, 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 8dd920515ef4b23a59c72cb6ec2809d27d03292a..fb13a2ac83746cde706aef9065f690ad63ecc5c2 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: 2021-12-28 12:14+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\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"
@@ -30,6 +30,6 @@ msgstr ""
 msgid "OK"
 msgstr ""
 
-#: aleksis/core/static/js/main.js:128
+#: aleksis/core/static/js/main.js:131
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr ""
diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po
index b8f7f6b758f1520e97d0d96304f9205d2e356c9a..38afd6b2e008aa83f9f2c28de8a549257b66eca3 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: 2021-12-28 12:13+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\n"
 "PO-Revision-Date: 2020-12-19 12:57+0000\n"
 "Last-Translator: Julian <leuckerj@gmail.com>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n"
@@ -18,36 +18,36 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.3.2\n"
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:154
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:155
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:156
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Full home postal address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:157
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Email address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:158
 #, fuzzy
 #| msgid "Mobile phone"
 msgid "Home and mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/apps.py:157 aleksis/core/forms.py:223 aleksis/core/menus.py:265
-#: aleksis/core/models.py:414 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:159 aleksis/core/forms.py:223 aleksis/core/menus.py:265
+#: aleksis/core/models.py:449 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:152
+#: aleksis/core/templates/core/person/full.html:242
 msgid "Groups"
 msgstr "Greges"
 
@@ -74,8 +74,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
-#: aleksis/core/templates/core/base.html:105
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105
+#: aleksis/core/templates/core/base.html:106
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -83,29 +83,29 @@ msgstr ""
 msgid "Search"
 msgstr "Quaerere"
 
-#: aleksis/core/filters.py:58
+#: aleksis/core/filters.py:59
 msgid "Search by name"
 msgstr "Quaerere cum breve nomine"
 
-#: aleksis/core/filters.py:70
+#: aleksis/core/filters.py:71
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Search by contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/filters.py:91
+#: aleksis/core/filters.py:92
 msgid "Permission"
 msgstr ""
 
-#: aleksis/core/filters.py:99
+#: aleksis/core/filters.py:100
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:112 aleksis/core/models.py:581
+#: aleksis/core/filters.py:113 aleksis/core/models.py:675
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:134 aleksis/core/models.py:413
+#: aleksis/core/filters.py:135 aleksis/core/models.py:448
 msgid "Group"
 msgstr "Grex"
 
@@ -113,68 +113,73 @@ msgstr "Grex"
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:54
+#: aleksis/core/forms.py:53
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:55 aleksis/core/forms.py:568
+#: aleksis/core/forms.py:54 aleksis/core/forms.py:568
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:57
+#: aleksis/core/forms.py:56
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Create a new account"
 msgstr "Personae et computi"
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:135
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:140
+#: aleksis/core/forms.py:139
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:129
+#: aleksis/core/forms.py:156 aleksis/core/models.py:130
 msgid "School term"
 msgstr "Anus scolae"
 
-#: aleksis/core/forms.py:158
+#: aleksis/core/forms.py:157
 #, fuzzy
 #| msgid "Data management"
 msgid "Common data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:159 aleksis/core/forms.py:210
-#: aleksis/core/menus.py:254 aleksis/core/models.py:152
+#: aleksis/core/forms.py:158 aleksis/core/forms.py:210
+#: 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:160 aleksis/core/forms.py:570
+#: aleksis/core/forms.py:159 aleksis/core/forms.py:570
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional data"
 msgstr "addita nomines"
 
+#: aleksis/core/forms.py:160 aleksis/core/models.py:206
+#: aleksis/core/models.py:501
+msgid "Photo"
+msgstr "Photographia"
+
 #: aleksis/core/forms.py:202 aleksis/core/forms.py:205
-#: aleksis/core/models.py:72
+#: aleksis/core/models.py:73
 msgid "Date"
 msgstr "dies"
 
 #: aleksis/core/forms.py:203 aleksis/core/forms.py:206
-#: aleksis/core/models.py:80
+#: aleksis/core/models.py:81
 msgid "Time"
 msgstr "tempus"
 
@@ -285,8 +290,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:22
-#: aleksis/core/templates/two_factor/core/login.html:76
+#: aleksis/core/templates/two_factor/core/login.html:32
+#: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr "nomen profiteri"
 
@@ -305,8 +310,8 @@ msgstr "Muta informationes scolae"
 msgid "Dashboard"
 msgstr "Forum"
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:627
-#: aleksis/core/preferences.py:28
+#: aleksis/core/menus.py:41 aleksis/core/models.py:721
+#: aleksis/core/preferences.py:29
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
@@ -367,13 +372,13 @@ msgstr "Nuntii"
 msgid "Admin"
 msgstr "Administratio"
 
-#: aleksis/core/menus.py:141 aleksis/core/models.py:727
+#: aleksis/core/menus.py:141 aleksis/core/models.py:821
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:152 aleksis/core/models.py:130
+#: aleksis/core/menus.py:152 aleksis/core/models.py:131
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -433,7 +438,7 @@ msgstr "Nuntii"
 msgid "People"
 msgstr "Personae"
 
-#: aleksis/core/menus.py:276 aleksis/core/models.py:981
+#: aleksis/core/menus.py:276 aleksis/core/models.py:1075
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -445,7 +450,7 @@ msgstr "Greges"
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:298 aleksis/core/models.py:462
+#: aleksis/core/menus.py:298 aleksis/core/models.py:497
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 #, fuzzy
@@ -471,802 +476,820 @@ msgstr ""
 msgid "Linked school term"
 msgstr "Muta anum scolae"
 
-#: aleksis/core/models.py:70
+#: aleksis/core/models.py:71
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:71
+#: aleksis/core/models.py:72
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:73
+#: aleksis/core/models.py:74
 msgid "Date and time"
 msgstr "Dies et hora"
 
-#: aleksis/core/models.py:74
+#: aleksis/core/models.py:75
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:75 aleksis/core/models.py:198
+#: aleksis/core/models.py:76 aleksis/core/models.py:199
 msgid "E-mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:77
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:78
 #, fuzzy
 #| msgid "E-mail address"
 msgid "IP address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:79
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:80
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:82
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:93 aleksis/core/models.py:950
+#: aleksis/core/models.py:94 aleksis/core/models.py:1044
 msgid "Name"
 msgstr "Nomen"
 
-#: aleksis/core/models.py:95
+#: aleksis/core/models.py:96
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:96
+#: aleksis/core/models.py:97
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:115
+#: aleksis/core/models.py:116
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:122
+#: aleksis/core/models.py:123
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:151 aleksis/core/models.py:899
+#: aleksis/core/models.py:152 aleksis/core/models.py:993
 msgid "Person"
 msgstr "Persona"
 
-#: aleksis/core/models.py:154
+#: aleksis/core/models.py:155
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:157
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view photo"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:157
+#: aleksis/core/models.py:158
+#, fuzzy
+#| msgid "E-mail address"
+msgid "Can view avatar image"
+msgstr "Inscriptio electronica"
+
+#: aleksis/core/models.py:159
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view persons groups"
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:158
+#: aleksis/core/models.py:160
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can view personal details"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "female"
 msgstr "femininum"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "male"
 msgstr "maskulinum"
 
-#: aleksis/core/models.py:176 aleksis/core/models.py:1144
+#: aleksis/core/models.py:178 aleksis/core/models.py:1238
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:178
-#, fuzzy
-#| msgid "Impersonation"
-msgid "Is person active?"
-msgstr "Simulare aliquem"
-
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "First name"
 msgstr "Primus nomen"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "Last name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:187 aleksis/core/models.py:431
+#: aleksis/core/models.py:188 aleksis/core/models.py:466
 msgid "Short name"
 msgstr "Breve nomen"
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Street"
 msgstr "Via"
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:192
 msgid "Street number"
 msgstr "Numerus domini"
 
-#: aleksis/core/models.py:192
+#: aleksis/core/models.py:193
 msgid "Postal code"
 msgstr "Numerus directorius"
 
-#: aleksis/core/models.py:193
+#: aleksis/core/models.py:194
 msgid "Place"
 msgstr "Urbs"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Home phone"
 msgstr "Numerus telephoni domi"
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:197
 msgid "Mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/models.py:200
+#: aleksis/core/models.py:201
 msgid "Date of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 #, fuzzy
 #| msgid "Date of birth"
 msgid "Place of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Sex"
 msgstr "Genus"
 
-#: aleksis/core/models.py:204
-msgid "Photo"
-msgstr "Photographia"
+#: aleksis/core/models.py:210 aleksis/core/models.py:505
+msgid "This is an official photo, used for official documents and for internal use cases."
+msgstr ""
+
+#: aleksis/core/models.py:215 aleksis/core/models.py:509
+msgid "Display picture / Avatar"
+msgstr ""
 
-#: aleksis/core/models.py:208 aleksis/core/templates/core/person/full.html:145
+#: aleksis/core/models.py:218 aleksis/core/models.py:512
+msgid "This is a picture or an avatar for public display."
+msgstr ""
+
+#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:231
 msgid "Guardians / Parents"
 msgstr "Parentes"
 
-#: aleksis/core/models.py:215
+#: aleksis/core/models.py:230
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:218 aleksis/core/models.py:585
-#: aleksis/core/models.py:609 aleksis/core/models.py:694
-#: aleksis/core/models.py:974 aleksis/core/templates/core/person/full.html:128
+#: aleksis/core/models.py:233 aleksis/core/models.py:679
+#: aleksis/core/models.py:703 aleksis/core/models.py:788
+#: aleksis/core/models.py:1068
 msgid "Description"
 msgstr "Descriptio"
 
-#: aleksis/core/models.py:386
+#: aleksis/core/models.py:421
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:388
+#: aleksis/core/models.py:423
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:395
+#: aleksis/core/models.py:430
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional field for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:431
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional fields for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:416
+#: aleksis/core/models.py:451
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:417
+#: aleksis/core/models.py:452
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view statistics about group."
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:429
+#: aleksis/core/models.py:464
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:439 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:474 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:442 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:477 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:449 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:484 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:492
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:584 aleksis/core/models.py:608
-#: aleksis/core/models.py:693
+#: aleksis/core/models.py:678 aleksis/core/models.py:702
+#: aleksis/core/models.py:787
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titulus"
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:681
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:593
+#: aleksis/core/models.py:687
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:594
+#: aleksis/core/models.py:688
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:600
+#: aleksis/core/models.py:694
 msgid "Sender"
 msgstr "Mittens"
 
-#: aleksis/core/models.py:605
+#: aleksis/core/models.py:699
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:610 aleksis/core/models.py:951
+#: aleksis/core/models.py:704 aleksis/core/models.py:1045
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:612
+#: aleksis/core/models.py:706
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:613
+#: aleksis/core/models.py:707
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:626
+#: aleksis/core/models.py:720
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:695
+#: aleksis/core/models.py:789
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:698
+#: aleksis/core/models.py:792
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:701
+#: aleksis/core/models.py:795
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:820
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:858
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipient"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:765
+#: aleksis/core/models.py:859
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipients"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:914
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget Title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:915
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:822
+#: aleksis/core/models.py:916
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget is broken"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:825
+#: aleksis/core/models.py:919
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:826
+#: aleksis/core/models.py:920
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:925
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:832
+#: aleksis/core/models.py:926
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:931
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:838
+#: aleksis/core/models.py:932
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:937
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:938
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:969
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Can edit default dashboard"
 msgstr "Forum"
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:970
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:971
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widgets"
 msgstr "Forum"
 
-#: aleksis/core/models.py:883
+#: aleksis/core/models.py:977
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:978
 #, fuzzy
 #| msgid "Icon"
 msgid "Icon URL"
 msgstr "Nota"
 
-#: aleksis/core/models.py:890
+#: aleksis/core/models.py:984
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:891
+#: aleksis/core/models.py:985
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:896
+#: aleksis/core/models.py:990
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:995
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:996
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:917
+#: aleksis/core/models.py:1011
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget order"
 msgstr "Forum"
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:1012
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget orders"
 msgstr "Forum"
 
-#: aleksis/core/models.py:924
+#: aleksis/core/models.py:1018
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:1031
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:938
+#: aleksis/core/models.py:1032
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:1042
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:1046 aleksis/core/models.py:1285
+#: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Nota"
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:1052
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:1053
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:1067
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:980 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1074 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Grex"
 
-#: aleksis/core/models.py:994
+#: aleksis/core/models.py:1088
 #, fuzzy
 #| msgid "System status"
 msgid "Can view system status"
 msgstr "Status systemae"
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:1089
 #, fuzzy
 #| msgid "Data management"
 msgid "Can manage data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:1090
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can impersonate"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:1091
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:1092
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:999
+#: aleksis/core/models.py:1093
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1000
+#: aleksis/core/models.py:1094
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1001
+#: aleksis/core/models.py:1095
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1037
+#: aleksis/core/models.py:1131
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1139
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1046
+#: aleksis/core/models.py:1140
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification sent"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1153
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1154
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1062
+#: aleksis/core/models.py:1156
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1063
+#: aleksis/core/models.py:1157
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1070
+#: aleksis/core/models.py:1164
 #, fuzzy
 #| msgid "E-mail address"
 msgid "E-Mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:1094
+#: aleksis/core/models.py:1188
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1098
+#: aleksis/core/models.py:1192
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1100
+#: aleksis/core/models.py:1194
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1102
+#: aleksis/core/models.py:1196
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1109
+#: aleksis/core/models.py:1203
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1110
+#: aleksis/core/models.py:1204
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1209
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1212
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1130
+#: aleksis/core/models.py:1224
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1131
+#: aleksis/core/models.py:1225
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1147
+#: aleksis/core/models.py:1241
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional attributes"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1279
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/preferences.py:24
-msgid "General"
+#: aleksis/core/models.py:1289
+msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
 #: aleksis/core/preferences.py:25
+msgid "General"
+msgstr ""
+
+#: aleksis/core/preferences.py:26
 msgid "School"
 msgstr "Scola"
 
-#: aleksis/core/preferences.py:26
+#: aleksis/core/preferences.py:27
 msgid "Theme"
 msgstr ""
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 #, fuzzy
 #| msgid "Data management"
 msgid "Accounts"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/preferences.py:31
+#: aleksis/core/preferences.py:32
 #, fuzzy
 #| msgid "Notifications"
 msgid "Authentication"
 msgstr "Nuntii"
 
-#: aleksis/core/preferences.py:32
+#: aleksis/core/preferences.py:33
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Internationalisation"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/preferences.py:43
+#: aleksis/core/preferences.py:44
 msgid "Site title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/preferences.py:54
+#: aleksis/core/preferences.py:55
 msgid "Site description"
 msgstr "Descriptio paginae"
 
-#: aleksis/core/preferences.py:65
+#: aleksis/core/preferences.py:66
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:77
+#: aleksis/core/preferences.py:78
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:88
+#: aleksis/core/preferences.py:89
 #, fuzzy
 #| msgid "Logout"
 msgid "Logo"
 msgstr "nomen retractare"
 
-#: aleksis/core/preferences.py:98
+#: aleksis/core/preferences.py:99
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:108
+#: aleksis/core/preferences.py:109
 #, fuzzy
 #| msgid "Icon"
 msgid "PWA-Icon"
 msgstr "Nota"
 
-#: aleksis/core/preferences.py:119
+#: aleksis/core/preferences.py:120
 #, fuzzy
 #| msgid "Last name"
 msgid "Mail out name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/preferences.py:130
+#: aleksis/core/preferences.py:131
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Mail out address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/preferences.py:142
+#: aleksis/core/preferences.py:143
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:154
+#: aleksis/core/preferences.py:155
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:166
+#: aleksis/core/preferences.py:167
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:182
+#: aleksis/core/preferences.py:183
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:194
+#: aleksis/core/preferences.py:195
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:205
+#: aleksis/core/preferences.py:206
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:217
+#: aleksis/core/preferences.py:218
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:226
+#: aleksis/core/preferences.py:227
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:237
+#: aleksis/core/preferences.py:238
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:248
+#: aleksis/core/preferences.py:249
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr "Officialis nomen scolae, e. g."
 
-#: aleksis/core/preferences.py:256
+#: aleksis/core/preferences.py:257
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:264
+#: aleksis/core/preferences.py:265
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:272
+#: aleksis/core/preferences.py:273
 msgid "Enable invitations"
 msgstr ""
 
-#: aleksis/core/preferences.py:280
+#: aleksis/core/preferences.py:281
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:288
+#: aleksis/core/preferences.py:289
 msgid "Size of packets. (Default 5: abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:298
+#: aleksis/core/preferences.py:300
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Allowed Grant Flows for OAuth applications"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/preferences.py:311
+#: aleksis/core/preferences.py:313
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:323
+#: aleksis/core/preferences.py:325
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:334
+#: aleksis/core/preferences.py:336
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:345
+#: aleksis/core/preferences.py:347
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:354
+#: aleksis/core/preferences.py:356
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:365
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:376
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:390
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:401
+#: aleksis/core/preferences.py:403
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:411
+#: aleksis/core/preferences.py:413
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:412
+#: aleksis/core/preferences.py:414
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:422
+#: aleksis/core/preferences.py:424
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:432
+#: aleksis/core/preferences.py:434
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:507
+#: aleksis/core/preferences.py:444
+msgid "Country for phone number parsing"
+msgstr ""
+
+#: aleksis/core/settings.py:518
 msgid "English"
 msgstr "Britannicus"
 
-#: aleksis/core/settings.py:508
+#: aleksis/core/settings.py:519
 msgid "German"
 msgstr "Germanus"
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
-#: aleksis/core/templates/core/person/full.html:24
+#: aleksis/core/templates/core/person/full.html:26
+#: aleksis/core/templates/core/person/full.html:98
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
@@ -1285,14 +1308,14 @@ msgstr "Nuntii"
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
-#: aleksis/core/templates/core/person/full.html:31
+#: aleksis/core/templates/core/person/full.html:33
+#: aleksis/core/templates/core/person/full.html:105
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
-#: aleksis/core/templates/403.html:14 aleksis/core/templates/404.html:10
-#: aleksis/core/templates/500.html:10
-#: aleksis/core/templates/oauth2_provider/authorize.html:47
+#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
+#: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
 msgstr ""
@@ -1303,7 +1326,7 @@ msgid ""
 "          object."
 msgstr ""
 
-#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:17
+#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
 "            If you think this is an error in AlekSIS, please contact your site\n"
@@ -1311,13 +1334,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/404.html:10
-msgid ""
-"The requested page or object was not\n"
-"          found."
-msgstr ""
-
-#: aleksis/core/templates/404.html:13
+#: aleksis/core/templates/404.html:12
 msgid ""
 "\n"
 "            If you were redirected by a link on an external page,\n"
@@ -1382,6 +1399,7 @@ msgstr ""
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
+#: aleksis/core/templates/socialaccount/login.html:17
 #, fuzzy
 #| msgid "Notification"
 msgid "Confirm"
@@ -1428,7 +1446,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:81
+#: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
 msgstr ""
 
@@ -1620,15 +1638,15 @@ msgstr "Scribe nuntium:"
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:175
+#: aleksis/core/templates/core/base.html:179
 msgid "About AlekSIS® — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:183
+#: aleksis/core/templates/core/base.html:187
 msgid "Imprint"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:191
+#: aleksis/core/templates/core/base.html:195
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1724,17 +1742,17 @@ msgstr ""
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:62
+#: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:84
+#: aleksis/core/templates/core/data_check/list.html:86
 #, fuzzy
 #| msgid "System status"
 msgid "Registered checks"
 msgstr "Status systemae"
 
-#: aleksis/core/templates/core/data_check/list.html:88
+#: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1862,7 +1880,8 @@ msgid "Edit group"
 msgstr ""
 
 #: aleksis/core/templates/core/group/full.html:38
-#: aleksis/core/templates/core/person/full.html:38
+#: aleksis/core/templates/core/person/full.html:40
+#: aleksis/core/templates/core/person/full.html:112
 msgid "Change preferences"
 msgstr ""
 
@@ -2282,23 +2301,41 @@ msgstr "Simulandum aliquem finire"
 msgid "Edit person"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:45
+#: aleksis/core/templates/core/person/full.html:47
+#: aleksis/core/templates/core/person/full.html:119
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Impersonate"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/templates/core/person/full.html:51
+#: aleksis/core/templates/core/person/full.html:54
+#: aleksis/core/templates/core/person/full.html:126
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Invite user"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/templates/core/person/full.html:57
+#: aleksis/core/templates/core/person/full.html:133
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:138
+#: aleksis/core/templates/core/person/full.html:168
+#, fuzzy
+#| msgid "Street number"
+msgid "home number"
+msgstr "Numerus domini"
+
+#: aleksis/core/templates/core/person/full.html:174
+#, fuzzy
+#| msgid "Mobile phone"
+msgid "mobile number"
+msgstr "Numerus telephoni mobilis"
+
+#: aleksis/core/templates/core/person/full.html:216
+msgid "This person didn't upload a personal photo."
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:224
 msgid "Children"
 msgstr ""
 
@@ -2405,27 +2442,27 @@ msgstr ""
 msgid "OAuth2 Application"
 msgstr "Nuntii"
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+#: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#: aleksis/core/templates/oauth2_provider/application/detail.html:79
 #, fuzzy
 #| msgid "Notifications"
 msgid "Skip Authorisation"
@@ -2444,24 +2481,31 @@ msgstr "Nuntii"
 msgid "Register new application"
 msgstr "Muta informationes scolae"
 
-#: aleksis/core/templates/oauth2_provider/application/list.html:20
+#: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
 msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
-#: aleksis/core/templates/oauth2_provider/authorize.html:16
+#: aleksis/core/templates/socialaccount/login.html:5
+#: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:18
+#: aleksis/core/templates/oauth2_provider/authorize.html:23
+#, fuzzy, python-format
+#| msgid "Stop impersonation"
+msgid "Authorize %(name)s"
+msgstr "Simulandum aliquem finire"
+
+#: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:33
+#: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:36
+#: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
 msgstr ""
 
@@ -2568,6 +2612,20 @@ msgstr ""
 msgid "Add a Third-party Account"
 msgstr ""
 
+#: aleksis/core/templates/socialaccount/login.html:12
+#, python-format
+msgid "You are about to connect a new third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:23
+#, python-format
+msgid "You are about to sign in using a third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:28
+msgid "Continue"
+msgstr ""
+
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
@@ -2612,10 +2670,13 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/data_checks.email:4
-msgid "The system detected some new problems with your data."
+#: aleksis/core/templates/templated_email/celery_failure.email:4
+#, python-format
+msgid " Celery task %(task_name)s failed!"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:8
+#: aleksis/core/templates/templated_email/celery_failure.email:26
 #: aleksis/core/templates/templated_email/data_checks.email:8
 #: aleksis/core/templates/templated_email/data_checks.email:24
 #: aleksis/core/templates/templated_email/person_changed.email:8
@@ -2623,6 +2684,54 @@ msgstr ""
 msgid "Hello,"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:9
+#, python-format
+msgid ""
+"\n"
+"   the celery task %(task_name)s failed with following information:\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:14
+#, python-format
+msgid ""
+"\n"
+" * Task name: %(task_name)s\n"
+" * Task: %(task)s\n"
+" * Id of the task: %(task_id)s\n"
+" * Exception instance raised: %(exception)s\n"
+" * Positional arguments the task was called with: %(args)s\n"
+" * Keyword arguments the task was called with: %(kwargs)s\n"
+" * Stack trace object: %(traceback)s\n"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:28
+#, python-format
+msgid ""
+"\n"
+"    the celery task %(task_name)s failed with following information:\n"
+"  "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:34
+#, python-format
+msgid ""
+"\n"
+"   <li>Task name: %(task_name)s</li>\n"
+"   <li>Task: %(task)s</li>\n"
+"   <li>Id of the task: %(task_id)s</li>\n"
+"   <li>Exception instance raised: %(exception)s</li>\n"
+"   <li>Positional arguments the task was called with: %(args)s</li>\n"
+"   <li>Keyword arguments the task was called with: %(kwargs)s</li>\n"
+"   <li>Stack trace object: %(traceback)s</li>\n"
+" </ul>\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/data_checks.email:4
+msgid "The system detected some new problems with your data."
+msgstr ""
+
 #: aleksis/core/templates/templated_email/data_checks.email:10
 msgid ""
 "\n"
@@ -2756,21 +2865,31 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:20
+#: aleksis/core/templates/two_factor/core/login.html:27
+#, fuzzy, python-format
+#| msgid "Stop impersonation"
+msgid "Login for %(name)s"
+msgstr "Simulandum aliquem finire"
+
+#: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:28
+#: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:36
+#: aleksis/core/templates/two_factor/core/login.html:47
+msgid "Please login with your account to use the external application."
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:46
+#: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
 "\n"
 "                        We are calling your phone right now, please enter the\n"
@@ -2778,7 +2897,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:51
+#: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
 "\n"
 "                        We sent you a text message, please enter the tokens we\n"
@@ -2786,7 +2905,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:56
+#: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
 "\n"
 "                        Please enter the tokens generated by your token\n"
@@ -2794,7 +2913,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:62
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
 "\n"
 "                      Use this form for entering backup tokens for logging in.\n"
@@ -2803,23 +2922,23 @@ msgid ""
 "                    "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:90
+#: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:92
+#: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:102
+#: aleksis/core/templates/two_factor/core/login.html:121
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:105
+#: aleksis/core/templates/two_factor/core/login.html:124
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:116
+#: aleksis/core/templates/two_factor/core/login.html:135
 msgid "Use alternative login options"
 msgstr ""
 
@@ -3084,146 +3203,167 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:283
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:295
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:416
+#: aleksis/core/views.py:412
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:435 aleksis/core/views.py:445
+#: aleksis/core/views.py:431 aleksis/core/views.py:441
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:495
+#: aleksis/core/views.py:491
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:592
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:608
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:695
+#: aleksis/core/views.py:672
+msgid "The requested preference registry does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:691
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:719
+#: aleksis/core/views.py:715
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:729
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:765
+#: aleksis/core/views.py:761
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:799
+#: aleksis/core/views.py:795
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:824
+#: aleksis/core/views.py:820
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:854
+#: aleksis/core/views.py:850
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:883
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:884
 #, fuzzy
 #| msgid "System status"
 msgid "Run data checks …"
 msgstr "Status systemae"
 
-#: aleksis/core/views.py:889
+#: aleksis/core/views.py:885
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:890
+#: aleksis/core/views.py:886
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:906
+#: aleksis/core/views.py:902
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:948
+#: aleksis/core/views.py:912
+msgid "The requested solve option does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:944
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:978
+#: aleksis/core/views.py:974
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:988
+#: aleksis/core/views.py:984
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1055
+#: aleksis/core/views.py:1051
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1053
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1127
+#: aleksis/core/views.py:1123
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1218
+#: aleksis/core/views.py:1214
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1228
+#: aleksis/core/views.py:1224
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1238
+#: aleksis/core/views.py:1234
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1248
+#: aleksis/core/views.py:1244
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1258
+#: aleksis/core/views.py:1254
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1377
+#: aleksis/core/views.py:1322
+msgid "The requested PDF file does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:1331 aleksis/core/views.py:1335
+msgid "The requested task does not exist or is not accessible"
+msgstr ""
+
+#: aleksis/core/views.py:1373
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1384
+#: aleksis/core/views.py:1380
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1441
+#: aleksis/core/views.py:1437
 msgid "Person was invited successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1443
+#: aleksis/core/views.py:1439
 msgid "Person was already invited."
 msgstr ""
 
+#, fuzzy
+#~| msgid "Impersonation"
+#~ msgid "Is person active?"
+#~ msgstr "Simulare aliquem"
+
 #~ msgid "Impersonation"
 #~ msgstr "Simulare aliquem"
 
diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
index d67bdb0055bf1ee96915909ce9e21023085c466b..02437289f8e1cec6ed643a6e805cb62c73234084 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: 2021-12-28 12:14+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\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"
@@ -29,6 +29,6 @@ msgstr ""
 msgid "OK"
 msgstr ""
 
-#: aleksis/core/static/js/main.js:128
+#: aleksis/core/static/js/main.js:131
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr ""
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
index e40c13ef84618ccb0eb3bd58c524f81e00fe8834..2d4e7b19a6ba3ef4b2e01dff232c3259d04c908f 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: 2021-12-28 12:13+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,30 +17,30 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:154
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:155
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:156
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:157
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:158
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:157 aleksis/core/forms.py:223 aleksis/core/menus.py:265
-#: aleksis/core/models.py:414 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:159 aleksis/core/forms.py:223 aleksis/core/menus.py:265
+#: aleksis/core/models.py:449 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:152
+#: aleksis/core/templates/core/person/full.html:242
 msgid "Groups"
 msgstr ""
 
@@ -65,8 +65,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
-#: aleksis/core/templates/core/base.html:105
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105
+#: aleksis/core/templates/core/base.html:106
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -74,27 +74,27 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:58
+#: aleksis/core/filters.py:59
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:70
+#: aleksis/core/filters.py:71
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/filters.py:91
+#: aleksis/core/filters.py:92
 msgid "Permission"
 msgstr ""
 
-#: aleksis/core/filters.py:99
+#: aleksis/core/filters.py:100
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:112 aleksis/core/models.py:581
+#: aleksis/core/filters.py:113 aleksis/core/models.py:675
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:134 aleksis/core/models.py:413
+#: aleksis/core/filters.py:135 aleksis/core/models.py:448
 msgid "Group"
 msgstr ""
 
@@ -102,60 +102,65 @@ msgstr ""
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:54
+#: aleksis/core/forms.py:53
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/forms.py:568
+#: aleksis/core/forms.py:54 aleksis/core/forms.py:568
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:57
+#: aleksis/core/forms.py:56
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:135
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:140
+#: aleksis/core/forms.py:139
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:129
+#: aleksis/core/forms.py:156 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:158
+#: aleksis/core/forms.py:157
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:159 aleksis/core/forms.py:210
-#: aleksis/core/menus.py:254 aleksis/core/models.py:152
+#: aleksis/core/forms.py:158 aleksis/core/forms.py:210
+#: 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:160 aleksis/core/forms.py:570
+#: aleksis/core/forms.py:159 aleksis/core/forms.py:570
 msgid "Additional data"
 msgstr ""
 
+#: aleksis/core/forms.py:160 aleksis/core/models.py:206
+#: aleksis/core/models.py:501
+msgid "Photo"
+msgstr ""
+
 #: aleksis/core/forms.py:202 aleksis/core/forms.py:205
-#: aleksis/core/models.py:72
+#: aleksis/core/models.py:73
 msgid "Date"
 msgstr ""
 
 #: aleksis/core/forms.py:203 aleksis/core/forms.py:206
-#: aleksis/core/models.py:80
+#: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
@@ -258,8 +263,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:22
-#: aleksis/core/templates/two_factor/core/login.html:76
+#: aleksis/core/templates/two_factor/core/login.html:32
+#: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
@@ -276,8 +281,8 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:627
-#: aleksis/core/preferences.py:28
+#: aleksis/core/menus.py:41 aleksis/core/models.py:721
+#: aleksis/core/preferences.py:29
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
@@ -334,13 +339,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:141 aleksis/core/models.py:727
+#: aleksis/core/menus.py:141 aleksis/core/models.py:821
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:152 aleksis/core/models.py:130
+#: aleksis/core/menus.py:152 aleksis/core/models.py:131
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -392,7 +397,7 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:276 aleksis/core/models.py:981
+#: aleksis/core/menus.py:276 aleksis/core/models.py:1075
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
@@ -402,7 +407,7 @@ msgstr ""
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:298 aleksis/core/models.py:462
+#: aleksis/core/menus.py:298 aleksis/core/models.py:497
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
@@ -422,722 +427,740 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:70
+#: aleksis/core/models.py:71
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:71
+#: aleksis/core/models.py:72
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:73
+#: aleksis/core/models.py:74
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:74
+#: aleksis/core/models.py:75
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:75 aleksis/core/models.py:198
+#: aleksis/core/models.py:76 aleksis/core/models.py:199
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:77
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:78
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:79
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:80
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:82
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:93 aleksis/core/models.py:950
+#: aleksis/core/models.py:94 aleksis/core/models.py:1044
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:95
+#: aleksis/core/models.py:96
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:96
+#: aleksis/core/models.py:97
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:115
+#: aleksis/core/models.py:116
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:122
+#: aleksis/core/models.py:123
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:151 aleksis/core/models.py:899
+#: aleksis/core/models.py:152 aleksis/core/models.py:993
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:154
+#: aleksis/core/models.py:155
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:157
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:157
+#: aleksis/core/models.py:158
+msgid "Can view avatar image"
+msgstr ""
+
+#: aleksis/core/models.py:159
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:158
+#: aleksis/core/models.py:160
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:176 aleksis/core/models.py:1144
+#: aleksis/core/models.py:178 aleksis/core/models.py:1238
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:178
-msgid "Is person active?"
-msgstr ""
-
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:187 aleksis/core/models.py:431
+#: aleksis/core/models.py:188 aleksis/core/models.py:466
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:192
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:192
+#: aleksis/core/models.py:193
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:193
+#: aleksis/core/models.py:194
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:197
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:200
+#: aleksis/core/models.py:201
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:204
-msgid "Photo"
+#: aleksis/core/models.py:210 aleksis/core/models.py:505
+msgid "This is an official photo, used for official documents and for internal use cases."
+msgstr ""
+
+#: aleksis/core/models.py:215 aleksis/core/models.py:509
+msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:208 aleksis/core/templates/core/person/full.html:145
+#: aleksis/core/models.py:218 aleksis/core/models.py:512
+msgid "This is a picture or an avatar for public display."
+msgstr ""
+
+#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:231
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:215
+#: aleksis/core/models.py:230
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:218 aleksis/core/models.py:585
-#: aleksis/core/models.py:609 aleksis/core/models.py:694
-#: aleksis/core/models.py:974 aleksis/core/templates/core/person/full.html:128
+#: aleksis/core/models.py:233 aleksis/core/models.py:679
+#: aleksis/core/models.py:703 aleksis/core/models.py:788
+#: aleksis/core/models.py:1068
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:386
+#: aleksis/core/models.py:421
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:388
+#: aleksis/core/models.py:423
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:395
+#: aleksis/core/models.py:430
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:431
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:416
+#: aleksis/core/models.py:451
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:417
+#: aleksis/core/models.py:452
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:429
+#: aleksis/core/models.py:464
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:439 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:474 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:442 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:477 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:449 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:484 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:492
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:584 aleksis/core/models.py:608
-#: aleksis/core/models.py:693
+#: aleksis/core/models.py:678 aleksis/core/models.py:702
+#: aleksis/core/models.py:787
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:681
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:593
+#: aleksis/core/models.py:687
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:594
+#: aleksis/core/models.py:688
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:600
+#: aleksis/core/models.py:694
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:605
+#: aleksis/core/models.py:699
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:610 aleksis/core/models.py:951
+#: aleksis/core/models.py:704 aleksis/core/models.py:1045
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:612
+#: aleksis/core/models.py:706
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:613
+#: aleksis/core/models.py:707
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:626
+#: aleksis/core/models.py:720
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:695
+#: aleksis/core/models.py:789
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:698
+#: aleksis/core/models.py:792
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:701
+#: aleksis/core/models.py:795
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:820
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:858
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:765
+#: aleksis/core/models.py:859
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:914
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:915
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:822
+#: aleksis/core/models.py:916
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:825
+#: aleksis/core/models.py:919
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:826
+#: aleksis/core/models.py:920
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:925
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:832
+#: aleksis/core/models.py:926
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:931
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:838
+#: aleksis/core/models.py:932
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:937
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:938
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:969
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:970
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:971
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:883
+#: aleksis/core/models.py:977
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:978
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:890
+#: aleksis/core/models.py:984
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:891
+#: aleksis/core/models.py:985
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:896
+#: aleksis/core/models.py:990
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:995
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:996
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:917
+#: aleksis/core/models.py:1011
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:1012
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:924
+#: aleksis/core/models.py:1018
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:1031
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:938
+#: aleksis/core/models.py:1032
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:1042
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:1046 aleksis/core/models.py:1285
+#: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:1052
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:1053
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:1067
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:980 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1074 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:994
+#: aleksis/core/models.py:1088
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:1089
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:1090
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:1091
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:1092
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:999
+#: aleksis/core/models.py:1093
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1000
+#: aleksis/core/models.py:1094
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1001
+#: aleksis/core/models.py:1095
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1037
+#: aleksis/core/models.py:1131
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1139
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1046
+#: aleksis/core/models.py:1140
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1153
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1154
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1062
+#: aleksis/core/models.py:1156
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1063
+#: aleksis/core/models.py:1157
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1070
+#: aleksis/core/models.py:1164
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1094
+#: aleksis/core/models.py:1188
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1098
+#: aleksis/core/models.py:1192
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1100
+#: aleksis/core/models.py:1194
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1102
+#: aleksis/core/models.py:1196
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1109
+#: aleksis/core/models.py:1203
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1110
+#: aleksis/core/models.py:1204
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1209
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1212
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1130
+#: aleksis/core/models.py:1224
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1131
+#: aleksis/core/models.py:1225
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1147
+#: aleksis/core/models.py:1241
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1279
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/preferences.py:24
-msgid "General"
+#: aleksis/core/models.py:1289
+msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
 #: aleksis/core/preferences.py:25
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:26
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:27
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:28
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Accounts"
 msgstr ""
 
-#: aleksis/core/preferences.py:31
+#: aleksis/core/preferences.py:32
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:32
+#: aleksis/core/preferences.py:33
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:43
+#: aleksis/core/preferences.py:44
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:54
+#: aleksis/core/preferences.py:55
 msgid "Site description"
 msgstr ""
 
-#: aleksis/core/preferences.py:65
+#: aleksis/core/preferences.py:66
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:77
+#: aleksis/core/preferences.py:78
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:88
+#: aleksis/core/preferences.py:89
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:98
+#: aleksis/core/preferences.py:99
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:108
+#: aleksis/core/preferences.py:109
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:119
+#: aleksis/core/preferences.py:120
 msgid "Mail out name"
 msgstr ""
 
-#: aleksis/core/preferences.py:130
+#: aleksis/core/preferences.py:131
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:142
+#: aleksis/core/preferences.py:143
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:154
+#: aleksis/core/preferences.py:155
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:166
+#: aleksis/core/preferences.py:167
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:182
+#: aleksis/core/preferences.py:183
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:194
+#: aleksis/core/preferences.py:195
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:205
+#: aleksis/core/preferences.py:206
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:217
+#: aleksis/core/preferences.py:218
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:226
+#: aleksis/core/preferences.py:227
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:237
+#: aleksis/core/preferences.py:238
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:248
+#: aleksis/core/preferences.py:249
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
+#: aleksis/core/preferences.py:257
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:264
+#: aleksis/core/preferences.py:265
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:272
+#: aleksis/core/preferences.py:273
 msgid "Enable invitations"
 msgstr ""
 
-#: aleksis/core/preferences.py:280
+#: aleksis/core/preferences.py:281
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:288
+#: aleksis/core/preferences.py:289
 msgid "Size of packets. (Default 5: abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:298
+#: aleksis/core/preferences.py:300
 msgid "Allowed Grant Flows for OAuth applications"
 msgstr ""
 
-#: aleksis/core/preferences.py:311
+#: aleksis/core/preferences.py:313
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:323
+#: aleksis/core/preferences.py:325
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:334
+#: aleksis/core/preferences.py:336
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:345
+#: aleksis/core/preferences.py:347
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:354
+#: aleksis/core/preferences.py:356
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:365
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:376
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:390
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:401
+#: aleksis/core/preferences.py:403
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:411
+#: aleksis/core/preferences.py:413
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:412
+#: aleksis/core/preferences.py:414
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:422
+#: aleksis/core/preferences.py:424
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:432
+#: aleksis/core/preferences.py:434
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:507
+#: aleksis/core/preferences.py:444
+msgid "Country for phone number parsing"
+msgstr ""
+
+#: aleksis/core/settings.py:518
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:508
+#: aleksis/core/settings.py:519
 msgid "German"
 msgstr ""
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
-#: aleksis/core/templates/core/person/full.html:24
+#: aleksis/core/templates/core/person/full.html:26
+#: aleksis/core/templates/core/person/full.html:98
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
@@ -1154,14 +1177,14 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
-#: aleksis/core/templates/core/person/full.html:31
+#: aleksis/core/templates/core/person/full.html:33
+#: aleksis/core/templates/core/person/full.html:105
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
-#: aleksis/core/templates/403.html:14 aleksis/core/templates/404.html:10
-#: aleksis/core/templates/500.html:10
-#: aleksis/core/templates/oauth2_provider/authorize.html:47
+#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
+#: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
 msgstr ""
@@ -1172,7 +1195,7 @@ msgid ""
 "          object."
 msgstr ""
 
-#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:17
+#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
 "            If you think this is an error in AlekSIS, please contact your site\n"
@@ -1180,13 +1203,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/404.html:10
-msgid ""
-"The requested page or object was not\n"
-"          found."
-msgstr ""
-
-#: aleksis/core/templates/404.html:13
+#: aleksis/core/templates/404.html:12
 msgid ""
 "\n"
 "            If you were redirected by a link on an external page,\n"
@@ -1251,6 +1268,7 @@ msgstr ""
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
+#: aleksis/core/templates/socialaccount/login.html:17
 msgid "Confirm"
 msgstr ""
 
@@ -1295,7 +1313,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:81
+#: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
 msgstr ""
 
@@ -1471,15 +1489,15 @@ msgstr ""
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:175
+#: aleksis/core/templates/core/base.html:179
 msgid "About AlekSIS® — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:183
+#: aleksis/core/templates/core/base.html:187
 msgid "Imprint"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:191
+#: aleksis/core/templates/core/base.html:195
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1569,15 +1587,15 @@ msgstr ""
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:62
+#: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:84
+#: aleksis/core/templates/core/data_check/list.html:86
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:88
+#: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1699,7 +1717,8 @@ msgid "Edit group"
 msgstr ""
 
 #: aleksis/core/templates/core/group/full.html:38
-#: aleksis/core/templates/core/person/full.html:38
+#: aleksis/core/templates/core/person/full.html:40
+#: aleksis/core/templates/core/person/full.html:112
 msgid "Change preferences"
 msgstr ""
 
@@ -2093,19 +2112,33 @@ msgstr ""
 msgid "Edit person"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:45
+#: aleksis/core/templates/core/person/full.html:47
+#: aleksis/core/templates/core/person/full.html:119
 msgid "Impersonate"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:51
+#: aleksis/core/templates/core/person/full.html:54
+#: aleksis/core/templates/core/person/full.html:126
 msgid "Invite user"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:57
+#: aleksis/core/templates/core/person/full.html:133
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:138
+#: aleksis/core/templates/core/person/full.html:168
+msgid "home number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:174
+msgid "mobile number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:216
+msgid "This person didn't upload a personal photo."
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:224
 msgid "Children"
 msgstr ""
 
@@ -2204,27 +2237,27 @@ msgstr ""
 msgid "OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+#: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#: aleksis/core/templates/oauth2_provider/application/detail.html:79
 msgid "Skip Authorisation"
 msgstr ""
 
@@ -2237,24 +2270,30 @@ msgstr ""
 msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/list.html:20
+#: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
 msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
-#: aleksis/core/templates/oauth2_provider/authorize.html:16
+#: aleksis/core/templates/socialaccount/login.html:5
+#: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:18
+#: aleksis/core/templates/oauth2_provider/authorize.html:23
+#, python-format
+msgid "Authorize %(name)s"
+msgstr ""
+
+#: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:33
+#: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:36
+#: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
 msgstr ""
 
@@ -2357,6 +2396,20 @@ msgstr ""
 msgid "Add a Third-party Account"
 msgstr ""
 
+#: aleksis/core/templates/socialaccount/login.html:12
+#, python-format
+msgid "You are about to connect a new third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:23
+#, python-format
+msgid "You are about to sign in using a third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:28
+msgid "Continue"
+msgstr ""
+
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
@@ -2401,10 +2454,13 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/data_checks.email:4
-msgid "The system detected some new problems with your data."
+#: aleksis/core/templates/templated_email/celery_failure.email:4
+#, python-format
+msgid " Celery task %(task_name)s failed!"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:8
+#: aleksis/core/templates/templated_email/celery_failure.email:26
 #: aleksis/core/templates/templated_email/data_checks.email:8
 #: aleksis/core/templates/templated_email/data_checks.email:24
 #: aleksis/core/templates/templated_email/person_changed.email:8
@@ -2412,6 +2468,54 @@ msgstr ""
 msgid "Hello,"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:9
+#, python-format
+msgid ""
+"\n"
+"   the celery task %(task_name)s failed with following information:\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:14
+#, python-format
+msgid ""
+"\n"
+" * Task name: %(task_name)s\n"
+" * Task: %(task)s\n"
+" * Id of the task: %(task_id)s\n"
+" * Exception instance raised: %(exception)s\n"
+" * Positional arguments the task was called with: %(args)s\n"
+" * Keyword arguments the task was called with: %(kwargs)s\n"
+" * Stack trace object: %(traceback)s\n"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:28
+#, python-format
+msgid ""
+"\n"
+"    the celery task %(task_name)s failed with following information:\n"
+"  "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:34
+#, python-format
+msgid ""
+"\n"
+"   <li>Task name: %(task_name)s</li>\n"
+"   <li>Task: %(task)s</li>\n"
+"   <li>Id of the task: %(task_id)s</li>\n"
+"   <li>Exception instance raised: %(exception)s</li>\n"
+"   <li>Positional arguments the task was called with: %(args)s</li>\n"
+"   <li>Keyword arguments the task was called with: %(kwargs)s</li>\n"
+"   <li>Stack trace object: %(traceback)s</li>\n"
+" </ul>\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/data_checks.email:4
+msgid "The system detected some new problems with your data."
+msgstr ""
+
 #: aleksis/core/templates/templated_email/data_checks.email:10
 msgid ""
 "\n"
@@ -2536,21 +2640,30 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:20
+#: aleksis/core/templates/two_factor/core/login.html:27
+#, python-format
+msgid "Login for %(name)s"
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:28
+#: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:36
+#: aleksis/core/templates/two_factor/core/login.html:47
+msgid "Please login with your account to use the external application."
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:46
+#: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
 "\n"
 "                        We are calling your phone right now, please enter the\n"
@@ -2558,7 +2671,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:51
+#: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
 "\n"
 "                        We sent you a text message, please enter the tokens we\n"
@@ -2566,7 +2679,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:56
+#: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
 "\n"
 "                        Please enter the tokens generated by your token\n"
@@ -2574,7 +2687,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:62
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
 "\n"
 "                      Use this form for entering backup tokens for logging in.\n"
@@ -2583,23 +2696,23 @@ msgid ""
 "                    "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:90
+#: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:92
+#: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:102
+#: aleksis/core/templates/two_factor/core/login.html:121
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:105
+#: aleksis/core/templates/two_factor/core/login.html:124
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:116
+#: aleksis/core/templates/two_factor/core/login.html:135
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2864,141 +2977,157 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:283
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:295
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:416
+#: aleksis/core/views.py:412
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:435 aleksis/core/views.py:445
+#: aleksis/core/views.py:431 aleksis/core/views.py:441
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:495
+#: aleksis/core/views.py:491
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:592
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:608
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:695
+#: aleksis/core/views.py:672
+msgid "The requested preference registry does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:691
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:719
+#: aleksis/core/views.py:715
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:729
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:765
+#: aleksis/core/views.py:761
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:799
+#: aleksis/core/views.py:795
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:824
+#: aleksis/core/views.py:820
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:854
+#: aleksis/core/views.py:850
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:883
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:884
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:889
+#: aleksis/core/views.py:885
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:890
+#: aleksis/core/views.py:886
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:906
+#: aleksis/core/views.py:902
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:948
+#: aleksis/core/views.py:912
+msgid "The requested solve option does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:944
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:978
+#: aleksis/core/views.py:974
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:988
+#: aleksis/core/views.py:984
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1055
+#: aleksis/core/views.py:1051
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1053
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1127
+#: aleksis/core/views.py:1123
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1218
+#: aleksis/core/views.py:1214
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1228
+#: aleksis/core/views.py:1224
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1238
+#: aleksis/core/views.py:1234
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1248
+#: aleksis/core/views.py:1244
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1258
+#: aleksis/core/views.py:1254
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1377
+#: aleksis/core/views.py:1322
+msgid "The requested PDF file does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:1331 aleksis/core/views.py:1335
+msgid "The requested task does not exist or is not accessible"
+msgstr ""
+
+#: aleksis/core/views.py:1373
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1384
+#: aleksis/core/views.py:1380
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1441
+#: aleksis/core/views.py:1437
 msgid "Person was invited successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1443
+#: aleksis/core/views.py:1439
 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 d67bdb0055bf1ee96915909ce9e21023085c466b..02437289f8e1cec6ed643a6e805cb62c73234084 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: 2021-12-28 12:14+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\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"
@@ -29,6 +29,6 @@ msgstr ""
 msgid "OK"
 msgstr ""
 
-#: aleksis/core/static/js/main.js:128
+#: aleksis/core/static/js/main.js:131
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr ""
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
index 1738a0918a91e64c2eb5421ef10b70dac77a6b90..ba084d4d977d53f767419ca4ba72832e1551f2aa 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: 2021-12-28 12:13+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,30 +17,30 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:154
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:155
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:156
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:155
+#: aleksis/core/apps.py:157
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:156
+#: aleksis/core/apps.py:158
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:157 aleksis/core/forms.py:223 aleksis/core/menus.py:265
-#: aleksis/core/models.py:414 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:159 aleksis/core/forms.py:223 aleksis/core/menus.py:265
+#: aleksis/core/models.py:449 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:152
+#: aleksis/core/templates/core/person/full.html:242
 msgid "Groups"
 msgstr ""
 
@@ -65,8 +65,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
-#: aleksis/core/templates/core/base.html:105
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105
+#: aleksis/core/templates/core/base.html:106
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -74,27 +74,27 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:58
+#: aleksis/core/filters.py:59
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:70
+#: aleksis/core/filters.py:71
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/filters.py:91
+#: aleksis/core/filters.py:92
 msgid "Permission"
 msgstr ""
 
-#: aleksis/core/filters.py:99
+#: aleksis/core/filters.py:100
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:112 aleksis/core/models.py:581
+#: aleksis/core/filters.py:113 aleksis/core/models.py:675
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:134 aleksis/core/models.py:413
+#: aleksis/core/filters.py:135 aleksis/core/models.py:448
 msgid "Group"
 msgstr ""
 
@@ -102,60 +102,65 @@ msgstr ""
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:54
+#: aleksis/core/forms.py:53
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:55 aleksis/core/forms.py:568
+#: aleksis/core/forms.py:54 aleksis/core/forms.py:568
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:57
+#: aleksis/core/forms.py:56
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:105
+#: aleksis/core/forms.py:104
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:136
+#: aleksis/core/forms.py:135
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:140
+#: aleksis/core/forms.py:139
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:129
+#: aleksis/core/forms.py:156 aleksis/core/models.py:130
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:158
+#: aleksis/core/forms.py:157
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:159 aleksis/core/forms.py:210
-#: aleksis/core/menus.py:254 aleksis/core/models.py:152
+#: aleksis/core/forms.py:158 aleksis/core/forms.py:210
+#: 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:160 aleksis/core/forms.py:570
+#: aleksis/core/forms.py:159 aleksis/core/forms.py:570
 msgid "Additional data"
 msgstr ""
 
+#: aleksis/core/forms.py:160 aleksis/core/models.py:206
+#: aleksis/core/models.py:501
+msgid "Photo"
+msgstr ""
+
 #: aleksis/core/forms.py:202 aleksis/core/forms.py:205
-#: aleksis/core/models.py:72
+#: aleksis/core/models.py:73
 msgid "Date"
 msgstr ""
 
 #: aleksis/core/forms.py:203 aleksis/core/forms.py:206
-#: aleksis/core/models.py:80
+#: aleksis/core/models.py:81
 msgid "Time"
 msgstr ""
 
@@ -258,8 +263,8 @@ msgid "{task.status} - {task.result}"
 msgstr ""
 
 #: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
-#: aleksis/core/templates/two_factor/core/login.html:22
-#: aleksis/core/templates/two_factor/core/login.html:76
+#: aleksis/core/templates/two_factor/core/login.html:32
+#: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
@@ -276,8 +281,8 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:627
-#: aleksis/core/preferences.py:28
+#: aleksis/core/menus.py:41 aleksis/core/models.py:721
+#: aleksis/core/preferences.py:29
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
@@ -334,13 +339,13 @@ msgstr ""
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:141 aleksis/core/models.py:727
+#: aleksis/core/menus.py:141 aleksis/core/models.py:821
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:152 aleksis/core/models.py:130
+#: aleksis/core/menus.py:152 aleksis/core/models.py:131
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
@@ -392,7 +397,7 @@ msgstr ""
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:276 aleksis/core/models.py:981
+#: aleksis/core/menus.py:276 aleksis/core/models.py:1075
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
@@ -402,7 +407,7 @@ msgstr ""
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:298 aleksis/core/models.py:462
+#: aleksis/core/menus.py:298 aleksis/core/models.py:497
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
@@ -422,722 +427,740 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:70
+#: aleksis/core/models.py:71
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:71
+#: aleksis/core/models.py:72
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:73
+#: aleksis/core/models.py:74
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:74
+#: aleksis/core/models.py:75
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:75 aleksis/core/models.py:198
+#: aleksis/core/models.py:76 aleksis/core/models.py:199
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:77
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:78
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:79
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:80
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:82
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:93 aleksis/core/models.py:950
+#: aleksis/core/models.py:94 aleksis/core/models.py:1044
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:95
+#: aleksis/core/models.py:96
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:96
+#: aleksis/core/models.py:97
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:115
+#: aleksis/core/models.py:116
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:122
+#: aleksis/core/models.py:123
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:151 aleksis/core/models.py:899
+#: aleksis/core/models.py:152 aleksis/core/models.py:993
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:154
+#: aleksis/core/models.py:155
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:155
+#: aleksis/core/models.py:156
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:157
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:157
+#: aleksis/core/models.py:158
+msgid "Can view avatar image"
+msgstr ""
+
+#: aleksis/core/models.py:159
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:158
+#: aleksis/core/models.py:160
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:170
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:176 aleksis/core/models.py:1144
+#: aleksis/core/models.py:178 aleksis/core/models.py:1238
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:178
-msgid "Is person active?"
-msgstr ""
-
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:181
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:182
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:184
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:187 aleksis/core/models.py:431
+#: aleksis/core/models.py:188 aleksis/core/models.py:466
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:190
+#: aleksis/core/models.py:191
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:192
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:192
+#: aleksis/core/models.py:193
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:193
+#: aleksis/core/models.py:194
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:196
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:197
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:200
+#: aleksis/core/models.py:201
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:201
+#: aleksis/core/models.py:202
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:203
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:204
-msgid "Photo"
+#: aleksis/core/models.py:210 aleksis/core/models.py:505
+msgid "This is an official photo, used for official documents and for internal use cases."
+msgstr ""
+
+#: aleksis/core/models.py:215 aleksis/core/models.py:509
+msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:208 aleksis/core/templates/core/person/full.html:145
+#: aleksis/core/models.py:218 aleksis/core/models.py:512
+msgid "This is a picture or an avatar for public display."
+msgstr ""
+
+#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:231
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:215
+#: aleksis/core/models.py:230
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:218 aleksis/core/models.py:585
-#: aleksis/core/models.py:609 aleksis/core/models.py:694
-#: aleksis/core/models.py:974 aleksis/core/templates/core/person/full.html:128
+#: aleksis/core/models.py:233 aleksis/core/models.py:679
+#: aleksis/core/models.py:703 aleksis/core/models.py:788
+#: aleksis/core/models.py:1068
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:386
+#: aleksis/core/models.py:421
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:388
+#: aleksis/core/models.py:423
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:395
+#: aleksis/core/models.py:430
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:396
+#: aleksis/core/models.py:431
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:416
+#: aleksis/core/models.py:451
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:417
+#: aleksis/core/models.py:452
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:429
+#: aleksis/core/models.py:464
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:439 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:474 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:442 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:477 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:449 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:484 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:492
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:584 aleksis/core/models.py:608
-#: aleksis/core/models.py:693
+#: aleksis/core/models.py:678 aleksis/core/models.py:702
+#: aleksis/core/models.py:787
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:587
+#: aleksis/core/models.py:681
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:593
+#: aleksis/core/models.py:687
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:594
+#: aleksis/core/models.py:688
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:600
+#: aleksis/core/models.py:694
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:605
+#: aleksis/core/models.py:699
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:610 aleksis/core/models.py:951
+#: aleksis/core/models.py:704 aleksis/core/models.py:1045
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:612
+#: aleksis/core/models.py:706
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:613
+#: aleksis/core/models.py:707
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:626
+#: aleksis/core/models.py:720
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:695
+#: aleksis/core/models.py:789
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:698
+#: aleksis/core/models.py:792
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:701
+#: aleksis/core/models.py:795
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:820
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:858
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:765
+#: aleksis/core/models.py:859
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:914
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:915
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:822
+#: aleksis/core/models.py:916
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:825
+#: aleksis/core/models.py:919
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:826
+#: aleksis/core/models.py:920
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:925
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:832
+#: aleksis/core/models.py:926
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:837
+#: aleksis/core/models.py:931
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:838
+#: aleksis/core/models.py:932
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:843
+#: aleksis/core/models.py:937
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:844
+#: aleksis/core/models.py:938
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:875
+#: aleksis/core/models.py:969
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:876
+#: aleksis/core/models.py:970
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:877
+#: aleksis/core/models.py:971
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:883
+#: aleksis/core/models.py:977
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:884
+#: aleksis/core/models.py:978
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:890
+#: aleksis/core/models.py:984
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:891
+#: aleksis/core/models.py:985
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:896
+#: aleksis/core/models.py:990
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:995
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:996
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:917
+#: aleksis/core/models.py:1011
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:918
+#: aleksis/core/models.py:1012
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:924
+#: aleksis/core/models.py:1018
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:1031
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:938
+#: aleksis/core/models.py:1032
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:1042
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:952
+#: aleksis/core/models.py:1046 aleksis/core/models.py:1285
+#: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:958
+#: aleksis/core/models.py:1052
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:959
+#: aleksis/core/models.py:1053
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:1067
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:980 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1074 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:994
+#: aleksis/core/models.py:1088
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:1089
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:1090
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:997
+#: aleksis/core/models.py:1091
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:998
+#: aleksis/core/models.py:1092
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:999
+#: aleksis/core/models.py:1093
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1000
+#: aleksis/core/models.py:1094
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1001
+#: aleksis/core/models.py:1095
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1037
+#: aleksis/core/models.py:1131
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1139
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1046
+#: aleksis/core/models.py:1140
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1059
+#: aleksis/core/models.py:1153
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1154
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1062
+#: aleksis/core/models.py:1156
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1063
+#: aleksis/core/models.py:1157
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1070
+#: aleksis/core/models.py:1164
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1094
+#: aleksis/core/models.py:1188
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1098
+#: aleksis/core/models.py:1192
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1100
+#: aleksis/core/models.py:1194
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1102
+#: aleksis/core/models.py:1196
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1109
+#: aleksis/core/models.py:1203
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1110
+#: aleksis/core/models.py:1204
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1209
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1212
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1130
+#: aleksis/core/models.py:1224
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1131
+#: aleksis/core/models.py:1225
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1147
+#: aleksis/core/models.py:1241
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1185
+#: aleksis/core/models.py:1279
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/preferences.py:24
-msgid "General"
+#: aleksis/core/models.py:1289
+msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
 #: aleksis/core/preferences.py:25
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:26
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:27
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:28
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Accounts"
 msgstr ""
 
-#: aleksis/core/preferences.py:31
+#: aleksis/core/preferences.py:32
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:32
+#: aleksis/core/preferences.py:33
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:43
+#: aleksis/core/preferences.py:44
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:54
+#: aleksis/core/preferences.py:55
 msgid "Site description"
 msgstr ""
 
-#: aleksis/core/preferences.py:65
+#: aleksis/core/preferences.py:66
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:77
+#: aleksis/core/preferences.py:78
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:88
+#: aleksis/core/preferences.py:89
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:98
+#: aleksis/core/preferences.py:99
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:108
+#: aleksis/core/preferences.py:109
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:119
+#: aleksis/core/preferences.py:120
 msgid "Mail out name"
 msgstr ""
 
-#: aleksis/core/preferences.py:130
+#: aleksis/core/preferences.py:131
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:142
+#: aleksis/core/preferences.py:143
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:154
+#: aleksis/core/preferences.py:155
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:166
+#: aleksis/core/preferences.py:167
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:182
+#: aleksis/core/preferences.py:183
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:194
+#: aleksis/core/preferences.py:195
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:205
+#: aleksis/core/preferences.py:206
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:217
+#: aleksis/core/preferences.py:218
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:226
+#: aleksis/core/preferences.py:227
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:237
+#: aleksis/core/preferences.py:238
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:248
+#: aleksis/core/preferences.py:249
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:256
+#: aleksis/core/preferences.py:257
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:264
+#: aleksis/core/preferences.py:265
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:272
+#: aleksis/core/preferences.py:273
 msgid "Enable invitations"
 msgstr ""
 
-#: aleksis/core/preferences.py:280
+#: aleksis/core/preferences.py:281
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:288
+#: aleksis/core/preferences.py:289
 msgid "Size of packets. (Default 5: abcde)"
 msgstr ""
 
-#: aleksis/core/preferences.py:298
+#: aleksis/core/preferences.py:300
 msgid "Allowed Grant Flows for OAuth applications"
 msgstr ""
 
-#: aleksis/core/preferences.py:311
+#: aleksis/core/preferences.py:313
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:323
+#: aleksis/core/preferences.py:325
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:334
+#: aleksis/core/preferences.py:336
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:345
+#: aleksis/core/preferences.py:347
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:354
+#: aleksis/core/preferences.py:356
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:365
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:376
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:388
+#: aleksis/core/preferences.py:390
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:401
+#: aleksis/core/preferences.py:403
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:411
+#: aleksis/core/preferences.py:413
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:412
+#: aleksis/core/preferences.py:414
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:422
+#: aleksis/core/preferences.py:424
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:432
+#: aleksis/core/preferences.py:434
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:507
+#: aleksis/core/preferences.py:444
+msgid "Country for phone number parsing"
+msgstr ""
+
+#: aleksis/core/settings.py:518
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:508
+#: aleksis/core/settings.py:519
 msgid "German"
 msgstr ""
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
-#: aleksis/core/templates/core/person/full.html:24
+#: aleksis/core/templates/core/person/full.html:26
+#: aleksis/core/templates/core/person/full.html:98
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
@@ -1154,14 +1177,14 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:42
 #: aleksis/core/templates/core/group/full.html:31
 #: aleksis/core/templates/core/pages/delete.html:22
-#: aleksis/core/templates/core/person/full.html:31
+#: aleksis/core/templates/core/person/full.html:33
+#: aleksis/core/templates/core/person/full.html:105
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
-#: aleksis/core/templates/403.html:14 aleksis/core/templates/404.html:10
-#: aleksis/core/templates/500.html:10
-#: aleksis/core/templates/oauth2_provider/authorize.html:47
+#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
+#: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
 msgstr ""
@@ -1172,7 +1195,7 @@ msgid ""
 "          object."
 msgstr ""
 
-#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:17
+#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
 "\n"
 "            If you think this is an error in AlekSIS, please contact your site\n"
@@ -1180,13 +1203,7 @@ msgid ""
 "          "
 msgstr ""
 
-#: aleksis/core/templates/404.html:10
-msgid ""
-"The requested page or object was not\n"
-"          found."
-msgstr ""
-
-#: aleksis/core/templates/404.html:13
+#: aleksis/core/templates/404.html:12
 msgid ""
 "\n"
 "            If you were redirected by a link on an external page,\n"
@@ -1251,6 +1268,7 @@ msgstr ""
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
+#: aleksis/core/templates/socialaccount/login.html:17
 msgid "Confirm"
 msgstr ""
 
@@ -1295,7 +1313,7 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_done.html:5
 #: aleksis/core/templates/account/verification_email_required.html:5
 #: aleksis/core/templates/account/verification_email_required.html:6
-#: aleksis/core/templates/two_factor/core/login.html:81
+#: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
 msgstr ""
 
@@ -1471,15 +1489,15 @@ msgstr ""
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:175
+#: aleksis/core/templates/core/base.html:179
 msgid "About AlekSIS® — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:183
+#: aleksis/core/templates/core/base.html:187
 msgid "Imprint"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:191
+#: aleksis/core/templates/core/base.html:195
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1569,15 +1587,15 @@ msgstr ""
 msgid "Options to solve the problem"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:62
+#: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:84
+#: aleksis/core/templates/core/data_check/list.html:86
 msgid "Registered checks"
 msgstr ""
 
-#: aleksis/core/templates/core/data_check/list.html:88
+#: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
 "\n"
 "            The system will check for the following problems:\n"
@@ -1699,7 +1717,8 @@ msgid "Edit group"
 msgstr ""
 
 #: aleksis/core/templates/core/group/full.html:38
-#: aleksis/core/templates/core/person/full.html:38
+#: aleksis/core/templates/core/person/full.html:40
+#: aleksis/core/templates/core/person/full.html:112
 msgid "Change preferences"
 msgstr ""
 
@@ -2093,19 +2112,33 @@ msgstr ""
 msgid "Edit person"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:45
+#: aleksis/core/templates/core/person/full.html:47
+#: aleksis/core/templates/core/person/full.html:119
 msgid "Impersonate"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:51
+#: aleksis/core/templates/core/person/full.html:54
+#: aleksis/core/templates/core/person/full.html:126
 msgid "Invite user"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:57
+#: aleksis/core/templates/core/person/full.html:133
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:138
+#: aleksis/core/templates/core/person/full.html:168
+msgid "home number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:174
+msgid "mobile number"
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:216
+msgid "This person didn't upload a personal photo."
+msgstr ""
+
+#: aleksis/core/templates/core/person/full.html:224
 msgid "Children"
 msgstr ""
 
@@ -2204,27 +2237,27 @@ msgstr ""
 msgid "OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+#: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#: aleksis/core/templates/oauth2_provider/application/detail.html:79
 msgid "Skip Authorisation"
 msgstr ""
 
@@ -2237,24 +2270,30 @@ msgstr ""
 msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/list.html:20
+#: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
 msgstr ""
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
-#: aleksis/core/templates/oauth2_provider/authorize.html:16
+#: aleksis/core/templates/socialaccount/login.html:5
+#: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:18
+#: aleksis/core/templates/oauth2_provider/authorize.html:23
+#, python-format
+msgid "Authorize %(name)s"
+msgstr ""
+
+#: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:33
+#: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/authorize.html:36
+#: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
 msgstr ""
 
@@ -2357,6 +2396,20 @@ msgstr ""
 msgid "Add a Third-party Account"
 msgstr ""
 
+#: aleksis/core/templates/socialaccount/login.html:12
+#, python-format
+msgid "You are about to connect a new third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:23
+#, python-format
+msgid "You are about to sign in using a third party account from %(provider)s."
+msgstr ""
+
+#: aleksis/core/templates/socialaccount/login.html:28
+msgid "Continue"
+msgstr ""
+
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
@@ -2401,10 +2454,13 @@ msgid ""
 "        "
 msgstr ""
 
-#: aleksis/core/templates/templated_email/data_checks.email:4
-msgid "The system detected some new problems with your data."
+#: aleksis/core/templates/templated_email/celery_failure.email:4
+#, python-format
+msgid " Celery task %(task_name)s failed!"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:8
+#: aleksis/core/templates/templated_email/celery_failure.email:26
 #: aleksis/core/templates/templated_email/data_checks.email:8
 #: aleksis/core/templates/templated_email/data_checks.email:24
 #: aleksis/core/templates/templated_email/person_changed.email:8
@@ -2412,6 +2468,54 @@ msgstr ""
 msgid "Hello,"
 msgstr ""
 
+#: aleksis/core/templates/templated_email/celery_failure.email:9
+#, python-format
+msgid ""
+"\n"
+"   the celery task %(task_name)s failed with following information:\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:14
+#, python-format
+msgid ""
+"\n"
+" * Task name: %(task_name)s\n"
+" * Task: %(task)s\n"
+" * Id of the task: %(task_id)s\n"
+" * Exception instance raised: %(exception)s\n"
+" * Positional arguments the task was called with: %(args)s\n"
+" * Keyword arguments the task was called with: %(kwargs)s\n"
+" * Stack trace object: %(traceback)s\n"
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:28
+#, python-format
+msgid ""
+"\n"
+"    the celery task %(task_name)s failed with following information:\n"
+"  "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/celery_failure.email:34
+#, python-format
+msgid ""
+"\n"
+"   <li>Task name: %(task_name)s</li>\n"
+"   <li>Task: %(task)s</li>\n"
+"   <li>Id of the task: %(task_id)s</li>\n"
+"   <li>Exception instance raised: %(exception)s</li>\n"
+"   <li>Positional arguments the task was called with: %(args)s</li>\n"
+"   <li>Keyword arguments the task was called with: %(kwargs)s</li>\n"
+"   <li>Stack trace object: %(traceback)s</li>\n"
+" </ul>\n"
+" "
+msgstr ""
+
+#: aleksis/core/templates/templated_email/data_checks.email:4
+msgid "The system detected some new problems with your data."
+msgstr ""
+
 #: aleksis/core/templates/templated_email/data_checks.email:10
 msgid ""
 "\n"
@@ -2536,21 +2640,30 @@ msgstr ""
 msgid "Generate Tokens"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:20
+#: aleksis/core/templates/two_factor/core/login.html:27
+#, python-format
+msgid "Login for %(name)s"
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:28
+#: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:36
+#: aleksis/core/templates/two_factor/core/login.html:47
+msgid "Please login with your account to use the external application."
+msgstr ""
+
+#: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:46
+#: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
 "\n"
 "                        We are calling your phone right now, please enter the\n"
@@ -2558,7 +2671,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:51
+#: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
 "\n"
 "                        We sent you a text message, please enter the tokens we\n"
@@ -2566,7 +2679,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:56
+#: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
 "\n"
 "                        Please enter the tokens generated by your token\n"
@@ -2574,7 +2687,7 @@ msgid ""
 "                      "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:62
+#: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
 "\n"
 "                      Use this form for entering backup tokens for logging in.\n"
@@ -2583,23 +2696,23 @@ msgid ""
 "                    "
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:90
+#: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:92
+#: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:102
+#: aleksis/core/templates/two_factor/core/login.html:121
 msgid "As a last resort, you can use a backup token:"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:105
+#: aleksis/core/templates/two_factor/core/login.html:124
 msgid "Use Backup Token"
 msgstr ""
 
-#: aleksis/core/templates/two_factor/core/login.html:116
+#: aleksis/core/templates/two_factor/core/login.html:135
 msgid "Use alternative login options"
 msgstr ""
 
@@ -2864,140 +2977,156 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:280
+#: aleksis/core/views.py:283
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:292
+#: aleksis/core/views.py:295
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:416
+#: aleksis/core/views.py:412
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:435 aleksis/core/views.py:445
+#: aleksis/core/views.py:431 aleksis/core/views.py:441
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:495
+#: aleksis/core/views.py:491
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:592
+#: aleksis/core/views.py:588
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:608
+#: aleksis/core/views.py:604
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:695
+#: aleksis/core/views.py:672
+msgid "The requested preference registry does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:691
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:719
+#: aleksis/core/views.py:715
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:729
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:765
+#: aleksis/core/views.py:761
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:799
+#: aleksis/core/views.py:795
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:824
+#: aleksis/core/views.py:820
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:854
+#: aleksis/core/views.py:850
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:887
+#: aleksis/core/views.py:883
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:888
+#: aleksis/core/views.py:884
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:889
+#: aleksis/core/views.py:885
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:890
+#: aleksis/core/views.py:886
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:906
+#: aleksis/core/views.py:902
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:948
+#: aleksis/core/views.py:912
+msgid "The requested solve option does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:944
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:978
+#: aleksis/core/views.py:974
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:988
+#: aleksis/core/views.py:984
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1055
+#: aleksis/core/views.py:1051
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1057
+#: aleksis/core/views.py:1053
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1127
+#: aleksis/core/views.py:1123
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1218
+#: aleksis/core/views.py:1214
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1228
+#: aleksis/core/views.py:1224
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1238
+#: aleksis/core/views.py:1234
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1248
+#: aleksis/core/views.py:1244
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1258
+#: aleksis/core/views.py:1254
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1377
+#: aleksis/core/views.py:1322
+msgid "The requested PDF file does not exist"
+msgstr ""
+
+#: aleksis/core/views.py:1331 aleksis/core/views.py:1335
+msgid "The requested task does not exist or is not accessible"
+msgstr ""
+
+#: aleksis/core/views.py:1373
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1384
+#: aleksis/core/views.py:1380
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1441
+#: aleksis/core/views.py:1437
 msgid "Person was invited successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1443
+#: aleksis/core/views.py:1439
 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 d67bdb0055bf1ee96915909ce9e21023085c466b..02437289f8e1cec6ed643a6e805cb62c73234084 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: 2021-12-28 12:14+0100\n"
+"POT-Creation-Date: 2022-01-09 12:40+0100\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"
@@ -29,6 +29,6 @@ msgstr ""
 msgid "OK"
 msgstr ""
 
-#: aleksis/core/static/js/main.js:128
+#: aleksis/core/static/js/main.js:131
 msgid "This page may contain outdated information since there is no internet connection."
 msgstr ""