diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 8353272642bd..647b4f4f365f 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -729,6 +729,8 @@ int PipelineHandlerIPU3::registerCameras()
 					&IPU3CameraData::imguInputBufferReady);
 		data->imgu_->output_.dev->bufferReady.connect(data.get(),
 					&IPU3CameraData::imguOutputBufferReady);
+		data->imgu_->viewfinder_.dev->bufferReady.connect(data.get(),
+					&IPU3CameraData::imguOutputBufferReady);
 
 		/* Create and register the Camera instance. */
 		std::string cameraName = cio2->sensor_->entity()->name() + " "
@@ -774,10 +776,34 @@ void PipelineHandlerIPU3::IPU3CameraData::imguInputBufferReady(Buffer *buffer)
  */
 void PipelineHandlerIPU3::IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
 {
-	Request *request = queuedRequests_.front();
+	Request *request = buffer->request();
+	if (!request)
+		/* Completed buffers not part of a request are ignored. */
+		return;
+
+	if (!pipe_->completeBuffer(camera_, request, buffer))
+		/* Request not completed yet, return here. */
+		return;
+
+	/*
+	 * Complete requests in queuing order: if some other request is
+	 * pending, post-pone completion.
+	 */
+	Request *front = queuedRequests_.front();
+	if (front != request)
+		return;
 
-	pipe_->completeBuffer(camera_, request, buffer);
-	pipe_->completeRequest(camera_, request);
+	/*
+	 * Complete the current request, and all the other pending ones,
+	 * in queuing order.
+	 */
+	while (1) {
+		if (front->hasPendingBuffers())
+			break;
+
+		pipe_->completeRequest(camera_, front);
+		front = queuedRequests_.front();
+	}
 }
 
 /**
