diff --git a/control/zone.hpp b/control/zone.hpp
index 6da3091..59f9743 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -64,6 +64,36 @@
              const ZoneDefinition& def);
 
         /**
+         * @brief Get the zone's bus
+         *
+         * @return The bus used by the zone
+         */
+         inline auto& getBus()
+         {
+             return _bus;
+         }
+
+        /**
+         * @brief Get the zone's path
+         *
+         * @return The path of this zone
+         */
+        inline auto& getPath()
+        {
+            return _path;
+        }
+
+        /**
+         * @brief Get the zone's hosted interfaces
+         *
+         * @return The interfaces hosted by this zone
+         */
+        inline auto& getIfaces()
+        {
+            return _ifaces;
+        }
+
+        /**
          * Sets all fans in the zone to the speed
          * passed in when the zone is active
          *
@@ -107,6 +137,22 @@
         }
 
         /**
+         * @brief Sets a given object's event data for a property on this zone
+         *
+         * @param[in] object - Name of the object containing the property
+         * @param[in] interface - Interface name containing the property
+         * @param[in] property - Property name
+         * @param[in] data - Property value
+         */
+        inline void setObjectData(const std::string& object,
+                                  const std::string& interface,
+                                  const std::string& property,
+                                  EventData* data)
+        {
+            _objects[object][interface][property] = data;
+        }
+
+        /**
          * @brief Sets a given object's property value
          *
          * @param[in] object - Name of the object containing the property
@@ -124,6 +170,23 @@
         };
 
         /**
+         * @brief Sets a given object's property value
+         *
+         * @param[in] object - Name of the object containing the property
+         * @param[in] interface - Interface name containing the property
+         * @param[in] property - Property name
+         * @param[in] value - Property value
+         */
+        template <typename T>
+        void setPropertyValue(const std::string& object,
+                              const std::string& interface,
+                              const std::string& property,
+                              T value)
+        {
+            _properties[object][interface][property] = value;
+        };
+
+        /**
          * @brief Get the value of an object's property
          *
          * @param[in] object - Name of the object containing the property
@@ -368,7 +431,7 @@
          * @return - Iterator to the stored signal event
          */
         std::vector<SignalEvent>::iterator findSignal(
-            const Signal& signal,
+            const Trigger& signal,
             const Group& eGroup,
             const std::vector<Action>& eActions);
 
@@ -470,6 +533,28 @@
                                        int32_t depth);
 
         /**
+         * @brief Dbus signal change callback handler
+         *
+         * @param[in] msg - Expanded sdbusplus message data
+         * @param[in] eventData - The single event's data
+         */
+        void handleEvent(sdbusplus::message::message& msg,
+                         const EventData* eventData);
+
+        /**
+         * @brief Add a signal to the list of signal based events
+         *
+         * @param[in] data - Event data for signal
+         * @param[in] match - Subscribed signal match
+         */
+        inline void addSignal(
+                std::unique_ptr<EventData>&& data,
+                std::unique_ptr<sdbusplus::server::match::match>&& match)
+        {
+            _signalEvents.emplace_back(std::move(data), std::move(match));
+        }
+
+        /**
          * @brief Set a property to be persisted
          *
          * @param[in] intf - Interface containing property
@@ -739,15 +824,6 @@
         {
             return (_requestSpeedBase != 0) ? _requestSpeedBase : _targetSpeed;
         };
-
-        /**
-         * @brief Dbus signal change callback handler
-         *
-         * @param[in] msg - Expanded sdbusplus message data
-         * @param[in] eventData - The single event's data
-         */
-        void handleEvent(sdbusplus::message::message& msg,
-                         const EventData* eventData);
 };
 
 }
