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()),
