diff --git a/components/streams/src/renderers/openvr_render.cpp b/components/streams/src/renderers/openvr_render.cpp
index adcf371177cdac08529227bca8ae81663b02cdd1..815fefd0f6d051bc3dea106c4b938191a942f2cd 100644
--- a/components/streams/src/renderers/openvr_render.cpp
+++ b/components/streams/src/renderers/openvr_render.cpp
@@ -37,9 +37,9 @@ OpenVRRender::OpenVRRender(ftl::render::Source *host, ftl::stream::Feed *feed)
 		ftl::create<ftl::render::CUDARender>(host_, "renderer")
 	);
 
-	renderer2_ = std::unique_ptr<ftl::render::CUDARender>(
+	/*renderer2_ = std::unique_ptr<ftl::render::CUDARender>(
 		ftl::create<ftl::render::CUDARender>(host_, "renderer2")
-	);
+	);*/
 
 	intrinsics_ = ftl::create<ftl::Configurable>(host_, "intrinsics");
 
@@ -353,7 +353,7 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) {
 		texture2_.make(width, height, ftl::utility::GLTexture::Type::BGRA);
 		
 		rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour) = texture1_.map(renderer_->getCUDAStream());
-		rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour2) = texture2_.map(renderer2_->getCUDAStream());
+		rgbdframe.create<cv::cuda::GpuMat>(Channel::Colour2) = texture2_.map(renderer_->getCUDAStream());
 		rgbdframe.create<cv::cuda::GpuMat>(Channel::Depth).create(height, width, CV_32F);
 		rgbdframe.createTexture<float>(Channel::Depth);
 
@@ -371,7 +371,7 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) {
 
 		try {
 			renderer_->begin(rgbdframe, ftl::codecs::Channel::Left);
-			renderer2_->begin(rgbdframe, Channel::Colour2);
+			//renderer2_->begin(rgbdframe, Channel::Colour2);
 
 			for (auto &s : sets) {
 				if (s->frameset() == my_id_) continue;  // Skip self
@@ -388,14 +388,14 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) {
 					ftl::codecs::Channels<0>(ftl::codecs::Channel::Colour),
 					pose);
 
-				renderer2_->submit(
+				/*renderer2_->submit(
 					s.get(),
 					ftl::codecs::Channels<0>(ftl::codecs::Channel::Colour),
-					pose);
+					pose);*/
 			}
 
 			renderer_->render();
-			renderer2_->render();
+			//renderer2_->render();
 
 			// Now do CPU-based render jobs
 			for (auto &s : sets) {
@@ -437,6 +437,51 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) {
 				}
 			}
 
+			/*mixer_.mix();
+
+			// Write mixed audio to frame.
+			if (mixer_.frames() > 0) {
+				auto &list = frame_out.create<std::list<ftl::audio::Audio>>(Channel::AudioStereo).list;
+				list.clear();
+
+				int fcount = mixer_.frames();
+				mixer_.read(list.emplace_front().data(), fcount);
+			}*/
+
+			// TODO: Blend option
+
+			renderer_->end();
+
+			// Now do right eye  ###############################################
+
+			renderer_->begin(rgbdframe, ftl::codecs::Channel::Right);
+			//renderer2_->begin(rgbdframe, Channel::Colour2);
+
+			for (auto &s : sets) {
+				if (s->frameset() == my_id_) continue;  // Skip self
+
+				Eigen::Matrix4d pose;
+				pose.setIdentity();
+				if (s->hasChannel(Channel::Pose)) pose = s->cast<ftl::rgbd::Frame>().getPose();
+
+				// TODO: Check frame has required channels?
+
+				// FIXME: Don't use identity transform, get from Poser somehow.
+				renderer_->submit(
+					s.get(),
+					ftl::codecs::Channels<0>(ftl::codecs::Channel::Colour),
+					pose);
+
+				/*renderer2_->submit(
+					s.get(),
+					ftl::codecs::Channels<0>(ftl::codecs::Channel::Colour),
+					pose);*/
+			}
+
+			renderer_->render();
+			//renderer2_->render();
+
+			
 			mixer_.mix();
 
 			// Write mixed audio to frame.
@@ -451,11 +496,12 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) {
 			// TODO: Blend option
 
 			renderer_->end();
-			renderer2_->end();
+
+			//renderer2_->end();
 		} catch (const std::exception &e) {
 			LOG(ERROR) << "Render exception: " << e.what();
 			renderer_->cancel();
-			renderer2_->cancel();
+			//renderer2_->cancel();
 			frame_out.message(ftl::data::Message::Error_RENDER, e.what());
 		}
 
@@ -473,13 +519,15 @@ bool OpenVRRender::retrieve(ftl::data::Frame &frame_out) {
 		}
 
 		// FIXME: Use a stream
-		ftl::cuda::flip<uchar4>(rgbdframe.set<cv::cuda::GpuMat>(Channel::Colour), 0);
-		ftl::cuda::flip<uchar4>(rgbdframe.set<cv::cuda::GpuMat>(Channel::Colour2), 0);
+		ftl::cuda::flip<uchar4>(rgbdframe.set<cv::cuda::GpuMat>(Channel::Colour), renderer_->getCUDAStream());
+		ftl::cuda::flip<uchar4>(rgbdframe.set<cv::cuda::GpuMat>(Channel::Colour2), renderer_->getCUDAStream());
 
 		texture1_.unmap(renderer_->getCUDAStream());
-		texture2_.unmap(renderer2_->getCUDAStream());
+		texture2_.unmap(renderer_->getCUDAStream());
 		//return true;
 
+		cudaSafeCall(cudaStreamSynchronize(stream_));
+
 		// Send left and right textures to VR headset
 		vr::Texture_t leftEyeTexture = {(void*)(uintptr_t)texture1_.texture(), vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
 		vr::VRCompositor()->Submit(vr::Eye_Left, &leftEyeTexture );