diff --git a/control/json/actions/default_floor.cpp b/control/json/actions/default_floor.cpp
index f1cc4af..95a2219 100644
--- a/control/json/actions/default_floor.cpp
+++ b/control/json/actions/default_floor.cpp
@@ -44,7 +44,7 @@
             std::any_of(members.begin(), members.end(),
                         [&intf = group.getInterface()](const auto& member) {
             return !Manager::hasOwner(member, intf);
-            });
+        });
         if (isMissingOwner)
         {
             zone.setFloor(zone.getDefaultFloor());
diff --git a/control/json/actions/mapped_floor.cpp b/control/json/actions/mapped_floor.cpp
index 97f659f..3de2188 100644
--- a/control/json/actions/mapped_floor.cpp
+++ b/control/json/actions/mapped_floor.cpp
@@ -237,7 +237,7 @@
         {
             value = static_cast<double>(val);
         }
-        },
+    },
         value);
 }
 
@@ -271,7 +271,7 @@
                             "isn't numeric",
                             ActionBase::getName(), group.getName())};
                     }
-                    },
+                },
                     value);
                 checked = true;
             }
diff --git a/control/json/actions/missing_owner_target.cpp b/control/json/actions/missing_owner_target.cpp
index 2138a06..deed3cb 100644
--- a/control/json/actions/missing_owner_target.cpp
+++ b/control/json/actions/missing_owner_target.cpp
@@ -47,7 +47,7 @@
             std::any_of(members.begin(), members.end(),
                         [&intf = group.getInterface()](const auto& member) {
             return !Manager::hasOwner(member, intf);
-            });
+        });
         // Update zone's target hold based on action results
         zone.setTargetHold(group.getName(), _target, isMissingOwner);
     }
diff --git a/control/json/actions/override_fan_target.cpp b/control/json/actions/override_fan_target.cpp
index 33fbd34..103008a 100644
--- a/control/json/actions/override_fan_target.cpp
+++ b/control/json/actions/override_fan_target.cpp
@@ -87,8 +87,8 @@
         {
             fanList = std::accumulate(std::next(_fans.begin()), _fans.end(),
                                       _fans[0], [](auto list, auto fan) {
-                                          return std::move(list) + ", " + fan;
-                                      });
+                return std::move(list) + ", " + fan;
+            });
         }
 
         record(std::format("Adding fan target lock of {} on fans [{}] zone {}",
diff --git a/control/json/actions/set_parameter_from_group_max.cpp b/control/json/actions/set_parameter_from_group_max.cpp
index 10c2b70..99e184f 100644
--- a/control/json/actions/set_parameter_from_group_max.cpp
+++ b/control/json/actions/set_parameter_from_group_max.cpp
@@ -77,7 +77,7 @@
                                             .c_str());
                         invalid = true;
                     }
-                    },
+                },
                     value);
                 if (invalid)
                 {
diff --git a/control/json/actions/target_from_group_max.cpp b/control/json/actions/target_from_group_max.cpp
index 045b2d5..341c67d 100644
--- a/control/json/actions/target_from_group_max.cpp
+++ b/control/json/actions/target_from_group_max.cpp
@@ -197,7 +197,7 @@
                                         .c_str());
                     invalid = true;
                 }
-                },
+            },
                 value);
             if (invalid)
             {
diff --git a/control/json/actions/timer_based_actions.cpp b/control/json/actions/timer_based_actions.cpp
index 81d8fc1..02779bd 100644
--- a/control/json/actions/timer_based_actions.cpp
+++ b/control/json/actions/timer_based_actions.cpp
@@ -42,10 +42,9 @@
 {
     // If any of groups' value == nullopt(i.e. not configured), action is
     // driven by the service owned state of the group members
-    _byOwner = std::any_of(_groups.begin(), _groups.end(),
-                           [](const auto& group) {
-        return group.getValue() == std::nullopt;
-    });
+    _byOwner = std::any_of(
+        _groups.begin(), _groups.end(),
+        [](const auto& group) { return group.getValue() == std::nullopt; });
 
     setTimerConf(jsonObj);
     setActions(jsonObj);
@@ -58,12 +57,12 @@
         // If any service providing a group member is not owned, start
         // timer and if all members' services are owned, stop timer.
         if (std::any_of(_groups.begin(), _groups.end(), [](const auto& group) {
-                const auto& members = group.getMembers();
-                return std::any_of(members.begin(), members.end(),
-                                   [&group](const auto& member) {
+            const auto& members = group.getMembers();
+            return std::any_of(members.begin(), members.end(),
+                               [&group](const auto& member) {
                 return !Manager::hasOwner(member, group.getInterface());
-                });
-            }))
+            });
+        }))
         {
             startTimer();
         }
@@ -87,7 +86,7 @@
                        mgr->getProperty(member, group.getInterface(),
                                         group.getProperty());
             });
-            }))
+        }))
         {
             // Timer will be started(and never stopped) when _groups is empty
             startTimer();
diff --git a/control/json/event.cpp b/control/json/event.cpp
index 3a74f30..628c222 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -299,8 +299,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()));
diff --git a/control/json/fan.cpp b/control/json/fan.cpp
index 0010d2b..5abcfbe 100644
--- a/control/json/fan.cpp
+++ b/control/json/fan.cpp
@@ -144,10 +144,9 @@
 void Fan::unlockTarget(uint64_t target)
 {
     // find and remove the requested lock
-    auto itr(std::find_if(_lockedTargets.begin(), _lockedTargets.end(),
-                          [target](auto lockedTarget) {
-        return target == lockedTarget;
-    }));
+    auto itr(std::find_if(
+        _lockedTargets.begin(), _lockedTargets.end(),
+        [target](auto lockedTarget) { return target == lockedTarget; }));
 
     if (_lockedTargets.end() != itr)
     {
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 5121e97..838bd30 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -339,10 +339,9 @@
     // Set owner state for specific object given
     auto& ownIntf = _servTree[path][serv];
     ownIntf.first = isOwned;
-    auto itIntf = std::find_if(ownIntf.second.begin(), ownIntf.second.end(),
-                               [&intf](const auto& interface) {
-        return intf == interface;
-    });
+    auto itIntf = std::find_if(
+        ownIntf.second.begin(), ownIntf.second.end(),
+        [&intf](const auto& interface) { return intf == interface; });
     if (itIntf == std::end(ownIntf.second))
     {
         ownIntf.second.emplace_back(intf);
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index 369b6bf..d7657e9 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -229,7 +229,7 @@
                         return std::find(getActiveProfiles().begin(),
                                          getActiveProfiles().end(),
                                          name) != getActiveProfiles().end();
-                        }))
+                    }))
                     {
                         continue;
                     }
diff --git a/control/json/triggers/init.cpp b/control/json/triggers/init.cpp
index 32277d7..bd557d7 100644
--- a/control/json/triggers/init.cpp
+++ b/control/json/triggers/init.cpp
@@ -159,10 +159,9 @@
         if (!groups.empty() && handler == methods.end())
         {
             // Construct list of available methods
-            auto availMethods = std::accumulate(std::next(methods.begin()),
-                                                methods.end(),
-                                                methods.begin()->first,
-                                                [](auto list, auto method) {
+            auto availMethods = std::accumulate(
+                std::next(methods.begin()), methods.end(),
+                methods.begin()->first, [](auto list, auto method) {
                 return std::move(list) + ", " + method.first;
             });
             auto msg =
diff --git a/control/json/triggers/signal.cpp b/control/json/triggers/signal.cpp
index 5e78d6e..537ef50 100644
--- a/control/json/triggers/signal.cpp
+++ b/control/json/triggers/signal.cpp
@@ -249,11 +249,11 @@
     if (subscriber == signals.end())
     {
         // Construct list of available signals
-        auto availSignals = std::accumulate(
-            std::next(signals.begin()), signals.end(), signals.begin()->first,
-            [](auto list, auto signal) {
+        auto availSignals =
+            std::accumulate(std::next(signals.begin()), signals.end(),
+                            signals.begin()->first, [](auto list, auto signal) {
             return std::move(list) + ", " + signal.first;
-            });
+        });
         auto msg =
             std::format("Event '{}' requires a supported signal given to be "
                         "triggered by signal, available signals: {}",
diff --git a/control/json/zone.cpp b/control/json/zone.cpp
index 487a7d4..12f8c02 100644
--- a/control/json/zone.cpp
+++ b/control/json/zone.cpp
@@ -161,10 +161,9 @@
 
 void Zone::lockFanTarget(const std::string& fname, uint64_t target)
 {
-    auto fanItr = std::find_if(_fans.begin(), _fans.end(),
-                               [&fname](const auto& fan) {
-        return fan->getName() == fname;
-    });
+    auto fanItr = std::find_if(
+        _fans.begin(), _fans.end(),
+        [&fname](const auto& fan) { return fan->getName() == fname; });
 
     if (_fans.end() != fanItr)
     {
@@ -181,10 +180,9 @@
 
 void Zone::unlockFanTarget(const std::string& fname, uint64_t target)
 {
-    auto fanItr = std::find_if(_fans.begin(), _fans.end(),
-                               [&fname](const auto& fan) {
-        return fan->getName() == fname;
-    });
+    auto fanItr = std::find_if(
+        _fans.begin(), _fans.end(),
+        [&fname](const auto& fan) { return fan->getName() == fname; });
 
     if (_fans.end() != fanItr)
     {
@@ -460,10 +458,9 @@
         if (propFuncs == _intfPropHandlers.end())
         {
             // Construct list of available configurable interfaces
-            auto intfs = std::accumulate(std::next(_intfPropHandlers.begin()),
-                                         _intfPropHandlers.end(),
-                                         _intfPropHandlers.begin()->first,
-                                         [](auto list, auto intf) {
+            auto intfs = std::accumulate(
+                std::next(_intfPropHandlers.begin()), _intfPropHandlers.end(),
+                _intfPropHandlers.begin()->first, [](auto list, auto intf) {
                 return std::move(list) + ", " + intf.first;
             });
             log<level::ERR>("Configured interface not available",
@@ -500,7 +497,7 @@
                     propFuncs->second.end(), propFuncs->second.begin()->first,
                     [](auto list, auto prop) {
                     return std::move(list) + ", " + prop.first;
-                    });
+                });
                 log<level::ERR>("Configured property not available",
                                 entry("JSON=%s", property.dump().c_str()),
                                 entry("AVAILABLE_PROPS=%s", props.c_str()));
