diff --git a/src/main.rs b/src/main.rs
index d749323..ef8a213 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -24,8 +24,8 @@ fn main() -> Result<()> {
     let registry = Rc::new(core.get_registry()?);
     let registry_weak = Rc::downgrade(&registry);
 
-    let nodes: RefCell<HashMap<u32, Box<dyn pw::proxy::ProxyT>>> = RefCell::new(HashMap::new());
-    let listeners: RefCell<HashMap<u32, Vec<Box<dyn pw::proxy::Listener>>>> = RefCell::new(HashMap::new());
+    let nodes: Rc<RefCell<HashMap<u32, Box<dyn pw::proxy::ProxyT>>>> = Rc::new(RefCell::new(HashMap::new()));
+    let listeners: Rc<RefCell<HashMap<u32, Vec<Box<dyn pw::proxy::Listener>>>>> = Rc::new(RefCell::new(HashMap::new()));
 
     // Listen for new nodes
     let _registry_listener = registry
@@ -46,10 +46,27 @@ fn main() -> Result<()> {
                         })
                         .register();
 
-                    let node_id = node.upcast_ref().id();
+                    let proxy = node.upcast_ref();
+                    let proxy_id = proxy.id();
 
-                    nodes.borrow_mut().insert(node_id, Box::new(node));
-                    listeners.borrow_mut().entry(node_id).or_default().push(Box::new(node_listener));
+                    let nodes_weak = Rc::downgrade(&nodes);
+                    let listeners_weak = Rc::downgrade(&listeners);
+
+                    let proxy_listener = proxy
+                        .add_listener_local()
+                        .removed(move || {
+                            if let Some(nodes) = nodes_weak.upgrade() {
+                                nodes.borrow_mut().remove(&proxy_id);
+                            }
+                            if let Some(listeners) = listeners_weak.upgrade() {
+                                listeners.borrow_mut().remove(&proxy_id);
+                            }
+                        })
+                        .register();
+
+                    nodes.borrow_mut().insert(proxy_id, Box::new(node));
+                    listeners.borrow_mut().entry(proxy_id).or_default().push(Box::new(node_listener));
+                    listeners.borrow_mut().entry(proxy_id).or_default().push(Box::new(proxy_listener));
                 }
             }