diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 4fa7c521d2265157ca19e7e1863c7fba9e763858..e9c9c0c9f1494a2a28cc3c839a98749d489e82cf 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,7 +9,31 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
-Changes
+Fixed
+~~~~~
+
+* Notifications were not properly shown in the frontend.
+* When navigating from legacy to legacy page, the latter would reload once for no reason.
+
+`3.1.1` - 2023-07-01
+--------------------
+
+Fixed
+~~~~~
+
+* Progress page didn't work properly.
+* About page failed to load for apps with an unknown licence.
+* QUeries for persons with partial permissions failed.
+* Some pages couldn't be scrolled when a task progress popup was open.
+* Notification query failed on admin users without persons.
+* Querying for notification caused unnecessary database requests.
+* Loading bar didn't disappear on some pages after loading was finished.
+* Support newer versions of django-oauth-toolkit.
+
+`3.1`_ - 2023-05-30
+-------------------
+
+Changed
 ~~~~~~~
 
 * The frontend is now able to display headings in the main toolbar.
@@ -17,16 +41,16 @@ Changes
 Fixed
 ~~~~~
 
-* Default translations from vuetify were not loaded.
+* Default translations from Vuetify were not loaded.
 * Browser locale was not the default locale in the entire frontend.
-* In some cases, some items in the sidenav menu were not shown due to its height being higher than the visible page area.
-* The search bar in the sidenav menu is shown even though the user has no permission to see it.
-* Add permission check to accept invitation menu point in order to hide it when this feature is disabled.
+* In some cases, items in the sidenav menu were not shown.
+* The search bar in the sidenav menu was shown even though the user had no permission to see it.
+* Accept invitation menu item was shown when the invitation feature was disabled.
 * Metrics endpoint for Prometheus was at the wrong URL.
-* Polling behavior of the whoAmI and permission queries was fixed.
+* Polling behavior of the whoAmI and permission queries was improved.
 * Confirmation e-mail contained a wrong link.
 
-`3.0`_ - 2022-05-11
+`3.0`_ - 2023-05-11
 -------------------
 
 Added
@@ -69,7 +93,7 @@ Fixed
 * Backend cleanup task for Celery wasn't working.
 * URLs in invitation email were broken.
 * Invitation view didn't work.
-* Invitation emails were using wrong styling. 
+* Invitation emails were using wrong styling.
 * GraphQL queries and mutations did not log exceptions.
 
 `3.0b3`_ - 2023-03-19
@@ -1115,50 +1139,52 @@ Fixed
 .. _Keep a Changelog: https://keepachangelog.com/en/1.0.0/
 .. _Semantic Versioning: https://semver.org/spec/v2.0.0.html
 
-.. _1.0a1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/1.0a1
-.. _1.0a2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/1.0a2
-.. _1.0a4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/1.0a4
-.. _2.0a1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0a1
-.. _2.0a2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0a2
-.. _2.0b0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0b0
-.. _2.0b1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0b1
-.. _2.0b2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0b2
-.. _2.0rc1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc1
-.. _2.0rc2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc2
-.. _2.0rc3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc3
-.. _2.0rc4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc4
-.. _2.0rc5: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc5
-.. _2.0rc6: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc6
-.. _2.0rc7: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc7
-.. _2.0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0
-.. _2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1
-.. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1.1
-.. _2.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2
-.. _2.2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2.1
-.. _2.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.3
-.. _2.3.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.3.1
-.. _2.4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.4
-.. _2.5: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.5
-.. _2.6: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.6
-.. _2.7: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7
-.. _2.7.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.1
-.. _2.7.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.2
-.. _2.7.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.3
-.. _2.7.4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.4
-.. _2.8: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.8
-.. _2.8.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.8.1
-.. _2.9: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.9
-.. _2.10: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.10
-.. _2.10.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.10.1
-.. _2.10.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.10.2
-.. _2.11: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.11
-.. _2.11.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.11.1
-.. _2.12: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12
-.. _2.12.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.1
-.. _2.12.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.2
-.. _2.12.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.3
-.. _3.0b0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b0
-.. _3.0b1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b1
-.. _3.0b2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b2
-.. _3.0b3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0b3
-.. _3.0: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/3.0
+.. _1.0a1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/1.0a1
+.. _1.0a2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/1.0a2
+.. _1.0a4: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/1.0a4
+.. _2.0a1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0a1
+.. _2.0a2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0a2
+.. _2.0b0: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0b0
+.. _2.0b1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0b1
+.. _2.0b2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0b2
+.. _2.0rc1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc1
+.. _2.0rc2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc2
+.. _2.0rc3: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc3
+.. _2.0rc4: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc4
+.. _2.0rc5: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc5
+.. _2.0rc6: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc6
+.. _2.0rc7: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0rc7
+.. _2.0: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.0
+.. _2.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.1
+.. _2.1.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.1.1
+.. _2.2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.2
+.. _2.2.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.2.1
+.. _2.3: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.3
+.. _2.3.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.3.1
+.. _2.4: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.4
+.. _2.5: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.5
+.. _2.6: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.6
+.. _2.7: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.7
+.. _2.7.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.7.1
+.. _2.7.2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.7.2
+.. _2.7.3: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.7.3
+.. _2.7.4: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.7.4
+.. _2.8: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.8
+.. _2.8.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.8.1
+.. _2.9: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.9
+.. _2.10: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.10
+.. _2.10.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.10.1
+.. _2.10.2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.10.2
+.. _2.11: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.11
+.. _2.11.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.11.1
+.. _2.12: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.12
+.. _2.12.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.12.1
+.. _2.12.2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.12.2
+.. _2.12.3: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/2.12.3
+.. _3.0b0: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.0b0
+.. _3.0b1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.0b1
+.. _3.0b2: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.0b2
+.. _3.0b3: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.0b3
+.. _3.0: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.0
+.. _3.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.1
+.. _3.1.1: https://edugit.org/AlekSIS/official/AlekSIS-Core/-/tags/3.1.1
diff --git a/aleksis/core/frontend/components/LegacyBaseTemplate.vue b/aleksis/core/frontend/components/LegacyBaseTemplate.vue
index 790fc10c592bac5acc1e3bbadabcae63e065804f..a0521f07ab974428f9bc2cfe0722874d485c6c54 100644
--- a/aleksis/core/frontend/components/LegacyBaseTemplate.vue
+++ b/aleksis/core/frontend/components/LegacyBaseTemplate.vue
@@ -21,7 +21,7 @@
   </message-box>
   <iframe
     v-else
-    :src="'/django' + $route.path + queryString"
+    :src="iFrameSrc"
     :height="iFrameHeight + 'px'"
     class="iframe-fullsize"
     @load="load"
@@ -41,6 +41,7 @@ export default {
   data: function () {
     return {
       iFrameHeight: 0,
+      iFrameSrc: undefined,
     };
   },
   computed: {
@@ -53,13 +54,16 @@ export default {
     },
   },
   methods: {
+    getIFrameURL() {
+      const location = this.$refs.contentIFrame.contentWindow.location;
+      const url = new URL(location);
+      return url;
+    },
     /** Handle iframe data after inner page loaded */
     load() {
       // Write new location of iframe back to Vue Router
-      const location = this.$refs.contentIFrame.contentWindow.location;
-      const url = new URL(location);
-      const path = url.pathname.replace(/^\/django/, "");
-      const pathWithQueryString = path + encodeURI(url.search);
+      const path = this.getIFrameURL().pathname.replace(/^\/django/, "");
+      const pathWithQueryString = path + encodeURI(this.getIFrameURL().search);
       const routePath =
         path.charAt(path.length - 1) === "/" &&
         this.$route.path.charAt(path.length - 1) !== "/"
@@ -71,7 +75,9 @@ export default {
 
       // Show loader if iframe starts to change its content, even if the $route stays the same
       this.$refs.contentIFrame.contentWindow.onpagehide = () => {
-        this.$root.contentLoading = true;
+        if (this.$root.isLegacyBaseTemplate) {
+          this.$root.contentLoading = true;
+        }
       };
 
       // Write title of iframe to SPA window
@@ -101,15 +107,33 @@ export default {
     },
   },
   watch: {
-    $route() {
+    $route(newRoute) {
       // Show loading animation once route changes
       this.$root.contentLoading = true;
 
+      // Only reload iFrame content when navigation comes from outsite the iFrame
+      const path = this.getIFrameURL().pathname.replace(/^\/django/, "");
+      const routePath =
+        path.charAt(path.length - 1) === "/" &&
+        newRoute.path.charAt(path.length - 1) !== "/"
+          ? newRoute.path + "/"
+          : newRoute.path;
+
+      if (path !== routePath) {
+        this.$refs.contentIFrame.contentWindow.location =
+          "/django" + this.$route.path + this.queryString;
+      } else {
+        this.$root.contentLoading = false;
+      }
+
       // Scroll to top only when route changes to not affect form submits etc.
       // A small duration to avoid flashing of the UI
       this.$vuetify.goTo(0, { duration: 10 });
     },
   },
+  mounted() {
+    this.iFrameSrc = "/django" + this.$route.path + this.queryString;
+  },
   name: "LegacyBaseTemplate",
 };
 </script>
diff --git a/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue b/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue
index 912fb779241ef577c6f900abc78a26008df008f6..1866c3d819ace7f6d329926f6dbe7bdc3b9b0276 100644
--- a/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue
+++ b/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue
@@ -1,5 +1,11 @@
 <template>
-  <v-bottom-sheet :value="show" persistent hide-overlay max-width="400px">
+  <v-bottom-sheet
+    :value="show"
+    persistent
+    hide-overlay
+    max-width="400px"
+    ref="sheet"
+  >
     <v-expansion-panels accordion v-model="open">
       <v-expansion-panel>
         <v-expansion-panel-header color="primary" class="white--text px-4">
@@ -33,6 +39,13 @@ export default {
   data() {
     return { open: 0 };
   },
+  mounted() {
+    // Vuetify uses the hideScroll method to disable scrolling by setting an event listener
+    // to the window. As event listeners can only be removed by referencing the listener
+    // method and because vuetify this method is called on every state change of the dialog,
+    // we simply replace the method in this component instance
+    this.$refs.sheet.hideScroll = this.$refs.sheet.showScroll;
+  },
   computed: {
     show() {
       return this.celeryProgressByUser && this.celeryProgressByUser.length > 0;
diff --git a/aleksis/core/frontend/components/notifications/NotificationList.vue b/aleksis/core/frontend/components/notifications/NotificationList.vue
index 1c51c00661816fe3e244e6d511a0e70c747dbca6..e48d9f2c203a2d2730af1a7208f3590667ede7bf 100644
--- a/aleksis/core/frontend/components/notifications/NotificationList.vue
+++ b/aleksis/core/frontend/components/notifications/NotificationList.vue
@@ -20,7 +20,7 @@
           v-if="
             myNotifications &&
             myNotifications.person &&
-            myNotifications.person.unreadNotificationsCount > 0
+            unreadNotifications.length > 0
           "
         >
           mdi-bell-badge-outline
@@ -86,5 +86,12 @@ export default {
       pollInterval: 30000,
     },
   },
+  computed: {
+    unreadNotifications() {
+      return this.myNotifications.person.notifications
+        ? this.myNotifications.person.notifications.filter((n) => !n.read)
+        : [];
+    },
+  },
 };
 </script>
diff --git a/aleksis/core/frontend/components/notifications/myNotifications.graphql b/aleksis/core/frontend/components/notifications/myNotifications.graphql
index b8287ea2f50664f556d82bdb58e4b508c7ece1d4..89e91562086607e6c9e7649fa1295d234d189bd3 100644
--- a/aleksis/core/frontend/components/notifications/myNotifications.graphql
+++ b/aleksis/core/frontend/components/notifications/myNotifications.graphql
@@ -1,7 +1,6 @@
 {
   myNotifications: whoAmI {
     person {
-      unreadNotificationsCount
       notifications {
         id
         title
diff --git a/aleksis/core/migrations/0049_oauthapplication_post_logout_redirect_uris.py b/aleksis/core/migrations/0049_oauthapplication_post_logout_redirect_uris.py
new file mode 100644
index 0000000000000000000000000000000000000000..a14526b2f0c32077e873c9b3bcd0cb21ee9e0cd6
--- /dev/null
+++ b/aleksis/core/migrations/0049_oauthapplication_post_logout_redirect_uris.py
@@ -0,0 +1,21 @@
+# Generated by Django 4.1.9 on 2023-06-17 10:59
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("sites", "0002_alter_domain_unique"),
+        ("core", "0048_delete_personalicalurl"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="oauthapplication",
+            name="post_logout_redirect_uris",
+            field=models.TextField(
+                blank=True, help_text="Allowed Post Logout URIs list, space separated"
+            ),
+        ),
+    ]
diff --git a/aleksis/core/schema/celery_progress.py b/aleksis/core/schema/celery_progress.py
index 5502b3317c47841c7ef02e9e5165db9ef37fe338..d03a8081d9560d0b5a4da6707c80f963fde6358d 100644
--- a/aleksis/core/schema/celery_progress.py
+++ b/aleksis/core/schema/celery_progress.py
@@ -88,7 +88,7 @@ class CeleryProgressFetchedMutation(graphene.Mutation):
     celery_progress = graphene.Field(CeleryProgressType)
 
     def mutate(root, info, task_id, **kwargs):
-        task = TaskUserAssignment.objects.filter(task_result__task_id=task_id)
+        task = TaskUserAssignment.objects.get(task_result__task_id=task_id)
 
         if not info.context.user.has_perm("core.view_progress_rule", task):
             return None
diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py
index 6eed201487348034b2d9b1cba616046b1794dbf2..90165cceb0fb33676e17aad5caf978ce7c124be5 100644
--- a/aleksis/core/schema/person.py
+++ b/aleksis/core/schema/person.py
@@ -55,14 +55,26 @@ class PersonType(DjangoObjectType):
     full_name = graphene.String()
     username = graphene.String()
     userid = graphene.ID()
-    photo = graphene.Field(FieldFileType)
-    avatar = graphene.Field(FieldFileType)
+    photo = graphene.Field(FieldFileType, required=False)
+    avatar = graphene.Field(FieldFileType, required=False)
     avatar_url = graphene.String()
     avatar_content_url = graphene.String()
-    secondary_image_url = graphene.String()
+    secondary_image_url = graphene.String(required=False)
+
+    street = graphene.String(required=False)
+    housenumber = graphene.String(required=False)
+    postal_code = graphene.String(required=False)
+    place = graphene.String(required=False)
+
+    phone_number = graphene.String(required=False)
+    mobile_number = graphene.String(required=False)
+    email = graphene.String(required=False)
+
+    date_of_birth = graphene.String(required=False)
+    place_of_birth = graphene.String(required=False)
 
     notifications = graphene.List(NotificationType)
-    unread_notifications_count = graphene.Int()
+    unread_notifications_count = graphene.Int(required=False)
 
     is_dummy = graphene.Boolean()
     preferences = graphene.Field(PersonPreferencesType)
@@ -150,7 +162,11 @@ class PersonType(DjangoObjectType):
         return root.user.id if root.user else None
 
     def resolve_unread_notifications_count(root, info, **kwargs):  # noqa
-        return root.unread_notifications_count
+        if root.pk and has_person(info.context) and root == info.context.user.person:
+            return root.unread_notifications_count
+        elif root.pk:
+            return 0
+        return None
 
     def resolve_photo(root, info, **kwargs):
         if info.context.user.has_perm("core.view_photo_rule", root):
@@ -199,11 +215,11 @@ class PersonType(DjangoObjectType):
         return root.is_dummy if hasattr(root, "is_dummy") else False
 
     def resolve_notifications(root: Person, info, **kwargs):
-        if has_person(info.context.user) and info.context.user.person == root:
+        if root.pk and has_person(info.context) and root == info.context.user.person:
             return root.notifications.filter(send_at__lte=timezone.now()).order_by(
                 "read", "-created"
             )
-        raise PermissionDenied()
+        return []
 
     def resolve_can_edit_person(root, info, **kwargs):  # noqa
         return info.context.user.has_perm("core.edit_person_rule", root)
diff --git a/aleksis/core/util/apps.py b/aleksis/core/util/apps.py
index 0889280858a64a61cd8857a0c6eef4f872012cfc..e370d6b125242381ab53f6c030c62d41c622d0ff 100644
--- a/aleksis/core/util/apps.py
+++ b/aleksis/core/util/apps.py
@@ -87,6 +87,10 @@ class AppConfig(django.apps.AppConfig):
         # Get string representation of licence in SPDX format
         licence = getattr(cls, "licence", None)
 
+        default_flags = {
+            "isFsfLibre": False,
+            "isOsiApproved": False,
+        }
         default_dict = {
             "isDeprecatedLicenseId": False,
             "isFsfLibre": False,
@@ -131,7 +135,7 @@ class AppConfig(django.apps.AppConfig):
             return (readable, flags, licence_dicts)
         else:
             # We could not find a valid licence
-            return ("Unknown", [default_dict])
+            return ("Unknown", default_flags, [default_dict])
 
     @classmethod
     def get_licence_dict(cls):
diff --git a/docs/conf.py b/docs/conf.py
index 3287243f133810dce0b9a34d65d4c9fb2913a89f..919c2ec87fab03d7e7e6c7c982d695f76d559c43 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -25,13 +25,13 @@ django.setup()
 # -- Project information -----------------------------------------------------
 
 project = "AlekSIS-Core"
-copyright = "2019-2022 The AlekSIS team"
+copyright = "2019-2023 The AlekSIS team"
 author = "The AlekSIS Team"
 
 # The short X.Y version
-version = "3.0"
+version = "3.1"
 # The full version, including alpha/beta/rc tags
-release = "3.0.1.dev0"
+release = "3.1.2.dev0"
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/pyproject.toml b/pyproject.toml
index 3445fb1e0e322123b5c006e0086d7e48485be76c..7280e24280a5b7e92cd94957965194ed491d1b1f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-Core"
-version = "3.0.1.dev0"
+version = "3.1.2.dev0"
 packages = [
     { include = "aleksis" }
 ]
@@ -86,7 +86,7 @@ django-celery-beat = "^2.2.0"
 django-celery-email = "^3.0.0"
 django-jsonstore = "^0.5.0"
 django-polymorphic = "^3.0.0"
-django-colorfield = "^0.8.0"
+django-colorfield = "^0.9.0"
 django-bleach = "^3.0.0"
 django-guardian = "^2.2.0"
 rules = "^3.0"
@@ -135,6 +135,7 @@ sentry = ["sentry-sdk"]
 
 [tool.poetry.dev-dependencies]
 aleksis-builddeps = {version=">=2023.1.dev0", allow-prereleases=true}
+selenium = "<4.10.0"
 uwsgi = "^2.0"
 
 [tool.poetry.scripts]