diff --git a/components/common/cpp/src/configuration.cpp b/components/common/cpp/src/configuration.cpp
index 607d171cf9703d11b6a34339f8aff267e5f2b681..29ee191f098ff7d13f72d1bf933202641ac40aab 100644
--- a/components/common/cpp/src/configuration.cpp
+++ b/components/common/cpp/src/configuration.cpp
@@ -237,7 +237,7 @@ static bool mergeConfig(const string path) {
 	}
 }
 
-static MUTEX mutex;
+static SHARED_MUTEX mutex;
 static std::map<std::string, json_t*> config_index;
 static std::map<std::string, ftl::Configurable*> config_instance;
 static std::map<std::string, ftl::Configurable*> config_alias;
@@ -284,6 +284,8 @@ ftl::Configurable *ftl::config::find(const std::string &uri) {
 			actual_uri = rootCFG->getID() + uri;
 		}
 	}
+
+	SHARED_LOCK(mutex, lk);
 	
 	auto ix = config_instance.find(actual_uri);
 	if (ix == config_instance.end()) {
@@ -295,6 +297,7 @@ ftl::Configurable *ftl::config::find(const std::string &uri) {
 }
 
 void ftl::config::alias(const std::string &uri, Configurable *cfg) {
+	UNIQUE_LOCK(mutex, lk);
 	config_alias[uri] = cfg;
 }
 
@@ -304,6 +307,7 @@ const std::vector<Configurable*> &ftl::config::findByTag(const std::string &tag)
 
 std::vector<std::string> ftl::config::list() {
 	vector<string> r;
+	SHARED_LOCK(mutex, lk);
 	for (auto i : config_instance) {
 		r.push_back(i.first);
 	}
@@ -312,6 +316,7 @@ std::vector<std::string> ftl::config::list() {
 
 const std::vector<Configurable *> ftl::config::getChildren(const string &uri) {
 	std::vector<Configurable *> children;
+	SHARED_LOCK(mutex, lk);
 	for (const auto &[curi, c] : config_instance) {
 		auto mismatch = std::mismatch(uri.begin(), uri.end(), curi.begin());
 		if (mismatch.first == uri.end()) {
@@ -327,6 +332,8 @@ void ftl::config::registerConfigurable(ftl::Configurable *cfg) {
 		LOG(ERROR) << "Configurable object is missing $id property: " << cfg->getConfig();
 		return;
 	}
+
+	UNIQUE_LOCK(mutex, lk);
 	auto ix = config_instance.find(*uri);
 	if (ix != config_instance.end()) {
 		// FIXME: HACK NOTE TODO SHOULD BE FATAL
@@ -335,7 +342,9 @@ void ftl::config::registerConfigurable(ftl::Configurable *cfg) {
 		config_instance[*uri] = cfg;
 		LOG(INFO) << "Registering instance: " << *uri;
 
+		lk.unlock();
 		auto tags = cfg->get<vector<string>>("tags");
+		lk.lock();
 		if (tags) {
 			for (auto &t : *tags) {
 				//LOG(INFO) << "REGISTER TAG: " << t;
@@ -462,6 +471,8 @@ json_t &ftl::config::resolve(const std::string &puri, bool eager) {
 		//}
 	}
 
+	SHARED_LOCK(mutex, lk);
+
 	ftl::URI uri(uri_str);
 	if (uri.isValid()) {
 		std::string u = uri.getBaseURI();