diff --git a/components/renderers/cpp/src/CUDARender.cpp b/components/renderers/cpp/src/CUDARender.cpp
index 3b5a6adc403a05975cdb634467e270cc48f5a243..dab897d5696f78ebffbec097485778bebd57c03b 100644
--- a/components/renderers/cpp/src/CUDARender.cpp
+++ b/components/renderers/cpp/src/CUDARender.cpp
@@ -250,6 +250,9 @@ void CUDARender::_mesh(ftl::rgbd::Frame &out, const Eigen::Matrix4d &t, cudaStre
 
 	int valid_count = 0;
 
+	// FIXME: Is it possible to remember previously if there should be depth?
+	bool use_depth = scene_->anyHasChannel(Channel::Depth) || scene_->anyHasChannel(Channel::GroundTruth);
+
 	// For each source depth map
 	for (size_t i=0; i < scene_->frames.size(); ++i) {
 		//if (!scene_->hasFrame(i)) continue;
@@ -261,6 +264,11 @@ void CUDARender::_mesh(ftl::rgbd::Frame &out, const Eigen::Matrix4d &t, cudaStre
 			continue;
 		}
 
+		// We have the needed depth data?
+		if (use_depth && !f.hasOwn(Channel::Depth) && !f.hasOwn(Channel::GroundTruth)) {
+			continue;
+		}
+
 		++valid_count;
 
 		//auto pose = MatrixConversion::toCUDA(t.cast<float>() * f.getPose().cast<float>());
@@ -273,20 +281,22 @@ void CUDARender::_mesh(ftl::rgbd::Frame &out, const Eigen::Matrix4d &t, cudaStre
 		auto &screenbuffer = _getScreenBuffer(bufsize);
 
 		// Calculate and save virtual view screen position of each source pixel
-		if (f.hasChannel(Channel::Depth)) {
-			ftl::cuda::screen_coord(
-				f.createTexture<float>(Channel::Depth),
-				depthbuffer,
-				screenbuffer,
-				params_, transform, f.getLeftCamera(), stream
-			);
-		} else if (f.hasChannel(Channel::GroundTruth)) {
-			ftl::cuda::screen_coord(
-				f.createTexture<float>(Channel::GroundTruth),
-				depthbuffer,
-				screenbuffer,
-				params_, transform, f.getLeftCamera(), stream
-			);
+		if (use_depth) {
+			if (f.hasChannel(Channel::Depth)) {
+				ftl::cuda::screen_coord(
+					f.createTexture<float>(Channel::Depth),
+					depthbuffer,
+					screenbuffer,
+					params_, transform, f.getLeftCamera(), stream
+				);
+			} else if (f.hasChannel(Channel::GroundTruth)) {
+				ftl::cuda::screen_coord(
+					f.createTexture<float>(Channel::GroundTruth),
+					depthbuffer,
+					screenbuffer,
+					params_, transform, f.getLeftCamera(), stream
+				);
+			}
 		} else {
 			// Constant depth version
 			ftl::cuda::screen_coord(
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index 695cf8cfd9138642862d10abda5cfa6114a899fc..6822813cb30c7bddb12c39c6384ad89ac130913f 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -192,7 +192,10 @@ Feed::Feed(nlohmann::json &config, ftl::net::Universe*net) :
 				});
 
 				if (!did_pipe) {
-					LOG(WARNING) << "GUI Pipeline dropped";
+					LOG(WARNING) << "Feed Pipeline dropped";
+					ftl::pool.push([this,fs](int id) {
+						_dispatch(fs);
+					});
 				}
 			} else {
 				_dispatch(fs);
diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp
index 44aadc932f563b82059a3e634ec7b11efcb9d783..b4d9d409323cb7a1e8d66d46c4e0e8458398eaf5 100644
--- a/components/streams/src/sender.cpp
+++ b/components/streams/src/sender.cpp
@@ -490,19 +490,12 @@ void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset)
 	int encoder_number = 0;
 	while (offset < fs.frames.size()) {
 		Channel cc = c;
-		//if ((cc == Channel::Colour) && fs.firstFrame().hasChannel(Channel::ColourHighRes)) {
-		//	cc = Channel::ColourHighRes;
-		//}
-		
-		//if ((cc == Channel::Right) && fs.firstFrame().hasChannel(Channel::RightHighRes)) {
-		//	cc = Channel::RightHighRes;
-		//	fs.frames[offset].upload(cc);
-		//}
 
-		if (!fs.frames[offset].hasChannel(cc)) {
-			offset++;
-			continue;
-		}
+		// FIXME: Don't change tile layout when channel temporarily drops.
+		//if (!fs.frames[offset].hasChannel(cc)) {
+		//	offset++;
+		//	continue;
+		//}
 
 		StreamPacket spkt;
 		spkt.version = 5;
@@ -545,9 +538,6 @@ void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset)
 			break;
 		}
 
-		//cudaSafeCall(cudaStreamSynchronize(enc->stream()));
-		//enc->stream().waitForCompletion();
-
 		if (enc) {
 			if (reset) enc->reset();
 
@@ -644,8 +634,6 @@ void Sender::_encodeAudioChannel(ftl::data::FrameSet &fs, Channel c, bool reset)
 }
 
 void Sender::_encodeDataChannel(ftl::data::FrameSet &fs, Channel c, bool reset) {
-	int i=0;
-
 	// TODO: Pack all frames into a single packet
 	for (auto &f : fs.frames) {
 		StreamPacket spkt;
diff --git a/components/structures/include/ftl/data/new_frameset.hpp b/components/structures/include/ftl/data/new_frameset.hpp
index 8dcc4b3b27f332139e5c18b9d42312cc2af9ccba..6eafe9cb59a4c7d0f53033ba8e903c6ed9e55207 100644
--- a/components/structures/include/ftl/data/new_frameset.hpp
+++ b/components/structures/include/ftl/data/new_frameset.hpp
@@ -134,6 +134,8 @@ class FrameSet : public ftl::data::Frame {
 	 */
 	bool hasAnyChanged(ftl::codecs::Channel) const;
 
+	bool anyHasChannel(ftl::codecs::Channel) const;
+
 	private:
 	std::atomic<int> flags_;
 };
diff --git a/components/structures/src/frameset.cpp b/components/structures/src/frameset.cpp
index cba77a2136cb6222f6fea9f2d6f77a2debb5eb2a..e8cfd9404535e1fdfe410596fc92cf35a83e39ec 100644
--- a/components/structures/src/frameset.cpp
+++ b/components/structures/src/frameset.cpp
@@ -78,6 +78,13 @@ bool ftl::data::FrameSet::hasAnyChanged(ftl::codecs::Channel c) const {
 	return false;
 }
 
+bool ftl::data::FrameSet::anyHasChannel(ftl::codecs::Channel c) const {
+	for (size_t i=0; i<frames.size(); ++i) {
+		if (frames[i].hasOwn(c)) return true;
+	}
+	return false;
+}
+
 void FrameSet::store() {
 	if (status() != ftl::data::FrameStatus::CREATED) throw FTL_Error("Cannot store frameset multiple times");