diff --git a/src/ipa/simple/algorithms/ccm.cpp b/src/ipa/simple/algorithms/ccm.cpp
index a3e8cd6c4..52dd11aaa 100644
--- a/src/ipa/simple/algorithms/ccm.cpp
+++ b/src/ipa/simple/algorithms/ccm.cpp
@@ -91,24 +91,22 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame,
 	const unsigned int ct = context.activeState.awb.temperatureK;
 
 	/* Change CCM only on saturation or bigger temperature changes. */
-	if (frame > 0 &&
-	    utils::abs_diff(ct, lastCt_) < kTemperatureThreshold &&
-	    saturation == lastSaturation_) {
-		frameContext.ccm = context.activeState.ccm;
-		return;
+	if (frame == 0 ||
+	    utils::abs_diff(ct, lastCt_) >= kTemperatureThreshold ||
+	    saturation != lastSaturation_) {
+		currentCcm_ = ccm_.getInterpolated(ct);
+		if (saturation)
+			applySaturation(currentCcm_, saturation.value());
+		lastCt_ = ct;
+		lastSaturation_ = saturation;
+		context.activeState.matrixChanged = true;
 	}
 
-	lastCt_ = ct;
-	lastSaturation_ = saturation;
-	Matrix<float, 3, 3> ccm = ccm_.getInterpolated(ct);
-	if (saturation)
-		applySaturation(ccm, saturation.value());
-
-	context.activeState.combinedMatrix = ccm;
-	context.activeState.ccm = ccm;
+	context.activeState.combinedMatrix =
+		currentCcm_ * context.activeState.combinedMatrix;
+	context.activeState.ccm = currentCcm_;
 	frameContext.saturation = saturation;
-	context.activeState.matrixChanged = true;
-	frameContext.ccm = ccm;
+	frameContext.ccm = currentCcm_;
 }
 
 void Ccm::process([[maybe_unused]] IPAContext &context,
diff --git a/src/ipa/simple/algorithms/ccm.h b/src/ipa/simple/algorithms/ccm.h
index 8279a3d59..c29f394f0 100644
--- a/src/ipa/simple/algorithms/ccm.h
+++ b/src/ipa/simple/algorithms/ccm.h
@@ -47,6 +47,7 @@ private:
 	unsigned int lastCt_;
 	std::optional<float> lastSaturation_;
 	Interpolator<Matrix<float, 3, 3>> ccm_;
+	Matrix<float, 3, 3> currentCcm_;
 };
 
 } /* namespace ipa::soft::algorithms */
diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp
index b147aca2e..98582587c 100644
--- a/src/ipa/simple/soft_simple.cpp
+++ b/src/ipa/simple/soft_simple.cpp
@@ -296,6 +296,8 @@ void IPASoftSimple::queueRequest(const uint32_t frame, const ControlList &contro
 
 void IPASoftSimple::computeParams(const uint32_t frame)
 {
+	context_.activeState.combinedMatrix = Matrix<float, 3, 3>::identity();
+
 	IPAFrameContext &frameContext = context_.frameContexts.get(frame);
 	for (auto const &algo : algorithms())
 		algo->prepare(context_, frame, frameContext, params_);
