diff --git a/src/plugins/converse-rai.js b/src/plugins/converse-rai.js
index 33ba090b4f7ca40518a527f8315368357e2589f6..846ff5102076c50c97cae178e1b3279b0bf62ae5 100644
--- a/src/plugins/converse-rai.js
+++ b/src/plugins/converse-rai.js
@@ -6,6 +6,7 @@
     }
 }(this, function (converse) {
     var Strophe, $iq, $msg, $pres, $build, b64_sha1, _ ,Backbone, dayjs, _converse;
+    var subscribedServers = new Set();
 
     converse.plugins.add("rai", {
         'dependencies': [],
@@ -29,9 +30,7 @@
             });
 
             _converse.api.listen.on('connected', function () {
-                setupRoomActivityIndicators(function (supported) {
-                    if (supported) listenForRoomActivityIndicators();
-                });
+                setupRoomActivityIndicators();
             });
 
             _converse.api.listen.on('chatRoomViewInitialized', function (view)
@@ -103,27 +102,47 @@
         }
     });
 
-    function setupRoomActivityIndicators(callback)
-    {
-        try {
-            const id = Math.random().toString(36).substr(2, 9);
-            const to = "conference." + _converse.domain;
-            _converse.connection.send(converse.env.$pres({
-                to: to,
-                id: id
-            }).c('rai', {
-                'xmlns': "xmpp:prosody.im/protocol/rai"
-            }));
-
-            if (callback) callback(true);
-        } catch (e) {
-            if (callback) callback(false);
+
+    function subscribeServer(server_name) {
+        console.debug("RAI: Subscribing to " + server_name);
+        const id = Math.random().toString(36).substr(2, 9);
+        _converse.connection.send(converse.env.$pres({
+            to: server_name,
+            id: id
+        }).c('rai', {
+            'xmlns': "xmpp:prosody.im/protocol/rai"
+        }));
+    }
+
+    function unsubscribeServer(server_name) {
+        console.debug("RAI: Unsubscribing from " + server_name);
+        _converse.connection.send(converse.env.$pres({
+            to: server_name, type: "unavailable"
+        }).c('rai', {
+            'xmlns': "xmpp:prosody.im/protocol/rai"
+        }));
+    }
+
+    function updateSubscriptions(rooms) {
+        console.debug("RAI: Updating subscriptions")
+        var updated_interesting_servers = new Set(rooms.map(Strophe.getDomainFromJid));
+        var new_servers = new Set([...updated_interesting_servers].filter(server => !subscribedServers.has(server)));
+        var obsolete_servers = new Set([...subscribedServers].filter(server => !updated_interesting_servers.has(server)));
+        console.log("interesting servers", updated_interesting_servers);
+        console.log("current servers", subscribedServers);
+        console.log("new servers", new_servers);
+        console.log("obsolete servers", obsolete_servers);
+        for(let server of obsolete_servers) {
+            unsubscribeServer(server);
+        }
+        for(let server of new_servers) {
+            subscribeServer(server);
         }
     }
 
-    function listenForRoomActivityIndicators()
+    function setupRoomActivityIndicators()
     {
-        console.debug("listenForRoomActivityIndicators");
+        _converse.api.listen.on('raiRoomsUpdated', updateSubscriptions);
 
         // If we already have unread notifications stored for this session, emit them now
         for (var i = 0; i < sessionStorage.length; i++)
diff --git a/src/solid-xmpp-chat.js b/src/solid-xmpp-chat.js
index 694ff5a113f1e6815839902e89f2ab6e4b00c4c0..702b31091e37a3c18cc5e14f07ce066d156f7a14 100644
--- a/src/solid-xmpp-chat.js
+++ b/src/solid-xmpp-chat.js
@@ -194,7 +194,8 @@ export const SolidXMPPChat = {
         ])).flat();
 
         // @MattJ Here userRooms is an array of each jabberID the user is on.
-        console.log(userRooms);
+        console.log("userRooms", userRooms);
+        this._converse.api.trigger('raiRoomsUpdated', userRooms);
 
         this._converse.api.listen.on('chatRoomActivityIndicators', function (jid) {
           window.dispatchEvent(new CustomEvent('newMessage', {