diff --git a/control/functor.hpp b/control/functor.hpp
index 77e95c8..8704020 100644
--- a/control/functor.hpp
+++ b/control/functor.hpp
@@ -49,10 +49,10 @@
  *
  * @return - The created handler function object
  */
-template <typename T>
-auto make_handler(T&& handler)
+template <typename T, typename U>
+auto make_handler(U&& handler)
 {
-    return Handler(std::forward<T>(handler));
+    return T(std::forward<U>(handler));
 }
 
 /**
@@ -69,25 +69,32 @@
 }
 
 /**
- * @struct Property Changed
- * @brief A match filter functor for Dbus property value changed signals
+ * @struct Properties
+ * @brief A set of match filter functors for Dbus property values. Each
+ * functor provides an associated process for retrieving the value
+ * for a given property and providing it to the given handler function.
  *
  * @tparam T - The type of the property value
  * @tparam U - The type of the handler
  */
 template <typename T, typename U>
-struct PropertyChanged
+struct Properties
 {
-    PropertyChanged() = delete;
-    ~PropertyChanged() = default;
-    PropertyChanged(const PropertyChanged&) = default;
-    PropertyChanged& operator=(const PropertyChanged&) = default;
-    PropertyChanged(PropertyChanged&&) = default;
-    PropertyChanged& operator=(PropertyChanged&&) = default;
-    PropertyChanged(const char* path,
-                    const char* iface,
-                    const char* property,
-                    U&& handler) :
+    Properties() = delete;
+    ~Properties() = default;
+    Properties(const Properties&) = default;
+    Properties& operator=(const Properties&) = default;
+    Properties(Properties&&) = default;
+    Properties& operator=(Properties&&) = default;
+    explicit Properties(U&& handler) :
+        _path(""),
+        _iface(""),
+        _property(""),
+        _handler(std::forward<U>(handler)) { }
+    Properties(const char* path,
+               const char* iface,
+               const char* property,
+               U&& handler) :
         _path(path),
         _iface(iface),
         _property(property),
@@ -96,8 +103,7 @@
     /** @brief Run signal handler function
      *
      * Extract the property from the PropertiesChanged
-     * message (or read the property when the message is null)
-     * and run the handler function.
+     * message and run the handler function.
      */
     void operator()(sdbusplus::bus::bus& bus,
                     sdbusplus::message::message& msg,
@@ -148,6 +154,38 @@
         }
     }
 
+    /** @brief Run init handler function
+     *
+     * Get the property from each member object of the group
+     * and run the handler function.
+     */
+    void operator()(Zone& zone, const Group& group) const
+    {
+        std::for_each(
+            group.begin(),
+            group.end(),
+            [&zone, &group, handler = std::move(_handler)](auto const& member)
+            {
+                auto path = std::get<pathPos>(member);
+                auto intf = std::get<intfPos>(member);
+                auto prop = std::get<propPos>(member);
+                try
+                {
+                    auto val = zone.getPropertyByName<T>(path, intf, prop);
+                    handler(zone, std::forward<T>(val));
+                }
+                catch (const sdbusplus::exception::SdBusError&)
+                {
+                    // Property value not sent to handler
+                }
+                catch (const util::DBusError&)
+                {
+                    // Property value not sent to handler
+                }
+            }
+        );
+    }
+
 private:
     const char* _path;
     const char* _iface;
@@ -167,15 +205,29 @@
  * @tparam U - The type of the handler
  */
 template <typename T, typename U>
-auto propertySignal(const char* path,
-                    const char* iface,
-                    const char* property,
-                    U&& handler)
+auto propertiesChanged(const char* path,
+                       const char* iface,
+                       const char* property,
+                       U&& handler)
 {
-    return PropertyChanged<T, U>(path,
-                                 iface,
-                                 property,
-                                 std::forward<U>(handler));
+    return Properties<T, U>(path,
+                            iface,
+                            property,
+                            std::forward<U>(handler));
+}
+
+/**
+ * @brief Used to get the property value of an object
+ *
+ * @param[in] handler - Handler function to perform
+ *
+ * @tparam T - The type of the property
+ * @tparam U - The type of the handler
+ */
+template <typename T, typename U>
+auto getProperty(U&& handler)
+{
+    return Properties<T, U>(std::forward<U>(handler));
 }
 
 /**
@@ -253,7 +305,7 @@
 };
 
 /**
- * @brief Used to process a Dbus interface added signal event
+ * @brief Used to process a Dbus interfaces added signal event
  *
  * @param[in] path - Object path
  * @param[in] iface - Object interface
@@ -264,10 +316,10 @@
  * @tparam U - The type of the handler
  */
 template <typename T, typename U>
-auto objectSignal(const char* path,
-                  const char* iface,
-                  const char* property,
-                  U&& handler)
+auto interfacesAdded(const char* path,
+                     const char* iface,
+                     const char* property,
+                     U&& handler)
 {
     return InterfaceAdded<T, U>(path,
                                 iface,
@@ -337,7 +389,7 @@
 };
 
 /**
- * @brief Used to process a Dbus interface removed signal event
+ * @brief Used to process a Dbus interfaces removed signal event
  *
  * @param[in] path - Object path
  * @param[in] iface - Object interface
@@ -346,9 +398,9 @@
  * @tparam U - The type of the handler
  */
 template <typename U>
-auto objectSignal(const char* path,
-                  const char* iface,
-                  U&& handler)
+auto interfacesRemoved(const char* path,
+                       const char* iface,
+                       U&& handler)
 {
     return InterfaceRemoved<U>(path,
                                iface,
@@ -356,32 +408,27 @@
 }
 
 /**
- * @struct Name Owner Changed
- * @brief A match filter functor for Dbus name owner changed signals
+ * @struct Name Owner
+ * @brief A functor for Dbus name owner signals and methods
  *
  * @tparam U - The type of the handler
  */
 template <typename U>
-struct NameOwnerChanged
+struct NameOwner
 {
-    NameOwnerChanged() = delete;
-    ~NameOwnerChanged() = default;
-    NameOwnerChanged(const NameOwnerChanged&) = default;
-    NameOwnerChanged& operator=(const NameOwnerChanged&) = default;
-    NameOwnerChanged(NameOwnerChanged&&) = default;
-    NameOwnerChanged& operator=(NameOwnerChanged&&) = default;
-    NameOwnerChanged(const char* path,
-                     const char* iface,
-                     U&& handler) :
-        _path(path),
-        _iface(iface),
+    NameOwner() = delete;
+    ~NameOwner() = default;
+    NameOwner(const NameOwner&) = default;
+    NameOwner& operator=(const NameOwner&) = default;
+    NameOwner(NameOwner&&) = default;
+    NameOwner& operator=(NameOwner&&) = default;
+    explicit NameOwner(U&& handler) :
         _handler(std::forward<U>(handler)) { }
 
     /** @brief Run signal handler function
      *
      * Extract the name owner from the NameOwnerChanged
-     * message (or read the name owner when the message is null)
-     * and run the handler function.
+     * message and run the handler function.
      */
     void operator()(sdbusplus::bus::bus& bus,
                     sdbusplus::message::message& msg,
@@ -403,42 +450,58 @@
             {
                 hasOwner = true;
             }
+            _handler(zone, name, hasOwner);
         }
-        else
-        {
-            try
-            {
-                // Initialize NameOwnerChanged data store with service name
-                name = zone.getService(_path, _iface);
-                hasOwner = util::SDBusPlus::callMethodAndRead<bool>(
-                        bus,
-                        "org.freedesktop.DBus",
-                        "/org/freedesktop/DBus",
-                        "org.freedesktop.DBus",
-                        "NameHasOwner",
-                        name);
-            }
-            catch (const util::DBusMethodError& e)
-            {
-                // Failed to get service name owner state
-                hasOwner = false;
-            }
-        }
+    }
 
-        _handler(zone, name, hasOwner);
+    void operator()(Zone& zone,
+                    const Group& group) const
+    {
+        std::string name = "";
+        bool hasOwner = false;
+        std::for_each(
+            group.begin(),
+            group.end(),
+            [&zone, &group, &name, &hasOwner, handler = std::move(_handler)](
+                auto const& member)
+            {
+                auto path = std::get<pathPos>(member);
+                auto intf = std::get<intfPos>(member);
+                try
+                {
+                    auto servName = zone.getService(path, intf);
+                    if (name != servName)
+                    {
+                        name = servName;
+                        hasOwner = util::SDBusPlus::callMethodAndRead<bool>(
+                                zone.getBus(),
+                                "org.freedesktop.DBus",
+                                "/org/freedesktop/DBus",
+                                "org.freedesktop.DBus",
+                                "NameHasOwner",
+                                name);
+                        // Update service name owner state list of a group
+                        handler(zone, name, hasOwner);
+                    }
+                }
+                catch (const util::DBusMethodError& e)
+                {
+                    // Failed to get service name owner state
+                    name = "";
+                    hasOwner = false;
+                }
+
+            }
+        );
     }
 
 private:
-    const char* _path;
-    const char* _iface;
     U _handler;
 };
 
 /**
  * @brief Used to process a Dbus name owner changed signal event
  *
- * @param[in] path - Object path
- * @param[in] iface - Object interface
  * @param[in] handler - Handler function to perform
  *
  * @tparam U - The type of the handler
@@ -446,13 +509,24 @@
  * @return - The NameOwnerChanged signal struct
  */
 template <typename U>
-auto ownerSignal(const char* path,
-                 const char* iface,
-                 U&& handler)
+auto nameOwnerChanged(U&& handler)
 {
-    return NameOwnerChanged<U>(path,
-                               iface,
-                               std::forward<U>(handler));
+    return NameOwner<U>(std::forward<U>(handler));
+}
+
+/**
+ * @brief Used to process the init of a name owner event
+ *
+ * @param[in] handler - Handler function to perform
+ *
+ * @tparam U - The type of the handler
+ *
+ * @return - The NameOwnerChanged signal struct
+ */
+template <typename U>
+auto nameHasOwner(U&& handler)
+{
+    return NameOwner<U>(std::forward<U>(handler));
 }
 
 } // namespace control
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index 23c37b9..30acf47 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -175,13 +175,13 @@
         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"
+            for i, mp in enumerate(s['mparams']['params']):
+                if (i+1) != len(s['mparams']['params']):
+                    e += "\t\t\t" + s['mparams'][mp] + ",\n"
                 else:
-                    e += "\"" + mp + "\"\n"
-            e += "),\n"
-            e += "make_handler(\n"
+                    e += "\t\t\t" + s['mparams'][mp] + "\n"
+            e += "\t\t),\n"
+            e += "\t\tmake_handler<SignalHandler>(\n"
             if ('type' in s['sparams']) and (s['sparams']['type'] is not None):
                 e += s['signal'] + "<" + s['sparams']['type'] + ">(\n"
             else:
@@ -199,14 +199,21 @@
                 else:
                     e += s['hparams'][hp] + "\n"
             e += "))\n"
-            e += ")\n"
+            e += "\t\t)\n"
             e += "\t)),\n"
 
     if ('init' in event['triggers']):
         for i in event['triggers']['init']:
             e += "\tmake_trigger(trigger::init(\n"
-            if ('handler' in i):
-                e += "\t\tmake_handler(\n"
+            if ('method' in i):
+                e += "\t\tmake_handler<MethodHandler>(\n"
+                if ('type' in i['mparams']) and \
+                    (i['mparams']['type'] is not None):
+                    e += i['method'] + "<" + i['mparams']['type'] + ">(\n"
+                else:
+                    e += i['method'] + "(\n"
+                for ip in i['mparams']['params']:
+                    e += i['mparams'][ip] + ",\n"
                 if ('type' in i['hparams']) and \
                     (i['hparams']['type'] is not None):
                     e += ("handler::" + i['handler'] +
@@ -218,7 +225,7 @@
                         e += i['hparams'][hp] + ",\n"
                     else:
                         e += i['hparams'][hp] + "\n"
-                e += ")\n"
+                e += "))\n"
                 e += "\t\t)\n"
             e += "\t)),\n"
 
diff --git a/control/templates/defs.mako b/control/templates/defs.mako
index 9d66461..5356677 100644
--- a/control/templates/defs.mako
+++ b/control/templates/defs.mako
@@ -11,26 +11,40 @@
 handler::${par['handler']}(
 %endif
 %for i, hpk in enumerate(par['hparams']['params']):
-    %if (i+1) != len(par['hparams']['params']):
-    ${par['hparams'][hpk]},
-    %else:
-    ${par['hparams'][hpk]}
-    %endif
+%if (i+1) != len(par['hparams']['params']):
+${par['hparams'][hpk]},
+%else:
+${par['hparams'][hpk]}
+%endif
 %endfor
 )
 </%def>\
 
-<%def name="genHandler(sig)" buffered="True">
+<%def name="genSignal(sig)" buffered="True">
 %if ('type' in sig['sparams']) and \
     (sig['sparams']['type'] is not None):
-${sig['signal']}<${sig['sparams']['type']}>(
+${indent(sig['signal'], 3)}<${sig['sparams']['type']}>(\
 %else:
-${sig['signal']}(
+${indent(sig['signal'], 3)}(\
 %endif
 %for spk in sig['sparams']['params']:
-${sig['sparams'][spk]},
+${indent(sig['sparams'][spk], 3)},
 %endfor
-${genParams(par=sig)}\
+${genParams(par=sig)}
+)
+</%def>\
+
+<%def name="genMethod(meth)" buffered="True">
+%if ('type' in meth['mparams']) and \
+    (meth['mparams']['type'] is not None):
+${meth['method']}<${meth['mparams']['type']}>(
+%else:
+${meth['method']}(
+%endif
+%for spk in meth['mparams']['params']:
+${meth['mparams'][spk]},
+%endfor
+${genParams(par=meth)}\
 )
 </%def>\
 
@@ -78,19 +92,19 @@
         %if ('match' in s) and \
             (s['match'] is not None):
         match::${s['match']}(
-        %for i, mp in enumerate(s['mparams']):
-        %if (i+1) != len(s['mparams']):
-        "${mp}",
+        %for i, mp in enumerate(s['mparams']['params']):
+        %if (i+1) != len(s['mparams']['params']):
+        ${indent(s['mparams'][mp], 1)},
         %else:
-        "${mp}"
+        ${indent(s['mparams'][mp], 1)}
         %endif
         %endfor
         ),
         %else:
         "",
         %endif
-        make_handler(\
-        ${indent(genHandler(sig=s), 3)}\
+        make_handler<SignalHandler>(\
+        ${genSignal(sig=s)}
         )
     )),
     %endfor
@@ -98,9 +112,9 @@
     %if ('init' in event['triggers']):
     %for i in event['triggers']['init']:
     make_trigger(trigger::init(
-        %if ('handler' in i):
-        make_handler(\
-        ${indent(genParams(par=i), 3)}\
+        %if ('method' in i):
+        make_handler<MethodHandler>(\
+        ${indent(genMethod(meth=i), 3)}\
         )
         %endif
     )),
diff --git a/control/templates/fan_zone_defs.mako.cpp b/control/templates/fan_zone_defs.mako.cpp
index 4b34c46..e64bff5 100644
--- a/control/templates/fan_zone_defs.mako.cpp
+++ b/control/templates/fan_zone_defs.mako.cpp
@@ -171,19 +171,19 @@
                                 %if ('match' in s) and \
                                     (s['match'] is not None):
                                 match::${s['match']}(
-                                %for i, mp in enumerate(s['mparams']):
-                                %if (i+1) != len(s['mparams']):
-                                "${mp}",
+                                %for i, mp in enumerate(s['mparams']['params']):
+                                %if (i+1) != len(s['mparams']['params']):
+                                ${indent(s['mparams'][mp], 1)},
                                 %else:
-                                "${mp}"
+                                ${indent(s['mparams'][mp], 1)}
                                 %endif
                                 %endfor
                                 ),
                                 %else:
                                 "",
                                 %endif
-                                make_handler(\
-                                ${indent(genHandler(sig=s), 9)}\
+                                make_handler<SignalHandler>(\
+                                ${indent(genSignal(sig=s), 9)}\
                                 )
                             )),
                             %endfor
@@ -191,9 +191,9 @@
                             %if ('init' in event['pc']['triggers']):
                             %for i in event['pc']['triggers']['init']:
                             make_trigger(trigger::init(
-                                %if ('handler' in i):
-                                make_handler(\
-                                ${indent(genParams(par=i), 3)}\
+                                %if ('method' in i):
+                                make_handler<MethodHandler>(\
+                                ${indent(genMethod(meth=i), 3)}\
                                 )
                                 %endif
                             )),
diff --git a/control/triggers.cpp b/control/triggers.cpp
index 3cddce6..5662f3f 100644
--- a/control/triggers.cpp
+++ b/control/triggers.cpp
@@ -23,7 +23,7 @@
     };
 }
 
-Trigger signal(const std::string& match, Handler&& handler)
+Trigger signal(const std::string& match, SignalHandler&& handler)
 {
     return [match = std::move(match),
             handler = std::move(handler)](control::Zone& zone,
@@ -77,7 +77,7 @@
     };
 }
 
-Trigger init(Handler&& handler)
+Trigger init(MethodHandler&& handler)
 {
     return [handler = std::move(handler)](control::Zone& zone,
                                           const Group& group,
@@ -86,10 +86,9 @@
         // A handler function is optional
         if (handler)
         {
-            sdbusplus::message::message nullMsg{nullptr};
-            // Execute the given handler function prior to running the actions
-            handler(zone.getBus(), nullMsg, zone);
+            handler(zone, group);
         }
+
         // Run action functions for initial event state
         std::for_each(
             actions.begin(),
diff --git a/control/triggers.hpp b/control/triggers.hpp
index 35c3091..d170d0b 100644
--- a/control/triggers.hpp
+++ b/control/triggers.hpp
@@ -34,7 +34,7 @@
  * @return Trigger lambda function
  *     A Trigger function that subscribes to a signal
  */
-Trigger signal(const std::string& match, Handler&& handler);
+Trigger signal(const std::string& match, SignalHandler&& handler);
 
 /**
  * @brief A trigger for actions to run at event init
@@ -47,7 +47,7 @@
  * @return Trigger lambda function
  *     A Trigger function that runs actions at event init
  */
-Trigger init(Handler&& handler = nullptr);
+Trigger init(MethodHandler&& handler = nullptr);
 
 } // namespace trigger
 } // namespace control
diff --git a/control/types.hpp b/control/types.hpp
index 4bead3a..72c5db0 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -49,9 +49,10 @@
                                      std::string,
                                      std::string>>;
 using ZoneHandler = std::function<void(Zone&)>;
-using Handler = std::function<void(sdbusplus::bus::bus&,
-                                   sdbusplus::message::message&,
-                                   Zone&)>;
+using SignalHandler = std::function<void(sdbusplus::bus::bus&,
+                                         sdbusplus::message::message&,
+                                         Zone&)>;
+using MethodHandler = std::function<void(Zone&, const Group&)>;
 using Action = std::function<void(Zone&, const Group&)>;
 using Trigger = std::function<void(Zone&,
                                    const Group&,
@@ -91,7 +92,10 @@
 constexpr auto eventMatchPos = 1;
 constexpr auto eventHandlerPos = 2;
 constexpr auto eventActionsPos = 3;
-using EventData = std::tuple<Group, std::string, Handler, std::vector<Action>>;
+using EventData = std::tuple<Group,
+                             std::string,
+                             SignalHandler,
+                             std::vector<Action>>;
 
 constexpr auto timerEventDataPos = 0;
 constexpr auto timerTimerPos = 1;
