diff --git a/src/ipa/raspberrypi/controller/controller.cpp b/src/ipa/raspberrypi/controller/controller.cpp
index 67d650ef0c1b..9a2a3fb01793 100644
--- a/src/ipa/raspberrypi/controller/controller.cpp
+++ b/src/ipa/raspberrypi/controller/controller.cpp
@@ -42,22 +42,40 @@ void Controller::Read(char const *filename)
 	}
 
 	std::unique_ptr<YamlObject> root = YamlParser::parse(file);
-
-	for (auto const &[key, value] : root->asDict()) {
-		Algorithm *algo = CreateAlgorithm(key.c_str());
-		if (algo) {
-			algo->Read(value);
-			algorithms_.push_back(AlgorithmPtr(algo));
-		} else
-			LOG(RPiController, Warning)
-				<< "No algorithm found for \"" << key << "\"";
+	double version = (*root)["version"].get<double>(1.0);
+	if (version < 2.0) {
+		LOG(RPiController, Warning)
+			<< "This format of the tuning file will be deprecated soon!"
+			<< " Please use the convert_tuning.py utility to update to version 2.0.";
+		for (auto const &[key, value] : root->asDict()) {
+			if (!key.compare("version"))
+				continue;
+			CreateAlgorithm(key, value);
+		}
+	} else {
+		if (!root->contains("algorithms")) {
+			LOG(RPiController, Fatal)
+				<< "Tuning file " << filename
+				<< " does not have an \"algorithms\" list!";
+			return;
+		}
+		for (auto const &rootAlgo : (*root)["algorithms"].asList())
+			for (auto const &[key, value] : rootAlgo.asDict())
+				CreateAlgorithm(key, value);
 	}
 }
 
-Algorithm *Controller::CreateAlgorithm(char const *name)
+void Controller::CreateAlgorithm(const std::string &name, const YamlObject &params)
 {
-	auto it = GetAlgorithms().find(std::string(name));
-	return it != GetAlgorithms().end() ? (*it->second)(this) : nullptr;
+	auto it = GetAlgorithms().find(name);
+	if (it == GetAlgorithms().end()) {
+		LOG(RPiController, Warning)
+			<< "No algorithm found for \"" << name << "\"";
+		return;
+	}
+	Algorithm *algo = (*it->second)(this);
+	algo->Read(params);
+	algorithms_.push_back(AlgorithmPtr(algo));
 }
 
 void Controller::Initialise()
diff --git a/src/ipa/raspberrypi/controller/controller.hpp b/src/ipa/raspberrypi/controller/controller.hpp
index 3b50ae770d11..9091deac5feb 100644
--- a/src/ipa/raspberrypi/controller/controller.hpp
+++ b/src/ipa/raspberrypi/controller/controller.hpp
@@ -15,6 +15,8 @@
 
 #include <linux/bcm2835-isp.h>
 
+#include "libcamera/internal/yaml_parser.h"
+
 #include "camera_mode.h"
 #include "device_status.h"
 #include "metadata.hpp"
@@ -36,7 +38,6 @@ public:
 	Controller();
 	Controller(char const *json_filename);
 	~Controller();
-	Algorithm *CreateAlgorithm(char const *name);
 	void Read(char const *filename);
 	void Initialise();
 	void SwitchMode(CameraMode const &camera_mode, Metadata *metadata);
@@ -46,6 +47,7 @@ public:
 	Algorithm *GetAlgorithm(std::string const &name) const;
 
 protected:
+	void CreateAlgorithm(const std::string &name, const libcamera::YamlObject &params);
 	Metadata global_metadata_;
 	std::vector<AlgorithmPtr> algorithms_;
 	bool switch_mode_called_;
