diff --git a/include/libcamera/internal/request.h b/include/libcamera/internal/request.h
index 73e9bb5cc..78cb99f36 100644
--- a/include/libcamera/internal/request.h
+++ b/include/libcamera/internal/request.h
@@ -59,7 +59,7 @@ private:
 	bool prepared_ = false;
 
 	std::unordered_set<FrameBuffer *> pending_;
-	std::map<FrameBuffer *, std::unique_ptr<EventNotifier>> notifiers_;
+	std::map<FrameBuffer *, EventNotifier> notifiers_;
 	std::unique_ptr<Timer> timer_;
 };
 
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index b206ac132..6fa1801a0 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -228,15 +228,12 @@ void Request::Private::prepare(std::chrono::milliseconds timeout)
 		if (!fence)
 			continue;
 
-		std::unique_ptr<EventNotifier> notifier =
-			std::make_unique<EventNotifier>(fence->fd().get(),
-							EventNotifier::Read);
+		auto [it, inserted] = notifiers_.try_emplace(buffer, fence->fd().get(), EventNotifier::Type::Read);
+		ASSERT(inserted);
 
-		notifier->activated.connect(this, [this, buffer] {
-							notifierActivated(buffer);
-					    });
-
-		notifiers_[buffer] = std::move(notifier);
+		it->second.activated.connect(this, [this, buffer] {
+			notifierActivated(buffer);
+		});
 	}
 
 	if (notifiers_.empty()) {
