diff --git a/CMakeLists.txt b/CMakeLists.txt
index 761a7fa81a54b95ba0d9ca0fd63af2335149e808..c2702880e4f31395f0c1398c652b602b38ada047 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -475,7 +475,7 @@ if (BUILD_CALIBRATION)
 endif()
 
 if (BUILD_RECONSTRUCT)
-	add_subdirectory(applications/reconstruct)
+	#add_subdirectory(applications/reconstruct)
 endif()
 
 if (HAVE_NANOGUI)
diff --git a/applications/gui2/src/frameview.cpp b/applications/gui2/src/frameview.cpp
index c22596b647e482ad231b680678d88ce533a2a2a4..190a9ddda06cb1cfdfaaa5d13c244c58a865d238 100644
--- a/applications/gui2/src/frameview.cpp
+++ b/applications/gui2/src/frameview.cpp
@@ -119,7 +119,7 @@ void FrameView::draw(NVGcontext *ctx) {
 	glDisable(GL_SCISSOR_TEST);
 }
 
-void FrameView::set(const std::shared_ptr<ftl::data::FrameSet> &fs, int fid, ftl::codecs::Channel c, cudaStream_t s, bool cp) {
+void FrameView::set(const ftl::data::FrameSetPtr &fs, int fid, ftl::codecs::Channel c, cudaStream_t s, bool cp) {
 	if (!std::atomic_load(&fs_)) {
 		fid_ = fid;
 		channel_ = c;
diff --git a/applications/gui2/src/frameview.hpp b/applications/gui2/src/frameview.hpp
index 0d23ccf904f1613d494f684c0d033449230aa5bd..32176ee12f890f5183547ea3cb161d8c9816b43c 100644
--- a/applications/gui2/src/frameview.hpp
+++ b/applications/gui2/src/frameview.hpp
@@ -22,7 +22,7 @@ public:
 	 *  at next draw() call. Can be called from any thread. Saves parameters
 	 *  and copies the shared pointer. The other set() method is used in next
 	 *  draw call to perform the operation. */
-	void set(const std::shared_ptr<ftl::data::FrameSet>& fs, int fid, ftl::codecs::Channel channel, cudaStream_t stream=0, bool copy=true);
+	void set(const ftl::data::FrameSetPtr& fs, int fid, ftl::codecs::Channel channel, cudaStream_t stream=0, bool copy=true);
 	/** Set a frame in OpenGL context. May only be called from GUI thread (draw
 	 *  or GUI callback */
 	void set(const NVGcontext *ctx, ftl::data::Frame &f, ftl::codecs::Channel c, cudaStream_t s=0, bool cp=true);
diff --git a/applications/gui2/src/inputoutput.hpp b/applications/gui2/src/inputoutput.hpp
index 38722e16129a50a19770f8b0bbb00a71ff9fcbc0..529af2427e61c350d34d46e939f14b1e4fb88aeb 100644
--- a/applications/gui2/src/inputoutput.hpp
+++ b/applications/gui2/src/inputoutput.hpp
@@ -30,16 +30,16 @@ public:
 	InputOutput(const InputOutput&) = delete;
 	void operator=(const InputOutput&) = delete;
 
-	ftl::Handle addCallback(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)>&);
+	ftl::Handle addCallback(const std::function<bool(const ftl::data::FrameSetPtr&)>&);
 
 	ftl::net::Universe* net() const;
 	ftl::ctrl::Master* master() const { return master_.get(); }
 	ftl::stream::Feed* feed() const { return feed_.get(); }
 
 private:
-	void processFrameSet_(const std::shared_ptr<ftl::data::FrameSet>&);
+	void processFrameSet_(const ftl::data::FrameSetPtr&);
 
-	ftl::Handler<const std::shared_ptr<ftl::data::FrameSet>&> cb_;
+	ftl::Handler<const ftl::data::FrameSetPtr&> cb_;
 	ftl::Handle hr_; // receiver handle
 
 	ftl::net::Universe* net_;
diff --git a/applications/gui2/src/modules/camera/control.cpp b/applications/gui2/src/modules/camera/control.cpp
index 771f38f8f028e0a01793c75f346af8c11ba686b2..30594061272151b7af2c36cf5cbae19fb1769cb6 100644
--- a/applications/gui2/src/modules/camera/control.cpp
+++ b/applications/gui2/src/modules/camera/control.cpp
@@ -8,7 +8,7 @@ void Camera::activate() {
 	filter = io->feed()->filter({ftl::codecs::Channel::Colour});
 
 	filter->on(
-		[this, view](const std::shared_ptr<ftl::data::FrameSet>& fs){
+		[this, view](const ftl::data::FrameSetPtr& fs){
 			view->update(fs, source_idx);
 			screen->redraw();
 			return true;
diff --git a/applications/gui2/src/modules/camera/view.cpp b/applications/gui2/src/modules/camera/view.cpp
index ab576b950b535b3ffcb797c124e1b91160990101..44f25b1c63067b32986c161b50baf74094d485a2 100644
--- a/applications/gui2/src/modules/camera/view.cpp
+++ b/applications/gui2/src/modules/camera/view.cpp
@@ -44,7 +44,7 @@ void CameraView::draw(NVGcontext *ctx) {
 	View::draw(ctx);
 }
 
-void CameraView::update(const std::shared_ptr<ftl::data::FrameSet>& fs, int fid) {
+void CameraView::update(const ftl::data::FrameSetPtr& fs, int fid) {
 	auto channel = ftl::codecs::Channel::Colour;
 	fview->set(fs, fid, channel, 0, true);
 
diff --git a/applications/gui2/src/modules/camera/view.hpp b/applications/gui2/src/modules/camera/view.hpp
index 5213820fb164176cab251bccd6fd980671d42151..225987df40a834bed7023e076cd24919291535a8 100644
--- a/applications/gui2/src/modules/camera/view.hpp
+++ b/applications/gui2/src/modules/camera/view.hpp
@@ -21,7 +21,7 @@ public:
 	~CameraView();
 	virtual void draw(NVGcontext *ctx) override;
 
-	void update(const std::shared_ptr<ftl::data::FrameSet>& fs, int fid);
+	void update(const ftl::data::FrameSetPtr& fs, int fid);
 
 
 private:
diff --git a/applications/gui2/src/modules/thumbnails/control.cpp b/applications/gui2/src/modules/thumbnails/control.cpp
index 06a114692c27847dd9b84079b3cdbcc509977e65..5628c59e22e50c5989c3dd31908033c634e1df33 100644
--- a/applications/gui2/src/modules/thumbnails/control.cpp
+++ b/applications/gui2/src/modules/thumbnails/control.cpp
@@ -34,7 +34,7 @@ void ThumbnailsController::show_thumbnails() {
 
 	auto* filter = io->feed()->filter({Channel::Colour});
 	filter->on(
-		[this, thumb_view](const std::shared_ptr<ftl::data::FrameSet>& fs){
+		[this, thumb_view](const ftl::data::FrameSetPtr& fs){
 			thumb_view->update(fs);
 			screen->redraw();
 			return true;
diff --git a/applications/gui2/src/modules/thumbnails/view.cpp b/applications/gui2/src/modules/thumbnails/view.cpp
index 947d13e384369c0ee0b6a5ee7f66b84a2d7dab01..cf291110ce17a4b194e98861e6db98f054ff08ed 100644
--- a/applications/gui2/src/modules/thumbnails/view.cpp
+++ b/applications/gui2/src/modules/thumbnails/view.cpp
@@ -67,7 +67,7 @@ Thumbnails::~Thumbnails() {
 
 }
 
-void Thumbnails::update(const std::shared_ptr<ftl::data::FrameSet>& fs) {
+void Thumbnails::update(const ftl::data::FrameSetPtr& fs) {
 	if (!fs_) {
 		fs_ = fs;
 	}
diff --git a/applications/gui2/src/modules/thumbnails/view.hpp b/applications/gui2/src/modules/thumbnails/view.hpp
index c84a2c744ad504d99d627d09465405e443c21001..0ceb9e6418f5c483327bc0798cf82d99620a3e81 100644
--- a/applications/gui2/src/modules/thumbnails/view.hpp
+++ b/applications/gui2/src/modules/thumbnails/view.hpp
@@ -17,7 +17,7 @@ public:
 	Thumbnails(nanogui::Widget *parent, ThumbnailsController *controller);
 	virtual ~Thumbnails();
 
-	void update(const std::shared_ptr<ftl::data::FrameSet>& fs);
+	void update(const ftl::data::FrameSetPtr& fs);
 	virtual void draw(NVGcontext *ctx) override;
 
 private:
diff --git a/components/common/cpp/test/msgpack_unit.cpp b/components/common/cpp/test/msgpack_unit.cpp
index c5e79d3bf91e34f2ac672ffcb53919b9a884a196..940706125069952bb015017fcbfaaf03e83f5f2e 100644
--- a/components/common/cpp/test/msgpack_unit.cpp
+++ b/components/common/cpp/test/msgpack_unit.cpp
@@ -60,17 +60,25 @@ TEST_CASE( "msgpack cv::Mat" ) {
 	SECTION( "Mat::ones(Size(1, 5), CV_8UC3)" ) {
 		Mat A = Mat::ones(Size(1, 5), CV_8UC3);
 		Mat B = msgpack_unpack<Mat>(msgpack_pack(A));
-		
+
 		REQUIRE(A.size() == B.size());
 		REQUIRE(A.type() == B.type());
-		REQUIRE(cv::countNonZero(A != B) == 0);
+
+		cv::Mat diff;
+		cv::absdiff(A, B, diff);
+		REQUIRE(cv::countNonZero(diff.reshape(1, diff.total())) == 0);
+
+		// how is it possible this REQUIRE() passed earlier? Multi-channel
+		// images can not be used in countNonZero() and A != B returns multi
+		// channel result. (test fixed by comparison above)
+		//REQUIRE(cv::countNonZero(A != B) == 0);
 	}
 
 	SECTION ( "Mat 10x10 CV_64FC1 with random values [-1000, 1000]" ) {
 		Mat A(Size(10, 10), CV_64FC1);
 		cv::randu(A, -1000, 1000);
 		Mat B = msgpack_unpack<Mat>(msgpack_pack(A));
-		
+
 		REQUIRE(A.size() == B.size());
 		REQUIRE(A.type() == B.type());
 		REQUIRE(cv::countNonZero(A != B) == 0);
@@ -82,9 +90,9 @@ TEST_CASE( "msgpack cv::Mat" ) {
 
 		msgpack::zone z;
 		auto obj = msgpack::object(A, z);
-		
+
 		Mat B = msgpack_unpack<Mat>(msgpack_pack(obj));
-		
+
 		REQUIRE(A.size() == B.size());
 		REQUIRE(A.type() == B.type());
 		REQUIRE(cv::countNonZero(A != B) == 0);
@@ -97,7 +105,7 @@ TEST_CASE( "msgpack cv::Mat" ) {
 			A.setTo(0);
 
 			Mat B = msgpack_unpack<Mat>(msgpack_pack(A));
-		
+
 			REQUIRE(A.size() == B.size());
 			REQUIRE(A.type() == B.type());
 			REQUIRE(cv::countNonZero(A != B) == 0);
@@ -111,7 +119,7 @@ TEST_CASE( "msgpack cv::Mat" ) {
 		auto res = msgpack_unpack<cv::Rect2d>(msgpack_pack(cv::Rect2d(1,2,3,4)));
 		REQUIRE(res == cv::Rect2d(1,2,3,4));
 	}
-	
+
 	SECTION( "Vec<T, SIZE>" ) {
 		auto res = msgpack_unpack<cv::Vec4d>(msgpack_pack(cv::Vec4d(1,2,3,4)));
 		REQUIRE(res == cv::Vec4d(1,2,3,4));
diff --git a/components/rgbd-sources/include/ftl/rgbd/source.hpp b/components/rgbd-sources/include/ftl/rgbd/source.hpp
index 1a3177d2ca5cbd2b427c83d8d85740cad2fcfb96..1a1cb2a26c93a10402ebb1b2eb17c14cef9268ac 100644
--- a/components/rgbd-sources/include/ftl/rgbd/source.hpp
+++ b/components/rgbd-sources/include/ftl/rgbd/source.hpp
@@ -169,7 +169,7 @@ class SourceGenerator : public ftl::data::Generator {
 	public:
 	explicit SourceGenerator(Source *src) : source_(src) {}
 
-	inline ftl::Handle onFrameSet(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)> &cb) override {
+	inline ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override {
 		return source_->onFrame([this,cb](ftl::data::Frame &frame) {
 			auto fs = ftl::data::FrameSet::fromFrame(frame);
 			return cb(fs);
diff --git a/components/streams/include/ftl/streams/builder.hpp b/components/streams/include/ftl/streams/builder.hpp
index 38b18fd5cbf6eda0fd300c4e81f71b700c8b8533..040b141385b23bf0ede0af5914fcfb16167adf6e 100644
--- a/components/streams/include/ftl/streams/builder.hpp
+++ b/components/streams/include/ftl/streams/builder.hpp
@@ -27,7 +27,7 @@ class Builder {
 
 	//inline void setID(int id) { id_ = id; }
 
-	inline ftl::Handle onFrameSet(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)> &cb) { return cb_.on(cb); }
+	inline ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) { return cb_.on(cb); }
 
 	/**
 	 * Instead of pushing a frame, find or create a direct reference to one.
@@ -67,7 +67,7 @@ class Builder {
 	//std::list<ftl::data::FrameSet*> allocated_;  // Keep memory allocations
 
 	size_t head_;
-	ftl::Handler<const std::shared_ptr<ftl::data::FrameSet>&> cb_;
+	ftl::Handler<const ftl::data::FrameSetPtr&> cb_;
 	MUTEX mutex_;
 	int mspf_;
 	int64_t last_ts_;
diff --git a/components/streams/include/ftl/streams/feed.hpp b/components/streams/include/ftl/streams/feed.hpp
index 7992950ee3b212cec1956c03a51348727c1f4510..784b8f6de2ea7802b31251b3b111a1e0e4f0cc01 100644
--- a/components/streams/include/ftl/streams/feed.hpp
+++ b/components/streams/include/ftl/streams/feed.hpp
@@ -34,7 +34,7 @@ public:
 		const std::unordered_set<ftl::codecs::Channel>& channels() const { return channels_; };
 		const std::unordered_set<uint32_t>& sources() const { return sources_; };
 
-		void on(const ftl::data::FrameSetHandler &cb);
+		void on(const ftl::data::FrameSetCallback &cb);
 
 	private:
 		Filter(Feed* feed, const std::unordered_set<uint32_t>& sources,  const std::unordered_set<ftl::codecs::Channel>& channels);
diff --git a/components/streams/include/ftl/streams/receiver.hpp b/components/streams/include/ftl/streams/receiver.hpp
index c9a061ce35786721fe1b34c1397692ba5cb30293..4d109a1f085e24504d3e92a9b094938e935e676b 100644
--- a/components/streams/include/ftl/streams/receiver.hpp
+++ b/components/streams/include/ftl/streams/receiver.hpp
@@ -34,7 +34,7 @@ class Receiver : public ftl::Configurable, public ftl::data::Generator {
 	 * Register a callback for received framesets. Sources are automatically
 	 * created to match the data received.
 	 */
-	ftl::Handle onFrameSet(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)> &cb) override;
+	ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override;
 
 	/**
 	 * Add a frameset handler to a specific stream ID.
@@ -48,7 +48,7 @@ class Receiver : public ftl::Configurable, public ftl::data::Generator {
 	private:
 	ftl::stream::Stream *stream_;
 	ftl::data::Pool *pool_;
-	ftl::SingletonHandler<const std::shared_ptr<ftl::data::FrameSet>&> callback_;
+	ftl::SingletonHandler<const ftl::data::FrameSetPtr&> callback_;
 	std::unordered_map<uint32_t, ftl::streams::Builder> builders_;
 	std::list<ftl::Handle> handles_;
 	ftl::codecs::Channel second_channel_;
diff --git a/components/streams/include/ftl/streams/renderer.hpp b/components/streams/include/ftl/streams/renderer.hpp
index 58c081ae7dddf491b3635e78a6a7c1bb1aa3531d..9c286028b15b5fdc071667718d75528eb41d948f 100644
--- a/components/streams/include/ftl/streams/renderer.hpp
+++ b/components/streams/include/ftl/streams/renderer.hpp
@@ -1,7 +1,6 @@
 #ifndef _FTL_RENDER_GENERATOR_HPP_
 #define _FTL_RENDER_GENERATOR_HPP_
 
-
 #include <ftl/data/new_frameset.hpp>
 #include <ftl/rgbd/frameset.hpp>
 #include <ftl/audio/frameset.hpp>
@@ -17,11 +16,13 @@ class Renderer : public ftl::Configurable, public ftl::data::Generator {
 public:
 	explicit Renderer(nlohmann::json &config, ftl::data::Pool *, uint32_t fsid);
 	~Renderer();
-	ftl::Handle onFrameSet(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)> &cb) override;
+	ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override;
+	void submit(const ftl::data::FrameSetPtr &fs);
+
 private:
 	ftl::streams::Builder builder_;
 	ftl::Handle builder_handle_;
-	ftl::SingletonHandler<const std::shared_ptr<ftl::data::FrameSet>&> callback_;
+	ftl::SingletonHandler<const ftl::data::FrameSetPtr&> callback_;
 	ftl::data::FrameSetPtr input_;
 	std::unique_ptr<ftl::render::CUDARender> renderer_;
 };
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index 2d846136e8c705442eccd8e821d43665896b5168..584785f4ed40b7b20cc73710edd6638f3ad1ef01 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -19,7 +19,7 @@ Feed::Filter::~Filter() {
 
 }
 
-void Feed::Filter::on(const ftl::data::FrameSetHandler &cb) {
+void Feed::Filter::on(const ftl::data::FrameSetCallback &cb) {
 	std::unique_lock<std::mutex> lk(feed_->mtx_);
 
 	if (std::find(feed_->filters_.begin(), feed_->filters_.end(),this) == feed_->filters_.end()) {
@@ -74,7 +74,7 @@ Feed::Feed(nlohmann::json &config, ftl::net::Universe*net) :
 	});
 
 	handle_receiver_ = receiver_->onFrameSet(
-		[this](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		[this](const ftl::data::FrameSetPtr& fs) {
 			if (pre_pipelines_.count(fs->frameset()) == 1) {
 				pre_pipelines_[fs->frameset()]->apply(*fs, *fs, 0);
 			}
@@ -288,6 +288,6 @@ uint32_t Feed::allocateFrameSetId() {
 }
 
 
-/*ftl::Handle Feed::onFrameSet(const ftl::stream::ftl::data::FrameSetHandler &f) {
+/*ftl::Handle Feed::onFrameSet(const ftl::stream::ftl::data::FrameSetCallback &f) {
 	return frameset_cb_.on(f);
 }*/
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index 839d7cde171a47b8e518af42b1d288682070d3e4..cf21177f0e37a5d4a99efee05f95481c33c4326d 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -63,7 +63,7 @@ ftl::streams::Builder &Receiver::builder(uint32_t id) {
 		b.setID(id);
 		b.setPool(pool_);
 		b.setBufferSize(value("frameset_buffer_size", 3));
-		handles_.push_back(std::move(b.onFrameSet([this](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		handles_.push_back(std::move(b.onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
 			callback_.trigger(fs);
 			return true;
 		})));
@@ -430,7 +430,7 @@ void Receiver::setStream(ftl::stream::Stream *s) {
 	});
 }
 
-ftl::Handle Receiver::onFrameSet(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)> &cb) {
+ftl::Handle Receiver::onFrameSet(const std::function<bool(const ftl::data::FrameSetPtr&)> &cb) {
 	//for (auto &b : builders_)
 	//	b.second.onFrameSet(cb);
 	return callback_.on(cb);
diff --git a/components/streams/src/renderer.cpp b/components/streams/src/renderer.cpp
index 910589dce5488250a87e134e32779c7a23697071..243d1a8761ac0e54da88b8280d83f8092ed76bae 100644
--- a/components/streams/src/renderer.cpp
+++ b/components/streams/src/renderer.cpp
@@ -20,22 +20,33 @@ Renderer::Renderer(nlohmann::json &config, ftl::data::Pool *p, uint32_t fsid) :
 	builder_handle_ = builder_.onFrameSet([this](const ftl::data::FrameSetPtr &fs){
 		// wrong way
 		auto &frame_out = builder_.get(fs->timestamp(), 0).cast<ftl::rgbd::Frame>();
+		auto input = input_;
+
 		renderer_->begin(frame_out, ftl::codecs::Channel::Left);
 		renderer_->submit(
-			fs.get(),
+			input.get(),
 			ftl::codecs::Channels<0>(ftl::codecs::Channel::Colour),
 			Eigen::Matrix4d::Identity());
-		//auto &frame = fs_out->frames[0].cast<ftl::rgbd::Frame>();
-		//frame.get<ftl::rgbd::Frame>();
-		//
 
 		return true;
 	});
 }
 
+void Renderer::submit(const ftl::data::FrameSetPtr &fs) {
+	input_ = fs;
+	auto &frame_out = builder_.get(fs->timestamp(), 0).cast<ftl::rgbd::Frame>();
+	auto input = input_;
+	renderer_->begin(frame_out, ftl::codecs::Channel::Left);
+	renderer_->submit(
+	input.get(),
+	ftl::codecs::Channels<0>(ftl::codecs::Channel::Colour),
+	Eigen::Matrix4d::Identity());
+}
+
 Renderer::~Renderer() {
 }
 
-ftl::Handle Renderer::onFrameSet(const std::function<bool(const std::shared_ptr<ftl::data::FrameSet>&)> &cb) {
-	return callback_.on(cb);
+ftl::Handle Renderer::onFrameSet(const std::function<bool(const ftl::data::FrameSetPtr&)> &cb) {
+	//return callback_.on(cb);
+	return builder_.onFrameSet(cb);
 }
diff --git a/components/streams/test/builder_unit.cpp b/components/streams/test/builder_unit.cpp
index cb3f4b0d2a9cf96dc8cf3bde3848957512ddace7..345f1885b3610586834572179787eceda5091cfc 100644
--- a/components/streams/test/builder_unit.cpp
+++ b/components/streams/test/builder_unit.cpp
@@ -73,7 +73,7 @@ TEST_CASE("ftl::streams::Builder can complete a frameset", "[]") {
 
 		int fsid = 0;
 
-		auto h = builder.onFrameSet([&fsid](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = builder.onFrameSet([&fsid](const ftl::data::FrameSetPtr& fs) {
 			fsid = fs->frameset();
 			return false;
 		});
@@ -96,7 +96,7 @@ TEST_CASE("ftl::streams::Builder can complete a frameset", "[]") {
 
 		int fsid = 0;
 
-		auto h = builder.onFrameSet([&fsid](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = builder.onFrameSet([&fsid](const ftl::data::FrameSetPtr& fs) {
 			fsid = fs->frameset();
 			return false;
 		});
@@ -120,7 +120,7 @@ TEST_CASE("ftl::streams::Builder can complete a frameset", "[]") {
 
 		int fsid = 0;
 
-		auto h = builder.onFrameSet([&fsid](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = builder.onFrameSet([&fsid](const ftl::data::FrameSetPtr& fs) {
 			fsid = fs->frameset();
 			return false;
 		});
diff --git a/components/streams/test/receiver_unit.cpp b/components/streams/test/receiver_unit.cpp
index 6f6ebe291c1095446e9049c13b7a779559623187..97694aaac4685963440e09bf3b77c1e1aa522ed9 100644
--- a/components/streams/test/receiver_unit.cpp
+++ b/components/streams/test/receiver_unit.cpp
@@ -108,7 +108,7 @@ TEST_CASE( "Receiver generating onFrameSet" ) {
 		stream.post(spkt, pkt);
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
@@ -138,7 +138,7 @@ TEST_CASE( "Receiver generating onFrameSet" ) {
 		stream.post(spkt, pkt);
 
 		std::atomic<int> mask = 0;
-		auto h = receiver->onFrameSet([&mask](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&mask](const ftl::data::FrameSetPtr& fs) {
 			mask |= 1 << fs->frameset();
 			return true;
 		});
@@ -163,7 +163,7 @@ TEST_CASE( "Receiver generating onFrameSet" ) {
 		stream.post(spkt, pkt);
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
@@ -197,7 +197,7 @@ TEST_CASE( "Receiver generating onFrameSet" ) {
 		stream.post(spkt, pkt);
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
@@ -232,7 +232,7 @@ TEST_CASE( "Receiver generating onFrameSet" ) {
 		stream.post(spkt, pkt);
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
@@ -314,7 +314,7 @@ TEST_CASE( "Receiver sync bugs" ) {
 		int count = 0;
 		int64_t ts = 0;
 		bool haswrongchan = false;
-		auto h = receiver->onFrameSet([&count,&ts,&haswrongchan](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count,&ts,&haswrongchan](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			ts = fs->timestamp();
@@ -398,7 +398,7 @@ TEST_CASE( "Receiver non zero buffer" ) {
 		REQUIRE( r );
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
@@ -469,7 +469,7 @@ TEST_CASE( "Receiver for data channels" ) {
 		stream.post(spkt, pkt);
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
@@ -497,7 +497,7 @@ TEST_CASE( "Receiver for data channels" ) {
 		stream.post(spkt, pkt);
 
 		int count = 0;
-		auto h = receiver->onFrameSet([&count](const std::shared_ptr<ftl::data::FrameSet>& fs) {
+		auto h = receiver->onFrameSet([&count](const ftl::data::FrameSetPtr& fs) {
 			++count;
 
 			REQUIRE( fs->timestamp() == 10 );
diff --git a/components/structures/include/ftl/data/new_frameset.hpp b/components/structures/include/ftl/data/new_frameset.hpp
index 6b4a95311253d84d422c82a2c8e14c0443a96da4..6acba56a194f2b45d930fbb3db0aec0329f35b35 100644
--- a/components/structures/include/ftl/data/new_frameset.hpp
+++ b/components/structures/include/ftl/data/new_frameset.hpp
@@ -100,11 +100,11 @@ class FrameSet : public ftl::data::Frame {
 };
 
 using FrameSetPtr = std::shared_ptr<ftl::data::FrameSet>;
-using FrameSetHandler = std::function<bool(const FrameSetPtr&)>;
+using FrameSetCallback = std::function<bool(const FrameSetPtr&)>;
 
 class Generator {
 	public:
-	virtual ftl::Handle onFrameSet(const FrameSetHandler &)=0;
+	virtual ftl::Handle onFrameSet(const FrameSetCallback &)=0;
 };
 
 /**
diff --git a/components/structures/src/new_frame.cpp b/components/structures/src/new_frame.cpp
index 0e8befa0d302c41a9eca0b16c48721d6afbb3c7d..c91aef2f7bdf6d64bc54543f41bce4ce3a301c86 100644
--- a/components/structures/src/new_frame.cpp
+++ b/components/structures/src/new_frame.cpp
@@ -85,7 +85,7 @@ bool ftl::data::Frame::has(ftl::codecs::Channel c) const {
 	if (i != data_.end() && i->second.status != ftl::data::ChannelStatus::INVALID) {
 		return true;
 	} else {
-		return (parent_ && parent_->has(c)); 
+		return (parent_ && parent_->has(c));
 	}
 }
 
@@ -113,7 +113,7 @@ std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t
 	if (status_ != FrameStatus::CREATED) throw FTL_Error("Cannot apply change after store " << static_cast<int>(status_));
 
 	ftl::data::Frame::ChannelData *d;
-	
+
 	if (parent_) {
 		UNIQUE_LOCK(mutex(), lk);
 		d = &(data_[c]);
@@ -136,7 +136,7 @@ std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t
 	if (status_ != FrameStatus::CREATED) throw FTL_Error("Cannot apply change after store " << static_cast<int>(status_));
 
 	ftl::data::Frame::ChannelData *d;
-	
+
 	if (parent_) {
 		UNIQUE_LOCK(mutex(), lk);
 		d = &(data_[c]);
@@ -370,7 +370,7 @@ ftl::Handle Session::onFlush(const std::function<bool(Frame&,ftl::codecs::Channe
 }
 
 void Session::notifyChanges(Frame &f) {
-	
+
 }
 
 void Session::flush(Frame &f) {