diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po
index 29ee921af8694936e102e32d65b310ac44979fbc..33b5acc1cc5ba743104df96de5f85d64a90010c1 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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,23 +18,23 @@ 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:150
+#: aleksis/core/apps.py:151
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:151
+#: aleksis/core/apps.py:152
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:153
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:154
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:155
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -59,8 +59,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
-#: aleksis/core/templates/core/base.html:84
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
+#: aleksis/core/templates/core/base.html:105
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -68,132 +68,172 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:53
+#: aleksis/core/filters.py:58
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:65
+#: aleksis/core/filters.py:70
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
+#: aleksis/core/filters.py:91
+msgid "Permission"
+msgstr ""
+
+#: aleksis/core/filters.py:99
+msgid "Content type"
+msgstr ""
+
+#: aleksis/core/filters.py:112 aleksis/core/models.py:579
+msgid "User"
+msgstr ""
+
+#: aleksis/core/filters.py:134 aleksis/core/models.py:411
+msgid "Group"
+msgstr ""
+
+#: aleksis/core/forms.py:46 aleksis/core/forms.py:514
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:47
+#: aleksis/core/forms.py:52
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:48
+#: aleksis/core/forms.py:53
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:50
+#: aleksis/core/forms.py:55
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:124
+#: aleksis/core/forms.py:134
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:128
+#: aleksis/core/forms.py:138
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:145 aleksis/core/models.py:117
+#: aleksis/core/forms.py:155 aleksis/core/models.py:125
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:146
+#: aleksis/core/forms.py:156
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
-#: aleksis/core/menus.py:238 aleksis/core/models.py:140
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:208
+#: aleksis/core/menus.py:256 aleksis/core/models.py:148
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:148
+#: aleksis/core/forms.py:158
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
-#: aleksis/core/models.py:60
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:68
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
-#: aleksis/core/models.py:68
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:76
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
-#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:221 aleksis/core/menus.py:267
+#: aleksis/core/models.py:412 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:144
+#: aleksis/core/templates/core/person/full.html:145
 msgid "Groups"
 msgstr ""
 
-#: aleksis/core/forms.py:219
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:222
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:223
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:262
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:266
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:275
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:389
+#: aleksis/core/forms.py:411
+msgid "Who should get the permission?"
+msgstr ""
+
+#: aleksis/core/forms.py:412
+msgid "On what?"
+msgstr ""
+
+#: aleksis/core/forms.py:438
+msgid "Select objects which the permission should be granted for:"
+msgstr ""
+
+#: aleksis/core/forms.py:441
+msgid "Grant the permission for all objects"
+msgstr ""
+
+#: aleksis/core/forms.py:449
+msgid "You must select at least one group or person which should get the permission."
+msgstr ""
+
+#: aleksis/core/forms.py:454
+msgid "You must grant the permission to all objects and/or to some objects."
+msgstr ""
+
+#: aleksis/core/forms.py:518
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:391
+#: aleksis/core/forms.py:524
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:531
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:402
+#: aleksis/core/forms.py:537
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:411
+#: aleksis/core/forms.py:550
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:435
+#: aleksis/core/forms.py:575
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:580
+#: aleksis/core/forms.py:720
 msgid "No valid selection."
 msgstr ""
 
@@ -238,30 +278,30 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:605
-#: aleksis/core/preferences.py:26
+#: aleksis/core/menus.py:32 aleksis/core/models.py:625
+#: aleksis/core/preferences.py:27
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/menus.py:41
+#: aleksis/core/menus.py:44
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:48
+#: aleksis/core/menus.py:51
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
+#: aleksis/core/menus.py:60 aleksis/core/templates/core/base.html:80
 msgid "Logout"
 msgstr ""
 
-#: aleksis/core/menus.py:63
+#: aleksis/core/menus.py:66
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:69
+#: aleksis/core/menus.py:74
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -273,817 +313,806 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:81
+#: aleksis/core/menus.py:86
 msgid "Me"
 msgstr ""
 
-#: aleksis/core/menus.py:90
+#: aleksis/core/menus.py:95
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:99
+#: aleksis/core/menus.py:104
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:108
+#: aleksis/core/menus.py:113
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:119
+#: aleksis/core/menus.py:124
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:704
+#: aleksis/core/menus.py:132 aleksis/core/models.py:725
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:118
+#: aleksis/core/menus.py:143 aleksis/core/models.py:126
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:149
+#: aleksis/core/menus.py:154
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:160
+#: aleksis/core/menus.py:165
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:171
+#: aleksis/core/menus.py:176
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:182
+#: aleksis/core/menus.py:187
 msgid "Impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:193
+#: aleksis/core/menus.py:198
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:209 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:210
+#: aleksis/core/menus.py:215 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/templates/core/perms/list.html:14
+msgid "Manage permissions"
+msgstr ""
+
+#: aleksis/core/menus.py:226
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:216
-#: aleksis/core/templates/oauth2_provider/application_detail.html:5
-#: aleksis/core/templates/oauth2_provider/application_list.html:5
+#: aleksis/core/menus.py:234
+#: aleksis/core/templates/oauth2_provider/application/list.html:5
+#: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:247
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:958
+#: aleksis/core/menus.py:278 aleksis/core/models.py:979
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/menus.py:271
+#: aleksis/core/menus.py:289
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:282 aleksis/core/models.py:446
+#: aleksis/core/menus.py:300 aleksis/core/models.py:460
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:297
+#: aleksis/core/menus.py:315
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:498
+#: aleksis/core/mixins.py:508
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:66
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:59
+#: aleksis/core/models.py:67
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:69
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:62
+#: aleksis/core/models.py:70
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:63 aleksis/core/models.py:186
+#: aleksis/core/models.py:71 aleksis/core/models.py:194
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:72
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:73
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:74
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:67
+#: aleksis/core/models.py:75
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:69
+#: aleksis/core/models.py:77
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:81 aleksis/core/models.py:927
+#: aleksis/core/models.py:89 aleksis/core/models.py:948
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:91
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:92
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:103
+#: aleksis/core/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:110
+#: aleksis/core/models.py:118
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:139 aleksis/core/models.py:876
+#: aleksis/core/models.py:147 aleksis/core/models.py:897
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:150
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:151
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:152
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:153
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:146
+#: aleksis/core/models.py:154
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:172
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:174
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:176
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:177
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:179
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:175 aleksis/core/models.py:415
+#: aleksis/core/models.py:183 aleksis/core/models.py:429
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:186
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:187
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:188
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:189
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:191
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:184
+#: aleksis/core/models.py:192
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:196
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:189
+#: aleksis/core/models.py:198
+msgid "Place of birth"
+msgstr ""
+
+#: aleksis/core/models.py:200
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:202
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:206 aleksis/core/templates/core/person/full.html:138
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:213
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:205 aleksis/core/models.py:563
-#: aleksis/core/models.py:587 aleksis/core/models.py:672
-#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:216 aleksis/core/models.py:583
+#: aleksis/core/models.py:607 aleksis/core/models.py:692
+#: aleksis/core/models.py:972 aleksis/core/templates/core/person/full.html:121
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:370
+#: aleksis/core/models.py:384
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:372
+#: aleksis/core/models.py:386
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:379
+#: aleksis/core/models.py:393
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:394
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:397
-msgid "Group"
-msgstr ""
-
-#: aleksis/core/models.py:400
+#: aleksis/core/models.py:414
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:401
+#: aleksis/core/models.py:415
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:413
+#: aleksis/core/models.py:427
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:437 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:440 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:447 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:441
+#: aleksis/core/models.py:455
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:559
-msgid "User"
-msgstr ""
-
-#: aleksis/core/models.py:562 aleksis/core/models.py:586
-#: aleksis/core/models.py:671
+#: aleksis/core/models.py:582 aleksis/core/models.py:606
+#: aleksis/core/models.py:691
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:565
+#: aleksis/core/models.py:585
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:571
+#: aleksis/core/models.py:591
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:572
+#: aleksis/core/models.py:592
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:578
+#: aleksis/core/models.py:598
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:583
+#: aleksis/core/models.py:603
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:588 aleksis/core/models.py:928
+#: aleksis/core/models.py:608 aleksis/core/models.py:949
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:590
+#: aleksis/core/models.py:610
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:591
+#: aleksis/core/models.py:611
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:604
+#: aleksis/core/models.py:624
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:673
+#: aleksis/core/models.py:693
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:676
+#: aleksis/core/models.py:696
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:679
+#: aleksis/core/models.py:699
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:703
+#: aleksis/core/models.py:724
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:741
+#: aleksis/core/models.py:762
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742
+#: aleksis/core/models.py:763
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:818
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:819
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:799
+#: aleksis/core/models.py:820
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:802
+#: aleksis/core/models.py:823
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:824
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:808
+#: aleksis/core/models.py:829
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:809
+#: aleksis/core/models.py:830
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:814
+#: aleksis/core/models.py:835
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:815
+#: aleksis/core/models.py:836
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:841
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:842
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:852
+#: aleksis/core/models.py:873
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:853
+#: aleksis/core/models.py:874
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:854
+#: aleksis/core/models.py:875
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:860
+#: aleksis/core/models.py:881
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:882
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:867
+#: aleksis/core/models.py:888
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:868
+#: aleksis/core/models.py:889
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:873
+#: aleksis/core/models.py:894
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:899
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:879
+#: aleksis/core/models.py:900
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:894
+#: aleksis/core/models.py:915
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:895
+#: aleksis/core/models.py:916
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:922
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:935
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:915
+#: aleksis/core/models.py:936
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:946
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:929
+#: aleksis/core/models.py:950
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:956
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:957
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:950
+#: aleksis/core/models.py:971
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:978 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:971
+#: aleksis/core/models.py:992
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:972
+#: aleksis/core/models.py:993
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:994
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:974
+#: aleksis/core/models.py:995
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:975
+#: aleksis/core/models.py:996
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:976
+#: aleksis/core/models.py:997
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:977
+#: aleksis/core/models.py:998
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:978
-msgid "Can add oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:979
-msgid "Can list oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:980
-msgid "Can view oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:981
-msgid "Can update oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:982
-msgid "Can delete oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:983
+#: aleksis/core/models.py:999
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1035
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1027
+#: aleksis/core/models.py:1043
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1041
+#: aleksis/core/models.py:1057
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1058
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1061
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1080
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1082
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1091
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1092
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1084
+#: aleksis/core/models.py:1100
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1096
+#: aleksis/core/models.py:1112
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1097
+#: aleksis/core/models.py:1113
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/preferences.py:22
-msgid "General"
+#: aleksis/core/models.py:1127
+msgid "Allowed scopes that clients can request"
 msgstr ""
 
 #: aleksis/core/preferences.py:23
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:24
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:25
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:26
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:28
+#: aleksis/core/preferences.py:29
 msgid "Accounts"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:41
+#: aleksis/core/preferences.py:42
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:52
+#: aleksis/core/preferences.py:53
 msgid "Site description"
 msgstr ""
 
-#: aleksis/core/preferences.py:63
+#: aleksis/core/preferences.py:64
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:75
+#: aleksis/core/preferences.py:76
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:86
+#: aleksis/core/preferences.py:87
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:96
+#: aleksis/core/preferences.py:97
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:106
+#: aleksis/core/preferences.py:107
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:117
+#: aleksis/core/preferences.py:118
 msgid "Mail out name"
 msgstr ""
 
-#: aleksis/core/preferences.py:128
+#: aleksis/core/preferences.py:129
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:140
+#: aleksis/core/preferences.py:141
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:152
+#: aleksis/core/preferences.py:153
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:164
+#: aleksis/core/preferences.py:165
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:180
+#: aleksis/core/preferences.py:181
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:192
+#: aleksis/core/preferences.py:193
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:203
+#: aleksis/core/preferences.py:204
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:215
+#: aleksis/core/preferences.py:216
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:224
+#: aleksis/core/preferences.py:225
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:235
+#: aleksis/core/preferences.py:236
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:246
+#: aleksis/core/preferences.py:247
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:254
+#: aleksis/core/preferences.py:255
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:262
+#: aleksis/core/preferences.py:263
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:273
+#: aleksis/core/preferences.py:274
+msgid "Allowed Grant Flows for OAuth applications"
+msgstr ""
+
+#: aleksis/core/preferences.py:287
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:285
+#: aleksis/core/preferences.py:299
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:296
+#: aleksis/core/preferences.py:310
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:307
+#: aleksis/core/preferences.py:321
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:316
+#: aleksis/core/preferences.py:330
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:325
+#: aleksis/core/preferences.py:339
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:336
+#: aleksis/core/preferences.py:350
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:364
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:377
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:373
+#: aleksis/core/preferences.py:387
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:388
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:384
+#: aleksis/core/preferences.py:398
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:394
+#: aleksis/core/preferences.py:408
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:452
+#: aleksis/core/settings.py:474
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:453
+#: aleksis/core/settings.py:475
 msgid "German"
 msgstr ""
 
@@ -1091,23 +1120,24 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
 #: aleksis/core/templates/core/person/full.html:23
-#: aleksis/core/templates/oauth2_provider/application_detail.html:17
+#: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:21 aleksis/core/tables.py:89
+#: aleksis/core/tables.py:105
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:56 aleksis/core/tables.py:57
 #: aleksis/core/tables.py:71 aleksis/core/tables.py:87
+#: aleksis/core/tables.py:103
 #: 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:30
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:20
-#: aleksis/core/templates/oauth2_provider/application_detail.html:21
+#: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
@@ -1424,19 +1454,19 @@ msgstr ""
 msgid "There are no announcements."
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:60
+#: aleksis/core/templates/core/base.html:78
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:154
+#: aleksis/core/templates/core/base.html:175
 msgid "About AlekSIS — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:162
+#: aleksis/core/templates/core/base.html:183
 msgid "Impress"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:170
+#: aleksis/core/templates/core/base.html:191
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1627,7 +1657,7 @@ msgstr ""
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
-#: aleksis/core/templates/oauth2_provider/application_detail.html:9
+#: aleksis/core/templates/oauth2_provider/application/detail.html:9
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
@@ -1984,6 +2014,51 @@ msgid ""
 "          "
 msgstr ""
 
+#: aleksis/core/templates/core/perms/assign.html:12
+#: aleksis/core/templates/core/perms/assign.html:13
+msgid "Assign permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:17
+msgid "Selected permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:26
+msgid "Assign"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:21
+msgid "Assign a new permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:25
+msgid "Select"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:34
+msgid "Global (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:38
+msgid "Global (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:42
+msgid "Object (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:46
+msgid "Object (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:52
+msgid "Filter permissions"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:58
+msgid "Update"
+msgstr ""
+
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
@@ -2005,7 +2080,7 @@ msgstr ""
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:130
+#: aleksis/core/templates/core/person/full.html:131
 msgid "Children"
 msgstr ""
 
@@ -2045,60 +2120,56 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
-msgid "Delete application"
+#: aleksis/core/templates/oauth2_provider/application/create.html:5
+#: aleksis/core/templates/oauth2_provider/application/create.html:6
+msgid "Register OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:12
-#, python-format
-msgid "Are you sure to delete the application %(application_name)s?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:24
-#: aleksis/core/templates/oauth2_provider/application_form.html:18
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:5
+msgid "OAuth2 Application"
+msgstr ""
+
+#: aleksis/core/templates/oauth2_provider/application/detail.html:27
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:35
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:43
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:51
-msgid "Authorization Grant Type"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:59
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_form.html:5
-msgid "Create OAuth2 Application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_form.html:10
-msgid "Edit application"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+msgid "Skip Authorisation"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:8
-msgid "OAuth2 applications"
+#: aleksis/core/templates/oauth2_provider/application/edit.html:5
+#: aleksis/core/templates/oauth2_provider/application/edit.html:6
+msgid "Edit OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:12
-msgid "Register new applications"
+#: aleksis/core/templates/oauth2_provider/application/list.html:11
+msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:23
+#: aleksis/core/templates/oauth2_provider/application/list.html:20
 msgid "No applications defined."
 msgstr ""
 
@@ -2729,107 +2800,127 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:251
+#: aleksis/core/views.py:270
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:263
+#: aleksis/core/views.py:282
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:387
+#: aleksis/core/views.py:406
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:406 aleksis/core/views.py:416
+#: aleksis/core/views.py:425 aleksis/core/views.py:435
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:466
+#: aleksis/core/views.py:485
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:563
+#: aleksis/core/views.py:582
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:579
+#: aleksis/core/views.py:598
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:663
+#: aleksis/core/views.py:682
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:687
+#: aleksis/core/views.py:706
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:701
+#: aleksis/core/views.py:720
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:752
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:786
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:811
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:841
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:855
+#: aleksis/core/views.py:874
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:856
+#: aleksis/core/views.py:875
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:857
+#: aleksis/core/views.py:876
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:877
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:874
+#: aleksis/core/views.py:893
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:916
+#: aleksis/core/views.py:935
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:965
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:956
+#: aleksis/core/views.py:975
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1023
+#: aleksis/core/views.py:1042
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1025
+#: aleksis/core/views.py:1044
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1153
+#: aleksis/core/views.py:1139
+msgid "We have successfully assigned the permissions."
+msgstr ""
+
+#: aleksis/core/views.py:1149
+msgid "The global user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1159
+msgid "The global group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1169
+msgid "The object user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1179
+msgid "The object group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1298
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1160
+#: aleksis/core/views.py:1305
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
index 58d7ae38a2326acb79508cd05c32cab673c58fe9..eacffd3e211761afbf5bb697e91ee630c6d3eabc 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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"
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
index f392000d5c400048743b02d15cfca5dbb4efd644..71181d5357d90716bda9b319cec5d2ea0a8eea91 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+0100\n"
 "PO-Revision-Date: 2021-10-29 14:28+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,23 +18,23 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.8\n"
 
-#: aleksis/core/apps.py:150
+#: aleksis/core/apps.py:151
 msgid "OpenID Connect scope"
 msgstr "OpenID-Connect-Scope"
 
-#: aleksis/core/apps.py:151
+#: aleksis/core/apps.py:152
 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:152
+#: aleksis/core/apps.py:153
 msgid "Full home postal address"
 msgstr "Vollständige Postanschrift"
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:154
 msgid "Email address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:155
 msgid "Home and mobile phone"
 msgstr "Festnetz- und Mobilfunknummer"
 
@@ -60,8 +59,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:37 aleksis/core/templates/core/base.html:83
-#: aleksis/core/templates/core/base.html:84
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
+#: aleksis/core/templates/core/base.html:105
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -69,132 +68,178 @@ msgstr "Das Dashboard-Widget wurde automatisch als kaputt gemeldet."
 msgid "Search"
 msgstr "Suchen"
 
-#: aleksis/core/filters.py:53
+#: aleksis/core/filters.py:58
 msgid "Search by name"
 msgstr "Nach Namen suchen"
 
-#: aleksis/core/filters.py:65
+#: aleksis/core/filters.py:70
 msgid "Search by contact details"
 msgstr "Nach Kontaktdetails suchen"
 
-#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
+#: aleksis/core/filters.py:91
+#, fuzzy
+#| msgid "Permission Denied"
+msgid "Permission"
+msgstr "Zugriff verwehrt"
+
+#: aleksis/core/filters.py:99
+#, fuzzy
+#| msgid "Client type"
+msgid "Content type"
+msgstr "Client-Typ"
+
+#: aleksis/core/filters.py:112 aleksis/core/models.py:579
+msgid "User"
+msgstr "Benutzer"
+
+#: aleksis/core/filters.py:134 aleksis/core/models.py:411
+msgid "Group"
+msgstr "Gruppe"
+
+#: aleksis/core/forms.py:46 aleksis/core/forms.py:514
 msgid "Base data"
 msgstr "Basisdaten"
 
-#: aleksis/core/forms.py:47
+#: aleksis/core/forms.py:52
 msgid "Address"
 msgstr "Adresse"
 
-#: aleksis/core/forms.py:48
+#: aleksis/core/forms.py:53
 msgid "Contact data"
 msgstr "Kontaktdaten"
 
-#: aleksis/core/forms.py:50
+#: aleksis/core/forms.py:55
 msgid "Advanced personal data"
 msgstr "Zusätzliche persönliche Daten"
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "New user"
 msgstr "Neuer Benutzer"
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "Create a new account"
 msgstr "Neues Benutzerkonto erstellen"
 
-#: aleksis/core/forms.py:124
+#: aleksis/core/forms.py:134
 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:128
+#: aleksis/core/forms.py:138
 msgid "This username is already in use."
 msgstr "Dieser Benutzername wird bereits genutzt."
 
-#: aleksis/core/forms.py:145 aleksis/core/models.py:117
+#: aleksis/core/forms.py:155 aleksis/core/models.py:125
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/core/forms.py:146
+#: aleksis/core/forms.py:156
 msgid "Common data"
 msgstr "Allgemeine Daten"
 
-#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
-#: aleksis/core/menus.py:238 aleksis/core/models.py:140
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:208
+#: aleksis/core/menus.py:256 aleksis/core/models.py:148
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "Personen"
 
-#: aleksis/core/forms.py:148
+#: aleksis/core/forms.py:158
 msgid "Additional data"
 msgstr "Zusätzliche Datne"
 
-#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
-#: aleksis/core/models.py:60
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:68
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
-#: aleksis/core/models.py:68
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:76
 msgid "Time"
 msgstr "Zeit"
 
-#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
-#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:221 aleksis/core/menus.py:267
+#: aleksis/core/models.py:412 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:144
+#: aleksis/core/templates/core/person/full.html:145
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/core/forms.py:219
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr "Von wann bis wann soll die Ankündigung angezeigt werden?"
 
-#: aleksis/core/forms.py:222
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr "Wer soll die Ankündigung sehen?"
 
-#: aleksis/core/forms.py:223
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr "Schreiben Sie ihre Ankündigung:"
 
-#: aleksis/core/forms.py:262
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr "Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit gültig sind."
 
-#: aleksis/core/forms.py:266
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr "Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit sein."
 
-#: aleksis/core/forms.py:275
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr "Sie benötigen mindestens einen Empfänger."
 
-#: aleksis/core/forms.py:389
+#: aleksis/core/forms.py:411
+#, fuzzy
+#| msgid "Who should see the announcement?"
+msgid "Who should get the permission?"
+msgstr "Wer soll die Ankündigung sehen?"
+
+#: aleksis/core/forms.py:412
+msgid "On what?"
+msgstr ""
+
+#: aleksis/core/forms.py:438
+msgid "Select objects which the permission should be granted for:"
+msgstr ""
+
+#: aleksis/core/forms.py:441
+msgid "Grant the permission for all objects"
+msgstr ""
+
+#: aleksis/core/forms.py:449
+msgid "You must select at least one group or person which should get the permission."
+msgstr ""
+
+#: aleksis/core/forms.py:454
+msgid "You must grant the permission to all objects and/or to some objects."
+msgstr ""
+
+#: aleksis/core/forms.py:518
 msgid "Account data"
 msgstr "Kontodaten"
 
-#: aleksis/core/forms.py:391
+#: aleksis/core/forms.py:524
 msgid "Consents"
 msgstr "Zustimmungen"
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:531
 msgid "Password"
 msgstr "Passwort"
 
-#: aleksis/core/forms.py:402
+#: aleksis/core/forms.py:537
 msgid "Password (again)"
 msgstr "Passwort wiederholen"
 
-#: aleksis/core/forms.py:411
+#: aleksis/core/forms.py:550
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen und stimme ihr zu."
 
-#: aleksis/core/forms.py:435
+#: aleksis/core/forms.py:575
 msgid "You must type the same password each time."
 msgstr "Sie müssen zweimal das gleiche Passwort eingeben."
 
-#: aleksis/core/forms.py:580
+#: aleksis/core/forms.py:720
 msgid "No valid selection."
 msgstr "Keine gültige Auswahl."
 
@@ -239,30 +284,30 @@ msgstr "Registrieren"
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:605
-#: aleksis/core/preferences.py:26
+#: aleksis/core/menus.py:32 aleksis/core/models.py:625
+#: aleksis/core/preferences.py:27
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
 msgstr "Benachrichtigungen"
 
-#: aleksis/core/menus.py:41
+#: aleksis/core/menus.py:44
 msgid "Account"
 msgstr "Konto"
 
-#: aleksis/core/menus.py:48
+#: aleksis/core/menus.py:51
 msgid "Stop impersonation"
 msgstr "Verkleidung beenden"
 
-#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
+#: aleksis/core/menus.py:60 aleksis/core/templates/core/base.html:80
 msgid "Logout"
 msgstr "Abmelden"
 
-#: aleksis/core/menus.py:63
+#: aleksis/core/menus.py:66
 msgid "2FA"
 msgstr "2FA"
 
-#: aleksis/core/menus.py:69
+#: aleksis/core/menus.py:74
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -274,817 +319,810 @@ msgstr "2FA"
 msgid "Change password"
 msgstr "Passwort ändern"
 
-#: aleksis/core/menus.py:81
+#: aleksis/core/menus.py:86
 msgid "Me"
 msgstr "Ich"
 
-#: aleksis/core/menus.py:90
+#: aleksis/core/menus.py:95
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr "Einstellungen"
 
-#: aleksis/core/menus.py:99
+#: aleksis/core/menus.py:104
 msgid "Third-party accounts"
 msgstr "Drittanbieter-Konten"
 
-#: aleksis/core/menus.py:108
+#: aleksis/core/menus.py:113
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr "Autorisierte Anwendungen"
 
-#: aleksis/core/menus.py:119
+#: aleksis/core/menus.py:124
 msgid "Admin"
 msgstr "Admin"
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:704
+#: aleksis/core/menus.py:132 aleksis/core/models.py:725
 #: 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:138 aleksis/core/models.py:118
+#: aleksis/core/menus.py:143 aleksis/core/models.py:126
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "Schuljahre"
 
-#: aleksis/core/menus.py:149
+#: aleksis/core/menus.py:154
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/menus.py:160
+#: aleksis/core/menus.py:165
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr "Datenverwaltung"
 
-#: aleksis/core/menus.py:171
+#: aleksis/core/menus.py:176
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr "Systemstatus"
 
-#: aleksis/core/menus.py:182
+#: aleksis/core/menus.py:187
 msgid "Impersonation"
 msgstr "Verkleidung"
 
-#: aleksis/core/menus.py:193
+#: aleksis/core/menus.py:198
 msgid "Configuration"
 msgstr "Konfiguration"
 
-#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:209 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr "Datenprüfungen"
 
-#: aleksis/core/menus.py:210
+#: aleksis/core/menus.py:215 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/templates/core/perms/list.html:14
+msgid "Manage permissions"
+msgstr ""
+
+#: aleksis/core/menus.py:226
 msgid "Backend Admin"
 msgstr "Backend-Administration"
 
-#: aleksis/core/menus.py:216
-#: aleksis/core/templates/oauth2_provider/application_detail.html:5
-#: aleksis/core/templates/oauth2_provider/application_list.html:5
+#: aleksis/core/menus.py:234
+#: aleksis/core/templates/oauth2_provider/application/list.html:5
+#: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr "OAuth2-Anwendungen"
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:247
 msgid "People"
 msgstr "Leute"
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:958
+#: aleksis/core/menus.py:278 aleksis/core/models.py:979
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr "Gruppentypen"
 
-#: aleksis/core/menus.py:271
+#: aleksis/core/menus.py:289
 msgid "Groups and child groups"
 msgstr "Gruppen und Kindgruppen"
 
-#: aleksis/core/menus.py:282 aleksis/core/models.py:446
+#: aleksis/core/menus.py:300 aleksis/core/models.py:460
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr "Zusätzliche Felder"
 
-#: aleksis/core/menus.py:297
+#: aleksis/core/menus.py:315
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr "Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/mixins.py:498
+#: aleksis/core/mixins.py:508
 msgid "Linked school term"
 msgstr "Zugeordnetes Schuljahr"
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:66
 msgid "Boolean (Yes/No)"
 msgstr "Boolean (Ja/Nein)"
 
-#: aleksis/core/models.py:59
+#: aleksis/core/models.py:67
 msgid "Text (one line)"
 msgstr "Text (eine Zeile)"
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:69
 msgid "Date and time"
 msgstr "Datum und Uhrzeit"
 
-#: aleksis/core/models.py:62
+#: aleksis/core/models.py:70
 msgid "Decimal number"
 msgstr "Dezimalzahl"
 
-#: aleksis/core/models.py:63 aleksis/core/models.py:186
+#: aleksis/core/models.py:71 aleksis/core/models.py:194
 msgid "E-mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:72
 msgid "Integer"
 msgstr "Ganze Zahl"
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:73
 msgid "IP address"
 msgstr "IP-Adresse"
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:74
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Boolean oder leer (Ja/Nein/weder)"
 
-#: aleksis/core/models.py:67
+#: aleksis/core/models.py:75
 msgid "Text (multi-line)"
 msgstr "Text (mehrzeilig)"
 
-#: aleksis/core/models.py:69
+#: aleksis/core/models.py:77
 msgid "URL / Link"
 msgstr "URL / Link"
 
-#: aleksis/core/models.py:81 aleksis/core/models.py:927
+#: aleksis/core/models.py:89 aleksis/core/models.py:948
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:91
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:92
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/core/models.py:103
+#: aleksis/core/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr "Das Startdatum muss vor dem Enddatum liegen."
 
-#: aleksis/core/models.py:110
+#: aleksis/core/models.py:118
 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:139 aleksis/core/models.py:876
+#: aleksis/core/models.py:147 aleksis/core/models.py:897
 msgid "Person"
 msgstr "Person"
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:150
 msgid "Can view address"
 msgstr "Kann Adresse sehen"
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:151
 msgid "Can view contact details"
 msgstr "Kann Kontaktdetails sehen"
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:152
 msgid "Can view photo"
 msgstr "Kann Foto sehen"
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:153
 msgid "Can view persons groups"
 msgstr "Kann Gruppen einer Person sehen"
 
-#: aleksis/core/models.py:146
+#: aleksis/core/models.py:154
 msgid "Can view personal details"
 msgstr "Kann persönliche Daten sehen"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "female"
 msgstr "weiblich"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "male"
 msgstr "männlich"
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:172
 msgid "Linked user"
 msgstr "Verknüpfter Benutzer"
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:174
 msgid "Is person active?"
 msgstr "Ist die Person aktiv?"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:176
 msgid "First name"
 msgstr "Vorname"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:177
 msgid "Last name"
 msgstr "Nachname"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:179
 msgid "Additional name(s)"
 msgstr "Zusätzliche Namen"
 
-#: aleksis/core/models.py:175 aleksis/core/models.py:415
+#: aleksis/core/models.py:183 aleksis/core/models.py:429
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:186
 msgid "Street"
 msgstr "Straße"
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:187
 msgid "Street number"
 msgstr "Hausnummer"
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:188
 msgid "Postal code"
 msgstr "Postleitzahl"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:189
 msgid "Place"
 msgstr "Ort"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:191
 msgid "Home phone"
 msgstr "Festnetz"
 
-#: aleksis/core/models.py:184
+#: aleksis/core/models.py:192
 msgid "Mobile phone"
 msgstr "Handy"
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:196
 msgid "Date of birth"
 msgstr "Geburtsdatum"
 
-#: aleksis/core/models.py:189
+#: aleksis/core/models.py:198
+#, fuzzy
+#| msgid "Date of birth"
+msgid "Place of birth"
+msgstr "Geburtsdatum"
+
+#: aleksis/core/models.py:200
 msgid "Sex"
 msgstr "Geschlecht"
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:202
 msgid "Photo"
 msgstr "Foto"
 
-#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:206 aleksis/core/templates/core/person/full.html:138
 msgid "Guardians / Parents"
 msgstr "Erziehungsberechtigte / Eltern"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:213
 msgid "Primary group"
 msgstr "Primärgruppe"
 
-#: aleksis/core/models.py:205 aleksis/core/models.py:563
-#: aleksis/core/models.py:587 aleksis/core/models.py:672
-#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:216 aleksis/core/models.py:583
+#: aleksis/core/models.py:607 aleksis/core/models.py:692
+#: aleksis/core/models.py:972 aleksis/core/templates/core/person/full.html:121
 msgid "Description"
 msgstr "Beschreibung"
 
-#: aleksis/core/models.py:370
+#: aleksis/core/models.py:384
 msgid "Title of field"
 msgstr "Feldtitel"
 
-#: aleksis/core/models.py:372
+#: aleksis/core/models.py:386
 msgid "Type of field"
 msgstr "Feldtyp"
 
-#: aleksis/core/models.py:379
+#: aleksis/core/models.py:393
 msgid "Addtitional field for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:394
 msgid "Addtitional fields for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:397
-msgid "Group"
-msgstr "Gruppe"
-
-#: aleksis/core/models.py:400
+#: aleksis/core/models.py:414
 msgid "Can assign child groups to groups"
 msgstr "Kann Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/models.py:401
+#: aleksis/core/models.py:415
 msgid "Can view statistics about group."
 msgstr "Kann Statistiken über Gruppen sehen."
 
-#: aleksis/core/models.py:413
+#: aleksis/core/models.py:427
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:437 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr "Mitglieder"
 
-#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:440 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Leiter/-innen"
 
-#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:447 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr "Ãœbergeordnete Gruppen"
 
-#: aleksis/core/models.py:441
+#: aleksis/core/models.py:455
 msgid "Type of group"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:559
-msgid "User"
-msgstr "Benutzer"
-
-#: aleksis/core/models.py:562 aleksis/core/models.py:586
-#: aleksis/core/models.py:671
+#: aleksis/core/models.py:582 aleksis/core/models.py:606
+#: aleksis/core/models.py:691
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/core/models.py:565
+#: aleksis/core/models.py:585
 msgid "Application"
 msgstr "Anwendung"
 
-#: aleksis/core/models.py:571
+#: aleksis/core/models.py:591
 msgid "Activity"
 msgstr "Aktivität"
 
-#: aleksis/core/models.py:572
+#: aleksis/core/models.py:592
 msgid "Activities"
 msgstr "Aktivitäten"
 
-#: aleksis/core/models.py:578
+#: aleksis/core/models.py:598
 msgid "Sender"
 msgstr "Absender"
 
-#: aleksis/core/models.py:583
+#: aleksis/core/models.py:603
 msgid "Recipient"
 msgstr "Empfänger"
 
-#: aleksis/core/models.py:588 aleksis/core/models.py:928
+#: aleksis/core/models.py:608 aleksis/core/models.py:949
 msgid "Link"
 msgstr "Link"
 
-#: aleksis/core/models.py:590
+#: aleksis/core/models.py:610
 msgid "Read"
 msgstr "Gelesen"
 
-#: aleksis/core/models.py:591
+#: aleksis/core/models.py:611
 msgid "Sent"
 msgstr "Versandt"
 
-#: aleksis/core/models.py:604
+#: aleksis/core/models.py:624
 msgid "Notification"
 msgstr "Benachrichtigung"
 
-#: aleksis/core/models.py:673
+#: aleksis/core/models.py:693
 msgid "Link to detailed view"
 msgstr "Link zur detaillierten Ansicht"
 
-#: aleksis/core/models.py:676
+#: aleksis/core/models.py:696
 msgid "Date and time from when to show"
 msgstr "Datum und Uhrzeit des Anzeigestarts"
 
-#: aleksis/core/models.py:679
+#: aleksis/core/models.py:699
 msgid "Date and time until when to show"
 msgstr "Anzeigezeitraum"
 
-#: aleksis/core/models.py:703
+#: aleksis/core/models.py:724
 msgid "Announcement"
 msgstr "Ankündigung"
 
-#: aleksis/core/models.py:741
+#: aleksis/core/models.py:762
 msgid "Announcement recipient"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:742
+#: aleksis/core/models.py:763
 msgid "Announcement recipients"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:818
 msgid "Widget Title"
 msgstr "Widget-Titel"
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:819
 msgid "Activate Widget"
 msgstr "Widget aktivieren"
 
-#: aleksis/core/models.py:799
+#: aleksis/core/models.py:820
 msgid "Widget is broken"
 msgstr "Widget ist kaputt"
 
-#: aleksis/core/models.py:802
+#: aleksis/core/models.py:823
 msgid "Size on mobile devices"
 msgstr "Größe auf Mobilgeräten"
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:824
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 px, 12 Spalten"
 
-#: aleksis/core/models.py:808
+#: aleksis/core/models.py:829
 msgid "Size on tablet devices"
 msgstr "Größe auf Tablets"
 
-#: aleksis/core/models.py:809
+#: aleksis/core/models.py:830
 msgid "> 600 px, 12 columns"
 msgstr "> 600px, 12 Spalten"
 
-#: aleksis/core/models.py:814
+#: aleksis/core/models.py:835
 msgid "Size on desktop devices"
 msgstr "Größe auf Desktopgeräten"
 
-#: aleksis/core/models.py:815
+#: aleksis/core/models.py:836
 msgid "> 992 px, 12 columns"
 msgstr "> 992 px, 12 Spalten"
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:841
 msgid "Size on large desktop devices"
 msgstr "Größe auf großen Desktopgeräten"
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:842
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 px, 12 Spalten"
 
-#: aleksis/core/models.py:852
+#: aleksis/core/models.py:873
 msgid "Can edit default dashboard"
 msgstr "Kann Standarddashboard bearbeiten"
 
-#: aleksis/core/models.py:853
+#: aleksis/core/models.py:874
 msgid "Dashboard Widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:854
+#: aleksis/core/models.py:875
 msgid "Dashboard Widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/models.py:860
+#: aleksis/core/models.py:881
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:882
 msgid "Icon URL"
 msgstr "Symbol-URL"
 
-#: aleksis/core/models.py:867
+#: aleksis/core/models.py:888
 msgid "External link widget"
 msgstr "Externer-Link-Widget"
 
-#: aleksis/core/models.py:868
+#: aleksis/core/models.py:889
 msgid "External link widgets"
 msgstr "Externer-Link-Widgets"
 
-#: aleksis/core/models.py:873
+#: aleksis/core/models.py:894
 msgid "Dashboard widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:899
 msgid "Order"
 msgstr "Reihenfolge"
 
-#: aleksis/core/models.py:879
+#: aleksis/core/models.py:900
 msgid "Part of the default dashboard"
 msgstr "Teil des Standarddashboards"
 
-#: aleksis/core/models.py:894
+#: aleksis/core/models.py:915
 msgid "Dashboard widget order"
 msgstr "Reihenfolge der Dashboard-Widgets"
 
-#: aleksis/core/models.py:895
+#: aleksis/core/models.py:916
 msgid "Dashboard widget orders"
 msgstr "Reihenfolgen der Dashboard-Widgets"
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:922
 msgid "Menu ID"
 msgstr "Menü-ID"
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:935
 msgid "Custom menu"
 msgstr "Benutzerdefiniertes Menü"
 
-#: aleksis/core/models.py:915
+#: aleksis/core/models.py:936
 msgid "Custom menus"
 msgstr "Benutzerdefinierte Menüs"
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:946
 msgid "Menu"
 msgstr "Menü"
 
-#: aleksis/core/models.py:929
+#: aleksis/core/models.py:950
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:956
 msgid "Custom menu item"
 msgstr "Benutzerdefiniertes Menüelement"
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:957
 msgid "Custom menu items"
 msgstr "Benutzerdefinierte Menüelemente"
 
-#: aleksis/core/models.py:950
+#: aleksis/core/models.py:971
 msgid "Title of type"
 msgstr "Titel des Typs"
 
-#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:978 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:971
+#: aleksis/core/models.py:992
 msgid "Can view system status"
 msgstr "Kann Systemstatus sehen"
 
-#: aleksis/core/models.py:972
+#: aleksis/core/models.py:993
 msgid "Can manage data"
 msgstr "Kann Daten verwalten"
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:994
 msgid "Can impersonate"
 msgstr "Kann sich verkleiden"
 
-#: aleksis/core/models.py:974
+#: aleksis/core/models.py:995
 msgid "Can use search"
 msgstr "Kann Suche benutzen"
 
-#: aleksis/core/models.py:975
+#: aleksis/core/models.py:996
 msgid "Can change site preferences"
 msgstr "Kann Konfiguration ändern"
 
-#: aleksis/core/models.py:976
+#: aleksis/core/models.py:997
 msgid "Can change person preferences"
 msgstr "Kann Einstellungen einer Person verändern"
 
-#: aleksis/core/models.py:977
+#: aleksis/core/models.py:998
 msgid "Can change group preferences"
 msgstr "Kann Einstellungen einer Gruppe verändern"
 
-#: aleksis/core/models.py:978
-msgid "Can add oauth applications"
-msgstr "Kann OAuth-Anwendungen hinzufügen"
-
-#: aleksis/core/models.py:979
-msgid "Can list oauth applications"
-msgstr "Can OAuth-Anwendungen auflisten"
-
-#: aleksis/core/models.py:980
-msgid "Can view oauth applications"
-msgstr "Kann OAuth-Anwendungen sehen"
-
-#: aleksis/core/models.py:981
-msgid "Can update oauth applications"
-msgstr "Kann OAuth-Anwendungen aktualisieren"
-
-#: aleksis/core/models.py:982
-msgid "Can delete oauth applications"
-msgstr "Kann OAuth-Anwendungen löschen"
-
-#: aleksis/core/models.py:983
+#: aleksis/core/models.py:999
 msgid "Can test PDF generation"
 msgstr "Kann die PDF-Generierung testen"
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1035
 msgid "Related data check task"
 msgstr "Zugehörige Datenprüfungsaufgabe"
 
-#: aleksis/core/models.py:1027
+#: aleksis/core/models.py:1043
 msgid "Issue solved"
 msgstr "Problem gelöst"
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Notification sent"
 msgstr "Benachrichtigung gesendet"
 
-#: aleksis/core/models.py:1041
+#: aleksis/core/models.py:1057
 msgid "Data check result"
 msgstr "Datenprüfungsergebnis"
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1058
 msgid "Data check results"
 msgstr "Datenprüfungsergebnisse"
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Can run data checks"
 msgstr "Kann Datenprüfungen ausführen"
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1061
 msgid "Can solve data check problems"
 msgstr "Kann Datenprüfungsprobleme lösen"
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "Owner"
 msgstr "Leiter"
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1080
 msgid "File expires at"
 msgstr "Datei abgelaufen am"
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1082
 msgid "Generated HTML file"
 msgstr "Generierte HTML-Datei"
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Generated PDF file"
 msgstr "Generierte PDF-Datei"
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1091
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1092
 msgid "PDF files"
 msgstr "PDF-Dateien"
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task result"
 msgstr "Task-Ergebnis"
 
-#: aleksis/core/models.py:1084
+#: aleksis/core/models.py:1100
 msgid "Task user"
 msgstr "Task-Benutzer"
 
-#: aleksis/core/models.py:1096
+#: aleksis/core/models.py:1112
 msgid "Task user assignment"
 msgstr "Task-Benutzer-Zuordnung"
 
-#: aleksis/core/models.py:1097
+#: aleksis/core/models.py:1113
 msgid "Task user assignments"
 msgstr "Task-Benutzer-Zuordnungen"
 
-#: aleksis/core/preferences.py:22
+#: aleksis/core/models.py:1127
+msgid "Allowed scopes that clients can request"
+msgstr ""
+
+#: aleksis/core/preferences.py:23
 msgid "General"
 msgstr "Allgemein"
 
-#: aleksis/core/preferences.py:23
+#: aleksis/core/preferences.py:24
 msgid "School"
 msgstr "Schule"
 
-#: aleksis/core/preferences.py:24
+#: aleksis/core/preferences.py:25
 msgid "Theme"
 msgstr "Theme"
 
-#: aleksis/core/preferences.py:25
+#: aleksis/core/preferences.py:26
 msgid "Mail"
 msgstr "E-Mail"
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Footer"
 msgstr "Fußbereich"
 
-#: aleksis/core/preferences.py:28
+#: aleksis/core/preferences.py:29
 msgid "Accounts"
 msgstr "Konten"
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Authentication"
 msgstr "Authentifizierung"
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Internationalisation"
 msgstr "Internationalisierung"
 
-#: aleksis/core/preferences.py:41
+#: aleksis/core/preferences.py:42
 msgid "Site title"
 msgstr "Seitentitel"
 
-#: aleksis/core/preferences.py:52
+#: aleksis/core/preferences.py:53
 msgid "Site description"
 msgstr "Seitenbeschreibung"
 
-#: aleksis/core/preferences.py:63
+#: aleksis/core/preferences.py:64
 msgid "Primary colour"
 msgstr "Primärfarbe"
 
-#: aleksis/core/preferences.py:75
+#: aleksis/core/preferences.py:76
 msgid "Secondary colour"
 msgstr "Akzentfarbe"
 
-#: aleksis/core/preferences.py:86
+#: aleksis/core/preferences.py:87
 msgid "Logo"
 msgstr "Logo"
 
-#: aleksis/core/preferences.py:96
+#: aleksis/core/preferences.py:97
 msgid "Favicon"
 msgstr "Favicon"
 
-#: aleksis/core/preferences.py:106
+#: aleksis/core/preferences.py:107
 msgid "PWA-Icon"
 msgstr "PWA-Icon"
 
-#: aleksis/core/preferences.py:117
+#: aleksis/core/preferences.py:118
 msgid "Mail out name"
 msgstr "Ausgangsmailname"
 
-#: aleksis/core/preferences.py:128
+#: aleksis/core/preferences.py:129
 msgid "Mail out address"
 msgstr "E-Mail-Ausgangsadresse"
 
-#: aleksis/core/preferences.py:140
+#: aleksis/core/preferences.py:141
 msgid "Link to privacy policy"
 msgstr "Link zur Datenschutzerklärung"
 
-#: aleksis/core/preferences.py:152
+#: aleksis/core/preferences.py:153
 msgid "Link to imprint"
 msgstr "Link zum Impressum"
 
-#: aleksis/core/preferences.py:164
+#: aleksis/core/preferences.py:165
 msgid "Name format for addressing"
 msgstr "Namensformat für Anreden"
 
-#: aleksis/core/preferences.py:180
+#: aleksis/core/preferences.py:181
 msgid "Channels to use for notifications"
 msgstr "Aktivierte Benachrichtungskanäle"
 
-#: aleksis/core/preferences.py:192
+#: aleksis/core/preferences.py:193
 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:203
+#: aleksis/core/preferences.py:204
 msgid "Field on person to match primary group against"
 msgstr "Feld um Primärgruppen zu finden"
 
-#: aleksis/core/preferences.py:215
+#: aleksis/core/preferences.py:216
 msgid "Automatically create new persons for new users"
 msgstr "Erstelle automatisch neue Personen für neue Benutzer"
 
-#: aleksis/core/preferences.py:224
+#: aleksis/core/preferences.py:225
 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:235
+#: aleksis/core/preferences.py:236
 msgid "Display name of the school"
 msgstr "Sichtbarer Name der Schule"
 
-#: aleksis/core/preferences.py:246
+#: aleksis/core/preferences.py:247
 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:254
+#: aleksis/core/preferences.py:255
 msgid "Allow users to change their passwords"
 msgstr "Erlaube Benutzern, ihr Passwort zu ändern"
 
-#: aleksis/core/preferences.py:262
+#: aleksis/core/preferences.py:263
 msgid "Enable signup"
 msgstr "Registrierung aktivieren"
 
-#: aleksis/core/preferences.py:273
+#: aleksis/core/preferences.py:274
+#, fuzzy
+#| msgid "Can list oauth applications"
+msgid "Allowed Grant Flows for OAuth applications"
+msgstr "Can OAuth-Anwendungen auflisten"
+
+#: aleksis/core/preferences.py:287
 msgid "Available languages"
 msgstr "Verfügbare Sprachen"
 
-#: aleksis/core/preferences.py:285
+#: aleksis/core/preferences.py:299
 msgid "Send emails if data checks detect problems"
 msgstr "E-Mails versenden, wenn Datenprüfungen Probleme finden"
 
-#: aleksis/core/preferences.py:296
+#: aleksis/core/preferences.py:310
 msgid "Email recipients for data checks problem emails"
 msgstr "E-Mailempfänger für Datenprüfungsproblem-E-Mails"
 
-#: aleksis/core/preferences.py:307
+#: aleksis/core/preferences.py:321
 msgid "Email recipient groups for data checks problem emails"
 msgstr "E-Mail-Empfängergruppen für Datenprüfungsproblem-E-Mails"
 
-#: aleksis/core/preferences.py:316
+#: aleksis/core/preferences.py:330
 msgid "Show dashboard to users without login"
 msgstr "Zeige Dashboard für Benutzer ohne Login"
 
-#: aleksis/core/preferences.py:325
+#: aleksis/core/preferences.py:339
 msgid "Allow users to edit their dashboard"
 msgstr "Erlaube Benutzern, ihr Dashboard zu bearbeiten"
 
-#: aleksis/core/preferences.py:336
+#: aleksis/core/preferences.py:350
 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:350
+#: aleksis/core/preferences.py:364
 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:363
+#: aleksis/core/preferences.py:377
 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:373
+#: aleksis/core/preferences.py:387
 msgid "PDF file expiration duration"
 msgstr "PDF-Datei-Ablaufdauer"
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:388
 msgid "in minutes"
 msgstr "in Minuten"
 
-#: aleksis/core/preferences.py:384
+#: aleksis/core/preferences.py:398
 msgid "Automatically update the dashboard and its widgets"
 msgstr "Automatisch das Dashboard und seine Widgets aktualisieren"
 
-#: aleksis/core/preferences.py:394
+#: aleksis/core/preferences.py:408
 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:452
+#: aleksis/core/settings.py:474
 msgid "English"
 msgstr "Englisch"
 
-#: aleksis/core/settings.py:453
+#: aleksis/core/settings.py:475
 msgid "German"
 msgstr "Deutsch"
 
@@ -1092,23 +1130,24 @@ msgstr "Deutsch"
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
 #: aleksis/core/templates/core/person/full.html:23
-#: aleksis/core/templates/oauth2_provider/application_detail.html:17
+#: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr "Bearbeiten"
 
 #: aleksis/core/tables.py:21 aleksis/core/tables.py:89
+#: aleksis/core/tables.py:105
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr "Aktionen"
 
 #: aleksis/core/tables.py:56 aleksis/core/tables.py:57
 #: aleksis/core/tables.py:71 aleksis/core/tables.py:87
+#: aleksis/core/tables.py:103
 #: 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:30
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:20
-#: aleksis/core/templates/oauth2_provider/application_detail.html:21
+#: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr "Löschen"
 
@@ -1485,19 +1524,19 @@ msgstr "Empfänger"
 msgid "There are no announcements."
 msgstr "Es gibt aktuell keine Ankündigungen."
 
-#: aleksis/core/templates/core/base.html:60
+#: aleksis/core/templates/core/base.html:78
 msgid "Logged in as"
 msgstr "Angemeldet als"
 
-#: aleksis/core/templates/core/base.html:154
+#: aleksis/core/templates/core/base.html:175
 msgid "About AlekSIS — The Free School Information System"
 msgstr "Über AlekSIS — The Free School Information System"
 
-#: aleksis/core/templates/core/base.html:162
+#: aleksis/core/templates/core/base.html:183
 msgid "Impress"
 msgstr "Impressum"
 
-#: aleksis/core/templates/core/base.html:170
+#: aleksis/core/templates/core/base.html:191
 msgid "Privacy Policy"
 msgstr "Datenschutzerklärung"
 
@@ -1719,7 +1758,7 @@ msgstr ""
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
-#: aleksis/core/templates/oauth2_provider/application_detail.html:9
+#: aleksis/core/templates/oauth2_provider/application/detail.html:9
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
@@ -2129,6 +2168,59 @@ msgstr ""
 "        die Verwaltenden von AlekSIS an Ihrer Schule.\n"
 "          "
 
+#: aleksis/core/templates/core/perms/assign.html:12
+#: aleksis/core/templates/core/perms/assign.html:13
+msgid "Assign permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:17
+#, fuzzy
+#| msgid "Selected persons"
+msgid "Selected permission"
+msgstr "Ausgewählte Personen"
+
+#: aleksis/core/templates/core/perms/assign.html:26
+msgid "Assign"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:21
+msgid "Assign a new permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:25
+msgid "Select"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:34
+#, fuzzy
+#| msgid "Global Search"
+msgid "Global (user)"
+msgstr "Globale Suche"
+
+#: aleksis/core/templates/core/perms/list.html:38
+msgid "Global (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:42
+msgid "Object (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:46
+#, fuzzy
+#| msgid "Selected groups"
+msgid "Object (group)"
+msgstr "Ausgewählte Gruppen"
+
+#: aleksis/core/templates/core/perms/list.html:52
+#, fuzzy
+#| msgid "Filter persons"
+msgid "Filter permissions"
+msgstr "Personen filtern"
+
+#: aleksis/core/templates/core/perms/list.html:58
+msgid "Update"
+msgstr "Aktualisieren"
+
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
@@ -2150,7 +2242,7 @@ msgstr "Verkleiden"
 msgid "Contact details"
 msgstr "Kontaktdetails"
 
-#: aleksis/core/templates/core/person/full.html:130
+#: aleksis/core/templates/core/person/full.html:131
 msgid "Children"
 msgstr "Kinder"
 
@@ -2190,60 +2282,66 @@ msgstr "Einstellungen für %(instance)s"
 msgid "Save preferences"
 msgstr "Einstellungen speichern"
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
-msgid "Delete application"
-msgstr "Anwendung löschen"
-
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:12
-#, python-format
-msgid "Are you sure to delete the application %(application_name)s?"
-msgstr "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen möchten?"
+#: aleksis/core/templates/oauth2_provider/application/create.html:5
+#: aleksis/core/templates/oauth2_provider/application/create.html:6
+#, fuzzy
+#| msgid "Create OAuth2 Application"
+msgid "Register OAuth2 Application"
+msgstr "OAuth2-Anwendung erstellen"
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:24
-#: aleksis/core/templates/oauth2_provider/application_form.html:18
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:5
+#, fuzzy
+#| msgid "OAuth2 Applications"
+msgid "OAuth2 Application"
+msgstr "OAuth2-Anwendungen"
+
+#: aleksis/core/templates/oauth2_provider/application/detail.html:27
 msgid "Client id"
 msgstr "Client-ID"
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:35
 msgid "Client secret"
 msgstr "Client-Secret"
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:43
 msgid "Client type"
 msgstr "Client-Typ"
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:51
-msgid "Authorization Grant Type"
-msgstr "Authorization Grant-Typ"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+msgid "Allowed scopes"
+msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:59
 msgid "Redirect URIs"
 msgstr "Weiterleitungs-URLs"
 
-#: aleksis/core/templates/oauth2_provider/application_form.html:5
-msgid "Create OAuth2 Application"
-msgstr "OAuth2-Anwendung erstellen"
-
-#: aleksis/core/templates/oauth2_provider/application_form.html:10
-msgid "Edit application"
-msgstr "Anwendung bearbeiten"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+#, fuzzy
+#| msgid "Authentication"
+msgid "Skip Authorisation"
+msgstr "Authentifizierung"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:8
-msgid "OAuth2 applications"
+#: aleksis/core/templates/oauth2_provider/application/edit.html:5
+#: aleksis/core/templates/oauth2_provider/application/edit.html:6
+#, fuzzy
+#| msgid "OAuth2 Applications"
+msgid "Edit OAuth2 Application"
 msgstr "OAuth2-Anwendungen"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:12
-msgid "Register new applications"
+#: aleksis/core/templates/oauth2_provider/application/list.html:11
+#, fuzzy
+#| msgid "Register new applications"
+msgid "Register new application"
 msgstr "Neue Anwendungen registrieren"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:23
+#: aleksis/core/templates/oauth2_provider/application/list.html:20
 msgid "No applications defined."
 msgstr "Keine Anwendungen definiert."
 
@@ -2657,10 +2755,8 @@ msgid ""
 "                    "
 msgstr ""
 "\n"
-"                      Nutzen Sie dieses Formular um Ihre Backup-Tokens zum "
-"Anmelden einzugeben.\n"
-"                Diese Tokens wurden für Sie generiert, um diese gut "
-"aufzubewahren. Bitte\n"
+"                      Nutzen Sie dieses Formular um Ihre Backup-Tokens zum Anmelden einzugeben.\n"
+"                Diese Tokens wurden für Sie generiert, um diese gut aufzubewahren. Bitte\n"
 "                geben Sie einen dieser Tokens ein, um sich einzuloggen.\n"
 "                    "
 
@@ -2810,8 +2906,7 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Wir haben Ihnen eine SMS geschickt, bitte geben Sie die Tokens "
-"ein, die wir geschickt haben.\n"
+"            Wir haben Ihnen eine SMS geschickt, bitte geben Sie die Tokens ein, die wir geschickt haben.\n"
 "          "
 
 #: aleksis/core/templates/two_factor/core/setup.html:63
@@ -3022,111 +3117,167 @@ msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten."
 msgid "Download PDF"
 msgstr "PDF herunterladen"
 
-#: aleksis/core/views.py:251
+#: aleksis/core/views.py:270
 msgid "The school term has been created."
 msgstr "Das Schuljahr wurde erstellt."
 
-#: aleksis/core/views.py:263
+#: aleksis/core/views.py:282
 msgid "The school term has been saved."
 msgstr "Das Schuljahr wurde gespeichert."
 
-#: aleksis/core/views.py:387
+#: aleksis/core/views.py:406
 msgid "The child groups were successfully saved."
 msgstr "Die Untergruppen wurden gespeichert."
 
-#: aleksis/core/views.py:406 aleksis/core/views.py:416
+#: aleksis/core/views.py:425 aleksis/core/views.py:435
 msgid "The person has been saved."
 msgstr "Die Person wurde gespeichert."
 
-#: aleksis/core/views.py:466
+#: aleksis/core/views.py:485
 msgid "The group has been saved."
 msgstr "Die Gruppe wurde gespeichert."
 
-#: aleksis/core/views.py:563
+#: aleksis/core/views.py:582
 msgid "The announcement has been saved."
 msgstr "Die Ankündigung wurde gespeichert."
 
-#: aleksis/core/views.py:579
+#: aleksis/core/views.py:598
 msgid "The announcement has been deleted."
 msgstr "Ankündigung wurde gelöscht."
 
-#: aleksis/core/views.py:663
+#: aleksis/core/views.py:682
 msgid "The preferences have been saved successfully."
 msgstr "Die Einstellungen wurde gespeichert."
 
-#: aleksis/core/views.py:687
+#: aleksis/core/views.py:706
 msgid "The person has been deleted."
 msgstr "Die Person wurde gelöscht."
 
-#: aleksis/core/views.py:701
+#: aleksis/core/views.py:720
 msgid "The group has been deleted."
 msgstr "Die Gruppe wurde gelöscht."
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:752
 msgid "The additional_field has been saved."
 msgstr "Das zusätzliche Feld wurde gespeichert."
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:786
 msgid "The additional field has been deleted."
 msgstr "Das zusätzliche Feld wurde gelöscht."
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:811
 msgid "The group type has been saved."
 msgstr "Der Gruppentyp wurde gespeichert."
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:841
 msgid "The group type has been deleted."
 msgstr "Der Gruppentyp wurde gelöscht."
 
-#: aleksis/core/views.py:855
+#: aleksis/core/views.py:874
 msgid "Progress: Run data checks"
 msgstr "Fortschritt: Datenprüfungen ausführen"
 
-#: aleksis/core/views.py:856
+#: aleksis/core/views.py:875
 msgid "Run data checks …"
 msgstr "Datenprüfungen laufen …"
 
-#: aleksis/core/views.py:857
+#: aleksis/core/views.py:876
 msgid "The data checks were run successfully."
 msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt."
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:877
 msgid "There was a problem while running data checks."
 msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen."
 
-#: aleksis/core/views.py:874
+#: aleksis/core/views.py:893
 #, 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:916
+#: aleksis/core/views.py:935
 msgid "The dashboard widget has been saved."
 msgstr "Das Dashboard-Widget wurde gespeichert."
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:965
 msgid "The dashboard widget has been created."
 msgstr "Das Dashboard-Widget wurde erstellt."
 
-#: aleksis/core/views.py:956
+#: aleksis/core/views.py:975
 msgid "The dashboard widget has been deleted."
 msgstr "Das Dashboard-Widget wurde gelöscht."
 
-#: aleksis/core/views.py:1023
+#: aleksis/core/views.py:1042
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1025
+#: aleksis/core/views.py:1044
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1153
+#: aleksis/core/views.py:1139
+msgid "We have successfully assigned the permissions."
+msgstr ""
+
+#: aleksis/core/views.py:1149
+#, fuzzy
+#| msgid "The person has been deleted."
+msgid "The global user permission has been deleted."
+msgstr "Die Person wurde gelöscht."
+
+#: aleksis/core/views.py:1159
+#, fuzzy
+#| msgid "The group type has been deleted."
+msgid "The global group permission has been deleted."
+msgstr "Der Gruppentyp wurde gelöscht."
+
+#: aleksis/core/views.py:1169
+#, fuzzy
+#| msgid "The person has been deleted."
+msgid "The object user permission has been deleted."
+msgstr "Die Person wurde gelöscht."
+
+#: aleksis/core/views.py:1179
+#, fuzzy
+#| msgid "The group type has been deleted."
+msgid "The object group permission has been deleted."
+msgstr "Der Gruppentyp wurde gelöscht."
+
+#: aleksis/core/views.py:1298
 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:1160
+#: aleksis/core/views.py:1305
 msgid "The third-party account has been successfully disconnected."
 msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 
+#~ msgid "Can add oauth applications"
+#~ msgstr "Kann OAuth-Anwendungen hinzufügen"
+
+#~ msgid "Can view oauth applications"
+#~ msgstr "Kann OAuth-Anwendungen sehen"
+
+#~ msgid "Can update oauth applications"
+#~ msgstr "Kann OAuth-Anwendungen aktualisieren"
+
+#~ msgid "Can delete oauth applications"
+#~ msgstr "Kann OAuth-Anwendungen löschen"
+
+#~ msgid "Delete application"
+#~ msgstr "Anwendung löschen"
+
+#, python-format
+#~ msgid "Are you sure to delete the application %(application_name)s?"
+#~ msgstr "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen möchten?"
+
+#~ msgid "Authorization Grant Type"
+#~ msgstr "Authorization Grant-Typ"
+
+#~ msgid "Edit application"
+#~ msgstr "Anwendung bearbeiten"
+
+#~ msgid "OAuth2 applications"
+#~ msgstr "OAuth2-Anwendungen"
+
 #~ msgid "Persons and accounts"
 #~ msgstr "Personen und Konten"
 
@@ -3154,9 +3305,6 @@ msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 #~ "    eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n"
 #~ "      "
 
-#~ msgid "Update"
-#~ msgstr "Aktualisieren"
-
 #~ msgid "Existing account"
 #~ msgstr "Existierendes Konto"
 
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
index 6bbb636d795adbbe19acdf95ed873b27814d9284..f104a1ea290e906c7f0e1d5d37aca398a16241e9 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
@@ -7,11 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-08-28 17:53+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core-js/de/>\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -33,6 +32,4 @@ msgstr "OK"
 
 #: aleksis/core/static/js/main.js:127
 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."
+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 3c118dd9a39119c4615e68b5f729d60de3726bff..785f1ea6d42cdd2a00b6718d02a6ea578fe547fe 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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,25 +18,25 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.4\n"
 
-#: aleksis/core/apps.py:150
+#: aleksis/core/apps.py:151
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:151
+#: aleksis/core/apps.py:152
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:153
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:154
 #, fuzzy
 #| msgid "Contact details"
 msgid "Email address"
 msgstr "Détails de contact"
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:155
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -61,8 +61,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
-#: aleksis/core/templates/core/base.html:84
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
+#: aleksis/core/templates/core/base.html:105
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -70,64 +70,80 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:53
+#: aleksis/core/filters.py:58
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:65
+#: aleksis/core/filters.py:70
 #, fuzzy
 #| msgid "Contact details"
 msgid "Search by contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
+#: aleksis/core/filters.py:91
+msgid "Permission"
+msgstr ""
+
+#: aleksis/core/filters.py:99
+msgid "Content type"
+msgstr ""
+
+#: aleksis/core/filters.py:112 aleksis/core/models.py:579
+msgid "User"
+msgstr ""
+
+#: aleksis/core/filters.py:134 aleksis/core/models.py:411
+msgid "Group"
+msgstr "groupe"
+
+#: aleksis/core/forms.py:46 aleksis/core/forms.py:514
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:47
+#: aleksis/core/forms.py:52
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:48
+#: aleksis/core/forms.py:53
 #, fuzzy
 #| msgid "Contact details"
 msgid "Contact data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:50
+#: aleksis/core/forms.py:55
 #, fuzzy
 #| msgid "Contact details"
 msgid "Advanced personal data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:124
+#: aleksis/core/forms.py:134
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:128
+#: aleksis/core/forms.py:138
 msgid "This username is already in use."
 msgstr "Cet nom est deja en utilisation."
 
-#: aleksis/core/forms.py:145 aleksis/core/models.py:117
+#: aleksis/core/forms.py:155 aleksis/core/models.py:125
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:146
+#: aleksis/core/forms.py:156
 #, fuzzy
 #| msgid "Contact details"
 msgid "Common data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
-#: aleksis/core/menus.py:238 aleksis/core/models.py:140
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:208
+#: aleksis/core/menus.py:256 aleksis/core/models.py:148
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 #, fuzzy
@@ -135,83 +151,107 @@ msgstr "Détails de contact"
 msgid "Persons"
 msgstr "Personne"
 
-#: aleksis/core/forms.py:148
+#: aleksis/core/forms.py:158
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
-#: aleksis/core/models.py:60
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:68
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
-#: aleksis/core/models.py:68
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:76
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
-#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:221 aleksis/core/menus.py:267
+#: aleksis/core/models.py:412 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:144
+#: aleksis/core/templates/core/person/full.html:145
 #, fuzzy
 #| msgid "Group"
 msgid "Groups"
 msgstr "Groupe"
 
-#: aleksis/core/forms.py:219
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:222
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:223
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:262
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:266
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:275
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:389
+#: aleksis/core/forms.py:411
+msgid "Who should get the permission?"
+msgstr ""
+
+#: aleksis/core/forms.py:412
+msgid "On what?"
+msgstr ""
+
+#: aleksis/core/forms.py:438
+msgid "Select objects which the permission should be granted for:"
+msgstr ""
+
+#: aleksis/core/forms.py:441
+msgid "Grant the permission for all objects"
+msgstr ""
+
+#: aleksis/core/forms.py:449
+msgid "You must select at least one group or person which should get the permission."
+msgstr ""
+
+#: aleksis/core/forms.py:454
+msgid "You must grant the permission to all objects and/or to some objects."
+msgstr ""
+
+#: aleksis/core/forms.py:518
 #, fuzzy
 #| msgid "Contact details"
 msgid "Account data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:391
+#: aleksis/core/forms.py:524
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:531
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:402
+#: aleksis/core/forms.py:537
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:411
+#: aleksis/core/forms.py:550
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:435
+#: aleksis/core/forms.py:575
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:580
+#: aleksis/core/forms.py:720
 msgid "No valid selection."
 msgstr ""
 
@@ -256,30 +296,30 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:605
-#: aleksis/core/preferences.py:26
+#: aleksis/core/menus.py:32 aleksis/core/models.py:625
+#: aleksis/core/preferences.py:27
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/menus.py:41
+#: aleksis/core/menus.py:44
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:48
+#: aleksis/core/menus.py:51
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
+#: aleksis/core/menus.py:60 aleksis/core/templates/core/base.html:80
 msgid "Logout"
 msgstr ""
 
-#: aleksis/core/menus.py:63
+#: aleksis/core/menus.py:66
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:69
+#: aleksis/core/menus.py:74
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -291,87 +331,92 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:81
+#: aleksis/core/menus.py:86
 msgid "Me"
 msgstr ""
 
-#: aleksis/core/menus.py:90
+#: aleksis/core/menus.py:95
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:99
+#: aleksis/core/menus.py:104
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:108
+#: aleksis/core/menus.py:113
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:119
+#: aleksis/core/menus.py:124
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:704
+#: aleksis/core/menus.py:132 aleksis/core/models.py:725
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:118
+#: aleksis/core/menus.py:143 aleksis/core/models.py:126
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:149
+#: aleksis/core/menus.py:154
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:160
+#: aleksis/core/menus.py:165
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:171
+#: aleksis/core/menus.py:176
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:182
+#: aleksis/core/menus.py:187
 msgid "Impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:193
+#: aleksis/core/menus.py:198
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:209 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:210
+#: aleksis/core/menus.py:215 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/templates/core/perms/list.html:14
+msgid "Manage permissions"
+msgstr ""
+
+#: aleksis/core/menus.py:226
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:216
-#: aleksis/core/templates/oauth2_provider/application_detail.html:5
-#: aleksis/core/templates/oauth2_provider/application_list.html:5
+#: aleksis/core/menus.py:234
+#: aleksis/core/templates/oauth2_provider/application/list.html:5
+#: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:247
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:958
+#: aleksis/core/menus.py:278 aleksis/core/models.py:979
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -379,765 +424,751 @@ msgstr ""
 msgid "Group types"
 msgstr "Groupe"
 
-#: aleksis/core/menus.py:271
+#: aleksis/core/menus.py:289
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:282 aleksis/core/models.py:446
+#: aleksis/core/menus.py:300 aleksis/core/models.py:460
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:297
+#: aleksis/core/menus.py:315
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:498
+#: aleksis/core/mixins.py:508
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:66
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:59
+#: aleksis/core/models.py:67
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:69
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:62
+#: aleksis/core/models.py:70
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:63 aleksis/core/models.py:186
+#: aleksis/core/models.py:71 aleksis/core/models.py:194
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:72
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:73
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:74
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:67
+#: aleksis/core/models.py:75
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:69
+#: aleksis/core/models.py:77
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:81 aleksis/core/models.py:927
+#: aleksis/core/models.py:89 aleksis/core/models.py:948
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:91
 #, fuzzy
 #| msgid "Contact details"
 msgid "Start date"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:92
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:103
+#: aleksis/core/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:110
+#: aleksis/core/models.py:118
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:139 aleksis/core/models.py:876
+#: aleksis/core/models.py:147 aleksis/core/models.py:897
 msgid "Person"
 msgstr "Personne"
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:150
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:151
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:152
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view photo"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:153
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view persons groups"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:146
+#: aleksis/core/models.py:154
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view personal details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:172
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:174
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:176
 msgid "First name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:177
 msgid "Last name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:179
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:175 aleksis/core/models.py:415
+#: aleksis/core/models.py:183 aleksis/core/models.py:429
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:186
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:187
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:188
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:189
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:191
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:184
+#: aleksis/core/models.py:192
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:196
 msgid "Date of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:189
+#: aleksis/core/models.py:198
+#, fuzzy
+#| msgid "Date of birth"
+msgid "Place of birth"
+msgstr "Date d'anniversaire"
+
+#: aleksis/core/models.py:200
 msgid "Sex"
 msgstr "Sexe"
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:202
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:206 aleksis/core/templates/core/person/full.html:138
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:213
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:205 aleksis/core/models.py:563
-#: aleksis/core/models.py:587 aleksis/core/models.py:672
-#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:216 aleksis/core/models.py:583
+#: aleksis/core/models.py:607 aleksis/core/models.py:692
+#: aleksis/core/models.py:972 aleksis/core/templates/core/person/full.html:121
 msgid "Description"
 msgstr "Description"
 
-#: aleksis/core/models.py:370
+#: aleksis/core/models.py:384
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:372
+#: aleksis/core/models.py:386
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:379
+#: aleksis/core/models.py:393
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:394
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:397
-msgid "Group"
-msgstr "groupe"
-
-#: aleksis/core/models.py:400
+#: aleksis/core/models.py:414
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:401
+#: aleksis/core/models.py:415
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view statistics about group."
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:413
+#: aleksis/core/models.py:427
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:437 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:440 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:447 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:441
+#: aleksis/core/models.py:455
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:559
-msgid "User"
-msgstr ""
-
-#: aleksis/core/models.py:562 aleksis/core/models.py:586
-#: aleksis/core/models.py:671
+#: aleksis/core/models.py:582 aleksis/core/models.py:606
+#: aleksis/core/models.py:691
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:565
+#: aleksis/core/models.py:585
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:571
+#: aleksis/core/models.py:591
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:572
+#: aleksis/core/models.py:592
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:578
+#: aleksis/core/models.py:598
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:583
+#: aleksis/core/models.py:603
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:588 aleksis/core/models.py:928
+#: aleksis/core/models.py:608 aleksis/core/models.py:949
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:590
+#: aleksis/core/models.py:610
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:591
+#: aleksis/core/models.py:611
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:604
+#: aleksis/core/models.py:624
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:673
+#: aleksis/core/models.py:693
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:676
+#: aleksis/core/models.py:696
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:679
+#: aleksis/core/models.py:699
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:703
+#: aleksis/core/models.py:724
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:741
+#: aleksis/core/models.py:762
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742
+#: aleksis/core/models.py:763
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:818
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:819
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:799
+#: aleksis/core/models.py:820
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:802
+#: aleksis/core/models.py:823
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:824
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:808
+#: aleksis/core/models.py:829
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:809
+#: aleksis/core/models.py:830
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:814
+#: aleksis/core/models.py:835
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:815
+#: aleksis/core/models.py:836
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:841
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:842
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:852
+#: aleksis/core/models.py:873
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:853
+#: aleksis/core/models.py:874
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:854
+#: aleksis/core/models.py:875
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:860
+#: aleksis/core/models.py:881
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:882
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:867
+#: aleksis/core/models.py:888
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:868
+#: aleksis/core/models.py:889
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:873
+#: aleksis/core/models.py:894
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:899
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:879
+#: aleksis/core/models.py:900
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:894
+#: aleksis/core/models.py:915
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:895
+#: aleksis/core/models.py:916
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:922
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:935
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:915
+#: aleksis/core/models.py:936
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:946
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:929
+#: aleksis/core/models.py:950
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:956
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:957
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:950
+#: aleksis/core/models.py:971
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:978 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Groupe"
 
-#: aleksis/core/models.py:971
+#: aleksis/core/models.py:992
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view system status"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:972
+#: aleksis/core/models.py:993
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:994
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can impersonate"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:974
+#: aleksis/core/models.py:995
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:975
+#: aleksis/core/models.py:996
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:976
+#: aleksis/core/models.py:997
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:977
+#: aleksis/core/models.py:998
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:978
-msgid "Can add oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:979
-msgid "Can list oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:980
-#, fuzzy
-#| msgid "Contact details"
-msgid "Can view oauth applications"
-msgstr "Détails de contact"
-
-#: aleksis/core/models.py:981
-msgid "Can update oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:982
-msgid "Can delete oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:983
+#: aleksis/core/models.py:999
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1035
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1027
+#: aleksis/core/models.py:1043
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1041
+#: aleksis/core/models.py:1057
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1058
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1061
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 #, fuzzy
 #| msgid "Owners"
 msgid "Owner"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1080
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1082
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1091
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1092
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1084
+#: aleksis/core/models.py:1100
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1096
+#: aleksis/core/models.py:1112
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1097
+#: aleksis/core/models.py:1113
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/preferences.py:22
-msgid "General"
+#: aleksis/core/models.py:1127
+msgid "Allowed scopes that clients can request"
 msgstr ""
 
 #: aleksis/core/preferences.py:23
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:24
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:25
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:26
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:28
+#: aleksis/core/preferences.py:29
 #, fuzzy
 #| msgid "Contact details"
 msgid "Accounts"
 msgstr "Détails de contact"
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:41
+#: aleksis/core/preferences.py:42
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:52
+#: aleksis/core/preferences.py:53
 #, fuzzy
 #| msgid "Description"
 msgid "Site description"
 msgstr "Description"
 
-#: aleksis/core/preferences.py:63
+#: aleksis/core/preferences.py:64
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:75
+#: aleksis/core/preferences.py:76
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:86
+#: aleksis/core/preferences.py:87
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:96
+#: aleksis/core/preferences.py:97
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:106
+#: aleksis/core/preferences.py:107
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:117
+#: aleksis/core/preferences.py:118
 #, fuzzy
 #| msgid "Last name"
 msgid "Mail out name"
 msgstr "Nom de famille"
 
-#: aleksis/core/preferences.py:128
+#: aleksis/core/preferences.py:129
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:140
+#: aleksis/core/preferences.py:141
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:152
+#: aleksis/core/preferences.py:153
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:164
+#: aleksis/core/preferences.py:165
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:180
+#: aleksis/core/preferences.py:181
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:192
+#: aleksis/core/preferences.py:193
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:203
+#: aleksis/core/preferences.py:204
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:215
+#: aleksis/core/preferences.py:216
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:224
+#: aleksis/core/preferences.py:225
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:235
+#: aleksis/core/preferences.py:236
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:246
+#: aleksis/core/preferences.py:247
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:254
+#: aleksis/core/preferences.py:255
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:262
+#: aleksis/core/preferences.py:263
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:273
+#: aleksis/core/preferences.py:274
+#, fuzzy
+#| msgid "Contact details"
+msgid "Allowed Grant Flows for OAuth applications"
+msgstr "Détails de contact"
+
+#: aleksis/core/preferences.py:287
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:285
+#: aleksis/core/preferences.py:299
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:296
+#: aleksis/core/preferences.py:310
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:307
+#: aleksis/core/preferences.py:321
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:316
+#: aleksis/core/preferences.py:330
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:325
+#: aleksis/core/preferences.py:339
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:336
+#: aleksis/core/preferences.py:350
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:364
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:377
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:373
+#: aleksis/core/preferences.py:387
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:388
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:384
+#: aleksis/core/preferences.py:398
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:394
+#: aleksis/core/preferences.py:408
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:452
+#: aleksis/core/settings.py:474
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:453
+#: aleksis/core/settings.py:475
 msgid "German"
 msgstr ""
 
@@ -1145,23 +1176,24 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
 #: aleksis/core/templates/core/person/full.html:23
-#: aleksis/core/templates/oauth2_provider/application_detail.html:17
+#: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:21 aleksis/core/tables.py:89
+#: aleksis/core/tables.py:105
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:56 aleksis/core/tables.py:57
 #: aleksis/core/tables.py:71 aleksis/core/tables.py:87
+#: aleksis/core/tables.py:103
 #: 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:30
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:20
-#: aleksis/core/templates/oauth2_provider/application_detail.html:21
+#: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
@@ -1478,19 +1510,19 @@ msgstr ""
 msgid "There are no announcements."
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:60
+#: aleksis/core/templates/core/base.html:78
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:154
+#: aleksis/core/templates/core/base.html:175
 msgid "About AlekSIS — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:162
+#: aleksis/core/templates/core/base.html:183
 msgid "Impress"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:170
+#: aleksis/core/templates/core/base.html:191
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1687,7 +1719,7 @@ msgstr ""
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
-#: aleksis/core/templates/oauth2_provider/application_detail.html:9
+#: aleksis/core/templates/oauth2_provider/application/detail.html:9
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
@@ -2050,6 +2082,53 @@ msgid ""
 "          "
 msgstr ""
 
+#: aleksis/core/templates/core/perms/assign.html:12
+#: aleksis/core/templates/core/perms/assign.html:13
+msgid "Assign permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:17
+#, fuzzy
+#| msgid "Contact details"
+msgid "Selected permission"
+msgstr "Détails de contact"
+
+#: aleksis/core/templates/core/perms/assign.html:26
+msgid "Assign"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:21
+msgid "Assign a new permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:25
+msgid "Select"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:34
+msgid "Global (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:38
+msgid "Global (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:42
+msgid "Object (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:46
+msgid "Object (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:52
+msgid "Filter permissions"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:58
+msgid "Update"
+msgstr ""
+
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
@@ -2075,7 +2154,7 @@ msgstr "Détails de contact"
 msgid "Contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/templates/core/person/full.html:130
+#: aleksis/core/templates/core/person/full.html:131
 msgid "Children"
 msgstr ""
 
@@ -2115,60 +2194,62 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
-msgid "Delete application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:12
-#, python-format
-msgid "Are you sure to delete the application %(application_name)s?"
-msgstr ""
+#: aleksis/core/templates/oauth2_provider/application/create.html:5
+#: aleksis/core/templates/oauth2_provider/application/create.html:6
+#, fuzzy
+#| msgid "Contact details"
+msgid "Register OAuth2 Application"
+msgstr "Détails de contact"
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:24
-#: aleksis/core/templates/oauth2_provider/application_form.html:18
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:5
+#, fuzzy
+#| msgid "Contact details"
+msgid "OAuth2 Application"
+msgstr "Détails de contact"
+
+#: aleksis/core/templates/oauth2_provider/application/detail.html:27
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:35
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:43
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:51
-msgid "Authorization Grant Type"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:59
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_form.html:5
-msgid "Create OAuth2 Application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_form.html:10
-msgid "Edit application"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+msgid "Skip Authorisation"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:8
-msgid "OAuth2 applications"
-msgstr ""
+#: aleksis/core/templates/oauth2_provider/application/edit.html:5
+#: aleksis/core/templates/oauth2_provider/application/edit.html:6
+#, fuzzy
+#| msgid "Contact details"
+msgid "Edit OAuth2 Application"
+msgstr "Détails de contact"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:12
-msgid "Register new applications"
+#: aleksis/core/templates/oauth2_provider/application/list.html:11
+msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:23
+#: aleksis/core/templates/oauth2_provider/application/list.html:20
 msgid "No applications defined."
 msgstr ""
 
@@ -2799,108 +2880,128 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:251
+#: aleksis/core/views.py:270
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:263
+#: aleksis/core/views.py:282
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:387
+#: aleksis/core/views.py:406
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:406 aleksis/core/views.py:416
+#: aleksis/core/views.py:425 aleksis/core/views.py:435
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:466
+#: aleksis/core/views.py:485
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:563
+#: aleksis/core/views.py:582
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:579
+#: aleksis/core/views.py:598
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:663
+#: aleksis/core/views.py:682
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:687
+#: aleksis/core/views.py:706
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:701
+#: aleksis/core/views.py:720
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:752
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:786
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:811
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:841
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:855
+#: aleksis/core/views.py:874
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:856
+#: aleksis/core/views.py:875
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:857
+#: aleksis/core/views.py:876
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:877
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:874
+#: aleksis/core/views.py:893
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:916
+#: aleksis/core/views.py:935
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:965
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:956
+#: aleksis/core/views.py:975
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1023
+#: aleksis/core/views.py:1042
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1025
+#: aleksis/core/views.py:1044
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1153
+#: aleksis/core/views.py:1139
+msgid "We have successfully assigned the permissions."
+msgstr ""
+
+#: aleksis/core/views.py:1149
+msgid "The global user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1159
+msgid "The global group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1169
+msgid "The object user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1179
+msgid "The object group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1298
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1160
+#: aleksis/core/views.py:1305
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
index bbd51395a6ee28d076da3de7bd4d65b198574194..d92f36a6a9ed2888791de39ed7c9db3bdfe7f8dc 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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"
diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po
index c34a5cc0811a09a7a1b1bf4430463e56cff5be3f..0f4d9b00d9560e0140e6242ec635d51b278c1271 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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,27 +18,27 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.3.2\n"
 
-#: aleksis/core/apps.py:150
+#: aleksis/core/apps.py:151
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:151
+#: aleksis/core/apps.py:152
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:153
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Full home postal address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:154
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Email address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:155
 #, fuzzy
 #| msgid "Mobile phone"
 msgid "Home and mobile phone"
@@ -67,8 +67,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
-#: aleksis/core/templates/core/base.html:84
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
+#: aleksis/core/templates/core/base.html:105
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -76,144 +76,186 @@ msgstr ""
 msgid "Search"
 msgstr "Quaerere"
 
-#: aleksis/core/filters.py:53
+#: aleksis/core/filters.py:58
 msgid "Search by name"
 msgstr "Quaerere cum breve nomine"
 
-#: aleksis/core/filters.py:65
+#: aleksis/core/filters.py:70
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Search by contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
+#: aleksis/core/filters.py:91
+msgid "Permission"
+msgstr ""
+
+#: aleksis/core/filters.py:99
+msgid "Content type"
+msgstr ""
+
+#: aleksis/core/filters.py:112 aleksis/core/models.py:579
+msgid "User"
+msgstr ""
+
+#: aleksis/core/filters.py:134 aleksis/core/models.py:411
+msgid "Group"
+msgstr "Grex"
+
+#: aleksis/core/forms.py:46 aleksis/core/forms.py:514
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:47
+#: aleksis/core/forms.py:52
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/forms.py:48
+#: aleksis/core/forms.py:53
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:50
+#: aleksis/core/forms.py:55
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Create a new account"
 msgstr "Personae et computi"
 
-#: aleksis/core/forms.py:124
+#: aleksis/core/forms.py:134
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:128
+#: aleksis/core/forms.py:138
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:145 aleksis/core/models.py:117
+#: aleksis/core/forms.py:155 aleksis/core/models.py:125
 msgid "School term"
 msgstr "Anus scolae"
 
-#: aleksis/core/forms.py:146
+#: aleksis/core/forms.py:156
 #, fuzzy
 #| msgid "Data management"
 msgid "Common data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
-#: aleksis/core/menus.py:238 aleksis/core/models.py:140
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:208
+#: aleksis/core/menus.py:256 aleksis/core/models.py:148
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr "personae"
 
-#: aleksis/core/forms.py:148
+#: aleksis/core/forms.py:158
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional data"
 msgstr "addita nomines"
 
-#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
-#: aleksis/core/models.py:60
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:68
 msgid "Date"
 msgstr "dies"
 
-#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
-#: aleksis/core/models.py:68
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:76
 msgid "Time"
 msgstr "tempus"
 
-#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
-#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:221 aleksis/core/menus.py:267
+#: aleksis/core/models.py:412 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:144
+#: aleksis/core/templates/core/person/full.html:145
 msgid "Groups"
 msgstr "Greges"
 
-#: aleksis/core/forms.py:219
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:222
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr "Quis nuntium videatne?"
 
-#: aleksis/core/forms.py:223
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr "Scribe nuntium:"
 
-#: aleksis/core/forms.py:262
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:266
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:275
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:389
+#: aleksis/core/forms.py:411
+#, fuzzy
+#| msgid "Who should see the announcement?"
+msgid "Who should get the permission?"
+msgstr "Quis nuntium videatne?"
+
+#: aleksis/core/forms.py:412
+msgid "On what?"
+msgstr ""
+
+#: aleksis/core/forms.py:438
+msgid "Select objects which the permission should be granted for:"
+msgstr ""
+
+#: aleksis/core/forms.py:441
+msgid "Grant the permission for all objects"
+msgstr ""
+
+#: aleksis/core/forms.py:449
+msgid "You must select at least one group or person which should get the permission."
+msgstr ""
+
+#: aleksis/core/forms.py:454
+msgid "You must grant the permission to all objects and/or to some objects."
+msgstr ""
+
+#: aleksis/core/forms.py:518
 #, fuzzy
 #| msgid "Data management"
 msgid "Account data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/forms.py:391
+#: aleksis/core/forms.py:524
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:531
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:402
+#: aleksis/core/forms.py:537
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:411
+#: aleksis/core/forms.py:550
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:435
+#: aleksis/core/forms.py:575
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:580
+#: aleksis/core/forms.py:720
 msgid "No valid selection."
 msgstr ""
 
@@ -260,30 +302,30 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Forum"
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:605
-#: aleksis/core/preferences.py:26
+#: aleksis/core/menus.py:32 aleksis/core/models.py:625
+#: aleksis/core/preferences.py:27
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:41
+#: aleksis/core/menus.py:44
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:48
+#: aleksis/core/menus.py:51
 msgid "Stop impersonation"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
+#: aleksis/core/menus.py:60 aleksis/core/templates/core/base.html:80
 msgid "Logout"
 msgstr "nomen retractare"
 
-#: aleksis/core/menus.py:63
+#: aleksis/core/menus.py:66
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:69
+#: aleksis/core/menus.py:74
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -295,22 +337,22 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:81
+#: aleksis/core/menus.py:86
 msgid "Me"
 msgstr ""
 
-#: aleksis/core/menus.py:90
+#: aleksis/core/menus.py:95
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:99
+#: aleksis/core/menus.py:104
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Third-party accounts"
 msgstr "Personae et computi"
 
-#: aleksis/core/menus.py:108
+#: aleksis/core/menus.py:113
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 #, fuzzy
@@ -318,23 +360,23 @@ msgstr "Personae et computi"
 msgid "Authorized applications"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:119
+#: aleksis/core/menus.py:124
 msgid "Admin"
 msgstr "Administratio"
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:704
+#: aleksis/core/menus.py:132 aleksis/core/models.py:725
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:118
+#: aleksis/core/menus.py:143 aleksis/core/models.py:126
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "ani scolae"
 
-#: aleksis/core/menus.py:149
+#: aleksis/core/menus.py:154
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 #, fuzzy
@@ -342,52 +384,57 @@ msgstr "ani scolae"
 msgid "Dashboard widgets"
 msgstr "Forum"
 
-#: aleksis/core/menus.py:160
+#: aleksis/core/menus.py:165
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/menus.py:171
+#: aleksis/core/menus.py:176
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr "Status systemae"
 
-#: aleksis/core/menus.py:182
+#: aleksis/core/menus.py:187
 msgid "Impersonation"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/menus.py:193
+#: aleksis/core/menus.py:198
 #, fuzzy
 #| msgid "Notification"
 msgid "Configuration"
 msgstr "Nuntius"
 
-#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:209 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 #, fuzzy
 #| msgid "System status"
 msgid "Data checks"
 msgstr "Status systemae"
 
-#: aleksis/core/menus.py:210
+#: aleksis/core/menus.py:215 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/templates/core/perms/list.html:14
+msgid "Manage permissions"
+msgstr ""
+
+#: aleksis/core/menus.py:226
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:216
-#: aleksis/core/templates/oauth2_provider/application_detail.html:5
-#: aleksis/core/templates/oauth2_provider/application_list.html:5
+#: aleksis/core/menus.py:234
+#: aleksis/core/templates/oauth2_provider/application/list.html:5
+#: aleksis/core/templates/oauth2_provider/application/list.html:6
 #, fuzzy
 #| msgid "Notifications"
 msgid "OAuth2 Applications"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:247
 msgid "People"
 msgstr "Personae"
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:958
+#: aleksis/core/menus.py:278 aleksis/core/models.py:979
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -395,11 +442,11 @@ msgstr "Personae"
 msgid "Group types"
 msgstr "Greges"
 
-#: aleksis/core/menus.py:271
+#: aleksis/core/menus.py:289
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:282 aleksis/core/models.py:446
+#: aleksis/core/menus.py:300 aleksis/core/models.py:460
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 #, fuzzy
@@ -407,797 +454,783 @@ msgstr ""
 msgid "Additional fields"
 msgstr "addita nomines"
 
-#: aleksis/core/menus.py:297
+#: aleksis/core/menus.py:315
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:498
+#: aleksis/core/mixins.py:508
 #, fuzzy
 #| msgid "Edit school term"
 msgid "Linked school term"
 msgstr "Muta anum scolae"
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:66
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:59
+#: aleksis/core/models.py:67
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:69
 msgid "Date and time"
 msgstr "Dies et hora"
 
-#: aleksis/core/models.py:62
+#: aleksis/core/models.py:70
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:63 aleksis/core/models.py:186
+#: aleksis/core/models.py:71 aleksis/core/models.py:194
 msgid "E-mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:72
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:73
 #, fuzzy
 #| msgid "E-mail address"
 msgid "IP address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:74
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:67
+#: aleksis/core/models.py:75
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:69
+#: aleksis/core/models.py:77
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:81 aleksis/core/models.py:927
+#: aleksis/core/models.py:89 aleksis/core/models.py:948
 msgid "Name"
 msgstr "Nomen"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:91
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:92
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:103
+#: aleksis/core/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:110
+#: aleksis/core/models.py:118
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:139 aleksis/core/models.py:876
+#: aleksis/core/models.py:147 aleksis/core/models.py:897
 msgid "Person"
 msgstr "Persona"
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:150
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:151
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:152
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view photo"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:153
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view persons groups"
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:146
+#: aleksis/core/models.py:154
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can view personal details"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "female"
 msgstr "femininum"
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "male"
 msgstr "maskulinum"
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:172
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:174
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Is person active?"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:176
 msgid "First name"
 msgstr "Primus nomen"
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:177
 msgid "Last name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:179
 msgid "Additional name(s)"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:175 aleksis/core/models.py:415
+#: aleksis/core/models.py:183 aleksis/core/models.py:429
 msgid "Short name"
 msgstr "Breve nomen"
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:186
 msgid "Street"
 msgstr "Via"
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:187
 msgid "Street number"
 msgstr "Numerus domini"
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:188
 msgid "Postal code"
 msgstr "Numerus directorius"
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:189
 msgid "Place"
 msgstr "Urbs"
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:191
 msgid "Home phone"
 msgstr "Numerus telephoni domi"
 
-#: aleksis/core/models.py:184
+#: aleksis/core/models.py:192
 msgid "Mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:196
 msgid "Date of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:189
+#: aleksis/core/models.py:198
+#, fuzzy
+#| msgid "Date of birth"
+msgid "Place of birth"
+msgstr "Dies natalis"
+
+#: aleksis/core/models.py:200
 msgid "Sex"
 msgstr "Genus"
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:202
 msgid "Photo"
 msgstr "Photographia"
 
-#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:206 aleksis/core/templates/core/person/full.html:138
 msgid "Guardians / Parents"
 msgstr "Parentes"
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:213
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:205 aleksis/core/models.py:563
-#: aleksis/core/models.py:587 aleksis/core/models.py:672
-#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:216 aleksis/core/models.py:583
+#: aleksis/core/models.py:607 aleksis/core/models.py:692
+#: aleksis/core/models.py:972 aleksis/core/templates/core/person/full.html:121
 msgid "Description"
 msgstr "Descriptio"
 
-#: aleksis/core/models.py:370
+#: aleksis/core/models.py:384
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:372
+#: aleksis/core/models.py:386
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:379
+#: aleksis/core/models.py:393
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional field for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:394
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional fields for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:397
-msgid "Group"
-msgstr "Grex"
-
-#: aleksis/core/models.py:400
+#: aleksis/core/models.py:414
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:401
+#: aleksis/core/models.py:415
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view statistics about group."
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:413
+#: aleksis/core/models.py:427
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:437 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:440 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:447 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:441
+#: aleksis/core/models.py:455
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:559
-msgid "User"
-msgstr ""
-
-#: aleksis/core/models.py:562 aleksis/core/models.py:586
-#: aleksis/core/models.py:671
+#: aleksis/core/models.py:582 aleksis/core/models.py:606
+#: aleksis/core/models.py:691
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titulus"
 
-#: aleksis/core/models.py:565
+#: aleksis/core/models.py:585
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:571
+#: aleksis/core/models.py:591
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:572
+#: aleksis/core/models.py:592
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:578
+#: aleksis/core/models.py:598
 msgid "Sender"
 msgstr "Mittens"
 
-#: aleksis/core/models.py:583
+#: aleksis/core/models.py:603
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:588 aleksis/core/models.py:928
+#: aleksis/core/models.py:608 aleksis/core/models.py:949
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:590
+#: aleksis/core/models.py:610
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:591
+#: aleksis/core/models.py:611
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:604
+#: aleksis/core/models.py:624
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:673
+#: aleksis/core/models.py:693
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:676
+#: aleksis/core/models.py:696
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:679
+#: aleksis/core/models.py:699
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:703
+#: aleksis/core/models.py:724
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:741
+#: aleksis/core/models.py:762
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipient"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:742
+#: aleksis/core/models.py:763
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipients"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:818
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget Title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:819
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:799
+#: aleksis/core/models.py:820
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget is broken"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:802
+#: aleksis/core/models.py:823
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:824
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:808
+#: aleksis/core/models.py:829
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:809
+#: aleksis/core/models.py:830
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:814
+#: aleksis/core/models.py:835
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:815
+#: aleksis/core/models.py:836
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:841
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:842
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:852
+#: aleksis/core/models.py:873
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Can edit default dashboard"
 msgstr "Forum"
 
-#: aleksis/core/models.py:853
+#: aleksis/core/models.py:874
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:854
+#: aleksis/core/models.py:875
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widgets"
 msgstr "Forum"
 
-#: aleksis/core/models.py:860
+#: aleksis/core/models.py:881
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:882
 #, fuzzy
 #| msgid "Icon"
 msgid "Icon URL"
 msgstr "Nota"
 
-#: aleksis/core/models.py:867
+#: aleksis/core/models.py:888
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:868
+#: aleksis/core/models.py:889
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:873
+#: aleksis/core/models.py:894
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:899
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:879
+#: aleksis/core/models.py:900
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:894
+#: aleksis/core/models.py:915
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget order"
 msgstr "Forum"
 
-#: aleksis/core/models.py:895
+#: aleksis/core/models.py:916
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget orders"
 msgstr "Forum"
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:922
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:935
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:915
+#: aleksis/core/models.py:936
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:946
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:929
+#: aleksis/core/models.py:950
 msgid "Icon"
 msgstr "Nota"
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:956
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:957
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:950
+#: aleksis/core/models.py:971
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:978 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Grex"
 
-#: aleksis/core/models.py:971
+#: aleksis/core/models.py:992
 #, fuzzy
 #| msgid "System status"
 msgid "Can view system status"
 msgstr "Status systemae"
 
-#: aleksis/core/models.py:972
+#: aleksis/core/models.py:993
 #, fuzzy
 #| msgid "Data management"
 msgid "Can manage data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:994
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can impersonate"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:974
+#: aleksis/core/models.py:995
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:975
+#: aleksis/core/models.py:996
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:976
+#: aleksis/core/models.py:997
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:977
+#: aleksis/core/models.py:998
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:978
-msgid "Can add oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:979
-msgid "Can list oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:980
-#, fuzzy
-#| msgid "E-mail address"
-msgid "Can view oauth applications"
-msgstr "Inscriptio electronica"
-
-#: aleksis/core/models.py:981
-msgid "Can update oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:982
-msgid "Can delete oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:983
+#: aleksis/core/models.py:999
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1035
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1027
+#: aleksis/core/models.py:1043
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification sent"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:1041
+#: aleksis/core/models.py:1057
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1058
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1061
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1080
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1082
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1091
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1092
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1084
+#: aleksis/core/models.py:1100
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1096
+#: aleksis/core/models.py:1112
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1097
+#: aleksis/core/models.py:1113
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/preferences.py:22
-msgid "General"
+#: aleksis/core/models.py:1127
+msgid "Allowed scopes that clients can request"
 msgstr ""
 
 #: aleksis/core/preferences.py:23
+msgid "General"
+msgstr ""
+
+#: aleksis/core/preferences.py:24
 msgid "School"
 msgstr "Scola"
 
-#: aleksis/core/preferences.py:24
+#: aleksis/core/preferences.py:25
 msgid "Theme"
 msgstr ""
 
-#: aleksis/core/preferences.py:25
+#: aleksis/core/preferences.py:26
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:28
+#: aleksis/core/preferences.py:29
 #, fuzzy
 #| msgid "Data management"
 msgid "Accounts"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 #, fuzzy
 #| msgid "Notifications"
 msgid "Authentication"
 msgstr "Nuntii"
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 #, fuzzy
 #| msgid "Impersonation"
 msgid "Internationalisation"
 msgstr "Simulare aliquem"
 
-#: aleksis/core/preferences.py:41
+#: aleksis/core/preferences.py:42
 msgid "Site title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/preferences.py:52
+#: aleksis/core/preferences.py:53
 msgid "Site description"
 msgstr "Descriptio paginae"
 
-#: aleksis/core/preferences.py:63
+#: aleksis/core/preferences.py:64
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:75
+#: aleksis/core/preferences.py:76
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:86
+#: aleksis/core/preferences.py:87
 #, fuzzy
 #| msgid "Logout"
 msgid "Logo"
 msgstr "nomen retractare"
 
-#: aleksis/core/preferences.py:96
+#: aleksis/core/preferences.py:97
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:106
+#: aleksis/core/preferences.py:107
 #, fuzzy
 #| msgid "Icon"
 msgid "PWA-Icon"
 msgstr "Nota"
 
-#: aleksis/core/preferences.py:117
+#: aleksis/core/preferences.py:118
 #, fuzzy
 #| msgid "Last name"
 msgid "Mail out name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/preferences.py:128
+#: aleksis/core/preferences.py:129
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Mail out address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/preferences.py:140
+#: aleksis/core/preferences.py:141
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:152
+#: aleksis/core/preferences.py:153
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:164
+#: aleksis/core/preferences.py:165
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:180
+#: aleksis/core/preferences.py:181
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:192
+#: aleksis/core/preferences.py:193
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:203
+#: aleksis/core/preferences.py:204
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:215
+#: aleksis/core/preferences.py:216
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:224
+#: aleksis/core/preferences.py:225
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:235
+#: aleksis/core/preferences.py:236
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:246
+#: aleksis/core/preferences.py:247
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr "Officialis nomen scolae, e. g."
 
-#: aleksis/core/preferences.py:254
+#: aleksis/core/preferences.py:255
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:262
+#: aleksis/core/preferences.py:263
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:273
+#: aleksis/core/preferences.py:274
+#, fuzzy
+#| msgid "E-mail address"
+msgid "Allowed Grant Flows for OAuth applications"
+msgstr "Inscriptio electronica"
+
+#: aleksis/core/preferences.py:287
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:285
+#: aleksis/core/preferences.py:299
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:296
+#: aleksis/core/preferences.py:310
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:307
+#: aleksis/core/preferences.py:321
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:316
+#: aleksis/core/preferences.py:330
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:325
+#: aleksis/core/preferences.py:339
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:336
+#: aleksis/core/preferences.py:350
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:364
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:377
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:373
+#: aleksis/core/preferences.py:387
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:388
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:384
+#: aleksis/core/preferences.py:398
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:394
+#: aleksis/core/preferences.py:408
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:452
+#: aleksis/core/settings.py:474
 msgid "English"
 msgstr "Britannicus"
 
-#: aleksis/core/settings.py:453
+#: aleksis/core/settings.py:475
 msgid "German"
 msgstr "Germanus"
 
@@ -1205,11 +1238,12 @@ msgstr "Germanus"
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
 #: aleksis/core/templates/core/person/full.html:23
-#: aleksis/core/templates/oauth2_provider/application_detail.html:17
+#: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:21 aleksis/core/tables.py:89
+#: aleksis/core/tables.py:105
 #: aleksis/core/templates/core/announcement/list.html:22
 #, fuzzy
 #| msgid "Notifications"
@@ -1218,12 +1252,12 @@ msgstr "Nuntii"
 
 #: aleksis/core/tables.py:56 aleksis/core/tables.py:57
 #: aleksis/core/tables.py:71 aleksis/core/tables.py:87
+#: aleksis/core/tables.py:103
 #: 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:30
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:20
-#: aleksis/core/templates/oauth2_provider/application_detail.html:21
+#: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
@@ -1558,19 +1592,19 @@ msgstr ""
 msgid "There are no announcements."
 msgstr "Scribe nuntium:"
 
-#: aleksis/core/templates/core/base.html:60
+#: aleksis/core/templates/core/base.html:78
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:154
+#: aleksis/core/templates/core/base.html:175
 msgid "About AlekSIS — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:162
+#: aleksis/core/templates/core/base.html:183
 msgid "Impress"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:170
+#: aleksis/core/templates/core/base.html:191
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1775,7 +1809,7 @@ msgstr ""
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
-#: aleksis/core/templates/oauth2_provider/application_detail.html:9
+#: aleksis/core/templates/oauth2_provider/application/detail.html:9
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
@@ -2154,6 +2188,53 @@ msgid ""
 "          "
 msgstr ""
 
+#: aleksis/core/templates/core/perms/assign.html:12
+#: aleksis/core/templates/core/perms/assign.html:13
+msgid "Assign permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:17
+#, fuzzy
+#| msgid "Stop impersonation"
+msgid "Selected permission"
+msgstr "Simulandum aliquem finire"
+
+#: aleksis/core/templates/core/perms/assign.html:26
+msgid "Assign"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:21
+msgid "Assign a new permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:25
+msgid "Select"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:34
+msgid "Global (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:38
+msgid "Global (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:42
+msgid "Object (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:46
+msgid "Object (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:52
+msgid "Filter permissions"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:58
+msgid "Update"
+msgstr ""
+
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
@@ -2179,7 +2260,7 @@ msgstr "Simulare aliquem"
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:130
+#: aleksis/core/templates/core/person/full.html:131
 msgid "Children"
 msgstr ""
 
@@ -2221,64 +2302,66 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
-msgid "Delete application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:12
-#, python-format
-msgid "Are you sure to delete the application %(application_name)s?"
-msgstr ""
+#: aleksis/core/templates/oauth2_provider/application/create.html:5
+#: aleksis/core/templates/oauth2_provider/application/create.html:6
+#, fuzzy
+#| msgid "Notifications"
+msgid "Register OAuth2 Application"
+msgstr "Nuntii"
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:24
-#: aleksis/core/templates/oauth2_provider/application_form.html:18
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:5
+#, fuzzy
+#| msgid "Notifications"
+msgid "OAuth2 Application"
+msgstr "Nuntii"
+
+#: aleksis/core/templates/oauth2_provider/application/detail.html:27
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:35
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:43
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:51
-msgid "Authorization Grant Type"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:59
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_form.html:5
-msgid "Create OAuth2 Application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_form.html:10
+#: aleksis/core/templates/oauth2_provider/application/detail.html:67
 #, fuzzy
-#| msgid "Edit school information"
-msgid "Edit application"
-msgstr "Muta informationes scolae"
+#| msgid "Notifications"
+msgid "Skip Authorisation"
+msgstr "Nuntii"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:8
+#: aleksis/core/templates/oauth2_provider/application/edit.html:5
+#: aleksis/core/templates/oauth2_provider/application/edit.html:6
 #, fuzzy
 #| msgid "Notifications"
-msgid "OAuth2 applications"
+msgid "Edit OAuth2 Application"
 msgstr "Nuntii"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:12
-msgid "Register new applications"
-msgstr ""
+#: aleksis/core/templates/oauth2_provider/application/list.html:11
+#, fuzzy
+#| msgid "Edit school information"
+msgid "Register new application"
+msgstr "Muta informationes scolae"
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:23
+#: aleksis/core/templates/oauth2_provider/application/list.html:20
 msgid "No applications defined."
 msgstr ""
 
@@ -2918,113 +3001,138 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:251
+#: aleksis/core/views.py:270
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:263
+#: aleksis/core/views.py:282
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:387
+#: aleksis/core/views.py:406
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:406 aleksis/core/views.py:416
+#: aleksis/core/views.py:425 aleksis/core/views.py:435
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:466
+#: aleksis/core/views.py:485
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:563
+#: aleksis/core/views.py:582
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:579
+#: aleksis/core/views.py:598
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:663
+#: aleksis/core/views.py:682
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:687
+#: aleksis/core/views.py:706
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:701
+#: aleksis/core/views.py:720
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:752
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:786
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:811
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:841
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:855
+#: aleksis/core/views.py:874
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:856
+#: aleksis/core/views.py:875
 #, fuzzy
 #| msgid "System status"
 msgid "Run data checks …"
 msgstr "Status systemae"
 
-#: aleksis/core/views.py:857
+#: aleksis/core/views.py:876
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:877
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:874
+#: aleksis/core/views.py:893
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:916
+#: aleksis/core/views.py:935
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:965
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:956
+#: aleksis/core/views.py:975
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1023
+#: aleksis/core/views.py:1042
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1025
+#: aleksis/core/views.py:1044
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1153
+#: aleksis/core/views.py:1139
+msgid "We have successfully assigned the permissions."
+msgstr ""
+
+#: aleksis/core/views.py:1149
+msgid "The global user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1159
+msgid "The global group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1169
+msgid "The object user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1179
+msgid "The object group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1298
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1160
+#: aleksis/core/views.py:1305
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
+#, fuzzy
+#~| msgid "Notifications"
+#~ msgid "OAuth2 applications"
+#~ msgstr "Nuntii"
+
 #~ msgid "Persons and accounts"
 #~ msgstr "Personae et computi"
 
diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
index dc6d028e5442a3666f35a7cb46e39e5c01cdd3f9..2458849847f712fe1cf63743640716c5b3ef561a 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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"
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
index ae2f8d194fcacd2bae0d16bb3350dfbaa978aaee..cf83adad715c4a2b0d4b804801f281e508de8367 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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,23 +17,23 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:150
+#: aleksis/core/apps.py:151
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:151
+#: aleksis/core/apps.py:152
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:153
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:154
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:155
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -58,8 +58,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
-#: aleksis/core/templates/core/base.html:84
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
+#: aleksis/core/templates/core/base.html:105
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -67,132 +67,172 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:53
+#: aleksis/core/filters.py:58
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:65
+#: aleksis/core/filters.py:70
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
+#: aleksis/core/filters.py:91
+msgid "Permission"
+msgstr ""
+
+#: aleksis/core/filters.py:99
+msgid "Content type"
+msgstr ""
+
+#: aleksis/core/filters.py:112 aleksis/core/models.py:579
+msgid "User"
+msgstr ""
+
+#: aleksis/core/filters.py:134 aleksis/core/models.py:411
+msgid "Group"
+msgstr ""
+
+#: aleksis/core/forms.py:46 aleksis/core/forms.py:514
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:47
+#: aleksis/core/forms.py:52
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:48
+#: aleksis/core/forms.py:53
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:50
+#: aleksis/core/forms.py:55
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:124
+#: aleksis/core/forms.py:134
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:128
+#: aleksis/core/forms.py:138
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:145 aleksis/core/models.py:117
+#: aleksis/core/forms.py:155 aleksis/core/models.py:125
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:146
+#: aleksis/core/forms.py:156
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
-#: aleksis/core/menus.py:238 aleksis/core/models.py:140
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:208
+#: aleksis/core/menus.py:256 aleksis/core/models.py:148
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:148
+#: aleksis/core/forms.py:158
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
-#: aleksis/core/models.py:60
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:68
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
-#: aleksis/core/models.py:68
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:76
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
-#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:221 aleksis/core/menus.py:267
+#: aleksis/core/models.py:412 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:144
+#: aleksis/core/templates/core/person/full.html:145
 msgid "Groups"
 msgstr ""
 
-#: aleksis/core/forms.py:219
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:222
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:223
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:262
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:266
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:275
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:389
+#: aleksis/core/forms.py:411
+msgid "Who should get the permission?"
+msgstr ""
+
+#: aleksis/core/forms.py:412
+msgid "On what?"
+msgstr ""
+
+#: aleksis/core/forms.py:438
+msgid "Select objects which the permission should be granted for:"
+msgstr ""
+
+#: aleksis/core/forms.py:441
+msgid "Grant the permission for all objects"
+msgstr ""
+
+#: aleksis/core/forms.py:449
+msgid "You must select at least one group or person which should get the permission."
+msgstr ""
+
+#: aleksis/core/forms.py:454
+msgid "You must grant the permission to all objects and/or to some objects."
+msgstr ""
+
+#: aleksis/core/forms.py:518
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:391
+#: aleksis/core/forms.py:524
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:531
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:402
+#: aleksis/core/forms.py:537
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:411
+#: aleksis/core/forms.py:550
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:435
+#: aleksis/core/forms.py:575
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:580
+#: aleksis/core/forms.py:720
 msgid "No valid selection."
 msgstr ""
 
@@ -237,30 +277,30 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:605
-#: aleksis/core/preferences.py:26
+#: aleksis/core/menus.py:32 aleksis/core/models.py:625
+#: aleksis/core/preferences.py:27
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/menus.py:41
+#: aleksis/core/menus.py:44
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:48
+#: aleksis/core/menus.py:51
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
+#: aleksis/core/menus.py:60 aleksis/core/templates/core/base.html:80
 msgid "Logout"
 msgstr ""
 
-#: aleksis/core/menus.py:63
+#: aleksis/core/menus.py:66
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:69
+#: aleksis/core/menus.py:74
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -272,817 +312,806 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:81
+#: aleksis/core/menus.py:86
 msgid "Me"
 msgstr ""
 
-#: aleksis/core/menus.py:90
+#: aleksis/core/menus.py:95
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:99
+#: aleksis/core/menus.py:104
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:108
+#: aleksis/core/menus.py:113
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:119
+#: aleksis/core/menus.py:124
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:704
+#: aleksis/core/menus.py:132 aleksis/core/models.py:725
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:118
+#: aleksis/core/menus.py:143 aleksis/core/models.py:126
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:149
+#: aleksis/core/menus.py:154
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:160
+#: aleksis/core/menus.py:165
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:171
+#: aleksis/core/menus.py:176
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:182
+#: aleksis/core/menus.py:187
 msgid "Impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:193
+#: aleksis/core/menus.py:198
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:209 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:210
+#: aleksis/core/menus.py:215 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/templates/core/perms/list.html:14
+msgid "Manage permissions"
+msgstr ""
+
+#: aleksis/core/menus.py:226
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:216
-#: aleksis/core/templates/oauth2_provider/application_detail.html:5
-#: aleksis/core/templates/oauth2_provider/application_list.html:5
+#: aleksis/core/menus.py:234
+#: aleksis/core/templates/oauth2_provider/application/list.html:5
+#: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:247
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:958
+#: aleksis/core/menus.py:278 aleksis/core/models.py:979
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/menus.py:271
+#: aleksis/core/menus.py:289
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:282 aleksis/core/models.py:446
+#: aleksis/core/menus.py:300 aleksis/core/models.py:460
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:297
+#: aleksis/core/menus.py:315
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:498
+#: aleksis/core/mixins.py:508
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:66
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:59
+#: aleksis/core/models.py:67
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:69
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:62
+#: aleksis/core/models.py:70
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:63 aleksis/core/models.py:186
+#: aleksis/core/models.py:71 aleksis/core/models.py:194
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:72
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:73
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:74
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:67
+#: aleksis/core/models.py:75
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:69
+#: aleksis/core/models.py:77
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:81 aleksis/core/models.py:927
+#: aleksis/core/models.py:89 aleksis/core/models.py:948
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:91
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:92
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:103
+#: aleksis/core/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:110
+#: aleksis/core/models.py:118
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:139 aleksis/core/models.py:876
+#: aleksis/core/models.py:147 aleksis/core/models.py:897
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:150
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:151
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:152
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:153
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:146
+#: aleksis/core/models.py:154
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:172
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:174
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:176
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:177
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:179
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:175 aleksis/core/models.py:415
+#: aleksis/core/models.py:183 aleksis/core/models.py:429
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:186
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:187
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:188
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:189
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:191
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:184
+#: aleksis/core/models.py:192
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:196
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:189
+#: aleksis/core/models.py:198
+msgid "Place of birth"
+msgstr ""
+
+#: aleksis/core/models.py:200
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:202
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:206 aleksis/core/templates/core/person/full.html:138
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:213
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:205 aleksis/core/models.py:563
-#: aleksis/core/models.py:587 aleksis/core/models.py:672
-#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:216 aleksis/core/models.py:583
+#: aleksis/core/models.py:607 aleksis/core/models.py:692
+#: aleksis/core/models.py:972 aleksis/core/templates/core/person/full.html:121
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:370
+#: aleksis/core/models.py:384
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:372
+#: aleksis/core/models.py:386
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:379
+#: aleksis/core/models.py:393
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:394
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:397
-msgid "Group"
-msgstr ""
-
-#: aleksis/core/models.py:400
+#: aleksis/core/models.py:414
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:401
+#: aleksis/core/models.py:415
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:413
+#: aleksis/core/models.py:427
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:437 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:440 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:447 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:441
+#: aleksis/core/models.py:455
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:559
-msgid "User"
-msgstr ""
-
-#: aleksis/core/models.py:562 aleksis/core/models.py:586
-#: aleksis/core/models.py:671
+#: aleksis/core/models.py:582 aleksis/core/models.py:606
+#: aleksis/core/models.py:691
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:565
+#: aleksis/core/models.py:585
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:571
+#: aleksis/core/models.py:591
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:572
+#: aleksis/core/models.py:592
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:578
+#: aleksis/core/models.py:598
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:583
+#: aleksis/core/models.py:603
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:588 aleksis/core/models.py:928
+#: aleksis/core/models.py:608 aleksis/core/models.py:949
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:590
+#: aleksis/core/models.py:610
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:591
+#: aleksis/core/models.py:611
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:604
+#: aleksis/core/models.py:624
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:673
+#: aleksis/core/models.py:693
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:676
+#: aleksis/core/models.py:696
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:679
+#: aleksis/core/models.py:699
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:703
+#: aleksis/core/models.py:724
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:741
+#: aleksis/core/models.py:762
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742
+#: aleksis/core/models.py:763
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:818
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:819
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:799
+#: aleksis/core/models.py:820
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:802
+#: aleksis/core/models.py:823
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:824
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:808
+#: aleksis/core/models.py:829
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:809
+#: aleksis/core/models.py:830
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:814
+#: aleksis/core/models.py:835
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:815
+#: aleksis/core/models.py:836
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:841
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:842
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:852
+#: aleksis/core/models.py:873
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:853
+#: aleksis/core/models.py:874
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:854
+#: aleksis/core/models.py:875
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:860
+#: aleksis/core/models.py:881
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:882
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:867
+#: aleksis/core/models.py:888
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:868
+#: aleksis/core/models.py:889
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:873
+#: aleksis/core/models.py:894
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:899
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:879
+#: aleksis/core/models.py:900
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:894
+#: aleksis/core/models.py:915
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:895
+#: aleksis/core/models.py:916
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:922
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:935
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:915
+#: aleksis/core/models.py:936
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:946
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:929
+#: aleksis/core/models.py:950
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:956
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:957
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:950
+#: aleksis/core/models.py:971
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:978 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:971
+#: aleksis/core/models.py:992
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:972
+#: aleksis/core/models.py:993
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:994
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:974
+#: aleksis/core/models.py:995
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:975
+#: aleksis/core/models.py:996
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:976
+#: aleksis/core/models.py:997
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:977
+#: aleksis/core/models.py:998
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:978
-msgid "Can add oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:979
-msgid "Can list oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:980
-msgid "Can view oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:981
-msgid "Can update oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:982
-msgid "Can delete oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:983
+#: aleksis/core/models.py:999
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1035
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1027
+#: aleksis/core/models.py:1043
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1041
+#: aleksis/core/models.py:1057
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1058
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1061
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1080
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1082
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1091
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1092
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1084
+#: aleksis/core/models.py:1100
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1096
+#: aleksis/core/models.py:1112
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1097
+#: aleksis/core/models.py:1113
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/preferences.py:22
-msgid "General"
+#: aleksis/core/models.py:1127
+msgid "Allowed scopes that clients can request"
 msgstr ""
 
 #: aleksis/core/preferences.py:23
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:24
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:25
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:26
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:28
+#: aleksis/core/preferences.py:29
 msgid "Accounts"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:41
+#: aleksis/core/preferences.py:42
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:52
+#: aleksis/core/preferences.py:53
 msgid "Site description"
 msgstr ""
 
-#: aleksis/core/preferences.py:63
+#: aleksis/core/preferences.py:64
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:75
+#: aleksis/core/preferences.py:76
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:86
+#: aleksis/core/preferences.py:87
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:96
+#: aleksis/core/preferences.py:97
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:106
+#: aleksis/core/preferences.py:107
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:117
+#: aleksis/core/preferences.py:118
 msgid "Mail out name"
 msgstr ""
 
-#: aleksis/core/preferences.py:128
+#: aleksis/core/preferences.py:129
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:140
+#: aleksis/core/preferences.py:141
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:152
+#: aleksis/core/preferences.py:153
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:164
+#: aleksis/core/preferences.py:165
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:180
+#: aleksis/core/preferences.py:181
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:192
+#: aleksis/core/preferences.py:193
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:203
+#: aleksis/core/preferences.py:204
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:215
+#: aleksis/core/preferences.py:216
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:224
+#: aleksis/core/preferences.py:225
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:235
+#: aleksis/core/preferences.py:236
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:246
+#: aleksis/core/preferences.py:247
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:254
+#: aleksis/core/preferences.py:255
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:262
+#: aleksis/core/preferences.py:263
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:273
+#: aleksis/core/preferences.py:274
+msgid "Allowed Grant Flows for OAuth applications"
+msgstr ""
+
+#: aleksis/core/preferences.py:287
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:285
+#: aleksis/core/preferences.py:299
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:296
+#: aleksis/core/preferences.py:310
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:307
+#: aleksis/core/preferences.py:321
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:316
+#: aleksis/core/preferences.py:330
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:325
+#: aleksis/core/preferences.py:339
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:336
+#: aleksis/core/preferences.py:350
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:364
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:377
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:373
+#: aleksis/core/preferences.py:387
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:388
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:384
+#: aleksis/core/preferences.py:398
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:394
+#: aleksis/core/preferences.py:408
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:452
+#: aleksis/core/settings.py:474
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:453
+#: aleksis/core/settings.py:475
 msgid "German"
 msgstr ""
 
@@ -1090,23 +1119,24 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
 #: aleksis/core/templates/core/person/full.html:23
-#: aleksis/core/templates/oauth2_provider/application_detail.html:17
+#: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:21 aleksis/core/tables.py:89
+#: aleksis/core/tables.py:105
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:56 aleksis/core/tables.py:57
 #: aleksis/core/tables.py:71 aleksis/core/tables.py:87
+#: aleksis/core/tables.py:103
 #: 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:30
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:20
-#: aleksis/core/templates/oauth2_provider/application_detail.html:21
+#: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
@@ -1423,19 +1453,19 @@ msgstr ""
 msgid "There are no announcements."
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:60
+#: aleksis/core/templates/core/base.html:78
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:154
+#: aleksis/core/templates/core/base.html:175
 msgid "About AlekSIS — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:162
+#: aleksis/core/templates/core/base.html:183
 msgid "Impress"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:170
+#: aleksis/core/templates/core/base.html:191
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1626,7 +1656,7 @@ msgstr ""
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
-#: aleksis/core/templates/oauth2_provider/application_detail.html:9
+#: aleksis/core/templates/oauth2_provider/application/detail.html:9
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
@@ -1983,6 +2013,51 @@ msgid ""
 "          "
 msgstr ""
 
+#: aleksis/core/templates/core/perms/assign.html:12
+#: aleksis/core/templates/core/perms/assign.html:13
+msgid "Assign permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:17
+msgid "Selected permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:26
+msgid "Assign"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:21
+msgid "Assign a new permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:25
+msgid "Select"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:34
+msgid "Global (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:38
+msgid "Global (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:42
+msgid "Object (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:46
+msgid "Object (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:52
+msgid "Filter permissions"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:58
+msgid "Update"
+msgstr ""
+
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
@@ -2004,7 +2079,7 @@ msgstr ""
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:130
+#: aleksis/core/templates/core/person/full.html:131
 msgid "Children"
 msgstr ""
 
@@ -2044,60 +2119,56 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
-msgid "Delete application"
+#: aleksis/core/templates/oauth2_provider/application/create.html:5
+#: aleksis/core/templates/oauth2_provider/application/create.html:6
+msgid "Register OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:12
-#, python-format
-msgid "Are you sure to delete the application %(application_name)s?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:24
-#: aleksis/core/templates/oauth2_provider/application_form.html:18
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:5
+msgid "OAuth2 Application"
+msgstr ""
+
+#: aleksis/core/templates/oauth2_provider/application/detail.html:27
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:35
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:43
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:51
-msgid "Authorization Grant Type"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:59
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_form.html:5
-msgid "Create OAuth2 Application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_form.html:10
-msgid "Edit application"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+msgid "Skip Authorisation"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:8
-msgid "OAuth2 applications"
+#: aleksis/core/templates/oauth2_provider/application/edit.html:5
+#: aleksis/core/templates/oauth2_provider/application/edit.html:6
+msgid "Edit OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:12
-msgid "Register new applications"
+#: aleksis/core/templates/oauth2_provider/application/list.html:11
+msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:23
+#: aleksis/core/templates/oauth2_provider/application/list.html:20
 msgid "No applications defined."
 msgstr ""
 
@@ -2724,108 +2795,128 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:251
+#: aleksis/core/views.py:270
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:263
+#: aleksis/core/views.py:282
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:387
+#: aleksis/core/views.py:406
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:406 aleksis/core/views.py:416
+#: aleksis/core/views.py:425 aleksis/core/views.py:435
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:466
+#: aleksis/core/views.py:485
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:563
+#: aleksis/core/views.py:582
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:579
+#: aleksis/core/views.py:598
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:663
+#: aleksis/core/views.py:682
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:687
+#: aleksis/core/views.py:706
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:701
+#: aleksis/core/views.py:720
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:752
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:786
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:811
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:841
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:855
+#: aleksis/core/views.py:874
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:856
+#: aleksis/core/views.py:875
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:857
+#: aleksis/core/views.py:876
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:877
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:874
+#: aleksis/core/views.py:893
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:916
+#: aleksis/core/views.py:935
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:965
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:956
+#: aleksis/core/views.py:975
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1023
+#: aleksis/core/views.py:1042
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1025
+#: aleksis/core/views.py:1044
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1153
+#: aleksis/core/views.py:1139
+msgid "We have successfully assigned the permissions."
+msgstr ""
+
+#: aleksis/core/views.py:1149
+msgid "The global user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1159
+msgid "The global group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1169
+msgid "The object user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1179
+msgid "The object group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1298
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1160
+#: aleksis/core/views.py:1305
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
index dc6d028e5442a3666f35a7cb46e39e5c01cdd3f9..2458849847f712fe1cf63743640716c5b3ef561a 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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"
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
index c1f28664922a7b5cbdac80d557c812092765b16f..018414f7c82920ea684c99d5574e52bc2a923d5a 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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,23 +17,23 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/core/apps.py:150
+#: aleksis/core/apps.py:151
 msgid "OpenID Connect scope"
 msgstr ""
 
-#: aleksis/core/apps.py:151
+#: aleksis/core/apps.py:152
 msgid "Given name, family name, link to profile and picture if existing."
 msgstr ""
 
-#: aleksis/core/apps.py:152
+#: aleksis/core/apps.py:153
 msgid "Full home postal address"
 msgstr ""
 
-#: aleksis/core/apps.py:153
+#: aleksis/core/apps.py:154
 msgid "Email address"
 msgstr ""
 
-#: aleksis/core/apps.py:154
+#: aleksis/core/apps.py:155
 msgid "Home and mobile phone"
 msgstr ""
 
@@ -58,8 +58,8 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
-#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
-#: aleksis/core/templates/core/base.html:84
+#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:104
+#: aleksis/core/templates/core/base.html:105
 #: aleksis/core/templates/core/group/list.html:20
 #: aleksis/core/templates/core/person/list.html:24
 #: aleksis/core/templates/search/search.html:7
@@ -67,132 +67,172 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: aleksis/core/filters.py:53
+#: aleksis/core/filters.py:58
 msgid "Search by name"
 msgstr ""
 
-#: aleksis/core/filters.py:65
+#: aleksis/core/filters.py:70
 msgid "Search by contact details"
 msgstr ""
 
-#: aleksis/core/forms.py:41 aleksis/core/forms.py:387
+#: aleksis/core/filters.py:91
+msgid "Permission"
+msgstr ""
+
+#: aleksis/core/filters.py:99
+msgid "Content type"
+msgstr ""
+
+#: aleksis/core/filters.py:112 aleksis/core/models.py:579
+msgid "User"
+msgstr ""
+
+#: aleksis/core/filters.py:134 aleksis/core/models.py:411
+msgid "Group"
+msgstr ""
+
+#: aleksis/core/forms.py:46 aleksis/core/forms.py:514
 msgid "Base data"
 msgstr ""
 
-#: aleksis/core/forms.py:47
+#: aleksis/core/forms.py:52
 msgid "Address"
 msgstr ""
 
-#: aleksis/core/forms.py:48
+#: aleksis/core/forms.py:53
 msgid "Contact data"
 msgstr ""
 
-#: aleksis/core/forms.py:50
+#: aleksis/core/forms.py:55
 msgid "Advanced personal data"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "New user"
 msgstr ""
 
-#: aleksis/core/forms.py:93
+#: aleksis/core/forms.py:103
 msgid "Create a new account"
 msgstr ""
 
-#: aleksis/core/forms.py:124
+#: aleksis/core/forms.py:134
 msgid "You cannot set a new username when also selecting an existing user."
 msgstr ""
 
-#: aleksis/core/forms.py:128
+#: aleksis/core/forms.py:138
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:145 aleksis/core/models.py:117
+#: aleksis/core/forms.py:155 aleksis/core/models.py:125
 msgid "School term"
 msgstr ""
 
-#: aleksis/core/forms.py:146
+#: aleksis/core/forms.py:156
 msgid "Common data"
 msgstr ""
 
-#: aleksis/core/forms.py:147 aleksis/core/forms.py:196
-#: aleksis/core/menus.py:238 aleksis/core/models.py:140
+#: aleksis/core/forms.py:157 aleksis/core/forms.py:208
+#: aleksis/core/menus.py:256 aleksis/core/models.py:148
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
 msgstr ""
 
-#: aleksis/core/forms.py:148
+#: aleksis/core/forms.py:158
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:188 aleksis/core/forms.py:191
-#: aleksis/core/models.py:60
+#: aleksis/core/forms.py:200 aleksis/core/forms.py:203
+#: aleksis/core/models.py:68
 msgid "Date"
 msgstr ""
 
-#: aleksis/core/forms.py:189 aleksis/core/forms.py:192
-#: aleksis/core/models.py:68
+#: aleksis/core/forms.py:201 aleksis/core/forms.py:204
+#: aleksis/core/models.py:76
 msgid "Time"
 msgstr ""
 
-#: aleksis/core/forms.py:209 aleksis/core/menus.py:249
-#: aleksis/core/models.py:398 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/forms.py:221 aleksis/core/menus.py:267
+#: aleksis/core/models.py:412 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
-#: aleksis/core/templates/core/person/full.html:144
+#: aleksis/core/templates/core/person/full.html:145
 msgid "Groups"
 msgstr ""
 
-#: aleksis/core/forms.py:219
+#: aleksis/core/forms.py:234
 msgid "From when until when should the announcement be displayed?"
 msgstr ""
 
-#: aleksis/core/forms.py:222
+#: aleksis/core/forms.py:237
 msgid "Who should see the announcement?"
 msgstr ""
 
-#: aleksis/core/forms.py:223
+#: aleksis/core/forms.py:238
 msgid "Write your announcement:"
 msgstr ""
 
-#: aleksis/core/forms.py:262
+#: aleksis/core/forms.py:277
 msgid "You are not allowed to create announcements which are only valid in the past."
 msgstr ""
 
-#: aleksis/core/forms.py:266
+#: aleksis/core/forms.py:281
 msgid "The from date and time must be earlier then the until date and time."
 msgstr ""
 
-#: aleksis/core/forms.py:275
+#: aleksis/core/forms.py:290
 msgid "You need at least one recipient."
 msgstr ""
 
-#: aleksis/core/forms.py:389
+#: aleksis/core/forms.py:411
+msgid "Who should get the permission?"
+msgstr ""
+
+#: aleksis/core/forms.py:412
+msgid "On what?"
+msgstr ""
+
+#: aleksis/core/forms.py:438
+msgid "Select objects which the permission should be granted for:"
+msgstr ""
+
+#: aleksis/core/forms.py:441
+msgid "Grant the permission for all objects"
+msgstr ""
+
+#: aleksis/core/forms.py:449
+msgid "You must select at least one group or person which should get the permission."
+msgstr ""
+
+#: aleksis/core/forms.py:454
+msgid "You must grant the permission to all objects and/or to some objects."
+msgstr ""
+
+#: aleksis/core/forms.py:518
 msgid "Account data"
 msgstr ""
 
-#: aleksis/core/forms.py:391
+#: aleksis/core/forms.py:524
 msgid "Consents"
 msgstr ""
 
-#: aleksis/core/forms.py:396
+#: aleksis/core/forms.py:531
 msgid "Password"
 msgstr ""
 
-#: aleksis/core/forms.py:402
+#: aleksis/core/forms.py:537
 msgid "Password (again)"
 msgstr ""
 
-#: aleksis/core/forms.py:411
+#: aleksis/core/forms.py:550
 #, python-brace-format
 msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them."
 msgstr ""
 
-#: aleksis/core/forms.py:435
+#: aleksis/core/forms.py:575
 msgid "You must type the same password each time."
 msgstr ""
 
-#: aleksis/core/forms.py:580
+#: aleksis/core/forms.py:720
 msgid "No valid selection."
 msgstr ""
 
@@ -237,30 +277,30 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:32 aleksis/core/models.py:605
-#: aleksis/core/preferences.py:26
+#: aleksis/core/menus.py:32 aleksis/core/models.py:625
+#: aleksis/core/preferences.py:27
 #: aleksis/core/templates/core/notifications.html:4
 #: aleksis/core/templates/core/notifications.html:5
 msgid "Notifications"
 msgstr ""
 
-#: aleksis/core/menus.py:41
+#: aleksis/core/menus.py:44
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:48
+#: aleksis/core/menus.py:51
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
+#: aleksis/core/menus.py:60 aleksis/core/templates/core/base.html:80
 msgid "Logout"
 msgstr ""
 
-#: aleksis/core/menus.py:63
+#: aleksis/core/menus.py:66
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:69
+#: aleksis/core/menus.py:74
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -272,817 +312,806 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:81
+#: aleksis/core/menus.py:86
 msgid "Me"
 msgstr ""
 
-#: aleksis/core/menus.py:90
+#: aleksis/core/menus.py:95
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:99
+#: aleksis/core/menus.py:104
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:108
+#: aleksis/core/menus.py:113
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:119
+#: aleksis/core/menus.py:124
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/models.py:704
+#: aleksis/core/menus.py:132 aleksis/core/models.py:725
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:138 aleksis/core/models.py:118
+#: aleksis/core/menus.py:143 aleksis/core/models.py:126
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:149
+#: aleksis/core/menus.py:154
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:160
+#: aleksis/core/menus.py:165
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:171
+#: aleksis/core/menus.py:176
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:182
+#: aleksis/core/menus.py:187
 msgid "Impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:193
+#: aleksis/core/menus.py:198
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:209 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:210
+#: aleksis/core/menus.py:215 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/templates/core/perms/list.html:14
+msgid "Manage permissions"
+msgstr ""
+
+#: aleksis/core/menus.py:226
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:216
-#: aleksis/core/templates/oauth2_provider/application_detail.html:5
-#: aleksis/core/templates/oauth2_provider/application_list.html:5
+#: aleksis/core/menus.py:234
+#: aleksis/core/templates/oauth2_provider/application/list.html:5
+#: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:247
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:260 aleksis/core/models.py:958
+#: aleksis/core/menus.py:278 aleksis/core/models.py:979
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/menus.py:271
+#: aleksis/core/menus.py:289
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:282 aleksis/core/models.py:446
+#: aleksis/core/menus.py:300 aleksis/core/models.py:460
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:297
+#: aleksis/core/menus.py:315
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/mixins.py:498
+#: aleksis/core/mixins.py:508
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:58
+#: aleksis/core/models.py:66
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:59
+#: aleksis/core/models.py:67
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:61
+#: aleksis/core/models.py:69
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:62
+#: aleksis/core/models.py:70
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:63 aleksis/core/models.py:186
+#: aleksis/core/models.py:71 aleksis/core/models.py:194
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:64
+#: aleksis/core/models.py:72
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:65
+#: aleksis/core/models.py:73
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:66
+#: aleksis/core/models.py:74
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:67
+#: aleksis/core/models.py:75
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:69
+#: aleksis/core/models.py:77
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:81 aleksis/core/models.py:927
+#: aleksis/core/models.py:89 aleksis/core/models.py:948
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:91
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:92
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:103
+#: aleksis/core/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:110
+#: aleksis/core/models.py:118
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:139 aleksis/core/models.py:876
+#: aleksis/core/models.py:147 aleksis/core/models.py:897
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:142
+#: aleksis/core/models.py:150
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:143
+#: aleksis/core/models.py:151
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:144
+#: aleksis/core/models.py:152
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:145
+#: aleksis/core/models.py:153
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:146
+#: aleksis/core/models.py:154
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:156
+#: aleksis/core/models.py:164
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:172
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:166
+#: aleksis/core/models.py:174
 msgid "Is person active?"
 msgstr ""
 
-#: aleksis/core/models.py:168
+#: aleksis/core/models.py:176
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/models.py:169
+#: aleksis/core/models.py:177
 msgid "Last name"
 msgstr ""
 
-#: aleksis/core/models.py:171
+#: aleksis/core/models.py:179
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:175 aleksis/core/models.py:415
+#: aleksis/core/models.py:183 aleksis/core/models.py:429
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:178
+#: aleksis/core/models.py:186
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:179
+#: aleksis/core/models.py:187
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:180
+#: aleksis/core/models.py:188
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:181
+#: aleksis/core/models.py:189
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:183
+#: aleksis/core/models.py:191
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:184
+#: aleksis/core/models.py:192
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:196
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:189
+#: aleksis/core/models.py:198
+msgid "Place of birth"
+msgstr ""
+
+#: aleksis/core/models.py:200
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:191
+#: aleksis/core/models.py:202
 msgid "Photo"
 msgstr ""
 
-#: aleksis/core/models.py:195 aleksis/core/templates/core/person/full.html:137
+#: aleksis/core/models.py:206 aleksis/core/templates/core/person/full.html:138
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:202
+#: aleksis/core/models.py:213
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:205 aleksis/core/models.py:563
-#: aleksis/core/models.py:587 aleksis/core/models.py:672
-#: aleksis/core/models.py:951 aleksis/core/templates/core/person/full.html:120
+#: aleksis/core/models.py:216 aleksis/core/models.py:583
+#: aleksis/core/models.py:607 aleksis/core/models.py:692
+#: aleksis/core/models.py:972 aleksis/core/templates/core/person/full.html:121
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:370
+#: aleksis/core/models.py:384
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:372
+#: aleksis/core/models.py:386
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:379
+#: aleksis/core/models.py:393
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:380
+#: aleksis/core/models.py:394
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:397
-msgid "Group"
-msgstr ""
-
-#: aleksis/core/models.py:400
+#: aleksis/core/models.py:414
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:401
+#: aleksis/core/models.py:415
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:413
+#: aleksis/core/models.py:427
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:423 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:437 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:426 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:440 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:433 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:447 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:441
+#: aleksis/core/models.py:455
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:559
-msgid "User"
-msgstr ""
-
-#: aleksis/core/models.py:562 aleksis/core/models.py:586
-#: aleksis/core/models.py:671
+#: aleksis/core/models.py:582 aleksis/core/models.py:606
+#: aleksis/core/models.py:691
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:565
+#: aleksis/core/models.py:585
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:571
+#: aleksis/core/models.py:591
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:572
+#: aleksis/core/models.py:592
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:578
+#: aleksis/core/models.py:598
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:583
+#: aleksis/core/models.py:603
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:588 aleksis/core/models.py:928
+#: aleksis/core/models.py:608 aleksis/core/models.py:949
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:590
+#: aleksis/core/models.py:610
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:591
+#: aleksis/core/models.py:611
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:604
+#: aleksis/core/models.py:624
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:673
+#: aleksis/core/models.py:693
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:676
+#: aleksis/core/models.py:696
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:679
+#: aleksis/core/models.py:699
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:703
+#: aleksis/core/models.py:724
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:741
+#: aleksis/core/models.py:762
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742
+#: aleksis/core/models.py:763
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:797
+#: aleksis/core/models.py:818
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:798
+#: aleksis/core/models.py:819
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:799
+#: aleksis/core/models.py:820
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:802
+#: aleksis/core/models.py:823
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:803
+#: aleksis/core/models.py:824
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:808
+#: aleksis/core/models.py:829
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:809
+#: aleksis/core/models.py:830
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:814
+#: aleksis/core/models.py:835
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:815
+#: aleksis/core/models.py:836
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:820
+#: aleksis/core/models.py:841
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:821
+#: aleksis/core/models.py:842
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:852
+#: aleksis/core/models.py:873
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:853
+#: aleksis/core/models.py:874
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:854
+#: aleksis/core/models.py:875
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:860
+#: aleksis/core/models.py:881
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:861
+#: aleksis/core/models.py:882
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:867
+#: aleksis/core/models.py:888
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:868
+#: aleksis/core/models.py:889
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:873
+#: aleksis/core/models.py:894
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:878
+#: aleksis/core/models.py:899
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:879
+#: aleksis/core/models.py:900
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:894
+#: aleksis/core/models.py:915
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:895
+#: aleksis/core/models.py:916
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:901
+#: aleksis/core/models.py:922
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:914
+#: aleksis/core/models.py:935
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:915
+#: aleksis/core/models.py:936
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:946
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:929
+#: aleksis/core/models.py:950
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:935
+#: aleksis/core/models.py:956
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:957
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:950
+#: aleksis/core/models.py:971
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:957 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:978 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:971
+#: aleksis/core/models.py:992
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:972
+#: aleksis/core/models.py:993
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:973
+#: aleksis/core/models.py:994
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:974
+#: aleksis/core/models.py:995
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:975
+#: aleksis/core/models.py:996
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:976
+#: aleksis/core/models.py:997
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:977
+#: aleksis/core/models.py:998
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:978
-msgid "Can add oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:979
-msgid "Can list oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:980
-msgid "Can view oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:981
-msgid "Can update oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:982
-msgid "Can delete oauth applications"
-msgstr ""
-
-#: aleksis/core/models.py:983
+#: aleksis/core/models.py:999
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1035
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1027
+#: aleksis/core/models.py:1043
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1028
+#: aleksis/core/models.py:1044
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1041
+#: aleksis/core/models.py:1057
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1058
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1044
+#: aleksis/core/models.py:1060
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1045
+#: aleksis/core/models.py:1061
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1060
+#: aleksis/core/models.py:1076
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1064
+#: aleksis/core/models.py:1080
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1082
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1068
+#: aleksis/core/models.py:1084
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1075
+#: aleksis/core/models.py:1091
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1092
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1081
+#: aleksis/core/models.py:1097
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1084
+#: aleksis/core/models.py:1100
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1096
+#: aleksis/core/models.py:1112
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1097
+#: aleksis/core/models.py:1113
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/preferences.py:22
-msgid "General"
+#: aleksis/core/models.py:1127
+msgid "Allowed scopes that clients can request"
 msgstr ""
 
 #: aleksis/core/preferences.py:23
-msgid "School"
+msgid "General"
 msgstr ""
 
 #: aleksis/core/preferences.py:24
-msgid "Theme"
+msgid "School"
 msgstr ""
 
 #: aleksis/core/preferences.py:25
+msgid "Theme"
+msgstr ""
+
+#: aleksis/core/preferences.py:26
 msgid "Mail"
 msgstr ""
 
-#: aleksis/core/preferences.py:27
+#: aleksis/core/preferences.py:28
 msgid "Footer"
 msgstr ""
 
-#: aleksis/core/preferences.py:28
+#: aleksis/core/preferences.py:29
 msgid "Accounts"
 msgstr ""
 
-#: aleksis/core/preferences.py:29
+#: aleksis/core/preferences.py:30
 msgid "Authentication"
 msgstr ""
 
-#: aleksis/core/preferences.py:30
+#: aleksis/core/preferences.py:31
 msgid "Internationalisation"
 msgstr ""
 
-#: aleksis/core/preferences.py:41
+#: aleksis/core/preferences.py:42
 msgid "Site title"
 msgstr ""
 
-#: aleksis/core/preferences.py:52
+#: aleksis/core/preferences.py:53
 msgid "Site description"
 msgstr ""
 
-#: aleksis/core/preferences.py:63
+#: aleksis/core/preferences.py:64
 msgid "Primary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:75
+#: aleksis/core/preferences.py:76
 msgid "Secondary colour"
 msgstr ""
 
-#: aleksis/core/preferences.py:86
+#: aleksis/core/preferences.py:87
 msgid "Logo"
 msgstr ""
 
-#: aleksis/core/preferences.py:96
+#: aleksis/core/preferences.py:97
 msgid "Favicon"
 msgstr ""
 
-#: aleksis/core/preferences.py:106
+#: aleksis/core/preferences.py:107
 msgid "PWA-Icon"
 msgstr ""
 
-#: aleksis/core/preferences.py:117
+#: aleksis/core/preferences.py:118
 msgid "Mail out name"
 msgstr ""
 
-#: aleksis/core/preferences.py:128
+#: aleksis/core/preferences.py:129
 msgid "Mail out address"
 msgstr ""
 
-#: aleksis/core/preferences.py:140
+#: aleksis/core/preferences.py:141
 msgid "Link to privacy policy"
 msgstr ""
 
-#: aleksis/core/preferences.py:152
+#: aleksis/core/preferences.py:153
 msgid "Link to imprint"
 msgstr ""
 
-#: aleksis/core/preferences.py:164
+#: aleksis/core/preferences.py:165
 msgid "Name format for addressing"
 msgstr ""
 
-#: aleksis/core/preferences.py:180
+#: aleksis/core/preferences.py:181
 msgid "Channels to use for notifications"
 msgstr ""
 
-#: aleksis/core/preferences.py:192
+#: aleksis/core/preferences.py:193
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
 msgstr ""
 
-#: aleksis/core/preferences.py:203
+#: aleksis/core/preferences.py:204
 msgid "Field on person to match primary group against"
 msgstr ""
 
-#: aleksis/core/preferences.py:215
+#: aleksis/core/preferences.py:216
 msgid "Automatically create new persons for new users"
 msgstr ""
 
-#: aleksis/core/preferences.py:224
+#: aleksis/core/preferences.py:225
 msgid "Automatically link existing persons to new users by their e-mail address"
 msgstr ""
 
-#: aleksis/core/preferences.py:235
+#: aleksis/core/preferences.py:236
 msgid "Display name of the school"
 msgstr ""
 
-#: aleksis/core/preferences.py:246
+#: aleksis/core/preferences.py:247
 msgid "Official name of the school, e.g. as given by supervisory authority"
 msgstr ""
 
-#: aleksis/core/preferences.py:254
+#: aleksis/core/preferences.py:255
 msgid "Allow users to change their passwords"
 msgstr ""
 
-#: aleksis/core/preferences.py:262
+#: aleksis/core/preferences.py:263
 msgid "Enable signup"
 msgstr ""
 
-#: aleksis/core/preferences.py:273
+#: aleksis/core/preferences.py:274
+msgid "Allowed Grant Flows for OAuth applications"
+msgstr ""
+
+#: aleksis/core/preferences.py:287
 msgid "Available languages"
 msgstr ""
 
-#: aleksis/core/preferences.py:285
+#: aleksis/core/preferences.py:299
 msgid "Send emails if data checks detect problems"
 msgstr ""
 
-#: aleksis/core/preferences.py:296
+#: aleksis/core/preferences.py:310
 msgid "Email recipients for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:307
+#: aleksis/core/preferences.py:321
 msgid "Email recipient groups for data checks problem emails"
 msgstr ""
 
-#: aleksis/core/preferences.py:316
+#: aleksis/core/preferences.py:330
 msgid "Show dashboard to users without login"
 msgstr ""
 
-#: aleksis/core/preferences.py:325
+#: aleksis/core/preferences.py:339
 msgid "Allow users to edit their dashboard"
 msgstr ""
 
-#: aleksis/core/preferences.py:336
+#: aleksis/core/preferences.py:350
 msgid "Fields on person model which are editable by themselves."
 msgstr ""
 
-#: aleksis/core/preferences.py:350
+#: aleksis/core/preferences.py:364
 msgid "Editable fields on person model which should trigger a notification on change"
 msgstr ""
 
-#: aleksis/core/preferences.py:363
+#: aleksis/core/preferences.py:377
 msgid "Contact for notification if a person changes their data"
 msgstr ""
 
-#: aleksis/core/preferences.py:373
+#: aleksis/core/preferences.py:387
 msgid "PDF file expiration duration"
 msgstr ""
 
-#: aleksis/core/preferences.py:374
+#: aleksis/core/preferences.py:388
 msgid "in minutes"
 msgstr ""
 
-#: aleksis/core/preferences.py:384
+#: aleksis/core/preferences.py:398
 msgid "Automatically update the dashboard and its widgets"
 msgstr ""
 
-#: aleksis/core/preferences.py:394
+#: aleksis/core/preferences.py:408
 msgid "Automatically update the dashboard and its widgets sitewide"
 msgstr ""
 
-#: aleksis/core/settings.py:452
+#: aleksis/core/settings.py:474
 msgid "English"
 msgstr ""
 
-#: aleksis/core/settings.py:453
+#: aleksis/core/settings.py:475
 msgid "German"
 msgstr ""
 
@@ -1090,23 +1119,24 @@ msgstr ""
 #: aleksis/core/templates/core/announcement/list.html:36
 #: aleksis/core/templates/core/group/full.html:24
 #: aleksis/core/templates/core/person/full.html:23
-#: aleksis/core/templates/oauth2_provider/application_detail.html:17
+#: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
 msgstr ""
 
 #: aleksis/core/tables.py:21 aleksis/core/tables.py:89
+#: aleksis/core/tables.py:105
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
 msgstr ""
 
 #: aleksis/core/tables.py:56 aleksis/core/tables.py:57
 #: aleksis/core/tables.py:71 aleksis/core/tables.py:87
+#: aleksis/core/tables.py:103
 #: 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:30
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:20
-#: aleksis/core/templates/oauth2_provider/application_detail.html:21
+#: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
 msgstr ""
 
@@ -1423,19 +1453,19 @@ msgstr ""
 msgid "There are no announcements."
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:60
+#: aleksis/core/templates/core/base.html:78
 msgid "Logged in as"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:154
+#: aleksis/core/templates/core/base.html:175
 msgid "About AlekSIS — The Free School Information System"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:162
+#: aleksis/core/templates/core/base.html:183
 msgid "Impress"
 msgstr ""
 
-#: aleksis/core/templates/core/base.html:170
+#: aleksis/core/templates/core/base.html:191
 msgid "Privacy Policy"
 msgstr ""
 
@@ -1626,7 +1656,7 @@ msgstr ""
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
-#: aleksis/core/templates/oauth2_provider/application_detail.html:9
+#: aleksis/core/templates/oauth2_provider/application/detail.html:9
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
@@ -1983,6 +2013,51 @@ msgid ""
 "          "
 msgstr ""
 
+#: aleksis/core/templates/core/perms/assign.html:12
+#: aleksis/core/templates/core/perms/assign.html:13
+msgid "Assign permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:17
+msgid "Selected permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/assign.html:26
+msgid "Assign"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:21
+msgid "Assign a new permission"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:25
+msgid "Select"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:34
+msgid "Global (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:38
+msgid "Global (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:42
+msgid "Object (user)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:46
+msgid "Object (group)"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:52
+msgid "Filter permissions"
+msgstr ""
+
+#: aleksis/core/templates/core/perms/list.html:58
+msgid "Update"
+msgstr ""
+
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
@@ -2004,7 +2079,7 @@ msgstr ""
 msgid "Contact details"
 msgstr ""
 
-#: aleksis/core/templates/core/person/full.html:130
+#: aleksis/core/templates/core/person/full.html:131
 msgid "Children"
 msgstr ""
 
@@ -2044,60 +2119,56 @@ msgstr ""
 msgid "Save preferences"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:5
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:6
-msgid "Delete application"
+#: aleksis/core/templates/oauth2_provider/application/create.html:5
+#: aleksis/core/templates/oauth2_provider/application/create.html:6
+msgid "Register OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:12
-#, python-format
-msgid "Are you sure to delete the application %(application_name)s?"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_confirm_delete.html:24
-#: aleksis/core/templates/oauth2_provider/application_form.html:18
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:27
+#: aleksis/core/templates/oauth2_provider/application/detail.html:5
+msgid "OAuth2 Application"
+msgstr ""
+
+#: aleksis/core/templates/oauth2_provider/application/detail.html:27
 msgid "Client id"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:35
+#: aleksis/core/templates/oauth2_provider/application/detail.html:35
 msgid "Client secret"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:43
+#: aleksis/core/templates/oauth2_provider/application/detail.html:43
 msgid "Client type"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:51
-msgid "Authorization Grant Type"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:51
+msgid "Allowed scopes"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_detail.html:59
+#: aleksis/core/templates/oauth2_provider/application/detail.html:59
 msgid "Redirect URIs"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_form.html:5
-msgid "Create OAuth2 Application"
-msgstr ""
-
-#: aleksis/core/templates/oauth2_provider/application_form.html:10
-msgid "Edit application"
+#: aleksis/core/templates/oauth2_provider/application/detail.html:67
+msgid "Skip Authorisation"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:8
-msgid "OAuth2 applications"
+#: aleksis/core/templates/oauth2_provider/application/edit.html:5
+#: aleksis/core/templates/oauth2_provider/application/edit.html:6
+msgid "Edit OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:12
-msgid "Register new applications"
+#: aleksis/core/templates/oauth2_provider/application/list.html:11
+msgid "Register new application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application_list.html:23
+#: aleksis/core/templates/oauth2_provider/application/list.html:20
 msgid "No applications defined."
 msgstr ""
 
@@ -2724,107 +2795,127 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:251
+#: aleksis/core/views.py:270
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:263
+#: aleksis/core/views.py:282
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:387
+#: aleksis/core/views.py:406
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:406 aleksis/core/views.py:416
+#: aleksis/core/views.py:425 aleksis/core/views.py:435
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:466
+#: aleksis/core/views.py:485
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:563
+#: aleksis/core/views.py:582
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:579
+#: aleksis/core/views.py:598
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:663
+#: aleksis/core/views.py:682
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:687
+#: aleksis/core/views.py:706
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:701
+#: aleksis/core/views.py:720
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:733
+#: aleksis/core/views.py:752
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:767
+#: aleksis/core/views.py:786
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:792
+#: aleksis/core/views.py:811
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:822
+#: aleksis/core/views.py:841
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:855
+#: aleksis/core/views.py:874
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:856
+#: aleksis/core/views.py:875
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:857
+#: aleksis/core/views.py:876
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:858
+#: aleksis/core/views.py:877
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:874
+#: aleksis/core/views.py:893
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:916
+#: aleksis/core/views.py:935
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:946
+#: aleksis/core/views.py:965
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:956
+#: aleksis/core/views.py:975
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1023
+#: aleksis/core/views.py:1042
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1025
+#: aleksis/core/views.py:1044
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1153
+#: aleksis/core/views.py:1139
+msgid "We have successfully assigned the permissions."
+msgstr ""
+
+#: aleksis/core/views.py:1149
+msgid "The global user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1159
+msgid "The global group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1169
+msgid "The object user permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1179
+msgid "The object group permission has been deleted."
+msgstr ""
+
+#: aleksis/core/views.py:1298
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1160
+#: aleksis/core/views.py:1305
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
index dc6d028e5442a3666f35a7cb46e39e5c01cdd3f9..2458849847f712fe1cf63743640716c5b3ef561a 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-10-28 16:18+0200\n"
+"POT-Creation-Date: 2021-11-29 09:59+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"