diff --git a/control/json/group.cpp b/control/json/group.cpp
index 3b7f990..01390b1 100644
--- a/control/json/group.cpp
+++ b/control/json/group.cpp
@@ -24,7 +24,8 @@
 using json = nlohmann::json;
 using namespace phosphor::logging;
 
-Group::Group(const json& jsonObj) : ConfigBase(jsonObj), _service("")
+Group::Group(const json& jsonObj, sdbusplus::bus::bus&) :
+    ConfigBase(jsonObj), _service("")
 {
     setMembers(jsonObj);
     // Setting the group's service name is optional
diff --git a/control/json/group.hpp b/control/json/group.hpp
index dd5c6a0..ce8d12c 100644
--- a/control/json/group.hpp
+++ b/control/json/group.hpp
@@ -55,8 +55,9 @@
      * Parses and populates a configuration group from JSON object data
      *
      * @param[in] jsonObj - JSON object
+     * @param[in] sdbusplus bus object not used
      */
-    Group(const json& jsonObj);
+    Group(const json& jsonObj, sdbusplus::bus::bus&);
 
     /**
      * Copy Constructor
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 3457d3c..2365a7d 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -68,10 +68,10 @@
     setProfiles();
 
     // Load the zone configurations
-    _zones = getConfig<Zone>(false, bus, bus, event, this);
+    _zones = getConfig<Zone>(false, bus, event, this);
 
     // Load the fan configurations and move each fan into its zone
-    auto fans = getConfig<Fan>(false, bus, bus);
+    auto fans = getConfig<Fan>(false, bus);
     for (auto& fan : fans)
     {
         configKey fanProfile =
@@ -96,7 +96,7 @@
     auto groups = getConfig<Group>(true, bus);
 
     // Load any events configured
-    _events = getConfig<Event>(true, bus, bus, this, groups, _zones);
+    _events = getConfig<Event>(true, bus, this, groups, _zones);
 
     bus.request_name(CONTROL_BUSNAME);
 }
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index b414c62..74683a9 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -143,24 +143,38 @@
     static const std::vector<std::string>& getActiveProfiles();
 
     /**
+     * @brief Extract bus from first location in argument pack
+     *
+     * @param[in] args - Argument pack
+     *
+     * @return - The first argument(sdbusplus bus object) from argument pack
+     */
+    template <typename... Args>
+    static decltype(auto) getBus(Args&&... args)
+    {
+        return std::get<0>(std::forward_as_tuple(args...));
+    }
+
+    /**
      * @brief Load the configuration of a given JSON class object based on the
      * active profiles
      *
      * @param[in] isOptional - JSON configuration file is optional or not
-     * @param[in] bus - The sdbusplus bus object
      * @param[in] args - Arguments to be forwarded to each instance of `T`
+     *   (*Note that a sdbusplus bus object is required as the first argument)
      *
      * @return Map of configuration entries
      *     Map of configuration keys to their corresponding configuration object
      */
     template <typename T, typename... Args>
-    static std::map<configKey, std::unique_ptr<T>>
-        getConfig(bool isOptional, sdbusplus::bus::bus& bus, Args&&... args)
+    static std::map<configKey, std::unique_ptr<T>> getConfig(bool isOptional,
+                                                             Args&&... args)
     {
         std::map<configKey, std::unique_ptr<T>> config;
 
         auto confFile = fan::JsonConfig::getConfFile(
-            bus, confAppName, T::confFileName, isOptional);
+            getBus(std::forward<Args>(args)...), confAppName, T::confFileName,
+            isOptional);
         if (!confFile.empty())
         {
             for (const auto& entry : fan::JsonConfig::load(confFile))
