diff --git a/control/triggers.cpp b/control/triggers.cpp
index 0df2a4a..cb7281c 100644
--- a/control/triggers.cpp
+++ b/control/triggers.cpp
@@ -13,46 +13,29 @@
 
 Trigger timer(TimerConf&& tConf)
 {
-    return [tConf = std::move(tConf)](control::Zone& zone,
-                                      const std::string& name,
-                                      const Group& group,
-                                      const std::vector<Action>& actions)
-    {
-        zone.addTimer(name,
-                      group,
-                      actions,
-                      tConf);
+    return [tConf = std::move(tConf)](
+               control::Zone& zone, const std::string& name, const Group& group,
+               const std::vector<Action>& actions) {
+        zone.addTimer(name, group, actions, tConf);
     };
 }
 
 Trigger signal(const std::string& match, SignalHandler&& handler)
 {
-    return [match = std::move(match),
-            handler = std::move(handler)](control::Zone& zone,
-                                          const std::string& name,
-                                          const Group& group,
-                                          const std::vector<Action>& actions)
-    {
+    return [match = std::move(match), handler = std::move(handler)](
+               control::Zone& zone, const std::string& name, 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::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())
-            );
+                zone.getBus(), match.c_str(),
+                std::bind(std::mem_fn(&Zone::handleEvent), &zone,
+                          std::placeholders::_1, eventData.get()));
         }
         else
         {
@@ -65,13 +48,12 @@
                     auto ifaces = zone.getIfaces();
                     // Group member interface in list owned by zone
                     if (std::find(ifaces.begin(), ifaces.end(),
-                        std::get<intfPos>(entry)) != ifaces.end())
+                                  std::get<intfPos>(entry)) != ifaces.end())
                     {
                         // Store path,interface,property as a managed object
-                        zone.setObjectData(std::get<pathPos>(entry),
-                                           std::get<intfPos>(entry),
-                                           std::get<propPos>(entry),
-                                           eventData.get());
+                        zone.setObjectData(
+                            std::get<pathPos>(entry), std::get<intfPos>(entry),
+                            std::get<propPos>(entry), eventData.get());
                     }
                 }
             }
@@ -82,11 +64,9 @@
 
 Trigger init(MethodHandler&& handler)
 {
-    return [handler = std::move(handler)](control::Zone& zone,
-                                          const std::string& name,
-                                          const Group& group,
-                                          const std::vector<Action>& actions)
-    {
+    return [handler = std::move(handler)](
+               control::Zone& zone, const std::string& name, const Group& group,
+               const std::vector<Action>& actions) {
         // A handler function is optional
         if (handler)
         {
@@ -95,13 +75,8 @@
 
         // Run action functions for initial event state
         std::for_each(
-            actions.begin(),
-            actions.end(),
-            [&zone, &group](auto const& action)
-            {
-                action(zone, group);
-            }
-        );
+            actions.begin(), actions.end(),
+            [&zone, &group](auto const& action) { action(zone, group); });
     };
 }
 
