diff --git a/include/core/utils/loader_utils.h b/include/core/utils/loader_utils.h
index bb01d15ec925ff9e405a8666cce59ce93405904c..79da78a96e66a119514f42949c6c5e1308f27a4c 100644
--- a/include/core/utils/loader_utils.h
+++ b/include/core/utils/loader_utils.h
@@ -22,6 +22,7 @@
 
 #include "core/utils/loader.h"
 #include "yaml-cpp/yaml.h"
+#include "core/common/wolf.h"
 
 namespace wolf
 {
@@ -30,4 +31,9 @@ void                  searchAndLoadPlugins(const YAML::Node& _node, LoaderPtr _l
 std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes);
 void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders);
 
+void loadLibrary(LoaderPtr _loader, const std::string& lib_name, const std::string& root);
+void searchAndLoadLibraries(const YAML::Node& _node, LoaderPtr _loader, const std::string& lib_field, const std::string& root);
+std::set<std::string> searchFieldsRecursive(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes, const std::string& field);
+// void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders);
+
 } /* namespace wolf */
diff --git a/src/utils/loader_utils.cpp b/src/utils/loader_utils.cpp
index 0e60bd93157114724311524f407d4325a96575ea..06de6634b5dcb2794f4f3f65f170ed702c0d106b 100644
--- a/src/utils/loader_utils.cpp
+++ b/src/utils/loader_utils.cpp
@@ -20,11 +20,87 @@
 
 #include "core/utils/loader_utils.h"
 #include "core/utils/folder_registry.h"
-#include "core/common/wolf.h"
 
 namespace wolf
 {
 void loadPlugin(LoaderPtr _loader, const std::string& plugin_name)
+{
+    loadLibrary(_loader, "libwolf" + plugin_name, _WOLF_LIB_DIR);
+    // #if __APPLE__
+    //     std::string lib_extension = ".dylib";
+    // #else
+    //     std::string lib_extension = ".so";
+    // #endif
+
+    //     std::string plugins_path = _WOLF_LIB_DIR;
+    //     std::string plugin       = plugins_path + "/libwolf" + plugin_name + lib_extension;
+    //     WOLF_DEBUG("Loading plugin " + plugin_name + " in " + plugins_path);
+    //     _loader->load(plugin);
+}
+
+void searchAndLoadPlugins(const YAML::Node& _node, LoaderPtr _loader)
+{
+    searchAndLoadLibraries(_node, _loader, "plugin", _WOLF_LIB_DIR);
+    // std::list<YAML::Node> visited_nodes;
+    // auto                  plugins = searchPlugins(_node, visited_nodes);
+    // for (auto plugin : plugins)
+    //     if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(_loader, plugin);
+}
+
+std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes)
+{
+    return searchFieldsRecursive(_node, _visited_nodes, "plugin");
+    // std::set<std::string> plugins;
+
+    // if (std::find(_visited_nodes.begin(), _visited_nodes.end(), _node) != _visited_nodes.end()) return {};
+
+    // _visited_nodes.push_back(_node);
+
+    // if (_node.IsMap())
+    // {
+    //     for (const auto& pair : _node)
+    //     {
+    //         // is plugin?
+    //         if (pair.first.as<std::string>() == "plugin")
+    //             plugins.insert(pair.second.as<std::string>());
+
+    //         else
+    //         {
+    //             auto rec_plugins = searchPlugins(pair.second, _visited_nodes);
+    //             plugins.insert(rec_plugins.begin(), rec_plugins.end());
+    //         }
+    //     }
+    // }
+    // else if (_node.IsSequence())
+    // {
+    //     for (const auto& child : _node)
+    //     {
+    //         auto rec_plugins = searchPlugins(child, _visited_nodes);
+    //         plugins.insert(rec_plugins.begin(), rec_plugins.end());
+    //     }
+    // }
+    // else if (_node.IsScalar())
+    // {
+    //     return {};
+    // }
+
+    // return plugins;
+}
+
+void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders)
+{
+    auto temp_loader = std::make_shared<Loader>();
+
+    std::list<YAML::Node> visited_nodes;
+    auto                  plugins = searchPlugins(_node, visited_nodes);
+
+    for (auto plugin : plugins)
+        if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(temp_loader, plugin);
+
+    FolderRegistry::appendRegisteredFolders(_local_folders);
+}
+
+void loadLibrary(LoaderPtr _loader, const std::string& lib_name, const std::string& root)
 {
 #if __APPLE__
     std::string lib_extension = ".dylib";
@@ -32,23 +108,28 @@ void loadPlugin(LoaderPtr _loader, const std::string& plugin_name)
     std::string lib_extension = ".so";
 #endif
 
-    std::string plugins_path = _WOLF_LIB_DIR;
-    std::string plugin       = plugins_path + "/libwolf" + plugin_name + lib_extension;
-    WOLF_DEBUG("Loading plugin " + plugin_name + " in " + plugins_path);
-    _loader->load(plugin);
+    std::string lib = root + "/" + lib_name + lib_extension;
+    WOLF_DEBUG("Loading library " + lib_name + " in " + root);
+    _loader->load(lib);
 }
 
-void searchAndLoadPlugins(const YAML::Node& _node, LoaderPtr _loader)
+void searchAndLoadLibraries(const YAML::Node&  _node,
+                            LoaderPtr          _loader,
+                            const std::string& lib_field,
+                            const std::string& root)
+
 {
     std::list<YAML::Node> visited_nodes;
-    auto                  plugins = searchPlugins(_node, visited_nodes);
-    for (auto plugin : plugins)
-        if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(_loader, plugin);
+    auto                  libs = searchFieldsRecursive(_node, visited_nodes, lib_field);
+    for (auto lib_name : libs)
+        if (not FolderRegistry::isFolderRegistered(lib_name)) loadLibrary(_loader, lib_name, root);
 }
 
-std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Node>& _visited_nodes)
+std::set<std::string> searchFieldsRecursive(const YAML::Node&      _node,
+                                            std::list<YAML::Node>& _visited_nodes,
+                                            const std::string&     lib_field)
 {
-    std::set<std::string> plugins;
+    std::set<std::string> libs;
 
     if (std::find(_visited_nodes.begin(), _visited_nodes.end(), _node) != _visited_nodes.end()) return {};
 
@@ -59,13 +140,13 @@ std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Nod
         for (const auto& pair : _node)
         {
             // is plugin?
-            if (pair.first.as<std::string>() == "plugin")
-                plugins.insert(pair.second.as<std::string>());
+            if (pair.first.as<std::string>() == lib_field)
+                libs.insert(pair.second.as<std::string>());
 
             else
             {
-                auto rec_plugins = searchPlugins(pair.second, _visited_nodes);
-                plugins.insert(rec_plugins.begin(), rec_plugins.end());
+                auto rec_libs = searchFieldsRecursive(pair.second, _visited_nodes, lib_field);
+                libs.insert(rec_libs.begin(), rec_libs.end());
             }
         }
     }
@@ -73,8 +154,8 @@ std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Nod
     {
         for (const auto& child : _node)
         {
-            auto rec_plugins = searchPlugins(child, _visited_nodes);
-            plugins.insert(rec_plugins.begin(), rec_plugins.end());
+            auto rec_libs = searchFieldsRecursive(child, _visited_nodes, lib_field);
+            libs.insert(rec_libs.begin(), rec_libs.end());
         }
     }
     else if (_node.IsScalar())
@@ -82,20 +163,7 @@ std::set<std::string> searchPlugins(const YAML::Node& _node, std::list<YAML::Nod
         return {};
     }
 
-    return plugins;
-}
-
-void appendPluginsInstalledSchemaFolders(const YAML::Node& _node, std::vector<std::string>& _local_folders)
-{
-    auto temp_loader = std::make_shared<Loader>();
-
-    std::list<YAML::Node> visited_nodes;
-    auto                  plugins = searchPlugins(_node, visited_nodes);
-
-    for (auto plugin : plugins)
-        if (not FolderRegistry::isFolderRegistered(plugin)) loadPlugin(temp_loader, plugin);
-
-    FolderRegistry::appendRegisteredFolders(_local_folders);
+    return libs;
 }
 
 }  // namespace wolf