diff --git a/common/test/mocked_utils.hpp b/common/test/mocked_utils.hpp
index 8e887a5..ad6f8dc 100644
--- a/common/test/mocked_utils.hpp
+++ b/common/test/mocked_utils.hpp
@@ -25,8 +25,8 @@
 class GetManagedEmptyObject
 {
   public:
-    static pldm::utils::ObjectValueTree
-        getManagedObj(const char* /*service*/, const char* /*path*/)
+    static pldm::utils::ObjectValueTree getManagedObj(const char* /*service*/,
+                                                      const char* /*path*/)
     {
         return pldm::utils::ObjectValueTree{};
     }
@@ -35,8 +35,8 @@
 class GetManagedObject
 {
   public:
-    static pldm::utils::ObjectValueTree
-        getManagedObj(const char* /*service*/, const char* /*path*/)
+    static pldm::utils::ObjectValueTree getManagedObj(const char* /*service*/,
+                                                      const char* /*path*/)
     {
         return pldm::utils::ObjectValueTree{
             {sdbusplus::message::object_path("/foo/bar"),
diff --git a/common/transport.cpp b/common/transport.cpp
index 9641c38..5c9678a 100644
--- a/common/transport.cpp
+++ b/common/transport.cpp
@@ -63,8 +63,8 @@
     return pldmTransport;
 }
 
-[[maybe_unused]] static struct pldm_transport*
-    pldm_transport_impl_af_mctp_init(TransportImpl& impl, pollfd& pollfd)
+[[maybe_unused]] static struct pldm_transport* pldm_transport_impl_af_mctp_init(
+    TransportImpl& impl, pollfd& pollfd)
 {
     impl.af_mctp = nullptr;
     pldm_transport_af_mctp_init(&impl.af_mctp);
diff --git a/common/utils.cpp b/common/utils.cpp
index 7d7751c..aee2a31 100644
--- a/common/utils.cpp
+++ b/common/utils.cpp
@@ -27,9 +27,9 @@
 namespace utils
 {
 
-std::vector<std::vector<uint8_t>>
-    findStateEffecterPDR(uint8_t /*tid*/, uint16_t entityID,
-                         uint16_t stateSetId, const pldm_pdr* repo)
+std::vector<std::vector<uint8_t>> findStateEffecterPDR(
+    uint8_t /*tid*/, uint16_t entityID, uint16_t stateSetId,
+    const pldm_pdr* repo)
 {
     uint8_t* outData = nullptr;
     uint32_t size{};
@@ -79,9 +79,9 @@
     return pdrs;
 }
 
-std::vector<std::vector<uint8_t>>
-    findStateSensorPDR(uint8_t /*tid*/, uint16_t entityID, uint16_t stateSetId,
-                       const pldm_pdr* repo)
+std::vector<std::vector<uint8_t>> findStateSensorPDR(
+    uint8_t /*tid*/, uint16_t entityID, uint16_t stateSetId,
+    const pldm_pdr* repo)
 {
     uint8_t* outData = nullptr;
     uint32_t size{};
@@ -248,9 +248,9 @@
     return mapperResponse.begin()->first;
 }
 
-GetSubTreeResponse
-    DBusHandler::getSubtree(const std::string& searchPath, int depth,
-                            const std::vector<std::string>& ifaceList) const
+GetSubTreeResponse DBusHandler::getSubtree(
+    const std::string& searchPath, int depth,
+    const std::vector<std::string>& ifaceList) const
 {
     auto& bus = pldm::utils::DBusHandler::getBus();
     auto method = bus.new_method_call(ObjectMapper::default_service,
@@ -739,8 +739,8 @@
     return true;
 }
 
-std::optional<std::string>
-    fruFieldValuestring(const uint8_t* value, const uint8_t& length)
+std::optional<std::string> fruFieldValuestring(const uint8_t* value,
+                                               const uint8_t& length)
 {
     if (!value || !length)
     {
diff --git a/common/utils.hpp b/common/utils.hpp
index 37765ba..cd02f6c 100644
--- a/common/utils.hpp
+++ b/common/utils.hpp
@@ -208,24 +208,24 @@
 
     virtual std::string getService(const char* path,
                                    const char* interface) const = 0;
-    virtual GetSubTreeResponse
-        getSubtree(const std::string& path, int depth,
-                   const std::vector<std::string>& ifaceList) const = 0;
+    virtual GetSubTreeResponse getSubtree(
+        const std::string& path, int depth,
+        const std::vector<std::string>& ifaceList) const = 0;
 
-    virtual GetSubTreePathsResponse
-        getSubTreePaths(const std::string& objectPath, int depth,
-                        const std::vector<std::string>& ifaceList) const = 0;
+    virtual GetSubTreePathsResponse getSubTreePaths(
+        const std::string& objectPath, int depth,
+        const std::vector<std::string>& ifaceList) const = 0;
 
     virtual void setDbusProperty(const DBusMapping& dBusMap,
                                  const PropertyValue& value) const = 0;
 
-    virtual PropertyValue
-        getDbusPropertyVariant(const char* objPath, const char* dbusProp,
-                               const char* dbusInterface) const = 0;
+    virtual PropertyValue getDbusPropertyVariant(
+        const char* objPath, const char* dbusProp,
+        const char* dbusInterface) const = 0;
 
-    virtual PropertyMap
-        getDbusPropertiesVariant(const char* serviceName, const char* objPath,
-                                 const char* dbusInterface) const = 0;
+    virtual PropertyMap getDbusPropertiesVariant(
+        const char* serviceName, const char* objPath,
+        const char* dbusInterface) const = 0;
 };
 
 /**
@@ -272,9 +272,9 @@
      *
      *  @throw sdbusplus::exception_t when it fails
      */
-    GetSubTreeResponse
-        getSubtree(const std::string& path, int depth,
-                   const std::vector<std::string>& ifaceList) const override;
+    GetSubTreeResponse getSubtree(
+        const std::string& path, int depth,
+        const std::vector<std::string>& ifaceList) const override;
 
     /** @brief Get Subtree path response from the mapper
      *
@@ -299,9 +299,9 @@
      *
      *  @throw sdbusplus::exception_t when it fails
      */
-    PropertyValue
-        getDbusPropertyVariant(const char* objPath, const char* dbusProp,
-                               const char* dbusInterface) const override;
+    PropertyValue getDbusPropertyVariant(
+        const char* objPath, const char* dbusProp,
+        const char* dbusInterface) const override;
 
     /** @brief Get All properties(type: variant) from the requested dbus
      *
@@ -313,9 +313,9 @@
      *
      *  @throw sdbusplus::exception_t when it fails
      */
-    PropertyMap
-        getDbusPropertiesVariant(const char* serviceName, const char* objPath,
-                                 const char* dbusInterface) const override;
+    PropertyMap getDbusPropertiesVariant(
+        const char* serviceName, const char* objPath,
+        const char* dbusInterface) const override;
 
     /** @brief The template function to get property from the requested dbus
      *         path
@@ -576,8 +576,8 @@
  *
  *  @return Fru string or nullopt.
  */
-std::optional<std::string>
-    fruFieldValuestring(const uint8_t* value, const uint8_t& length);
+std::optional<std::string> fruFieldValuestring(const uint8_t* value,
+                                               const uint8_t& length);
 
 /** @brief Convert the Fru Uint32 raw data from PLDM Fru to uint32_t
  *
