diff --git a/applications/gui/src/camera.cpp b/applications/gui/src/camera.cpp
index a3fee9a9ff7c5249617990680c9947f5889d64fc..82cb19091a57ffa2a8c855aa7d980f35c0fda727 100644
--- a/applications/gui/src/camera.cpp
+++ b/applications/gui/src/camera.cpp
@@ -352,7 +352,10 @@ void ftl::gui::Camera::_draw(std::vector<ftl::rgbd::FrameSet*> &fss) {
 void ftl::gui::Camera::_downloadFrames(ftl::rgbd::Frame *frame) {
 	if (!frame) return;
 
-	auto &channel1 = frame->get<GpuMat>(Channel::Colour);
+	// Use high res colour if available..
+	auto &channel1 = (frame->hasChannel(Channel::ColourHighRes)) ? 
+			frame->get<GpuMat>(Channel::ColourHighRes) :
+			frame->get<GpuMat>(Channel::Colour);
 	im1_.create(channel1.size(), channel1.type());
 	channel1.download(im1_);
 
diff --git a/components/rgbd-sources/src/sources/stereovideo/calibrate.cpp b/components/rgbd-sources/src/sources/stereovideo/calibrate.cpp
index ba031ccd89806016b2ee17b5fe7cd15dab955403..eef55614ea78735ee32c55c054b1c9158c926c61 100644
--- a/components/rgbd-sources/src/sources/stereovideo/calibrate.cpp
+++ b/components/rgbd-sources/src/sources/stereovideo/calibrate.cpp
@@ -139,7 +139,7 @@ Mat Calibrate::_getK(size_t idx) {
 
 Mat Calibrate::getCameraMatrixLeft(const cv::Size res) {
 	if (rectify_) {
-		return Mat(P1_, cv::Rect(0, 0, 3, 3));
+		return scaleCameraIntrinsics(Mat(P1_, cv::Rect(0, 0, 3, 3)), res, img_size_);
 	} else {
 		return scaleCameraIntrinsics(K_[0], res, calib_size_);
 	}
@@ -147,7 +147,7 @@ Mat Calibrate::getCameraMatrixLeft(const cv::Size res) {
 
 Mat Calibrate::getCameraMatrixRight(const cv::Size res) {
 	if (rectify_) {
-		return Mat(P2_, cv::Rect(0, 0, 3, 3));
+		return scaleCameraIntrinsics(Mat(P2_, cv::Rect(0, 0, 3, 3)), res, img_size_);
 	} else {
 		return scaleCameraIntrinsics(K_[1], res, calib_size_);
 	}
diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp
index d5af31e8e1e6804a7c17af319fb079707148dea2..a16e0734907b02b58d8f3eef32ae520e468369e4 100644
--- a/components/streams/src/sender.cpp
+++ b/components/streams/src/sender.cpp
@@ -163,8 +163,8 @@ void Sender::post(ftl::rgbd::FrameSet &fs) {
 		for (auto c : frame.getChannels()) {
 			if (selected.has(c)) {
 				// FIXME: Sends high res colour, but receive end currently broken
-				//auto cc = (c == Channel::Colour && frame.hasChannel(Channel::ColourHighRes)) ? Channel::ColourHighRes : Channel::Colour;
-				auto cc = c;
+				auto cc = (c == Channel::Colour && frame.hasChannel(Channel::ColourHighRes)) ? Channel::ColourHighRes : c;
+				//auto cc = c;
 
 				StreamPacket spkt;
 				spkt.version = 4;
@@ -230,6 +230,8 @@ void Sender::_encodeChannel(ftl::rgbd::FrameSet &fs, Channel c, bool reset) {
 
 	uint32_t offset = 0;
 	while (offset < fs.frames.size()) {
+		auto cc = (c == Channel::Colour && fs.frames[offset].hasChannel(Channel::ColourHighRes)) ? Channel::ColourHighRes : c;
+
 		StreamPacket spkt;
 		spkt.version = 4;
 		spkt.timestamp = fs.timestamp;
@@ -237,7 +239,7 @@ void Sender::_encodeChannel(ftl::rgbd::FrameSet &fs, Channel c, bool reset) {
 		spkt.frame_number = offset;
 		spkt.channel = c;
 
-		auto &tile = _getTile(fs.id, c);
+		auto &tile = _getTile(fs.id, cc);
 
 		ftl::codecs::Encoder *enc = tile.encoder[(offset==0)?0:1];
 		if (!enc) {
@@ -254,11 +256,11 @@ void Sender::_encodeChannel(ftl::rgbd::FrameSet &fs, Channel c, bool reset) {
 		// Upload if in host memory
 		for (auto &f : fs.frames) {
 			if (f.isCPU(c)) {
-				f.upload(Channels<0>(c), cv::cuda::StreamAccessor::getStream(enc->stream()));
+				f.upload(Channels<0>(cc), cv::cuda::StreamAccessor::getStream(enc->stream()));
 			}
 		}
 
-		int count = _generateTiles(fs, offset, c, enc->stream(), lossless);
+		int count = _generateTiles(fs, offset, cc, enc->stream(), lossless);
 		if (count <= 0) {
 			LOG(ERROR) << "Could not generate tiles.";
 			break;
@@ -277,15 +279,15 @@ void Sender::_encodeChannel(ftl::rgbd::FrameSet &fs, Channel c, bool reset) {
 				pkt.frame_count = count;
 				pkt.codec = codec;
 				pkt.definition = definition_t::Any;
-				pkt.bitrate = (!lossless && ftl::codecs::isFloatChannel(c)) ? max_bitrate : max_bitrate/2;
+				pkt.bitrate = (!lossless && ftl::codecs::isFloatChannel(cc)) ? max_bitrate : max_bitrate/2;
 				pkt.flags = 0;
 
-				if (!lossless && ftl::codecs::isFloatChannel(c)) pkt.flags = ftl::codecs::kFlagFloat | ftl::codecs::kFlagMappedDepth;
-				else if (lossless && ftl::codecs::isFloatChannel(c)) pkt.flags = ftl::codecs::kFlagFloat;
+				if (!lossless && ftl::codecs::isFloatChannel(cc)) pkt.flags = ftl::codecs::kFlagFloat | ftl::codecs::kFlagMappedDepth;
+				else if (lossless && ftl::codecs::isFloatChannel(cc)) pkt.flags = ftl::codecs::kFlagFloat;
 				else pkt.flags = ftl::codecs::kFlagFlipRGB;
 
 				// Choose correct region of interest into the surface.
-				cv::Rect roi = _generateROI(fs, c, offset);
+				cv::Rect roi = _generateROI(fs, cc, offset);
 				cv::cuda::GpuMat sroi = tile.surface(roi);
 
 				if (enc->encode(sroi, pkt)) {
@@ -376,8 +378,10 @@ int Sender::_generateTiles(const ftl::rgbd::FrameSet &fs, int offset, Channel c,
 			}
 		} else if (m.type() == CV_8UC4) {
 			cv::cuda::cvtColor(m, sroi, cv::COLOR_BGRA2RGBA, 0, stream);
+		} else if (m.type() == CV_8UC3) {
+			cv::cuda::cvtColor(m, sroi, cv::COLOR_BGR2RGBA, 0, stream);
 		} else {
-			LOG(ERROR) << "Unsupported colour format";
+			LOG(ERROR) << "Unsupported colour format: " << m.type();
 			return 0;
 		}