diff --git a/applications/reconstruct/src/main.cpp b/applications/reconstruct/src/main.cpp
index 92a65ea44c3598fd257d53ac6c10c22dafdba0e6..c2f357e187e99c04c190df448346b1954d9e95a9 100644
--- a/applications/reconstruct/src/main.cpp
+++ b/applications/reconstruct/src/main.cpp
@@ -136,6 +136,9 @@ static void run(ftl::Configurable *root) {
 	ftl::rgbd::Group group;
 	ftl::ILW *align = ftl::create<ftl::ILW>(root, "merge");
 
+	int o = root->value("origin_pose", 0) % sources.size();
+	virt->setPose(sources[o]->getPose());
+
 	// Generate virtual camera render when requested by streamer
 	virt->onRender([splat,virt,&scene_B,align](ftl::rgbd::Frame &out) {
 		virt->setTimestamp(scene_B.timestamp);
diff --git a/components/rgbd-sources/src/virtual.cpp b/components/rgbd-sources/src/virtual.cpp
index 0166626957f2ae16ea5b9e3fa9f960dc2fc22538..9d9ccc852fd94a6aa701e7da7e4b4f48cad9d0a0 100644
--- a/components/rgbd-sources/src/virtual.cpp
+++ b/components/rgbd-sources/src/virtual.cpp
@@ -8,7 +8,8 @@ class VirtualImpl : public ftl::rgbd::detail::Source {
 	public:
 	explicit VirtualImpl(ftl::rgbd::Source *host, const ftl::rgbd::Camera &params) : ftl::rgbd::detail::Source(host) {
 		params_ = params;
-		capabilities_ = ftl::rgbd::kCapMovable | ftl::rgbd::kCapVideo | ftl::rgbd::kCapStereo;
+		capabilities_ = ftl::rgbd::kCapVideo | ftl::rgbd::kCapStereo;
+		if (!host->value("locked", false)) capabilities_ |= ftl::rgbd::kCapMovable;
 	}
 
 	~VirtualImpl() {