diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index f537716..76f4c6c 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -13,12 +13,14 @@
 
 #Note: Condition is a TODO (openbmc/openbmc#1500)
 tmpl = '''/* This is a generated file. */
+#include <sdbusplus/bus.hpp>
 #include "manager.hpp"
 #include "functor.hpp"
 #include "actions.hpp"
 #include "handlers.hpp"
 
 using namespace phosphor::fan::control;
+using namespace sdbusplus::bus::match::rules;
 
 const unsigned int Manager::_powerOnDelay{${mgr_data['power_on_delay']}};
 
@@ -68,10 +70,11 @@
                         std::vector<PropertyChange>{
                         %for s in event['signal']:
                             PropertyChange{
-                                "interface='org.freedesktop.DBus.Properties',"
-                                "member='PropertiesChanged',"
-                                "type='signal',"
-                                "path='${s['path']}'",
+                                interface("org.freedesktop.DBus.Properties") +
+                                member("PropertiesChanged") +
+                                type::signal() +
+                                path("${s['path']}") +
+                                arg0namespace("${s['interface']}"),
                                 make_handler(propertySignal<${s['type']}>(
                                     "${s['interface']}",
                                     "${s['property']}",
diff --git a/control/types.hpp b/control/types.hpp
index c610ed9..a9508eb 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -41,10 +41,6 @@
 constexpr auto eventActionPos = 2;
 using EventData = std::tuple<Group, Handler, Action>;
 
-constexpr auto zoneObjPos = 0;
-constexpr auto eventDataPos = 1;
-using SignalEvent = std::tuple<Zone*, EventData>;
-
 constexpr auto zoneNumPos = 0;
 constexpr auto fullSpeedPos = 1;
 constexpr auto fanListPos = 2;
diff --git a/control/zone.cpp b/control/zone.cpp
index 13ee977..849cd91 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -70,8 +70,7 @@
             for (auto& prop : std::get<propChangeListPos>(event))
             {
                 _signalEvents.emplace_back(
-                        std::make_unique<SignalEvent>(
-                                this,
+                        std::make_unique<EventData>(
                                 EventData
                                 {
                                     std::get<groupPos>(event),
@@ -81,8 +80,10 @@
                 _matches.emplace_back(
                         bus,
                         std::get<signaturePos>(prop).c_str(),
-                        signalHandler,
-                        _signalEvents.back().get());
+                        std::bind(std::mem_fn(&Zone::handleEvent),
+                                  this,
+                                  std::placeholders::_1,
+                                  _signalEvents.back().get()));
             }
             // Run action function for initial event state
             std::get<actionPos>(event)(*this,
@@ -142,26 +143,14 @@
     value = sdbusplus::message::variant_ns::get<T>(property);
 }
 
-int Zone::signalHandler(sd_bus_message* msg,
-                        void* data,
-                        sd_bus_error* err)
-{
-    auto sdbpMsg = sdbusplus::message::message(msg);
-    auto& signalEvent = *static_cast<SignalEvent*>(data);
-    std::get<zoneObjPos>(signalEvent)->handleEvent(
-        sdbpMsg,
-        std::get<eventDataPos>(signalEvent));
-    return 0;
-}
-
 void Zone::handleEvent(sdbusplus::message::message& msg,
-                       const EventData& eventData)
+                       const EventData* eventData)
 {
     // Handle the callback
-    std::get<eventHandlerPos>(eventData)(_bus, msg, *this);
+    std::get<eventHandlerPos>(*eventData)(_bus, msg, *this);
     // Perform the action
-    std::get<eventActionPos>(eventData)(*this,
-                                        std::get<eventGroupPos>(eventData));
+    std::get<eventActionPos>(*eventData)(*this,
+                                         std::get<eventGroupPos>(*eventData));
 }
 
 }
diff --git a/control/zone.hpp b/control/zone.hpp
index c6e0594..5825b52 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -146,7 +146,7 @@
         /**
          * @brief List of signal event arguments
          */
-        std::vector<std::unique_ptr<SignalEvent>> _signalEvents;
+        std::vector<std::unique_ptr<EventData>> _signalEvents;
 
         /**
          * @brief list of Dbus matches for callbacks
@@ -170,24 +170,13 @@
                                 T& value);
 
         /**
-         * @brief Dbus signal change handler
+         * @brief Dbus signal change callback handler
          *
-         * @param[in] msg - Data associated with the subscribed signal
-         * @param[in] data - Pointer to the event sensor's data
-         * @param[in] err - Contains any sdbus error reference if occurred
+         * @param[in] msg - Expanded sdbusplus message data
+         * @param[in] eventData - The single event's data
          */
-        static int signalHandler(sd_bus_message* msg,
-                                 void* data,
-                                 sd_bus_error* err);
-
-         /**
-          * @brief Envokes the assigned handler and action
-          *
-          * @param[in] msg - Expanded sdbusplus message data
-          * @param[in] eventData - The event's data
-          */
-         void handleEvent(sdbusplus::message::message& msg,
-                          const EventData& eventData);
+        void handleEvent(sdbusplus::message::message& msg,
+                         const EventData* eventData);
 };
 
 }
