diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d21a88a9d8245fc9e2631a74f3d1b6cb1012f7a9..32f91354f1523062629a2758bb42db9b10aae6d0 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,6 +9,11 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Added
+~~~~~
+
+* Add SPA support.
+
 `1.0`_ - 2022-06-25
 -------------------
 
diff --git a/aleksis/apps/matrix/frontend/index.js b/aleksis/apps/matrix/frontend/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c46c2e60e8078d0912311d8f66462708488c9d5
--- /dev/null
+++ b/aleksis/apps/matrix/frontend/index.js
@@ -0,0 +1,27 @@
+export default
+  {
+    meta: {
+      inMenu: true,
+      titleKey: "matrix.menu_title",
+      icon: "mdi-forum-outline",
+    },
+    props: {
+      byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+    },
+    children: [
+      {
+        path: "rooms/",
+        component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+        name: "matrix.groupsAndRooms",
+        meta: {
+          inMenu: true,
+          titleKey: "matrix.rooms.menu_title",
+          icon: "mdi-account-group-outline",
+          permission: "matrix.view_matrixrooms_rule",
+        },
+        props: {
+          byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+        },
+      },
+    ],
+  }
diff --git a/aleksis/apps/matrix/frontend/messages/de.json b/aleksis/apps/matrix/frontend/messages/de.json
new file mode 100644
index 0000000000000000000000000000000000000000..fcede484e05bc8c4c347ed33cc0e096366cab44c
--- /dev/null
+++ b/aleksis/apps/matrix/frontend/messages/de.json
@@ -0,0 +1,8 @@
+{
+  "matrix": {
+    "menu_title": "Matrix",
+    "rooms": {
+      "menu_title": "Gruppen und Räume"
+    }
+  }
+}
diff --git a/aleksis/apps/matrix/frontend/messages/en.json b/aleksis/apps/matrix/frontend/messages/en.json
new file mode 100644
index 0000000000000000000000000000000000000000..d119675af0fc92c979ac53f3c6b7d04f654c8345
--- /dev/null
+++ b/aleksis/apps/matrix/frontend/messages/en.json
@@ -0,0 +1,8 @@
+{
+  "matrix": {
+    "menu_title": "Matrix",
+    "rooms": {
+      "menu_title": "Groups and Rooms"
+    }
+  }
+}
diff --git a/aleksis/apps/matrix/views.py b/aleksis/apps/matrix/views.py
index f3f9dd9beb7a00337874b19b11606c487890ab7c..53cebb506dc5ab2fa28b07cb570d222ce45962d7 100644
--- a/aleksis/apps/matrix/views.py
+++ b/aleksis/apps/matrix/views.py
@@ -1,3 +1,5 @@
+from django.utils.decorators import method_decorator
+
 from django_filters.views import FilterView
 from django_tables2 import SingleTableMixin
 from guardian.shortcuts import get_objects_for_user
@@ -6,9 +8,11 @@ from rules.contrib.views import PermissionRequiredMixin
 from aleksis.apps.matrix.filters import GroupMatrixRoomFilter
 from aleksis.apps.matrix.forms import GroupMatrixRoomActionForm
 from aleksis.apps.matrix.tables import GroupsMatrixRoomsTable
+from aleksis.core.decorators import pwa_cache
 from aleksis.core.models import Group
 
 
+@method_decorator(pwa_cache, name="dispatch")
 class MatrixRoomListView(PermissionRequiredMixin, SingleTableMixin, FilterView):
     """Overview about groups and their Matrix rooms."""