diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index f9eb1ad..2c04266 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -168,40 +168,41 @@
        e += "\tmake_trigger(trigger::timer(TimerConf{\n"
        e += "\t" + event['triggers']['timer']['interval'] + ",\n"
        e += "\t" + event['triggers']['timer']['type'] + "\n"
-       e += "\t}))\n"
-    e += "},\n"
+       e += "\t})),\n"
 
-    e += "std::vector<Signal>{\n"
-    for s in event['triggers']['signals']:
-        e += "Signal{\n"
-        e += "match::" + s['match'] + "(\n"
-        for i, mp in enumerate(s['mparams']):
-            if (i+1) != len(s['mparams']):
-                e += "\"" + mp + "\",\n"
+    if ('signals' in event['triggers']) and \
+       (event['triggers']['signals'] is not None):
+        for s in event['triggers']['signals']:
+            e += "\tmake_trigger(trigger::signal(\n"
+            e += "match::" + s['match'] + "(\n"
+            for i, mp in enumerate(s['mparams']):
+                if (i+1) != len(s['mparams']):
+                    e += "\"" + mp + "\",\n"
+                else:
+                    e += "\"" + mp + "\"\n"
+            e += "),\n"
+            e += "make_handler(\n"
+            if ('type' in s['sparams']) and (s['sparams']['type'] is not None):
+                e += s['signal'] + "<" + s['sparams']['type'] + ">(\n"
             else:
-                e += "\"" + mp + "\"\n"
-        e += "),\n"
-        e += "make_handler(\n"
-        if ('type' in s['sparams']) and (s['sparams']['type'] is not None):
-            e += s['signal'] + "<" + s['sparams']['type'] + ">(\n"
-        else:
-            e += s['signal'] + "(\n"
-        for sp in s['sparams']['params']:
-            e += s['sparams'][sp] + ",\n"
-        if ('type' in s['hparams']) and (s['hparams']['type'] is not None):
-            e += ("handler::" + s['handler'] +
-                  "<" + s['hparams']['type'] + ">(\n")
-        else:
-            e += "handler::" + s['handler'] + "(\n)"
-        for i, hp in enumerate(s['hparams']['params']):
-            if (i+1) != len(s['hparams']['params']):
-                e += s['hparams'][hp] + ",\n"
+                e += s['signal'] + "(\n"
+            for sp in s['sparams']['params']:
+                e += s['sparams'][sp] + ",\n"
+            if ('type' in s['hparams']) and (s['hparams']['type'] is not None):
+                e += ("handler::" + s['handler'] +
+                      "<" + s['hparams']['type'] + ">(\n")
             else:
-                e += s['hparams'][hp] + "\n"
-        e += "))\n"
-        e += ")\n"
+                e += "handler::" + s['handler'] + "(\n)"
+            for i, hp in enumerate(s['hparams']['params']):
+                if (i+1) != len(s['hparams']['params']):
+                    e += s['hparams'][hp] + ",\n"
+                else:
+                    e += s['hparams'][hp] + "\n"
+            e += "))\n"
+            e += ")\n"
+            e += "\t)),\n"
+
     e += "},\n"
-    e += "}\n"
 
     e += "}"
 
diff --git a/control/templates/defs.mako b/control/templates/defs.mako
index 89e01ca..6308774 100644
--- a/control/templates/defs.mako
+++ b/control/templates/defs.mako
@@ -64,12 +64,12 @@
     make_trigger(trigger::timer(TimerConf{
     ${event['triggers']['timer']['interval']},
     ${event['triggers']['timer']['type']}
-    }))
+    })),
     %endif
-},
-std::vector<Signal>{
-%for s in event['triggers']['signals']:
-    Signal{
+    %if ('signals' in event['triggers']) and \
+        (event['triggers']['signals'] is not None):
+    %for s in event['triggers']['signals']:
+    make_trigger(trigger::signal(
         %if ('match' in s) and \
             (s['match'] is not None):
         match::${s['match']}(
@@ -87,7 +87,8 @@
         make_handler(\
         ${indent(genHandler(sig=s), 3)}\
         )
-    },
-%endfor
-}
+    )),
+    %endfor
+    %endif
+},
 </%def>\
diff --git a/control/templates/fan_zone_defs.mako.cpp b/control/templates/fan_zone_defs.mako.cpp
index c049516..eb30762 100644
--- a/control/templates/fan_zone_defs.mako.cpp
+++ b/control/templates/fan_zone_defs.mako.cpp
@@ -162,12 +162,12 @@
                             make_trigger(trigger::timer(TimerConf{
                             ${event['pc']['triggers']['pctime']['interval']},
                             ${event['pc']['triggers']['pctime']['type']}
-                        }))
+                            })),
                             %endif
-                        },
-                        std::vector<Signal>{
-                        %for s in event['pc']['triggers']['pcsigs']:
-                            Signal{
+                            %if ('pcsigs' in event['pc']['triggers']) and \
+                                (event['pc']['triggers']['pcsigs'] is not None):
+                            %for s in event['pc']['triggers']['pcsigs']:
+                            make_trigger(trigger::signal(
                                 %if ('match' in s) and \
                                     (s['match'] is not None):
                                 match::${s['match']}(
@@ -185,9 +185,10 @@
                                 make_handler(\
                                 ${indent(genHandler(sig=s), 9)}\
                                 )
-                            },
-                        %endfor
-                        }
+                            )),
+                            %endfor
+                            %endif
+                        },
                     %endif
                     },
                 %endfor
diff --git a/control/triggers.cpp b/control/triggers.cpp
index 5314a95..2307730 100644
--- a/control/triggers.cpp
+++ b/control/triggers.cpp
@@ -23,6 +23,60 @@
     };
 }
 
+Trigger signal(const std::string& match, Handler&& handler)
+{
+    return [match = std::move(match),
+            handler = std::move(handler)](control::Zone& zone,
+                                          const Group& group,
+                                          const std::vector<Action>& actions)
+    {
+        // Setup signal matches of the property for event
+        std::unique_ptr<EventData> eventData =
+            std::make_unique<EventData>(
+                    group,
+                    match,
+                    handler,
+                    actions
+            );
+        std::unique_ptr<sdbusplus::server::match::match> mPtr = nullptr;
+        if (!match.empty())
+        {
+            // Subscribe to signal match
+            mPtr = std::make_unique<sdbusplus::server::match::match>(
+                    zone.getBus(),
+                    match.c_str(),
+                    std::bind(std::mem_fn(&Zone::handleEvent),
+                              &zone,
+                              std::placeholders::_1,
+                              eventData.get())
+            );
+        }
+        else
+        {
+            // When match is empty, handle if zone object member
+            // Set event data for each host group member
+            for (auto& entry : group)
+            {
+                if (entry.first == zone.getPath())
+                {
+                    auto ifaces = zone.getIfaces();
+                    // Group member interface in list owned by zone
+                    if (std::find(ifaces.begin(), ifaces.end(),
+                        std::get<intfPos>(entry.second)) != ifaces.end())
+                    {
+                        // Store path,interface,property as a managed object
+                        zone.setObjectData(entry.first,
+                                           std::get<intfPos>(entry.second),
+                                           std::get<propPos>(entry.second),
+                                           eventData.get());
+                    }
+                }
+            }
+        }
+        zone.addSignal(std::move(eventData), std::move(mPtr));
+    };
+}
+
 } // namespace trigger
 } // namespace control
 } // namespace fan
diff --git a/control/triggers.hpp b/control/triggers.hpp
index 0a2e96a..aad64d4 100644
--- a/control/triggers.hpp
+++ b/control/triggers.hpp
@@ -24,6 +24,18 @@
  */
 Trigger timer(TimerConf&& tConf);
 
+/**
+ * @brief A trigger of a signal for an event
+ * @details Subscribes to the defined signal match.
+ *
+ * @param[in] match - Signal match to subscribe to
+ * @param[in] handler - Handler function for the received signal
+ *
+ * @return Trigger lambda function
+ *     A Trigger function that subscribes to a signal
+ */
+Trigger signal(const std::string& match, Handler&& handler);
+
 } // namespace trigger
 } // namespace control
 } // namespace fan
diff --git a/control/types.hpp b/control/types.hpp
index a98718b..e53c60e 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -77,18 +77,12 @@
 using TimerConf = std::tuple<std::chrono::microseconds,
                              TimerType>;
 
-constexpr auto sigMatchPos = 0;
-constexpr auto sigHandlerPos = 1;
-using Signal = std::tuple<std::string, Handler>;
-
 constexpr auto groupPos = 0;
 constexpr auto actionsPos = 1;
 constexpr auto triggerPos = 2;
-constexpr auto signalsPos = 3;
 using SetSpeedEvent = std::tuple<Group,
                                  std::vector<Action>,
-                                 std::vector<Trigger>,
-                                 std::vector<Signal>>;
+                                 std::vector<Trigger>>;
 
 constexpr auto eventGroupPos = 0;
 constexpr auto eventMatchPos = 1;
diff --git a/control/zone.cpp b/control/zone.cpp
index 90350a7..3e06fd0 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -319,61 +319,6 @@
 
 void Zone::initEvent(const SetSpeedEvent& event)
 {
-    sdbusplus::message::message nullMsg{nullptr};
-
-    for (auto& sig : std::get<signalsPos>(event))
-    {
-        // Setup signal matches of the property for event
-        std::unique_ptr<EventData> eventData =
-            std::make_unique<EventData>(
-                    std::get<groupPos>(event),
-                    std::get<sigMatchPos>(sig),
-                    std::get<sigHandlerPos>(sig),
-                    std::get<actionsPos>(event)
-            );
-
-        // When match is empty, handle if zone object member
-        if (std::get<sigMatchPos>(sig).empty())
-        {
-            // Set event data for each host group member
-            for (auto it = std::get<groupPos>(event).begin();
-                 it != std::get<groupPos>(event).end(); ++it)
-            {
-                if (it->first == _path)
-                {
-                    // Group member interface in list owned by zone
-                    if (std::find(_ifaces.begin(), _ifaces.end(),
-                        std::get<intfPos>(it->second)) != _ifaces.end())
-                    {
-                        // Store path,interface,property as a managed object
-                        _objects[it->first]
-                                [std::get<intfPos>(it->second)]
-                                [std::get<propPos>(it->second)] =
-                                        eventData.get();
-                    }
-                }
-            }
-        }
-
-        // Initialize the event signal using handler
-        std::get<sigHandlerPos>(sig)(_bus, nullMsg, *this);
-
-        // Subscribe to signal match
-        std::unique_ptr<sdbusplus::server::match::match> match = nullptr;
-        if (!std::get<sigMatchPos>(sig).empty())
-        {
-            match = std::make_unique<sdbusplus::server::match::match>(
-                    _bus,
-                    std::get<sigMatchPos>(sig).c_str(),
-                    std::bind(std::mem_fn(&Zone::handleEvent),
-                              this,
-                              std::placeholders::_1,
-                              eventData.get())
-                );
-        }
-
-        _signalEvents.emplace_back(std::move(eventData), std::move(match));
-    }
     // Enable event triggers
     std::for_each(
         std::get<triggerPos>(event).begin(),
@@ -399,10 +344,10 @@
 
 void Zone::removeEvent(const SetSpeedEvent& event)
 {
-    // Remove signals of the event
-    for (auto& sig : std::get<signalsPos>(event))
+    // Remove triggers of the event
+    for (auto& trig : std::get<triggerPos>(event))
     {
-        auto it = findSignal(sig,
+        auto it = findSignal(trig,
                              std::get<groupPos>(event),
                              std::get<actionsPos>(event));
         if (it != std::end(getSignalEvents()))
@@ -420,7 +365,7 @@
 }
 
 std::vector<SignalEvent>::iterator Zone::findSignal(
-        const Signal& signal,
+        const Trigger& signal,
         const Group& eGroup,
         const std::vector<Action>& eActions)
 {
@@ -429,10 +374,6 @@
     {
         const auto& seEventData = *std::get<signalEventDataPos>(*it);
         if (eGroup == std::get<eventGroupPos>(seEventData) &&
-            std::get<sigMatchPos>(signal) ==
-                std::get<eventMatchPos>(seEventData) &&
-            std::get<sigHandlerPos>(signal).target_type().name() ==
-                std::get<eventHandlerPos>(seEventData).target_type().name() &&
             eActions.size() == std::get<eventActionsPos>(seEventData).size())
         {
             // TODO openbmc/openbmc#2328 - Use the function target
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);
 };
 
 }
