diff --git a/extensions/openpower-pels/data_interface.cpp b/extensions/openpower-pels/data_interface.cpp
index 4a91fd0..ead3c16 100644
--- a/extensions/openpower-pels/data_interface.cpp
+++ b/extensions/openpower-pels/data_interface.cpp
@@ -151,14 +151,14 @@
     _properties.emplace_back(std::make_unique<PropertyWatcher<DataInterface>>(
         bus, object_path::enableHostPELs, interface::enable, "Enabled", *this,
         [this](const auto& value) {
-            if (std::get<bool>(value) != this->_sendPELsToHost)
-            {
-                log<level::INFO>(
-                    fmt::format("The send PELs to host setting changed to {}",
-                                std::get<bool>(value))
-                        .c_str());
-            }
-            this->_sendPELsToHost = std::get<bool>(value);
+        if (std::get<bool>(value) != this->_sendPELsToHost)
+        {
+            log<level::INFO>(
+                fmt::format("The send PELs to host setting changed to {}",
+                            std::get<bool>(value))
+                    .c_str());
+        }
+        this->_sendPELsToHost = std::get<bool>(value);
         }));
 
     // Watch the BMCState property
@@ -172,17 +172,17 @@
     _properties.emplace_back(std::make_unique<InterfaceWatcher<DataInterface>>(
         bus, object_path::chassisState, interface::chassisState, *this,
         [this](const auto& properties) {
-            auto state = properties.find("CurrentPowerState");
-            if (state != properties.end())
-            {
-                this->_chassisState = std::get<std::string>(state->second);
-            }
+        auto state = properties.find("CurrentPowerState");
+        if (state != properties.end())
+        {
+            this->_chassisState = std::get<std::string>(state->second);
+        }
 
-            auto trans = properties.find("RequestedPowerTransition");
-            if (trans != properties.end())
-            {
-                this->_chassisTransition = std::get<std::string>(trans->second);
-            }
+        auto trans = properties.find("RequestedPowerTransition");
+        if (trans != properties.end())
+        {
+            this->_chassisTransition = std::get<std::string>(trans->second);
+        }
         }));
 
     // Watch the CurrentHostState property
@@ -197,19 +197,18 @@
         bus, object_path::biosConfigMgr, interface::biosConfigMgr,
         "BaseBIOSTable", service_name::biosConfigMgr, *this,
         [this](const auto& value) {
-            const auto& attributes = std::get<BiosAttributes>(value);
+        const auto& attributes = std::get<BiosAttributes>(value);
 
-            auto it = attributes.find("pvm_hmc_managed");
-            if (it != attributes.end())
+        auto it = attributes.find("pvm_hmc_managed");
+        if (it != attributes.end())
+        {
+            const auto& currentValVariant = std::get<5>(it->second);
+            auto currentVal = std::get_if<std::string>(&currentValVariant);
+            if (currentVal)
             {
-                const auto& currentValVariant = std::get<5>(it->second);
-                auto currentVal = std::get_if<std::string>(&currentValVariant);
-                if (currentVal)
-                {
-                    this->_hmcManaged = (*currentVal == "Enabled") ? true
-                                                                   : false;
-                }
+                this->_hmcManaged = (*currentVal == "Enabled") ? true : false;
             }
+        }
         }));
 }
 
diff --git a/extensions/openpower-pels/pel.cpp b/extensions/openpower-pels/pel.cpp
index 3b7ecf5..4e16fc5 100644
--- a/extensions/openpower-pels/pel.cpp
+++ b/extensions/openpower-pels/pel.cpp
@@ -64,11 +64,11 @@
 #ifdef PEL_ENABLE_PHAL
     // Add sbe ffdc processed data into ffdcfiles.
     namespace sbe = openpower::pels::sbe;
-    auto processReq =
-        std::any_of(ffdcFiles.begin(), ffdcFiles.end(), [](const auto& file) {
-            return file.format == UserDataFormat::custom &&
-                   file.subType == sbe::sbeFFDCSubType;
-        });
+    auto processReq = std::any_of(ffdcFiles.begin(), ffdcFiles.end(),
+                                  [](const auto& file) {
+        return file.format == UserDataFormat::custom &&
+               file.subType == sbe::sbeFFDCSubType;
+    });
     // sbeFFDC can't be destroyed until the end of the PEL constructor
     // because it needs to keep around the FFDC Files to be used below.
     std::unique_ptr<sbe::SbeFFDC> sbeFFDCPtr;
@@ -309,11 +309,11 @@
 
 std::optional<SRC*> PEL::primarySRC() const
 {
-    auto src = std::find_if(
-        _optionalSections.begin(), _optionalSections.end(), [](auto& section) {
-            return section->header().id ==
-                   static_cast<uint16_t>(SectionID::primarySRC);
-        });
+    auto src = std::find_if(_optionalSections.begin(), _optionalSections.end(),
+                            [](auto& section) {
+        return section->header().id ==
+               static_cast<uint16_t>(SectionID::primarySRC);
+    });
     if (src != _optionalSections.end())
     {
         return static_cast<SRC*>(src->get());
@@ -554,11 +554,11 @@
     {
         // Get the ED section from PEL
         auto op = std::find_if(_optionalSections.begin(),
-                               _optionalSections.end(), [](auto& section) {
-                                   return section->header().id ==
-                                          static_cast<uint16_t>(
-                                              SectionID::extUserData);
-                               });
+                               _optionalSections.end(),
+                               [](auto& section) {
+            return section->header().id ==
+                   static_cast<uint16_t>(SectionID::extUserData);
+        });
 
         // Check for ED section found and its not the last section of PEL
         if (op != _optionalSections.end())
diff --git a/extensions/openpower-pels/pel_values.cpp b/extensions/openpower-pels/pel_values.cpp
index a94606c..e52f7e1 100644
--- a/extensions/openpower-pels/pel_values.cpp
+++ b/extensions/openpower-pels/pel_values.cpp
@@ -252,8 +252,8 @@
 {
     return std::find_if(fields.begin(), fields.end(),
                         [value](const auto& entry) {
-                            return value == std::get<fieldValuePos>(entry);
-                        });
+        return value == std::get<fieldValuePos>(entry);
+    });
 }
 
 PELValues::const_iterator findByName(const std::string& name,
@@ -262,8 +262,8 @@
 {
     return std::find_if(fields.begin(), fields.end(),
                         [&name](const auto& entry) {
-                            return name == std::get<registryNamePos>(entry);
-                        });
+        return name == std::get<registryNamePos>(entry);
+    });
 }
 
 /**
@@ -357,13 +357,13 @@
                                           const pel_values::PELValues& table)
 {
     std::vector<std::string> foundValues;
-    std::for_each(
-        table.begin(), table.end(), [&value, &foundValues](const auto& entry) {
-            if (value & std::get<fieldValuePos>(entry))
-            {
-                foundValues.push_back(std::get<descriptionPos>(entry));
-            }
-        });
+    std::for_each(table.begin(), table.end(),
+                  [&value, &foundValues](const auto& entry) {
+        if (value & std::get<fieldValuePos>(entry))
+        {
+            foundValues.push_back(std::get<descriptionPos>(entry));
+        }
+    });
     return foundValues;
 }
 
diff --git a/extensions/openpower-pels/registry.cpp b/extensions/openpower-pels/registry.cpp
index c9c4169..e646928 100644
--- a/extensions/openpower-pels/registry.cpp
+++ b/extensions/openpower-pels/registry.cpp
@@ -560,10 +560,10 @@
     const auto& callouts = json["CalloutsWithTheirADValues"];
 
     // find the entry with that AD value
-    auto it = std::find_if(
-        callouts.begin(), callouts.end(), [adValue](const nlohmann::json& j) {
-            return *adValue == j["ADValue"].get<std::string>();
-        });
+    auto it = std::find_if(callouts.begin(), callouts.end(),
+                           [adValue](const nlohmann::json& j) {
+        return *adValue == j["ADValue"].get<std::string>();
+    });
 
     if (it == callouts.end())
     {
@@ -658,13 +658,12 @@
     auto& reg = (_registry) ? _registry : registryTmp;
     const auto& registry = reg.value();
     // Find an entry with this name in the PEL array.
-    auto e = std::find_if(
-        registry["PELs"].begin(), registry["PELs"].end(),
-        [&name, &type](const auto& j) {
-            return ((name == j["Name"] && type == LookupType::name) ||
-                    (name == j["SRC"]["ReasonCode"] &&
-                     type == LookupType::reasonCode));
-        });
+    auto e = std::find_if(registry["PELs"].begin(), registry["PELs"].end(),
+                          [&name, &type](const auto& j) {
+        return (
+            (name == j["Name"] && type == LookupType::name) ||
+            (name == j["SRC"]["ReasonCode"] && type == LookupType::reasonCode));
+    });
 
     if (e != registry["PELs"].end())
     {
diff --git a/extensions/openpower-pels/repository.cpp b/extensions/openpower-pels/repository.cpp
index e04b9a8..b19ce7a 100644
--- a/extensions/openpower-pels/repository.cpp
+++ b/extensions/openpower-pels/repository.cpp
@@ -566,18 +566,19 @@
 {
     std::vector<Repository::AttributesReference> attributes;
 
-    std::for_each(
-        _pelAttributes.begin(), _pelAttributes.end(),
-        [&attributes](auto& pelEntry) { attributes.push_back(pelEntry); });
+    std::for_each(_pelAttributes.begin(), _pelAttributes.end(),
+                  [&attributes](auto& pelEntry) {
+        attributes.push_back(pelEntry);
+    });
 
     std::sort(attributes.begin(), attributes.end(),
               [order](const auto& left, const auto& right) {
-                  if (order == SortOrder::ascending)
-                  {
-                      return left.get().second.path < right.get().second.path;
-                  }
-                  return left.get().second.path > right.get().second.path;
-              });
+        if (order == SortOrder::ascending)
+        {
+            return left.get().second.path < right.get().second.path;
+        }
+        return left.get().second.path > right.get().second.path;
+    });
 
     return attributes;
 }
@@ -696,18 +697,18 @@
     //   Pass 4: delete all PELs
     static const std::vector<std::function<bool(const PELAttributes& pel)>>
         stateChecks{[](const auto& pel) {
-                        return pel.hmcState == TransmissionState::acked;
+        return pel.hmcState == TransmissionState::acked;
                     },
 
                     [](const auto& pel) {
-                        return pel.hostState == TransmissionState::acked;
-                    },
+        return pel.hostState == TransmissionState::acked;
+        },
 
-                    [](const auto& pel) {
-                        return pel.hostState == TransmissionState::sent;
-                    },
+        [](const auto& pel) {
+        return pel.hostState == TransmissionState::sent;
+        },
 
-                    [](const auto& /*pel*/) { return true; }};
+        [](const auto& /*pel*/) { return true; }};
 
     for (const auto& stateCheck : stateChecks)
     {
diff --git a/extensions/openpower-pels/src.cpp b/extensions/openpower-pels/src.cpp
index dc75e07..338c323 100644
--- a/extensions/openpower-pels/src.cpp
+++ b/extensions/openpower-pels/src.cpp
@@ -1558,8 +1558,8 @@
 
         if (std::all_of(progressCodeString.begin(), progressCodeString.end(),
                         [](char c) {
-                            return std::isxdigit(static_cast<unsigned char>(c));
-                        }))
+            return std::isxdigit(static_cast<unsigned char>(c));
+            }))
         {
             progressCode = std::stoul(progressCodeString, nullptr, 16);
         }
diff --git a/extensions/openpower-pels/tools/peltool.cpp b/extensions/openpower-pels/tools/peltool.cpp
index 39cb1e5..063127f 100644
--- a/extensions/openpower-pels/tools/peltool.cpp
+++ b/extensions/openpower-pels/tools/peltool.cpp
@@ -496,8 +496,8 @@
     // Sort the pairs based on second time parameter
     std::sort(PELs.begin(), PELs.end(),
               [](const auto& left, const auto& right) {
-                  return left.second < right.second;
-              });
+        return left.second < right.second;
+    });
 
     bool foundPEL = false;
 
