diff --git a/rust/bt-broadcast-assistant/src/assistant/event.rs b/rust/bt-broadcast-assistant/src/assistant/event.rs
index 656ff93..2240a36 100644
--- a/rust/bt-broadcast-assistant/src/assistant/event.rs
+++ b/rust/bt-broadcast-assistant/src/assistant/event.rs
@@ -23,7 +23,7 @@
 use bt_gatt::GattTypes;
 
 use crate::assistant::{
-    DiscoveredBroadcastSources, Error, BASIC_AUDIO_ANNOUNCEMENT_SERVICE,
+    BroadcastSourceKey, DiscoveredBroadcastSources, Error, BASIC_AUDIO_ANNOUNCEMENT_SERVICE,
     BROADCAST_AUDIO_ANNOUNCEMENT_SERVICE,
 };
 use crate::types::BroadcastSource;
@@ -47,10 +47,10 @@
 >;
 
 type PeriodicAdvertisingFuture<T> =
-    Pin<Box<dyn Future<Output = (PeerId, u8, PeriodicAdvertisingSyncResult<T>)>>>;
+    Pin<Box<dyn Future<Output = (BroadcastSourceKey, PeriodicAdvertisingSyncResult<T>)>>>;
 
 type PeriodicAdvertisingStream =
-    Pin<Box<dyn Stream<Item = (PeerId, u8, Result<SyncReport, bt_gatt::types::Error>)>>>;
+    Pin<Box<dyn Stream<Item = (BroadcastSourceKey, Result<SyncReport, bt_gatt::types::Error>)>>>;
 
 /// A stream of discovered broadcast sources.
 /// This stream polls the scan results from GATT client to discover
@@ -66,7 +66,7 @@
 
     establishing_periodic_advertising_syncs: FuturesUnordered<PeriodicAdvertisingFuture<T>>,
     active_periodic_advertising_sync_streams: SelectAll<PeriodicAdvertisingStream>,
-    active_syncs: HashMap<(PeerId, u8), Option<AbortHandle>>,
+    active_syncs: HashMap<BroadcastSourceKey, Option<AbortHandle>>,
 }
 
 impl<T: bt_gatt::GattTypes> Unpin for EventStream<T> {}
@@ -105,12 +105,12 @@
         }
 
         match self.establishing_periodic_advertising_syncs.poll_next_unpin(cx) {
-            Poll::Ready(Some((peer_id, sid, Ok(stream)))) => {
-                self.handle_established_sync(peer_id, sid, stream);
+            Poll::Ready(Some((key, Ok(stream)))) => {
+                self.handle_established_sync(key, stream);
                 Poll::Ready(())
             }
-            Poll::Ready(Some((peer_id, sid, Err(_)))) => {
-                self.active_syncs.remove(&(peer_id, sid));
+            Poll::Ready(Some((key, Err(_)))) => {
+                self.active_syncs.remove(&key);
                 Poll::Ready(())
             }
             Poll::Ready(None) | Poll::Pending => Poll::Pending,
@@ -132,14 +132,14 @@
         }
 
         match self.active_periodic_advertising_sync_streams.poll_next_unpin(cx) {
-            Poll::Ready(Some((peer_id, sid, Ok(report)))) => {
-                match self.handle_periodic_advertising_report(peer_id, sid, report) {
+            Poll::Ready(Some((key, Ok(report)))) => {
+                match self.handle_periodic_advertising_report(key, report) {
                     Some(event) => Poll::Ready(Some(event)),
                     None => Poll::Ready(None), // Progressed, but no event
                 }
             }
-            Poll::Ready(Some((peer_id, sid, Err(_)))) => {
-                self.active_syncs.remove(&(peer_id, sid));
+            Poll::Ready(Some((key, Err(_)))) => {
+                self.active_syncs.remove(&key);
                 Poll::Ready(None) // Progressed, but no event
             }
             Poll::Ready(None) | Poll::Pending => Poll::Pending,
@@ -178,21 +178,19 @@
 
     fn handle_established_sync(
         &mut self,
-        peer_id: PeerId,
-        sid: u8,
+        key: BroadcastSourceKey,
         stream: <<T as GattTypes>::PeriodicAdvertising as PeriodicAdvertising>::SyncStream,
     ) {
-        let mapped_stream = stream.map(move |report| (peer_id, sid, report));
+        let mapped_stream = stream.map(move |report| (key, report));
         let (abortable_stream, abort_handle) = abortable(mapped_stream);
 
         self.active_periodic_advertising_sync_streams.push(Box::pin(abortable_stream));
-        self.active_syncs.insert((peer_id, sid), Some(abort_handle));
+        self.active_syncs.insert(key, Some(abort_handle));
     }
 
     fn handle_periodic_advertising_report(
         &mut self,
-        peer_id: PeerId,
-        sid: u8,
+        key: BroadcastSourceKey,
         report: SyncReport,
     ) -> Option<Event> {
         let SyncReport::PeriodicAdvertisingReport(report) = report else {
@@ -203,24 +201,17 @@
             return None;
         };
 
-        let Ok(advertising_sid) = AdvertisingSetId::try_from(sid) else {
-            return None;
-        };
-
-        let (broadcast_source, changed) = self.broadcast_sources.merge_broadcast_source_data(
-            &(peer_id, advertising_sid),
-            &BroadcastSource::default().with_endpoint(base),
-        );
+        let (broadcast_source, changed) = self
+            .broadcast_sources
+            .merge_broadcast_source_data(&key, &BroadcastSource::default().with_endpoint(base));
 
         if broadcast_source.is_ready_to_add() && changed {
-            if let Some(Some(handle)) =
-                self.active_syncs.remove(&(peer_id, advertising_sid.value()))
-            {
+            if let Some(Some(handle)) = self.active_syncs.remove(&key) {
                 handle.abort();
             }
             return Some(Event::FoundBroadcastSource {
-                peer: peer_id,
-                advertising_sid,
+                peer: key.0,
+                advertising_sid: key.1,
                 source: broadcast_source,
             });
         }
@@ -243,13 +234,14 @@
             return None;
         };
 
+        let key = (scanned.id, sid);
         let (broadcast_source, changed) =
-            self.broadcast_sources.merge_broadcast_source_data(&(scanned.id, sid), &found_source);
+            self.broadcast_sources.merge_broadcast_source_data(&key, &found_source);
 
         if broadcast_source.is_ready_to_add() && changed {
             return Some(Event::FoundBroadcastSource {
-                peer: scanned.id,
-                advertising_sid: sid,
+                peer: key.0,
+                advertising_sid: key.1,
                 source: broadcast_source,
             });
         }
@@ -269,7 +261,6 @@
 
         // If we are already actively syncing (or establishing a sync) for this
         // peer/SID, don't start another one.
-        let key = (scanned.id, sid.value());
         if self.active_syncs.contains_key(&key) {
             return None;
         }
@@ -280,7 +271,7 @@
             sid.value(),
             SyncConfiguration { filter_duplicates: true },
         );
-        let mapped_fut = fut.map(move |res| (scanned.id, sid.value(), res));
+        let mapped_fut = fut.map(move |res| (key, res));
         self.establishing_periodic_advertising_syncs.push(Box::pin(mapped_fut));
 
         None
