diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp
index 12c1a2634fa6010f202f806b5ee268f0d707014c..c22675f7e38b86976264b4d1940602f8952a74cb 100644
--- a/applications/gui2/src/modules/camera.hpp
+++ b/applications/gui2/src/modules/camera.hpp
@@ -49,6 +49,7 @@ public:
 	inline bool isLive() const { return live_; }
 	inline bool isTouchable() const { return touch_; }
 	inline bool isMovable() const { return movable_; }
+	inline bool isVR() const { return vr_; }
 
 	ftl::render::Colouriser* colouriser() { return colouriser_.get(); };
 	ftl::overlay::Overlay* overlay() { return overlay_.get(); }
diff --git a/applications/gui2/src/views/camera.cpp b/applications/gui2/src/views/camera.cpp
index fcf7a4a57e0d4aac645506c6b4603aad4d6c8888..b70f82da0d767d0006fca1e3230446a355bc853a 100644
--- a/applications/gui2/src/views/camera.cpp
+++ b/applications/gui2/src/views/camera.cpp
@@ -377,6 +377,8 @@ CameraView::CameraView(ftl::gui2::Screen* parent, ftl::gui2::Camera* ctrl) :
 	imview_ = new ftl::gui2::FTLImageView(this);
 	panel_ = new ftl::gui2::MediaPanel(screen(), ctrl, this);
 
+	imview_->setFlipped(ctrl->isVR());
+
 	auto *mod = ctrl_->screen->getModule<ftl::gui2::Statistics>();
 	if (ctrl_->isMovable()) {
 		imview_->setCursor(nanogui::Cursor::Hand);
diff --git a/applications/gui2/src/widgets/imageview.cpp b/applications/gui2/src/widgets/imageview.cpp
index 178ce2f3e09f26ebefc3b71d7bf411cd51554d27..3562577975d3d882b3599e6efbbc693811bb5c8f 100644
--- a/applications/gui2/src/widgets/imageview.cpp
+++ b/applications/gui2/src/widgets/imageview.cpp
@@ -49,13 +49,14 @@ namespace {
 		R"(#version 330
 		uniform vec2 scaleFactor;
 		uniform vec2 position;
+		uniform float flip_y;
 		in vec2 vertex;
 		out vec2 uv;
 		void main() {
 			uv = vertex;
 			vec2 scaledVertex = (vertex * scaleFactor) + position;
 			gl_Position  = vec4(2.0*scaledVertex.x - 1.0,
-								1.0 - 2.0*scaledVertex.y,
+								flip_y*(1.0 - 2.0*scaledVertex.y),
 								0.0, 1.0);
 
 		})";
@@ -322,6 +323,7 @@ void ftl::gui2::ImageView::draw(NVGcontext* ctx) {
 		glActiveTexture(GL_TEXTURE0);
 		glBindTexture(GL_TEXTURE_2D, mImageID);
 		mShader.setUniform("image", 0);
+		mShader.setUniform("flip_y", (flipped_) ? -1.0f : 1.0f);
 		mShader.setUniform("scaleFactor", scaleFactor);
 		mShader.setUniform("position", imagePosition);
 		mShader.drawIndexed(GL_TRIANGLES, 0, 2);
diff --git a/applications/gui2/src/widgets/imageview.hpp b/applications/gui2/src/widgets/imageview.hpp
index f7541c5d78f548056fff51bfbd4acbde874b033b..740152cdf15183a2aed2440c53ea52edb1059fa3 100644
--- a/applications/gui2/src/widgets/imageview.hpp
+++ b/applications/gui2/src/widgets/imageview.hpp
@@ -55,6 +55,8 @@ public:
 	float scale() const { return mScale; }
 	void setScale(float scale) { mScale = scale > 0.01f ? scale : 0.01f; }
 
+	inline void setFlipped(bool flipped) { flipped_ = flipped; }
+
 	bool fixedOffset() const { return mFixedOffset; }
 	void setFixedOffset(bool fixedOffset) { mFixedOffset = fixedOffset; }
 	bool fixedScale() const { return mFixedScale; }
@@ -166,6 +168,7 @@ protected:
 	nanogui::Vector2f mOffset;
 	bool mFixedScale;
 	bool mFixedOffset;
+	bool flipped_ = false;
 
 	// Fine-tuning parameters.
 	float mZoomSensitivity = 1.1f;