diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 42c267b..61924ea 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -582,8 +582,45 @@
     _timers.emplace_back(std::move(dataPtr), std::move(timer));
 }
 
+void Manager::addGroup(const Group& group)
+{
+    const auto& members = group.getMembers();
+    for (const auto& member : members)
+    {
+        try
+        {
+            auto service = getService(member, group.getInterface());
+
+            auto variant =
+                util::SDBusPlus::getPropertyVariant<PropertyVariantType>(
+                    service, member, group.getInterface(), group.getProperty());
+
+            setProperty(member, group.getInterface(), group.getProperty(),
+                        variant);
+        }
+        catch (const std::exception& e)
+        {
+            try
+            {
+                _objects.at(member)
+                    .at(group.getInterface())
+                    .erase(group.getProperty());
+            }
+            catch (const std::out_of_range&)
+            {}
+        }
+    }
+}
+
 void Manager::timerExpired(TimerData& data)
 {
+    if (std::get<bool>(data.second))
+    {
+        const auto& groups = std::get<const std::vector<Group>&>(data.second);
+        std::for_each(groups.begin(), groups.end(),
+                      [this](const auto& group) { addGroup(group); });
+    }
+
     auto& actions =
         std::get<std::vector<std::unique_ptr<ActionBase>>&>(data.second);
     // Perform the actions in the timer data
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index 22b5630..2b913fe 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -64,9 +64,12 @@
  *      std::string = Timer package unique identifier
  *      std::vector<std::unique_ptr<ActionBase>> = List of pointers to actions
  * that run when the timer expires
+ *      const std::vector<Group> = List of groups
+ *      bool = If groups should be preloaded before actions are run
  */
 using TimerPkg =
-    std::tuple<std::string, std::vector<std::unique_ptr<ActionBase>>&>;
+    std::tuple<std::string, std::vector<std::unique_ptr<ActionBase>>&,
+               const std::vector<Group>&, bool>;
 /**
  * Data associated with a running timer that's used when it expires
  * Pair constructed of:
@@ -594,6 +597,13 @@
      * @param[out] data - The JSON that will be filled in
      */
     void dumpCache(json& data);
+
+    /**
+     * @brief Add a group to the cache dataset.
+     *
+     * @param[in] group - The group to add
+     */
+    void addGroup(const Group& group);
 };
 
 } // namespace phosphor::fan::control::json
diff --git a/control/json/triggers/timer.cpp b/control/json/triggers/timer.cpp
index 87c2a63..e04bdd0 100644
--- a/control/json/triggers/timer.cpp
+++ b/control/json/triggers/timer.cpp
@@ -71,18 +71,31 @@
         jsonObj["interval"].get<uint64_t>());
 }
 
+bool getPreload(const json& jsonObj)
+{
+    if (jsonObj.contains("preload_groups") &&
+        jsonObj["preload_groups"].get<bool>())
+    {
+        return true;
+    }
+    return false;
+}
+
 enableTrigger triggerTimer(const json& jsonObj, const std::string& eventName,
                            std::vector<std::unique_ptr<ActionBase>>& actions)
 {
     // Get the type and interval of this timer from the JSON
     auto type = getType(jsonObj);
     auto interval = getInterval(jsonObj);
+    auto preload = getPreload(jsonObj);
 
-    return [type = std::move(type), interval = std::move(interval)](
+    return [type = std::move(type), interval = std::move(interval),
+            preload = std::move(preload)](
                const std::string& eventName, Manager* mgr,
-               const std::vector<Group>&,
+               const std::vector<Group>& groups,
                std::vector<std::unique_ptr<ActionBase>>& actions) {
-        auto tpPtr = std::make_unique<TimerPkg>(eventName, std::ref(actions));
+        auto tpPtr = std::make_unique<TimerPkg>(eventName, std::ref(actions),
+                                                std::cref(groups), preload);
         mgr->addTimer(type, interval, std::move(tpPtr));
     };
 }
