diff --git a/control/json/event.cpp b/control/json/event.cpp
index 628c222..0e7f1e5 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -40,8 +40,8 @@
 
 Event::Event(const json& jsonObj, Manager* mgr,
              std::map<configKey, std::unique_ptr<Zone>>& zones) :
-    ConfigBase(jsonObj),
-    _bus(util::SDBusPlus::getBus()), _manager(mgr), _zones(zones)
+    ConfigBase(jsonObj), _bus(util::SDBusPlus::getBus()), _manager(mgr),
+    _zones(zones)
 {
     // Event groups are optional
     if (jsonObj.contains("groups"))
@@ -155,10 +155,11 @@
 
             configKey eventProfile =
                 std::make_pair(jsonGrp["name"].get<std::string>(), profiles);
-            auto grpEntry = std::find_if(availGroups.begin(), availGroups.end(),
-                                         [&eventProfile](const auto& grp) {
-                return Manager::inConfig(grp.first, eventProfile);
-            });
+            auto grpEntry = std::find_if(
+                availGroups.begin(), availGroups.end(),
+                [&eventProfile](const auto& grp) {
+                    return Manager::inConfig(grp.first, eventProfile);
+                });
             if (grpEntry != availGroups.end())
             {
                 auto group = Group(*grpEntry->second);
@@ -188,12 +189,13 @@
             // against all zones matching the event's active profiles
             for (const auto& zone : _zones)
             {
-                configKey eventProfile = std::make_pair(zone.second->getName(),
-                                                        _profiles);
-                auto zoneEntry = std::find_if(_zones.begin(), _zones.end(),
-                                              [&eventProfile](const auto& z) {
-                    return Manager::inConfig(z.first, eventProfile);
-                });
+                configKey eventProfile =
+                    std::make_pair(zone.second->getName(), _profiles);
+                auto zoneEntry = std::find_if(
+                    _zones.begin(), _zones.end(),
+                    [&eventProfile](const auto& z) {
+                        return Manager::inConfig(z.first, eventProfile);
+                    });
                 if (zoneEntry != _zones.end())
                 {
                     actionZones.emplace_back(*zoneEntry->second);
@@ -208,10 +210,11 @@
             {
                 configKey eventProfile =
                     std::make_pair(jsonZone.get<std::string>(), _profiles);
-                auto zoneEntry = std::find_if(_zones.begin(), _zones.end(),
-                                              [&eventProfile](const auto& z) {
-                    return Manager::inConfig(z.first, eventProfile);
-                });
+                auto zoneEntry = std::find_if(
+                    _zones.begin(), _zones.end(),
+                    [&eventProfile](const auto& z) {
+                        return Manager::inConfig(z.first, eventProfile);
+                    });
                 if (zoneEntry != _zones.end())
                 {
                     actionZones.emplace_back(*zoneEntry->second);
@@ -299,8 +302,8 @@
             auto availTrigs = std::accumulate(
                 std::next(trigger::triggers.begin()), trigger::triggers.end(),
                 trigger::triggers.begin()->first, [](auto list, auto trig) {
-                return std::move(list) + ", " + trig.first;
-            });
+                    return std::move(list) + ", " + trig.first;
+                });
             log<level::ERR>(
                 std::format("Trigger '{}' is not recognized", tClass).c_str(),
                 entry("AVAILABLE_TRIGGERS=%s", availTrigs.c_str()));
@@ -314,14 +317,14 @@
     json actionData;
     std::for_each(_actions.begin(), _actions.end(),
                   [&actionData](const auto& action) {
-        actionData[action->getUniqueName()] = action->dump();
-    });
+                      actionData[action->getUniqueName()] = action->dump();
+                  });
 
     std::vector<std::string> groupData;
     std::for_each(_groups.begin(), _groups.end(),
                   [&groupData](const auto& group) {
-        groupData.push_back(group.getName());
-    });
+                      groupData.push_back(group.getName());
+                  });
 
     json eventData;
     eventData["groups"] = groupData;
