diff --git a/control/fan.cpp b/control/fan.cpp
index e067205..d368791 100644
--- a/control/fan.cpp
+++ b/control/fan.cpp
@@ -32,7 +32,7 @@
 constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/";
 constexpr auto FAN_TARGET_PROPERTY = "Target";
 
-Fan::Fan(sdbusplus::bus::bus& bus, const FanDefinition& def) :
+Fan::Fan(sdbusplus::bus_t& bus, const FanDefinition& def) :
     _bus(bus), _name(std::get<fanNamePos>(def)),
     _interface(std::get<targetInterfacePos>(def))
 {
@@ -66,7 +66,7 @@
                 _bus, sensor.second, sensor.first, _interface,
                 FAN_TARGET_PROPERTY, std::move(value));
         }
-        catch (const sdbusplus::exception::exception&)
+        catch (const sdbusplus::exception_t&)
         {
             throw util::DBusPropertyError{"DBus set property failed",
                                           sensor.second, sensor.first,
diff --git a/control/fan.hpp b/control/fan.hpp
index f686817..de0a85c 100644
--- a/control/fan.hpp
+++ b/control/fan.hpp
@@ -36,7 +36,7 @@
      * @param[in] bus - the dbus object
      * @param[in] def - the fan definition data
      */
-    Fan(sdbusplus::bus::bus& bus, const FanDefinition& def);
+    Fan(sdbusplus::bus_t& bus, const FanDefinition& def);
 
     /**
      * Sets the speed value on all contained sensors
@@ -59,7 +59,7 @@
     /**
      * The dbus object
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * The inventory name of the fan
diff --git a/control/functor.hpp b/control/functor.hpp
index 9f81fc5..59e15df 100644
--- a/control/functor.hpp
+++ b/control/functor.hpp
@@ -102,7 +102,7 @@
      * Extract the property from the PropertiesChanged
      * message and run the handler function.
      */
-    void operator()(sdbusplus::bus::bus& bus, sdbusplus::message::message& msg,
+    void operator()(sdbusplus::bus_t& bus, sdbusplus::message_t& msg,
                     Zone& zone) const
     {
         if (msg)
@@ -137,7 +137,7 @@
                 auto val = zone.getPropertyByName<T>(_path, _intf, _prop);
                 _handler(zone, _path, _intf, _prop, std::forward<T>(val));
             }
-            catch (const sdbusplus::exception::exception&)
+            catch (const sdbusplus::exception_t&)
             {
                 // Property will not be used unless a property changed
                 // signal message is received for this property.
@@ -168,7 +168,7 @@
                     auto val = zone.getPropertyByName<T>(path, intf, prop);
                     handler(zone, path, intf, prop, std::forward<T>(val));
                 }
-                catch (const sdbusplus::exception::exception&)
+                catch (const sdbusplus::exception_t&)
                 {
                     // Property value not sent to handler
                 }
@@ -245,7 +245,7 @@
      * Extract the property from the InterfacesAdded
      * message and run the handler function.
      */
-    void operator()(sdbusplus::bus::bus&, sdbusplus::message::message& msg,
+    void operator()(sdbusplus::bus_t&, sdbusplus::message_t& msg,
                     Zone& zone) const
     {
         if (msg)
@@ -332,7 +332,7 @@
      * Extract the interfaces from the InterfacesRemoved
      * message and run the handler function.
      */
-    void operator()(sdbusplus::bus::bus&, sdbusplus::message::message& msg,
+    void operator()(sdbusplus::bus_t&, sdbusplus::message_t& msg,
                     Zone& zone) const
     {
         if (msg)
@@ -403,7 +403,7 @@
      * Extract the name owner from the NameOwnerChanged
      * message and run the handler function.
      */
-    void operator()(sdbusplus::bus::bus& bus, sdbusplus::message::message& msg,
+    void operator()(sdbusplus::bus_t& bus, sdbusplus::message_t& msg,
                     Zone& zone) const
     {
         if (msg)
diff --git a/control/json/dbus_zone.hpp b/control/json/dbus_zone.hpp
index 8dfce1a..83abb53 100644
--- a/control/json/dbus_zone.hpp
+++ b/control/json/dbus_zone.hpp
@@ -18,7 +18,7 @@
 #include "xyz/openbmc_project/Control/ThermalMode/server.hpp"
 
 /* Extend the Control::ThermalMode interface */
-using ThermalModeIntf = sdbusplus::server::object::object<
+using ThermalModeIntf = sdbusplus::server::object_t<
     sdbusplus::xyz::openbmc_project::Control::server::ThermalMode>;
 
 namespace phosphor::fan::control::json
diff --git a/control/json/event.hpp b/control/json/event.hpp
index 0873c06..e0bdd06 100644
--- a/control/json/event.hpp
+++ b/control/json/event.hpp
@@ -150,7 +150,7 @@
 
   private:
     /* The sdbusplus bus object */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /* The event's manager */
     Manager* _manager;
diff --git a/control/json/fan.cpp b/control/json/fan.cpp
index cf5a7e3..b9c5a58 100644
--- a/control/json/fan.cpp
+++ b/control/json/fan.cpp
@@ -103,7 +103,7 @@
                 _bus, sensor.second, sensor.first, _interface,
                 FAN_TARGET_PROPERTY, std::move(value));
         }
-        catch (const sdbusplus::exception::exception&)
+        catch (const sdbusplus::exception_t&)
         {
             throw util::DBusPropertyError{
                 fmt::format("Failed to set target for fan {}", _name).c_str(),
diff --git a/control/json/fan.hpp b/control/json/fan.hpp
index 116e50f..124a916 100644
--- a/control/json/fan.hpp
+++ b/control/json/fan.hpp
@@ -128,7 +128,7 @@
     void unlockTarget(uint64_t target);
 
     /* The sdbusplus bus object */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * Interface containing the `Target` property
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index 19d9d9b..0b1c45f 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -764,7 +764,7 @@
     }
 }
 
-void Manager::handleSignal(sdbusplus::message::message& msg,
+void Manager::handleSignal(sdbusplus::message_t& msg,
                            const std::vector<SignalPkg>* pkgs)
 {
     for (auto& pkg : *pkgs)
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index 78963a4..5b6aaac 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -93,8 +93,8 @@
  * Signal handler function that handles parsing a signal's message for a
  * particular signal object and stores the results in the manager
  */
-using SignalHandler = std::function<bool(sdbusplus::message::message&,
-                                         const SignalObject&, Manager&)>;
+using SignalHandler =
+    std::function<bool(sdbusplus::message_t&, const SignalObject&, Manager&)>;
 /**
  * Package of data required when a signal is received
  * Tuple constructed of:
@@ -465,7 +465,7 @@
      * @param[in] msg - Signal message containing the signal's data
      * @param[in] pkgs - Signal packages associated to the signal being handled
      */
-    void handleSignal(sdbusplus::message::message& msg,
+    void handleSignal(sdbusplus::message_t& msg,
                       const std::vector<SignalPkg>* pkgs);
 
     /**
@@ -593,13 +593,13 @@
     void insertFilteredObjects(ManagedObjects& ref);
 
     /* The sdbusplus bus object to use */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /* The sdeventplus even loop to use */
     sdeventplus::Event _event;
 
     /* The sdbusplus manager object to set the ObjectManager interface */
-    sdbusplus::server::manager::manager _mgr;
+    sdbusplus::server::manager_t _mgr;
 
     /* Whether loading the config files is allowed or not */
     bool _loadAllowed;
diff --git a/control/manager.cpp b/control/manager.cpp
index 023df39..e00f9b5 100644
--- a/control/manager.cpp
+++ b/control/manager.cpp
@@ -54,7 +54,7 @@
  * @param[in] condition - The condition to check if true
  * @return result       - True if the condition is true
  */
-bool checkCondition(sdbusplus::bus::bus& bus, const Condition& c)
+bool checkCondition(sdbusplus::bus_t& bus, const Condition& c)
 {
     auto& type = std::get<conditionTypePos>(c);
     auto& properties = std::get<conditionPropertyListPos>(c);
@@ -81,7 +81,7 @@
 }
 
 // Note: Future code will check 'mode' before starting control algorithm
-Manager::Manager(sdbusplus::bus::bus& bus, const sdeventplus::Event& event,
+Manager::Manager(sdbusplus::bus_t& bus, const sdeventplus::Event& event,
                  Mode mode) :
     _bus(bus),
     _objMgr(bus, CONTROL_OBJPATH)
diff --git a/control/manager.hpp b/control/manager.hpp
index bb46a41..992a51a 100644
--- a/control/manager.hpp
+++ b/control/manager.hpp
@@ -40,8 +40,7 @@
      * @param[in] event - The event loop
      * @param[in] mode - The control mode
      */
-    Manager(sdbusplus::bus::bus& bus, const sdeventplus::Event& event,
-            Mode mode);
+    Manager(sdbusplus::bus_t& bus, const sdeventplus::Event& event, Mode mode);
 
     /**
      * Does the fan control inititialization, which is
@@ -54,12 +53,12 @@
     /**
      * The dbus object
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * The sdbusplus object manager
      */
-    sdbusplus::server::manager::manager _objMgr;
+    sdbusplus::server::manager_t _objMgr;
 
     /**
      * The fan zones in the system
diff --git a/control/types.hpp b/control/types.hpp
index 8bc8690..570cf35 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -43,8 +43,8 @@
 constexpr auto propPos = 2;
 using Group = std::vector<std::tuple<std::string, std::string, std::string>>;
 using ZoneHandler = std::function<void(Zone&)>;
-using SignalHandler = std::function<void(sdbusplus::bus::bus&,
-                                         sdbusplus::message::message&, Zone&)>;
+using SignalHandler =
+    std::function<void(sdbusplus::bus_t&, sdbusplus::message_t&, Zone&)>;
 using MethodHandler = std::function<void(Zone&, const Group&)>;
 using Action = std::function<void(Zone&, const Group&)>;
 using Trigger = std::function<void(Zone&, const std::string&, const Group&,
diff --git a/control/zone.cpp b/control/zone.cpp
index be539bf..6e95477 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -47,7 +47,7 @@
 using InternalFailure =
     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
 
-Zone::Zone(Mode mode, sdbusplus::bus::bus& bus, const std::string& path,
+Zone::Zone(Mode mode, sdbusplus::bus_t& bus, const std::string& path,
            const sdeventplus::Event& event, const ZoneDefinition& def) :
     ThermalObject(bus, path.c_str(), ThermalObject::action::defer_emit),
     _bus(bus), _path(path),
@@ -415,8 +415,7 @@
         [this, &eventGroup](auto const& action) { action(*this, eventGroup); });
 }
 
-void Zone::handleEvent(sdbusplus::message::message& msg,
-                       const EventData* eventData)
+void Zone::handleEvent(sdbusplus::message_t& msg, const EventData* eventData)
 {
     // Handle the callback
     std::get<eventHandlerPos> (*eventData)(_bus, msg, *this);
@@ -553,7 +552,7 @@
                              ["Current"];
         if (eData != nullptr)
         {
-            sdbusplus::message::message nullMsg{nullptr};
+            sdbusplus::message_t nullMsg{nullptr};
             handleEvent(nullMsg, eData);
         }
     }
diff --git a/control/zone.hpp b/control/zone.hpp
index a66275a..3decb32 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -21,7 +21,7 @@
 namespace control
 {
 
-using ThermalObject = sdbusplus::server::object::object<
+using ThermalObject = sdbusplus::server::object_t<
     sdbusplus::xyz::openbmc_project::Control::server::ThermalMode>;
 
 /**
@@ -60,7 +60,7 @@
      * @param[in] event - Event loop reference
      * @param[in] def - the fan zone definition data
      */
-    Zone(Mode mode, sdbusplus::bus::bus& bus, const std::string& path,
+    Zone(Mode mode, sdbusplus::bus_t& bus, const std::string& path,
          const sdeventplus::Event& event, const ZoneDefinition& def);
 
     /**
@@ -563,8 +563,7 @@
      * @param[in] msg - Expanded sdbusplus message data
      * @param[in] eventData - The single event's data
      */
-    void handleEvent(sdbusplus::message::message& msg,
-                     const EventData* eventData);
+    void handleEvent(sdbusplus::message_t& msg, const EventData* eventData);
 
     /**
      * @brief Add a signal to the list of signal based events
@@ -664,7 +663,7 @@
     /**
      * The dbus object
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * Zone object path
diff --git a/cooling-type/cooling_type.hpp b/cooling-type/cooling_type.hpp
index 752c32c..215f9cf 100644
--- a/cooling-type/cooling_type.hpp
+++ b/cooling-type/cooling_type.hpp
@@ -44,7 +44,7 @@
      *
      * @param[in] bus - Dbus bus object
      */
-    explicit CoolingType(sdbusplus::bus::bus& bus) : bus(bus), gpioFd(-1)
+    explicit CoolingType(sdbusplus::bus_t& bus) : bus(bus), gpioFd(-1)
     {
         // TODO: Issue openbmc/openbmc#1531 - means to default properties.
     }
@@ -73,7 +73,7 @@
 
   private:
     /** @brief Connection for sdbusplus bus */
-    sdbusplus::bus::bus& bus;
+    sdbusplus::bus_t& bus;
     // File descriptor for the GPIO file we are going to read.
     phosphor::fan::util::FileDescriptor gpioFd;
     bool airCooled = false;
diff --git a/json_config.hpp b/json_config.hpp
index aae33b9..5102ca9 100644
--- a/json_config.hpp
+++ b/json_config.hpp
@@ -174,7 +174,7 @@
      * attempting to get a configuration file. Once the list of compatible
      * values has been updated, it calls the load function.
      */
-    void compatIntfAdded(sdbusplus::message::message& msg)
+    void compatIntfAdded(sdbusplus::message_t& msg)
     {
         sdbusplus::message::object_path op;
         std::map<std::string,
diff --git a/monitor/conditions.cpp b/monitor/conditions.cpp
index 19e9cd8..62e272c 100644
--- a/monitor/conditions.cpp
+++ b/monitor/conditions.cpp
@@ -22,7 +22,7 @@
 
 Condition propertiesMatch(std::vector<PropertyState>&& propStates)
 {
-    return [pStates = std::move(propStates)](sdbusplus::bus::bus& bus) {
+    return [pStates = std::move(propStates)](sdbusplus::bus_t& bus) {
         return std::all_of(
             pStates.begin(), pStates.end(), [&bus](const auto& p) {
                 return util::SDBusPlus::getPropertyVariant<PropertyValue>(
diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index 508d6ac..910d975 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -35,7 +35,7 @@
 using namespace phosphor::logging;
 using namespace sdbusplus::bus::match;
 
-Fan::Fan(Mode mode, sdbusplus::bus::bus& bus, const sdeventplus::Event& event,
+Fan::Fan(Mode mode, sdbusplus::bus_t& bus, const sdeventplus::Event& event,
          std::unique_ptr<trust::Manager>& trust, const FanDefinition& def,
          System& system) :
     _bus(bus),
@@ -143,7 +143,7 @@
     }
 }
 
-void Fan::presenceIfaceAdded(sdbusplus::message::message& msg)
+void Fan::presenceIfaceAdded(sdbusplus::message_t& msg)
 {
     sdbusplus::message::object_path path;
     std::map<std::string, std::map<std::string, std::variant<bool>>> interfaces;
@@ -467,7 +467,7 @@
     return dbusError;
 }
 
-void Fan::presenceChanged(sdbusplus::message::message& msg)
+void Fan::presenceChanged(sdbusplus::message_t& msg)
 {
     std::string interface;
     std::map<std::string, std::variant<bool>> properties;
diff --git a/monitor/fan.hpp b/monitor/fan.hpp
index 8d9f3b2..7dfd6da 100644
--- a/monitor/fan.hpp
+++ b/monitor/fan.hpp
@@ -80,7 +80,7 @@
      * @param def - the fan definition structure
      * @param system - Reference to the system object
      */
-    Fan(Mode mode, sdbusplus::bus::bus& bus, const sdeventplus::Event& event,
+    Fan(Mode mode, sdbusplus::bus_t& bus, const sdeventplus::Event& event,
         std::unique_ptr<trust::Manager>& trust, const FanDefinition& def,
         System& system);
 
@@ -229,7 +229,7 @@
      *
      * @param[in] msg - The message from the propertiesChanged signal
      */
-    void presenceChanged(sdbusplus::message::message& msg);
+    void presenceChanged(sdbusplus::message_t& msg);
 
     /**
      * @brief Called when there is an interfacesAdded signal on the
@@ -238,12 +238,12 @@
      *
      * @param[in] msg - The message from the interfacesAdded signal
      */
-    void presenceIfaceAdded(sdbusplus::message::message& msg);
+    void presenceIfaceAdded(sdbusplus::message_t& msg);
 
     /**
      * @brief the dbus object
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * @brief The inventory name of the fan
@@ -312,13 +312,13 @@
      *        for the inventory item interface to track the
      *        Present property.
      */
-    sdbusplus::bus::match::match _presenceMatch;
+    sdbusplus::bus::match_t _presenceMatch;
 
     /**
      * @brief The match object for the interfacesAdded signal
      *        for the interface that has the Present property.
      */
-    sdbusplus::bus::match::match _presenceIfaceAddedMatch;
+    sdbusplus::bus::match_t _presenceIfaceAddedMatch;
 
     /**
      * @brief The current presence state
diff --git a/monitor/system.cpp b/monitor/system.cpp
index 9da828b..77f3fab 100644
--- a/monitor/system.cpp
+++ b/monitor/system.cpp
@@ -33,6 +33,7 @@
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
+#include <sdbusplus/bus/match.hpp>
 #include <sdeventplus/event.hpp>
 #include <sdeventplus/source/signal.hpp>
 
@@ -44,7 +45,7 @@
 
 using namespace phosphor::logging;
 
-System::System(Mode mode, sdbusplus::bus::bus& bus,
+System::System(Mode mode, sdbusplus::bus_t& bus,
                const sdeventplus::Event& event) :
     _mode(mode),
     _bus(bus), _event(event),
@@ -59,7 +60,7 @@
     namespace match = sdbusplus::bus::match;
 
     // must be done before service detection
-    _inventoryMatch = std::make_unique<match::match>(
+    _inventoryMatch = std::make_unique<sdbusplus::bus::match_t>(
         _bus, match::rules::nameOwnerChanged(util::INVENTORY_SVC),
         std::bind(&System::inventoryOnlineCb, this, std::placeholders::_1));
 
@@ -177,7 +178,7 @@
         for (const auto& [serviceName, unused] : sensorMap)
         {
             // map its service name to the sensor
-            _sensorMatch.emplace_back(std::make_unique<match::match>(
+            _sensorMatch.emplace_back(std::make_unique<sdbusplus::bus::match_t>(
                 _bus, match::rules::nameOwnerChanged(serviceName),
                 std::bind(&System::tachSignalOffline, this,
                           std::placeholders::_1, sensorMap)));
@@ -190,7 +191,7 @@
     }
 }
 
-void System::inventoryOnlineCb(sdbusplus::message::message& msg)
+void System::inventoryOnlineCb(sdbusplus::message_t& msg)
 {
     namespace match = sdbusplus::bus::match;
 
@@ -283,7 +284,7 @@
 // Determine on/offline status, set all sensors for that service
 // to new state
 //
-void System::tachSignalOffline(sdbusplus::message::message& msg,
+void System::tachSignalOffline(sdbusplus::message_t& msg,
                                SensorMapType const& sensorMap)
 {
     std::string serviceName, oldOwner, newOwner;
diff --git a/monitor/system.hpp b/monitor/system.hpp
index 8c1bb44..df3e35f 100644
--- a/monitor/system.hpp
+++ b/monitor/system.hpp
@@ -58,8 +58,7 @@
      * @param[in] bus - sdbusplus bus object
      * @param[in] event - event loop reference
      */
-    System(Mode mode, sdbusplus::bus::bus& bus,
-           const sdeventplus::Event& event);
+    System(Mode mode, sdbusplus::bus_t& bus, const sdeventplus::Event& event);
 
     /**
      * @brief Callback function to handle receiving a HUP signal to reload the
@@ -130,7 +129,7 @@
      *
      * @param[in] msg - Service details.
      */
-    void inventoryOnlineCb(sdbusplus::message::message& msg);
+    void inventoryOnlineCb(sdbusplus::message_t& msg);
 
     /**
      * @brief Create a BMC Dump
@@ -141,7 +140,7 @@
     Mode _mode;
 
     /* The sdbusplus bus object */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /* The event loop reference */
     const sdeventplus::Event& _event;
@@ -150,7 +149,7 @@
     std::unique_ptr<phosphor::fan::trust::Manager> _trust;
 
     /* match object to detect Inventory service */
-    std::unique_ptr<sdbusplus::bus::match::match> _inventoryMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> _inventoryMatch;
 
     /* List of fan objects to monitor */
     std::vector<std::unique_ptr<Fan>> _fans;
@@ -192,7 +191,7 @@
     /**
      * @brief The tach sensors D-Bus match objects
      */
-    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> _sensorMatch;
+    std::vector<std::unique_ptr<sdbusplus::bus::match_t>> _sensorMatch;
 
     /**
      * @brief true if config files have been loaded
@@ -260,7 +259,7 @@
      *
      * @param[in] sensorMap - map providing sensor access for each service
      */
-    void tachSignalOffline(sdbusplus::message::message& msg,
+    void tachSignalOffline(sdbusplus::message_t& msg,
                            const SensorMapType& sensorMap);
 
     /**
diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp
index ec89d5b..825faac 100644
--- a/monitor/tach_sensor.cpp
+++ b/monitor/tach_sensor.cpp
@@ -57,7 +57,7 @@
 template <typename T>
 static void
     readProperty(const std::string& interface, const std::string& propertyName,
-                 const std::string& path, sdbusplus::bus::bus& bus, T& value)
+                 const std::string& path, sdbusplus::bus_t& bus, T& value)
 {
     try
     {
@@ -70,7 +70,7 @@
     }
 }
 
-TachSensor::TachSensor([[maybe_unused]] Mode mode, sdbusplus::bus::bus& bus,
+TachSensor::TachSensor([[maybe_unused]] Mode mode, sdbusplus::bus_t& bus,
                        Fan& fan, const std::string& id, bool hasTarget,
                        size_t funcDelay, const std::string& interface,
                        double factor, int64_t offset, size_t method,
@@ -261,7 +261,7 @@
     }
 }
 
-void TachSensor::handleTargetChange(sdbusplus::message::message& msg)
+void TachSensor::handleTargetChange(sdbusplus::message_t& msg)
 {
     readPropertyFromMessage(msg, _interface, FAN_TARGET_PROPERTY, _tachTarget);
 
@@ -277,7 +277,7 @@
     }
 }
 
-void TachSensor::handleTachChange(sdbusplus::message::message& msg)
+void TachSensor::handleTachChange(sdbusplus::message_t& msg)
 {
     readPropertyFromMessage(msg, util::FAN_SENSOR_VALUE_INTF,
                             FAN_VALUE_PROPERTY, _tachInput);
diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp
index f3619be..30e9129 100644
--- a/monitor/tach_sensor.hpp
+++ b/monitor/tach_sensor.hpp
@@ -105,7 +105,7 @@
      *
      * @param[in] event - Event loop reference
      */
-    TachSensor(Mode mode, sdbusplus::bus::bus& bus, Fan& fan,
+    TachSensor(Mode mode, sdbusplus::bus_t& bus, Fan& fan,
                const std::string& id, bool hasTarget, size_t funcDelay,
                const std::string& interface, double factor, int64_t offset,
                size_t method, size_t threshold, bool ignoreAboveMax,
@@ -124,7 +124,7 @@
      * @param[out] value - the value to store the property value in
      */
     template <typename T>
-    static void readPropertyFromMessage(sdbusplus::message::message& msg,
+    static void readPropertyFromMessage(sdbusplus::message_t& msg,
                                         const std::string& interface,
                                         const std::string& propertyName,
                                         T& value)
@@ -394,7 +394,7 @@
      *
      * @param[in] msg - the dbus message
      */
-    void handleTargetChange(sdbusplus::message::message& msg);
+    void handleTargetChange(sdbusplus::message_t& msg);
 
     /**
      * @brief Reads the Value property and stores in _tachInput.
@@ -402,7 +402,7 @@
      *
      * @param[in] msg - the dbus message
      */
-    void handleTachChange(sdbusplus::message::message& msg);
+    void handleTachChange(sdbusplus::message_t& msg);
 
     /**
      * @brief Updates the Functional property in the inventory
@@ -416,7 +416,7 @@
     /**
      * @brief the dbus object
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * @brief Reference to the parent Fan object
diff --git a/monitor/types.hpp b/monitor/types.hpp
index 1f4b84c..9c0d57f 100644
--- a/monitor/types.hpp
+++ b/monitor/types.hpp
@@ -21,7 +21,7 @@
 {
 
 template <typename... T>
-using ServerObject = typename sdbusplus::server::object::object<T...>;
+using ServerObject = typename sdbusplus::server::object_t<T...>;
 
 using ObjectEnableInterface =
     sdbusplus::xyz::openbmc_project::Object::server::Enable;
@@ -98,7 +98,7 @@
 constexpr auto propValue = 1;
 using PropertyState = std::pair<PropertyIdentity, PropertyValue>;
 
-using Condition = std::function<bool(sdbusplus::bus::bus&)>;
+using Condition = std::function<bool(sdbusplus::bus_t&)>;
 
 using CreateGroupFunction = std::function<std::unique_ptr<trust::Group>()>;
 
diff --git a/power_state.hpp b/power_state.hpp
index ad8a0d5..1b1d419 100644
--- a/power_state.hpp
+++ b/power_state.hpp
@@ -47,7 +47,7 @@
      * @param[in] callback - The function that should be run when
      *                       the power state changes
      */
-    PowerState(sdbusplus::bus::bus& bus, StateChangeFunc callback) : _bus(bus)
+    PowerState(sdbusplus::bus_t& bus, StateChangeFunc callback) : _bus(bus)
     {
         _callbacks.emplace("default", std::move(callback));
     }
@@ -116,7 +116,7 @@
     /**
      * @brief Reference to the D-Bus connection object.
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * @brief The power state value
@@ -161,7 +161,7 @@
      * @param[in] callback - The function that should be run when
      *                       the power state changes
      */
-    PGoodState(sdbusplus::bus::bus& bus, StateChangeFunc func) :
+    PGoodState(sdbusplus::bus_t& bus, StateChangeFunc func) :
         PowerState(bus, func),
         _match(_bus,
                sdbusplus::bus::match::rules::propertiesChanged(_pgoodPath,
@@ -178,7 +178,7 @@
      *
      * @param[in] msg - The payload of the propertiesChanged signal
      */
-    void pgoodChanged(sdbusplus::message::message& msg)
+    void pgoodChanged(sdbusplus::message_t& msg)
     {
         std::string interface;
         std::map<std::string, std::variant<int32_t>> properties;
@@ -222,7 +222,7 @@
     const std::string _pgoodProperty{"pgood"};
 
     /** @brief The propertiesChanged match */
-    sdbusplus::bus::match::match _match;
+    sdbusplus::bus::match_t _match;
 };
 
 /**
@@ -257,7 +257,7 @@
      * @param[in] callback - The function that should be run when
      *                       the power state changes
      */
-    HostPowerState(sdbusplus::bus::bus& bus, StateChangeFunc func) :
+    HostPowerState(sdbusplus::bus_t& bus, StateChangeFunc func) :
         PowerState(bus, func),
         _match(_bus,
                sdbusplus::bus::match::rules::propertiesChangedNamespace(
@@ -274,7 +274,7 @@
      *
      * @param[in] msg - The payload of the propertiesChanged signal
      */
-    void hostStateChanged(sdbusplus::message::message& msg)
+    void hostStateChanged(sdbusplus::message_t& msg)
     {
         std::string interface;
         std::map<std::string, std::variant<std::string>> properties;
@@ -367,7 +367,7 @@
     const std::string _hostStateProperty{"CurrentHostState"};
 
     /** @brief The propertiesChanged match */
-    sdbusplus::bus::match::match _match;
+    sdbusplus::bus::match_t _match;
 };
 
 } // namespace phosphor::fan
diff --git a/presence/error_reporter.cpp b/presence/error_reporter.cpp
index 72c7dae..6210f7d 100644
--- a/presence/error_reporter.cpp
+++ b/presence/error_reporter.cpp
@@ -43,7 +43,7 @@
 const auto loggingCreateIface = "xyz.openbmc_project.Logging.Create";
 
 ErrorReporter::ErrorReporter(
-    sdbusplus::bus::bus& bus,
+    sdbusplus::bus_t& bus,
     const std::vector<
         std::tuple<Fan, std::vector<std::unique_ptr<PresenceSensor>>>>& fans) :
     _bus(bus),
@@ -93,7 +93,7 @@
     }
 }
 
-void ErrorReporter::presenceChanged(sdbusplus::message::message& msg)
+void ErrorReporter::presenceChanged(sdbusplus::message_t& msg)
 {
     bool present;
     auto fanPath = msg.get_path();
diff --git a/presence/error_reporter.hpp b/presence/error_reporter.hpp
index a8c9d6f..d6bc109 100644
--- a/presence/error_reporter.hpp
+++ b/presence/error_reporter.hpp
@@ -42,7 +42,7 @@
      * @param[in] fans - The fans for this configuration
      */
     ErrorReporter(
-        sdbusplus::bus::bus& bus,
+        sdbusplus::bus_t& bus,
         const std::vector<
             std::tuple<Fan, std::vector<std::unique_ptr<PresenceSensor>>>>&
             fans);
@@ -56,7 +56,7 @@
      *
      * @param[in] msg - The payload of the propertiesChanged signal
      */
-    void presenceChanged(sdbusplus::message::message& msg);
+    void presenceChanged(sdbusplus::message_t& msg);
 
     /**
      * @brief The callback function called by the PowerState class
@@ -89,7 +89,7 @@
     /**
      * @brief Reference to the D-Bus connection object.
      */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /**
      * @brief The connection to the event loop for the timer.
@@ -99,7 +99,7 @@
     /**
      * @brief The propertiesChanged match objects.
      */
-    std::vector<sdbusplus::bus::match::match> _matches;
+    std::vector<sdbusplus::bus::match_t> _matches;
 
     /**
      * @brief Base class pointer to the power state implementation.
diff --git a/presence/json_parser.cpp b/presence/json_parser.cpp
index 7858c4f..02c9a11 100644
--- a/presence/json_parser.cpp
+++ b/presence/json_parser.cpp
@@ -52,7 +52,7 @@
 const auto loggingPath = "/xyz/openbmc_project/logging";
 const auto loggingCreateIface = "xyz.openbmc_project.Logging.Create";
 
-JsonConfig::JsonConfig(sdbusplus::bus::bus& bus) : _bus(bus)
+JsonConfig::JsonConfig(sdbusplus::bus_t& bus) : _bus(bus)
 {}
 
 void JsonConfig::start()
diff --git a/presence/json_parser.hpp b/presence/json_parser.hpp
index 216c235..7dbe115 100644
--- a/presence/json_parser.hpp
+++ b/presence/json_parser.hpp
@@ -55,7 +55,7 @@
      *
      * @param[in] bus - sdbusplus bus object
      */
-    explicit JsonConfig(sdbusplus::bus::bus& bus);
+    explicit JsonConfig(sdbusplus::bus_t& bus);
 
     /**
      * @brief Get the json config based fan presence policies
@@ -86,7 +86,7 @@
     static policies _policies;
 
     /* The sdbusplus bus object */
-    sdbusplus::bus::bus& _bus;
+    sdbusplus::bus_t& _bus;
 
     /* List of Fan objects to have presence policies */
     std::vector<fanPolicy> _fans;
diff --git a/presence/tach.cpp b/presence/tach.cpp
index 4c2dc14..9fa8256 100644
--- a/presence/tach.cpp
+++ b/presence/tach.cpp
@@ -57,7 +57,7 @@
         auto tachPath = tachNamespace + std::get<std::string>(s);
 
         // Register for signal callbacks.
-        std::get<1>(s) = std::make_unique<sdbusplus::bus::match::match>(
+        std::get<1>(s) = std::make_unique<sdbusplus::bus::match_t>(
             util::SDBusPlus::getBus(),
             sdbusplus::bus::match::rules::propertiesChanged(tachPath,
                                                             tachIface),
@@ -111,7 +111,7 @@
                        [](const auto& v) { return v != 0; });
 }
 
-void Tach::propertiesChanged(size_t sensor, sdbusplus::message::message& msg)
+void Tach::propertiesChanged(size_t sensor, sdbusplus::message_t& msg)
 {
     std::string iface;
     util::Properties<double> properties;
diff --git a/presence/tach.hpp b/presence/tach.hpp
index 8fd9a08..db8efa2 100644
--- a/presence/tach.hpp
+++ b/presence/tach.hpp
@@ -100,11 +100,11 @@
      * @param[in] sensor - The sensor that changed.
      * @param[in] msg - The sdbusplus signal message.
      */
-    void propertiesChanged(size_t sensor, sdbusplus::message::message& msg);
+    void propertiesChanged(size_t sensor, sdbusplus::message_t& msg);
 
     /** @brief array of tach sensors dbus matches, and tach values. */
-    std::vector<std::tuple<
-        std::string, std::unique_ptr<sdbusplus::bus::match::match>, double>>
+    std::vector<std::tuple<std::string,
+                           std::unique_ptr<sdbusplus::bus::match_t>, double>>
         state;
 
     /** The current state of the sensor. */
diff --git a/sdbusplus.hpp b/sdbusplus.hpp
index 0f5b0be..759f907 100644
--- a/sdbusplus.hpp
+++ b/sdbusplus.hpp
@@ -120,7 +120,7 @@
 
     /** @brief Invoke a method. */
     template <typename... Args>
-    static auto callMethod(sdbusplus::bus::bus& bus, const std::string& busName,
+    static auto callMethod(sdbusplus::bus_t& bus, const std::string& busName,
                            const std::string& path,
                            const std::string& interface,
                            const std::string& method, Args&&... args)
@@ -137,7 +137,7 @@
             }
             return respMsg;
         }
-        catch (const sdbusplus::exception::exception&)
+        catch (const sdbusplus::exception_t&)
         {
             throw DBusMethodError{busName, path, interface, method};
         }
@@ -156,11 +156,11 @@
     /** @brief Invoke a method and read the response. */
     template <typename Ret, typename... Args>
     static auto
-        callMethodAndRead(sdbusplus::bus::bus& bus, const std::string& busName,
+        callMethodAndRead(sdbusplus::bus_t& 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...>(
+        sdbusplus::message_t respMsg = callMethod<Args...>(
             bus, busName, path, interface, method, std::forward<Args>(args)...);
         Ret resp;
         respMsg.read(resp);
@@ -179,7 +179,7 @@
     }
 
     /** @brief Get subtree from the mapper without checking response. */
-    static auto getSubTreeRaw(sdbusplus::bus::bus& bus, const std::string& path,
+    static auto getSubTreeRaw(sdbusplus::bus_t& bus, const std::string& path,
                               const std::string& interface, int32_t depth)
     {
         using namespace std::literals::string_literals;
@@ -200,7 +200,7 @@
 
     /** @brief Get subtree from the mapper without checking response,
      * (multiple interfaces version). */
-    static auto getSubTreeRaw(sdbusplus::bus::bus& bus, const std::string& path,
+    static auto getSubTreeRaw(sdbusplus::bus_t& bus, const std::string& path,
                               const std::vector<std::string>& intfs,
                               int32_t depth)
     {
@@ -220,7 +220,7 @@
     }
 
     /** @brief Get subtree from the mapper. */
-    static auto getSubTree(sdbusplus::bus::bus& bus, const std::string& path,
+    static auto getSubTree(sdbusplus::bus_t& bus, const std::string& path,
                            const std::string& interface, int32_t depth)
     {
         auto mapperResp = getSubTreeRaw(bus, path, interface, depth);
@@ -237,7 +237,7 @@
     }
 
     /** @brief Get subtree paths from the mapper without checking response. */
-    static auto getSubTreePathsRaw(sdbusplus::bus::bus& bus,
+    static auto getSubTreePathsRaw(sdbusplus::bus_t& bus,
                                    const std::string& path,
                                    const std::string& interface, int32_t depth)
     {
@@ -257,8 +257,7 @@
     }
 
     /** @brief Get subtree paths from the mapper. */
-    static auto getSubTreePaths(sdbusplus::bus::bus& bus,
-                                const std::string& path,
+    static auto getSubTreePaths(sdbusplus::bus_t& bus, const std::string& path,
                                 const std::string& interface, int32_t depth)
     {
         auto mapperResp = getSubTreePathsRaw(bus, path, interface, depth);
@@ -275,7 +274,7 @@
     }
 
     /** @brief Get service from the mapper without checking response. */
-    static auto getServiceRaw(sdbusplus::bus::bus& bus, const std::string& path,
+    static auto getServiceRaw(sdbusplus::bus_t& bus, const std::string& path,
                               const std::string& interface)
     {
         using namespace std::literals::string_literals;
@@ -289,7 +288,7 @@
     }
 
     /** @brief Get service from the mapper. */
-    static auto getService(sdbusplus::bus::bus& bus, const std::string& path,
+    static auto getService(sdbusplus::bus_t& bus, const std::string& path,
                            const std::string& interface)
     {
         try
@@ -321,7 +320,7 @@
 
     /** @brief Get managed objects. */
     template <typename Variant>
-    static auto getManagedObjects(sdbusplus::bus::bus& bus,
+    static auto getManagedObjects(sdbusplus::bus_t& bus,
                                   const std::string& service,
                                   const std::string& path)
     {
@@ -340,7 +339,7 @@
 
     /** @brief Get a property with mapper lookup. */
     template <typename Property>
-    static auto getProperty(sdbusplus::bus::bus& bus, const std::string& path,
+    static auto getProperty(sdbusplus::bus_t& bus, const std::string& path,
                             const std::string& interface,
                             const std::string& property)
     {
@@ -371,7 +370,7 @@
 
     /** @brief Get a property variant with mapper lookup. */
     template <typename Variant>
-    static auto getPropertyVariant(sdbusplus::bus::bus& bus,
+    static auto getPropertyVariant(sdbusplus::bus_t& bus,
                                    const std::string& path,
                                    const std::string& interface,
                                    const std::string& property)
@@ -403,7 +402,7 @@
 
     /** @brief Invoke a method and return without checking for error. */
     template <typename... Args>
-    static auto callMethodAndReturn(sdbusplus::bus::bus& bus,
+    static auto callMethodAndReturn(sdbusplus::bus_t& bus,
                                     const std::string& busName,
                                     const std::string& path,
                                     const std::string& interface,
@@ -419,8 +418,8 @@
 
     /** @brief Get a property without mapper lookup. */
     template <typename Property>
-    static auto getProperty(sdbusplus::bus::bus& bus,
-                            const std::string& service, const std::string& path,
+    static auto getProperty(sdbusplus::bus_t& bus, const std::string& service,
+                            const std::string& path,
                             const std::string& interface,
                             const std::string& property)
     {
@@ -451,7 +450,7 @@
 
     /** @brief Get a property variant without mapper lookup. */
     template <typename Variant>
-    static auto getPropertyVariant(sdbusplus::bus::bus& bus,
+    static auto getPropertyVariant(sdbusplus::bus_t& bus,
                                    const std::string& service,
                                    const std::string& path,
                                    const std::string& interface,
@@ -485,7 +484,7 @@
 
     /** @brief Set a property with mapper lookup. */
     template <typename Property>
-    static void setProperty(sdbusplus::bus::bus& bus, const std::string& path,
+    static void setProperty(sdbusplus::bus_t& bus, const std::string& path,
                             const std::string& interface,
                             const std::string& property, Property&& value)
     {
@@ -516,8 +515,8 @@
 
     /** @brief Set a property without mapper lookup. */
     template <typename Property>
-    static void setProperty(sdbusplus::bus::bus& bus,
-                            const std::string& service, const std::string& path,
+    static void setProperty(sdbusplus::bus_t& bus, const std::string& service,
+                            const std::string& path,
                             const std::string& interface,
                             const std::string& property, Property&& value)
     {
@@ -547,7 +546,7 @@
 
     /** @brief Invoke method with mapper lookup. */
     template <typename... Args>
-    static auto lookupAndCallMethod(sdbusplus::bus::bus& bus,
+    static auto lookupAndCallMethod(sdbusplus::bus_t& bus,
                                     const std::string& path,
                                     const std::string& interface,
                                     const std::string& method, Args&&... args)
@@ -568,11 +567,10 @@
 
     /** @brief Invoke method and read with mapper lookup. */
     template <typename Ret, typename... Args>
-    static auto lookupCallMethodAndRead(sdbusplus::bus::bus& bus,
-                                        const std::string& path,
-                                        const std::string& interface,
-                                        const std::string& method,
-                                        Args&&... args)
+    static auto
+        lookupCallMethodAndRead(sdbusplus::bus_t& bus, const std::string& path,
+                                const std::string& interface,
+                                const std::string& method, Args&&... args)
     {
         return callMethodAndRead(bus, getService(bus, path, interface), path,
                                  interface, method,
diff --git a/sensor-monitor/shutdown_alarm_monitor.cpp b/sensor-monitor/shutdown_alarm_monitor.cpp
index 39ced21..8fad830 100644
--- a/sensor-monitor/shutdown_alarm_monitor.cpp
+++ b/sensor-monitor/shutdown_alarm_monitor.cpp
@@ -85,7 +85,7 @@
 using namespace sdbusplus::bus::match;
 
 ShutdownAlarmMonitor::ShutdownAlarmMonitor(
-    sdbusplus::bus::bus& bus, sdeventplus::Event& event,
+    sdbusplus::bus_t& bus, sdeventplus::Event& event,
     std::shared_ptr<PowerState> powerState) :
     bus(bus),
     event(event), _powerState(std::move(powerState)),
@@ -170,8 +170,7 @@
     }
 }
 
-void ShutdownAlarmMonitor::propertiesChanged(
-    sdbusplus::message::message& message)
+void ShutdownAlarmMonitor::propertiesChanged(sdbusplus::message_t& message)
 {
     std::map<std::string, std::variant<bool>> properties;
     std::string interface;
diff --git a/sensor-monitor/shutdown_alarm_monitor.hpp b/sensor-monitor/shutdown_alarm_monitor.hpp
index b63fe83..f9162f6 100644
--- a/sensor-monitor/shutdown_alarm_monitor.hpp
+++ b/sensor-monitor/shutdown_alarm_monitor.hpp
@@ -70,7 +70,7 @@
      * @param[in] event - The sdeventplus event object
      * @param[in] powerState - The PowerState object
      */
-    ShutdownAlarmMonitor(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
+    ShutdownAlarmMonitor(sdbusplus::bus_t& bus, sdeventplus::Event& event,
                          std::shared_ptr<phosphor::fan::PowerState> powerState);
 
   private:
@@ -80,7 +80,7 @@
      * If the power is on, the new alarm values will be checked to see
      * if the shutdown timer needs to be started or stopped.
      */
-    void propertiesChanged(sdbusplus::message::message& message);
+    void propertiesChanged(sdbusplus::message_t& message);
 
     /**
      * @brief Checks an alarm value to see if a shutdown timer needs
@@ -169,7 +169,7 @@
     /**
      * @brief The sdbusplus bus object
      */
-    sdbusplus::bus::bus& bus;
+    sdbusplus::bus_t& bus;
 
     /**
      * @brief The sdeventplus Event object
@@ -185,13 +185,13 @@
      * @brief The match for properties changing on the HardShutdown
      *        interface.
      */
-    sdbusplus::bus::match::match hardShutdownMatch;
+    sdbusplus::bus::match_t hardShutdownMatch;
 
     /**
      * @brief The match for properties changing on the SoftShutdown
      *        interface.
      */
-    sdbusplus::bus::match::match softShutdownMatch;
+    sdbusplus::bus::match_t softShutdownMatch;
 
     /**
      * @brief The map of alarms.
diff --git a/sensor-monitor/threshold_alarm_logger.cpp b/sensor-monitor/threshold_alarm_logger.cpp
index d64366b..b2fd7e8 100644
--- a/sensor-monitor/threshold_alarm_logger.cpp
+++ b/sensor-monitor/threshold_alarm_logger.cpp
@@ -83,7 +83,7 @@
              ErrorData{"PerfLossLowClear", Entry::Level::Informational}}}}}}};
 
 ThresholdAlarmLogger::ThresholdAlarmLogger(
-    sdbusplus::bus::bus& bus, sdeventplus::Event& event,
+    sdbusplus::bus_t& bus, sdeventplus::Event& event,
     std::shared_ptr<PowerState> powerState) :
     bus(bus),
     event(event), _powerState(std::move(powerState)),
@@ -135,7 +135,7 @@
         });
 }
 
-void ThresholdAlarmLogger::propertiesChanged(sdbusplus::message::message& msg)
+void ThresholdAlarmLogger::propertiesChanged(sdbusplus::message_t& msg)
 {
     std::map<std::string, std::variant<bool>> properties;
     std::string sensorPath = msg.get_path();
@@ -180,7 +180,7 @@
     }
 }
 
-void ThresholdAlarmLogger::interfacesRemoved(sdbusplus::message::message& msg)
+void ThresholdAlarmLogger::interfacesRemoved(sdbusplus::message_t& msg)
 {
     static const std::vector<std::string> thresholdNames{
         warningInterface, criticalInterface, perfLossInterface};
@@ -224,7 +224,7 @@
                 createEventLog(sensorPath, interface, property, alarmValue);
             }
         }
-        catch (const sdbusplus::exception::exception& e)
+        catch (const sdbusplus::exception_t& e)
         {
             // Sensor daemons that get their direction from entity manager
             // may only be putting either the high alarm or low alarm on
diff --git a/sensor-monitor/threshold_alarm_logger.hpp b/sensor-monitor/threshold_alarm_logger.hpp
index 0067274..8659ea7 100644
--- a/sensor-monitor/threshold_alarm_logger.hpp
+++ b/sensor-monitor/threshold_alarm_logger.hpp
@@ -66,7 +66,7 @@
      * @param[in] event - The sdeventplus event object
      * @param[in] powerState - The PowerState object
      */
-    ThresholdAlarmLogger(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
+    ThresholdAlarmLogger(sdbusplus::bus_t& bus, sdeventplus::Event& event,
                          std::shared_ptr<phosphor::fan::PowerState> powerState);
 
   private:
@@ -78,7 +78,7 @@
      *
      * @param[in] msg - The signal message payload.
      */
-    void propertiesChanged(sdbusplus::message::message& msg);
+    void propertiesChanged(sdbusplus::message_t& msg);
 
     /**
      * @brief The interfacesRemoved removed handler for the threshold
@@ -88,7 +88,7 @@
      *
      * @param[in] msg - The signal message payload.
      */
-    void interfacesRemoved(sdbusplus::message::message& msg);
+    void interfacesRemoved(sdbusplus::message_t& msg);
 
     /**
      * @brief Checks for active alarms on the path and threshold interface
@@ -169,7 +169,7 @@
     /**
      * @brief The sdbusplus bus object
      */
-    sdbusplus::bus::bus& bus;
+    sdbusplus::bus_t& bus;
 
     /**
      * @brief The sdeventplus Event object
@@ -184,22 +184,22 @@
     /**
      * @brief The Warning interface match object
      */
-    sdbusplus::bus::match::match warningMatch;
+    sdbusplus::bus::match_t warningMatch;
 
     /**
      * @brief The Critical interface match object
      */
-    sdbusplus::bus::match::match criticalMatch;
+    sdbusplus::bus::match_t criticalMatch;
 
     /**
      * @brief The PerformanceLoss interface match object
      */
-    sdbusplus::bus::match::match perfLossMatch;
+    sdbusplus::bus::match_t perfLossMatch;
 
     /**
      * @brief The InterfacesRemoved match object
      */
-    sdbusplus::bus::match::match ifacesRemovedMatch;
+    sdbusplus::bus::match_t ifacesRemovedMatch;
 
     /**
      * @brief The current alarm values
