diff --git a/.clang-format b/.clang-format
index 52ac0a1..d92a3f1 100644
--- a/.clang-format
+++ b/.clang-format
@@ -6,12 +6,14 @@
 AlignConsecutiveAssignments: false
 AlignConsecutiveDeclarations: false
 AlignEscapedNewlines: Right
-AlignOperands:   true
-AlignTrailingComments: true
+AlignOperands:  Align
+AlignTrailingComments:
+  Kind: Always
+  OverEmptyLines: 1
 AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: false
+AllowShortBlocksOnASingleLine: Empty
 AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: None
+AllowShortFunctionsOnASingleLine: Empty
 AllowShortIfStatementsOnASingleLine: false
 AllowShortLoopsOnASingleLine: false
 AlwaysBreakAfterReturnType: None
@@ -36,12 +38,13 @@
   SplitEmptyFunction:   false
   SplitEmptyRecord:     false
   SplitEmptyNamespace:  false
+BreakAfterAttributes: Never
 BreakBeforeBinaryOperators: None
 BreakBeforeBraces: Custom
 BreakBeforeTernaryOperators: true
 BreakConstructorInitializers: AfterColon
 BreakInheritanceList: AfterColon
-BreakStringLiterals: true
+BreakStringLiterals: false
 ColumnLimit:     80
 CommentPragmas:  '^ IWYU pragma:'
 CompactNamespaces: false
@@ -49,6 +52,7 @@
 ConstructorInitializerIndentWidth: 4
 ContinuationIndentWidth: 4
 Cpp11BracedListStyle: true
+DeriveLineEnding: false
 DerivePointerAlignment: false
 PointerAlignment: Left
 DisableFormat:   false
@@ -74,9 +78,13 @@
   - Regex:           '.*'
     Priority:        6
 IndentCaseLabels: true
+IndentRequiresClause: true
 IndentWidth:     4
 IndentWrappedFunctionNames: true
-KeepEmptyLinesAtTheStartOfBlocks: true
+InsertNewlineAtEOF: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+LambdaBodyIndentation: OuterScope
+LineEnding: LF
 MacroBlockBegin: ''
 MacroBlockEnd:   ''
 MaxEmptyLinesToKeep: 1
@@ -84,13 +92,19 @@
 ObjCBlockIndentWidth: 2
 ObjCSpaceAfterProperty: false
 ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 25
 PenaltyBreakBeforeFirstCallParameter: 19
 PenaltyBreakComment: 300
 PenaltyBreakFirstLessLess: 120
 PenaltyBreakString: 1000
 PenaltyExcessCharacter: 1000000
 PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+QualifierAlignment: Left
+ReferenceAlignment: Left
 ReflowComments:  true
+RequiresClausePosition: OwnLine
+RequiresExpressionIndentation: Keyword
 SortIncludes:    true
 SortUsingDeclarations: true
 SpaceAfterCStyleCast: false
diff --git a/control/actions.cpp b/control/actions.cpp
index 00dc8f0..bd2adfc 100644
--- a/control/actions.cpp
+++ b/control/actions.cpp
@@ -73,10 +73,10 @@
         // Set/update the services of the group
         zone.setServices(&group);
         auto services = zone.getGroupServices(&group);
-        auto missingOwner =
-            std::any_of(services.begin(), services.end(), [](const auto& s) {
-                return !std::get<hasOwnerPos>(s);
-            });
+        auto missingOwner = std::any_of(services.begin(), services.end(),
+                                        [](const auto& s) {
+            return !std::get<hasOwnerPos>(s);
+        });
         if (missingOwner)
         {
             zone.setSpeed(speed);
@@ -89,20 +89,20 @@
 void set_request_speed_base_with_max(control::Zone& zone, const Group& group)
 {
     int64_t base = 0;
-    std::for_each(
-        group.begin(), group.end(), [&zone, &base](auto const& entry) {
-            try
-            {
-                auto value = zone.template getPropertyValue<int64_t>(
-                    std::get<pathPos>(entry), std::get<intfPos>(entry),
-                    std::get<propPos>(entry));
-                base = std::max(base, value);
-            }
-            catch (const std::out_of_range& oore)
-            {
-                // Property value not found, base request speed unchanged
-            }
-        });
+    std::for_each(group.begin(), group.end(),
+                  [&zone, &base](const auto& entry) {
+        try
+        {
+            auto value = zone.template getPropertyValue<int64_t>(
+                std::get<pathPos>(entry), std::get<intfPos>(entry),
+                std::get<propPos>(entry));
+            base = std::max(base, value);
+        }
+        catch (const std::out_of_range& oore)
+        {
+            // Property value not found, base request speed unchanged
+        }
+    });
     // A request speed base of 0 defaults to the current target speed
     zone.setRequestSpeedBase(base);
 }
diff --git a/control/actions.hpp b/control/actions.hpp
index 53e2efe..968c1b2 100644
--- a/control/actions.hpp
+++ b/control/actions.hpp
@@ -135,21 +135,21 @@
         if (group.size() != 0)
         {
             auto count = 0;
-            auto sumValue = std::accumulate(
-                group.begin(), group.end(), 0,
-                [&zone, &count](T sum, auto const& entry) {
-                    try
-                    {
-                        return sum + zone.template getPropertyValue<T>(
-                                         std::get<pathPos>(entry),
-                                         std::get<intfPos>(entry),
-                                         std::get<propPos>(entry));
-                    }
-                    catch (const std::out_of_range& oore)
-                    {
-                        count++;
-                        return sum;
-                    }
+            auto sumValue =
+                std::accumulate(group.begin(), group.end(), 0,
+                                [&zone, &count](T sum, auto const& entry) {
+                try
+                {
+                    return sum + zone.template getPropertyValue<T>(
+                                     std::get<pathPos>(entry),
+                                     std::get<intfPos>(entry),
+                                     std::get<propPos>(entry));
+                }
+                catch (const std::out_of_range& oore)
+                {
+                    count++;
+                    return sum;
+                }
                 });
             if ((group.size() - count) > 0)
             {
@@ -157,8 +157,8 @@
                 auto avgValue = sumValue / (groupSize - count);
                 auto it = std::find_if(val_to_speed.begin(), val_to_speed.end(),
                                        [&avgValue](auto const& entry) {
-                                           return avgValue < entry.first;
-                                       });
+                    return avgValue < entry.first;
+                });
                 if (it != std::end(val_to_speed))
                 {
                     speed = (*it).second;
@@ -193,21 +193,21 @@
         if (group.size() != 0)
         {
             auto count = 0;
-            auto sumValue = std::accumulate(
-                group.begin(), group.end(), 0,
-                [&zone, &count](T sum, auto const& entry) {
-                    try
-                    {
-                        return sum + zone.template getPropertyValue<T>(
-                                         std::get<pathPos>(entry),
-                                         std::get<intfPos>(entry),
-                                         std::get<propPos>(entry));
-                    }
-                    catch (const std::out_of_range& oore)
-                    {
-                        count++;
-                        return sum;
-                    }
+            auto sumValue =
+                std::accumulate(group.begin(), group.end(), 0,
+                                [&zone, &count](T sum, auto const& entry) {
+                try
+                {
+                    return sum + zone.template getPropertyValue<T>(
+                                     std::get<pathPos>(entry),
+                                     std::get<intfPos>(entry),
+                                     std::get<propPos>(entry));
+                }
+                catch (const std::out_of_range& oore)
+                {
+                    count++;
+                    return sum;
+                }
                 });
             if ((group.size() - count) > 0)
             {
@@ -215,7 +215,7 @@
                 auto avgValue = sumValue / (groupSize - count);
                 auto prevValue = zone.swapCeilingKeyValue(avgValue);
                 if (avgValue != prevValue)
-                { // Only check if previous and new values differ
+                {     // Only check if previous and new values differ
                     if (avgValue < prevValue)
                     { // Value is decreasing from previous
                         for (auto it = val_to_speed.rbegin();
@@ -307,34 +307,33 @@
     return [speedDelta, factor = std::forward<T>(factor),
             state = std::forward<T>(state)](auto& zone, auto& group) {
         auto netDelta = zone.getIncSpeedDelta();
-        std::for_each(
-            group.begin(), group.end(),
-            [&zone, &state, &factor, &speedDelta,
-             &netDelta](auto const& entry) {
-                try
+        std::for_each(group.begin(), group.end(),
+                      [&zone, &state, &factor, &speedDelta,
+                       &netDelta](auto const& entry) {
+            try
+            {
+                T value = zone.template getPropertyValue<T>(
+                    std::get<pathPos>(entry), std::get<intfPos>(entry),
+                    std::get<propPos>(entry));
+                // TODO openbmc/phosphor-fan-presence#7 - Support possible
+                // state types for comparison
+                if (value >= state)
                 {
-                    T value = zone.template getPropertyValue<T>(
-                        std::get<pathPos>(entry), std::get<intfPos>(entry),
-                        std::get<propPos>(entry));
-                    // TODO openbmc/phosphor-fan-presence#7 - Support possible
-                    // state types for comparison
-                    if (value >= state)
-                    {
-                        // Increase by at least a single delta(factor)
-                        // to attempt bringing under 'state'
-                        auto delta = std::max((value - state), factor);
-                        // Increase is the factor applied to the
-                        // difference times the given speed delta
-                        netDelta = std::max(netDelta,
-                                            static_cast<uint64_t>(
-                                                (delta / factor) * speedDelta));
-                    }
+                    // Increase by at least a single delta(factor)
+                    // to attempt bringing under 'state'
+                    auto delta = std::max((value - state), factor);
+                    // Increase is the factor applied to the
+                    // difference times the given speed delta
+                    netDelta = std::max(
+                        netDelta,
+                        static_cast<uint64_t>((delta / factor) * speedDelta));
                 }
-                catch (const std::out_of_range& oore)
-                {
-                    // Property value not found, netDelta unchanged
-                }
-            });
+            }
+            catch (const std::out_of_range& oore)
+            {
+                // Property value not found, netDelta unchanged
+            }
+        });
         // Request speed change for target speed update
         zone.requestSpeedIncrease(netDelta);
     };
@@ -427,21 +426,20 @@
     return [state = std::forward<T>(state), defEvents = std::move(defEvents),
             altEvents = std::move(altEvents)](auto& zone, auto& group) {
         // Compare all group entries to the state
-        auto useAlt = std::all_of(
-            group.begin(), group.end(), [&zone, &state](auto const& entry) {
-                try
-                {
-                    return zone.template getPropertyValue<T>(
-                               std::get<pathPos>(entry),
-                               std::get<intfPos>(entry),
-                               std::get<propPos>(entry)) == state;
-                }
-                catch (const std::out_of_range& oore)
-                {
-                    // Default to property not equal when not found
-                    return false;
-                }
-            });
+        auto useAlt = std::all_of(group.begin(), group.end(),
+                                  [&zone, &state](auto const& entry) {
+            try
+            {
+                return zone.template getPropertyValue<T>(
+                           std::get<pathPos>(entry), std::get<intfPos>(entry),
+                           std::get<propPos>(entry)) == state;
+            }
+            catch (const std::out_of_range& oore)
+            {
+                // Default to property not equal when not found
+                return false;
+            }
+        });
 
         const std::vector<SetSpeedEvent>* rmEvents = &altEvents;
         const std::vector<SetSpeedEvent>* initEvents = &defEvents;
@@ -528,8 +526,8 @@
                 // Use determined median sensor value to find floor speed
                 auto it = std::find_if(valueToSpeed.begin(), valueToSpeed.end(),
                                        [&median](auto const& entry) {
-                                           return median < entry.first;
-                                       });
+                    return median < entry.first;
+                });
                 if (it != std::end(valueToSpeed))
                 {
                     speed = (*it).second;
@@ -556,21 +554,20 @@
 auto update_default_floor(T&& state, uint64_t speed)
 {
     return [speed, state = std::forward<T>(state)](auto& zone, auto& group) {
-        auto updateDefFloor = std::all_of(
-            group.begin(), group.end(), [&zone, &state](auto const& entry) {
-                try
-                {
-                    return zone.template getPropertyValue<T>(
-                               std::get<pathPos>(entry),
-                               std::get<intfPos>(entry),
-                               std::get<propPos>(entry)) == state;
-                }
-                catch (const std::out_of_range& oore)
-                {
-                    // Default to property not equal when not found
-                    return false;
-                }
-            });
+        auto updateDefFloor = std::all_of(group.begin(), group.end(),
+                                          [&zone, &state](auto const& entry) {
+            try
+            {
+                return zone.template getPropertyValue<T>(
+                           std::get<pathPos>(entry), std::get<intfPos>(entry),
+                           std::get<propPos>(entry)) == state;
+            }
+            catch (const std::out_of_range& oore)
+            {
+                // Default to property not equal when not found
+                return false;
+            }
+        });
 
         if (!updateDefFloor)
         {
@@ -602,35 +599,36 @@
     return [state = std::forward<T>(state),
             events = std::move(events)](auto& zone, auto& group) {
         // Compare all group entries to the state
-        auto useEvents = std::all_of(
-            group.begin(), group.end(), [&zone, &state](auto const& entry) {
-                try
-                {
-                    return zone.template getPropertyValue<T>(
-                               std::get<pathPos>(entry),
-                               std::get<intfPos>(entry),
-                               std::get<propPos>(entry)) == state;
-                }
-                catch (const std::out_of_range& oore)
-                {
-                    // Default to property not equal when not found
-                    return false;
-                }
-            });
+        auto useEvents = std::all_of(group.begin(), group.end(),
+                                     [&zone, &state](auto const& entry) {
+            try
+            {
+                return zone.template getPropertyValue<T>(
+                           std::get<pathPos>(entry), std::get<intfPos>(entry),
+                           std::get<propPos>(entry)) == state;
+            }
+            catch (const std::out_of_range& oore)
+            {
+                // Default to property not equal when not found
+                return false;
+            }
+        });
 
         if (useEvents)
         {
             // Init events
-            std::for_each(
-                events.begin(), events.end(),
-                [&zone](auto const& entry) { zone.initEvent(entry); });
+            std::for_each(events.begin(), events.end(),
+                          [&zone](auto const& entry) {
+                zone.initEvent(entry);
+            });
         }
         else
         {
             // Remove events
-            std::for_each(
-                events.begin(), events.end(),
-                [&zone](auto const& entry) { zone.removeEvent(entry); });
+            std::for_each(events.begin(), events.end(),
+                          [&zone](auto const& entry) {
+                zone.removeEvent(entry);
+            });
         }
     };
 }
diff --git a/control/fanctl.cpp b/control/fanctl.cpp
index 6f4a133..280fbe5 100644
--- a/control/fanctl.cpp
+++ b/control/fanctl.cpp
@@ -57,7 +57,7 @@
  * @return just the fan name.
  */
 
-std::string justFanName(std::string const& path)
+std::string justFanName(const std::string& path)
 {
     std::string fanName;
 
@@ -161,8 +161,8 @@
     }
 
     // load tach sensor paths for each fan
-    pathMap["tach"] =
-        getPathsFromIface(paths["tach"], interfaces["SensorValue"], fanNames);
+    pathMap["tach"] = getPathsFromIface(paths["tach"],
+                                        interfaces["SensorValue"], fanNames);
 
     // load inventory Item data for each fan
     pathMap["inventory"] = getPathsFromIface(
@@ -220,18 +220,18 @@
 
     std::string path("/xyz/openbmc_project/state/bmc0");
     std::string iface("xyz.openbmc_project.State.BMC");
-    ret[3] =
-        SDBusPlus::getProperty<std::string>(path, iface, "CurrentBMCState");
+    ret[3] = SDBusPlus::getProperty<std::string>(path, iface,
+                                                 "CurrentBMCState");
 
     path = "/xyz/openbmc_project/state/chassis0";
     iface = "xyz.openbmc_project.State.Chassis";
-    ret[4] =
-        SDBusPlus::getProperty<std::string>(path, iface, "CurrentPowerState");
+    ret[4] = SDBusPlus::getProperty<std::string>(path, iface,
+                                                 "CurrentPowerState");
 
     path = "/xyz/openbmc_project/state/host0";
     iface = "xyz.openbmc_project.State.Host";
-    ret[5] =
-        SDBusPlus::getProperty<std::string>(path, iface, "CurrentHostState");
+    ret[5] = SDBusPlus::getProperty<std::string>(path, iface,
+                                                 "CurrentHostState");
 
     return ret;
 }
@@ -724,8 +724,8 @@
 
 #ifdef CONTROL_USE_JSON
     // Query dump
-    auto cmdDumpQuery =
-        commands->add_subcommand("query_dump", "Query the dump file");
+    auto cmdDumpQuery = commands->add_subcommand("query_dump",
+                                                 "Query the dump file");
 
     cmdDumpQuery->set_help_flag("-h, --help", "Query the dump file");
     cmdDumpQuery
diff --git a/control/functor.hpp b/control/functor.hpp
index da5ffe1..1208aec 100644
--- a/control/functor.hpp
+++ b/control/functor.hpp
@@ -125,8 +125,8 @@
             }
 
             // Retrieve the property's value applying any visitors necessary
-            auto value =
-                zone.getPropertyValueVisitor<T>(_intf, _prop, it->second);
+            auto value = zone.getPropertyValueVisitor<T>(_intf, _prop,
+                                                         it->second);
 
             _handler(zone, _path, _intf, _prop, std::forward<T>(value));
         }
@@ -159,23 +159,23 @@
     {
         std::for_each(
             group.begin(), group.end(),
-            [&zone, 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, path, intf, prop, std::forward<T>(val));
-                }
-                catch (const sdbusplus::exception_t&)
-                {
-                    // Property value not sent to handler
-                }
-                catch (const util::DBusError&)
-                {
-                    // Property value not sent to handler
-                }
+            [&zone, handler = std::move(_handler)](const auto& 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, path, intf, prop, std::forward<T>(val));
+            }
+            catch (const sdbusplus::exception_t&)
+            {
+                // Property value not sent to handler
+            }
+            catch (const util::DBusError&)
+            {
+                // Property value not sent to handler
+            }
             });
     }
 
@@ -276,8 +276,8 @@
             }
 
             // Retrieve the property's value applying any visitors necessary
-            auto value =
-                zone.getPropertyValueVisitor<T>(_intf, _prop, itProp->second);
+            auto value = zone.getPropertyValueVisitor<T>(_intf, _prop,
+                                                         itProp->second);
 
             _handler(zone, _path, _intf, _prop, std::forward<T>(value));
         }
@@ -395,8 +395,7 @@
     NameOwner& operator=(const NameOwner&) = default;
     NameOwner(NameOwner&&) = default;
     NameOwner& operator=(NameOwner&&) = default;
-    explicit NameOwner(U&& handler) : _handler(std::forward<U>(handler))
-    {}
+    explicit NameOwner(U&& handler) : _handler(std::forward<U>(handler)) {}
 
     /** @brief Run signal handler function
      *
@@ -431,33 +430,32 @@
     {
         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
+        std::for_each(group.begin(), group.end(),
+                      [&zone, &group, &name, &hasOwner,
+                       handler = std::move(_handler)](const auto& member) {
+            auto path = std::get<pathPos>(member);
+            auto intf = std::get<intfPos>(member);
+            try
+            {
+                auto servName = zone.getService(path, intf);
+                if (name != servName)
                 {
-                    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);
-                    }
+                    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;
-                }
-            });
+            }
+            catch (const util::DBusMethodError& e)
+            {
+                // Failed to get service name owner state
+                name = "";
+                hasOwner = false;
+            }
+        });
     }
 
   private:
diff --git a/control/json/actions/action.hpp b/control/json/actions/action.hpp
index cafa542..dcba6ea 100644
--- a/control/json/actions/action.hpp
+++ b/control/json/actions/action.hpp
@@ -154,11 +154,10 @@
      */
     virtual void addZone(Zone& zone)
     {
-        auto itZone =
-            std::find_if(_zones.begin(), _zones.end(),
-                         [&zone](std::reference_wrapper<Zone>& z) {
-                             return z.get().getName() == zone.getName();
-                         });
+        auto itZone = std::find_if(_zones.begin(), _zones.end(),
+                                   [&zone](std::reference_wrapper<Zone>& z) {
+            return z.get().getName() == zone.getName();
+        });
         if (itZone == _zones.end())
         {
             _zones.emplace_back(std::reference_wrapper<Zone>(zone));
@@ -225,8 +224,8 @@
         json groups = json::array();
         std::for_each(_groups.begin(), _groups.end(),
                       [&groups](const auto& group) {
-                          groups.push_back(group.getName());
-                      });
+            groups.push_back(group.getName());
+        });
         json output;
         output["groups"] = groups;
         return output;
@@ -333,11 +332,11 @@
         else
         {
             // Construct list of available actions
-            auto acts = std::accumulate(
-                std::next(actions.begin()), actions.end(),
-                actions.begin()->first, [](auto list, auto act) {
-                    return std::move(list) + ", " + act.first;
-                });
+            auto acts = std::accumulate(std::next(actions.begin()),
+                                        actions.end(), actions.begin()->first,
+                                        [](auto list, auto act) {
+                return std::move(list) + ", " + act.first;
+            });
             log<level::ERR>(
                 fmt::format("Action '{}' is not registered", name).c_str(),
                 entry("AVAILABLE_ACTIONS=%s", acts.c_str()));
diff --git a/control/json/actions/default_floor.cpp b/control/json/actions/default_floor.cpp
index 5ca3c10..f1cc4af 100644
--- a/control/json/actions/default_floor.cpp
+++ b/control/json/actions/default_floor.cpp
@@ -43,8 +43,8 @@
         auto isMissingOwner =
             std::any_of(members.begin(), members.end(),
                         [&intf = group.getInterface()](const auto& member) {
-                            return !Manager::hasOwner(member, intf);
-                        });
+            return !Manager::hasOwner(member, intf);
+            });
         if (isMissingOwner)
         {
             zone.setFloor(zone.getDefaultFloor());
diff --git a/control/json/actions/get_managed_objects.cpp b/control/json/actions/get_managed_objects.cpp
index eb5600e..099a68b 100644
--- a/control/json/actions/get_managed_objects.cpp
+++ b/control/json/actions/get_managed_objects.cpp
@@ -60,11 +60,11 @@
                 }
 
                 // Look for the ObjectManager as an ancestor of the path.
-                auto hasObjMgr = std::any_of(
-                    objMgrPaths.begin(), objMgrPaths.end(),
-                    [member](const auto& path) {
-                        return member.find(path) != std::string::npos;
-                    });
+                auto hasObjMgr = std::any_of(objMgrPaths.begin(),
+                                             objMgrPaths.end(),
+                                             [member](const auto& path) {
+                    return member.find(path) != std::string::npos;
+                });
 
                 if (!hasObjMgr || services.find(service) == services.end())
                 {
@@ -99,8 +99,8 @@
         // Add zone to _actions
         std::for_each(_actions.begin(), _actions.end(),
                       [&zone](std::unique_ptr<ActionBase>& action) {
-                          action->addZone(zone);
-                      });
+            action->addZone(zone);
+        });
     }
 }
 
diff --git a/control/json/actions/mapped_floor.cpp b/control/json/actions/mapped_floor.cpp
index 906559b..c947098 100644
--- a/control/json/actions/mapped_floor.cpp
+++ b/control/json/actions/mapped_floor.cpp
@@ -158,7 +158,6 @@
                 if (!floorEntry.contains("value") ||
                     !floorEntry.contains("floor"))
                 {
-
                     throw ActionParseError{
                         ActionBase::getName(),
                         "Missing value or floor entries in "
@@ -234,12 +233,11 @@
 {
     std::visit(
         [&value](auto&& val) {
-            using V = std::decay_t<decltype(val)>;
-            if constexpr (std::is_same_v<int32_t, V> ||
-                          std::is_same_v<int64_t, V>)
-            {
-                value = static_cast<double>(val);
-            }
+        using V = std::decay_t<decltype(val)>;
+        if constexpr (std::is_same_v<int32_t, V> || std::is_same_v<int64_t, V>)
+        {
+            value = static_cast<double>(val);
+        }
         },
         value);
 }
@@ -264,16 +262,16 @@
             {
                 std::visit(
                     [&group, this](auto&& val) {
-                        using V = std::decay_t<decltype(val)>;
-                        if constexpr (!std::is_same_v<double, V> &&
-                                      !std::is_same_v<int32_t, V> &&
-                                      !std::is_same_v<int64_t, V>)
-                        {
-                            throw std::runtime_error{fmt::format(
-                                "{}: Group {} has more than one member but "
-                                "isn't numeric",
-                                ActionBase::getName(), group.getName())};
-                        }
+                    using V = std::decay_t<decltype(val)>;
+                    if constexpr (!std::is_same_v<double, V> &&
+                                  !std::is_same_v<int32_t, V> &&
+                                  !std::is_same_v<int64_t, V>)
+                    {
+                        throw std::runtime_error{fmt::format(
+                            "{}: Group {} has more than one member but "
+                            "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 ccafdc2..30f91b4 100644
--- a/control/json/actions/missing_owner_target.cpp
+++ b/control/json/actions/missing_owner_target.cpp
@@ -47,8 +47,8 @@
         auto isMissingOwner =
             std::any_of(members.begin(), members.end(),
                         [&intf = group.getInterface()](const auto& member) {
-                            return !Manager::hasOwner(member, intf);
-                        });
+            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/net_target_increase.cpp b/control/json/actions/net_target_increase.cpp
index cc08cfa..878dd3f 100644
--- a/control/json/actions/net_target_increase.cpp
+++ b/control/json/actions/net_target_increase.cpp
@@ -44,7 +44,6 @@
 
 void NetTargetIncrease::run(Zone& zone)
 {
-
     if (!_stateParameter.empty())
     {
         auto s = Manager::getParameter(_stateParameter);
@@ -59,80 +58,77 @@
     for (const auto& group : _groups)
     {
         const auto& members = group.getMembers();
-        std::for_each(
-            members.begin(), members.end(),
-            [this, &zone, &group, &netDelta](const auto& member) {
-                try
+        std::for_each(members.begin(), members.end(),
+                      [this, &zone, &group, &netDelta](const auto& member) {
+            try
+            {
+                auto value = Manager::getObjValueVariant(
+                    member, group.getInterface(), group.getProperty());
+                if (std::holds_alternative<int64_t>(value) ||
+                    std::holds_alternative<double>(value))
                 {
-                    auto value = Manager::getObjValueVariant(
-                        member, group.getInterface(), group.getProperty());
-                    if (std::holds_alternative<int64_t>(value) ||
-                        std::holds_alternative<double>(value))
+                    // Where a group of int/doubles are greater than or
+                    // equal to the state(some value) provided, request an
+                    // increase of the configured delta times the difference
+                    // between the group member's value and configured state
+                    // value.
+                    if (value >= _state)
                     {
-                        // Where a group of int/doubles are greater than or
-                        // equal to the state(some value) provided, request an
-                        // increase of the configured delta times the difference
-                        // between the group member's value and configured state
-                        // value.
-                        if (value >= _state)
+                        uint64_t incDelta = 0;
+                        if (auto dblPtr = std::get_if<double>(&value))
                         {
-                            uint64_t incDelta = 0;
-                            if (auto dblPtr = std::get_if<double>(&value))
-                            {
-                                incDelta = static_cast<uint64_t>(
-                                    (*dblPtr - std::get<double>(_state)) *
-                                    _delta);
-                            }
-                            else
-                            {
-                                // Increase by at least a single delta
-                                // to attempt bringing under provided 'state'
-                                auto deltaFactor =
-                                    std::max((std::get<int64_t>(value) -
-                                              std::get<int64_t>(_state)),
-                                             int64_t(1));
-                                incDelta =
-                                    static_cast<uint64_t>(deltaFactor * _delta);
-                            }
-                            netDelta = std::max(netDelta, incDelta);
+                            incDelta = static_cast<uint64_t>(
+                                (*dblPtr - std::get<double>(_state)) * _delta);
                         }
-                    }
-                    else if (std::holds_alternative<bool>(value))
-                    {
-                        // Where a group of booleans equal the state(`true` or
-                        // `false`) provided, request an increase of the
-                        // configured delta
-                        if (_state == value)
+                        else
                         {
-                            netDelta = std::max(netDelta, _delta);
+                            // Increase by at least a single delta
+                            // to attempt bringing under provided 'state'
+                            auto deltaFactor =
+                                std::max((std::get<int64_t>(value) -
+                                          std::get<int64_t>(_state)),
+                                         int64_t(1));
+                            incDelta =
+                                static_cast<uint64_t>(deltaFactor * _delta);
                         }
-                    }
-                    else if (std::holds_alternative<std::string>(value))
-                    {
-                        // Where a group of strings equal the state(some string)
-                        // provided, request an increase of the configured delta
-                        if (_state == value)
-                        {
-                            netDelta = std::max(netDelta, _delta);
-                        }
-                    }
-                    else
-                    {
-                        // Unsupported group member type for this action
-                        log<level::ERR>(
-                            fmt::format(
-                                "Action {}: Unsupported group member type "
-                                "given. [object = {} : {} : {}]",
-                                ActionBase::getName(), member,
-                                group.getInterface(), group.getProperty())
-                                .c_str());
+                        netDelta = std::max(netDelta, incDelta);
                     }
                 }
-                catch (const std::out_of_range& oore)
+                else if (std::holds_alternative<bool>(value))
                 {
-                    // Property value not found, netDelta unchanged
+                    // Where a group of booleans equal the state(`true` or
+                    // `false`) provided, request an increase of the
+                    // configured delta
+                    if (_state == value)
+                    {
+                        netDelta = std::max(netDelta, _delta);
+                    }
                 }
-            });
+                else if (std::holds_alternative<std::string>(value))
+                {
+                    // Where a group of strings equal the state(some string)
+                    // provided, request an increase of the configured delta
+                    if (_state == value)
+                    {
+                        netDelta = std::max(netDelta, _delta);
+                    }
+                }
+                else
+                {
+                    // Unsupported group member type for this action
+                    log<level::ERR>(
+                        fmt::format("Action {}: Unsupported group member type "
+                                    "given. [object = {} : {} : {}]",
+                                    ActionBase::getName(), member,
+                                    group.getInterface(), group.getProperty())
+                            .c_str());
+                }
+            }
+            catch (const std::out_of_range& oore)
+            {
+                // Property value not found, netDelta unchanged
+            }
+        });
     }
     // Request increase to target
     zone.requestIncrease(netDelta);
diff --git a/control/json/actions/pcie_card_floors.cpp b/control/json/actions/pcie_card_floors.cpp
index 6c465f3..3d242d3 100644
--- a/control/json/actions/pcie_card_floors.cpp
+++ b/control/json/actions/pcie_card_floors.cpp
@@ -221,8 +221,8 @@
         auto deviceID = getPCIeDeviceProperty(card, deviceIDProp);
         auto vendorID = getPCIeDeviceProperty(card, vendorIDProp);
         auto subsystemID = getPCIeDeviceProperty(card, subsystemIDProp);
-        auto subsystemVendorID =
-            getPCIeDeviceProperty(card, subsystemVendorIDProp);
+        auto subsystemVendorID = getPCIeDeviceProperty(card,
+                                                       subsystemVendorIDProp);
 
         return _cardMetadata->lookup(deviceID, vendorID, subsystemID,
                                      subsystemVendorID);
@@ -251,10 +251,10 @@
 
     // Find the card that plugs in this slot based on if the
     // slot is part of the path, like slotA/cardA
-    auto it = std::find_if(
-        _pcieDevices.begin(), _pcieDevices.end(), [slotPath](const auto& path) {
-            return path.find(slotPath + '/') != std::string::npos;
-        });
+    auto it = std::find_if(_pcieDevices.begin(), _pcieDevices.end(),
+                           [slotPath](const auto& path) {
+        return path.find(slotPath + '/') != std::string::npos;
+    });
 
     if (it == _pcieDevices.end())
     {
diff --git a/control/json/actions/pcie_card_floors.hpp b/control/json/actions/pcie_card_floors.hpp
index a662a6d..081f409 100644
--- a/control/json/actions/pcie_card_floors.hpp
+++ b/control/json/actions/pcie_card_floors.hpp
@@ -106,8 +106,7 @@
      * to distinguish it from ones under different events and also it just
      * makes it uglier in the flight recorder.
      */
-    void setEventName(const std::string& /*name*/) override
-    {}
+    void setEventName(const std::string& /*name*/) override {}
 
   private:
     /**
diff --git a/control/json/actions/set_parameter_from_group_max.cpp b/control/json/actions/set_parameter_from_group_max.cpp
index c7d18a1..b42f582 100644
--- a/control/json/actions/set_parameter_from_group_max.cpp
+++ b/control/json/actions/set_parameter_from_group_max.cpp
@@ -64,19 +64,19 @@
                 bool invalid = false;
                 std::visit(
                     [&group, &invalid, this](auto&& val) {
-                        using V = std::decay_t<decltype(val)>;
-                        if constexpr (!std::is_same_v<double, V> &&
-                                      !std::is_same_v<int32_t, V> &&
-                                      !std::is_same_v<int64_t, V>)
-                        {
-                            log<level::ERR>(fmt::format("{}: Group {} has more "
-                                                        "than one member but "
-                                                        "isn't numeric",
-                                                        ActionBase::getName(),
-                                                        group.getName())
-                                                .c_str());
-                            invalid = true;
-                        }
+                    using V = std::decay_t<decltype(val)>;
+                    if constexpr (!std::is_same_v<double, V> &&
+                                  !std::is_same_v<int32_t, V> &&
+                                  !std::is_same_v<int64_t, V>)
+                    {
+                        log<level::ERR>(fmt::format("{}: Group {} has more "
+                                                    "than one member but "
+                                                    "isn't numeric",
+                                                    ActionBase::getName(),
+                                                    group.getName())
+                                            .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 ef19cdb..79cacf8 100644
--- a/control/json/actions/target_from_group_max.cpp
+++ b/control/json/actions/target_from_group_max.cpp
@@ -138,7 +138,6 @@
     {
         for (const auto& map : jsonObj.at("map"))
         {
-
             if (!map.contains("value") || !map.contains("target"))
             {
                 throw ActionParseError{ActionBase::getName(),
@@ -187,18 +186,18 @@
             // considered numeric here.
             std::visit(
                 [&group, &invalid, this](auto&& val) {
-                    using V = std::decay_t<decltype(val)>;
-                    if constexpr (!std::is_same_v<double, V> &&
-                                  !std::is_same_v<int32_t, V> &&
-                                  !std::is_same_v<int64_t, V>)
-                    {
-                        log<level::ERR>(fmt::format("{}: Group {}'s member "
-                                                    "isn't numeric",
-                                                    ActionBase::getName(),
-                                                    group.getName())
-                                            .c_str());
-                        invalid = true;
-                    }
+                using V = std::decay_t<decltype(val)>;
+                if constexpr (!std::is_same_v<double, V> &&
+                              !std::is_same_v<int32_t, V> &&
+                              !std::is_same_v<int64_t, V>)
+                {
+                    log<level::ERR>(fmt::format("{}: Group {}'s member "
+                                                "isn't numeric",
+                                                ActionBase::getName(),
+                                                group.getName())
+                                        .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 dd5f5ce..e3f3fec 100644
--- a/control/json/actions/timer_based_actions.cpp
+++ b/control/json/actions/timer_based_actions.cpp
@@ -43,10 +43,10 @@
 {
     // 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);
@@ -62,9 +62,8 @@
                 const auto& members = group.getMembers();
                 return std::any_of(members.begin(), members.end(),
                                    [&group](const auto& member) {
-                                       return !Manager::hasOwner(
-                                           member, group.getInterface());
-                                   });
+                return !Manager::hasOwner(member, group.getInterface());
+                });
             }))
         {
             startTimer();
@@ -80,18 +79,16 @@
         // If all group members have a given value and it matches what's
         // in the cache, start timer and if any do not match, stop
         // timer.
-        if (std::all_of(
-                _groups.begin(), _groups.end(), [&mgr](const auto& group) {
-                    const auto& members = group.getMembers();
-                    return std::all_of(members.begin(), members.end(),
-                                       [&mgr, &group](const auto& member) {
-                                           return group.getValue() ==
-                                                  mgr->getProperty(
-                                                      member,
-                                                      group.getInterface(),
-                                                      group.getProperty());
-                                       });
-                }))
+        if (std::all_of(_groups.begin(), _groups.end(),
+                        [&mgr](const auto& group) {
+            const auto& members = group.getMembers();
+            return std::all_of(members.begin(), members.end(),
+                               [&mgr, &group](const auto& member) {
+                return group.getValue() ==
+                       mgr->getProperty(member, group.getInterface(),
+                                        group.getProperty());
+            });
+            }))
         {
             // Timer will be started(and never stopped) when _groups is empty
             startTimer();
@@ -148,8 +145,8 @@
         // Add zone to _actions
         std::for_each(_actions.begin(), _actions.end(),
                       [&zone](std::unique_ptr<ActionBase>& action) {
-                          action->addZone(zone);
-                      });
+            action->addZone(zone);
+        });
     }
 }
 
diff --git a/control/json/dbus_zone.cpp b/control/json/dbus_zone.cpp
index 733fb94..6397151 100644
--- a/control/json/dbus_zone.cpp
+++ b/control/json/dbus_zone.cpp
@@ -50,11 +50,11 @@
     std::transform(value.begin(), value.end(), value.begin(), toupper);
 
     auto supported = ThermalModeIntf::supported();
-    auto isSupported =
-        std::any_of(supported.begin(), supported.end(), [&value](auto& s) {
-            std::transform(s.begin(), s.end(), s.begin(), toupper);
-            return value == s;
-        });
+    auto isSupported = std::any_of(supported.begin(), supported.end(),
+                                   [&value](auto& s) {
+        std::transform(s.begin(), s.end(), s.begin(), toupper);
+        return value == s;
+    });
 
     if (isSupported && value != current)
     {
diff --git a/control/json/event.cpp b/control/json/event.cpp
index 409006a..74f2ddf 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -158,9 +158,8 @@
                 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);
-                                         });
+                return Manager::inConfig(grp.first, eventProfile);
+            });
             if (grpEntry != availGroups.end())
             {
                 auto group = Group(*grpEntry->second);
@@ -190,13 +189,12 @@
             // against all zones matching the event's active profiles
             for (const auto& zone : _zones)
             {
-                configKey eventProfile =
-                    std::make_pair(zone.second->getName(), _profiles);
+                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);
-                                              });
+                    return Manager::inConfig(z.first, eventProfile);
+                });
                 if (zoneEntry != _zones.end())
                 {
                     actionZones.emplace_back(*zoneEntry->second);
@@ -213,9 +211,8 @@
                     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);
-                                              });
+                    return Manager::inConfig(z.first, eventProfile);
+                });
                 if (zoneEntry != _zones.end())
                 {
                     actionZones.emplace_back(*zoneEntry->second);
@@ -318,14 +315,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;
diff --git a/control/json/fan.cpp b/control/json/fan.cpp
index fdabea2..26b2174 100644
--- a/control/json/fan.cpp
+++ b/control/json/fan.cpp
@@ -144,9 +144,10 @@
 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)
     {
@@ -155,8 +156,8 @@
         // if additional locks, re-lock at next-highest target
         if (!_lockedTargets.empty())
         {
-            itr =
-                std::max_element(_lockedTargets.begin(), _lockedTargets.end());
+            itr = std::max_element(_lockedTargets.begin(),
+                                   _lockedTargets.end());
 
             // setTarget wont work if any locked targets exist
             decltype(_lockedTargets) temp;
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 8adc80c..fe5fc0d 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -168,12 +168,12 @@
         auto fans = getConfig<Fan>(false);
         for (auto& fan : fans)
         {
-            configKey fanProfile =
-                std::make_pair(fan.second->getZone(), fan.first.second);
-            auto itZone = std::find_if(
-                zones.begin(), zones.end(), [&fanProfile](const auto& zone) {
-                    return Manager::inConfig(fanProfile, zone.first);
-                });
+            configKey fanProfile = std::make_pair(fan.second->getZone(),
+                                                  fan.first.second);
+            auto itZone = std::find_if(zones.begin(), zones.end(),
+                                       [&fanProfile](const auto& zone) {
+                return Manager::inConfig(fanProfile, zone.first);
+            });
             if (itZone != zones.end())
             {
                 if (itZone->second->getTarget() != fan.second->getTarget() &&
@@ -271,21 +271,19 @@
     {
         // Profiles must have one match in the other's profiles(and they must be
         // an active profile) to be used in the config
-        return std::any_of(
-            input.second.begin(), input.second.end(),
-            [&comp](const auto& lProfile) {
-                return std::any_of(
-                    comp.second.begin(), comp.second.end(),
-                    [&lProfile](const auto& rProfile) {
-                        if (lProfile != rProfile)
-                        {
-                            return false;
-                        }
-                        auto activeProfs = getActiveProfiles();
-                        return std::find(activeProfs.begin(), activeProfs.end(),
-                                         lProfile) != activeProfs.end();
-                    });
+        return std::any_of(input.second.begin(), input.second.end(),
+                           [&comp](const auto& lProfile) {
+            return std::any_of(comp.second.begin(), comp.second.end(),
+                               [&lProfile](const auto& rProfile) {
+                if (lProfile != rProfile)
+                {
+                    return false;
+                }
+                auto activeProfs = getActiveProfiles();
+                return std::find(activeProfs.begin(), activeProfs.end(),
+                                 lProfile) != activeProfs.end();
             });
+        });
     }
 }
 
@@ -341,9 +339,10 @@
     // 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);
@@ -427,8 +426,8 @@
                 {
                     // Service not found in cache
                     auto intfs = {intf};
-                    pathIter->second[itServ.first] =
-                        std::make_pair(true, intfs);
+                    pathIter->second[itServ.first] = std::make_pair(true,
+                                                                    intfs);
                 }
             }
         }
@@ -680,11 +679,11 @@
 
                     // Look for the ObjectManager as an ancestor from the
                     // member.
-                    auto hasObjMgr = std::any_of(
-                        objMgrPaths.begin(), objMgrPaths.end(),
-                        [&member](const auto& path) {
-                            return member.find(path) != std::string::npos;
-                        });
+                    auto hasObjMgr = std::any_of(objMgrPaths.begin(),
+                                                 objMgrPaths.end(),
+                                                 [&member](const auto& path) {
+                        return member.find(path) != std::string::npos;
+                    });
 
                     if (!hasObjMgr)
                     {
@@ -745,12 +744,12 @@
     // Remove oneshot timers after they expired
     if (data.first == TimerType::oneshot)
     {
-        auto itTimer = std::find_if(
-            _timers.begin(), _timers.end(), [&data](const auto& timer) {
-                return (data.first == timer.first->first &&
-                        (std::get<std::string>(data.second) ==
-                         std::get<std::string>(timer.first->second)));
-            });
+        auto itTimer = std::find_if(_timers.begin(), _timers.end(),
+                                    [&data](const auto& timer) {
+            return (data.first == timer.first->first &&
+                    (std::get<std::string>(data.second) ==
+                     std::get<std::string>(timer.first->second)));
+        });
         if (itTimer != std::end(_timers))
         {
             _timers.erase(itTimer);
@@ -788,8 +787,8 @@
 void Manager::setProfiles()
 {
     // Profiles JSON config file is optional
-    auto confFile =
-        fan::JsonConfig::getConfFile(confAppName, Profile::confFileName, true);
+    auto confFile = fan::JsonConfig::getConfFile(confAppName,
+                                                 Profile::confFileName, true);
 
     _profiles.clear();
     if (!confFile.empty())
@@ -823,16 +822,16 @@
     {
         std::for_each(actions.begin(), actions.end(),
                       [&actList = it->second](auto& action) {
-                          actList.emplace_back(std::ref(action));
-                      });
+            actList.emplace_back(std::ref(action));
+        });
     }
     else
     {
         TriggerActions triggerActions;
         std::for_each(actions.begin(), actions.end(),
                       [&triggerActions](auto& action) {
-                          triggerActions.emplace_back(std::ref(action));
-                      });
+            triggerActions.emplace_back(std::ref(action));
+        });
         _parameterTriggers[name] = std::move(triggerActions);
     }
 }
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index c169919..ad92720 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -227,18 +227,16 @@
                     if (!profiles.empty() &&
                         !std::any_of(profiles.begin(), profiles.end(),
                                      [](const auto& name) {
-                                         return std::find(
-                                                    getActiveProfiles().begin(),
-                                                    getActiveProfiles().end(),
-                                                    name) !=
-                                                getActiveProfiles().end();
-                                     }))
+                        return std::find(getActiveProfiles().begin(),
+                                         getActiveProfiles().end(),
+                                         name) != getActiveProfiles().end();
+                        }))
                     {
                         continue;
                     }
                 }
-                auto obj =
-                    std::make_unique<T>(entry, std::forward<Args>(args)...);
+                auto obj = std::make_unique<T>(entry,
+                                               std::forward<Args>(args)...);
                 config.emplace(
                     std::make_pair(obj->getName(), obj->getProfiles()),
                     std::move(obj));
diff --git a/control/json/profile.cpp b/control/json/profile.cpp
index 0778820..7cb818b 100644
--- a/control/json/profile.cpp
+++ b/control/json/profile.cpp
@@ -60,11 +60,11 @@
     else
     {
         // Construct list of available methods
-        auto methods = std::accumulate(
-            std::next(_methods.begin()), _methods.end(),
-            _methods.begin()->first, [](auto list, auto method) {
-                return std::move(list) + ", " + method.first;
-            });
+        auto methods = std::accumulate(std::next(_methods.begin()),
+                                       _methods.end(), _methods.begin()->first,
+                                       [](auto list, auto method) {
+            return std::move(list) + ", " + method.first;
+        });
         log<level::ERR>("Configured method not available",
                         entry("JSON=%s", jsonObj["method"].dump().c_str()),
                         entry("METHODS_AVAILABLE=%s", methods.c_str()));
@@ -81,26 +81,23 @@
             "Missing required all_of method properties list");
     }
 
-    return std::all_of(
-        method["properties"].begin(), method["properties"].end(),
-        [](const json& obj) {
-            if (!obj.contains("path") || !obj.contains("interface") ||
-                !obj.contains("property") || !obj.contains("value"))
-            {
-                log<level::ERR>(
-                    "Missing required all_of method property parameters",
-                    entry("JSON=%s", obj.dump().c_str()));
-                throw std::runtime_error(
-                    "Missing required all_of method parameters");
-            }
-            auto variant =
-                util::SDBusPlus::getPropertyVariant<PropertyVariantType>(
-                    obj["path"].get<std::string>(),
-                    obj["interface"].get<std::string>(),
-                    obj["property"].get<std::string>());
+    return std::all_of(method["properties"].begin(), method["properties"].end(),
+                       [](const json& obj) {
+        if (!obj.contains("path") || !obj.contains("interface") ||
+            !obj.contains("property") || !obj.contains("value"))
+        {
+            log<level::ERR>(
+                "Missing required all_of method property parameters",
+                entry("JSON=%s", obj.dump().c_str()));
+            throw std::runtime_error(
+                "Missing required all_of method parameters");
+        }
+        auto variant = util::SDBusPlus::getPropertyVariant<PropertyVariantType>(
+            obj["path"].get<std::string>(), obj["interface"].get<std::string>(),
+            obj["property"].get<std::string>());
 
-            return getJsonValue(obj["value"]) == variant;
-        });
+        return getJsonValue(obj["value"]) == variant;
+    });
 }
 
 } // namespace phosphor::fan::control::json
diff --git a/control/json/triggers/handlers.hpp b/control/json/triggers/handlers.hpp
index 34271c2..8e8595f 100644
--- a/control/json/triggers/handlers.hpp
+++ b/control/json/triggers/handlers.hpp
@@ -16,7 +16,6 @@
 
 struct Handlers
 {
-
   public:
     /**
      * @brief Processes a properties changed signal and updates the property's
@@ -113,8 +112,8 @@
 
         std::vector<std::string> intfs;
         msg.read(intfs);
-        auto itIntf =
-            std::find(intfs.begin(), intfs.end(), std::get<Intf>(obj));
+        auto itIntf = std::find(intfs.begin(), intfs.end(),
+                                std::get<Intf>(obj));
         if (itIntf == intfs.cend())
         {
             // Object's interface not in list of interfaces removed
diff --git a/control/json/triggers/init.cpp b/control/json/triggers/init.cpp
index 7452584..f51a09e 100644
--- a/control/json/triggers/init.cpp
+++ b/control/json/triggers/init.cpp
@@ -160,11 +160,12 @@
         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) {
-                    return std::move(list) + ", " + method.first;
-                });
+            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 =
                 fmt::format("Event '{}' requires a supported method given to "
                             "be init driven, available methods: {}",
diff --git a/control/json/triggers/signal.cpp b/control/json/triggers/signal.cpp
index 5cef58d..7169d69 100644
--- a/control/json/triggers/signal.cpp
+++ b/control/json/triggers/signal.cpp
@@ -101,8 +101,8 @@
     {
         // Setup property changed signal handler on the group member's
         // property
-        const auto match =
-            rules::propertiesChanged(member, group.getInterface());
+        const auto match = rules::propertiesChanged(member,
+                                                    group.getInterface());
         SignalPkg signalPkg = {Handlers::propertiesChanged,
                                SignalObject(std::cref(member),
                                             std::cref(group.getInterface()),
@@ -125,8 +125,8 @@
     for (const auto& member : group.getMembers())
     {
         // Setup interfaces added signal handler on the group member
-        const auto match =
-            rules::interfacesAdded() + rules::argNpath(0, member);
+        const auto match = rules::interfacesAdded() +
+                           rules::argNpath(0, member);
         SignalPkg signalPkg = {Handlers::interfacesAdded,
                                SignalObject(std::cref(member),
                                             std::cref(group.getInterface()),
@@ -149,8 +149,8 @@
     for (const auto& member : group.getMembers())
     {
         // Setup interfaces removed signal handler on the group member
-        const auto match =
-            rules::interfacesRemoved() + rules::argNpath(0, member);
+        const auto match = rules::interfacesRemoved() +
+                           rules::argNpath(0, member);
         SignalPkg signalPkg = {Handlers::interfacesRemoved,
                                SignalObject(std::cref(member),
                                             std::cref(group.getInterface()),
@@ -250,11 +250,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) {
-                                return std::move(list) + ", " + signal.first;
-                            });
+        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 =
             fmt::format("Event '{}' requires a supported signal given to be "
                         "triggered by signal, available signals: {}",
@@ -270,8 +270,8 @@
         TriggerActions signalActions;
         std::for_each(actions.begin(), actions.end(),
                       [&signalActions](auto& action) {
-                          signalActions.emplace_back(std::ref(action));
-                      });
+            signalActions.emplace_back(std::ref(action));
+        });
         for (const auto& group : groups)
         {
             // Call signal subscriber for each group
diff --git a/control/json/utils/flight_recorder.cpp b/control/json/utils/flight_recorder.cpp
index 71d4afd..8c8ce06 100644
--- a/control/json/utils/flight_recorder.cpp
+++ b/control/json/utils/flight_recorder.cpp
@@ -71,8 +71,8 @@
 
     std::sort(output.begin(), output.end(),
               [](const auto& left, const auto& right) {
-                  return std::get<Timepoint>(left) < std::get<Timepoint>(right);
-              });
+        return std::get<Timepoint>(left) < std::get<Timepoint>(right);
+    });
 
     auto formatTime = [](const Timepoint& tp) {
         std::stringstream ss;
diff --git a/control/json/utils/pcie_card_metadata.cpp b/control/json/utils/pcie_card_metadata.cpp
index 8e65c7c..6fd8fd1 100644
--- a/control/json/utils/pcie_card_metadata.cpp
+++ b/control/json/utils/pcie_card_metadata.cpp
@@ -119,10 +119,10 @@
         }
 
         Metadata data;
-        data.vendorID =
-            std::stoul(card.at("vendor_id").get<std::string>(), nullptr, 16);
-        data.deviceID =
-            std::stoul(card.at("device_id").get<std::string>(), nullptr, 16);
+        data.vendorID = std::stoul(card.at("vendor_id").get<std::string>(),
+                                   nullptr, 16);
+        data.deviceID = std::stoul(card.at("device_id").get<std::string>(),
+                                   nullptr, 16);
         data.subsystemVendorID = std::stoul(
             card.at("subsystem_vendor_id").get<std::string>(), nullptr, 16);
         data.subsystemID =
@@ -172,15 +172,13 @@
     log<level::DEBUG>(fmt::format("Lookup {:#x} ${:#x} {:#x} {:#x}", deviceID,
                                   vendorID, subsystemID, subsystemVendorID)
                           .c_str());
-    auto card =
-        std::find_if(_cards.begin(), _cards.end(),
-                     [&deviceID, &vendorID, &subsystemID,
-                      &subsystemVendorID](const auto& card) {
-                         return (deviceID == card.deviceID) &&
-                                (vendorID == card.vendorID) &&
-                                (subsystemID == card.subsystemID) &&
-                                (subsystemVendorID == card.subsystemVendorID);
-                     });
+    auto card = std::find_if(_cards.begin(), _cards.end(),
+                             [&deviceID, &vendorID, &subsystemID,
+                              &subsystemVendorID](const auto& card) {
+        return (deviceID == card.deviceID) && (vendorID == card.vendorID) &&
+               (subsystemID == card.subsystemID) &&
+               (subsystemVendorID == card.subsystemVendorID);
+    });
 
     if (card != _cards.end())
     {
diff --git a/control/json/zone.cpp b/control/json/zone.cpp
index ea308b7..2e31465 100644
--- a/control/json/zone.cpp
+++ b/control/json/zone.cpp
@@ -161,10 +161,10 @@
 
 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 +181,10 @@
 
 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)
     {
@@ -232,8 +232,8 @@
 
     auto itHoldMax = std::max_element(_targetHolds.begin(), _targetHolds.end(),
                                       [](const auto& aHold, const auto& bHold) {
-                                          return aHold.second < bHold.second;
-                                      });
+        return aHold.second < bHold.second;
+    });
     if (itHoldMax == _targetHolds.end())
     {
         _isActive = true;
@@ -295,8 +295,8 @@
 
     auto itHoldMax = std::max_element(_floorHolds.begin(), _floorHolds.end(),
                                       [](const auto& aHold, const auto& bHold) {
-                                          return aHold.second < bHold.second;
-                                      });
+        return aHold.second < bHold.second;
+    });
     if (itHoldMax == _floorHolds.end())
     {
         if (_floor != _defaultFloor)
@@ -380,7 +380,7 @@
 void Zone::decTimerExpired()
 {
     // Check all entries are set to allow a decrease
-    auto pred = [](auto const& entry) { return entry.second; };
+    auto pred = [](const auto& entry) { return entry.second; };
     auto decAllowed = std::all_of(_decAllowed.begin(), _decAllowed.end(), pred);
 
     // Only decrease targets when allowed, a requested decrease target delta
@@ -460,11 +460,12 @@
         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) {
-                    return std::move(list) + ", " + intf.first;
-                });
+            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",
                             entry("JSON=%s", interface.dump().c_str()),
                             entry("AVAILABLE_INTFS=%s", intfs.c_str()));
@@ -498,7 +499,7 @@
                     std::next(propFuncs->second.begin()),
                     propFuncs->second.end(), propFuncs->second.begin()->first,
                     [](auto list, auto prop) {
-                        return std::move(list) + ", " + prop.first;
+                    return std::move(list) + ", " + prop.first;
                     });
                 log<level::ERR>("Configured property not available",
                                 entry("JSON=%s", property.dump().c_str()),
diff --git a/control/manager.cpp b/control/manager.cpp
index db8dbea..43e500e 100644
--- a/control/manager.cpp
+++ b/control/manager.cpp
@@ -97,8 +97,8 @@
 
         if (std::all_of(conditions.begin(), conditions.end(),
                         [&bus](const auto& condition) {
-                            return checkCondition(bus, condition);
-                        }))
+            return checkCondition(bus, condition);
+            }))
         {
             // Create a Zone object for each zone in this group
             auto& zones = std::get<zoneListPos>(group);
diff --git a/control/preconditions.cpp b/control/preconditions.cpp
index 09284a8..842c178 100644
--- a/control/preconditions.cpp
+++ b/control/preconditions.cpp
@@ -23,22 +23,21 @@
 {
     return [pg = std::move(pg), sse = std::move(sse)](auto& zone, auto& group) {
         // Compare given precondition entries
-        auto precondState =
-            std::all_of(pg.begin(), pg.end(), [&zone](auto const& entry) {
-                try
-                {
-                    return zone.getPropValueVariant(
-                               std::get<pcPathPos>(entry),
-                               std::get<pcIntfPos>(entry),
-                               std::get<pcPropPos>(entry)) ==
-                           std::get<pcValuePos>(entry);
-                }
-                catch (const std::out_of_range& oore)
-                {
-                    // Default to property variants not equal when not found
-                    return false;
-                }
-            });
+        auto precondState = std::all_of(pg.begin(), pg.end(),
+                                        [&zone](auto const& entry) {
+            try
+            {
+                return zone.getPropValueVariant(std::get<pcPathPos>(entry),
+                                                std::get<pcIntfPos>(entry),
+                                                std::get<pcPropPos>(entry)) ==
+                       std::get<pcValuePos>(entry);
+            }
+            catch (const std::out_of_range& oore)
+            {
+                // Default to property variants not equal when not found
+                return false;
+            }
+        });
 
         if (precondState)
         {
@@ -72,10 +71,10 @@
         // Set/update the services of the group
         zone.setServices(&group);
         const auto& services = zone.getGroupServices(&group);
-        auto precondState =
-            std::any_of(services.begin(), services.end(), [](const auto& s) {
-                return !std::get<hasOwnerPos>(s);
-            });
+        auto precondState = std::any_of(services.begin(), services.end(),
+                                        [](const auto& s) {
+            return !std::get<hasOwnerPos>(s);
+        });
 
         if (precondState)
         {
diff --git a/control/triggers.cpp b/control/triggers.cpp
index 362f4b6..eb2580f 100644
--- a/control/triggers.cpp
+++ b/control/triggers.cpp
@@ -13,11 +13,12 @@
 
 Trigger timer(TimerConf&& tConf)
 {
-    return [tConf = std::move(tConf)](
-               control::Zone& zone, const std::string& name, const Group& group,
-               const std::vector<Action>& actions) {
+    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)
@@ -74,9 +75,10 @@
         }
 
         // Run action functions for initial event state
-        std::for_each(
-            actions.begin(), actions.end(),
-            [&zone, &group](auto const& action) { action(zone, group); });
+        std::for_each(actions.begin(), actions.end(),
+                      [&zone, &group](auto const& action) {
+            action(zone, group);
+        });
     };
 }
 
diff --git a/control/zone.cpp b/control/zone.cpp
index 6e95477..46e1f08 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -132,7 +132,7 @@
     else
     {
         // Check all entries are set to allow control active
-        auto actPred = [](auto const& entry) { return entry.second; };
+        auto actPred = [](const auto& entry) { return entry.second; };
         _isActive = std::all_of(_active.begin(), _active.end(), actPred);
     }
 }
@@ -143,9 +143,9 @@
     {
         auto& sNames = _services.at(*group);
         auto it = std::find_if(sNames.begin(), sNames.end(),
-                               [&name](auto const& entry) {
-                                   return name == std::get<namePos>(entry);
-                               });
+                               [&name](const auto& entry) {
+            return name == std::get<namePos>(entry);
+        });
         if (it != std::end(sNames))
         {
             // Remove service name from group
@@ -165,9 +165,9 @@
     {
         auto& sNames = _services.at(*group);
         auto it = std::find_if(sNames.begin(), sNames.end(),
-                               [&name](auto const& entry) {
-                                   return name == std::get<namePos>(entry);
-                               });
+                               [&name](const auto& entry) {
+            return name == std::get<namePos>(entry);
+        });
         if (it != std::end(sNames))
         {
             std::get<hasOwnerPos>(*it) = hasOwner;
@@ -210,7 +210,7 @@
 void Zone::setFloor(uint64_t speed)
 {
     // Check all entries are set to allow floor to be set
-    auto pred = [](auto const& entry) { return entry.second; };
+    auto pred = [](const auto& entry) { return entry.second; };
     auto setFloor = std::all_of(_floorChange.begin(), _floorChange.end(), pred);
     if (setFloor)
     {
@@ -262,7 +262,7 @@
 void Zone::decTimerExpired()
 {
     // Check all entries are set to allow a decrease
-    auto pred = [](auto const& entry) { return entry.second; };
+    auto pred = [](const auto& entry) { return entry.second; };
     auto decAllowed = std::all_of(_decAllowed.begin(), _decAllowed.end(), pred);
 
     // Only decrease speeds when allowed,
@@ -299,36 +299,35 @@
 void Zone::initEvent(const SetSpeedEvent& event)
 {
     // Enable event triggers
-    std::for_each(
-        std::get<triggerPos>(event).begin(), std::get<triggerPos>(event).end(),
-        [this, &event](auto const& trigger) {
-            if (!std::get<actionsPos>(event).empty())
-            {
-                std::for_each(
-                    std::get<actionsPos>(event).begin(),
-                    std::get<actionsPos>(event).end(),
-                    [this, &trigger, &event](auto const& action) {
-                        // Default to use group defined with action if exists
-                        if (!std::get<adGroupPos>(action).empty())
-                        {
-                            trigger(*this, std::get<sseNamePos>(event),
-                                    std::get<adGroupPos>(action),
-                                    std::get<adActionsPos>(action));
-                        }
-                        else
-                        {
-                            trigger(*this, std::get<sseNamePos>(event),
-                                    std::get<groupPos>(event),
-                                    std::get<adActionsPos>(action));
-                        }
-                    });
-            }
-            else
-            {
-                trigger(*this, std::get<sseNamePos>(event),
-                        std::get<groupPos>(event), {});
-            }
-        });
+    std::for_each(std::get<triggerPos>(event).begin(),
+                  std::get<triggerPos>(event).end(),
+                  [this, &event](const auto& trigger) {
+        if (!std::get<actionsPos>(event).empty())
+        {
+            std::for_each(std::get<actionsPos>(event).begin(),
+                          std::get<actionsPos>(event).end(),
+                          [this, &trigger, &event](auto const& action) {
+                // Default to use group defined with action if exists
+                if (!std::get<adGroupPos>(action).empty())
+                {
+                    trigger(*this, std::get<sseNamePos>(event),
+                            std::get<adGroupPos>(action),
+                            std::get<adActionsPos>(action));
+                }
+                else
+                {
+                    trigger(*this, std::get<sseNamePos>(event),
+                            std::get<groupPos>(event),
+                            std::get<adActionsPos>(action));
+                }
+            });
+        }
+        else
+        {
+            trigger(*this, std::get<sseNamePos>(event),
+                    std::get<groupPos>(event), {});
+        }
+    });
 }
 
 void Zone::removeEvent(const SetSpeedEvent& event)
@@ -367,7 +366,7 @@
         {
             // TODO openbmc/openbmc#2328 - Use the action function target
             // for comparison
-            auto actsEqual = [](auto const& a1, auto const& a2) {
+            auto actsEqual = [](const auto& a1, const auto& a2) {
                 return a1.target_type().name() == a2.target_type().name();
             };
             if (std::equal(eventActions.begin(), eventActions.end(),
@@ -410,9 +409,10 @@
                         const std::vector<Action>& eventActions)
 {
     // Perform the actions
-    std::for_each(
-        eventActions.begin(), eventActions.end(),
-        [this, &eventGroup](auto const& action) { action(*this, eventGroup); });
+    std::for_each(eventActions.begin(), eventActions.end(),
+                  [this, &eventGroup](const auto& action) {
+        action(*this, eventGroup);
+    });
 }
 
 void Zone::handleEvent(sdbusplus::message_t& msg, const EventData* eventData)
@@ -422,9 +422,9 @@
     // Perform the actions
     std::for_each(std::get<eventActionsPos>(*eventData).begin(),
                   std::get<eventActionsPos>(*eventData).end(),
-                  [this, &eventData](auto const& action) {
-                      action(*this, std::get<eventGroupPos>(*eventData));
-                  });
+                  [this, &eventData](const auto& action) {
+        action(*this, std::get<eventGroupPos>(*eventData));
+    });
 }
 
 const std::string& Zone::getService(const std::string& path,
@@ -436,9 +436,10 @@
     {
         for (auto& serv : srvIter->second)
         {
-            auto it = std::find_if(
-                serv.second.begin(), serv.second.end(),
-                [&intf](auto const& interface) { return intf == interface; });
+            auto it = std::find_if(serv.second.begin(), serv.second.end(),
+                                   [&intf](const auto& interface) {
+                return intf == interface;
+            });
             if (it != std::end(serv.second))
             {
                 // Service found
@@ -534,11 +535,11 @@
     std::transform(value.begin(), value.end(), value.begin(), toupper);
 
     auto supported = ThermalObject::supported();
-    auto isSupported =
-        std::any_of(supported.begin(), supported.end(), [&value](auto& s) {
-            std::transform(s.begin(), s.end(), s.begin(), toupper);
-            return value == s;
-        });
+    auto isSupported = std::any_of(supported.begin(), supported.end(),
+                                   [&value](auto& s) {
+        std::transform(s.begin(), s.end(), s.begin(), toupper);
+        return value == s;
+    });
 
     if (value != current && isSupported)
     {
diff --git a/control/zone.hpp b/control/zone.hpp
index 3decb32..183bd78 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -241,23 +241,23 @@
             std::optional<T> value;
             std::visit(
                 [&value](auto&& val) {
-                    // If the type configured is int64, but the sensor value
-                    // property's type is double, scale it by 1000 and return
-                    // the value as an int64 as configured.
-                    using V = std::decay_t<decltype(val)>;
-                    if constexpr (std::is_same_v<T, int64_t> &&
-                                  std::is_same_v<V, double>)
-                    {
-                        val = val * 1000;
-                        value = std::lround(val);
-                    }
-                    // If the type configured matches the sensor value
-                    // property's type, just return the value as its
-                    // given type.
-                    else if constexpr (std::is_same_v<T, V>)
-                    {
-                        value = val;
-                    }
+                // If the type configured is int64, but the sensor value
+                // property's type is double, scale it by 1000 and return
+                // the value as an int64 as configured.
+                using V = std::decay_t<decltype(val)>;
+                if constexpr (std::is_same_v<T, int64_t> &&
+                              std::is_same_v<V, double>)
+                {
+                    val = val * 1000;
+                    value = std::lround(val);
+                }
+                // If the type configured matches the sensor value
+                // property's type, just return the value as its
+                // given type.
+                else if constexpr (std::is_same_v<T, V>)
+                {
+                    value = val;
+                }
                 },
                 variant);
 
@@ -628,11 +628,11 @@
                     // type(T) is available on this interface and read it
                     std::visit(
                         [&value](auto&& val) {
-                            using V = std::decay_t<decltype(val)>;
-                            if constexpr (std::is_same_v<T, V>)
-                            {
-                                value = val;
-                            }
+                        using V = std::decay_t<decltype(val)>;
+                        if constexpr (std::is_same_v<T, V>)
+                        {
+                            value = val;
+                        }
                         },
                         var);
 
diff --git a/cooling-type/cooling_type.cpp b/cooling-type/cooling_type.cpp
index 5290774..c82dbe0 100644
--- a/cooling-type/cooling_type.cpp
+++ b/cooling-type/cooling_type.cpp
@@ -64,8 +64,8 @@
     auto gpioDev = evdevOpen(gpioFd());
 
     int value = 0;
-    auto fetch_rc =
-        libevdev_fetch_event_value(gpioDev.get(), EV_KEY, keycode, &value);
+    auto fetch_rc = libevdev_fetch_event_value(gpioDev.get(), EV_KEY, keycode,
+                                               &value);
     if (0 == fetch_rc)
     {
         log<level::ERR>(
diff --git a/evdevpp/evdev.hpp b/evdevpp/evdev.hpp
index ae9a370..543729c 100644
--- a/evdevpp/evdev.hpp
+++ b/evdevpp/evdev.hpp
@@ -65,8 +65,7 @@
     ~EvDev() = default;
 
     /** @brief Conversion constructor from evdev. */
-    explicit EvDev(EvDevPtr ptr) : evdev(ptr)
-    {}
+    explicit EvDev(EvDevPtr ptr) : evdev(ptr) {}
 
     /** @brief Get the current event state. */
     auto fetch(unsigned int type, unsigned int code)
diff --git a/json_config.hpp b/json_config.hpp
index 5102ca9..b12cdb9 100644
--- a/json_config.hpp
+++ b/json_config.hpp
@@ -236,11 +236,11 @@
 
         // Look for a config file at each entry relative to the base
         // path and use the first one found
-        auto it = std::find_if(
-            _confCompatValues.begin(), _confCompatValues.end(),
-            [&confFile, &appName, &fileName](const auto& value) {
-                confFile = fs::path{confBasePath} / appName / value / fileName;
-                return fs::exists(confFile);
+        auto it =
+            std::find_if(_confCompatValues.begin(), _confCompatValues.end(),
+                         [&confFile, &appName, &fileName](const auto& value) {
+            confFile = fs::path{confBasePath} / appName / value / fileName;
+            return fs::exists(confFile);
             });
         if (it == _confCompatValues.end())
         {
diff --git a/monitor/conditions.cpp b/monitor/conditions.cpp
index 62e272c..35fb7a3 100644
--- a/monitor/conditions.cpp
+++ b/monitor/conditions.cpp
@@ -23,13 +23,13 @@
 Condition propertiesMatch(std::vector<PropertyState>&& propStates)
 {
     return [pStates = std::move(propStates)](sdbusplus::bus_t& bus) {
-        return std::all_of(
-            pStates.begin(), pStates.end(), [&bus](const auto& p) {
-                return util::SDBusPlus::getPropertyVariant<PropertyValue>(
-                           bus, std::get<propObj>(p.first),
-                           std::get<propIface>(p.first),
-                           std::get<propName>(p.first)) == p.second;
-            });
+        return std::all_of(pStates.begin(), pStates.end(),
+                           [&bus](const auto& p) {
+            return util::SDBusPlus::getPropertyVariant<PropertyValue>(
+                       bus, std::get<propObj>(p.first),
+                       std::get<propIface>(p.first),
+                       std::get<propName>(p.first)) == p.second;
+        });
     };
 }
 
diff --git a/monitor/fan_error.cpp b/monitor/fan_error.cpp
index f6aa0e6..f0a6f32 100644
--- a/monitor/fan_error.cpp
+++ b/monitor/fan_error.cpp
@@ -56,8 +56,7 @@
     JournalCloser& operator=(const JournalCloser&) = delete;
     JournalCloser& operator=(JournalCloser&&) = delete;
 
-    explicit JournalCloser(sd_journal* journal) : journal{journal}
-    {}
+    explicit JournalCloser(sd_journal* journal) : journal{journal} {}
 
     ~JournalCloser()
     {
diff --git a/monitor/json_parser.cpp b/monitor/json_parser.cpp
index e3d23d9..6714984 100644
--- a/monitor/json_parser.cpp
+++ b/monitor/json_parser.cpp
@@ -473,8 +473,8 @@
     }
     else
     {
-        auto msg =
-            fmt::format("Invalid 'type' entry {} in power off config", type);
+        auto msg = fmt::format("Invalid 'type' entry {} in power off config",
+                               type);
         log<level::ERR>(msg.c_str());
         throw std::runtime_error(msg.c_str());
     }
diff --git a/monitor/power_off_cause.hpp b/monitor/power_off_cause.hpp
index f40e1fe..63b0cfd 100644
--- a/monitor/power_off_cause.hpp
+++ b/monitor/power_off_cause.hpp
@@ -109,10 +109,10 @@
      */
     bool satisfied(const FanHealth& fanHealth) override
     {
-        size_t count = std::count_if(
-            fanHealth.begin(), fanHealth.end(), [](const auto& fan) {
-                return !std::get<presentHealthPos>(fan.second);
-            });
+        size_t count = std::count_if(fanHealth.begin(), fanHealth.end(),
+                                     [](const auto& fan) {
+            return !std::get<presentHealthPos>(fan.second);
+        });
 
         return count >= _count;
     }
@@ -152,15 +152,13 @@
      */
     bool satisfied(const FanHealth& fanHealth) override
     {
-        size_t count = std::accumulate(
-            fanHealth.begin(), fanHealth.end(), 0,
-            [](int sum, const auto& fan) {
-                const auto& tachs = std::get<sensorFuncHealthPos>(fan.second);
-                auto nonFuncTachs =
-                    std::count_if(tachs.begin(), tachs.end(),
-                                  [](bool tach) { return !tach; });
-                return sum + nonFuncTachs;
-            });
+        size_t count = std::accumulate(fanHealth.begin(), fanHealth.end(), 0,
+                                       [](int sum, const auto& fan) {
+            const auto& tachs = std::get<sensorFuncHealthPos>(fan.second);
+            auto nonFuncTachs = std::count_if(tachs.begin(), tachs.end(),
+                                              [](bool tach) { return !tach; });
+            return sum + nonFuncTachs;
+        });
 
         return count >= _count;
     }
diff --git a/monitor/system.cpp b/monitor/system.cpp
index 40cca00..0fc2c44 100644
--- a/monitor/system.cpp
+++ b/monitor/system.cpp
@@ -120,8 +120,8 @@
         // off here.
         std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
                       [this](auto& rule) {
-                          rule->check(PowerRuleState::runtime, _fanHealth);
-                      });
+            rule->check(PowerRuleState::runtime, _fanHealth);
+        });
     }
 
     subscribeSensorsToServices();
@@ -292,7 +292,7 @@
 // to new state
 //
 void System::tachSignalOffline(sdbusplus::message_t& msg,
-                               SensorMapType const& sensorMap)
+                               const SensorMapType& sensorMap)
 {
     std::string serviceName, oldOwner, newOwner;
 
@@ -329,8 +329,8 @@
         sensorStatus.push_back(sensor->functional());
     }
 
-    _fanHealth[fan.getName()] =
-        std::make_tuple(fan.present(), std::move(sensorStatus));
+    _fanHealth[fan.getName()] = std::make_tuple(fan.present(),
+                                                std::move(sensorStatus));
 }
 
 void System::fanStatusChange(const Fan& fan, bool skipRulesCheck)
@@ -341,8 +341,8 @@
     {
         std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
                       [this](auto& rule) {
-                          rule->check(PowerRuleState::runtime, _fanHealth);
-                      });
+            rule->check(PowerRuleState::runtime, _fanHealth);
+        });
     }
 }
 
@@ -385,8 +385,8 @@
             sleep(DELAY_HOST_CONTROL);
             std::for_each(_fans.begin(), _fans.end(),
                           [powerStateOn](auto& fan) {
-                              fan->powerStateChanged(powerStateOn);
-                          });
+                fan->powerStateChanged(powerStateOn);
+            });
             if (std::all_of(_fans.begin(), _fans.end(), [](const auto& fan) {
                     return fan->numSensorsOnDBusAtPowerOn() == 0;
                 }))
@@ -407,12 +407,12 @@
 
         std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
                       [this](auto& rule) {
-                          rule->check(PowerRuleState::atPgood, _fanHealth);
-                      });
+            rule->check(PowerRuleState::atPgood, _fanHealth);
+        });
         std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
                       [this](auto& rule) {
-                          rule->check(PowerRuleState::runtime, _fanHealth);
-                      });
+            rule->check(PowerRuleState::runtime, _fanHealth);
+        });
     }
     else
     {
diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp
index f5a7238..9e05009 100644
--- a/monitor/tach_sensor.cpp
+++ b/monitor/tach_sensor.cpp
@@ -61,8 +61,8 @@
 {
     try
     {
-        value =
-            util::SDBusPlus::getProperty<T>(bus, path, interface, propertyName);
+        value = util::SDBusPlus::getProperty<T>(bus, path, interface,
+                                                propertyName);
     }
     catch (const std::exception& e)
     {
diff --git a/monitor/trust_group.hpp b/monitor/trust_group.hpp
index 53ed610..e2cb269 100644
--- a/monitor/trust_group.hpp
+++ b/monitor/trust_group.hpp
@@ -55,8 +55,7 @@
      *
      * @param[in] names - the names and inclusion of sensors in the group
      */
-    explicit Group(const std::vector<GroupDefinition>& names) : _names(names)
-    {}
+    explicit Group(const std::vector<GroupDefinition>& names) : _names(names) {}
 
     /**
      * Used to register a TachSensor object with the group.
@@ -67,11 +66,11 @@
      */
     void registerSensor(std::shared_ptr<monitor::TachSensor>& sensor)
     {
-        auto found = std::find_if(
-            _names.begin(), _names.end(), [&sensor](const auto& name) {
-                return monitor::FAN_SENSOR_PATH + std::get<sensorName>(name) ==
-                       sensor->name();
-            });
+        auto found = std::find_if(_names.begin(), _names.end(),
+                                  [&sensor](const auto& name) {
+            return monitor::FAN_SENSOR_PATH + std::get<sensorName>(name) ==
+                   sensor->name();
+        });
 
         if (found != _names.end())
         {
@@ -91,8 +90,8 @@
     {
         return (std::find_if(_sensors.begin(), _sensors.end(),
                              [&sensor](const auto& s) {
-                                 return sensor.name() == s.sensor->name();
-                             }) != _sensors.end());
+            return sensor.name() == s.sensor->name();
+                }) != _sensors.end());
     }
 
     /**
diff --git a/power_state.hpp b/power_state.hpp
index 1b1d419..24b6c9d 100644
--- a/power_state.hpp
+++ b/power_state.hpp
@@ -57,8 +57,7 @@
      *
      * Callbacks can be added with addCallback().
      */
-    PowerState() : _bus(util::SDBusPlus::getBus())
-    {}
+    PowerState() : _bus(util::SDBusPlus::getBus()) {}
 
     /**
      * @brief Adds a function to call when the power state changes
@@ -324,7 +323,6 @@
      */
     void readHostState()
     {
-
         std::string hostStatePath;
         std::string hostStateService;
         std::string hostService = "xyz.openbmc_project.State.Host";
diff --git a/presence/anyof.cpp b/presence/anyof.cpp
index 54a0ec0..6b9403a 100644
--- a/presence/anyof.cpp
+++ b/presence/anyof.cpp
@@ -62,10 +62,10 @@
 void AnyOf::stateChanged(bool present, PresenceSensor& sensor)
 {
     // Find the sensor that changed state.
-    auto sit =
-        std::find_if(state.begin(), state.end(), [&sensor](const auto& s) {
-            return std::get<sensorPos>(s).get() == sensor;
-        });
+    auto sit = std::find_if(state.begin(), state.end(),
+                            [&sensor](const auto& s) {
+        return std::get<sensorPos>(s).get() == sensor;
+    });
     if (sit != state.end())
     {
         auto origState =
diff --git a/presence/error_reporter.cpp b/presence/error_reporter.cpp
index 6210f7d..1b46bdf 100644
--- a/presence/error_reporter.cpp
+++ b/presence/error_reporter.cpp
@@ -200,9 +200,10 @@
     if (powerState)
     {
         // If there are fans already missing, log it.
-        auto missing = std::count_if(
-            _fanStates.begin(), _fanStates.end(),
-            [](const auto& fanState) { return fanState.second == false; });
+        auto missing = std::count_if(_fanStates.begin(), _fanStates.end(),
+                                     [](const auto& fanState) {
+            return fanState.second == false;
+        });
 
         if (missing)
         {
@@ -211,9 +212,10 @@
         }
     }
 
-    std::for_each(
-        _fanStates.begin(), _fanStates.end(),
-        [this](const auto& fanState) { this->checkFan(fanState.first); });
+    std::for_each(_fanStates.begin(), _fanStates.end(),
+                  [this](const auto& fanState) {
+        this->checkFan(fanState.first);
+    });
 }
 
 } // namespace phosphor::fan::presence
diff --git a/presence/gpio.hpp b/presence/gpio.hpp
index fc650ca..ecd31a8 100644
--- a/presence/gpio.hpp
+++ b/presence/gpio.hpp
@@ -141,8 +141,7 @@
      *
      * Required to conform to interface
      */
-    void stop() override
-    {}
+    void stop() override {}
 
     /**
      * @brief Check the sensor.
@@ -159,8 +158,7 @@
      *
      * @param[in] fanInventoryPath - The fan inventory D-Bus object path.
      */
-    void logConflict(const std::string& /*fanInventoryPath*/) const override
-    {}
+    void logConflict(const std::string& /*fanInventoryPath*/) const override {}
 
   private:
     /**
diff --git a/presence/json_parser.cpp b/presence/json_parser.cpp
index dbdc54b..5de827d 100644
--- a/presence/json_parser.cpp
+++ b/presence/json_parser.cpp
@@ -52,8 +52,7 @@
 const auto loggingPath = "/xyz/openbmc_project/logging";
 const auto loggingCreateIface = "xyz.openbmc_project.Logging.Create";
 
-JsonConfig::JsonConfig(sdbusplus::bus_t& bus) : _bus(bus)
-{}
+JsonConfig::JsonConfig(sdbusplus::bus_t& bus) : _bus(bus) {}
 
 void JsonConfig::start()
 {
@@ -191,14 +190,14 @@
                 eeprom["bind_delay_ms"].get<size_t>());
         }
 
-        auto fan =
-            std::make_tuple(member["name"], member["path"], timeUntilError);
+        auto fan = std::make_tuple(member["name"], member["path"],
+                                   timeUntilError);
         // Create a fan object
         fans.emplace_back(std::make_tuple(fan, std::move(sensors)));
 
         // Add fan presence policy
-        auto policy =
-            getPolicy(member["rpolicy"], fans.back(), std::move(eepromDevice));
+        auto policy = getPolicy(member["rpolicy"], fans.back(),
+                                std::move(eepromDevice));
         if (policy)
         {
             policies.emplace_back(std::move(policy));
@@ -325,7 +324,6 @@
 
         try
         {
-
             util::SDBusPlus::lookupAndCallMethod(
                 loggingPath, loggingCreateIface, "Create",
                 "xyz.openbmc_project.Fan.Presence.Error.GPIODeviceUnavailable",
diff --git a/presence/psensor.hpp b/presence/psensor.hpp
index cc65fe0..d73be56 100644
--- a/presence/psensor.hpp
+++ b/presence/psensor.hpp
@@ -74,8 +74,7 @@
      *
      * Provide a default noop implementation.
      */
-    virtual void fail()
-    {}
+    virtual void fail() {}
 
     friend bool operator==(const PresenceSensor& l, const PresenceSensor& r);
 
diff --git a/sdbusplus.hpp b/sdbusplus.hpp
index 759f907..a5fae30 100644
--- a/sdbusplus.hpp
+++ b/sdbusplus.hpp
@@ -34,8 +34,7 @@
 class DBusError : public std::runtime_error
 {
   public:
-    explicit DBusError(const std::string& msg) : std::runtime_error(msg)
-    {}
+    explicit DBusError(const std::string& msg) : std::runtime_error(msg) {}
 };
 
 /**
@@ -109,7 +108,6 @@
  */
 class SDBusPlus
 {
-
   public:
     /** @brief Get the bus connection. */
     static auto& getBus() __attribute__((pure))
@@ -346,9 +344,9 @@
         using namespace std::literals::string_literals;
 
         auto service = getService(bus, path, interface);
-        auto msg =
-            callMethod(bus, service, path, "org.freedesktop.DBus.Properties"s,
-                       "Get"s, interface, property);
+        auto msg = callMethod(bus, service, path,
+                              "org.freedesktop.DBus.Properties"s, "Get"s,
+                              interface, property);
         if (msg.is_method_error())
         {
             throw DBusPropertyError{"DBus get property failed", service, path,
@@ -378,9 +376,9 @@
         using namespace std::literals::string_literals;
 
         auto service = getService(bus, path, interface);
-        auto msg =
-            callMethod(bus, service, path, "org.freedesktop.DBus.Properties"s,
-                       "Get"s, interface, property);
+        auto msg = callMethod(bus, service, path,
+                              "org.freedesktop.DBus.Properties"s, "Get"s,
+                              interface, property);
         if (msg.is_method_error())
         {
             throw DBusPropertyError{"DBus get property variant failed", service,
diff --git a/sensor-monitor/alarm_timestamps.hpp b/sensor-monitor/alarm_timestamps.hpp
index 75586af..e25d9fc 100644
--- a/sensor-monitor/alarm_timestamps.hpp
+++ b/sensor-monitor/alarm_timestamps.hpp
@@ -215,7 +215,6 @@
      */
     void load()
     {
-
         std::vector<std::tuple<std::string, int, int, uint64_t>> times;
 
         std::filesystem::path path =
diff --git a/sensor-monitor/shutdown_alarm_monitor.cpp b/sensor-monitor/shutdown_alarm_monitor.cpp
index 8fad830..0828b16 100644
--- a/sensor-monitor/shutdown_alarm_monitor.cpp
+++ b/sensor-monitor/shutdown_alarm_monitor.cpp
@@ -132,14 +132,13 @@
 
         auto shutdownType2 = shutdownType;
 
-        std::for_each(
-            paths.begin(), paths.end(),
-            [this, shutdownType2](const auto& path) {
-                alarms.emplace(AlarmKey{path, shutdownType2, AlarmType::high},
-                               nullptr);
-                alarms.emplace(AlarmKey{path, shutdownType2, AlarmType::low},
-                               nullptr);
-            });
+        std::for_each(paths.begin(), paths.end(),
+                      [this, shutdownType2](const auto& path) {
+            alarms.emplace(AlarmKey{path, shutdownType2, AlarmType::high},
+                           nullptr);
+            alarms.emplace(AlarmKey{path, shutdownType2, AlarmType::low},
+                           nullptr);
+        });
     }
 }
 
@@ -294,8 +293,8 @@
 
             if (elapsedTime < static_cast<uint64_t>(shutdownDelay.count()))
             {
-                remainingTime =
-                    static_cast<uint64_t>(shutdownDelay.count()) - elapsedTime;
+                remainingTime = static_cast<uint64_t>(shutdownDelay.count()) -
+                                elapsedTime;
             }
 
             shutdownDelay = std::chrono::milliseconds{remainingTime};
@@ -470,9 +469,10 @@
 std::optional<ShutdownType>
     ShutdownAlarmMonitor::getShutdownType(const std::string& interface) const
 {
-    auto it = std::find_if(
-        shutdownInterfaces.begin(), shutdownInterfaces.end(),
-        [interface](const auto& a) { return a.second == interface; });
+    auto it = std::find_if(shutdownInterfaces.begin(), shutdownInterfaces.end(),
+                           [interface](const auto& a) {
+        return a.second == interface;
+    });
 
     if (it == shutdownInterfaces.end())
     {
diff --git a/sensor-monitor/threshold_alarm_logger.cpp b/sensor-monitor/threshold_alarm_logger.cpp
index 34090f9..99ed0d6 100644
--- a/sensor-monitor/threshold_alarm_logger.cpp
+++ b/sensor-monitor/threshold_alarm_logger.cpp
@@ -127,20 +127,17 @@
                                        this, std::placeholders::_1));
 
     // check for any currently asserted threshold alarms
-    std::for_each(
-        thresholdData.begin(), thresholdData.end(),
-        [this](const auto& thresholdInterface) {
-            const auto& interface = thresholdInterface.first;
-            auto objects =
-                SDBusPlus::getSubTreeRaw(this->bus, "/", interface, 0);
-            std::for_each(objects.begin(), objects.end(),
-                          [interface, this](const auto& object) {
-                              const auto& path = object.first;
-                              const auto& service =
-                                  object.second.begin()->first;
-                              checkThresholds(interface, path, service);
-                          });
+    std::for_each(thresholdData.begin(), thresholdData.end(),
+                  [this](const auto& thresholdInterface) {
+        const auto& interface = thresholdInterface.first;
+        auto objects = SDBusPlus::getSubTreeRaw(this->bus, "/", interface, 0);
+        std::for_each(objects.begin(), objects.end(),
+                      [interface, this](const auto& object) {
+            const auto& path = object.first;
+            const auto& service = object.second.begin()->first;
+            checkThresholds(interface, path, service);
         });
+    });
 }
 
 void ThresholdAlarmLogger::propertiesChanged(sdbusplus::message_t& msg)
diff --git a/utility.hpp b/utility.hpp
index 2afd48e..cbf6205 100644
--- a/utility.hpp
+++ b/utility.hpp
@@ -45,8 +45,7 @@
     FileDescriptor& operator=(const FileDescriptor&) = delete;
     FileDescriptor& operator=(FileDescriptor&&) = default;
 
-    explicit FileDescriptor(int fd) : fd(fd)
-    {}
+    explicit FileDescriptor(int fd) : fd(fd) {}
 
     ~FileDescriptor()
     {
