diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index e5b8ffb4db3d..c3e4c2587ecd 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -59,6 +59,7 @@ public:
 	void stop(Camera *camera);
 	bool hasPendingRequests(const Camera *camera) const;
 
+	void registerRequest(Request *request);
 	void queueRequest(Request *request);
 
 	bool completeBuffer(Request *request, FrameBuffer *buffer);
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 86d84ac0a77d..5e4b84e24235 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -1074,12 +1074,20 @@ int Camera::configure(CameraConfiguration *config)
  */
 std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)
 {
-	int ret = _d()->isAccessAllowed(Private::CameraConfigured,
-					Private::CameraRunning);
+	Private *const d = _d();
+
+	int ret = d->isAccessAllowed(Private::CameraConfigured,
+				     Private::CameraRunning);
 	if (ret < 0)
 		return nullptr;
 
-	return std::make_unique<Request>(this, cookie);
+	std::unique_ptr<Request> request = std::make_unique<Request>(this, cookie);
+
+	/* Associate the request with the pipeline handler. */
+	if (request)
+		d->pipe_->registerRequest(request.get());
+
+	return request;
 }
 
 /**
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 03e4b9e66aa6..e27dc182c128 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -337,6 +337,22 @@ bool PipelineHandler::hasPendingRequests(const Camera *camera) const
 	return !camera->_d()->queuedRequests_.empty();
 }
 
+/**
+ * \fn PipelineHandler::registerRequest()
+ * \brief Register a request for use by the Pipeline Handler
+ * \param[in] request The request to register
+ */
+void PipelineHandler::registerRequest(Request *request)
+{
+	/*
+	 * Connect the request prepared signal to notify the pipeline handler
+	 * when a request is ready to be processed.
+	 */
+	request->_d()->prepared.connect(this, [this]() {
+						doQueueRequests();
+					});
+}
+
 /**
  * \fn PipelineHandler::queueRequest()
  * \brief Queue a request
@@ -366,9 +382,6 @@ void PipelineHandler::queueRequest(Request *request)
 
 	waitingRequests_.push(request);
 
-	request->_d()->prepared.connect(this, [this]() {
-						doQueueRequests();
-					});
 	request->_d()->prepare(300ms);
 }
 
