diff --git a/src/libcamera/control_validator.cpp b/src/libcamera/control_validator.cpp
new file mode 100644
index 000000000000..8e5cf3c3e3ee
--- /dev/null
+++ b/src/libcamera/control_validator.cpp
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * control_validator.cpp - Control validator
+ */
+
+#include "control_validator.h"
+
+/**
+ * \file control_validator.h
+ * \brief Abstract control validator
+ */
+
+namespace libcamera {
+
+/**
+ * \class ControlValidator
+ * \brief Interface for the control validator
+ *
+ * The ControlValidator class is used by the ControlList class to validate
+ * controls added to the list. It is an abstract class providing an interface
+ * for object-specific control validation, such a Camera controls and V4L2
+ * controls.
+ */
+
+/**
+ * \fn ControlValidator::name()
+ * \brief Retrieve the name of the object associated with the validator
+ * \return The name of the object associated with the validator
+ */
+
+/**
+ * \fn ControlValidator::validate()
+ * \brief Validate a control
+ * \param[in] id The control ID
+ *
+ * This method validates the control \a id against the object corresponding to
+ * the validator. It shall at least validate that the control is applicable to
+ * the object instance, and may perform additional checks.
+ *
+ * \return True if the control is valid, false otherwise
+ */
+
+} /* namespace libcamera */
diff --git a/src/libcamera/include/control_validator.h b/src/libcamera/include/control_validator.h
new file mode 100644
index 000000000000..3598b18f2f26
--- /dev/null
+++ b/src/libcamera/include/control_validator.h
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * control_validator.h - Control validator
+ */
+#ifndef __LIBCAMERA_CONTROL_VALIDATOR_H__
+#define __LIBCAMERA_CONTROL_VALIDATOR_H__
+
+#include <string>
+
+namespace libcamera {
+
+class ControlId;
+
+class ControlValidator
+{
+public:
+	virtual ~ControlValidator() {}
+
+	virtual const std::string &name() const = 0;
+	virtual bool validate(const ControlId &id) const = 0;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_CONTROL_VALIDATOR_H__ */
diff --git a/src/libcamera/include/meson.build b/src/libcamera/include/meson.build
index 933be8543a8d..1cf47204f2b5 100644
--- a/src/libcamera/include/meson.build
+++ b/src/libcamera/include/meson.build
@@ -1,5 +1,6 @@
 libcamera_headers = files([
     'camera_sensor.h',
+    'control_validator.h',
     'device_enumerator.h',
     'device_enumerator_sysfs.h',
     'device_enumerator_udev.h',
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 6df48365266d..c8a66cfc93d5 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -5,6 +5,7 @@ libcamera_sources = files([
     'camera_manager.cpp',
     'camera_sensor.cpp',
     'controls.cpp',
+    'control_validator.cpp',
     'device_enumerator.cpp',
     'device_enumerator_sysfs.cpp',
     'event_dispatcher.cpp',
