diff --git a/.clang-format b/.clang-format
index a75a2c2..e5530e6 100644
--- a/.clang-format
+++ b/.clang-format
@@ -104,7 +104,7 @@
 PenaltyBreakString: 1000
 PenaltyBreakTemplateDeclaration: 10
 PenaltyExcessCharacter: 1000000
-PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyReturnTypeOnItsOwnLine: 150
 PenaltyIndentedWhitespace: 1
 PointerAlignment: Left
 QualifierAlignment: Left
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.
diff --git a/log_manager.cpp b/log_manager.cpp
index a7f4494..40c263c 100644
--- a/log_manager.cpp
+++ b/log_manager.cpp
@@ -268,9 +268,9 @@
     return objPath;
 }
 
-auto
-    Manager::createFromEvent(sdbusplus::exception::generated_event_base&& event)
-        -> sdbusplus::message::object_path
+auto Manager::createFromEvent(
+    sdbusplus::exception::generated_event_base&& event)
+    -> sdbusplus::message::object_path
 {
     auto [msg, level, data] = lg2::details::extractEvent(std::move(event));
     return this->createEntry(msg, level, std::move(data));
diff --git a/phosphor-rsyslog-config/server-conf.cpp b/phosphor-rsyslog-config/server-conf.cpp
index f2a7aa8..893b987 100644
--- a/phosphor-rsyslog-config/server-conf.cpp
+++ b/phosphor-rsyslog-config/server-conf.cpp
@@ -189,8 +189,8 @@
     return result;
 }
 
-NetworkClient::TransportProtocol
-    Server::transportProtocol(NetworkClient::TransportProtocol value)
+NetworkClient::TransportProtocol Server::transportProtocol(
+    NetworkClient::TransportProtocol value)
 {
     TransportProtocol result{};
 
diff --git a/phosphor-rsyslog-config/server-conf.hpp b/phosphor-rsyslog-config/server-conf.hpp
index 33e92aa..fd4b552 100644
--- a/phosphor-rsyslog-config/server-conf.hpp
+++ b/phosphor-rsyslog-config/server-conf.hpp
@@ -86,8 +86,8 @@
      *  @param[in] value - UDP/TCP.
      *  @returns protocol value
      */
-    virtual TransportProtocol
-        transportProtocol(TransportProtocol protocol) override;
+    virtual TransportProtocol transportProtocol(
+        TransportProtocol protocol) override;
 
   private:
     /** @brief Update remote server address and port in
diff --git a/test/openpower-pels/pel_utils.hpp b/test/openpower-pels/pel_utils.hpp
index da38fa9..18dc716 100644
--- a/test/openpower-pels/pel_utils.hpp
+++ b/test/openpower-pels/pel_utils.hpp
@@ -124,5 +124,5 @@
  *
  * @return std::unique_ptr<std::vector<uint8_t>> - the data from the file
  */
-std::unique_ptr<std::vector<uint8_t>>
-    readPELFile(const std::filesystem::path& path);
+std::unique_ptr<std::vector<uint8_t>> readPELFile(
+    const std::filesystem::path& path);
