diff --git a/ipu3.cpp b/ipu3.cpp
index f38440d..ffa78b3 100644
--- a/ipu3.cpp
+++ b/ipu3.cpp
@@ -56,6 +56,7 @@ private:
 			    const ControlInfoMap &sensorControls,
 			    ControlInfoMap *ipaControls);
 	void processControls(unsigned int frame, const ControlList &metadata);
+	void runAiq(unsigned int frame);
 	void fillParams(unsigned int frame, ipu3_uapi_params *params);
 	void parseStatistics(unsigned int frame,
 			     int64_t frameTimestamp,
@@ -220,6 +221,7 @@ int IPAIPU3::init(const IPASettings &settings,
 
 int IPAIPU3::start()
 {
+	runAiq(0);
 	setControls(0);
 
 	return 0;
@@ -369,23 +371,8 @@ void IPAIPU3::processControls([[maybe_unused]] unsigned int frame,
 	/* \todo Start processing for 'frame' based on 'controls'. */
 }
 
-void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
+void IPAIPU3::runAiq([[maybe_unused]] unsigned int frame)
 {
-	/* Prepare parameters buffer. */
-	memset(params, 0, sizeof(*params));
-
-	/*
-	* Call into the AIQ object, and set up the library with any requested
-	* controls or settings from the incoming request.
-	*
-	* (statistics are fed into the library as a separate event
-	*  when available)
-	*
-	* - Run algorithms
-	*
-	* - Fill params buffer with the results of the algorithms.
-	*/
-
 	/* Run algorithms into/using this context structure */
 	resultsHistory_.extendOne();
 	aiq::AiqResults& latestResults = resultsHistory_.latest();
@@ -395,8 +382,6 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
 	aiqInputParams_.afParams.lens_movement_start_timestamp = lensMovementStartTime_;
 
 	aiq_.run2a(frame, aiqInputParams_, latestResults);
-	aic_.updateRuntimeParams(latestResults);
-	aic_.run(params);
 
 	exposure_ = latestResults.ae()->exposures[0].sensor_exposure->coarse_integration_time;
 	gain_ = latestResults.ae()->exposures[0].sensor_exposure->analog_gain_code_global;
@@ -413,6 +398,29 @@ void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
 		lensMovementStartTime_ = msecs;
 	}
 	lensPosition_ = latestResults.af()->next_lens_position;
+}
+
+void IPAIPU3::fillParams(unsigned int frame, ipu3_uapi_params *params)
+{
+	/* Prepare parameters buffer. */
+	memset(params, 0, sizeof(*params));
+
+	/*
+	* Call into the AIQ object, and set up the library with any requested
+	* controls or settings from the incoming request.
+	*
+	* (statistics are fed into the library as a separate event
+	*  when available)
+	*
+	* - Run algorithms
+	*
+	* - Fill params buffer with the results of the algorithms.
+	*/
+	runAiq(frame);
+
+	aiq::AiqResults& latestResults = resultsHistory_.latest();
+	aic_.updateRuntimeParams(latestResults);
+	aic_.run(params);
 
 	setControls(frame);
 
