diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 190a28970c..e7278b4965 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -513,6 +513,7 @@ public:
 
 	const ControlValue &get(unsigned int id) const;
 	void set(unsigned int id, const ControlValue &value);
+	void set(unsigned int id, ControlValue &&value);
 
 	const ControlInfoMap *infoMap() const { return infoMap_; }
 	const ControlIdMap *idMap() const { return idmap_; }
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 242072778b..ce10e4bbe1 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -1153,6 +1153,18 @@ void ControlList::set(unsigned int id, const ControlValue &value)
 	*val = value;
 }
 
+/**
+ * \copydoc ControlList::set(unsigned int, const ControlValue &)
+ */
+void ControlList::set(unsigned int id, ControlValue &&value)
+{
+	ControlValue *val = find(id);
+	if (!val)
+		return;
+
+	*val = std::move(value);
+}
+
 /**
  * \fn ControlList::infoMap()
  * \brief Retrieve the ControlInfoMap used to construct the ControlList
