diff --git a/selutility.cpp b/selutility.cpp
index 5935de2..8e04ad4 100644
--- a/selutility.cpp
+++ b/selutility.cpp
@@ -4,25 +4,29 @@
 #include <filesystem>
 #elif __has_include(<experimental/filesystem>)
 #include <experimental/filesystem>
-namespace std {
-  // splice experimental::filesystem into std
-  namespace filesystem = std::experimental::filesystem;
-}
+namespace std
+{
+// splice experimental::filesystem into std
+namespace filesystem = std::experimental::filesystem;
+} // namespace std
 #else
-#  error filesystem not available
+#error filesystem not available
 #endif
-#include <phosphor-logging/elog-errors.hpp>
-#include "host-ipmid/ipmid-api.h"
-#include "xyz/openbmc_project/Common/error.hpp"
 #include "config.h"
+
 #include "selutility.hpp"
 #include "types.hpp"
 #include "utils.hpp"
 
+#include <phosphor-logging/elog-errors.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+#include "host-ipmid/ipmid-api.h"
+
 extern const ipmi::sensor::InvObjectIDMap invSensors;
 using namespace phosphor::logging;
 using InternalFailure =
-        sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
+    sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
 
 namespace ipmi
 {
@@ -33,20 +37,18 @@
 namespace internal
 {
 
-GetSELEntryResponse prepareSELEntry(
-        const std::string& objPath,
-        ipmi::sensor::InvObjectIDMap::const_iterator iter)
+GetSELEntryResponse
+    prepareSELEntry(const std::string& objPath,
+                    ipmi::sensor::InvObjectIDMap::const_iterator iter)
 {
-    GetSELEntryResponse record {};
+    GetSELEntryResponse record{};
 
     sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()};
     auto service = ipmi::getService(bus, logEntryIntf, objPath);
 
     // Read all the log entry properties.
-    auto methodCall = bus.new_method_call(service.c_str(),
-                                          objPath.c_str(),
-                                          propIntf,
-                                          "GetAll");
+    auto methodCall = bus.new_method_call(service.c_str(), objPath.c_str(),
+                                          propIntf, "GetAll");
     methodCall.append(logEntryIntf);
 
     auto reply = bus.call(methodCall);
@@ -69,7 +71,7 @@
     }
 
     record.recordID = static_cast<uint16_t>(
-            sdbusplus::message::variant_ns::get<uint32_t>(iterId->second));
+        sdbusplus::message::variant_ns::get<uint32_t>(iterId->second));
 
     // Read Timestamp from the log entry.
     static constexpr auto propTimeStamp = "Timestamp";
@@ -81,10 +83,10 @@
     }
 
     std::chrono::milliseconds chronoTimeStamp(
-            sdbusplus::message::variant_ns::get<uint64_t>
-            (iterTimeStamp->second));
-    record.timeStamp = static_cast<uint32_t>(std::chrono::duration_cast<
-            std::chrono::seconds>(chronoTimeStamp).count());
+        sdbusplus::message::variant_ns::get<uint64_t>(iterTimeStamp->second));
+    record.timeStamp = static_cast<uint32_t>(
+        std::chrono::duration_cast<std::chrono::seconds>(chronoTimeStamp)
+            .count());
 
     static constexpr auto systemEventRecord = 0x02;
     static constexpr auto generatorID = 0x2000;
@@ -134,10 +136,8 @@
     auto service = ipmi::getService(bus, assocIntf, objPath);
 
     // Read the Associations interface.
-    auto methodCall = bus.new_method_call(service.c_str(),
-                                          objPath.c_str(),
-                                          propIntf,
-                                          "Get");
+    auto methodCall =
+        bus.new_method_call(service.c_str(), objPath.c_str(), propIntf, "Get");
     methodCall.append(assocIntf);
     methodCall.append(assocProp);
 
@@ -148,14 +148,13 @@
         elog<InternalFailure>();
     }
 
-    using AssociationList = std::vector<std::tuple<
-                            std::string, std::string, std::string>>;
+    using AssociationList =
+        std::vector<std::tuple<std::string, std::string, std::string>>;
 
     sdbusplus::message::variant<AssociationList> list;
     reply.read(list);
 
-    auto& assocs = sdbusplus::message::variant_ns::get<AssociationList>
-         (list);
+    auto& assocs = sdbusplus::message::variant_ns::get<AssociationList>(list);
 
     /*
      * Check if the log entry has any callout associations, if there is a
@@ -166,18 +165,18 @@
     {
         if (std::get<0>(item).compare(CALLOUT_FWD_ASSOCIATION) == 0)
         {
-             auto iter = invSensors.find(std::get<2>(item));
-             if (iter == invSensors.end())
-             {
-                 iter = invSensors.find(BOARD_SENSOR);
-                 if (iter == invSensors.end())
-                 {
-                     log<level::ERR>("Motherboard sensor not found");
-                     elog<InternalFailure>();
-                 }
-             }
+            auto iter = invSensors.find(std::get<2>(item));
+            if (iter == invSensors.end())
+            {
+                iter = invSensors.find(BOARD_SENSOR);
+                if (iter == invSensors.end())
+                {
+                    log<level::ERR>("Motherboard sensor not found");
+                    elog<InternalFailure>();
+                }
+            }
 
-             return internal::prepareSELEntry(objPath, iter);
+            return internal::prepareSELEntry(objPath, iter);
         }
     }
 
@@ -202,10 +201,8 @@
     using namespace std::string_literals;
     static const auto propTimeStamp = "Timestamp"s;
 
-    auto methodCall = bus.new_method_call(service.c_str(),
-                                          objPath.c_str(),
-                                          propIntf,
-                                          "Get");
+    auto methodCall =
+        bus.new_method_call(service.c_str(), objPath.c_str(), propIntf, "Get");
     methodCall.append(logEntryIntf);
     methodCall.append(propTimeStamp);
 
@@ -220,7 +217,7 @@
     reply.read(timeStamp);
 
     std::chrono::milliseconds chronoTimeStamp(
-            sdbusplus::message::variant_ns::get<uint64_t>(timeStamp));
+        sdbusplus::message::variant_ns::get<uint64_t>(timeStamp));
 
     return std::chrono::duration_cast<std::chrono::seconds>(chronoTimeStamp);
 }
@@ -231,10 +228,8 @@
     auto depth = 0;
     paths.clear();
 
-    auto mapperCall = bus.new_method_call(mapperBusName,
-                                          mapperObjPath,
-                                          mapperIntf,
-                                          "GetSubTreePaths");
+    auto mapperCall = bus.new_method_call(mapperBusName, mapperObjPath,
+                                          mapperIntf, "GetSubTreePaths");
     mapperCall.append(logBasePath);
     mapperCall.append(depth);
     mapperCall.append(ObjectPaths({logEntryIntf}));
@@ -248,17 +243,16 @@
     {
         reply.read(paths);
 
-        std::sort(paths.begin(), paths.end(), [](const std::string& a,
-                                                 const std::string& b)
-        {
-            namespace fs = std::filesystem;
-            fs::path pathA(a);
-            fs::path pathB(b);
-            auto idA = std::stoul(pathA.filename().string());
-            auto idB = std::stoul(pathB.filename().string());
+        std::sort(paths.begin(), paths.end(),
+                  [](const std::string& a, const std::string& b) {
+                      namespace fs = std::filesystem;
+                      fs::path pathA(a);
+                      fs::path pathB(b);
+                      auto idA = std::stoul(pathA.filename().string());
+                      auto idB = std::stoul(pathB.filename().string());
 
-            return idA < idB;
-        });
+                      return idA < idB;
+                  });
     }
 }
 
