diff --git a/aleksis/core/assets/app.js b/aleksis/core/assets/app.js
index b8de6e6b40fc9f2639a86c80c4a209bf8be3f520..1f9898cfd01f9f01a2b279b44bde508db1f75c77 100644
--- a/aleksis/core/assets/app.js
+++ b/aleksis/core/assets/app.js
@@ -15,7 +15,7 @@ import { persistCache, LocalStorageWrapper } from "@/apollo3-cache-persist";
 
 import gql from "@/graphql-tag";
 
-import gqlSnackbarItems from "./snackbarItems.graphql";
+import gqlSnackbarItems from "./components/app/snackbarItems.graphql";
 
 import "./css/global.scss";
 import VueI18n from "@/vue-i18n";
@@ -149,7 +149,7 @@ const apolloClient = new ApolloClient({
   link: from([retryLink, errorLink, httpLink]),
 });
 
-import App from "./App.vue";
+import App from "./components/app/App.vue";
 import MessageBox from "./components/MessageBox.vue";
 
 Vue.component(MessageBox.name, MessageBox); // Load MessageBox globally as other components depend on it
diff --git a/aleksis/core/assets/App.vue b/aleksis/core/assets/components/app/App.vue
similarity index 96%
rename from aleksis/core/assets/App.vue
rename to aleksis/core/assets/components/app/App.vue
index 482a944e06786297020a504db6527d87adb307d3..8b36917e3d3242ba32c51707eb62227d20d42437 100644
--- a/aleksis/core/assets/App.vue
+++ b/aleksis/core/assets/components/app/App.vue
@@ -336,14 +336,14 @@
 </template>
 
 <script>
-import BroadcastChannelNotification from "./components/BroadcastChannelNotification.vue";
-import LanguageForm from "./components/LanguageForm.vue";
-import NotificationList from "./components/notifications/NotificationList.vue";
-import SidenavSearch from "./components/SidenavSearch.vue";
-import CeleryProgressBottom from "./components/celery_progress/CeleryProgressBottom.vue";
-import Loading from "./components/Loading.vue";
-import BrandLogo from "./components/BrandLogo.vue";
-import SnackbarItem from "./components/SnackbarItem.vue";
+import BroadcastChannelNotification from "./BroadcastChannelNotification.vue";
+import LanguageForm from "./LanguageForm.vue";
+import NotificationList from "../notifications/NotificationList.vue";
+import SidenavSearch from "./SidenavSearch.vue";
+import CeleryProgressBottom from "../celery_progress/CeleryProgressBottom.vue";
+import Loading from "./Loading.vue";
+import BrandLogo from "./BrandLogo.vue";
+import SnackbarItem from "./SnackbarItem.vue";
 
 import gqlWhoAmI from "./whoAmI.graphql";
 import gqlMessages from "./messages.graphql";
@@ -352,7 +352,7 @@ import gqlCustomMenu from "./customMenu.graphql";
 import gqlSnackbarItems from "./snackbarItems.graphql";
 import gqlPing from "./ping.graphql";
 
-import useRegisterSWMixin from "./mixins/useRegisterSW";
+import useRegisterSWMixin from "../../mixins/useRegisterSW";
 
 export default {
   data() {
diff --git a/aleksis/core/assets/components/BrandLogo.vue b/aleksis/core/assets/components/app/BrandLogo.vue
similarity index 100%
rename from aleksis/core/assets/components/BrandLogo.vue
rename to aleksis/core/assets/components/app/BrandLogo.vue
diff --git a/aleksis/core/assets/components/BroadcastChannelNotification.vue b/aleksis/core/assets/components/app/BroadcastChannelNotification.vue
similarity index 100%
rename from aleksis/core/assets/components/BroadcastChannelNotification.vue
rename to aleksis/core/assets/components/app/BroadcastChannelNotification.vue
diff --git a/aleksis/core/assets/components/Error404.vue b/aleksis/core/assets/components/app/Error404.vue
similarity index 100%
rename from aleksis/core/assets/components/Error404.vue
rename to aleksis/core/assets/components/app/Error404.vue
diff --git a/aleksis/core/assets/components/LanguageForm.vue b/aleksis/core/assets/components/app/LanguageForm.vue
similarity index 100%
rename from aleksis/core/assets/components/LanguageForm.vue
rename to aleksis/core/assets/components/app/LanguageForm.vue
diff --git a/aleksis/core/assets/components/Loading.vue b/aleksis/core/assets/components/app/Loading.vue
similarity index 100%
rename from aleksis/core/assets/components/Loading.vue
rename to aleksis/core/assets/components/app/Loading.vue
diff --git a/aleksis/core/assets/components/SidenavSearch.vue b/aleksis/core/assets/components/app/SidenavSearch.vue
similarity index 97%
rename from aleksis/core/assets/components/SidenavSearch.vue
rename to aleksis/core/assets/components/app/SidenavSearch.vue
index b88440179c75badb2567bd70c0468e3085b17095..5ce0a9b2995bf32ac53c97b44a10a3571a073c7b 100644
--- a/aleksis/core/assets/components/SidenavSearch.vue
+++ b/aleksis/core/assets/components/app/SidenavSearch.vue
@@ -10,6 +10,7 @@ export default {
 </script>
 
 <template>
+  <!-- FIXME Properly import query -->
   <ApolloQuery
     :query="require('./searchSnippets.graphql')"
     :variables="{
diff --git a/aleksis/core/assets/components/SnackbarItem.vue b/aleksis/core/assets/components/app/SnackbarItem.vue
similarity index 90%
rename from aleksis/core/assets/components/SnackbarItem.vue
rename to aleksis/core/assets/components/app/SnackbarItem.vue
index 9213e542db63fe84134f4d64929ac5e200aa8db5..b60ef0e86841c158dd256222d77bc9181ed27210 100644
--- a/aleksis/core/assets/components/SnackbarItem.vue
+++ b/aleksis/core/assets/components/app/SnackbarItem.vue
@@ -10,7 +10,7 @@
 </template>
 
 <script>
-import gqlCheckSnackbarItem from "../checkSnackbarItem.graphql";
+import gqlCheckSnackbarItem from "./checkSnackbarItem.graphql";
 
 export default {
   name: "SnackbarItem",
diff --git a/aleksis/core/assets/checkSnackbarItem.graphql b/aleksis/core/assets/components/app/checkSnackbarItem.graphql
similarity index 100%
rename from aleksis/core/assets/checkSnackbarItem.graphql
rename to aleksis/core/assets/components/app/checkSnackbarItem.graphql
diff --git a/aleksis/core/assets/customMenu.graphql b/aleksis/core/assets/components/app/customMenu.graphql
similarity index 100%
rename from aleksis/core/assets/customMenu.graphql
rename to aleksis/core/assets/components/app/customMenu.graphql
diff --git a/aleksis/core/assets/messages.graphql b/aleksis/core/assets/components/app/messages.graphql
similarity index 100%
rename from aleksis/core/assets/messages.graphql
rename to aleksis/core/assets/components/app/messages.graphql
diff --git a/aleksis/core/assets/ping.graphql b/aleksis/core/assets/components/app/ping.graphql
similarity index 100%
rename from aleksis/core/assets/ping.graphql
rename to aleksis/core/assets/components/app/ping.graphql
diff --git a/aleksis/core/assets/components/searchSnippets.graphql b/aleksis/core/assets/components/app/searchSnippets.graphql
similarity index 100%
rename from aleksis/core/assets/components/searchSnippets.graphql
rename to aleksis/core/assets/components/app/searchSnippets.graphql
diff --git a/aleksis/core/assets/snackbarItems.graphql b/aleksis/core/assets/components/app/snackbarItems.graphql
similarity index 100%
rename from aleksis/core/assets/snackbarItems.graphql
rename to aleksis/core/assets/components/app/snackbarItems.graphql
diff --git a/aleksis/core/assets/systemProperties.graphql b/aleksis/core/assets/components/app/systemProperties.graphql
similarity index 100%
rename from aleksis/core/assets/systemProperties.graphql
rename to aleksis/core/assets/components/app/systemProperties.graphql
diff --git a/aleksis/core/assets/whoAmI.graphql b/aleksis/core/assets/components/app/whoAmI.graphql
similarity index 100%
rename from aleksis/core/assets/whoAmI.graphql
rename to aleksis/core/assets/components/app/whoAmI.graphql
diff --git a/aleksis/core/assets/routes.js b/aleksis/core/assets/routes.js
index 04ad3e767e52075289e45689c56c3dd8c68a96cf..e47a17934bff970b38cb95dd83194973adba83f0 100644
--- a/aleksis/core/assets/routes.js
+++ b/aleksis/core/assets/routes.js
@@ -774,7 +774,7 @@ for (const [appName, appRoutes] of Object.entries(apps)) {
 
 routes.push({
   path: "/*",
-  component: () => import("./components/Error404.vue"),
+  component: () => import("./components/app/Error404.vue"),
   name: "core.error404",
 });