diff --git a/components/rgbd-sources/src/frameset.cpp b/components/rgbd-sources/src/frameset.cpp
index 8064aaff0734e5b8a90d015f903c1541aef58614..a2d3f57da7fb2ad3573dca4c373091d4acc907b6 100644
--- a/components/rgbd-sources/src/frameset.cpp
+++ b/components/rgbd-sources/src/frameset.cpp
@@ -124,6 +124,15 @@ size_t Builder::size() {
 }
 
 void Builder::onFrameSet(const std::function<bool(ftl::rgbd::FrameSet &)> &cb) {
+	if (!cb) {
+		main_id_.cancel();
+		return;
+	}
+
+	if (main_id_.id() != -1) {
+		main_id_.cancel();
+	}
+
 	// 3. Issue IO retrieve ad compute jobs before finding a valid
 	// frame at required latency to pass to callback.
 	main_id_ = ftl::timer::add(ftl::timer::kTimerMain, [this,cb](int64_t ts) {
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index cba34010bf08fa1ec931695b26d274c52373bb69..88bb1e858e978352c2007aae1a908a75d13e9f17 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -25,6 +25,7 @@ Receiver::~Receiver() {
 	//if (stream_) {
 	//	stream_->onPacket(nullptr);
 	//}
+
 	builder_.onFrameSet(nullptr);
 }
 
diff --git a/components/streams/test/receiver_unit.cpp b/components/streams/test/receiver_unit.cpp
index 86ce60b6c118eec5d8ff08789feed5d437723ed8..faee6add4a30f4195a4d135db900413976913833 100644
--- a/components/streams/test/receiver_unit.cpp
+++ b/components/streams/test/receiver_unit.cpp
@@ -215,5 +215,7 @@ TEST_CASE( "Receiver generating onFrameSet" ) {
 	}
 
 	ftl::timer::stop(true);
+	//while (ftl::pool.n_idle() != ftl::pool.size()) std::this_thread::sleep_for(std::chrono::milliseconds(10));
 	delete receiver;
+	//ftl::config::cleanup();
 }