diff --git a/mslverify/util.hpp b/mslverify/util.hpp
index 2c26fc2..f487cee 100644
--- a/mslverify/util.hpp
+++ b/mslverify/util.hpp
@@ -15,7 +15,7 @@
 } // namespace detail
 
 /** @brief Alias for PropertiesChanged signal callbacks. */
-template <typename ...T>
+template <typename... T>
 using Properties = std::map<std::string, sdbusplus::message::variant<T...>>;
 
 namespace sdbusplus
@@ -30,31 +30,23 @@
 }
 
 /** @brief Invoke a method. */
-template <typename ...Args>
-static auto callMethod(
-        ::sdbusplus::bus::bus& bus,
-        const std::string& busName,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& method,
-        Args&& ... args)
+template <typename... Args>
+static auto callMethod(::sdbusplus::bus::bus& bus, const std::string& busName,
+                       const std::string& path, const std::string& interface,
+                       const std::string& method, Args&&... args)
 {
-    auto reqMsg = bus.new_method_call(
-            busName.c_str(),
-            path.c_str(),
-            interface.c_str(),
-            method.c_str());
+    auto reqMsg = bus.new_method_call(busName.c_str(), path.c_str(),
+                                      interface.c_str(), method.c_str());
     reqMsg.append(std::forward<Args>(args)...);
     auto respMsg = bus.call(reqMsg);
 
     if (respMsg.is_method_error())
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
-                "Failed to invoke DBus method.",
-                phosphor::logging::entry("PATH=%s", path.c_str()),
-                phosphor::logging::entry(
-                    "INTERFACE=%s", interface.c_str()),
-                phosphor::logging::entry("METHOD=%s", method.c_str()));
+            "Failed to invoke DBus method.",
+            phosphor::logging::entry("PATH=%s", path.c_str()),
+            phosphor::logging::entry("INTERFACE=%s", interface.c_str()),
+            phosphor::logging::entry("METHOD=%s", method.c_str()));
         phosphor::logging::elog<detail::errors::InternalFailure>();
     }
 
@@ -62,90 +54,59 @@
 }
 
 /** @brief Invoke a method. */
-template <typename ...Args>
-static auto callMethod(
-        const std::string& busName,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& method,
-        Args&& ... args)
+template <typename... Args>
+static auto callMethod(const std::string& busName, const std::string& path,
+                       const std::string& interface, const std::string& method,
+                       Args&&... args)
 {
-    return callMethod(
-            getBus(),
-            busName,
-            path,
-            interface,
-            method,
-            std::forward<Args>(args)...);
+    return callMethod(getBus(), busName, path, interface, method,
+                      std::forward<Args>(args)...);
 }
 
 /** @brief Invoke a method and read the response. */
-template <typename Ret, typename ...Args>
-static auto callMethodAndRead(
-        ::sdbusplus::bus::bus& bus,
-        const std::string& busName,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& method,
-        Args&& ... args)
+template <typename Ret, typename... Args>
+static auto
+    callMethodAndRead(::sdbusplus::bus::bus& bus, const std::string& busName,
+                      const std::string& path, const std::string& interface,
+                      const std::string& method, Args&&... args)
 {
-    ::sdbusplus::message::message respMsg =
-        callMethod<Args...>(
-                bus,
-                busName,
-                path,
-                interface,
-                method,
-                std::forward<Args>(args)...);
+    ::sdbusplus::message::message respMsg = callMethod<Args...>(
+        bus, busName, path, interface, method, std::forward<Args>(args)...);
     Ret resp;
     respMsg.read(resp);
     return resp;
 }
 
 /** @brief Invoke a method and read the response. */
- template <typename Ret, typename ...Args>
-static auto callMethodAndRead(
-        const std::string& busName,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& method,
-        Args&& ... args)
+template <typename Ret, typename... Args>
+static auto callMethodAndRead(const std::string& busName,
+                              const std::string& path,
+                              const std::string& interface,
+                              const std::string& method, Args&&... args)
 {
-    return callMethodAndRead<Ret>(
-            getBus(),
-            busName,
-            path,
-            interface,
-            method,
-            std::forward<Args>(args)...);
+    return callMethodAndRead<Ret>(getBus(), busName, path, interface, method,
+                                  std::forward<Args>(args)...);
 }
 
-
 /** @brief Get service from the mapper. */
-static auto getService(
-        ::sdbusplus::bus::bus& bus,
-        const std::string& path,
-        const std::string& interface)
+static auto getService(::sdbusplus::bus::bus& bus, const std::string& path,
+                       const std::string& interface)
 {
     using namespace std::literals::string_literals;
     using GetObject = std::map<std::string, std::vector<std::string>>;
 
     auto mapperResp = callMethodAndRead<GetObject>(
-            bus,
-            "xyz.openbmc_project.ObjectMapper"s,
-            "/xyz/openbmc_project/object_mapper"s,
-            "xyz.openbmc_project.ObjectMapper"s,
-            "GetObject"s,
-            path,
-            GetObject::mapped_type{interface});
+        bus, "xyz.openbmc_project.ObjectMapper"s,
+        "/xyz/openbmc_project/object_mapper"s,
+        "xyz.openbmc_project.ObjectMapper"s, "GetObject"s, path,
+        GetObject::mapped_type{interface});
 
     if (mapperResp.empty())
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
-                "Object not found.",
-                phosphor::logging::entry("PATH=%s", path.c_str()),
-                phosphor::logging::entry(
-                    "INTERFACE=%s", interface.c_str()));
+            "Object not found.",
+            phosphor::logging::entry("PATH=%s", path.c_str()),
+            phosphor::logging::entry("INTERFACE=%s", interface.c_str()));
         phosphor::logging::elog<detail::errors::InternalFailure>();
     }
     return mapperResp.begin()->first;
@@ -153,23 +114,15 @@
 
 /** @brief Get a property without mapper lookup. */
 template <typename Property>
-static auto getProperty(
-        ::sdbusplus::bus::bus& bus,
-        const std::string& busName,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& property)
+static auto getProperty(::sdbusplus::bus::bus& bus, const std::string& busName,
+                        const std::string& path, const std::string& interface,
+                        const std::string& property)
 {
     using namespace std::literals::string_literals;
 
-    auto msg = callMethod(
-            bus,
-            busName,
-            path,
-            "org.freedesktop.DBus.Properties"s,
-            "Get"s,
-            interface,
-            property);
+    auto msg =
+        callMethod(bus, busName, path, "org.freedesktop.DBus.Properties"s,
+                   "Get"s, interface, property);
     ::sdbusplus::message::variant<Property> value;
     msg.read(value);
     return value.template get<Property>();
@@ -177,48 +130,29 @@
 
 /** @brief Get a property without mapper lookup. */
 template <typename Property>
-static auto getProperty(
-        const std::string& busName,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& property)
+static auto getProperty(const std::string& busName, const std::string& path,
+                        const std::string& interface,
+                        const std::string& property)
 {
-    return getProperty<Property>(
-            getBus(),
-            busName,
-            path,
-            interface,
-            property);
+    return getProperty<Property>(getBus(), busName, path, interface, property);
 }
 
 /** @brief Get a property with mapper lookup. */
 template <typename Property>
-static auto getProperty(
-        ::sdbusplus::bus::bus& bus,
-        const std::string& path,
-        const std::string& interface,
-        const std::string& property)
+static auto getProperty(::sdbusplus::bus::bus& bus, const std::string& path,
+                        const std::string& interface,
+                        const std::string& property)
 {
-    return getProperty<Property>(
-            bus,
-            getService(bus, path, interface),
-            path,
-            interface,
-            property);
+    return getProperty<Property>(bus, getService(bus, path, interface), path,
+                                 interface, property);
 }
 
 /** @brief Get a property with mapper lookup. */
 template <typename Property>
-static auto getProperty(
-        const std::string& path,
-        const std::string& interface,
-        const std::string& property)
+static auto getProperty(const std::string& path, const std::string& interface,
+                        const std::string& property)
 {
-    return getProperty<Property>(
-            getBus(),
-            path,
-            interface,
-            property);
+    return getProperty<Property>(getBus(), path, interface, property);
 }
 
 } // namespace sdbusplus
