diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index 38f48a5d..4470d8a2 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -49,10 +49,13 @@ public:
 	const std::string &id() const { return id_; }
 
 	std::unique_ptr<V4L2VideoDevice> video_;
+	std::unique_ptr<V4L2VideoDevice> metadata_;
 	Stream stream_;
 	std::map<PixelFormat, std::vector<SizeRange>> formats_;
 
 private:
+	int initMetadata(MediaDevice *media);
+
 	bool generateId();
 
 	std::string id_;
@@ -411,6 +414,37 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
 	return true;
 }
 
+int UVCCameraData::initMetadata(MediaDevice *media)
+{
+	int ret;
+
+	const std::vector<MediaEntity *> &entities = media->entities();
+	std::string dev_node_name = video_->deviceNode();
+	auto metadata = std::find_if(entities.begin(), entities.end(),
+				     [&dev_node_name](MediaEntity *e) {
+					     return e->type() == MediaEntity::Type::V4L2VideoDevice && !(e->flags() & MEDIA_ENT_FL_DEFAULT);
+				     });
+
+	if (metadata == entities.end()) {
+		LOG(UVC, Error) << "Could not find a metadata video device.";
+		return -ENODEV;
+	}
+
+	/* configure the metadata node */
+	metadata_ = std::make_unique<V4L2VideoDevice>(*metadata);
+	ret = metadata_->open();
+	if (ret)
+		return ret;
+
+	if (!(metadata_->caps().isMeta())) {
+		/* if the caps do not have the metadata attribute
+		 * (shouldn't happen) */
+		metadata_ = NULL;
+		return -EINVAL;
+	}
+	return 0;
+}
+
 int UVCCameraData::init(MediaDevice *media)
 {
 	int ret;
@@ -512,7 +546,7 @@ int UVCCameraData::init(MediaDevice *media)
 
 	controlInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);
 
-	return 0;
+	return initMetadata(media);
 }
 
 bool UVCCameraData::generateId()
