diff --git a/src/apps/lc-compliance/helpers/capture.cpp b/src/apps/lc-compliance/helpers/capture.cpp
index dbaff4138..528a3a13a 100644
--- a/src/apps/lc-compliance/helpers/capture.cpp
+++ b/src/apps/lc-compliance/helpers/capture.cpp
@@ -129,16 +129,13 @@ void Capture::prepareRequests(std::optional<unsigned int> queueLimit)
 	}
 }
 
-int Capture::queueRequest(libcamera::Request *request)
+void Capture::queueRequest(libcamera::Request *request)
 {
 	if (queueLimit_ && queueCount_ >= *queueLimit_)
-		return 0;
-
-	if (int ret = camera_->queueRequest(request); ret < 0)
-		return ret;
+		return;
 
+	ASSERT_EQ(camera_->queueRequest(request), 0);
 	queueCount_ += 1;
-	return 0;
 }
 
 void Capture::requestComplete(Request *request)
@@ -153,8 +150,7 @@ void Capture::requestComplete(Request *request)
 		<< "Request didn't complete successfully";
 
 	request->reuse(Request::ReuseBuffers);
-	if (queueRequest(request))
-		loop_->exit(-EINVAL);
+	queueRequest(request);
 }
 
 void Capture::start()
@@ -173,7 +169,14 @@ void Capture::start()
 
 	ASSERT_TRUE(allocator_.allocated());
 
-	camera_->requestCompleted.connect(this, &Capture::requestComplete);
+	camera_->requestCompleted.connect(this, [this](libcamera::Request *request) {
+		/* Runs in the CameraManager thread. */
+
+		loop_->callLater([this, request] {
+			/* Run handler in the context of the event loop. */
+			requestComplete(request);
+		});
+	});
 
 	ASSERT_EQ(camera_->start(), 0) << "Failed to start camera";
 }
diff --git a/src/apps/lc-compliance/helpers/capture.h b/src/apps/lc-compliance/helpers/capture.h
index 391184ad6..9003a0934 100644
--- a/src/apps/lc-compliance/helpers/capture.h
+++ b/src/apps/lc-compliance/helpers/capture.h
@@ -30,7 +30,7 @@ private:
 	void stop();
 
 	void prepareRequests(std::optional<unsigned int> queueLimit = {});
-	int queueRequest(libcamera::Request *request);
+	void queueRequest(libcamera::Request *request);
 	void requestComplete(libcamera::Request *request);
 
 	std::shared_ptr<libcamera::Camera> camera_;
