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/chassishandler.cpp b/chassishandler.cpp
index 3b4c860..4b8a581 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -1239,8 +1239,8 @@
     SoftReset = 0xa,
 };
 
-static IpmiRestartCause
-    restartCauseToIpmiRestartCause(State::Host::RestartCause cause)
+static IpmiRestartCause restartCauseToIpmiRestartCause(
+    State::Host::RestartCause cause)
 {
     switch (cause)
     {
diff --git a/dbus-sdr/sdrutils.cpp b/dbus-sdr/sdrutils.cpp
index 0c77ef7..303a696 100644
--- a/dbus-sdr/sdrutils.cpp
+++ b/dbus-sdr/sdrutils.cpp
@@ -286,8 +286,8 @@
 
 #ifdef FEATURE_HYBRID_SENSORS
 // Static sensors are listed in sensor-gen.cpp.
-ipmi::sensor::IdInfoMap::const_iterator
-    findStaticSensor(const std::string& path)
+ipmi::sensor::IdInfoMap::const_iterator findStaticSensor(
+    const std::string& path)
 {
     return std::find_if(
         ipmi::sensor::sensors.begin(), ipmi::sensor::sensors.end(),
@@ -411,8 +411,8 @@
     return interfacesResponse;
 }
 
-std::map<std::string, Value>
-    getEntityManagerProperties(const char* path, const char* interface)
+std::map<std::string, Value> getEntityManagerProperties(const char* path,
+                                                        const char* interface)
 {
     std::map<std::string, Value> properties;
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
@@ -439,8 +439,8 @@
 
 // Fetch the ipmiDecoratorPaths to get the list of dbus objects that
 // have ipmi decorator to prevent unnessary dbus call to fetch the info
-std::optional<std::unordered_set<std::string>>&
-    getIpmiDecoratorPaths(const std::optional<ipmi::Context::ptr>& ctx)
+std::optional<std::unordered_set<std::string>>& getIpmiDecoratorPaths(
+    const std::optional<ipmi::Context::ptr>& ctx)
 {
     static std::optional<std::unordered_set<std::string>> ipmiDecoratorPaths;
 
diff --git a/dbus-sdr/sensorcommands.cpp b/dbus-sdr/sensorcommands.cpp
index b36ffe8..2ef33b9 100644
--- a/dbus-sdr/sensorcommands.cpp
+++ b/dbus-sdr/sensorcommands.cpp
@@ -411,8 +411,8 @@
 namespace sensor
 {
 // Read VR profiles from sensor(daemon) interface
-static std::optional<std::vector<std::string>>
-    getSupportedVrProfiles(const ipmi::DbusInterfaceMap::mapped_type& object)
+static std::optional<std::vector<std::string>> getSupportedVrProfiles(
+    const ipmi::DbusInterfaceMap::mapped_type& object)
 {
     // get VR mode profiles from Supported Interface
     auto supportedProperty = object.find("Supported");
@@ -472,9 +472,9 @@
 }
 
 // Calculate sensor value from IPMI reading byte
-static std::optional<double>
-    calculateValue(uint8_t reading, const ipmi::DbusInterfaceMap& sensorMap,
-                   const ipmi::DbusInterfaceMap::mapped_type& valueObject)
+static std::optional<double> calculateValue(
+    uint8_t reading, const ipmi::DbusInterfaceMap& sensorMap,
+    const ipmi::DbusInterfaceMap::mapped_type& valueObject)
 {
     if (valueObject.find("Value") == valueObject.end())
     {
diff --git a/dbus-sdr/storagecommands.cpp b/dbus-sdr/storagecommands.cpp
index fa27f22..d169367 100644
--- a/dbus-sdr/storagecommands.cpp
+++ b/dbus-sdr/storagecommands.cpp
@@ -232,8 +232,8 @@
     recalculateHashes();
 }
 
-std::pair<ipmi::Cc, std::vector<uint8_t>>
-    getFru(ipmi::Context::ptr ctx, uint8_t devId)
+std::pair<ipmi::Cc, std::vector<uint8_t>> getFru(ipmi::Context::ptr ctx,
+                                                 uint8_t devId)
 {
     if (lastDevId == devId && devId != 0xFF)
     {
@@ -816,9 +816,9 @@
     return false;
 }
 
-static uint16_t
-    getNextRecordID(const uint16_t recordID,
-                    const std::vector<std::filesystem::path>& selLogFiles)
+static uint16_t getNextRecordID(
+    const uint16_t recordID,
+    const std::vector<std::filesystem::path>& selLogFiles)
 {
     uint16_t nextRecordID = recordID + 1;
     std::string entry;
@@ -1140,9 +1140,9 @@
   uint8_t eventType, uint8_t eventData1, uint8_t eventData2,
   uint8_t eventData3
 */
-ipmi::RspType<uint16_t>
-    ipmiStorageAddSELEntry(uint16_t, uint8_t, uint32_t, uint16_t, uint8_t,
-                           uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
+ipmi::RspType<uint16_t> ipmiStorageAddSELEntry(
+    uint16_t, uint8_t, uint32_t, uint16_t, uint8_t, uint8_t, uint8_t, uint8_t,
+    uint8_t, uint8_t, uint8_t)
 {
     // Per the IPMI spec, need to cancel any reservation when a SEL entry is
     // added
diff --git a/dcmihandler.cpp b/dcmihandler.cpp
index 304a764..769081a 100644
--- a/dcmihandler.cpp
+++ b/dcmihandler.cpp
@@ -262,8 +262,8 @@
     return hostname;
 }
 
-std::optional<EthernetInterface::DHCPConf>
-    getDHCPEnabled(ipmi::Context::ptr& ctx)
+std::optional<EthernetInterface::DHCPConf> getDHCPEnabled(
+    ipmi::Context::ptr& ctx)
 {
     auto ethdevice = ipmi::getChannelName(ethernetDefaultChannelNum);
     ipmi::DbusObjectInfo ethernetObj{};
@@ -579,9 +579,9 @@
     return ipmi::responseSuccess(nameSize, data);
 }
 
-ipmi::RspType<uint8_t>
-    setMgmntCtrlIdStr(ipmi::Context::ptr& ctx, uint8_t offset, uint8_t count,
-                      std::vector<char> data)
+ipmi::RspType<uint8_t> setMgmntCtrlIdStr(ipmi::Context::ptr& ctx,
+                                         uint8_t offset, uint8_t count,
+                                         std::vector<char> data)
 {
     if ((offset > dcmi::maxCtrlIdStrLen) || (count > dcmi::maxBytes) ||
         ((offset + count) > dcmi::maxCtrlIdStrLen))
@@ -739,9 +739,9 @@
 namespace temp_readings
 {
 
-std::tuple<bool, bool, uint8_t>
-    readTemp(ipmi::Context::ptr& ctx, const std::string& dbusService,
-             const std::string& dbusPath)
+std::tuple<bool, bool, uint8_t> readTemp(ipmi::Context::ptr& ctx,
+                                         const std::string& dbusService,
+                                         const std::string& dbusPath)
 {
     // Read the temperature value from d-bus object. Need some conversion.
     // As per the interface xyz.openbmc_project.Sensor.Value, the
@@ -780,9 +780,9 @@
                            static_cast<uint8_t>(tempDegrees));
 }
 
-std::tuple<std::vector<std::tuple<uint7_t, bool, uint8_t>>, uint8_t>
-    read(ipmi::Context::ptr& ctx, const std::string& type, uint8_t instance,
-         size_t count)
+std::tuple<std::vector<std::tuple<uint7_t, bool, uint8_t>>, uint8_t> read(
+    ipmi::Context::ptr& ctx, const std::string& type, uint8_t instance,
+    size_t count)
 {
     std::vector<std::tuple<uint7_t, bool, uint8_t>> response{};
 
@@ -1105,9 +1105,9 @@
 namespace sensor_info
 {
 
-std::tuple<std::vector<uint16_t>, uint8_t>
-    read(const std::string& type, uint8_t instance,
-         const nlohmann::json& config, uint8_t count)
+std::tuple<std::vector<uint16_t>, uint8_t> read(
+    const std::string& type, uint8_t instance, const nlohmann::json& config,
+    uint8_t count)
 {
     std::vector<uint16_t> responses{};
 
diff --git a/include/dbus-sdr/sdrutils.hpp b/include/dbus-sdr/sdrutils.hpp
index db462db..b52351d 100644
--- a/include/dbus-sdr/sdrutils.hpp
+++ b/include/dbus-sdr/sdrutils.hpp
@@ -286,8 +286,8 @@
 bool getSensorSubtree(SensorSubTree& subtree);
 
 #ifdef FEATURE_HYBRID_SENSORS
-ipmi::sensor::IdInfoMap::const_iterator
-    findStaticSensor(const std::string& path);
+ipmi::sensor::IdInfoMap::const_iterator findStaticSensor(
+    const std::string& path);
 #endif
 
 struct CmpStr
@@ -345,11 +345,11 @@
 std::optional<std::map<std::string, std::vector<std::string>>>
     getObjectInterfaces(const char* path);
 
-std::map<std::string, Value>
-    getEntityManagerProperties(const char* path, const char* interface);
+std::map<std::string, Value> getEntityManagerProperties(const char* path,
+                                                        const char* interface);
 
-std::optional<std::unordered_set<std::string>>&
-    getIpmiDecoratorPaths(const std::optional<ipmi::Context::ptr>& ctx);
+std::optional<std::unordered_set<std::string>>& getIpmiDecoratorPaths(
+    const std::optional<ipmi::Context::ptr>& ctx);
 
 const std::string* getSensorConfigurationInterface(
     const std::map<std::string, std::vector<std::string>>&
diff --git a/include/ipmid/handler.hpp b/include/ipmid/handler.hpp
index 77f6670..4337b17 100644
--- a/include/ipmid/handler.hpp
+++ b/include/ipmid/handler.hpp
@@ -43,16 +43,16 @@
 {
 
 template <typename... Args>
-static inline message::Response::ptr
-    errorResponse(message::Request::ptr request, ipmi::Cc cc, Args&&... args)
+static inline message::Response::ptr errorResponse(
+    message::Request::ptr request, ipmi::Cc cc, Args&&... args)
 {
     message::Response::ptr response = request->makeResponse();
     response->cc = cc;
     response->pack(args...);
     return response;
 }
-static inline message::Response::ptr
-    errorResponse(message::Request::ptr request, ipmi::Cc cc)
+static inline message::Response::ptr errorResponse(
+    message::Request::ptr request, ipmi::Cc cc)
 {
     message::Response::ptr response = request->makeResponse();
     response->cc = cc;
@@ -141,8 +141,8 @@
      *
      * @return a shared_ptr to a Response object
      */
-    virtual message::Response::ptr
-        executeCallback(message::Request::ptr request) = 0;
+    virtual message::Response::ptr executeCallback(
+        message::Request::ptr request) = 0;
 };
 
 /**
@@ -181,8 +181,8 @@
      *
      * @return a shared_ptr to a Response object
      */
-    message::Response::ptr
-        executeCallback(message::Request::ptr request) override
+    message::Response::ptr executeCallback(
+        message::Request::ptr request) override
     {
         message::Response::ptr response = request->makeResponse();
 
@@ -346,8 +346,8 @@
      *
      * @return a shared_ptr to a Response object
      */
-    message::Response::ptr
-        executeCallback(message::Request::ptr request) override
+    message::Response::ptr executeCallback(
+        message::Request::ptr request) override
     {
         message::Response::ptr response = request->makeResponse();
         // allocate a big response buffer here
@@ -432,8 +432,8 @@
      *
      * @return a shared_ptr to a Response object
      */
-    message::Response::ptr
-        executeCallback(message::Request::ptr request) override
+    message::Response::ptr executeCallback(
+        message::Request::ptr request) override
     {
         message::Response::ptr response = request->makeResponse();
         // allocate a big response buffer here
diff --git a/include/ipmid/utils.hpp b/include/ipmid/utils.hpp
index f31a532..c099da0 100644
--- a/include/ipmid/utils.hpp
+++ b/include/ipmid/utils.hpp
@@ -221,9 +221,9 @@
  *  @return boost error code
  *
  */
-boost::system::error_code
-    getService(Context::ptr ctx, const std::string& intf,
-               const std::string& path, std::string& service);
+boost::system::error_code getService(Context::ptr ctx, const std::string& intf,
+                                     const std::string& path,
+                                     std::string& service);
 
 /** @brief Gets the dbus sub tree implementing the given interface.
  *  @param[in] ctx - ipmi::Context::ptr
@@ -247,10 +247,10 @@
  *  @param[out] D-Bus object with path and service name
  *  @return - boost error code object
  */
-boost::system::error_code
-    getDbusObject(Context::ptr ctx, const std::string& interface,
-                  const std::string& subtreePath, const std::string& match,
-                  DbusObjectInfo& dbusObject);
+boost::system::error_code getDbusObject(
+    Context::ptr ctx, const std::string& interface,
+    const std::string& subtreePath, const std::string& match,
+    DbusObjectInfo& dbusObject);
 
 // default for ROOT for subtreePath and std::string{} for match
 static inline boost::system::error_code getDbusObject(
@@ -260,9 +260,9 @@
 }
 
 // default std::string{} for match
-static inline boost::system::error_code
-    getDbusObject(Context::ptr ctx, const std::string& interface,
-                  const std::string& subtreePath, DbusObjectInfo& dbusObject)
+static inline boost::system::error_code getDbusObject(
+    Context::ptr ctx, const std::string& interface,
+    const std::string& subtreePath, DbusObjectInfo& dbusObject)
 {
     return getDbusObject(ctx, interface, subtreePath, {}, dbusObject);
 }
@@ -278,10 +278,10 @@
  *  @return - boost error code object
  */
 template <typename Type>
-boost::system::error_code
-    getDbusProperty(Context::ptr ctx, const std::string& service,
-                    const std::string& objPath, const std::string& interface,
-                    const std::string& property, Type& propertyValue)
+boost::system::error_code getDbusProperty(
+    Context::ptr ctx, const std::string& service, const std::string& objPath,
+    const std::string& interface, const std::string& property,
+    Type& propertyValue)
 {
     boost::system::error_code ec;
     auto variant = ctx->bus->yield_method_call<std::variant<Type>>(
@@ -324,10 +324,10 @@
  *  @param[in] value - value which needs to be set.
  *  @return - boost error code object
  */
-boost::system::error_code
-    setDbusProperty(Context::ptr ctx, const std::string& service,
-                    const std::string& objPath, const std::string& interface,
-                    const std::string& property, const Value& value);
+boost::system::error_code setDbusProperty(
+    Context::ptr ctx, const std::string& service, const std::string& objPath,
+    const std::string& interface, const std::string& property,
+    const Value& value);
 
 /** @brief  Gets all the D-Bus objects from the given service root
  *          which matches the object identifier.
@@ -338,15 +338,15 @@
  *  @param[out] objectree - map of object path and service info.
  *  @return - boost error code object
  */
-boost::system::error_code
-    getAllDbusObjects(Context::ptr ctx, const std::string& serviceRoot,
-                      const std::string& interface, const std::string& match,
-                      ObjectTree& objectTree);
+boost::system::error_code getAllDbusObjects(
+    Context::ptr ctx, const std::string& serviceRoot,
+    const std::string& interface, const std::string& match,
+    ObjectTree& objectTree);
 
 // default std::string{} for match
-static inline boost::system::error_code
-    getAllDbusObjects(Context::ptr ctx, const std::string& serviceRoot,
-                      const std::string& interface, ObjectTree& objectTree)
+static inline boost::system::error_code getAllDbusObjects(
+    Context::ptr ctx, const std::string& serviceRoot,
+    const std::string& interface, ObjectTree& objectTree)
 {
     return getAllDbusObjects(ctx, serviceRoot, interface, {}, objectTree);
 }
@@ -372,9 +372,9 @@
  *  @param[out] objects - map of name value pair.
  *  @return - boost error code object
  */
-boost::system::error_code
-    getManagedObjects(Context::ptr ctx, const std::string& service,
-                      const std::string& objPath, ObjectValueTree& objects);
+boost::system::error_code getManagedObjects(
+    Context::ptr ctx, const std::string& service, const std::string& objPath,
+    ObjectValueTree& objects);
 
 /** @brief Gets the ancestor objects of the given object
            which implements the given interface.
@@ -384,10 +384,9 @@
  *  @param[out] ObjectTree - map of object path and service info.
  *  @return - boost error code object
  */
-boost::system::error_code
-    getAllAncestors(Context::ptr ctx, const std::string& path,
-                    const InterfaceList& interfaces, ObjectTree& objectTree)
-        __attribute__((deprecated));
+boost::system::error_code getAllAncestors(
+    Context::ptr ctx, const std::string& path, const InterfaceList& interfaces,
+    ObjectTree& objectTree) __attribute__((deprecated));
 
 /** @brief Gets the value associated with the given object
  *         and the interface.
@@ -439,15 +438,15 @@
 struct VariantToDoubleVisitor
 {
     template <typename T>
-    std::enable_if_t<std::is_arithmetic<T>::value, double>
-        operator()(const T& t) const
+    std::enable_if_t<std::is_arithmetic<T>::value, double> operator()(
+        const T& t) const
     {
         return static_cast<double>(t);
     }
 
     template <typename T>
-    std::enable_if_t<!std::is_arithmetic<T>::value, double>
-        operator()(const T&) const
+    std::enable_if_t<!std::is_arithmetic<T>::value, double> operator()(
+        const T&) const
     {
         throw std::invalid_argument("Cannot translate type to double");
     }
diff --git a/libipmid/utils.cpp b/libipmid/utils.cpp
index 09b152b..f8e8083 100644
--- a/libipmid/utils.cpp
+++ b/libipmid/utils.cpp
@@ -39,9 +39,9 @@
 //  Currently mapper doesn't give the readable busname(gives busid) so we can't
 //  use busname to find the object,will do later once the support is there.
 
-DbusObjectInfo
-    getDbusObject(sdbusplus::bus_t& bus, const std::string& interface,
-                  const std::string& serviceRoot, const std::string& match)
+DbusObjectInfo getDbusObject(
+    sdbusplus::bus_t& bus, const std::string& interface,
+    const std::string& serviceRoot, const std::string& match)
 {
     std::vector<DbusInterface> interfaces;
     interfaces.emplace_back(interface);
@@ -230,9 +230,9 @@
     return objectTree;
 }
 
-ipmi::ObjectTree
-    getAllDbusObjects(sdbusplus::bus_t& bus, const std::string& serviceRoot,
-                      const std::string& interface, const std::string& match)
+ipmi::ObjectTree getAllDbusObjects(
+    sdbusplus::bus_t& bus, const std::string& serviceRoot,
+    const std::string& interface, const std::string& match)
 {
     std::vector<std::string> interfaces;
     interfaces.emplace_back(interface);
@@ -325,9 +325,9 @@
 
 /********* Begin co-routine yielding alternatives ***************/
 
-boost::system::error_code
-    getService(Context::ptr ctx, const std::string& intf,
-               const std::string& path, std::string& service)
+boost::system::error_code getService(Context::ptr ctx, const std::string& intf,
+                                     const std::string& path,
+                                     std::string& service)
 {
     boost::system::error_code ec;
     std::map<std::string, std::vector<std::string>> mapperResponse =
@@ -356,10 +356,10 @@
     return ec;
 }
 
-boost::system::error_code
-    getDbusObject(Context::ptr ctx, const std::string& interface,
-                  const std::string& subtreePath, const std::string& match,
-                  DbusObjectInfo& dbusObject)
+boost::system::error_code getDbusObject(
+    Context::ptr ctx, const std::string& interface,
+    const std::string& subtreePath, const std::string& match,
+    DbusObjectInfo& dbusObject)
 {
     std::vector<DbusInterface> interfaces;
     interfaces.emplace_back(interface);
@@ -426,10 +426,10 @@
     return ec;
 }
 
-boost::system::error_code
-    setDbusProperty(Context::ptr ctx, const std::string& service,
-                    const std::string& objPath, const std::string& interface,
-                    const std::string& property, const Value& value)
+boost::system::error_code setDbusProperty(
+    Context::ptr ctx, const std::string& service, const std::string& objPath,
+    const std::string& interface, const std::string& property,
+    const Value& value)
 {
     boost::system::error_code ec;
     ctx->bus->yield_method_call(ctx->yield, ec, service.c_str(),
@@ -438,10 +438,10 @@
     return ec;
 }
 
-boost::system::error_code
-    getAllDbusObjects(Context::ptr ctx, const std::string& serviceRoot,
-                      const std::string& interface, const std::string& match,
-                      ObjectTree& objectTree)
+boost::system::error_code getAllDbusObjects(
+    Context::ptr ctx, const std::string& serviceRoot,
+    const std::string& interface, const std::string& match,
+    ObjectTree& objectTree)
 {
     std::vector<std::string> interfaces;
     interfaces.emplace_back(interface);
@@ -469,9 +469,9 @@
     return ec;
 }
 
-boost::system::error_code
-    deleteAllDbusObjects(Context::ptr ctx, const std::string& serviceRoot,
-                         const std::string& interface, const std::string& match)
+boost::system::error_code deleteAllDbusObjects(
+    Context::ptr ctx, const std::string& serviceRoot,
+    const std::string& interface, const std::string& match)
 {
     ObjectTree objectTree;
     boost::system::error_code ec =
@@ -500,9 +500,9 @@
     return ec;
 }
 
-boost::system::error_code
-    getManagedObjects(Context::ptr ctx, const std::string& service,
-                      const std::string& objPath, ObjectValueTree& objects)
+boost::system::error_code getManagedObjects(
+    Context::ptr ctx, const std::string& service, const std::string& objPath,
+    ObjectValueTree& objects)
 {
     boost::system::error_code ec;
     objects = ctx->bus->yield_method_call<ipmi::ObjectValueTree>(
@@ -511,9 +511,9 @@
     return ec;
 }
 
-boost::system::error_code
-    getAllAncestors(Context::ptr ctx, const std::string& path,
-                    const InterfaceList& interfaces, ObjectTree& objectTree)
+boost::system::error_code getAllAncestors(
+    Context::ptr ctx, const std::string& path, const InterfaceList& interfaces,
+    ObjectTree& objectTree)
 {
     std::string interfaceList = convertToString(interfaces);
 
diff --git a/selutility.cpp b/selutility.cpp
index cf19307..944b21c 100644
--- a/selutility.cpp
+++ b/selutility.cpp
@@ -155,9 +155,9 @@
            std::min(sensorData.size(), static_cast<size_t>(selDataSize)));
 }
 
-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{};
 
diff --git a/selutility.hpp b/selutility.hpp
index 27c2ca1..c6ba6b0 100644
--- a/selutility.hpp
+++ b/selutility.hpp
@@ -199,9 +199,9 @@
  *  @return On success return the SEL event record, throw an exception in case
  *          of failure.
  */
-GetSELEntryResponse
-    prepareSELEntry(const std::string& objPath,
-                    ipmi::sensor::InvObjectIDMap::const_iterator iter);
+GetSELEntryResponse prepareSELEntry(
+    const std::string& objPath,
+    ipmi::sensor::InvObjectIDMap::const_iterator iter);
 
 } // namespace internal
 
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index 2da4c08..e40fa49 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -715,8 +715,8 @@
     }
 }
 
-get_sdr::GetSensorThresholdsResponse
-    getSensorThresholds(ipmi::Context::ptr& ctx, uint8_t sensorNum)
+get_sdr::GetSensorThresholdsResponse getSensorThresholds(
+    ipmi::Context::ptr& ctx, uint8_t sensorNum)
 {
     get_sdr::GetSensorThresholdsResponse resp{};
     const auto iter = ipmi::sensor::sensors.find(sensorNum);
diff --git a/storagehandler.cpp b/storagehandler.cpp
index 8ae63f2..5b8eb6d 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -86,8 +86,8 @@
     return std::string(ipmi::sel::logBasePath) + "/" + std::to_string(id);
 }
 
-std::optional<std::pair<uint16_t, SELEntry>>
-    parseLoggingEntry(const std::string& p)
+std::optional<std::pair<uint16_t, SELEntry>> parseLoggingEntry(
+    const std::string& p)
 {
     try
     {
diff --git a/sys_info_param.cpp b/sys_info_param.cpp
index c9bee32..79bb29c 100644
--- a/sys_info_param.cpp
+++ b/sys_info_param.cpp
@@ -1,7 +1,7 @@
 #include "sys_info_param.hpp"
 
-std::tuple<bool, std::string>
-    SysInfoParamStore::lookup(uint8_t paramSelector) const
+std::tuple<bool, std::string> SysInfoParamStore::lookup(
+    uint8_t paramSelector) const
 {
     const auto iterator = params.find(paramSelector);
     if (iterator == params.end())
diff --git a/sys_info_param.hpp b/sys_info_param.hpp
index 52a52be..5f6607d 100644
--- a/sys_info_param.hpp
+++ b/sys_info_param.hpp
@@ -22,8 +22,8 @@
      * @return tuple of bool and string, true if parameter is found and
      * string set accordingly.
      */
-    virtual std::tuple<bool, std::string>
-        lookup(uint8_t paramSelector) const = 0;
+    virtual std::tuple<bool, std::string> lookup(
+        uint8_t paramSelector) const = 0;
 
     /**
      * Update a parameter by its code with a string value.
diff --git a/transporthandler.cpp b/transporthandler.cpp
index 3bf2f63..7218da9 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -71,8 +71,8 @@
            (path.size() == is || path[is] == '/');
 }
 
-std::optional<ChannelParams>
-    maybeGetChannelParams(sdbusplus::bus_t& bus, uint8_t channel)
+std::optional<ChannelParams> maybeGetChannelParams(sdbusplus::bus_t& bus,
+                                                   uint8_t channel)
 {
     auto ifname = getChannelName(channel);
     if (ifname.empty())
@@ -317,9 +317,9 @@
 }
 
 template <int family>
-std::optional<IfNeigh<family>>
-    findGatewayNeighbor(sdbusplus::bus_t& bus, const ChannelParams& params,
-                        ObjectLookupCache& neighbors)
+std::optional<IfNeigh<family>> findGatewayNeighbor(sdbusplus::bus_t& bus,
+                                                   const ChannelParams& params,
+                                                   ObjectLookupCache& neighbors)
 {
     auto gateway = getGatewayProperty<family>(bus, params);
     if (!gateway)
@@ -331,8 +331,8 @@
 }
 
 template <int family>
-std::optional<IfNeigh<family>>
-    getGatewayNeighbor(sdbusplus::bus_t& bus, const ChannelParams& params)
+std::optional<IfNeigh<family>> getGatewayNeighbor(sdbusplus::bus_t& bus,
+                                                  const ChannelParams& params)
 {
     ObjectLookupCache neighbors(bus, params, INTF_NEIGHBOR);
     return findGatewayNeighbor<family>(bus, params, neighbors);
@@ -678,9 +678,9 @@
  */
 RspType<> setLanOem(uint8_t channel, uint8_t parameter, message::Payload& req)
     __attribute__((weak));
-RspType<message::Payload>
-    getLanOem(uint8_t channel, uint8_t parameter, uint8_t set, uint8_t block)
-        __attribute__((weak));
+RspType<message::Payload> getLanOem(uint8_t channel, uint8_t parameter,
+                                    uint8_t set, uint8_t block)
+    __attribute__((weak));
 
 RspType<> setLanOem(uint8_t, uint8_t, message::Payload& req)
 {
diff --git a/transporthandler.hpp b/transporthandler.hpp
index 3285017..de1bb66 100644
--- a/transporthandler.hpp
+++ b/transporthandler.hpp
@@ -65,8 +65,8 @@
  *  @param[in] channel - The channel id corresponding to an ethernet interface
  *  @return Ethernet interface service and object path if it exists
  */
-std::optional<ChannelParams>
-    maybeGetChannelParams(sdbusplus::bus_t& bus, uint8_t channel);
+std::optional<ChannelParams> maybeGetChannelParams(sdbusplus::bus_t& bus,
+                                                   uint8_t channel);
 
 /** @brief A trivial helper around maybeGetChannelParams() that throws an
  *         exception when it is unable to acquire parameters for the channel.
@@ -334,8 +334,8 @@
  *  @return An address representing the gateway address if it exists
  */
 template <int family>
-std::optional<typename AddrFamily<family>::addr>
-    getGatewayProperty(sdbusplus::bus_t& bus, const ChannelParams& params)
+std::optional<typename AddrFamily<family>::addr> getGatewayProperty(
+    sdbusplus::bus_t& bus, const ChannelParams& params)
 {
     auto objPath = "/xyz/openbmc_project/network/" + params.ifname;
     auto gatewayStr = std::get<std::string>(
diff --git a/user_channel/channel_layer.hpp b/user_channel/channel_layer.hpp
index 551b0b6..37d2b90 100644
--- a/user_channel/channel_layer.hpp
+++ b/user_channel/channel_layer.hpp
@@ -284,8 +284,8 @@
  *  @return same channel number or proper channel number for current channel
  * number (0xE).
  */
-static inline uint8_t
-    convertCurrentChannelNum(const uint8_t chNum, const uint8_t devChannel)
+static inline uint8_t convertCurrentChannelNum(const uint8_t chNum,
+                                               const uint8_t devChannel)
 {
     if (chNum == currentChNum)
     {
diff --git a/user_channel/channel_mgmt.cpp b/user_channel/channel_mgmt.cpp
index 31fdba0..0b76330 100644
--- a/user_channel/channel_mgmt.cpp
+++ b/user_channel/channel_mgmt.cpp
@@ -385,8 +385,8 @@
     return channelData[chNum].isChValid;
 }
 
-EChannelSessSupported
-    ChannelConfig::getChannelSessionSupport(const uint8_t chNum)
+EChannelSessSupported ChannelConfig::getChannelSessionSupport(
+    const uint8_t chNum)
 {
     EChannelSessSupported chSessSupport =
         (EChannelSessSupported)channelData[chNum].chInfo.sessionSupported;
@@ -711,8 +711,8 @@
     return fileStat.st_mtime;
 }
 
-EChannelAccessMode
-    ChannelConfig::convertToAccessModeIndex(const std::string& mode)
+EChannelAccessMode ChannelConfig::convertToAccessModeIndex(
+    const std::string& mode)
 {
     auto iter = std::find(accessModeList.begin(), accessModeList.end(), mode);
     if (iter == accessModeList.end())
@@ -736,8 +736,8 @@
     return accessModeList.at(value);
 }
 
-CommandPrivilege
-    ChannelConfig::convertToPrivLimitIndex(const std::string& value)
+CommandPrivilege ChannelConfig::convertToPrivLimitIndex(
+    const std::string& value)
 {
     auto iter = std::find(privList.begin(), privList.end(), value);
     if (iter == privList.end())
@@ -760,8 +760,8 @@
     return privList.at(value);
 }
 
-EChannelSessSupported
-    ChannelConfig::convertToSessionSupportIndex(const std::string& value)
+EChannelSessSupported ChannelConfig::convertToSessionSupportIndex(
+    const std::string& value)
 {
     auto iter =
         std::find(sessionSupportList.begin(), sessionSupportList.end(), value);
@@ -775,8 +775,8 @@
         std::distance(sessionSupportList.begin(), iter));
 }
 
-EChannelMediumType
-    ChannelConfig::convertToMediumTypeIndex(const std::string& value)
+EChannelMediumType ChannelConfig::convertToMediumTypeIndex(
+    const std::string& value)
 {
     std::unordered_map<std::string, EChannelMediumType>::iterator it =
         mediumTypeMap.find(value);
@@ -789,8 +789,8 @@
     return static_cast<EChannelMediumType>(it->second);
 }
 
-EChannelProtocolType
-    ChannelConfig::convertToProtocolTypeIndex(const std::string& value)
+EChannelProtocolType ChannelConfig::convertToProtocolTypeIndex(
+    const std::string& value)
 {
     std::unordered_map<std::string, EChannelProtocolType>::iterator it =
         protocolTypeMap.find(value);
diff --git a/user_channel/channel_mgmt.hpp b/user_channel/channel_mgmt.hpp
index 39aa116..43926bb 100644
--- a/user_channel/channel_mgmt.hpp
+++ b/user_channel/channel_mgmt.hpp
@@ -370,8 +370,8 @@
      *
      *  @return support session type
      */
-    EChannelSessSupported
-        convertToSessionSupportIndex(const std::string& value);
+    EChannelSessSupported convertToSessionSupportIndex(
+        const std::string& value);
 
     /** @brief function to convert medium type string to value type
      *
