diff --git a/control/json/actions/action.hpp b/control/json/actions/action.hpp
index 93cd9e2..6cc5bac 100644
--- a/control/json/actions/action.hpp
+++ b/control/json/actions/action.hpp
@@ -82,9 +82,9 @@
  * sets the zones the action should run against.
  */
 template <typename T>
-std::unique_ptr<T>
-    createAction(const json& jsonObj, const std::vector<Group>& groups,
-                 std::vector<std::reference_wrapper<Zone>>& zones)
+std::unique_ptr<T> createAction(
+    const json& jsonObj, const std::vector<Group>& groups,
+    std::vector<std::reference_wrapper<Zone>>& zones)
 {
     // Create the action and set its list of zones
     auto action = std::make_unique<T>(jsonObj, groups);
@@ -319,10 +319,10 @@
      *
      * @return Pointer to the action object.
      */
-    static std::unique_ptr<ActionBase>
-        getAction(const std::string& name, const json& jsonObj,
-                  const std::vector<Group>& groups,
-                  std::vector<std::reference_wrapper<Zone>>&& zones)
+    static std::unique_ptr<ActionBase> getAction(
+        const std::string& name, const json& jsonObj,
+        const std::vector<Group>& groups,
+        std::vector<std::reference_wrapper<Zone>>&& zones)
     {
         auto it = actions.find(name);
         if (it != actions.end())
diff --git a/control/json/actions/mapped_floor.cpp b/control/json/actions/mapped_floor.cpp
index ab50075..7cad6a4 100644
--- a/control/json/actions/mapped_floor.cpp
+++ b/control/json/actions/mapped_floor.cpp
@@ -242,8 +242,8 @@
         value);
 }
 
-std::optional<PropertyVariantType>
-    MappedFloor::getMaxGroupValue(const Group& group)
+std::optional<PropertyVariantType> MappedFloor::getMaxGroupValue(
+    const Group& group)
 {
     std::optional<PropertyVariantType> max;
     bool checked = false;
diff --git a/control/json/actions/pcie_card_floors.hpp b/control/json/actions/pcie_card_floors.hpp
index 081f409..e7c21a3 100644
--- a/control/json/actions/pcie_card_floors.hpp
+++ b/control/json/actions/pcie_card_floors.hpp
@@ -142,8 +142,8 @@
      *  - The floor index or true for has temp sensor if found,
      *    std::nullopt else.
      */
-    std::optional<std::variant<int32_t, bool>>
-        getFloorIndexFromSlot(const std::string& slotPath);
+    std::optional<std::variant<int32_t, bool>> getFloorIndexFromSlot(
+        const std::string& slotPath);
 
     /**
      * @brief Gets the hex PCIeDevice property value from the
diff --git a/control/json/actions/set_parameter_from_group_max.hpp b/control/json/actions/set_parameter_from_group_max.hpp
index ad0114c..61a9836 100644
--- a/control/json/actions/set_parameter_from_group_max.hpp
+++ b/control/json/actions/set_parameter_from_group_max.hpp
@@ -63,8 +63,8 @@
     SetParameterFromGroupMax() = delete;
     SetParameterFromGroupMax(const SetParameterFromGroupMax&) = delete;
     SetParameterFromGroupMax(SetParameterFromGroupMax&&) = delete;
-    SetParameterFromGroupMax&
-        operator=(const SetParameterFromGroupMax&) = delete;
+    SetParameterFromGroupMax& operator=(const SetParameterFromGroupMax&) =
+        delete;
     SetParameterFromGroupMax& operator=(SetParameterFromGroupMax&&) = delete;
     virtual ~SetParameterFromGroupMax() = default;
 
diff --git a/control/json/actions/timer_based_actions.hpp b/control/json/actions/timer_based_actions.hpp
index c36ecf6..12e6198 100644
--- a/control/json/actions/timer_based_actions.hpp
+++ b/control/json/actions/timer_based_actions.hpp
@@ -111,8 +111,8 @@
      *
      * Sets the zones on this action and the timer's actions to run against
      */
-    virtual void
-        setZones(std::vector<std::reference_wrapper<Zone>>& zones) override;
+    virtual void setZones(
+        std::vector<std::reference_wrapper<Zone>>& zones) override;
 
   private:
     /* The timer for this action */
diff --git a/control/json/event.cpp b/control/json/event.cpp
index 0e7f1e5..fa3502d 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -90,8 +90,8 @@
     }
 }
 
-std::map<configKey, std::unique_ptr<Group>>&
-    Event::getAllGroups(bool loadGroups)
+std::map<configKey, std::unique_ptr<Group>>& Event::getAllGroups(
+    bool loadGroups)
 {
     if (allGroups.empty() && loadGroups)
     {
diff --git a/control/json/event.hpp b/control/json/event.hpp
index e0bdd06..9d3443a 100644
--- a/control/json/event.hpp
+++ b/control/json/event.hpp
@@ -101,8 +101,8 @@
      *
      * @param[in] groups - All groups available for events
      */
-    static void
-        setAllGroups(std::map<configKey, std::unique_ptr<Group>>&& groups)
+    static void setAllGroups(
+        std::map<configKey, std::unique_ptr<Group>>&& groups)
     {
         allGroups = std::move(groups);
     }
@@ -115,8 +115,8 @@
      *
      * @return Groups available to be configured on events from `groups.json`
      */
-    static std::map<configKey, std::unique_ptr<Group>>&
-        getAllGroups(bool loadGroups = true);
+    static std::map<configKey, std::unique_ptr<Group>>& getAllGroups(
+        bool loadGroups = true);
 
     /**
      * @brief Parse group parameters and configure a group object
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 6ae51c9..a74b1b8 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -460,8 +460,8 @@
     return serviceName;
 }
 
-std::vector<std::string>
-    Manager::findPaths(const std::string& serv, const std::string& intf)
+std::vector<std::string> Manager::findPaths(const std::string& serv,
+                                            const std::string& intf)
 {
     std::vector<std::string> paths;
 
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index 2f66181..5d94623 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -198,8 +198,8 @@
      *     Map of configuration keys to their corresponding configuration object
      */
     template <typename T, typename... Args>
-    static std::map<configKey, std::unique_ptr<T>>
-        getConfig(bool isOptional, Args&&... args)
+    static std::map<configKey, std::unique_ptr<T>> getConfig(bool isOptional,
+                                                             Args&&... args)
     {
         std::map<configKey, std::unique_ptr<T>> config;
 
@@ -381,9 +381,9 @@
      * @param[in] intf - Dbus object's interface
      * @param[in] prop - Dbus object's property
      */
-    const std::optional<PropertyVariantType>
-        getProperty(const std::string& path, const std::string& intf,
-                    const std::string& prop);
+    const std::optional<PropertyVariantType> getProperty(
+        const std::string& path, const std::string& intf,
+        const std::string& prop);
 
     /**
      * @brief Set/update an object's property value
@@ -536,8 +536,8 @@
      *
      * @return The parameter value, or std::nullopt if not found
      */
-    static std::optional<PropertyVariantType>
-        getParameter(const std::string& name)
+    static std::optional<PropertyVariantType> getParameter(
+        const std::string& name)
     {
         auto it = _parameters.find(name);
         if (it != _parameters.end())
@@ -562,9 +562,9 @@
      * @param[in] name - The parameter name
      * @param[in] actions - The actions to run on the trigger
      */
-    static void
-        addParameterTrigger(const std::string& name,
-                            std::vector<std::unique_ptr<ActionBase>>& actions);
+    static void addParameterTrigger(
+        const std::string& name,
+        std::vector<std::unique_ptr<ActionBase>>& actions);
 
     /* The name of the dump file */
     static const std::string dumpFile;
diff --git a/control/json/triggers/parameter.cpp b/control/json/triggers/parameter.cpp
index 6986608..1bec051 100644
--- a/control/json/triggers/parameter.cpp
+++ b/control/json/triggers/parameter.cpp
@@ -24,9 +24,9 @@
 
 using json = nlohmann::json;
 
-enableTrigger
-    triggerParameter(const json& jsonObj, const std::string& eventName,
-                     std::vector<std::unique_ptr<ActionBase>>& /*actions*/)
+enableTrigger triggerParameter(
+    const json& jsonObj, const std::string& eventName,
+    std::vector<std::unique_ptr<ActionBase>>& /*actions*/)
 {
     if (!jsonObj.contains("parameter"))
     {
diff --git a/control/json/triggers/parameter.hpp b/control/json/triggers/parameter.hpp
index ed7d4fa..8554b4d 100644
--- a/control/json/triggers/parameter.hpp
+++ b/control/json/triggers/parameter.hpp
@@ -34,8 +34,8 @@
  * @param[in] eventName - Name of event associated to the signal
  * @param[in] actions - Actions associated with the trigger
  */
-enableTrigger
-    triggerParameter(const json& jsonObj, const std::string& eventName,
-                     std::vector<std::unique_ptr<ActionBase>>& actions);
+enableTrigger triggerParameter(
+    const json& jsonObj, const std::string& eventName,
+    std::vector<std::unique_ptr<ActionBase>>& actions);
 
 } // namespace phosphor::fan::control::json::trigger::parameter
diff --git a/control/json/triggers/signal.cpp b/control/json/triggers/signal.cpp
index c0641d9..39c20b1 100644
--- a/control/json/triggers/signal.cpp
+++ b/control/json/triggers/signal.cpp
@@ -235,9 +235,9 @@
     }
 }
 
-enableTrigger
-    triggerSignal(const json& jsonObj, const std::string& eventName,
-                  std::vector<std::unique_ptr<ActionBase>>& /*actions*/)
+enableTrigger triggerSignal(
+    const json& jsonObj, const std::string& eventName,
+    std::vector<std::unique_ptr<ActionBase>>& /*actions*/)
 {
     auto subscriber = signals.end();
     if (jsonObj.contains("signal"))
diff --git a/control/json/triggers/timer.cpp b/control/json/triggers/timer.cpp
index 2036042..8acbc41 100644
--- a/control/json/triggers/timer.cpp
+++ b/control/json/triggers/timer.cpp
@@ -80,9 +80,9 @@
     return false;
 }
 
-enableTrigger
-    triggerTimer(const json& jsonObj, const std::string& /*eventName*/,
-                 std::vector<std::unique_ptr<ActionBase>>& /*actions*/)
+enableTrigger triggerTimer(
+    const json& jsonObj, const std::string& /*eventName*/,
+    std::vector<std::unique_ptr<ActionBase>>& /*actions*/)
 {
     // Get the type and interval of this timer from the JSON
     auto type = getType(jsonObj);
diff --git a/control/json/utils/modifier.cpp b/control/json/utils/modifier.cpp
index c8fb536..0b4adfd 100644
--- a/control/json/utils/modifier.cpp
+++ b/control/json/utils/modifier.cpp
@@ -50,9 +50,9 @@
  * @brief Return a default value to use when the argument passed
  *        to LessThanOperator is out of range.
  */
-PropertyVariantType
-    getDefaultValue(const PropertyVariantType& val,
-                    const std::optional<PropertyVariantType>& defaultValue)
+PropertyVariantType getDefaultValue(
+    const PropertyVariantType& val,
+    const std::optional<PropertyVariantType>& defaultValue)
 {
     // When a default value is given, return that
     if (defaultValue)
diff --git a/control/json/utils/pcie_card_metadata.hpp b/control/json/utils/pcie_card_metadata.hpp
index dcdc9e5..c04443d 100644
--- a/control/json/utils/pcie_card_metadata.hpp
+++ b/control/json/utils/pcie_card_metadata.hpp
@@ -83,9 +83,9 @@
      *
      *     If no entry is found, it will return std::nullopt.
      */
-    std::optional<std::variant<int32_t, bool>>
-        lookup(uint16_t deviceID, uint16_t vendorID, uint16_t subsystemID,
-               uint16_t subsystemVendorID) const;
+    std::optional<std::variant<int32_t, bool>> lookup(
+        uint16_t deviceID, uint16_t vendorID, uint16_t subsystemID,
+        uint16_t subsystemVendorID) const;
 
   private:
     /**
diff --git a/control/json/zone.cpp b/control/json/zone.cpp
index 8dc6044..ca78900 100644
--- a/control/json/zone.cpp
+++ b/control/json/zone.cpp
@@ -558,8 +558,8 @@
 {
 // Get a set property handler function for the configured values of the
 // "Supported" property
-std::function<void(DBusZone&, Zone&)>
-    supported(const json& jsonObj, bool persist)
+std::function<void(DBusZone&, Zone&)> supported(const json& jsonObj,
+                                                bool persist)
 {
     std::vector<std::string> values;
     if (!jsonObj.contains("values"))
diff --git a/control/json/zone.hpp b/control/json/zone.hpp
index bb00416..5c37c4a 100644
--- a/control/json/zone.hpp
+++ b/control/json/zone.hpp
@@ -551,8 +551,8 @@
  *
  * @return Zone dbus object's set property function for the "Supported" property
  */
-std::function<void(DBusZone&, Zone&)>
-    supported(const json& jsonObj, bool persist);
+std::function<void(DBusZone&, Zone&)> supported(const json& jsonObj,
+                                                bool persist);
 
 /**
  * @brief "Current" property on the "xyz.openbmc_project.Control.ThermalMode"
@@ -564,8 +564,8 @@
  *
  * @return Zone dbus object's set property function for the "Current" property
  */
-std::function<void(DBusZone&, Zone&)>
-    current(const json& jsonObj, bool persist);
+std::function<void(DBusZone&, Zone&)> current(const json& jsonObj,
+                                              bool persist);
 
 } // namespace zone::property
 
