diff --git a/aleksis/apps/matrix/models.py b/aleksis/apps/matrix/models.py
index 9270c6151c570d8345828a470c1f941fe7b25a2e..5d9d467a1b2cbca777a8fa7d14b13de19b39cdbc 100644
--- a/aleksis/apps/matrix/models.py
+++ b/aleksis/apps/matrix/models.py
@@ -6,11 +6,12 @@ from django.db.models import Q
 from django.template.defaultfilters import slugify
 from django.utils.translation import gettext_lazy as _
 
-from aleksis.apps.matrix.matrix import do_matrix_request
 from aleksis.core.mixins import ExtensibleModel, ExtensiblePolymorphicModel
 from aleksis.core.models import Group, Person
 from aleksis.core.util.core_helpers import get_site_preferences
 
+from .util.matrix import do_matrix_request
+
 
 class MatrixProfile(ExtensibleModel):
     """Model for a Matrix profile."""
@@ -73,7 +74,7 @@ class MatrixRoom(ExtensiblePolymorphicModel):
     @classmethod
     def from_group(cls, group: Group) -> "MatrixRoom":
         """Create a Matrix room from a group."""
-        from .matrix import MatrixException, do_matrix_request
+        from .util.matrix import MatrixException, do_matrix_request
 
         try:
             room = cls.get_queryset().get(group=group)
@@ -126,7 +127,7 @@ class MatrixRoom(ExtensiblePolymorphicModel):
         invite: Optional[List[str]] = None,
         creation_content: Optional[dict] = None,
     ) -> Dict[str, Any]:
-        from .matrix import do_matrix_request
+        from .util.matrix import do_matrix_request
 
         body = {"preset": "private_chat", "name": name, "room_alias_name": alias}
 
@@ -143,7 +144,7 @@ class MatrixRoom(ExtensiblePolymorphicModel):
     @property
     def power_levels(self) -> Dict[str, int]:
         """Return the power levels for this room."""
-        from aleksis.apps.matrix.matrix import do_matrix_request
+        from .util.matrix import do_matrix_request
 
         r = do_matrix_request("GET", f"rooms/{self.room_id}/state")
 
@@ -154,7 +155,7 @@ class MatrixRoom(ExtensiblePolymorphicModel):
 
     @property
     def members(self) -> List[str]:
-        from aleksis.apps.matrix.matrix import do_matrix_request
+        from .util.matrix import do_matrix_request
 
         r = do_matrix_request(
             "GET", f"rooms/{self.room_id}/members", body={"membership": ["join", "invite"]}
@@ -163,7 +164,7 @@ class MatrixRoom(ExtensiblePolymorphicModel):
 
     def _invite(self, profile: MatrixProfile) -> Dict[str, Any]:
         """Invite a user to this room."""
-        from aleksis.apps.matrix.matrix import do_matrix_request
+        from .util.matrix import do_matrix_request
 
         r = do_matrix_request(
             "POST",
@@ -280,7 +281,7 @@ class MatrixSpace(MatrixRoom):
     @property
     def child_spaces(self) -> List[str]:
         """Get all child spaces of this space."""
-        from aleksis.apps.matrix.matrix import do_matrix_request
+        from .util.matrix import do_matrix_request
 
         r = do_matrix_request("GET", f"rooms/{self.room_id}/state")
         return [c["state_key"] for c in r if c["type"] == "m.space.child"]
diff --git a/aleksis/apps/matrix/tests/test_matrix.py b/aleksis/apps/matrix/tests/test_matrix.py
index 5efb3a1f04be829a4fc86a775d42b4caa987ca56..f5b87bec32eb3db4381dbe1cdb6e51e0561d44e5 100644
--- a/aleksis/apps/matrix/tests/test_matrix.py
+++ b/aleksis/apps/matrix/tests/test_matrix.py
@@ -7,8 +7,13 @@ import pytest
 import requests
 from celery.result import AsyncResult
 
-from aleksis.apps.matrix.matrix import do_matrix_request
 from aleksis.apps.matrix.models import MatrixProfile, MatrixRoom, MatrixSpace
+from aleksis.apps.matrix.util.matrix import (
+    MatrixException,
+    build_url,
+    do_matrix_request,
+    get_headers,
+)
 from aleksis.core.models import Group, Person, SchoolTerm
 from aleksis.core.util.core_helpers import get_site_preferences
 
@@ -27,8 +32,6 @@ def test_connection(synapse):
 @pytest.fixture
 def matrix_bot_user(synapse):
 
-    from aleksis.apps.matrix.matrix import build_url
-
     body = {"username": "aleksis-bot", "password": "test", "auth": {"type": "m.login.dummy"}}
 
     get_site_preferences()["matrix__homeserver"] = SERVER_URL
@@ -52,8 +55,6 @@ def test_matrix_bot_user(matrix_bot_user):
 
 
 def test_create_room_for_group(matrix_bot_user):
-    from aleksis.apps.matrix.matrix import build_url, get_headers
-
     g = Group.objects.create(name="Test Room")
     assert not MatrixRoom.objects.all().exists()
     room = MatrixRoom.from_group(g)
@@ -79,8 +80,6 @@ def test_create_room_for_group_short_name(matrix_bot_user):
 
 
 def test_room_alias_collision_same_name(matrix_bot_user):
-    from aleksis.apps.matrix.matrix import MatrixException
-
     g1 = Group.objects.create(name="Test Room")
     g2 = Group.objects.create(name="test-room")
     g3 = Group.objects.create(name="Test-Room")
@@ -123,8 +122,6 @@ def test_room_alias_collision_school_term(matrix_bot_user):
 
 
 def test_sync_room_members(matrix_bot_user):
-    from aleksis.apps.matrix.matrix import build_url, get_headers
-
     get_site_preferences()["matrix__homeserver_ids"] = "matrix.aleksis.example.org"
 
     g = Group.objects.create(name="Test Room")
@@ -235,8 +232,6 @@ def test_sync_room_members_without_homeserver(matrix_bot_user):
 
 
 def test_use_room_sync(matrix_bot_user):
-    from aleksis.apps.matrix.matrix import build_url, get_headers
-
     get_site_preferences()["matrix__homeserver_ids"] = "matrix.aleksis.example.org"
 
     g = Group.objects.create(name="Test Room")
diff --git a/aleksis/apps/matrix/matrix.py b/aleksis/apps/matrix/util/matrix.py
similarity index 100%
rename from aleksis/apps/matrix/matrix.py
rename to aleksis/apps/matrix/util/matrix.py