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
