diff --git a/Documentation/environment_variables.rst b/Documentation/environment_variables.rst
index a9b230bc..f3a0d431 100644
--- a/Documentation/environment_variables.rst
+++ b/Documentation/environment_variables.rst
@@ -37,6 +37,11 @@ LIBCAMERA_IPA_MODULE_PATH
 
    Example value: ``${HOME}/.libcamera/lib:/opt/libcamera/vendor/lib``
 
+LIBCAMERA_PIPELINES_MATCH_LIST
+   Define ordered list of pipelines to be used to match the media devices.
+
+   Example value: ``PipelineHandlerRkISP1,SimplePipelineHandler``
+
 LIBCAMERA_RPI_CONFIG_FILE
    Define a custom configuration file to use in the Raspberry Pi pipeline handler.
 
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 355f3ada..9568801e 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -109,14 +109,7 @@ void CameraManager::Private::createPipelineHandlers()
 	const std::vector<PipelineHandlerFactoryBase *> &factories =
 		PipelineHandlerFactoryBase::factories();
 
-	for (const PipelineHandlerFactoryBase *factory : factories) {
-		LOG(Camera, Debug)
-			<< "Found registered pipeline handler '"
-			<< factory->name() << "'";
-		/*
-		 * Try each pipeline handler until it exhaust
-		 * all pipelines it can provide.
-		 */
+	auto pipeMatch = [&](const PipelineHandlerFactoryBase *factory) {
 		while (1) {
 			std::shared_ptr<PipelineHandler> pipe = factory->create(o);
 			if (!pipe->match(enumerator_.get()))
@@ -126,6 +119,48 @@ void CameraManager::Private::createPipelineHandlers()
 				<< "Pipeline handler \"" << factory->name()
 				<< "\" matched";
 		}
+	};
+
+	/*
+	 * When a list of preferred pipelines is defined, iterate through the
+	 * ordered list to match the devices enumerated.
+	 * Otherwise, devices matching is done in no specific order with each
+	 * pipeline handler registered.
+	 */
+	const char *pipesLists =
+		utils::secure_getenv("LIBCAMERA_PIPELINES_MATCH_LIST");
+	if (pipesLists) {
+		for (const auto &pipeName : utils::split(pipesLists, ",")) {
+			if (pipeName.empty())
+				continue;
+
+			auto nameMatch = [pipeName](const PipelineHandlerFactoryBase *f) {
+				return (f->name() == pipeName);
+			};
+
+			auto iter = std::find_if(factories.begin(),
+						 factories.end(),
+						 nameMatch);
+
+			if (iter != factories.end()) {
+				LOG(Camera, Debug)
+					<< "Found pipeline handler from list '"
+					<< (*iter)->name() << "'";
+				pipeMatch(*iter);
+			}
+		}
+		return;
+	}
+
+	for (const PipelineHandlerFactoryBase *factory : factories) {
+		LOG(Camera, Debug)
+			<< "Found registered pipeline handler '"
+			<< factory->name() << "'";
+		/*
+		 * Try each pipeline handler until it exhausts
+		 * all pipelines it can provide.
+		 */
+		pipeMatch(factory);
 	}
 }
 
