diff --git a/briar_wrapper/models/socket_listener.py b/briar_wrapper/models/socket_listener.py
index 8a4bacffd067f808c52ed8f64fa314278326574a..64ec519b51bf2768d89857f002fa7aa5de842833 100644
--- a/briar_wrapper/models/socket_listener.py
+++ b/briar_wrapper/models/socket_listener.py
@@ -16,19 +16,24 @@ class SocketListener():  # pylint: disable=too-few-public-methods
 
     def __init__(self, api):
         self._api = api
-        self._signals = list()
+        self._signals = dict()
         self._signals_lock = Lock()
+        self._highest_signal_id = -1
         self._start_websocket_thread()
 
     def connect(self, event, callback):
         self._signals_lock.acquire()
-        # TODO: Signal ID should be stable after disconnects
-        signal_id = len(self._signals)
-        self._signals.append({
+        signal_id = self._add_signal(event, callback)
+        self._signals_lock.release()
+        return signal_id
+
+    def _add_signal(self, event, callback):
+        self._highest_signal_id += 1
+        signal_id = self._highest_signal_id
+        self._signals[signal_id] = {
             "event": event,
             "callback": callback
-            })
-        self._signals_lock.release()
+            }
         return signal_id
 
     def _start_websocket_thread(self):