diff --git a/control/zone.hpp b/control/zone.hpp
index 9c08032..1fdeaf2 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -1,6 +1,7 @@
 #pragma once
 #include <chrono>
 #include <vector>
+#include <cassert>
 #include <algorithm>
 #include <sdbusplus/bus.hpp>
 #include "fan.hpp"
@@ -139,6 +140,18 @@
                              const bool hasOwner);
 
         /**
+         * @brief Get the group's list of service names
+         *
+         * @param[in] group - Group to get service names for
+         *
+         * @return - The list of service names
+         */
+        inline auto getGroupServices(const Group* group)
+        {
+            return _services.at(*group);
+        }
+
+        /**
          * @brief Initialize a set speed event properties and actions
          *
          * @param[in] event - Set speed event
@@ -264,6 +277,64 @@
         void decTimerExpired();
 
         /**
+         * @brief Get the event pointer used with this zone's timers
+         *
+         * @return - The Dbus event pointer for timers
+         */
+        inline auto& getEventPtr()
+        {
+            return _sdEvents;
+        }
+
+        /**
+         * @brief Get the list of timer events
+         *
+         * @return - List of timer events
+         */
+        inline auto& getTimerEvents()
+        {
+            return _timerEvents;
+        }
+
+        /**
+         * @brief Find the first instance of a timer event
+         *
+         * @param[in] eventGroup - Group associated with a timer
+         * @param[in] eventActions - List of actions associated with a timer
+         *
+         * @return - Iterator to the timer event
+         */
+        std::vector<TimerEvent>::iterator findTimer(
+                const Group& eventGroup,
+                const std::vector<Action>& eventActions);
+
+        /**
+         * @brief Add a timer to the list of timer based events
+         *
+         * @param[in] data - Event data for timer
+         * @param[in] timer - Timer to be added
+         */
+        inline void addTimer(
+                std::unique_ptr<EventData>&& data,
+                std::unique_ptr<phosphor::fan::util::Timer>&& timer)
+        {
+            _timerEvents.emplace_back(std::move(data), std::move(timer));
+        };
+
+        /**
+         * @brief Remove the given timer event
+         *
+         * @param[in] teIter - Iterator pointing to the timer event to remove
+         */
+        inline void removeTimer(std::vector<TimerEvent>::iterator& teIter)
+        {
+            assert(teIter != std::end(_timerEvents));
+            std::get<timerEventDataPos>(*teIter).reset();
+            std::get<timerTimerPos>(*teIter).reset();
+            _timerEvents.erase(teIter);
+        }
+
+        /**
          * @brief Callback function for event timers that processes the given
          * actions for a group
          *
@@ -395,7 +466,7 @@
         /**
          * @brief List of timers for events
          */
-        std::vector<std::unique_ptr<phosphor::fan::util::Timer>> _timerEvents;
+        std::vector<TimerEvent> _timerEvents;
 
         /**
          * @brief Get the request speed base if defined, otherwise the
