diff --git a/aleksis/apps/matrix/apps.py b/aleksis/apps/matrix/apps.py
index 1c60d9e509f7e8e9af819f274130b8001a473be1..ac659ebee9baf82d72f7597e070489bc8c14eb3d 100644
--- a/aleksis/apps/matrix/apps.py
+++ b/aleksis/apps/matrix/apps.py
@@ -1,3 +1,5 @@
+from django.db.models.signals import post_save
+
 from aleksis.core.util.apps import AppConfig
 
 
@@ -11,3 +13,10 @@ class DefaultConfig(AppConfig):
     }
     licence = "EUPL-1.2+"
     copyright_info = (([2021, 2022], "Jonathan Weth", "dev@jonathanweth.de"),)
+
+    def ready(self):
+        from aleksis.core.models import Group
+
+        from .signals import post_save_matrix_signal
+
+        post_save.connect(post_save_matrix_signal, sender=Group)
diff --git a/aleksis/apps/matrix/signals.py b/aleksis/apps/matrix/signals.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf1296fec2392aab824ba0cdda75ccff11500408
--- /dev/null
+++ b/aleksis/apps/matrix/signals.py
@@ -0,0 +1,12 @@
+from aleksis.apps.matrix.models import MatrixRoom
+
+from .tasks import sync_room
+
+
+def post_save_matrix_signal(sender, instance, created, **kwargs):
+    """Sync Matrix room after changing a group."""
+    if created:
+        return
+
+    for room in MatrixRoom.objects.filter(group=instance):
+        sync_room.delay(room.pk)
diff --git a/aleksis/apps/matrix/tasks.py b/aleksis/apps/matrix/tasks.py
index c7346d8c5eb632fd7255e678cd5ca6aeb4c18075..f61f53b92c69a36505e257a21a61b5077696371c 100644
--- a/aleksis/apps/matrix/tasks.py
+++ b/aleksis/apps/matrix/tasks.py
@@ -1,3 +1,4 @@
+from datetime import timedelta
 from typing import Sequence
 
 from aleksis.apps.matrix.models import MatrixRoom
@@ -25,3 +26,11 @@ def provision_group_in_matrix(pk: int):
     """Provision provided group in Matrix."""
     group = Group.objects.get(pk=pk)
     group._provision_in_matrix()
+
+
+@app.task(run_every=timedelta(days=1))
+def sync_rooms():
+    """Synchronise all Matrix rooms."""
+    rooms = MatrixRoom.objects.all()
+    for room in rooms:
+        room.sync()