diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index d926c83c..43e9d98b 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -39,6 +39,7 @@
 #include "libcamera/internal/ipa_manager.h"
 #include "libcamera/internal/media_device.h"
 #include "libcamera/internal/pipeline_handler.h"
+#include "libcamera/internal/request.h"
 #include "libcamera/internal/v4l2_subdevice.h"
 #include "libcamera/internal/v4l2_videodevice.h"
 
@@ -48,6 +49,8 @@ namespace libcamera {
 
 LOG_DEFINE_CATEGORY(RkISP1)
 
+using InternalStream = Request::Private::InternalStream;
+
 class PipelineHandlerRkISP1;
 class RkISP1CameraData;
 
@@ -174,7 +177,7 @@ private:
 	int initLinks(Camera *camera, const CameraSensor *sensor,
 		      const RkISP1CameraConfiguration &config);
 	int createCamera(MediaEntity *sensor);
-	void tryCompleteRequest(RkISP1FrameInfo *info);
+	void tryCompleteRequest(Request *request);
 	void bufferReady(FrameBuffer *buffer);
 	void paramReady(FrameBuffer *buffer);
 	void statReady(FrameBuffer *buffer);
@@ -231,6 +234,7 @@ RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *req
 
 		paramBuffer = pipe_->availableParamBuffers_.front();
 		pipe_->availableParamBuffers_.pop();
+		paramBuffer->_d()->setRequest(request);
 
 		statBuffer = pipe_->availableStatBuffers_.front();
 		pipe_->availableStatBuffers_.pop();
@@ -413,7 +417,8 @@ void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta
 	info->request->metadata().merge(metadata);
 	info->metadataProcessed = true;
 
-	pipe()->tryCompleteRequest(info);
+	pipe()->completeBuffer(info->request, info->statBuffer);
+	pipe()->tryCompleteRequest(info->request);
 }
 
 /* -----------------------------------------------------------------------------
@@ -1026,6 +1031,9 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)
 	if (!info)
 		return -ENOENT;
 
+	request->_d()->addInternalBuffer(InternalStream::Statistics, info->statBuffer);
+	request->_d()->addInternalBuffer(InternalStream::Parameters, info->paramBuffer);
+
 	data->ipa_->queueRequest(request->sequence(), request->controls());
 	if (isRaw_) {
 		if (info->mainPathBuffer)
@@ -1228,15 +1236,15 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
  * Buffer Handling
  */
 
-void PipelineHandlerRkISP1::tryCompleteRequest(RkISP1FrameInfo *info)
+void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
 {
 	RkISP1CameraData *data = cameraData(activeCamera_);
-	Request *request = info->request;
 
-	if (request->hasPendingBuffers())
+	RkISP1FrameInfo *info = data->frameInfo_.find(request);
+	if (!info)
 		return;
 
-	if (!info->metadataProcessed)
+	if (request->hasPendingBuffers())
 		return;
 
 	if (!isRaw_ && !info->paramDequeued)
@@ -1281,7 +1289,7 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
 	}
 
 	completeBuffer(request, buffer);
-	tryCompleteRequest(info);
+	tryCompleteRequest(request);
 }
 
 void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
@@ -1294,7 +1302,8 @@ void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
 		return;
 
 	info->paramDequeued = true;
-	tryCompleteRequest(info);
+	completeBuffer(info->request, buffer);
+	tryCompleteRequest(info->request);
 }
 
 void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
@@ -1309,7 +1318,8 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
 
 	if (buffer->metadata().status == FrameMetadata::FrameCancelled) {
 		info->metadataProcessed = true;
-		tryCompleteRequest(info);
+		completeBuffer(info->request, buffer);
+		tryCompleteRequest(info->request);
 		return;
 	}
 
