diff --git a/control/json/fan.cpp b/control/json/fan.cpp
index a880915..9fbd03c 100644
--- a/control/json/fan.cpp
+++ b/control/json/fan.cpp
@@ -32,7 +32,7 @@
 constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/";
 constexpr auto FAN_TARGET_PROPERTY = "Target";
 
-Fan::Fan(sdbusplus::bus::bus& bus, const json& jsonObj) :
+Fan::Fan(const json& jsonObj, sdbusplus::bus::bus& bus) :
     ConfigBase(jsonObj), _bus(bus)
 {
     setInterface(jsonObj);
diff --git a/control/json/fan.hpp b/control/json/fan.hpp
index b718585..e2bf985 100644
--- a/control/json/fan.hpp
+++ b/control/json/fan.hpp
@@ -57,10 +57,10 @@
      * Constructor
      * Parses and populates a zone fan from JSON object data
      *
-     * @param[in] bus - sdbusplus bus object
      * @param[in] jsonObj - JSON object
+     * @param[in] bus - sdbusplus bus object
      */
-    Fan(sdbusplus::bus::bus& bus, const json& jsonObj);
+    Fan(const json& jsonObj, sdbusplus::bus::bus& bus);
 
     /**
      * @brief Get the zone
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index a072f49..94a39a8 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -67,10 +67,10 @@
     setProfiles();
 
     // Load the zone configurations
-    _zones = getConfig<Zone>(bus);
+    _zones = getConfig<Zone>(false, bus, bus, event, this);
 
     // Load the fan configurations and move each fan into its zone
-    auto fans = getConfig<Fan>(bus);
+    auto fans = getConfig<Fan>(false, bus, bus);
     for (auto& fan : fans)
     {
         auto itZone =
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index c2a0904..506c8c0 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -122,16 +122,16 @@
      * @brief Load the configuration of a given JSON class object based on the
      * active profiles
      *
-     * @param[in] bus - The sdbusplus bus object
      * @param[in] isOptional - JSON configuration file is optional or not
-     *                         Defaults to false
+     * @param[in] bus - The sdbusplus bus object
+     * @param[in] args - Arguments to be forwarded to each instance of `T`
      *
      * @return Map of configuration entries
      *     Map of configuration keys to their corresponding configuration object
      */
-    template <typename T>
+    template <typename T, typename... Args>
     static std::map<configKey, std::unique_ptr<T>>
-        getConfig(sdbusplus::bus::bus& bus, bool isOptional = false)
+        getConfig(bool isOptional, sdbusplus::bus::bus& bus, Args&&... args)
     {
         std::map<configKey, std::unique_ptr<T>> config;
 
@@ -163,7 +163,8 @@
                         continue;
                     }
                 }
-                auto obj = std::make_unique<T>(bus, entry);
+                auto obj =
+                    std::make_unique<T>(entry, std::forward<Args>(args)...);
                 config.emplace(
                     std::make_pair(obj->getName(), obj->getProfiles()),
                     std::move(obj));
diff --git a/control/json/zone.cpp b/control/json/zone.cpp
index e11e6fc..6249194 100644
--- a/control/json/zone.cpp
+++ b/control/json/zone.cpp
@@ -24,6 +24,7 @@
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 
 #include <algorithm>
 #include <filesystem>
@@ -48,11 +49,12 @@
                                 {{supportedProp, zone::property::supported},
                                  {currentProp, zone::property::current}}}};
 
-Zone::Zone(sdbusplus::bus::bus& bus, const json& jsonObj) :
+Zone::Zone(const json& jsonObj, sdbusplus::bus::bus& bus,
+           const sdeventplus::Event& event, Manager* mgr) :
     ConfigBase(jsonObj),
     ThermalObject(bus, (fs::path{CONTROL_OBJPATH} /= getName()).c_str(), true),
-    _incDelay(0), _floor(0), _target(0), _incDelta(0), _decDelta(0),
-    _requestTargetBase(0), _isActive(true)
+    _manager(mgr), _incDelay(0), _floor(0), _target(0), _incDelta(0),
+    _decDelta(0), _requestTargetBase(0), _isActive(true)
 {
     // Increase delay is optional, defaults to 0
     if (jsonObj.contains("increase_delay"))
diff --git a/control/json/zone.hpp b/control/json/zone.hpp
index 3ae8139..5256018 100644
--- a/control/json/zone.hpp
+++ b/control/json/zone.hpp
@@ -21,6 +21,7 @@
 
 #include <nlohmann/json.hpp>
 #include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 
 #include <any>
 #include <functional>
@@ -30,6 +31,8 @@
 namespace phosphor::fan::control::json
 {
 
+class Manager;
+
 using json = nlohmann::json;
 
 /* Extend the Control::ThermalMode interface */
@@ -69,10 +72,13 @@
      * Constructor
      * Parses and populates a zone from JSON object data
      *
-     * @param[in] bus - sdbusplus bus object
      * @param[in] jsonObj - JSON object
+     * @param[in] bus - sdbusplus bus object
+     * @param[in] event - sdeventplus event loop
+     * @param[in] mgr - Manager of this zone
      */
-    Zone(sdbusplus::bus::bus& bus, const json& jsonObj);
+    Zone(const json& jsonObj, sdbusplus::bus::bus& bus,
+         const sdeventplus::Event& event, Manager* mgr);
 
     /**
      * @brief Get the default ceiling
@@ -156,6 +162,16 @@
     };
 
     /**
+     * @brief Get the manager of the zone
+     *
+     * @return - The manager of the zone
+     */
+    inline auto* getManager() const
+    {
+        return _manager;
+    }
+
+    /**
      * @brief Add a fan object to the zone
      *
      * @param[in] fan - Unique pointer to a fan object that will be moved into
@@ -308,6 +324,9 @@
     }
 
   private:
+    /* The zone's manager */
+    Manager* _manager;
+
     /* The zone's default ceiling value for fans */
     uint64_t _defaultCeiling;
 
