diff --git a/aleksis/core/frontend/app/apollo.js b/aleksis/core/frontend/app/apollo.js
index 10f63e2d5e48e0383af2d07fdd4f33259ee5a119..c14ba118d0c4d14558f23a747a98b207067ff7b2 100644
--- a/aleksis/core/frontend/app/apollo.js
+++ b/aleksis/core/frontend/app/apollo.js
@@ -8,8 +8,6 @@ import { RetryLink } from "@/apollo-link-retry";
 import { persistCache, LocalStorageWrapper } from "@/apollo3-cache-persist";
 import { InMemoryCache } from "@/apollo-cache-inmemory";
 
-import gql from "@/graphql-tag";
-
 // Cache for GraphQL query results in memory and persistent across sessions
 const cache = new InMemoryCache();
 await persistCache({
@@ -63,7 +61,12 @@ const apolloOpts = {
       error: ({ graphQLErrors, networkError }, vm) => {
         if (graphQLErrors) {
           for (let err of graphQLErrors) {
-            console.error("GraphQL query error in query", err.path.join(".") , ":", err.message);
+            console.error(
+              "GraphQL query error in query",
+              err.path.join("."),
+              ":",
+              err.message
+            );
           }
           // Add a snackbar on all errors returned by the GraphQL endpoint
           //  If App is offline, don't add snackbar since only the ping query is active
diff --git a/aleksis/core/frontend/components/app/AccountMenu.vue b/aleksis/core/frontend/components/app/AccountMenu.vue
index 4e140982b673f35b60073f6e282c549e73811cfa..70e8c52fa770b743c138c6212f296b223be83340 100644
--- a/aleksis/core/frontend/components/app/AccountMenu.vue
+++ b/aleksis/core/frontend/components/app/AccountMenu.vue
@@ -66,6 +66,7 @@ export default {
     accountMenu: {
       type: Array,
       required: false,
+      default: () => [],
     },
     systemProperties: {
       type: Object,
diff --git a/aleksis/core/frontend/components/app/App.vue b/aleksis/core/frontend/components/app/App.vue
index 37329222811eb567e857c4fa4a4155c73849a67a..c86e5910a1797bc675973d198f80ce9bd4116c9c 100644
--- a/aleksis/core/frontend/components/app/App.vue
+++ b/aleksis/core/frontend/components/app/App.vue
@@ -116,10 +116,7 @@
           <div v-if="footerMenu && footerMenu.items">
             <v-card-text class="pa-0">
               <v-container class="px-6">
-                <v-row
-                  justify="center"
-                  no-gutters
-                >
+                <v-row justify="center" no-gutters>
                   <v-btn
                     v-for="menu_item in footerMenu.items"
                     :key="menu_item.name"
@@ -186,7 +183,7 @@
       :snackbar-item="item"
     />
     <v-snackbar v-model="needRefresh" v-if="!refreshDismissed" timeout="-1">
-      {{ $t("service_worker.new_version_available") }}  
+      {{ $t("service_worker.new_version_available") }}
 
       <template #action="{ attrs }">
         <v-btn color="primary" text @click="updateServiceWorker()">
diff --git a/aleksis/core/frontend/components/app/ErrorPage.vue b/aleksis/core/frontend/components/app/ErrorPage.vue
index 7de45dac644f794317d754d96f4020d5b54a9e94..abbf6a6cd828e5673c999032cc285c83b71d6a0b 100644
--- a/aleksis/core/frontend/components/app/ErrorPage.vue
+++ b/aleksis/core/frontend/components/app/ErrorPage.vue
@@ -16,9 +16,15 @@
 export default {
   name: "ErrorPage",
   props: {
-    shortErrorMessageKey: String,
-    longErrorMessageKey: String,
-  }
+    shortErrorMessageKey: {
+      type: String,
+      required: true,
+    },
+    longErrorMessageKey: {
+      type: String,
+      required: true,
+    },
+  },
 };
 </script>
 
diff --git a/aleksis/core/frontend/components/app/SideNav.vue b/aleksis/core/frontend/components/app/SideNav.vue
index a9494a92707836be8eb022c5aff731e2b733aa51..79ee3745b7c4fc4199eda657d18482408ad06f29 100644
--- a/aleksis/core/frontend/components/app/SideNav.vue
+++ b/aleksis/core/frontend/components/app/SideNav.vue
@@ -86,7 +86,7 @@ export default {
     SidenavSearch,
   },
   props: {
-    sideNavMenu: { type: Array, required: false },
+    sideNavMenu: { type: Array, required: false, default: null },
     systemProperties: { type: Object, required: true },
     value: { type: Boolean, required: true },
   },
diff --git a/aleksis/core/frontend/components/generic/ObjectOverview.vue b/aleksis/core/frontend/components/generic/ObjectOverview.vue
index 3f400d6bbfa0fcd82d237dcb7e5efd4f81b13f39..d962243e988167f266cf003fd81b01c6e41a0454 100644
--- a/aleksis/core/frontend/components/generic/ObjectOverview.vue
+++ b/aleksis/core/frontend/components/generic/ObjectOverview.vue
@@ -3,15 +3,14 @@
     <slot name="loading" v-if="$apollo.queries.object.loading"></slot>
     <slot v-else-if="object" v-bind="object"></slot>
     <error-page
-        v-else
-        :shortErrorMessageKey="shortErrorMessageKey"
-        :longErrorMessageKey="longErrorMessageKey"
+      v-else
+      :short-error-message-key="shortErrorMessageKey"
+      :long-error-message-key="longErrorMessageKey"
     />
   </div>
 </template>
 
 <script>
-
 export default {
   name: "ObjectOverview",
   props: {
@@ -37,9 +36,11 @@ export default {
   methods: {
     getTitleAttr(obj) {
       let tmpObj = obj;
-      this.titleAttr.split(".").forEach((attr) => {tmpObj = tmpObj[attr]})
+      this.titleAttr.split(".").forEach((attr) => {
+        tmpObj = tmpObj[attr];
+      });
       return tmpObj;
-    }
+    },
   },
   apollo: {
     object() {
@@ -53,18 +54,16 @@ export default {
           }
           return {};
         },
-        result({data}) {
+        result({ data }) {
           if (data && data.object) {
             this.$root.$setPageTitle(this.getTitleAttr(data.object));
           }
         },
-        error() {}
+        error() {},
       };
     },
   },
-}
+};
 </script>
 
-<style scoped>
-
-</style>
+<style scoped></style>
diff --git a/aleksis/core/frontend/components/person/PersonOverview.vue b/aleksis/core/frontend/components/person/PersonOverview.vue
index 5171a22f0ed594bb849d82d8bab671db7e1207ec..2bddfe2cba739e4f21d09cb265dcbfe5ee4cfdfe 100644
--- a/aleksis/core/frontend/components/person/PersonOverview.vue
+++ b/aleksis/core/frontend/components/person/PersonOverview.vue
@@ -1,8 +1,5 @@
 <template>
-  <object-overview
-      :query="query"
-      title-attr="fullName"
-  >
+  <object-overview :query="query" title-attr="fullName">
     <template #loading>
       <v-skeleton-loader type="article" />
 
@@ -12,7 +9,7 @@
         </v-col>
       </v-row>
     </template>
-    <template v-slot="person">
+    <template #default="person">
       <detail-view>
         <template #avatarContent>
           <person-avatar-clickbox :id="id" />
@@ -218,7 +215,7 @@ export default {
   data() {
     return {
       query: gqlPersonOverview,
-    }
+    };
   },
   props: {
     id: {
diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js
index 29b41db349774e51639c3f18643d3292abfd5a27..ef66ecf6576ed1d7d4581639a65b5607c7a75dc5 100644
--- a/aleksis/core/frontend/index.js
+++ b/aleksis/core/frontend/index.js
@@ -13,7 +13,9 @@ import VueApollo from "@/vue-apollo";
 import AleksisVue from "./plugins/aleksis.js";
 
 console.info("🎒 Welcome to AlekSIS®, the Free School Information System!");
-console.info("AlekSIS® is Free Software, licenced under the EUPL, version 1.2 or later, by Teckids e.V. (Bonn, Germany)");
+console.info(
+  "AlekSIS® is Free Software, licenced under the EUPL, version 1.2 or later, by Teckids e.V. (Bonn, Germany)"
+);
 
 // Install the AleksisVue plugin first and let it do early setup
 Vue.use(AleksisVue);
diff --git a/aleksis/core/frontend/plugins/aleksis.js b/aleksis/core/frontend/plugins/aleksis.js
index 9b2207585600a6154fcb8aaf01f1e07c25e7d4c8..8c221c6d62953206b501aa7c7d949e808d2e63cd 100644
--- a/aleksis/core/frontend/plugins/aleksis.js
+++ b/aleksis/core/frontend/plugins/aleksis.js
@@ -29,7 +29,7 @@ AleksisVue.install = function (Vue) {
    */
   Vue.$configureSentry = function (router) {
     if (Vue.$aleksisFrontendSettings.sentry.enabled) {
-      import("../app/sentry.js").then(mod => {
+      import("../app/sentry.js").then((mod) => {
         mod.default.Sentry.init({
           Vue,
           dsn: Vue.$aleksisFrontendSettings.sentry.dsn,
@@ -39,7 +39,8 @@ AleksisVue.install = function (Vue) {
           logError: true,
           integrations: [
             new mod.default.BrowserTracing({
-              routingInstrumentation: Sentry.vueRouterInstrumentation(router),
+              routingInstrumentation:
+                mod.default.Sentry.vueRouterInstrumentation(router),
             }),
           ],
         });
@@ -72,7 +73,7 @@ AleksisVue.install = function (Vue) {
     Vue.component("ButtonMenu", () =>
       import("../components/generic/ButtonMenu.vue")
     );
-    Vue.component("ErrorPage", () => import("../components/app/ErrorPage.vue"))
+    Vue.component("ErrorPage", () => import("../components/app/ErrorPage.vue"));
   };
 
   /**
diff --git a/aleksis/core/frontend/routes.js b/aleksis/core/frontend/routes.js
index bf8ec6be934fa7675ed2ef1aaf33f463d5fa150b..b3ca0df952023bd1759920e485539693d615d899 100644
--- a/aleksis/core/frontend/routes.js
+++ b/aleksis/core/frontend/routes.js
@@ -782,7 +782,7 @@ const routes = [
 //  and generates importing code at bundle time.
 for (const [appName, appRoutes] of Object.entries(appObjects)) {
   routes.push({
-  	...appRoutes,
+    ...appRoutes,
     path: `/app/${appName}`,
     component: () => import("./components/Parent.vue"),
     name: `${appName}`,
@@ -794,7 +794,10 @@ routes.push({
   path: "/*",
   component: () => import("./components/app/ErrorPage.vue"),
   name: "core.error404",
-  props: { shortErrorMessageKey: "network_errors.error_404", longErrorMessageKey: "network_errors.page_not_found" },
+  props: {
+    shortErrorMessageKey: "network_errors.error_404",
+    longErrorMessageKey: "network_errors.page_not_found",
+  },
 });
 
 export default routes;
diff --git a/aleksis/core/tests/browser/test_selenium.py b/aleksis/core/tests/browser/test_selenium.py
index 5e9c4dfa3fc52ccdb582a7ab8d9862018e211032..e35fc5bd59eb83527c1efc3649a3109b894ebd05 100644
--- a/aleksis/core/tests/browser/test_selenium.py
+++ b/aleksis/core/tests/browser/test_selenium.py
@@ -83,9 +83,11 @@ class SeleniumTests(SeleniumTestCase):
         # Should redirect away from login page and not put up an alert about wrong credentials
         assert "Please enter a correct username and password." not in self.selenium.page_source
 
-    def test_pdf_generation(self):
-        self._login()
-        self._create_person()
-        self.selenium.get(self.live_server_url + reverse("test_pdf"))
-        el = WebDriverWait(self.selenium, 20).until(lambda d: ".pdf" in self.selenium.current_url)
-        self._screenshot("pdf.png")
+    # Deactivated for now as Selenium test infrastructure needs a complete rethinking
+    # because of the new Vue frontend
+    # def test_pdf_generation(self):
+    #     self._login()
+    #     self._create_person()
+    #     self.selenium.get(self.live_server_url + reverse("test_pdf"))
+    #     el = WebDriverWait(self.selenium, 20).until(lambda d: ".pdf" in self.selenium.current_url)
+    #     self._screenshot("pdf.png")