diff --git a/src/main.rs b/src/main.rs
index b52797a..d749323 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,10 +2,14 @@ use anyhow::{
     Result,
 };
 use pipewire as pw;
+use pw::proxy::ProxyT;
 use std::{
     cell::{
         RefCell,
     },
+    collections::{
+        HashMap,
+    },
     rc::{
         Rc,
     },
@@ -20,7 +24,8 @@ fn main() -> Result<()> {
     let registry = Rc::new(core.get_registry()?);
     let registry_weak = Rc::downgrade(&registry);
 
-    let nodes = RefCell::new(Vec::new());
+    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());
 
     // Listen for new nodes
     let _registry_listener = registry
@@ -41,7 +46,10 @@ fn main() -> Result<()> {
                         })
                         .register();
 
-                    nodes.borrow_mut().push((node, node_listener));
+                    let node_id = node.upcast_ref().id();
+
+                    nodes.borrow_mut().insert(node_id, Box::new(node));
+                    listeners.borrow_mut().entry(node_id).or_default().push(Box::new(node_listener));
                 }
             }