diff --git a/applications/gui2/src/modules/calibration/extrinsic.cpp b/applications/gui2/src/modules/calibration/extrinsic.cpp
index 9ebadc97cfbf00b0197cc502e54da7e5fde1b444..9f88e3b6c2e18af45a24f42d7878d3a4f930c7f1 100644
--- a/applications/gui2/src/modules/calibration/extrinsic.cpp
+++ b/applications/gui2/src/modules/calibration/extrinsic.cpp
@@ -242,27 +242,17 @@ bool ExtrinsicCalibration::isBusy() {
 
 void ExtrinsicCalibration::updateCalibration() {
 	auto fs = std::atomic_load(&fs_current_);
-	unsigned int nsources = fs->frames.size();
-	std::vector<CalibrationData> data(nsources);
-	std::vector<bool> update(nsources, false);
-
-	for (unsigned int i = 0; i < nsources; i++) {
-		data[i] = (*fs)[i].get<CalibrationData>(Channel::CalibrationData);
-	}
-
-	for (const auto& camera : state_.cameras) {
-		auto srcid = camera.id.source();
-		data[srcid].get(camera.id.channel) = camera.calib;
-		update[srcid] = true;
-	}
-
-	for (unsigned int i = 0; i < nsources; i++) {
-		setCalibration((*fs)[i], data[i]);
+	for (unsigned int i = 0; i < state_.cameras.size(); i++) {
+		auto& c = state_.cameras[i];
+		auto& frame = fs->frames[c.id];
+		auto calib = frame.get<CalibrationData>(Channel::CalibrationData);
+		calib.get(c.id.channel) = state_.calib.calibration(i);
+		setCalibration(frame, calib);
 	}
 }
 
 void ExtrinsicCalibration::updateCalibration(int c) {
-
+	throw ftl::exception("Not implemented");
 }
 
 void ExtrinsicCalibration::stereoRectify(int cl, int cr,
@@ -360,8 +350,6 @@ int ExtrinsicCalibration::getFrameCount(int camera) {
 
 // debug method: save state to file (msgpack)
 void ExtrinsicCalibration::saveInput(const std::string& filename) {
-	LOG(WARNING) << "DISABLED";
-	return;
 	ftl::pool.push([this, filename](int){
 		do {
 			// calib must not be modified; would be better to have mutex here
diff --git a/applications/gui2/src/views/calibration/extrinsicview.cpp b/applications/gui2/src/views/calibration/extrinsicview.cpp
index 284ba035ba410a06e7fa1a6505f25ad025b2c2c4..4e583f6c2124f56e91eb30d16acbea2485e979d9 100644
--- a/applications/gui2/src/views/calibration/extrinsicview.cpp
+++ b/applications/gui2/src/views/calibration/extrinsicview.cpp
@@ -193,9 +193,8 @@ ExtrinsicCalibrationView::ControlWindow::ControlWindow(nanogui::Widget* parent,
 	bupload_ = new nanogui::Button(buttons, "", ENTYPO_ICON_UPLOAD);
 	bupload_->setTooltip("Save input to sources");
 	bupload_->setCallback([this](){
-		ctrl_->save();
+		ctrl_->updateCalibration();
 		bupload_->setTextColor(nanogui::Color(32, 192, 32, 255));
-		bupload_->setEnabled(false);
 	});
 
 	bresults_ = new nanogui::Button(buttons, "Show Calibration");