diff --git a/components/rgbd-sources/src/calibrate.cpp b/components/rgbd-sources/src/calibrate.cpp
index 24aa650810be7810c09bc3d5dd7947c9895aa787..c3a84ef9613cb9e6956ee67582de5ed279f85beb 100644
--- a/components/rgbd-sources/src/calibrate.cpp
+++ b/components/rgbd-sources/src/calibrate.cpp
@@ -5,6 +5,7 @@
 #include <loguru.hpp>
 #include <ftl/config.h>
 #include <ftl/configuration.hpp>
+#include <ftl/threads.hpp>
 
 #include <iostream>
 #include <sstream>
@@ -46,15 +47,42 @@ Calibrate::Calibrate(nlohmann::json &config, cv::Size image_size, cv::cuda::Stre
 	calibrated_ = _loadCalibration(image_size, map1, map2);
 
 	if (calibrated_) {
+		_updateIntrinsics();
 		LOG(INFO) << "Calibration loaded from file";
-		map1_gpu_.first.upload(map1.first, stream);
-		map1_gpu_.second.upload(map1.second, stream);
-		map2_gpu_.first.upload(map2.first, stream);
-		map2_gpu_.second.upload(map2.second, stream);
 	}
 	else {
 		LOG(WARNING) << "Calibration not loaded";
 	}
+	
+	this->on("use_intrinsics", [this](const ftl::config::Event &e) {
+		_updateIntrinsics();
+	});
+}
+
+void Calibrate::_updateIntrinsics() {
+	Mat R1, R2, P1, P2;
+	std::pair<Mat, Mat> map1, map2;
+
+	if (this->value("use_intrinsics", true)) {
+		R1 = R1_;
+		R2 = R2_;
+		P1 = P1_;
+		P2 = P2_;
+	}
+	else {
+		R1 = Mat::eye(Size(3, 3), CV_64FC1);
+		R2 = R1;
+		P1 = M1_;
+		P2 = M2_;
+	}
+
+	initUndistortRectifyMap(M1_, D1_, R1, P1, img_size_, CV_32FC1, map1.first, map2.first);
+	initUndistortRectifyMap(M2_, D2_, R2, P2, img_size_, CV_32FC1, map1.second, map2.second);
+	
+	map1_gpu_.first.upload(map1.first);
+	map1_gpu_.second.upload(map1.second);
+	map2_gpu_.first.upload(map2.first);
+	map2_gpu_.second.upload(map2.second);
 }
 
 bool Calibrate::_loadCalibration(cv::Size img_size, std::pair<Mat, Mat> &map1, std::pair<Mat, Mat> &map2) {
diff --git a/components/rgbd-sources/src/calibrate.hpp b/components/rgbd-sources/src/calibrate.hpp
index b8b98116bf07b54526a0f8f7a7d6602904b5e1d1..fd43f21b294dd0e319620ce9bf4783a8345f141b 100644
--- a/components/rgbd-sources/src/calibrate.hpp
+++ b/components/rgbd-sources/src/calibrate.hpp
@@ -43,7 +43,7 @@ class Calibrate : public ftl::Configurable {
 	bool isCalibrated();
 
 	void updateCalibration(const ftl::rgbd::Camera &p);
-
+	
 	/**
 	 * Get the camera matrix. Used to convert disparity map back to depth and
 	 * a 3D point cloud.
@@ -52,6 +52,7 @@ class Calibrate : public ftl::Configurable {
 	const cv::Mat &getCameraMatrix() const { return P_; }
 
 private:
+	void _updateIntrinsics();
 	bool _loadCalibration(cv::Size img_size, std::pair<cv::Mat, cv::Mat> &map1, std::pair<cv::Mat, cv::Mat> &map2);
 	
 	private: