diff --git a/.clang-tidy b/.clang-tidy
index dd69f53..43d168b 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -254,6 +254,7 @@
 performance-type-promotion-in-math-fn,
 performance-unnecessary-copy-initialization,
 readability-const-return-type,
+readability-convert-member-functions-to-static,
 readability-delete-null-pointer,
 readability-deleted-default,
 readability-function-size,
diff --git a/fault-monitor/fru-fault-monitor.hpp b/fault-monitor/fru-fault-monitor.hpp
index fc6cafa..adb6e9b 100644
--- a/fault-monitor/fru-fault-monitor.hpp
+++ b/fault-monitor/fru-fault-monitor.hpp
@@ -67,7 +67,7 @@
     /** @brief function to create fault remove match for a fru
      *  @param[in] path  - Inventory path of the faulty unit.
      */
-    std::string match(const std::string& path)
+    static std::string match(const std::string& path)
     {
         namespace MatchRules = sdbusplus::bus::match::rules;
 
diff --git a/manager/lamptest/lamptest.cpp b/manager/lamptest/lamptest.cpp
index e7c9d5a..f91a085 100644
--- a/manager/lamptest/lamptest.cpp
+++ b/manager/lamptest/lamptest.cpp
@@ -31,8 +31,8 @@
 
             if (iter != forceUpdateLEDs.end())
             {
-                manager.drivePhysicalLED(path, Layout::Action::Off, it.dutyOn,
-                                         it.period);
+                phosphor::led::Manager::drivePhysicalLED(
+                    path, Layout::Action::Off, it.dutyOn, it.period);
             }
         }
 
@@ -45,7 +45,8 @@
 
             if (iter != forceUpdateLEDs.end())
             {
-                manager.drivePhysicalLED(path, it.action, it.dutyOn, it.period);
+                phosphor::led::Manager::drivePhysicalLED(path, it.action,
+                                                         it.dutyOn, it.period);
             }
         }
 
@@ -80,7 +81,8 @@
             continue;
         }
 
-        manager.drivePhysicalLED(path, Layout::Action::Off, 0, 0);
+        phosphor::led::Manager::drivePhysicalLED(path, Layout::Action::Off, 0,
+                                                 0);
     }
 
     if (std::filesystem::exists(lampTestIndicator))
@@ -146,7 +148,9 @@
         uint8_t dutyOn{};
         try
         {
-            auto properties = dBusHandler.getAllProperties(path, phyLedIntf);
+            auto properties =
+                phosphor::led::utils::DBusHandler::getAllProperties(path,
+                                                                    phyLedIntf);
 
             state = std::get<std::string>(properties["State"]);
             period = std::get<uint16_t>(properties["Period"]);
@@ -187,7 +191,8 @@
     // Get paths of all the Physical LED objects
     try
     {
-        physicalLEDPaths = dBusHandler.getSubTreePaths(phyLedPath, phyLedIntf);
+        physicalLEDPaths = phosphor::led::utils::DBusHandler::getSubTreePaths(
+            phyLedPath, phyLedIntf);
     }
     catch (const sdbusplus::exception_t& e)
     {
@@ -233,7 +238,8 @@
             continue;
         }
 
-        manager.drivePhysicalLED(path, Layout::Action::On, 0, 0);
+        phosphor::led::Manager::drivePhysicalLED(path, Layout::Action::On, 0,
+                                                 0);
     }
 }
 
@@ -307,9 +313,9 @@
     try
     {
         PropertyValue assertedValue{value};
-        dBusHandler.setProperty(HOST_LAMP_TEST_OBJECT,
-                                "xyz.openbmc_project.Led.Group", "Asserted",
-                                assertedValue);
+        phosphor::led::utils::DBusHandler::setProperty(
+            HOST_LAMP_TEST_OBJECT, "xyz.openbmc_project.Led.Group", "Asserted",
+            assertedValue);
     }
     catch (const sdbusplus::exception_t& e)
     {
@@ -357,14 +363,14 @@
     if (std::filesystem::exists(lampTestIndicator))
     {
         // we need to off all the LEDs.
-        phosphor::led::utils::DBusHandler dBusHandler;
-        std::vector<std::string> physicalLedPaths = dBusHandler.getSubTreePaths(
-            phosphor::led::phyLedPath, phosphor::led::phyLedIntf);
+        std::vector<std::string> physicalLedPaths =
+            phosphor::led::utils::DBusHandler::getSubTreePaths(
+                phosphor::led::phyLedPath, phosphor::led::phyLedIntf);
 
         for (const auto& path : physicalLedPaths)
         {
-            manager.drivePhysicalLED(path, phosphor::led::Layout::Action::Off,
-                                     0, 0);
+            phosphor::led::Manager::drivePhysicalLED(
+                path, phosphor::led::Layout::Action::Off, 0, 0);
         }
 
         // Also remove the lamp test on indicator file.
diff --git a/manager/lamptest/lamptest.hpp b/manager/lamptest/lamptest.hpp
index 5e312e2..ce7bae1 100644
--- a/manager/lamptest/lamptest.hpp
+++ b/manager/lamptest/lamptest.hpp
@@ -79,7 +79,7 @@
      * with the persisted lamp test indicator file so that there is no sign of
      * lamptest.
      */
-    void clearLamps();
+    static void clearLamps();
 
   private:
     /** @brief Timer used for LEDs lamp test period */
@@ -88,9 +88,6 @@
     /** @brief Reference to Manager object */
     Manager& manager;
 
-    /** DBusHandler class handles the D-Bus operations */
-    DBusHandler dBusHandler;
-
     /** @brief Pointer to Group object */
     Group* groupObj;
 
@@ -137,13 +134,13 @@
      *
      *  @return enumeration equivalent of the passed in string
      */
-    Layout::Action getActionFromString(const std::string& str);
+    static Layout::Action getActionFromString(const std::string& str);
 
     /** @brief Notify host to start / stop the lamp test
      *
      *  @param[in]  value   -  the Asserted property value
      */
-    void doHostLampTest(bool value);
+    static void doHostLampTest(bool value);
 
     /** @brief Get physical LED names from lamp test JSON config file
      *
diff --git a/manager/manager.cpp b/manager/manager.cpp
index 6a31e93..7c7d730 100644
--- a/manager/manager.cpp
+++ b/manager/manager.cpp
@@ -218,12 +218,15 @@
             PropertyValue dutyOnValue{dutyOn};
             PropertyValue periodValue{period};
 
-            dBusHandler.setProperty(objPath, phyLedIntf, "DutyOn", dutyOnValue);
-            dBusHandler.setProperty(objPath, phyLedIntf, "Period", periodValue);
+            phosphor::led::utils::DBusHandler::setProperty(
+                objPath, phyLedIntf, "DutyOn", dutyOnValue);
+            phosphor::led::utils::DBusHandler::setProperty(
+                objPath, phyLedIntf, "Period", periodValue);
         }
 
         PropertyValue actionValue{getPhysicalAction(action)};
-        dBusHandler.setProperty(objPath, phyLedIntf, "State", actionValue);
+        phosphor::led::utils::DBusHandler::setProperty(objPath, phyLedIntf,
+                                                       "State", actionValue);
     }
     catch (const sdbusplus::exception_t& e)
     {
diff --git a/manager/manager.hpp b/manager/manager.hpp
index ea37798..0177241 100644
--- a/manager/manager.hpp
+++ b/manager/manager.hpp
@@ -130,8 +130,9 @@
      *
      *  @return:              -  0: success, -1: LED set failed
      */
-    int drivePhysicalLED(const std::string& objPath, Layout::Action action,
-                         uint8_t dutyOn, const uint16_t period);
+    static int drivePhysicalLED(const std::string& objPath,
+                                Layout::Action action, uint8_t dutyOn,
+                                const uint16_t period);
 
     /** @brief Set lamp test callback when enabled lamp test.
      *
@@ -148,9 +149,6 @@
     /** Map of physical LED path to service name */
     std::unordered_map<std::string, std::string> phyLeds{};
 
-    /** DBusHandler class handles the D-Bus operations */
-    DBusHandler dBusHandler;
-
     /** @brief Pointers to groups that are in asserted state */
     std::set<const Layout::GroupLayout*> assertedGroups;
 
diff --git a/utils.cpp b/utils.cpp
index a2a72cb..1da9602 100644
--- a/utils.cpp
+++ b/utils.cpp
@@ -11,7 +11,7 @@
 
 // Get service name
 std::string DBusHandler::getService(const std::string& path,
-                                    const std::string& interface) const
+                                    const std::string& interface)
 {
     using InterfaceList = std::vector<std::string>;
     std::unordered_map<std::string, std::vector<std::string>> mapperResponse;
@@ -38,7 +38,7 @@
 
 // Get all properties
 PropertyMap DBusHandler::getAllProperties(const std::string& objectPath,
-                                          const std::string& interface) const
+                                          const std::string& interface)
 {
     PropertyMap properties;
 
@@ -62,7 +62,7 @@
 // Get the property name
 PropertyValue DBusHandler::getProperty(const std::string& objectPath,
                                        const std::string& interface,
-                                       const std::string& propertyName) const
+                                       const std::string& propertyName)
 {
     PropertyValue value{};
 
@@ -86,7 +86,7 @@
 // Set property
 void DBusHandler::setProperty(
     const std::string& objectPath, const std::string& interface,
-    const std::string& propertyName, const PropertyValue& value) const
+    const std::string& propertyName, const PropertyValue& value)
 {
     auto& bus = DBusHandler::getBus();
     auto service = getService(objectPath, interface);
@@ -103,7 +103,7 @@
 }
 
 std::vector<std::string> DBusHandler::getSubTreePaths(
-    const std::string& objectPath, const std::string& interface) const
+    const std::string& objectPath, const std::string& interface)
 {
     std::vector<std::string> paths;
 
diff --git a/utils.hpp b/utils.hpp
index cd79fd5..456188a 100644
--- a/utils.hpp
+++ b/utils.hpp
@@ -52,8 +52,8 @@
      *  @return std::string  -  the D-Bus service name
      *
      */
-    std::string getService(const std::string& path,
-                           const std::string& interface) const;
+    static std::string getService(const std::string& path,
+                                  const std::string& interface);
 
     /** @brief Get All properties
      *
@@ -64,8 +64,8 @@
      *
      *  @throw sdbusplus::exception_t when it fails
      */
-    PropertyMap getAllProperties(const std::string& objectPath,
-                                 const std::string& interface) const;
+    static PropertyMap getAllProperties(const std::string& objectPath,
+                                        const std::string& interface);
 
     /** @brief Get property(type: variant)
      *
@@ -77,9 +77,9 @@
      *
      *  @throw sdbusplus::exception_t when it fails
      */
-    PropertyValue getProperty(const std::string& objectPath,
-                              const std::string& interface,
-                              const std::string& propertyName) const;
+    static PropertyValue getProperty(const std::string& objectPath,
+                                     const std::string& interface,
+                                     const std::string& propertyName);
 
     /** @brief Set D-Bus property
      *
@@ -90,10 +90,10 @@
      *
      *  @throw sdbusplus::exception_t when it fails
      */
-    void setProperty(const std::string& objectPath,
-                     const std::string& interface,
-                     const std::string& propertyName,
-                     const PropertyValue& value) const;
+    static void setProperty(const std::string& objectPath,
+                            const std::string& interface,
+                            const std::string& propertyName,
+                            const PropertyValue& value);
 
     /** @brief Get sub tree paths by the path and interface of the DBus.
      *
@@ -102,8 +102,8 @@
      *
      *  @return std::vector<std::string> vector of subtree paths
      */
-    std::vector<std::string> getSubTreePaths(
-        const std::string& objectPath, const std::string& interface) const;
+    static std::vector<std::string> getSubTreePaths(
+        const std::string& objectPath, const std::string& interface);
 };
 
 } // namespace utils
