diff --git a/components/streams/include/ftl/streams/receiver.hpp b/components/streams/include/ftl/streams/receiver.hpp
index ef95922626fbf2cf6e3ceaa7517168f94a9bf35a..710f256603410687993b196fee0fe262f6918174 100644
--- a/components/streams/include/ftl/streams/receiver.hpp
+++ b/components/streams/include/ftl/streams/receiver.hpp
@@ -50,7 +50,7 @@ class Receiver : public ftl::Configurable, public ftl::data::Generator {
 	ftl::data::Pool *pool_;
 	ftl::SingletonHandler<const ftl::data::FrameSetPtr&> callback_;
 	std::unordered_map<uint32_t, std::shared_ptr<ftl::streams::BaseBuilder>> builders_;
-	std::list<ftl::Handle> handles_;
+	std::unordered_map<uint32_t, ftl::Handle> handles_;
 	ftl::codecs::Channel second_channel_;
 	int64_t timestamp_;
 	SHARED_MUTEX mutex_;
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index 2aabbd396ca51d7b1589690d3df9778f5fe55a61..c8dff9d32caa900bee9e47fbce7d9d860ef44227 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -375,7 +375,9 @@ void Feed::remove(uint32_t id) {
 
 		streams_.erase(id);
 	} else if (devices_.count(id)) {
-			
+		receiver_->removeBuilder(id);
+		delete devices_[id];
+		devices_.erase(id);
 	} else if (renderers_.count(id)) {
 
 	}
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index a37c4bb3087fa4b1264ff891de3a4419821f2879..50f94771ecf1a1c2791d2823a8b29d93052c6884 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -73,10 +73,10 @@ ftl::streams::BaseBuilder &Receiver::builder(uint32_t id) {
 		b->setID(id);
 		b->setPool(pool_);
 		fb->setBufferSize(value("frameset_buffer_size", 3));
-		handles_.push_back(std::move(fb->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
+		handles_[id] = std::move(fb->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
 			callback_.trigger(fs);
 			return true;
-		})));
+		}));
 		return *b;
 	} else {
 		return *(i->second);
@@ -86,17 +86,20 @@ ftl::streams::BaseBuilder &Receiver::builder(uint32_t id) {
 void Receiver::removeBuilder(uint32_t id) {
 	UNIQUE_LOCK(mutex_, lk);
 	auto i = builders_.find(id);
-	if (i != builders_.end()) builders_.erase(i);
+	if (i != builders_.end()) {
+		handles_.erase(id);
+		builders_.erase(i);
+	}
 }
 
 void Receiver::registerBuilder(const std::shared_ptr<ftl::streams::BaseBuilder> &b) {
 	auto i = builders_.find(b->id());
 	if (i != builders_.end()) throw FTL_Error("Builder already exists");
 	builders_[b->id()] = b;
-	handles_.push_back(std::move(b->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
+	handles_[b->id()] = std::move(b->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
 		callback_.trigger(fs);
 		return true;
-	})));
+	}));
 }
 
 //void Receiver::onAudio(const ftl::audio::FrameSet::Callback &cb) {