diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index f59634c05cd8297177238be1cb650867766d2b74..496a8968ed6257461a746eb92073ee4525b2bbdd 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -22,6 +22,7 @@ Fixed
 * 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.
 * Metrics endpoint for Prometheus was at the wrong URL.
+* Polling behavior of the whoAmI and permission queries was fixed.
 
 `3.0`_ - 2022-05-11
 -------------------
diff --git a/aleksis/core/frontend/components/app/App.vue b/aleksis/core/frontend/components/app/App.vue
index 6fcf3986af676dd2faab228e2eb3b1349625aed5..f650517ae88d122ea6684de14819c4a5f00cc241 100644
--- a/aleksis/core/frontend/components/app/App.vue
+++ b/aleksis/core/frontend/components/app/App.vue
@@ -246,12 +246,17 @@ export default {
     systemProperties: gqlSystemProperties,
     whoAmI: {
       query: gqlWhoAmI,
+      pollInterval: 30000,
+      result({ data }) {
+        if (data && data.whoAmI) {
+          this.$root.permissions = data.whoAmI.permissions;
+        }
+      },
       variables() {
         return {
-          permissions: this.permissionNames,
+          permissions: this.$root.permissionNames,
         };
       },
-      pollInterval: 10000,
     },
     messages: {
       query: gqlMessages,
diff --git a/aleksis/core/frontend/components/app/SideNav.vue b/aleksis/core/frontend/components/app/SideNav.vue
index 7d486ad7e2aba6cfdb325130710beb9cd39db106..94a7a60309752368e7a4d1d2ce4a05db42b3fd77 100644
--- a/aleksis/core/frontend/components/app/SideNav.vue
+++ b/aleksis/core/frontend/components/app/SideNav.vue
@@ -1,5 +1,10 @@
 <template>
-  <v-navigation-drawer app :value="value" height="100dvh" @input="$emit('input', $event)">
+  <v-navigation-drawer
+    app
+    :value="value"
+    height="100dvh"
+    @input="$emit('input', $event)"
+  >
     <v-list nav dense shaped>
       <v-list-item class="logo">
         <a
@@ -110,7 +115,7 @@ export default {
   },
   mixins: [permissionsMixin],
   mounted() {
-    this.fetchPermissions(["core.search_rule"]);
+    this.addPermissions(["core.search_rule"]);
   },
 };
 </script>
diff --git a/aleksis/core/frontend/components/app/permissions.graphql b/aleksis/core/frontend/components/app/permissions.graphql
deleted file mode 100644
index fcb6133e0afdb78e9a2fb750e1972d64aa0968e7..0000000000000000000000000000000000000000
--- a/aleksis/core/frontend/components/app/permissions.graphql
+++ /dev/null
@@ -1,8 +0,0 @@
-query gqlPermissions($permissions: [String]!) {
-  whoAmI {
-    permissions: globalPermissionsByName(permissions: $permissions) {
-      name
-      result
-    }
-  }
-}
diff --git a/aleksis/core/frontend/components/app/whoAmI.graphql b/aleksis/core/frontend/components/app/whoAmI.graphql
index 57e0292d37ea4d221c9f263621647bfdabe38b6f..fff7344d06817d73a37ede3f8698afaaa06e1ea6 100644
--- a/aleksis/core/frontend/components/app/whoAmI.graphql
+++ b/aleksis/core/frontend/components/app/whoAmI.graphql
@@ -1,4 +1,4 @@
-query whoAmI {
+query whoAmI($permissions: [String]!) {
   whoAmI {
     username
     isAuthenticated
@@ -12,5 +12,9 @@ query whoAmI {
       avatarUrl
       isDummy
     }
+    permissions: globalPermissionsByName(permissions: $permissions) {
+      name
+      result
+    }
   }
 }
diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js
index 11d1a1db0fe3b51703f63a6a668d96aac02f8374..a83d25c67452f1d52e59ff39e7f3ffb6bcd69b55 100644
--- a/aleksis/core/frontend/index.js
+++ b/aleksis/core/frontend/index.js
@@ -73,6 +73,7 @@ const app = new Vue({
     snackbarItems: [],
     toolbarTitle: "AlekSIS®",
     permissions: [],
+    permissionNames: [],
   }),
   computed: {
     matchedComponents() {
diff --git a/aleksis/core/frontend/mixins/menus.js b/aleksis/core/frontend/mixins/menus.js
index 7b6317a5aa3f625501bd51119d0fc4c6f633b379..60ce66b5b0d36efa77cc2b8944ce21e928a1f107 100644
--- a/aleksis/core/frontend/mixins/menus.js
+++ b/aleksis/core/frontend/mixins/menus.js
@@ -37,7 +37,7 @@ const menusMixin = {
         }
       }
 
-      this.fetchPermissions(permArray);
+      this.addPermissions(permArray);
     },
     buildMenu(routes, menuKey) {
       let menu = {};
diff --git a/aleksis/core/frontend/mixins/permissions.js b/aleksis/core/frontend/mixins/permissions.js
index 55bc94f30a39e6712a6e74863b045707c3ae3bba..0f74b4ea857d1aed1ff93956515241538696c5eb 100644
--- a/aleksis/core/frontend/mixins/permissions.js
+++ b/aleksis/core/frontend/mixins/permissions.js
@@ -5,17 +5,6 @@ import gqlPermissions from "../components/app/permissions.graphql";
  */
 
 const permissionsMixin = {
-  apollo: {
-    permissions: {
-      query: gqlPermissions,
-      update(data) {
-        this.$root.permissions = data.whoAmI.permissions;
-      },
-      variables: {
-        permissions: [],
-      },
-    },
-  },
   methods: {
     checkPermission(permissionName) {
       return (
@@ -24,30 +13,16 @@ const permissionsMixin = {
         this.$root.permissions.find((p) => p.name === permissionName).result
       );
     },
-    fetchPermissions(permissionNames) {
-      this.$apollo.queries.permissions.fetchMore({
-        variables: {
-          permissions: permissionNames,
-        },
-        updateQuery: (previousResult, { fetchMoreResult }) => {
-          const oldPermissions = previousResult.whoAmI.permissions;
-          const newPermissions = fetchMoreResult.whoAmI.permissions;
-
-          const keepPermissions = oldPermissions.filter(
-            (oldPermission) =>
-              !newPermissions.find(
-                (newPermission) => newPermission.name === oldPermission.name
-              )
-          );
+    addPermissions(newPermissionNames) {
+      const keepPermissionNames = this.$root.permissionNames.filter(
+        (oldPermName) =>
+          !newPermissionNames.find((newPermName) => newPermName === oldPermName)
+      );
 
-          return {
-            whoAmI: {
-              __typename: previousResult.whoAmI.__typename,
-              permissions: [...keepPermissions, ...newPermissions],
-            },
-          };
-        },
-      });
+      this.$root.permissionNames = [
+        ...keepPermissionNames,
+        ...newPermissionNames,
+      ];
     },
   },
 };