diff --git a/extensions/openpower-pels/data_interface.cpp b/extensions/openpower-pels/data_interface.cpp
index a8167a5..67b4c32 100644
--- a/extensions/openpower-pels/data_interface.cpp
+++ b/extensions/openpower-pels/data_interface.cpp
@@ -465,8 +465,8 @@
     serialNumber = std::string{value.begin(), value.end()};
 }
 
-std::string
-    DataInterface::getLocationCode(const std::string& inventoryPath) const
+std::string DataInterface::getLocationCode(
+    const std::string& inventoryPath) const
 {
     auto service = getService(inventoryPath, interface::locCode);
 
@@ -477,8 +477,8 @@
     return std::get<std::string>(locCode);
 }
 
-std::string
-    DataInterface::addLocationCodePrefix(const std::string& locationCode)
+std::string DataInterface::addLocationCodePrefix(
+    const std::string& locationCode)
 {
     static const std::string locationCodePrefix{"Ufcs-"};
 
@@ -820,8 +820,8 @@
     return std::get<1>(rawProgress);
 }
 
-std::optional<std::vector<uint8_t>>
-    DataInterface::getDIProperty(const std::string& locationCode) const
+std::optional<std::vector<uint8_t>> DataInterface::getDIProperty(
+    const std::string& locationCode) const
 {
     std::vector<uint8_t> viniDI;
 
@@ -850,8 +850,8 @@
     return viniDI;
 }
 
-std::optional<bool>
-    DataInterfaceBase::isDIMMLocCode(const std::string& locCode) const
+std::optional<bool> DataInterfaceBase::isDIMMLocCode(
+    const std::string& locCode) const
 {
     if (_locationCache.contains(locCode))
     {
diff --git a/extensions/openpower-pels/data_interface.hpp b/extensions/openpower-pels/data_interface.hpp
index bdf93c1..d15a580 100644
--- a/extensions/openpower-pels/data_interface.hpp
+++ b/extensions/openpower-pels/data_interface.hpp
@@ -355,8 +355,8 @@
      *
      * @return std::string - The location code
      */
-    virtual std::string
-        getLocationCode(const std::string& inventoryPath) const = 0;
+    virtual std::string getLocationCode(
+        const std::string& inventoryPath) const = 0;
 
     /**
      * @brief Get the list of system type names the system is called.
@@ -398,9 +398,9 @@
      *
      * @return std::vector<std::string> - The inventory D-Bus objects
      */
-    virtual std::vector<std::string>
-        getInventoryFromLocCode(const std::string& LocationCode, uint16_t node,
-                                bool expanded) const = 0;
+    virtual std::vector<std::string> getInventoryFromLocCode(
+        const std::string& LocationCode, uint16_t node,
+        bool expanded) const = 0;
 
     /**
      * @brief Sets the Asserted property on the LED group passed in.
@@ -426,8 +426,8 @@
      *
      * @param[in] objectPath - The D-Bus object path
      */
-    virtual void
-        setCriticalAssociation(const std::string& objectPath) const = 0;
+    virtual void setCriticalAssociation(
+        const std::string& objectPath) const = 0;
 
     /**
      * @brief Returns the manufacturing QuiesceOnError property
@@ -450,8 +450,8 @@
      * @param[in] locationCode - location code to split
      * @return pair<string, string> - The base and connector segments
      */
-    static std::pair<std::string, std::string>
-        extractConnectorFromLocCode(const std::string& locationCode);
+    static std::pair<std::string, std::string> extractConnectorFromLocCode(
+        const std::string& locationCode);
 
 #ifdef PEL_ENABLE_PHAL
     /**
@@ -472,9 +472,9 @@
      * @param[in] priSRC - Primary SRC value (e.g. BD8D1001)
      * @param[in] srcStruct - Full SRC base structure
      */
-    virtual void
-        createProgressSRC(const uint64_t& priSRC,
-                          const std::vector<uint8_t>& srcStruct) const = 0;
+    virtual void createProgressSRC(
+        const uint64_t& priSRC,
+        const std::vector<uint8_t>& srcStruct) const = 0;
 
     /**
      * @brief Get the list of unresolved OpenBMC event log ids that have an
@@ -501,8 +501,8 @@
      * @return std::optional<std::vector<uint8_t>> -  The FRUs DI or
      * std::nullopt
      */
-    virtual std::optional<std::vector<uint8_t>>
-        getDIProperty(const std::string& locationCode) const = 0;
+    virtual std::optional<std::vector<uint8_t>> getDIProperty(
+        const std::string& locationCode) const = 0;
 
     /**
      * @brief Wrpper API to call pHAL API 'getFRUType()' and check whether the
@@ -788,8 +788,8 @@
      *
      * @return std::string - The location code
      */
-    std::string
-        getLocationCode(const std::string& inventoryPath) const override;
+    std::string getLocationCode(
+        const std::string& inventoryPath) const override;
 
     /**
      * @brief Get the list of system type names the system is called.
@@ -831,9 +831,9 @@
      *
      * @return std::vector<std::string> - The inventory D-Bus objects
      */
-    std::vector<std::string>
-        getInventoryFromLocCode(const std::string& locationCode, uint16_t node,
-                                bool expanded) const override;
+    std::vector<std::string> getInventoryFromLocCode(
+        const std::string& locationCode, uint16_t node,
+        bool expanded) const override;
 
     /**
      * @brief Sets the Asserted property on the LED group passed in.
@@ -886,9 +886,9 @@
      * @param[in] priSRC - Primary SRC value
      * @param[in] srcStruct - Full SRC base structure
      */
-    void
-        createProgressSRC(const uint64_t& priSRC,
-                          const std::vector<uint8_t>& srcStruct) const override;
+    void createProgressSRC(
+        const uint64_t& priSRC,
+        const std::vector<uint8_t>& srcStruct) const override;
 
     /**
      * @brief Get the list of unresolved OpenBMC event log ids that have an
@@ -915,8 +915,8 @@
      * @return std::optional<std::vector<uint8_t>> -  The FRUs DI or
      * std::nullopt
      */
-    std::optional<std::vector<uint8_t>>
-        getDIProperty(const std::string& locationCode) const override;
+    std::optional<std::vector<uint8_t>> getDIProperty(
+        const std::string& locationCode) const override;
 
     /**
      * @brief Finds all D-Bus Associated paths that contain any of the
diff --git a/extensions/openpower-pels/device_callouts.cpp b/extensions/openpower-pels/device_callouts.cpp
index 21c3e3c..f94212a 100644
--- a/extensions/openpower-pels/device_callouts.cpp
+++ b/extensions/openpower-pels/device_callouts.cpp
@@ -156,8 +156,8 @@
     return links;
 }
 
-std::tuple<std::string, std::tuple<size_t, uint8_t>>
-    getFSII2CSearchKeys(const std::string& devPath)
+std::tuple<std::string, std::tuple<size_t, uint8_t>> getFSII2CSearchKeys(
+    const std::string& devPath)
 {
     // This combines the FSI and i2C search keys
 
@@ -327,8 +327,8 @@
  *
  * @return std::vector<Callout> - The callouts
  */
-std::vector<device_callouts::Callout>
-    calloutFSI(const std::string& devPath, const nlohmann::json& calloutJSON)
+std::vector<device_callouts::Callout> calloutFSI(
+    const std::string& devPath, const nlohmann::json& calloutJSON)
 {
     auto links = getFSISearchKeys(devPath);
 
@@ -359,8 +359,8 @@
  *
  * @return std::vector<Callout> - The callouts
  */
-std::vector<device_callouts::Callout>
-    calloutFSII2C(const std::string& devPath, const nlohmann::json& calloutJSON)
+std::vector<device_callouts::Callout> calloutFSII2C(
+    const std::string& devPath, const nlohmann::json& calloutJSON)
 {
     auto linksAndI2C = getFSII2CSearchKeys(devPath);
     auto links = std::get<std::string>(linksAndI2C);
@@ -405,8 +405,8 @@
  *
  * @return std::vector<Callout> - The callouts
  */
-std::vector<device_callouts::Callout>
-    calloutFSISPI(const std::string& devPath, const nlohmann::json& calloutJSON)
+std::vector<device_callouts::Callout> calloutFSISPI(
+    const std::string& devPath, const nlohmann::json& calloutJSON)
 {
     auto linksAndSPI = getFSISPISearchKeys(devPath);
     auto links = std::get<std::string>(linksAndSPI);
@@ -445,8 +445,8 @@
  *
  * @return std::vector<Callout> - The list of callouts
  */
-std::vector<device_callouts::Callout>
-    findCallouts(const std::string& devPath, const nlohmann::json& json)
+std::vector<device_callouts::Callout> findCallouts(const std::string& devPath,
+                                                   const nlohmann::json& json)
 {
     std::vector<Callout> callouts;
     fs::path path;
@@ -523,9 +523,9 @@
     return util::findCallouts(devPath, json);
 }
 
-std::vector<Callout>
-    getI2CCallouts(size_t i2cBus, uint8_t i2cAddress,
-                   const std::vector<std::string>& compatibleList)
+std::vector<Callout> getI2CCallouts(
+    size_t i2cBus, uint8_t i2cAddress,
+    const std::vector<std::string>& compatibleList)
 {
     auto json = util::loadJSON(compatibleList);
     return util::calloutI2C(i2cBus, i2cAddress, json);
diff --git a/extensions/openpower-pels/device_callouts.hpp b/extensions/openpower-pels/device_callouts.hpp
index e9d1197..ae69f4b 100644
--- a/extensions/openpower-pels/device_callouts.hpp
+++ b/extensions/openpower-pels/device_callouts.hpp
@@ -113,9 +113,9 @@
  *                             system.
  * @return std::vector<Callout> - The list of callouts
  */
-std::vector<Callout>
-    getI2CCallouts(size_t i2cBus, uint8_t i2cAddress,
-                   const std::vector<std::string>& compatibleList);
+std::vector<Callout> getI2CCallouts(
+    size_t i2cBus, uint8_t i2cAddress,
+    const std::vector<std::string>& compatibleList);
 
 namespace util
 {
@@ -140,8 +140,8 @@
  *
  * @return path - The path to the file.
  */
-std::filesystem::path
-    getJSONFilename(const std::vector<std::string>& compatibleList);
+std::filesystem::path getJSONFilename(
+    const std::vector<std::string>& compatibleList);
 
 /**
  * @brief Looks up the callouts in the JSON using the I2C keys.
@@ -201,8 +201,8 @@
  * @return std::tuple<std::string, std::tuple<size_t, uint8_t>>
  *         - The FSI links key along with the I2C bus/address.
  */
-std::tuple<std::string, std::tuple<size_t, uint8_t>>
-    getFSII2CSearchKeys(const std::string& devPath);
+std::tuple<std::string, std::tuple<size_t, uint8_t>> getFSII2CSearchKeys(
+    const std::string& devPath);
 
 /**
  * @brief Pulls the fields out of the SPI device path to use as search keys
diff --git a/extensions/openpower-pels/extended_user_data.hpp b/extensions/openpower-pels/extended_user_data.hpp
index 07f9969..086dc9b 100644
--- a/extensions/openpower-pels/extended_user_data.hpp
+++ b/extensions/openpower-pels/extended_user_data.hpp
@@ -144,9 +144,9 @@
      * @return The JSON as a string if a parser was found,
      *         otherwise std::nullopt.
      */
-    std::optional<std::string>
-        getJSON(uint8_t creatorID,
-                const std::vector<std::string>& plugins) const override;
+    std::optional<std::string> getJSON(
+        uint8_t creatorID,
+        const std::vector<std::string>& plugins) const override;
 
     /**
      * @brief Shrink the section
diff --git a/extensions/openpower-pels/journal.cpp b/extensions/openpower-pels/journal.cpp
index c9789fb..f860062 100644
--- a/extensions/openpower-pels/journal.cpp
+++ b/extensions/openpower-pels/journal.cpp
@@ -68,8 +68,8 @@
     }
 }
 
-std::vector<std::string>
-    Journal::getMessages(const std::string& syslogID, size_t maxMessages) const
+std::vector<std::string> Journal::getMessages(const std::string& syslogID,
+                                              size_t maxMessages) const
 {
     // The message registry JSON schema will also fail if a zero is in the JSON
     if (0 == maxMessages)
diff --git a/extensions/openpower-pels/journal.hpp b/extensions/openpower-pels/journal.hpp
index 8873ff5..620ce50 100644
--- a/extensions/openpower-pels/journal.hpp
+++ b/extensions/openpower-pels/journal.hpp
@@ -30,8 +30,8 @@
      *
      * @return The messages
      */
-    virtual std::vector<std::string>
-        getMessages(const std::string& syslogID, size_t maxMessages) const = 0;
+    virtual std::vector<std::string> getMessages(const std::string& syslogID,
+                                                 size_t maxMessages) const = 0;
 
     /**
      * @brief Call journalctl --sync to write unwritten journal data to disk
diff --git a/extensions/openpower-pels/json_utils.cpp b/extensions/openpower-pels/json_utils.cpp
index ce2a27d..f95f406 100644
--- a/extensions/openpower-pels/json_utils.cpp
+++ b/extensions/openpower-pels/json_utils.cpp
@@ -252,8 +252,8 @@
  * @param[in] creatorID - The creator ID for the PEL
  * @return optional<string> - The comp name, or std::nullopt
  */
-static std::optional<std::string>
-    lookupComponentName(uint16_t compID, char creatorID)
+static std::optional<std::string> lookupComponentName(uint16_t compID,
+                                                      char creatorID)
 {
     static std::map<char, nlohmann::json> jsonCache;
     nlohmann::json jsonData;
diff --git a/extensions/openpower-pels/manager.cpp b/extensions/openpower-pels/manager.cpp
index 2b18d58..5b773c6 100644
--- a/extensions/openpower-pels/manager.cpp
+++ b/extensions/openpower-pels/manager.cpp
@@ -1004,8 +1004,8 @@
     }
 }
 
-void
-    Manager::updateProgressSRC(std::unique_ptr<openpower::pels::PEL>& pel) const
+void Manager::updateProgressSRC(
+    std::unique_ptr<openpower::pels::PEL>& pel) const
 {
     // Check for pel severity of type - 0x51 = critical error, system
     // termination
diff --git a/extensions/openpower-pels/pel.cpp b/extensions/openpower-pels/pel.cpp
index 9f09a01..1a5732d 100644
--- a/extensions/openpower-pels/pel.cpp
+++ b/extensions/openpower-pels/pel.cpp
@@ -987,8 +987,8 @@
     return data;
 }
 
-std::unique_ptr<UserData>
-    makeFFDCuserDataSection(uint16_t componentID, const PelFFDCfile& file)
+std::unique_ptr<UserData> makeFFDCuserDataSection(uint16_t componentID,
+                                                  const PelFFDCfile& file)
 {
     auto data = readFD(file.fd);
 
diff --git a/extensions/openpower-pels/pel.hpp b/extensions/openpower-pels/pel.hpp
index 5586187..d48151e 100644
--- a/extensions/openpower-pels/pel.hpp
+++ b/extensions/openpower-pels/pel.hpp
@@ -508,8 +508,8 @@
  * @param[in] componentID - The component ID of the PEL creator
  * @param[in] file - The FFDC file information
  */
-std::unique_ptr<UserData>
-    makeFFDCuserDataSection(uint16_t componentID, const PelFFDCfile& file);
+std::unique_ptr<UserData> makeFFDCuserDataSection(uint16_t componentID,
+                                                  const PelFFDCfile& file);
 
 /**
  * @brief To create JSON object with the given location code and the hex
diff --git a/extensions/openpower-pels/registry.cpp b/extensions/openpower-pels/registry.cpp
index f96c04e..7ab0c86 100644
--- a/extensions/openpower-pels/registry.cpp
+++ b/extensions/openpower-pels/registry.cpp
@@ -247,8 +247,8 @@
 
     return std::nullopt;
 }
-std::optional<std::vector<SRC::WordNum>>
-    getSRCSymptomIDFields(const nlohmann::json& src, const std::string& name)
+std::optional<std::vector<SRC::WordNum>> getSRCSymptomIDFields(
+    const nlohmann::json& src, const std::string& name)
 {
     std::vector<SRC::WordNum> symptomIDFields;
 
@@ -858,8 +858,8 @@
     return std::nullopt;
 }
 
-std::optional<nlohmann::json>
-    Registry::readRegistry(const std::filesystem::path& registryFile)
+std::optional<nlohmann::json> Registry::readRegistry(
+    const std::filesystem::path& registryFile)
 {
     // Look in /etc first in case someone put a test file there
     fs::path debugFile{fs::path{debugFilePath} / registryFileName};
@@ -889,10 +889,10 @@
     return registry;
 }
 
-std::vector<RegistryCallout>
-    Registry::getCallouts(const nlohmann::json& calloutJSON,
-                          const std::vector<std::string>& systemNames,
-                          const AdditionalData& additionalData)
+std::vector<RegistryCallout> Registry::getCallouts(
+    const nlohmann::json& calloutJSON,
+    const std::vector<std::string>& systemNames,
+    const AdditionalData& additionalData)
 {
     // The JSON may either use an AdditionalData key
     // as an index, or not.
diff --git a/extensions/openpower-pels/registry.hpp b/extensions/openpower-pels/registry.hpp
index b13b24d..f88ef99 100644
--- a/extensions/openpower-pels/registry.hpp
+++ b/extensions/openpower-pels/registry.hpp
@@ -301,10 +301,10 @@
      *
      * @return std::vector<RegistryCallout> - The callouts to use
      */
-    static std::vector<RegistryCallout>
-        getCallouts(const nlohmann::json& calloutJSON,
-                    const std::vector<std::string>& systemNames,
-                    const AdditionalData& additionalData);
+    static std::vector<RegistryCallout> getCallouts(
+        const nlohmann::json& calloutJSON,
+        const std::vector<std::string>& systemNames,
+        const AdditionalData& additionalData);
 
   private:
     /**
@@ -313,8 +313,8 @@
      * @return optional<nlohmann::json> The full message registry object or an
      *                                  empty optional object upon failure.
      */
-    std::optional<nlohmann::json>
-        readRegistry(const std::filesystem::path& registryFile);
+    std::optional<nlohmann::json> readRegistry(
+        const std::filesystem::path& registryFile);
 
     /**
      * @brief The path to the registry JSON file.
@@ -453,8 +453,8 @@
  *
  * @return std::optional<std::vector<SRC::WordNum>>
  */
-std::optional<std::vector<SRC::WordNum>>
-    getSRCSymptomIDFields(const nlohmann::json& src, const std::string& name);
+std::optional<std::vector<SRC::WordNum>> getSRCSymptomIDFields(
+    const nlohmann::json& src, const std::string& name);
 
 /**
  * @brief Returns the value of the 'DeconfigFlag' field.
diff --git a/extensions/openpower-pels/repository.cpp b/extensions/openpower-pels/repository.cpp
index a5a0b8c..1d1311e 100644
--- a/extensions/openpower-pels/repository.cpp
+++ b/extensions/openpower-pels/repository.cpp
@@ -587,8 +587,8 @@
            (_pelAttributes.size() > _maxNumPELs);
 }
 
-std::vector<Repository::AttributesReference>
-    Repository::getAllPELAttributes(SortOrder order) const
+std::vector<Repository::AttributesReference> Repository::getAllPELAttributes(
+    SortOrder order) const
 {
     std::vector<Repository::AttributesReference> attributes;
 
@@ -609,8 +609,8 @@
     return attributes;
 }
 
-std::vector<uint32_t>
-    Repository::prune(const std::vector<uint32_t>& idsWithHwIsoEntry)
+std::vector<uint32_t> Repository::prune(
+    const std::vector<uint32_t>& idsWithHwIsoEntry)
 {
     std::vector<uint32_t> obmcLogIDs;
     lg2::info("Pruning PEL repository that takes up {TOTAL} bytes and has "
diff --git a/extensions/openpower-pels/repository.hpp b/extensions/openpower-pels/repository.hpp
index c6683d8..483f619 100644
--- a/extensions/openpower-pels/repository.hpp
+++ b/extensions/openpower-pels/repository.hpp
@@ -307,8 +307,8 @@
      *
      * @return The attributes or an empty optional if not found
      */
-    std::optional<std::reference_wrapper<const PELAttributes>>
-        getPELAttributes(const LogID& id) const;
+    std::optional<std::reference_wrapper<const PELAttributes>> getPELAttributes(
+        const LogID& id) const;
 
     /**
      * @brief Returns the attributes map so that others can traverse PELs.
@@ -477,8 +477,8 @@
      *
      * @return an iterator to the entry
      */
-    std::map<LogID, PELAttributes>::const_iterator
-        findPEL(const LogID& id) const
+    std::map<LogID, PELAttributes>::const_iterator findPEL(
+        const LogID& id) const
     {
         return std::find_if(_pelAttributes.begin(), _pelAttributes.end(),
                             [&id](const auto& a) { return a.first == id; });
diff --git a/extensions/openpower-pels/section.hpp b/extensions/openpower-pels/section.hpp
index 08f164c..4c48bbf 100644
--- a/extensions/openpower-pels/section.hpp
+++ b/extensions/openpower-pels/section.hpp
@@ -70,10 +70,10 @@
      * @return std::optional<std::string> - If a section comes with a JSON
      * representation, this would return the string for it.
      */
-    virtual std::optional<std::string>
-        getJSON(message::Registry& /*registry*/,
-                const std::vector<std::string>& /*plugins*/,
-                uint8_t /*creatorID*/) const
+    virtual std::optional<std::string> getJSON(
+        message::Registry& /*registry*/,
+        const std::vector<std::string>& /*plugins*/,
+        uint8_t /*creatorID*/) const
     {
         return std::nullopt;
     }
@@ -85,9 +85,9 @@
      * @return std::optional<std::string> - If a section comes with a JSON
      * representation, this would return the string for it.
      */
-    virtual std::optional<std::string>
-        getJSON(uint8_t /*creatorID*/,
-                const std::vector<std::string>& /*plugins*/) const
+    virtual std::optional<std::string> getJSON(
+        uint8_t /*creatorID*/,
+        const std::vector<std::string>& /*plugins*/) const
     {
         return std::nullopt;
     }
diff --git a/extensions/openpower-pels/service_indicators.hpp b/extensions/openpower-pels/service_indicators.hpp
index e45a448..46e7b1f 100644
--- a/extensions/openpower-pels/service_indicators.hpp
+++ b/extensions/openpower-pels/service_indicators.hpp
@@ -128,8 +128,8 @@
      *
      * @return std::vector<std::string> - The inventory D-Bus paths
      */
-    std::vector<std::string>
-        getInventoryPaths(const std::vector<std::string>& locationCodes) const;
+    std::vector<std::string> getInventoryPaths(
+        const std::vector<std::string>& locationCodes) const;
 
     /**
      * @brief Sets the Functional property on the passed in
diff --git a/extensions/openpower-pels/severity.cpp b/extensions/openpower-pels/severity.cpp
index 36117a4..acac0f5 100644
--- a/extensions/openpower-pels/severity.cpp
+++ b/extensions/openpower-pels/severity.cpp
@@ -78,8 +78,8 @@
     return pelSeverity;
 }
 
-std::optional<LogSeverity>
-    fixupLogSeverity(LogSeverity obmcSeverity, SeverityType pelSeverity)
+std::optional<LogSeverity> fixupLogSeverity(LogSeverity obmcSeverity,
+                                            SeverityType pelSeverity)
 {
     bool isNonErrPelSev = (pelSeverity == SeverityType::nonError) ||
                           (pelSeverity == SeverityType::recovered);
diff --git a/extensions/openpower-pels/src.cpp b/extensions/openpower-pels/src.cpp
index a40bb8c..7b7e59f 100644
--- a/extensions/openpower-pels/src.cpp
+++ b/extensions/openpower-pels/src.cpp
@@ -545,8 +545,8 @@
     return std::nullopt;
 }
 
-std::optional<std::string>
-    SRC::getErrorMessage(const message::Entry& regEntry) const
+std::optional<std::string> SRC::getErrorMessage(
+    const message::Entry& regEntry) const
 {
     try
     {
@@ -707,10 +707,10 @@
     return printOut;
 }
 
-std::optional<std::string>
-    SRC::getJSON(message::Registry& registry,
-                 const std::vector<std::string>& plugins [[maybe_unused]],
-                 uint8_t creatorID) const
+std::optional<std::string> SRC::getJSON(message::Registry& registry,
+                                        const std::vector<std::string>& plugins
+                                        [[maybe_unused]],
+                                        uint8_t creatorID) const
 {
     std::string ps;
     std::vector<std::string> hexwords;
@@ -1424,8 +1424,8 @@
     return priority;
 }
 
-std::vector<src::MRU::MRUCallout>
-    SRC::getMRUsFromJSON(const nlohmann::json& mruJSON)
+std::vector<src::MRU::MRUCallout> SRC::getMRUsFromJSON(
+    const nlohmann::json& mruJSON)
 {
     std::vector<src::MRU::MRUCallout> mrus;
 
diff --git a/extensions/openpower-pels/src.hpp b/extensions/openpower-pels/src.hpp
index 2d1cdc5..ff302e0 100644
--- a/extensions/openpower-pels/src.hpp
+++ b/extensions/openpower-pels/src.hpp
@@ -272,9 +272,9 @@
      * @param[in] toCache - boolean to cache registry in memory, default=false
      * @return std::optional<std::string> - Error details
      */
-    std::optional<std::string>
-        getErrorDetails(message::Registry& registry, DetailLevel type,
-                        bool toCache = false) const;
+    std::optional<std::string> getErrorDetails(message::Registry& registry,
+                                               DetailLevel type,
+                                               bool toCache = false) const;
 
     /**
      * @brief Says if this SRC was created by the BMC (i.e. this code).
@@ -435,8 +435,8 @@
      * @param[in] regEntry - The message registry entry for the error
      * @return std::optional<std::string> - Error message
      */
-    std::optional<std::string>
-        getErrorMessage(const message::Entry& regEntry) const;
+    std::optional<std::string> getErrorMessage(
+        const message::Entry& regEntry) const;
 
     /**
      * @brief Get Callout info in JSON
@@ -581,8 +581,8 @@
      *
      * @param[in] mruJSON - The JSON array
      */
-    std::vector<src::MRU::MRUCallout>
-        getMRUsFromJSON(const nlohmann::json& mruJSON);
+    std::vector<src::MRU::MRUCallout> getMRUsFromJSON(
+        const nlohmann::json& mruJSON);
 
     /**
      * @brief The SRC version field
diff --git a/extensions/openpower-pels/user_data.hpp b/extensions/openpower-pels/user_data.hpp
index 7fc7ead..841596c 100644
--- a/extensions/openpower-pels/user_data.hpp
+++ b/extensions/openpower-pels/user_data.hpp
@@ -87,9 +87,9 @@
      * @return The JSON as a string if a parser was found,
      *         otherwise std::nullopt.
      */
-    std::optional<std::string>
-        getJSON(uint8_t creatorID,
-                const std::vector<std::string>& plugins) const override;
+    std::optional<std::string> getJSON(
+        uint8_t creatorID,
+        const std::vector<std::string>& plugins) const override;
 
     /**
      * @brief Shrink the section
diff --git a/extensions/openpower-pels/user_data_json.cpp b/extensions/openpower-pels/user_data_json.cpp
index 0d621ec..ed1259a 100644
--- a/extensions/openpower-pels/user_data_json.cpp
+++ b/extensions/openpower-pels/user_data_json.cpp
@@ -201,9 +201,9 @@
  * @return std::optional<std::string> - The JSON string if it could be created,
  *                                      else std::nullopt.
  */
-std::optional<std::string>
-    getBuiltinFormatJSON(uint16_t componentID, uint8_t subType, uint8_t version,
-                         const std::vector<uint8_t>& data, uint8_t creatorID)
+std::optional<std::string> getBuiltinFormatJSON(
+    uint16_t componentID, uint8_t subType, uint8_t version,
+    const std::vector<uint8_t>& data, uint8_t creatorID)
 {
     switch (subType)
     {
@@ -253,9 +253,9 @@
  * @return std::optional<std::string> - The JSON string if it could be created,
  *                                      else std::nullopt
  */
-std::optional<std::string>
-    getPythonJSON(uint16_t componentID, uint8_t subType, uint8_t version,
-                  const std::vector<uint8_t>& data, uint8_t creatorID)
+std::optional<std::string> getPythonJSON(
+    uint16_t componentID, uint8_t subType, uint8_t version,
+    const std::vector<uint8_t>& data, uint8_t creatorID)
 {
     PyObject *pName, *pModule, *eType, *eValue, *eTraceback, *pKey;
     std::string pErrStr;
@@ -392,10 +392,10 @@
     return std::nullopt;
 }
 
-std::optional<std::string>
-    getJSON(uint16_t componentID, uint8_t subType, uint8_t version,
-            const std::vector<uint8_t>& data, uint8_t creatorID,
-            const std::vector<std::string>& plugins)
+std::optional<std::string> getJSON(
+    uint16_t componentID, uint8_t subType, uint8_t version,
+    const std::vector<uint8_t>& data, uint8_t creatorID,
+    const std::vector<std::string>& plugins)
 {
     std::string subsystem = getNumberString("%c", tolower(creatorID));
     std::string component = getNumberString("%04x", componentID);
diff --git a/extensions/openpower-pels/user_data_json.hpp b/extensions/openpower-pels/user_data_json.hpp
index aaf146a..a59661a 100644
--- a/extensions/openpower-pels/user_data_json.hpp
+++ b/extensions/openpower-pels/user_data_json.hpp
@@ -20,9 +20,9 @@
  * @return std::optional<std::string> - The JSON string if it could be created,
  *                                      else std::nullopt.
  */
-std::optional<std::string>
-    getJSON(uint16_t componentID, uint8_t subType, uint8_t version,
-            const std::vector<uint8_t>& data, uint8_t creatorID,
-            const std::vector<std::string>& plugins);
+std::optional<std::string> getJSON(
+    uint16_t componentID, uint8_t subType, uint8_t version,
+    const std::vector<uint8_t>& data, uint8_t creatorID,
+    const std::vector<std::string>& plugins);
 
 } // namespace openpower::pels::user_data
diff --git a/extensions/openpower-pels/user_header.hpp b/extensions/openpower-pels/user_header.hpp
index 5bfe6d3..4d3e7cf 100644
--- a/extensions/openpower-pels/user_header.hpp
+++ b/extensions/openpower-pels/user_header.hpp
@@ -253,9 +253,9 @@
      *                         structures to find an entry in.
      * @param[in] dataIface - The DataInterface object
      */
-    std::optional<uint8_t>
-        getSeverity(const std::vector<message::RegistrySeverity>& severities,
-                    const DataInterfaceBase& dataIface) const;
+    std::optional<uint8_t> getSeverity(
+        const std::vector<message::RegistrySeverity>& severities,
+        const DataInterfaceBase& dataIface) const;
 
     /**
      * @brief The subsystem associated with the event.
