diff --git a/applications/gui2/src/modules/calibration/calibration.hpp b/applications/gui2/src/modules/calibration/calibration.hpp
index 00b33b3ec5288c7f49469f8c51002e2a33efa372..d98be60232d45202c262bf764815ebd516d87ef6 100644
--- a/applications/gui2/src/modules/calibration/calibration.hpp
+++ b/applications/gui2/src/modules/calibration/calibration.hpp
@@ -264,7 +264,7 @@ public:
 	std::string cameraName(int camera);
 	std::vector<std::string> cameraNames();
 
-	ftl::calibration::ExtrinsicCalibration& calib();
+	ftl::calibration::ExtrinsicCalibration& calib() { return state_.calib; } // should avoid
 
 	/** hasFrame(int) must be true before calling getFrame() **/
 	bool hasFrame(int camera);
diff --git a/applications/gui2/src/modules/calibration/extrinsic.cpp b/applications/gui2/src/modules/calibration/extrinsic.cpp
index c1e4c07e3764bcfe62f9eadf50952b81f0cc7c8d..9ed307139e212e633a5f847505db45508c4a5df1 100644
--- a/applications/gui2/src/modules/calibration/extrinsic.cpp
+++ b/applications/gui2/src/modules/calibration/extrinsic.cpp
@@ -83,7 +83,7 @@ void ExtrinsicCalibration::start(unsigned int fsid, std::vector<FrameID> sources
 		calibr.intrinsic = CalibrationData::Intrinsic(calibr.intrinsic, sz);
 
 		// Scale intrinsics
-		state_.calib.addStereoCamera(calibl.intrinsic, calibr.intrinsic);
+		state_.calib.addStereoCamera(calibl, calibr);
 
 		// Update rectification
 		unsigned int idx = state_.cameras.size() - 2;
diff --git a/applications/gui2/src/views/calibration/extrinsicview.cpp b/applications/gui2/src/views/calibration/extrinsicview.cpp
index b59f2ffa46b31802a5fa7b60c757439575324f29..d2f9f64dd2069ac36b59f50bc1fe6a40e61b5221 100644
--- a/applications/gui2/src/views/calibration/extrinsicview.cpp
+++ b/applications/gui2/src/views/calibration/extrinsicview.cpp
@@ -368,6 +368,82 @@ void ExtrinsicCalibrationView::CalibrationWindow::build() {
 		else	{ flags &= ~ExtrinsicCalibration::Flags::RATIONAL_MODEL; }
 	});
 
+	////////////////////////////////////////////////////////////////////////////
+
+	new nanogui::Label(wfreeze, "Use available (calibrated) extrinsics for cameras: ");
+	auto* use_extrinsics = new nanogui::Widget(wfreeze);
+	use_extrinsics->setLayout(new nanogui::BoxLayout
+		(nanogui::Orientation::Horizontal, nanogui::Alignment::Minimum));
+	for (int n = 0; n < ctrl_->cameraCount(); n++) {
+		auto* b = new nanogui::Button(use_extrinsics, std::to_string(n));
+		b->setFlags(nanogui::Button::Flags::ToggleButton);
+		b->setPushed(ctrl_->calib().useExtrinsic(n));
+		b->setChangeCallback([this, n](bool v){
+			LOG(INFO) << "CHANGED";
+			ctrl_->calib().setUseExtrinsic(n, v);
+		});
+	}
+	{
+		auto* b = new nanogui::Button(use_extrinsics, "All");
+		b->setCallback([this, use_extrinsics](){
+			for (int i = 0; i < use_extrinsics->childCount() - 2; i ++) {
+				auto* b = dynamic_cast<nanogui::Button*>(use_extrinsics->childAt(i));
+				b->setPushed(true);
+				b->changeCallback()(true);
+			}
+		});
+	}
+	{
+		auto* b = new nanogui::Button(use_extrinsics, "None");
+		b->setCallback([this, use_extrinsics](){
+			for (int i = 0; i < use_extrinsics->childCount() - 2; i ++) {
+				auto* b = dynamic_cast<nanogui::Button*>(use_extrinsics->childAt(i));
+				b->setPushed(false);
+				b->changeCallback()(false);
+			}
+		});
+	}
+
+	////////////////////////////////////////////////////////////////////////////
+
+	new nanogui::Label(wfreeze, "Fix extrinsics for cameras: ");
+	auto* fix_extrinsics = new nanogui::Widget(wfreeze);
+	fix_extrinsics->setLayout(new nanogui::BoxLayout
+		(nanogui::Orientation::Horizontal, nanogui::Alignment::Minimum));
+	for (int n = 0; n < ctrl_->cameraCount(); n++) {
+		auto* b = new nanogui::Button(fix_extrinsics, std::to_string(n));
+		b->setFlags(nanogui::Button::Flags::ToggleButton);
+		b->setPushed(ctrl_->calib().options().fix_camera_extrinsic.count(n));
+		b->setChangeCallback([this, n](bool v){
+			if (v) {
+				ctrl_->calib().options().fix_camera_extrinsic.insert(n);
+			}
+			else {
+				ctrl_->calib().options().fix_camera_extrinsic.erase(n);
+			}
+		});
+	}
+	{
+		auto* b = new nanogui::Button(fix_extrinsics, "All");
+		b->setCallback([this, fix_extrinsics](){
+			for (int i = 0; i < fix_extrinsics->childCount() - 2; i ++) {
+				auto* b = dynamic_cast<nanogui::Button*>(fix_extrinsics->childAt(i));
+				b->setPushed(true);
+				b->changeCallback()(true);
+			}
+		});
+	}
+	{
+		auto* b = new nanogui::Button(fix_extrinsics, "None");
+		b->setCallback([this, fix_extrinsics](){
+			for (int i = 0; i < fix_extrinsics->childCount() - 2; i ++) {
+				auto* b = dynamic_cast<nanogui::Button*>(fix_extrinsics->childAt(i));
+				b->setPushed(false);
+				b->changeCallback()(false);
+			}
+		});
+	}
+
 	/* Needs thinking: visualize visibility graph? Use earlier alignment (if
 	 * some of the cameras already calibrated), do elsewhere?
 	 */
diff --git a/components/calibration/include/ftl/calibration/extrinsic.hpp b/components/calibration/include/ftl/calibration/extrinsic.hpp
index a9f7208e39ff158cb830e0e8900b5d263defe2b6..185a45c174842b61454541822ce39e042babb4db 100644
--- a/components/calibration/include/ftl/calibration/extrinsic.hpp
+++ b/components/calibration/include/ftl/calibration/extrinsic.hpp
@@ -158,17 +158,10 @@ double calibratePair(const cv::Mat &K1, const cv::Mat &D1,
 
 class ExtrinsicCalibration {
 public:
-	/** add a single (uncalibrated) camera. Returns index of camera. */
-	unsigned int addCamera(const CalibrationData::Intrinsic &);
-
-	/** add a single calibrated camera (if valid calibration). Returns index of camera. */
+	/** add a single camera (if valid calibration). Returns index of camera. */
 	unsigned int addCamera(const CalibrationData::Calibration &);
 
-	/** Add a stereo camera pair. Pairs always use other cameras to estimate
-	 * initial pose. Returns index of first camera. */
-	unsigned int addStereoCamera(const CalibrationData::Intrinsic &, const CalibrationData::Intrinsic &);
-
-	/** Add calibrated stereo camera (if contains valid calibration) */
+	/** Add stereo camera */
 	unsigned int addStereoCamera(const CalibrationData::Calibration &, const CalibrationData::Calibration &);
 
 	const CalibrationData::Intrinsic& intrinsic(unsigned int c);
@@ -187,11 +180,16 @@ public:
 
 	/* set bundle adjustment options */
 	void setOptions(ftl::calibration::BundleAdjustment::Options options) { options_ = options; }
-	ftl::calibration::BundleAdjustment::Options options() { return options_; }
+	ftl::calibration::BundleAdjustment::Options& options() { return options_; }
 
 	/** Number of cameras added */
 	unsigned int camerasCount() { return calib_.size(); }
 
+	/** use existing extrinsic calibration for camera */
+	void setUseExtrinsic(unsigned int c, bool v) { is_calibrated_.at(c) = v; }
+	/** is existing extrinsic parameters used for given camera */
+	bool useExtrinsic(unsigned int c) { return is_calibrated_.at(c); };
+
 	/** status message */
 	std::string status();
 
diff --git a/components/calibration/include/ftl/calibration/optimize.hpp b/components/calibration/include/ftl/calibration/optimize.hpp
index 2e694cd9d7d7d77197543ba8ad7d9e097bf49f53..5a2911732d76f31bf3f53ea868ed8b5cc9c7e753 100644
--- a/components/calibration/include/ftl/calibration/optimize.hpp
+++ b/components/calibration/include/ftl/calibration/optimize.hpp
@@ -143,10 +143,10 @@ public:
 		// specific extrinsic/intrinsic options are applied on top of those.
 
 		// fix extrinsic paramters for cameras
-		std::vector<int> fix_camera_extrinsic = {};
+		std::set<int> fix_camera_extrinsic = {};
 
 		// fix intrinsic paramters for cameras
-		std::vector<int> fix_camera_intrinsic = {};
+		std::set<int> fix_camera_intrinsic = {};
 
 		bool fix_focal = false;
 		bool fix_principal_point = false;
diff --git a/components/calibration/src/extrinsic.cpp b/components/calibration/src/extrinsic.cpp
index d32961040338efec217048c1017b84588b12d443..ac8c037a578f14b1afaeacfe31a5da2aaa295d42 100644
--- a/components/calibration/src/extrinsic.cpp
+++ b/components/calibration/src/extrinsic.cpp
@@ -353,13 +353,13 @@ double calibratePair(const cv::Mat &K1, const cv::Mat &D1,
 
 // ==== Extrinsic Calibration ==================================================
 
-unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Intrinsic &c) {
+/*unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Intrinsic &c) {
 	unsigned int idx = calib_.size();
 	calib_.push_back({c, {}});
 	calib_optimized_.push_back(calib_.back());
 	is_calibrated_.push_back(false);
 	return idx;
-}
+}*/
 
 unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Calibration &c) {
 	unsigned int idx = calib_.size();
@@ -369,7 +369,7 @@ unsigned int ExtrinsicCalibration::addCamera(const CalibrationData::Calibration
 	return idx;
 }
 
-unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Intrinsic &c1, const CalibrationData::Intrinsic &c2) {
+/*unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Intrinsic &c1, const CalibrationData::Intrinsic &c2) {
 	unsigned int idx = calib_.size();
 	calib_.push_back({c1, {}});
 	calib_optimized_.push_back(calib_.back());
@@ -379,7 +379,7 @@ unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Intrin
 	is_calibrated_.push_back(false);
 	mask_.insert({idx, idx + 1});
 	return idx;
-}
+}*/
 
 unsigned int ExtrinsicCalibration::addStereoCamera(const CalibrationData::Calibration &c1, const CalibrationData::Calibration &c2) {
 	unsigned int idx = calib_.size();