diff --git a/applications/gui2/src/modules/camera.cpp b/applications/gui2/src/modules/camera.cpp
index 7049f0b44c671e67510f6c32fd9f2b11514a99d8..f527a4cc1db01603120e1c0d6f6537409aeed002 100644
--- a/applications/gui2/src/modules/camera.cpp
+++ b/applications/gui2/src/modules/camera.cpp
@@ -428,7 +428,11 @@ bool Camera::hasFrame() {
 }
 
 Eigen::Matrix4d Camera::cursor() const {
-	return nanogui::lookAt(cursor_pos_, cursor_target_, cursor_normal_).cast<double>();
+	if (cursor_normal_.norm() > 0.0f) return nanogui::lookAt(cursor_pos_, cursor_target_, cursor_normal_).cast<double>();
+
+	Eigen::Matrix4d ident;
+	ident.setIdentity();
+	return ident;
 }
 
 void Camera::drawOverlay(NVGcontext *ctx, const nanogui::Vector2f &s, const nanogui::Vector2f &is, const Eigen::Vector2f &offset) {
@@ -573,6 +577,14 @@ void Camera::setCursor(int x, int y) {
 
 void Camera::setOriginToCursor() {
 	using ftl::calibration::transform::inverse;
+	
+	// Check for valid cursor
+	if (cursor_normal_.norm() == 0.0f) return;
+	float cursor_length = (cursor_target_ - cursor_pos_).norm();
+	float cursor_dist = cursor_pos_.norm();
+	if (cursor_length < 0.01f || cursor_length > 5.0f) return;
+	if (cursor_dist > 10.0f) return;
+
 	if (movable_) {
 		auto *rend = io->feed()->getRenderer(frame_id_);
 		if (rend) {
@@ -596,4 +608,37 @@ void Camera::setOriginToCursor() {
 			}
 		}
 	}
+
+	cursor_target_ = Eigen::Vector3f(0.0f,0.0f,0.0f); 
+	cursor_pos_ = Eigen::Vector3f(0.0f,0.0f,0.0f);
+	cursor_normal_ = Eigen::Vector3f(0.0f,0.0f,0.0f); 
+}
+
+void Camera::resetOrigin() {
+	cursor_target_ = Eigen::Vector3f(0.0f,0.0f,0.0f); 
+	cursor_pos_ = Eigen::Vector3f(0.0f,0.0f,0.0f);
+	cursor_normal_ = Eigen::Vector3f(0.0f,0.0f,0.0f); 
+
+	if (movable_) {
+		auto *rend = io->feed()->getRenderer(frame_id_);
+		if (rend) {
+			auto *filter = rend->filter();
+			if (filter) {
+				cv::Mat cur;
+				cv::eigen2cv(cursor(), cur);
+				auto fss = filter->getLatestFrameSets();
+				for (auto &fs : fss) {
+					if (fs->frameset() == frame_id_.frameset()) continue;
+
+					for (auto &f : fs->frames) {
+						auto response = f.response();
+						auto &rgbdf = response.cast<ftl::rgbd::Frame>();
+						auto &calib = rgbdf.setCalibration();
+						calib = f.cast<ftl::rgbd::Frame>().getCalibration();
+						calib.origin = cur;
+					}
+				};
+			}
+		}
+	}
 }
diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp
index ec1ae47dcc7cd376684c0230ecd411112b2c5d29..d314f0a7a8ba9873ed27c7cf6bf6913c9c46d457 100644
--- a/applications/gui2/src/modules/camera.hpp
+++ b/applications/gui2/src/modules/camera.hpp
@@ -81,6 +81,7 @@ public:
 	const Eigen::Vector3f getCursorPosition() const { return cursor_pos_; }
 
 	void setOriginToCursor();
+	void resetOrigin();
 
 private:
 	int frame_idx = -1;