diff --git a/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp b/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp
index 338ef4a..abae4a1 100644
--- a/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp
+++ b/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp
@@ -60,8 +60,8 @@
     return ss.str();
 }
 
-std::string
-    I2CCaptureBytesAction::getErrorDataKey(ActionEnvironment& environment) const
+std::string I2CCaptureBytesAction::getErrorDataKey(
+    ActionEnvironment& environment) const
 {
     // Additional error data key format: <deviceID>_register_<register>
     std::ostringstream ss;
@@ -91,8 +91,8 @@
     return key;
 }
 
-std::string
-    I2CCaptureBytesAction::getErrorDataValue(const uint8_t* values) const
+std::string I2CCaptureBytesAction::getErrorDataValue(
+    const uint8_t* values) const
 {
     // Additional error data value format: [ <byte 0>, <byte 1>, ... ]
     std::ostringstream ss;
diff --git a/phosphor-regulators/src/actions/pmbus_write_vout_command_action.cpp b/phosphor-regulators/src/actions/pmbus_write_vout_command_action.cpp
index ca1756f..62231be 100644
--- a/phosphor-regulators/src/actions/pmbus_write_vout_command_action.cpp
+++ b/phosphor-regulators/src/actions/pmbus_write_vout_command_action.cpp
@@ -122,8 +122,8 @@
     return parameter;
 }
 
-double
-    PMBusWriteVoutCommandAction::getVoltsValue(ActionEnvironment& environment)
+double PMBusWriteVoutCommandAction::getVoltsValue(
+    ActionEnvironment& environment)
 {
     double voltsValue;
 
diff --git a/phosphor-regulators/src/actions/pmbus_write_vout_command_action.hpp b/phosphor-regulators/src/actions/pmbus_write_vout_command_action.hpp
index e15d032..3a69228 100644
--- a/phosphor-regulators/src/actions/pmbus_write_vout_command_action.hpp
+++ b/phosphor-regulators/src/actions/pmbus_write_vout_command_action.hpp
@@ -68,10 +68,10 @@
     PMBusWriteVoutCommandAction() = delete;
     PMBusWriteVoutCommandAction(const PMBusWriteVoutCommandAction&) = delete;
     PMBusWriteVoutCommandAction(PMBusWriteVoutCommandAction&&) = delete;
-    PMBusWriteVoutCommandAction&
-        operator=(const PMBusWriteVoutCommandAction&) = delete;
-    PMBusWriteVoutCommandAction&
-        operator=(PMBusWriteVoutCommandAction&&) = delete;
+    PMBusWriteVoutCommandAction& operator=(const PMBusWriteVoutCommandAction&) =
+        delete;
+    PMBusWriteVoutCommandAction& operator=(PMBusWriteVoutCommandAction&&) =
+        delete;
     virtual ~PMBusWriteVoutCommandAction() = default;
 
     /**
diff --git a/phosphor-regulators/src/config_file_parser.cpp b/phosphor-regulators/src/config_file_parser.cpp
index 4bb8bd8..442db04 100644
--- a/phosphor-regulators/src/config_file_parser.cpp
+++ b/phosphor-regulators/src/config_file_parser.cpp
@@ -775,8 +775,8 @@
     return std::make_unique<OrAction>(std::move(actions));
 }
 
-std::unique_ptr<PhaseFaultDetection>
-    parsePhaseFaultDetection(const json& element)
+std::unique_ptr<PhaseFaultDetection> parsePhaseFaultDetection(
+    const json& element)
 {
     verifyIsObject(element);
     unsigned int propertyCount{0};
@@ -864,8 +864,8 @@
                                                    exponent);
 }
 
-std::unique_ptr<PMBusWriteVoutCommandAction>
-    parsePMBusWriteVoutCommand(const json& element)
+std::unique_ptr<PMBusWriteVoutCommandAction> parsePMBusWriteVoutCommand(
+    const json& element)
 {
     verifyIsObject(element);
     unsigned int propertyCount{0};
@@ -1061,8 +1061,8 @@
     return rules;
 }
 
-std::vector<std::unique_ptr<Action>>
-    parseRuleIDOrActionsProperty(const json& element)
+std::vector<std::unique_ptr<Action>> parseRuleIDOrActionsProperty(
+    const json& element)
 {
     verifyIsObject(element);
     // Required rule_id or actions property
diff --git a/phosphor-regulators/src/config_file_parser.hpp b/phosphor-regulators/src/config_file_parser.hpp
index 3add3ff..1119fc0 100644
--- a/phosphor-regulators/src/config_file_parser.hpp
+++ b/phosphor-regulators/src/config_file_parser.hpp
@@ -125,8 +125,8 @@
  * @param element JSON element
  * @return vector of Action objects
  */
-std::vector<std::unique_ptr<Action>>
-    parseActionArray(const nlohmann::json& element);
+std::vector<std::unique_ptr<Action>> parseActionArray(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an and action.
@@ -232,8 +232,8 @@
  * @param element JSON element
  * @return vector of Chassis objects
  */
-std::vector<std::unique_ptr<Chassis>>
-    parseChassisArray(const nlohmann::json& element);
+std::vector<std::unique_ptr<Chassis>> parseChassisArray(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a compare_presence action.
@@ -245,8 +245,8 @@
  * @param element JSON element
  * @return ComparePresenceAction object
  */
-std::unique_ptr<ComparePresenceAction>
-    parseComparePresence(const nlohmann::json& element);
+std::unique_ptr<ComparePresenceAction> parseComparePresence(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a compare_vpd action.
@@ -258,8 +258,8 @@
  * @param element JSON element
  * @return CompareVPDAction object
  */
-std::unique_ptr<CompareVPDAction>
-    parseCompareVPD(const nlohmann::json& element);
+std::unique_ptr<CompareVPDAction> parseCompareVPD(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a configuration object.
@@ -271,8 +271,8 @@
  * @param element JSON element
  * @return Configuration object
  */
-std::unique_ptr<Configuration>
-    parseConfiguration(const nlohmann::json& element);
+std::unique_ptr<Configuration> parseConfiguration(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a device.
@@ -296,8 +296,8 @@
  * @param element JSON element
  * @return vector of Device objects
  */
-std::vector<std::unique_ptr<Device>>
-    parseDeviceArray(const nlohmann::json& element);
+std::vector<std::unique_ptr<Device>> parseDeviceArray(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a double (floating point number).
@@ -376,8 +376,8 @@
  * @param element JSON element
  * @return I2CCaptureBytesAction object
  */
-std::unique_ptr<I2CCaptureBytesAction>
-    parseI2CCaptureBytes(const nlohmann::json& element);
+std::unique_ptr<I2CCaptureBytesAction> parseI2CCaptureBytes(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_compare_bit action.
@@ -389,8 +389,8 @@
  * @param element JSON element
  * @return I2CCompareBitAction object
  */
-std::unique_ptr<I2CCompareBitAction>
-    parseI2CCompareBit(const nlohmann::json& element);
+std::unique_ptr<I2CCompareBitAction> parseI2CCompareBit(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_compare_byte action.
@@ -402,8 +402,8 @@
  * @param element JSON element
  * @return I2CCompareByteAction object
  */
-std::unique_ptr<I2CCompareByteAction>
-    parseI2CCompareByte(const nlohmann::json& element);
+std::unique_ptr<I2CCompareByteAction> parseI2CCompareByte(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_compare_bytes action.
@@ -415,8 +415,8 @@
  * @param element JSON element
  * @return I2CCompareBytesAction object
  */
-std::unique_ptr<I2CCompareBytesAction>
-    parseI2CCompareBytes(const nlohmann::json& element);
+std::unique_ptr<I2CCompareBytesAction> parseI2CCompareBytes(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_interface.
@@ -428,8 +428,8 @@
  * @param element JSON element
  * @return i2c::I2CInterface object
  */
-std::unique_ptr<i2c::I2CInterface>
-    parseI2CInterface(const nlohmann::json& element);
+std::unique_ptr<i2c::I2CInterface> parseI2CInterface(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_write_bit action.
@@ -441,8 +441,8 @@
  * @param element JSON element
  * @return I2CWriteBitAction object
  */
-std::unique_ptr<I2CWriteBitAction>
-    parseI2CWriteBit(const nlohmann::json& element);
+std::unique_ptr<I2CWriteBitAction> parseI2CWriteBit(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_write_byte action.
@@ -454,8 +454,8 @@
  * @param element JSON element
  * @return I2CWriteByteAction object
  */
-std::unique_ptr<I2CWriteByteAction>
-    parseI2CWriteByte(const nlohmann::json& element);
+std::unique_ptr<I2CWriteByteAction> parseI2CWriteByte(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an i2c_write_bytes action.
@@ -467,8 +467,8 @@
  * @param element JSON element
  * @return I2CWriteBytesAction object
  */
-std::unique_ptr<I2CWriteBytesAction>
-    parseI2CWriteBytes(const nlohmann::json& element);
+std::unique_ptr<I2CWriteBytesAction> parseI2CWriteBytes(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing an if action.
@@ -532,8 +532,8 @@
  * @param element JSON element
  * @return LogPhaseFaultAction object
  */
-std::unique_ptr<LogPhaseFaultAction>
-    parseLogPhaseFault(const nlohmann::json& element);
+std::unique_ptr<LogPhaseFaultAction> parseLogPhaseFault(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a not action.
@@ -569,8 +569,8 @@
  * @param element JSON element
  * @return PhaseFaultDetection object
  */
-std::unique_ptr<PhaseFaultDetection>
-    parsePhaseFaultDetection(const nlohmann::json& element);
+std::unique_ptr<PhaseFaultDetection> parsePhaseFaultDetection(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a PhaseFaultType expressed as a string.
@@ -594,8 +594,8 @@
  * @param element JSON element
  * @return PMBusReadSensorAction object
  */
-std::unique_ptr<PMBusReadSensorAction>
-    parsePMBusReadSensor(const nlohmann::json& element);
+std::unique_ptr<PMBusReadSensorAction> parsePMBusReadSensor(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a pmbus_write_vout_command action.
@@ -607,8 +607,8 @@
  * @param element JSON element
  * @return PMBusWriteVoutCommandAction object
  */
-std::unique_ptr<PMBusWriteVoutCommandAction>
-    parsePMBusWriteVoutCommand(const nlohmann::json& element);
+std::unique_ptr<PMBusWriteVoutCommandAction> parsePMBusWriteVoutCommand(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a presence_detection object.
@@ -620,8 +620,8 @@
  * @param element JSON element
  * @return PresenceDetection object
  */
-std::unique_ptr<PresenceDetection>
-    parsePresenceDetection(const nlohmann::json& element);
+std::unique_ptr<PresenceDetection> parsePresenceDetection(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a rail.
@@ -645,8 +645,8 @@
  * @param element JSON element
  * @return vector of Rail objects
  */
-std::vector<std::unique_ptr<Rail>>
-    parseRailArray(const nlohmann::json& element);
+std::vector<std::unique_ptr<Rail>> parseRailArray(
+    const nlohmann::json& element);
 
 /**
  * Parses the JSON root element of the entire configuration file.
@@ -684,8 +684,8 @@
  * @param element JSON element
  * @return vector of Rule objects
  */
-std::vector<std::unique_ptr<Rule>>
-    parseRuleArray(const nlohmann::json& element);
+std::vector<std::unique_ptr<Rule>> parseRuleArray(
+    const nlohmann::json& element);
 
 /**
  * Parses the "rule_id" or "actions" property in a JSON element.
@@ -703,8 +703,8 @@
  * @param element JSON element
  * @return vector of Action objects
  */
-std::vector<std::unique_ptr<Action>>
-    parseRuleIDOrActionsProperty(const nlohmann::json& element);
+std::vector<std::unique_ptr<Action>> parseRuleIDOrActionsProperty(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a run_rule action.
@@ -728,8 +728,8 @@
  * @param element JSON element
  * @return SensorDataFormat enum value
  */
-pmbus_utils::SensorDataFormat
-    parseSensorDataFormat(const nlohmann::json& element);
+pmbus_utils::SensorDataFormat parseSensorDataFormat(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a sensor_monitoring object.
@@ -741,8 +741,8 @@
  * @param element JSON element
  * @return SensorMonitoring object
  */
-std::unique_ptr<SensorMonitoring>
-    parseSensorMonitoring(const nlohmann::json& element);
+std::unique_ptr<SensorMonitoring> parseSensorMonitoring(
+    const nlohmann::json& element);
 
 /**
  * Parses a JSON element containing a SensorType expressed as a string.
diff --git a/phosphor-regulators/src/dbus_sensor.cpp b/phosphor-regulators/src/dbus_sensor.cpp
index 8dd760a..5f0a938 100644
--- a/phosphor-regulators/src/dbus_sensor.cpp
+++ b/phosphor-regulators/src/dbus_sensor.cpp
@@ -152,9 +152,9 @@
     setLastUpdateTime();
 }
 
-std::vector<AssocationTuple>
-    DBusSensor::getAssociations(const std::string& deviceInventoryPath,
-                                const std::string& chassisInventoryPath)
+std::vector<AssocationTuple> DBusSensor::getAssociations(
+    const std::string& deviceInventoryPath,
+    const std::string& chassisInventoryPath)
 {
     std::vector<AssocationTuple> associations{};
 
diff --git a/phosphor-regulators/src/dbus_sensor.hpp b/phosphor-regulators/src/dbus_sensor.hpp
index 68982d3..5f88b1a 100644
--- a/phosphor-regulators/src/dbus_sensor.hpp
+++ b/phosphor-regulators/src/dbus_sensor.hpp
@@ -268,9 +268,9 @@
      * @param chassisInventoryPath D-Bus inventory path of the chassis that
      *                             contains the voltage regulator device
      */
-    std::vector<AssocationTuple>
-        getAssociations(const std::string& deviceInventoryPath,
-                        const std::string& chassisInventoryPath);
+    std::vector<AssocationTuple> getAssociations(
+        const std::string& deviceInventoryPath,
+        const std::string& chassisInventoryPath);
 
     /**
      * Get sensor properties that are based on the sensor type.
diff --git a/phosphor-regulators/src/error_logging.cpp b/phosphor-regulators/src/error_logging.cpp
index 9ebce1a..a7b4a3d 100644
--- a/phosphor-regulators/src/error_logging.cpp
+++ b/phosphor-regulators/src/error_logging.cpp
@@ -192,8 +192,8 @@
     return files;
 }
 
-std::vector<FFDCTuple>
-    DBusErrorLogging::createFFDCTuples(std::vector<FFDCFile>& files)
+std::vector<FFDCTuple> DBusErrorLogging::createFFDCTuples(
+    std::vector<FFDCFile>& files)
 {
     std::vector<FFDCTuple> ffdcTuples{};
     for (FFDCFile& file : files)
diff --git a/phosphor-regulators/src/error_logging.hpp b/phosphor-regulators/src/error_logging.hpp
index 1c633f9..6b058f8 100644
--- a/phosphor-regulators/src/error_logging.hpp
+++ b/phosphor-regulators/src/error_logging.hpp
@@ -110,10 +110,10 @@
      *                      occurred
      * @param additionalData additional error data (if any)
      */
-    virtual void
-        logPhaseFault(Entry::Level severity, Journal& journal,
-                      PhaseFaultType type, const std::string& inventoryPath,
-                      std::map<std::string, std::string> additionalData) = 0;
+    virtual void logPhaseFault(
+        Entry::Level severity, Journal& journal, PhaseFaultType type,
+        const std::string& inventoryPath,
+        std::map<std::string, std::string> additionalData) = 0;
 
     /**
      * Log a PMBus error.
@@ -140,9 +140,9 @@
      * @param inventoryPath D-Bus inventory path of the device where the error
      *                      occurred
      */
-    virtual void
-        logWriteVerificationError(Entry::Level severity, Journal& journal,
-                                  const std::string& inventoryPath) = 0;
+    virtual void logWriteVerificationError(
+        Entry::Level severity, Journal& journal,
+        const std::string& inventoryPath) = 0;
 };
 
 /**
@@ -195,9 +195,9 @@
                                const std::string& inventoryPath) override;
 
     /** @copydoc ErrorLogging::logWriteVerificationError() */
-    virtual void
-        logWriteVerificationError(Entry::Level severity, Journal& journal,
-                                  const std::string& inventoryPath) override;
+    virtual void logWriteVerificationError(
+        Entry::Level severity, Journal& journal,
+        const std::string& inventoryPath) override;
 
   private:
     /**
diff --git a/phosphor-regulators/src/journal.hpp b/phosphor-regulators/src/journal.hpp
index c004031..2199c8c 100644
--- a/phosphor-regulators/src/journal.hpp
+++ b/phosphor-regulators/src/journal.hpp
@@ -55,9 +55,9 @@
      *            matching messages.
      * @return matching messages from the journal
      */
-    virtual std::vector<std::string>
-        getMessages(const std::string& field, const std::string& fieldValue,
-                    unsigned int max = 0) = 0;
+    virtual std::vector<std::string> getMessages(const std::string& field,
+                                                 const std::string& fieldValue,
+                                                 unsigned int max = 0) = 0;
 
     /**
      * Logs a debug message in the system journal.
@@ -119,9 +119,9 @@
     virtual ~SystemdJournal() = default;
 
     /** @copydoc Journal::getMessages() */
-    virtual std::vector<std::string>
-        getMessages(const std::string& field, const std::string& fieldValue,
-                    unsigned int max) override;
+    virtual std::vector<std::string> getMessages(const std::string& field,
+                                                 const std::string& fieldValue,
+                                                 unsigned int max) override;
 
     /** @copydoc Journal::logDebug(const std::string&) */
     virtual void logDebug(const std::string& message) override
