diff --git a/applications/gui/src/media_panel.cpp b/applications/gui/src/media_panel.cpp
index e83626abcde7b2ae16463c4fee94270d4759356a..c2fa4285ebd433a8ac67a09eb0475e80f860100b 100644
--- a/applications/gui/src/media_panel.cpp
+++ b/applications/gui/src/media_panel.cpp
@@ -308,8 +308,10 @@ void MediaPanel::snapshot3D(ftl::gui::Camera *camera, const std::string &filenam
 		auto tagvalue = tag.value();
 		auto configurables = ftl::config::findByTag(tagvalue);
 		if (configurables.size() > 0) {
-			ftl::Configurable *configurable = configurables[0];
-			configurable->set("3D-snapshot", filename);
+			ftl::Configurable *configurable = ftl::config::find(configurables[0]->getID() + "/controls");
+			if (configurable) {
+				configurable->set("3D-snapshot", filename);
+			}
 		}
 	}
 }
@@ -320,11 +322,13 @@ void MediaPanel::startRecording3D(ftl::gui::Camera *camera, const std::string &f
 		auto tagvalue = tag.value();
 		auto configurables = ftl::config::findByTag(tagvalue);
 		if (configurables.size() > 0) {
-			ftl::Configurable *configurable = configurables[0];
-			configurable->set("record-name", filename);
-			configurable->set("record", true);
-			sceneRecording_ = std::optional<ftl::Configurable*>(configurable);
-			recordbutton_->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
+			ftl::Configurable *configurable = ftl::config::find(configurables[0]->getID() + "/controls");
+			if (configurable) {
+				configurable->set("record-name", filename);
+				configurable->set("record", true);
+				sceneRecording_ = std::optional<ftl::Configurable*>(configurable);
+				recordbutton_->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
+			}
 		}
 	}
 }
diff --git a/applications/reconstruct/src/main.cpp b/applications/reconstruct/src/main.cpp
index e1e7adcd8410b3d711414372ae0a2d32f7be6178..33db96ae046a1ee5c29898a503d0c483446e7f91 100644
--- a/applications/reconstruct/src/main.cpp
+++ b/applications/reconstruct/src/main.cpp
@@ -137,10 +137,10 @@ static void run(ftl::Configurable *root) {
 
 	// Controls
 	auto *controls = ftl::create<ftl::Configurable>(root, "controls");
-	
+
 	net->start();
 	net->waitConnections();
-	
+
 	std::vector<int> sourcecounts;
 
 	// Add sources from the configuration file as a single group.
@@ -275,7 +275,7 @@ static void run(ftl::Configurable *root) {
 	std::ofstream snapshotout;
 	ftl::codecs::Writer snapshotwriter(snapshotout);
 
-	root->set("record", false);
+	controls->set("record", false);
 
 	int64_t timestamp = -1;
 	bool writingSnapshot = false;
@@ -294,8 +294,12 @@ static void run(ftl::Configurable *root) {
 				// IFrame is one of the first two frames seen. In this case a
 				// part of the frame might already have been missed, so the
 				// IFrame after that one is captured instead.
-				if (precedingFrames.size() >= 2) {
-					bool isIFrame = false;
+
+				// Write all pose and calibration packets.
+				if ((int)spkt.channel >= 64) {
+					snapshotwriter.write(s, pkt);
+				} else if (precedingFrames.size() >= 2) {
+					bool isIFrame = true;
 					switch (pkt.codec) {
 						case ftl::codecs::codec_t::H264:
 							isIFrame = ftl::codecs::h264::isIFrame(pkt.data);
@@ -326,7 +330,7 @@ static void run(ftl::Configurable *root) {
 	}
 
 	// Allow stream recording
-	root->on("record", [&fileout,&writer,&sources](const ftl::config::Event &e) {
+	controls->on("record", [&fileout,&writer,&sources](const ftl::config::Event &e) {
 		if (e.entity->value("record", false)) {
 			char timestamp[18];
 			std::time_t t=std::time(NULL);
@@ -348,7 +352,7 @@ static void run(ftl::Configurable *root) {
 		}
 	});
 
-	root->on("3D-snapshot", [&snapshotout,&snapshotwriter,&writingSnapshot,&precedingFrames,&followingFrames](const ftl::config::Event &e) {
+	controls->on("3D-snapshot", [&snapshotout,&snapshotwriter,&writingSnapshot,&precedingFrames,&followingFrames,&sources](const ftl::config::Event &e) {
 		if (!snapshotwriter.active()) {
 			char timestamp[18];
 			std::time_t t=std::time(NULL);
@@ -358,6 +362,12 @@ static void run(ftl::Configurable *root) {
 			precedingFrames.clear();
 			followingFrames.clear();
 			snapshotwriter.begin();
+
+			for (size_t i=0; i<sources.size(); ++i) {
+				//writeSourceProperties(writer, i, sources[i]);
+				sources[i]->inject(Channel::Calibration, sources[i]->parameters(), Channel::Left, sources[i]->getCapabilities());
+				sources[i]->inject(sources[i]->getPose());
+			}
 		}
 	});
 
diff --git a/components/rgbd-sources/include/ftl/rgbd/source.hpp b/components/rgbd-sources/include/ftl/rgbd/source.hpp
index f77f2456b430141b58b3949e9370733c89f62ab5..8958173597a89c00748712a3e1fae69fbc630af0 100644
--- a/components/rgbd-sources/include/ftl/rgbd/source.hpp
+++ b/components/rgbd-sources/include/ftl/rgbd/source.hpp
@@ -220,11 +220,6 @@ class Source : public ftl::Configurable {
 
 	void inject(const Eigen::Matrix4d &pose);
 
-	template <typename... ARGS>
-	std::pair<ftl::codecs::StreamPacket, ftl::codecs::Packet> make_packet(ftl::codecs::Channel c, ARGS... args);
-
-	std::pair<ftl::codecs::StreamPacket, ftl::codecs::Packet> make_packet(const Eigen::Matrix4d &pose);
-
 	protected:
 	detail::Source *impl_;
 	Eigen::Matrix4d pose_;
@@ -260,30 +255,6 @@ class VectorBuffer {
 	std::vector<unsigned char> &vector_;
 };
 
-template <typename... ARGS>
-std::pair<ftl::codecs::StreamPacket, ftl::codecs::Packet> ftl::rgbd::Source::make_packet(ftl::codecs::Channel c, ARGS... args) {
-	auto data = std::make_tuple(args...);
-
-	ftl::codecs::StreamPacket spkt;
-	ftl::codecs::Packet pkt;
-
-	spkt.timestamp = impl_->timestamp_;
-	std::cout << "Timestamp set." << '\n';
-	spkt.channel = c;
-	spkt.channel_count = 0;
-	spkt.streamID = 0;
-	pkt.codec = ftl::codecs::codec_t::MSGPACK;
-	pkt.block_number = 0;
-	pkt.block_total = 1;
-	pkt.definition = ftl::codecs::definition_t::Any;
-	pkt.flags = 0;
-
-	VectorBuffer buf(pkt.data);
-	msgpack::pack(buf, data);
-
-	return std::make_pair(spkt, pkt);
-}
-
 template <typename... ARGS>
 void ftl::rgbd::Source::inject(ftl::codecs::Channel c, ARGS... args) {
 	if (!impl_) return;
diff --git a/components/rgbd-sources/src/source.cpp b/components/rgbd-sources/src/source.cpp
index 5bf3a92f284f29d788617eb67fc25ab5eafcd400..13cdd5487edf0b7cbc99f7cd9dd7032b43d31185 100644
--- a/components/rgbd-sources/src/source.cpp
+++ b/components/rgbd-sources/src/source.cpp
@@ -327,24 +327,6 @@ void Source::notify(int64_t ts, cv::cuda::GpuMat &c1, cv::cuda::GpuMat &c2) {
 	if (callback_) callback_(ts, c1, c2);
 }
 
-std::pair<ftl::codecs::StreamPacket, ftl::codecs::Packet> Source::make_packet(const Eigen::Matrix4d &pose) {
-	ftl::codecs::StreamPacket spkt;
-	ftl::codecs::Packet pkt;
-
-	spkt.timestamp = impl_->timestamp_;
-	spkt.channel_count = 0;
-	spkt.channel = Channel::Pose;
-	spkt.streamID = 0;
-	pkt.codec = ftl::codecs::codec_t::POSE;
-	pkt.definition = ftl::codecs::definition_t::Any;
-	pkt.block_number = 0;
-	pkt.block_total = 1;
-	pkt.flags = 0;
-	pkt.data = std::move(std::vector<uint8_t>((uint8_t*)pose.data(), (uint8_t*)pose.data() + 4*4*sizeof(double)));
-
-	return std::make_pair(spkt, pkt);
-}
-
 void Source::inject(const Eigen::Matrix4d &pose) {
 	ftl::codecs::StreamPacket spkt;
 	ftl::codecs::Packet pkt;