diff --git a/include/bridgingcommands.hpp b/include/bridgingcommands.hpp
index 545d24a..b771bfd 100644
--- a/include/bridgingcommands.hpp
+++ b/include/bridgingcommands.hpp
@@ -153,7 +153,7 @@
 
     IpmbRequest(const ipmbHeader* ipmbBuffer, size_t bufferLength);
 
-    void prepareRequest(sdbusplus::message::message& mesg);
+    void prepareRequest(sdbusplus::message_t& mesg);
 };
 
 struct IpmbResponse
diff --git a/include/sdrutils.hpp b/include/sdrutils.hpp
index e48c628..4f33c52 100644
--- a/include/sdrutils.hpp
+++ b/include/sdrutils.hpp
@@ -228,18 +228,18 @@
         sd_bus_unref(bus);
         return sensorUpdatedIndex;
     }
-    sdbusplus::bus::bus dbus(bus);
-    static sdbusplus::bus::match::match sensorAdded(
+    sdbusplus::bus_t dbus(bus);
+    static sdbusplus::bus::match_t sensorAdded(
         dbus,
         "type='signal',member='InterfacesAdded',arg0path='/xyz/openbmc_project/"
         "sensors/'",
-        [](sdbusplus::message::message& m) { sensorTreePtr.reset(); });
+        [](sdbusplus::message_t& m) { sensorTreePtr.reset(); });
 
-    static sdbusplus::bus::match::match sensorRemoved(
+    static sdbusplus::bus::match_t sensorRemoved(
         dbus,
         "type='signal',member='InterfacesRemoved',arg0path='/xyz/"
         "openbmc_project/sensors/'",
-        [](sdbusplus::message::message& m) { sensorTreePtr.reset(); });
+        [](sdbusplus::message_t& m) { sensorTreePtr.reset(); });
 
     if (sensorTreePtr)
     {
@@ -454,7 +454,7 @@
     std::vector<std::string> interfaces;
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
 
-    sdbusplus::message::message getObjectMessage =
+    sdbusplus::message_t getObjectMessage =
         dbus->new_method_call("xyz.openbmc_project.ObjectMapper",
                               "/xyz/openbmc_project/object_mapper",
                               "xyz.openbmc_project.ObjectMapper", "GetObject");
@@ -462,7 +462,7 @@
 
     try
     {
-        sdbusplus::message::message response = dbus->call(getObjectMessage);
+        sdbusplus::message_t response = dbus->call(getObjectMessage);
         response.read(interfacesResponse);
     }
     catch (const std::exception& e)
@@ -481,14 +481,14 @@
     std::map<std::string, DbusVariant> properties;
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
 
-    sdbusplus::message::message getProperties =
+    sdbusplus::message_t getProperties =
         dbus->new_method_call("xyz.openbmc_project.EntityManager", path,
                               "org.freedesktop.DBus.Properties", "GetAll");
     getProperties.append(interface);
 
     try
     {
-        sdbusplus::message::message response = dbus->call(getProperties);
+        sdbusplus::message_t response = dbus->call(getProperties);
         response.read(properties);
     }
     catch (const std::exception& e)
diff --git a/src/appcommands.cpp b/src/appcommands.cpp
index 10e3d13..1d61889 100644
--- a/src/appcommands.cpp
+++ b/src/appcommands.cpp
@@ -43,7 +43,7 @@
 static constexpr const char* bmcStateReadyStr =
     "xyz.openbmc_project.State.BMC.BMCState.Ready";
 
-static std::unique_ptr<sdbusplus::bus::match::match> bmcStateChangedSignal;
+static std::unique_ptr<sdbusplus::bus::match_t> bmcStateChangedSignal;
 static uint8_t bmcDeviceBusy = true;
 
 int initBMCDeviceState(ipmi::Context::ptr ctx)
@@ -78,11 +78,11 @@
 
     // BMC state may change runtime while doing firmware udpate.
     // Register for property change signal to update state.
-    bmcStateChangedSignal = std::make_unique<sdbusplus::bus::match::match>(
+    bmcStateChangedSignal = std::make_unique<sdbusplus::bus::match_t>(
         *(ctx->bus),
         sdbusplus::bus::match::rules::propertiesChanged(objInfo.first,
                                                         bmcStateIntf),
-        [](sdbusplus::message::message& msg) {
+        [](sdbusplus::message_t& msg) {
             std::map<std::string, std::variant<std::string>> props;
             std::vector<std::string> inVal;
             std::string iface;
diff --git a/src/bmccontrolservices.cpp b/src/bmccontrolservices.cpp
index b2b9610..e30c4a9 100644
--- a/src/bmccontrolservices.cpp
+++ b/src/bmccontrolservices.cpp
@@ -63,7 +63,7 @@
             serviceCfgMgr = ipmi::getService(*sdbusp, objectManagerIntf,
                                              serviceConfigBasePath);
         }
-        catch (const sdbusplus::exception::exception& e)
+        catch (const sdbusplus::exception_t& e)
         {
             serviceCfgMgr.clear();
             phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -156,7 +156,7 @@
             }
         }
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         return ipmi::responseUnspecifiedError();
     }
@@ -189,7 +189,7 @@
             }
         }
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         return ipmi::responseUnspecifiedError();
     }
diff --git a/src/bridgingcommands.cpp b/src/bridgingcommands.cpp
index c110563..f6fc02f 100644
--- a/src/bridgingcommands.cpp
+++ b/src/bridgingcommands.cpp
@@ -192,7 +192,7 @@
                             (ipmbResponseDataHeaderLength + data.size()));
 }
 
-void IpmbRequest::prepareRequest(sdbusplus::message::message& mesg)
+void IpmbRequest::prepareRequest(sdbusplus::message_t& mesg)
 {
     mesg.append(ipmbMeChannelNum, netFn, rqLun, cmd, data);
 }
@@ -592,7 +592,7 @@
             getMsgFlagsRes.set(getMsgFlagWatchdogPreTimeOutBit);
         }
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiAppGetMessageFlags, dbus call exception");
@@ -667,7 +667,7 @@
                                   wdtInterruptFlagProp, false);
         }
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiAppClearMessageFlags: can't Clear/Set "
diff --git a/src/chassiscommands.cpp b/src/chassiscommands.cpp
index a6df1ac..edea2ea 100644
--- a/src/chassiscommands.cpp
+++ b/src/chassiscommands.cpp
@@ -101,7 +101,7 @@
             getDbusProperty(*bus, service, objName, ledInterface, ledProp);
         state = std::get<bool>(enabled);
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         log<level::ERR>("Fail to get property", entry("PATH=%s", objName),
                         entry("ERROR=%s", e.what()));
@@ -116,7 +116,7 @@
     enclosureIdentifyLed(ledIDBlinkObj, false);
 }
 
-void idButtonPropChanged(sdbusplus::message::message& msg)
+void idButtonPropChanged(sdbusplus::message_t& msg)
 {
     bool asserted = false;
     bool buttonPressed = false;
@@ -339,7 +339,7 @@
             *busp, service, buttonPath, buttonIntf, "ButtonMasked");
         buttonDisabled = std::get<bool>(disabled);
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         log<level::ERR>("Fail to get button disabled property",
                         entry("PATH=%s", buttonPath.c_str()),
diff --git a/src/firmware-update.cpp b/src/firmware-update.cpp
index ea51288..b622d31 100644
--- a/src/firmware-update.cpp
+++ b/src/firmware-update.cpp
@@ -376,11 +376,11 @@
         std::shared_ptr<sdbusplus::asio::connection> busp = getSdBus();
         fwUpdateState = fwStateProgram;
         progressPercent = 0;
-        match = std::make_shared<sdbusplus::bus::match::match>(
+        match = std::make_shared<sdbusplus::bus::match_t>(
             *busp,
             sdbusplus::bus::match::rules::propertiesChanged(
                 objPath, "xyz.openbmc_project.Software.ActivationProgress"),
-            [&](sdbusplus::message::message& msg) {
+            [&](sdbusplus::message_t& msg) {
                 std::map<std::string, ipmi::DbusVariant> props;
                 std::vector<std::string> inVal;
                 std::string iface;
@@ -445,7 +445,7 @@
 
   protected:
     std::shared_ptr<sdbusplus::asio::connection> busp;
-    std::shared_ptr<sdbusplus::bus::match::match> match;
+    std::shared_ptr<sdbusplus::bus::match_t> match;
     uint8_t fwUpdateState = 0;
     uint8_t progressPercent = 0;
     bool deferRestartState = false;
@@ -561,7 +561,7 @@
 }
 
 static void postTransferCompleteHandler(
-    std::unique_ptr<sdbusplus::bus::match::match>& fwUpdateMatchSignal)
+    std::unique_ptr<sdbusplus::bus::match_t>& fwUpdateMatchSignal)
 {
     // Setup timer for watching signal
     static phosphor::Timer timer(
@@ -579,7 +579,7 @@
     timer.start(std::chrono::microseconds(5000000), false);
 
     // callback function for capturing signal
-    auto callback = [&](sdbusplus::message::message& m) {
+    auto callback = [&](sdbusplus::message_t& m) {
         bool flag = false;
 
         std::vector<std::pair<
@@ -638,7 +638,7 @@
     };
 
     // Adding matcher
-    fwUpdateMatchSignal = std::make_unique<sdbusplus::bus::match::match>(
+    fwUpdateMatchSignal = std::make_unique<sdbusplus::bus::match_t>(
         *getSdBus(),
         "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
         "member='InterfacesAdded',path='/xyz/openbmc_project/software'",
@@ -650,7 +650,7 @@
     // the code gets to this point, the file should be transferred start the
     // request (creating a new file in /tmp/images causes the update manager to
     // check if it is ready for activation)
-    static std::unique_ptr<sdbusplus::bus::match::match> fwUpdateMatchSignal;
+    static std::unique_ptr<sdbusplus::bus::match_t> fwUpdateMatchSignal;
     postTransferCompleteHandler(fwUpdateMatchSignal);
     std::filesystem::rename(
         uri, "/tmp/images/" +
diff --git a/src/manufacturingcommands.cpp b/src/manufacturingcommands.cpp
index 975484f..6aed0e9 100644
--- a/src/manufacturingcommands.cpp
+++ b/src/manufacturingcommands.cpp
@@ -227,7 +227,7 @@
         *reply = ipmi::getDbusProperty(*getSdBus(), service, path, interface,
                                        propertyName);
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
             "ERROR: getProperty");
@@ -248,7 +248,7 @@
         ipmi::setDbusProperty(*getSdBus(), service, path, interface,
                               propertyName, value);
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
             "ERROR: setProperty");
@@ -269,7 +269,7 @@
         method.append(pidControlService, "replace");
         auto reply = dbus->call(method);
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
             "ERROR: phosphor-pid-control service start or stop failed");
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index 12fdae7..910330d 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -117,7 +117,7 @@
 static constexpr const char* dBusPropertySetMethod = "Set";
 
 // return code: 0 successful
-int8_t getChassisSerialNumber(sdbusplus::bus::bus& bus, std::string& serial)
+int8_t getChassisSerialNumber(sdbusplus::bus_t& bus, std::string& serial)
 {
     std::string objpath = "/xyz/openbmc_project/FruDevice";
     std::string intf = "xyz.openbmc_project.FruDeviceManager";
@@ -439,7 +439,7 @@
                             hsbpObjPath, biosVersionIntf, "Version");
         hscVersion = std::get<std::string>(hscVersionValue);
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
             "Failed to retrieve HSBP version information",
@@ -1481,7 +1481,7 @@
 
 } // namespace ledAction
 
-int8_t getLEDState(sdbusplus::bus::bus& bus, const std::string& intf,
+int8_t getLEDState(sdbusplus::bus_t& bus, const std::string& intf,
                    const std::string& objPath, uint8_t& state)
 {
     try
@@ -1494,7 +1494,7 @@
             sdbusplus::xyz::openbmc_project::Led::server::Physical::
                 convertActionFromString(strState));
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
         return -1;
@@ -1657,7 +1657,7 @@
     "/xyz/openbmc_project/control/thermal_mode";
 
 bool getFanProfileInterface(
-    sdbusplus::bus::bus& bus,
+    sdbusplus::bus_t& bus,
     boost::container::flat_map<
         std::string, std::variant<std::vector<std::string>, std::string>>& resp)
 {
@@ -3196,7 +3196,7 @@
                 return ipmi::responseResponseError();
         }
     }
-    catch (const sdbusplus::exception::exception& e)
+    catch (const sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
         return ipmi::responseResponseError();
diff --git a/src/sensorcommands.cpp b/src/sensorcommands.cpp
index d204885..2964513 100644
--- a/src/sensorcommands.cpp
+++ b/src/sensorcommands.cpp
@@ -95,22 +95,22 @@
 
 void registerSensorFunctions() __attribute__((constructor));
 
-static sdbusplus::bus::match::match sensorAdded(
+static sdbusplus::bus::match_t sensorAdded(
     *getSdBus(),
     "type='signal',member='InterfacesAdded',arg0path='/xyz/openbmc_project/"
     "sensors/'",
-    [](sdbusplus::message::message& m) {
+    [](sdbusplus::message_t& m) {
         sensorTree.clear();
         sdrLastAdd = std::chrono::duration_cast<std::chrono::seconds>(
                          std::chrono::system_clock::now().time_since_epoch())
                          .count();
     });
 
-static sdbusplus::bus::match::match sensorRemoved(
+static sdbusplus::bus::match_t sensorRemoved(
     *getSdBus(),
     "type='signal',member='InterfacesRemoved',arg0path='/xyz/openbmc_project/"
     "sensors/'",
-    [](sdbusplus::message::message& m) {
+    [](sdbusplus::message_t& m) {
         sensorTree.clear();
         sdrLastRemove = std::chrono::duration_cast<std::chrono::seconds>(
                             std::chrono::system_clock::now().time_since_epoch())
@@ -123,11 +123,11 @@
     std::string, boost::container::flat_map<std::string, std::optional<bool>>>
     thresholdDeassertMap;
 
-static sdbusplus::bus::match::match thresholdChanged(
+static sdbusplus::bus::match_t thresholdChanged(
     *getSdBus(),
     "type='signal',member='PropertiesChanged',interface='org.freedesktop.DBus."
     "Properties',arg0namespace='xyz.openbmc_project.Sensor.Threshold'",
-    [](sdbusplus::message::message& m) {
+    [](sdbusplus::message_t& m) {
         boost::container::flat_map<std::string, std::variant<bool, double>>
             values;
         m.read(std::string(), values);
diff --git a/src/smbiosmdrv2handler.cpp b/src/smbiosmdrv2handler.cpp
index fa250c6..59f38fa 100644
--- a/src/smbiosmdrv2handler.cpp
+++ b/src/smbiosmdrv2handler.cpp
@@ -64,15 +64,15 @@
                                   const std::string& service)
 {
     std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
-    sdbusplus::message::message method =
+    sdbusplus::message_t method =
         bus->new_method_call(service.c_str(), mdrv2Path, dbusProperties, "Get");
     method.append(mdrv2Interface, name);
 
-    sdbusplus::message::message reply = bus->call(method);
+    sdbusplus::message_t reply = bus->call(method);
 
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(value);
     }
     catch (const sdbusplus::exception_t& e)
@@ -91,14 +91,14 @@
 {
     std::vector<uint32_t> commonData;
     std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
-    sdbusplus::message::message method =
+    sdbusplus::message_t method =
         bus->new_method_call(service.c_str(), mdrv2Path, mdrv2Interface,
                              "SynchronizeDirectoryCommonData");
     method.append(idIndex, size);
 
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(commonData);
     }
     catch (const sdbusplus::exception_t& e)
@@ -135,7 +135,7 @@
     }
 
     std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "FindIdIndex");
     std::vector<uint8_t> info;
     info.resize(len);
@@ -144,7 +144,7 @@
 
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(idIndex);
     }
     catch (const sdbusplus::exception_t& e)
@@ -316,7 +316,7 @@
         return ipmi::responseParmOutOfRange();
     }
 
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "GetDirectoryInformation");
 
     method.append(dirIndex);
@@ -324,7 +324,7 @@
     std::vector<uint8_t> dataOut;
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(dataOut);
     }
     catch (const sdbusplus::exception_t& e)
@@ -403,7 +403,7 @@
         return ipmi::response(ccStorageLeak);
     }
 
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "SendDirectoryInformation");
     method.append(dirVersion, dirIndex, returnedEntries, remainingEntries,
                   dataInfo);
@@ -411,7 +411,7 @@
     bool terminate = false;
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(terminate);
     }
     catch (const sdbusplus::exception_t& e)
@@ -469,7 +469,7 @@
         return ipmi::responseParmOutOfRange();
     }
 
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "GetDataInformation");
 
     method.append(static_cast<uint8_t>(idIndex));
@@ -477,7 +477,7 @@
     std::vector<uint8_t> res;
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(res);
     }
     catch (const sdbusplus::exception_t& e)
@@ -524,13 +524,13 @@
         return ipmi::responseParmOutOfRange();
     }
 
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "GetDataOffer");
 
     std::vector<uint8_t> dataOut;
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(dataOut);
     }
     catch (const sdbusplus::exception_t& e)
@@ -602,7 +602,7 @@
         return ipmi::responseParmOutOfRange();
     }
 
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "SendDataInformation");
 
     method.append((uint8_t)idIndex, validFlag, dataLength, dataVersion,
@@ -611,7 +611,7 @@
     bool entryChanged = true;
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(entryChanged);
     }
     catch (const sdbusplus::exception_t& e)
@@ -1243,12 +1243,12 @@
     bool status = false;
     std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
     std::string service = ipmi::getService(*bus, mdrv2Interface, mdrv2Path);
-    sdbusplus::message::message method = bus->new_method_call(
+    sdbusplus::message_t method = bus->new_method_call(
         service.c_str(), mdrv2Path, mdrv2Interface, "AgentSynchronizeData");
 
     try
     {
-        sdbusplus::message::message reply = bus->call(method);
+        sdbusplus::message_t reply = bus->call(method);
         reply.read(status);
     }
     catch (const sdbusplus::exception_t& e)
diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index a67fe41..e743a2d 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -119,7 +119,7 @@
 static uint8_t writeAddr = 0XFF;
 
 std::unique_ptr<phosphor::Timer> writeTimer = nullptr;
-static std::vector<sdbusplus::bus::match::match> fruMatches;
+static std::vector<sdbusplus::bus::match_t> fruMatches;
 
 ManagedObjectType frus;
 
@@ -138,13 +138,13 @@
         return true;
     }
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    sdbusplus::message::message writeFru = dbus->new_method_call(
+    sdbusplus::message_t writeFru = dbus->new_method_call(
         fruDeviceServiceName, "/xyz/openbmc_project/FruDevice",
         "xyz.openbmc_project.FruDeviceManager", "WriteFru");
     writeFru.append(writeBus, writeAddr, fruCache);
     try
     {
-        sdbusplus::message::message writeFruResp = dbus->call(writeFru);
+        sdbusplus::message_t writeFruResp = dbus->call(writeFru);
     }
     catch (const sdbusplus::exception_t&)
     {
@@ -384,7 +384,7 @@
     fruMatches.emplace_back(*bus,
                             "type='signal',arg0path='/xyz/openbmc_project/"
                             "FruDevice/',member='InterfacesAdded'",
-                            [](sdbusplus::message::message& message) {
+                            [](sdbusplus::message_t& message) {
                                 sdbusplus::message::object_path path;
                                 ObjectType object;
                                 try
@@ -410,7 +410,7 @@
     fruMatches.emplace_back(*bus,
                             "type='signal',arg0path='/xyz/openbmc_project/"
                             "FruDevice/',member='InterfacesRemoved'",
-                            [](sdbusplus::message::message& message) {
+                            [](sdbusplus::message_t& message) {
                                 sdbusplus::message::object_path path;
                                 std::set<std::string> interfaces;
                                 try
@@ -1256,13 +1256,13 @@
 
     // Reload rsyslog so it knows to start new log files
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    sdbusplus::message::message rsyslogReload = dbus->new_method_call(
+    sdbusplus::message_t rsyslogReload = dbus->new_method_call(
         "org.freedesktop.systemd1", "/org/freedesktop/systemd1",
         "org.freedesktop.systemd1.Manager", "ReloadUnit");
     rsyslogReload.append("rsyslog.service", "replace");
     try
     {
-        sdbusplus::message::message reloadResponse = dbus->call(rsyslogReload);
+        sdbusplus::message_t reloadResponse = dbus->call(rsyslogReload);
     }
     catch (const sdbusplus::exception_t& e)
     {
diff --git a/src/whitelist-filter.cpp b/src/whitelist-filter.cpp
index 5b8eb27..0d26258 100644
--- a/src/whitelist-filter.cpp
+++ b/src/whitelist-filter.cpp
@@ -38,12 +38,12 @@
   private:
     void postInit();
     void cacheRestrictedAndPostCompleteMode();
-    void handleRestrictedModeChange(sdbusplus::message::message& m);
-    void handlePostCompleteChange(sdbusplus::message::message& m);
+    void handleRestrictedModeChange(sdbusplus::message_t& m);
+    void handlePostCompleteChange(sdbusplus::message_t& m);
     void updatePostComplete(const std::string& value);
     void updateRestrictionMode(const std::string& value);
     ipmi::Cc filterMessage(ipmi::message::Request::ptr request);
-    void handleCoreBiosDoneChange(sdbusplus::message::message& m);
+    void handleCoreBiosDoneChange(sdbusplus::message_t& m);
     void cacheCoreBiosDone();
 
     // the BMC KCS Policy Control Modes document uses different names
@@ -60,12 +60,12 @@
     bool coreBIOSDone = true;
     int channelSMM = -1;
     std::shared_ptr<sdbusplus::asio::connection> bus;
-    std::unique_ptr<sdbusplus::bus::match::match> modeChangeMatch;
-    std::unique_ptr<sdbusplus::bus::match::match> modeIntfAddedMatch;
-    std::unique_ptr<sdbusplus::bus::match::match> postCompleteMatch;
-    std::unique_ptr<sdbusplus::bus::match::match> postCompleteIntfAddedMatch;
-    std::unique_ptr<sdbusplus::bus::match::match> platStateChangeMatch;
-    std::unique_ptr<sdbusplus::bus::match::match> platStateIntfAddedMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> modeChangeMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> modeIntfAddedMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> postCompleteMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> postCompleteIntfAddedMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> platStateChangeMatch;
+    std::unique_ptr<sdbusplus::bus::match_t> platStateIntfAddedMatch;
 
     static constexpr const char restrictionModeIntf[] =
         "xyz.openbmc_project.Control.Security.RestrictionMode";
@@ -166,7 +166,7 @@
                      entry("VALUE=%d", static_cast<int>(restrictionMode)));
 }
 
-void WhitelistFilter::handleRestrictedModeChange(sdbusplus::message::message& m)
+void WhitelistFilter::handleRestrictedModeChange(sdbusplus::message_t& m)
 {
     std::string signal = m.get_member();
     if (signal == "PropertiesChanged")
@@ -213,7 +213,7 @@
                                    : "Updated to !POST Complete");
 }
 
-void WhitelistFilter::handlePostCompleteChange(sdbusplus::message::message& m)
+void WhitelistFilter::handlePostCompleteChange(sdbusplus::message_t& m)
 {
     std::string signal = m.get_member();
     if (signal == "PropertiesChanged")
@@ -284,7 +284,7 @@
         "org.freedesktop.DBus.Properties", "Get", hostMiscIntf, "CoreBiosDone");
 }
 
-void WhitelistFilter::handleCoreBiosDoneChange(sdbusplus::message::message& msg)
+void WhitelistFilter::handleCoreBiosDoneChange(sdbusplus::message_t& msg)
 {
     std::string signal = msg.get_member();
     if (signal == "PropertiesChanged")
@@ -359,35 +359,28 @@
         rules::interfacesAdded() +
         rules::argNpath(0, "/xyz/openbmc_project/misc/platform_state");
 
-    modeChangeMatch = std::make_unique<sdbusplus::bus::match::match>(
-        *bus, filterStrModeChange, [this](sdbusplus::message::message& m) {
-            handleRestrictedModeChange(m);
-        });
-    modeIntfAddedMatch = std::make_unique<sdbusplus::bus::match::match>(
-        *bus, filterStrModeIntfAdd, [this](sdbusplus::message::message& m) {
-            handleRestrictedModeChange(m);
-        });
+    modeChangeMatch = std::make_unique<sdbusplus::bus::match_t>(
+        *bus, filterStrModeChange,
+        [this](sdbusplus::message_t& m) { handleRestrictedModeChange(m); });
+    modeIntfAddedMatch = std::make_unique<sdbusplus::bus::match_t>(
+        *bus, filterStrModeIntfAdd,
+        [this](sdbusplus::message_t& m) { handleRestrictedModeChange(m); });
 
-    postCompleteMatch = std::make_unique<sdbusplus::bus::match::match>(
-        *bus, filterStrPostComplete, [this](sdbusplus::message::message& m) {
-            handlePostCompleteChange(m);
-        });
+    postCompleteMatch = std::make_unique<sdbusplus::bus::match_t>(
+        *bus, filterStrPostComplete,
+        [this](sdbusplus::message_t& m) { handlePostCompleteChange(m); });
 
-    postCompleteIntfAddedMatch = std::make_unique<sdbusplus::bus::match::match>(
-        *bus, filterStrPostIntfAdd, [this](sdbusplus::message::message& m) {
-            handlePostCompleteChange(m);
-        });
+    postCompleteIntfAddedMatch = std::make_unique<sdbusplus::bus::match_t>(
+        *bus, filterStrPostIntfAdd,
+        [this](sdbusplus::message_t& m) { handlePostCompleteChange(m); });
 
-    platStateChangeMatch = std::make_unique<sdbusplus::bus::match::match>(
-        *bus, filterStrPlatStateChange, [this](sdbusplus::message::message& m) {
-            handleCoreBiosDoneChange(m);
-        });
+    platStateChangeMatch = std::make_unique<sdbusplus::bus::match_t>(
+        *bus, filterStrPlatStateChange,
+        [this](sdbusplus::message_t& m) { handleCoreBiosDoneChange(m); });
 
-    platStateIntfAddedMatch = std::make_unique<sdbusplus::bus::match::match>(
+    platStateIntfAddedMatch = std::make_unique<sdbusplus::bus::match_t>(
         *bus, filterStrPlatStateIntfAdd,
-        [this](sdbusplus::message::message& m) {
-            handleCoreBiosDoneChange(m);
-        });
+        [this](sdbusplus::message_t& m) { handleCoreBiosDoneChange(m); });
 
     // Initialize restricted mode
     cacheRestrictedAndPostCompleteMode();
