diff --git a/include/dbus/file_notifier.hpp b/include/dbus/file_notifier.hpp
index da37158..1e72a6b 100644
--- a/include/dbus/file_notifier.hpp
+++ b/include/dbus/file_notifier.hpp
@@ -1,6 +1,6 @@
 #pragma once
 
-#include <sdbusplus/server.hpp>
+#include <sdbusplus/asio/object_server.hpp>
 #include <xyz/openbmc_project/Common/FilePath/server.hpp>
 
 #include <format>
@@ -9,36 +9,46 @@
 namespace bios_bmc_smm_error_logger
 {
 
-using FileNotifierInterface = sdbusplus::server::object_t<
-    sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
-
 /**
  * @brief A class for notifying file paths of CPER logs.
  */
-class CperFileNotifier : public FileNotifierInterface
+class CperFileNotifier
 {
   public:
     /**
      * @brief Constructor for the CperFileNotifier class.
      *
-     * @param bus - bus to attach to.
+     * @param server - sdbusplus asio object server.
      * @param filePath - full path of the CPER log JSON file.
      * @param entry - index of the DBus file path object.
      */
-    CperFileNotifier(sdbusplus::bus_t& bus, const std::string& filePath,
-                     uint64_t entry) :
-        FileNotifierInterface(bus, generatePath(entry).c_str(),
-                              action::emit_no_signals)
+    CperFileNotifier(sdbusplus::asio::object_server& server,
+                     const std::string& filePath, uint64_t entry) :
+        server(server)
     {
-        // We only need the interface added signal for the fault monitor. So
-        // stop emitting properties changed signal.
-        path(filePath, /*skipSignal=*/true);
+        pathIface = server.add_interface(generatePath(entry).c_str(),
+                                         "xyz.openbmc_project.Common.FilePath");
+        pathIface->register_property("Path", filePath);
+        pathIface->initialize();
     }
 
+    ~CperFileNotifier()
+    {
+        server.remove_interface(pathIface);
+    }
+
+    CperFileNotifier& operator=(const CperFileNotifier&) = delete;
+    CperFileNotifier& operator=(CperFileNotifier&&) = delete;
+    CperFileNotifier(const CperFileNotifier&) = delete;
+    CperFileNotifier(CperFileNotifier&&) = default;
+
     static constexpr const char* cperBasePath =
         "/xyz/openbmc_project/external_storer/bios_bmc_smm_error_logger/CPER";
 
   private:
+    sdbusplus::asio::object_server& server;
+    std::shared_ptr<sdbusplus::asio::dbus_interface> pathIface;
+
     /**
      * @brief Generate a path for the CperFileNotifier DBus object.
      *
diff --git a/include/rde/external_storer_file.hpp b/include/rde/external_storer_file.hpp
index 8eda3c6..6d813af 100644
--- a/include/rde/external_storer_file.hpp
+++ b/include/rde/external_storer_file.hpp
@@ -76,14 +76,15 @@
     /**
      * @brief Constructor for the ExternalStorerFileInterface.
      *
-     * @param[in] bus - bus to attach to.
+     * @param[in] conn - sdbusplus asio connection.
      * @param[in] rootPath - root path for creating redfish folders.
      * Eg: "/run/bmcweb"
      * @param[in] fileHandler - an ExternalStorerFileWriter object. This class
      * will take the ownership of this object.
      */
     ExternalStorerFileInterface(
-        sdbusplus::bus_t& bus, std::string_view rootPath,
+        const std::shared_ptr<sdbusplus::asio::connection>& conn,
+        std::string_view rootPath,
         std::unique_ptr<FileHandlerInterface> fileHandler);
 
     bool publishJson(std::string_view jsonStr) override;
diff --git a/include/rde/notifier_dbus_handler.hpp b/include/rde/notifier_dbus_handler.hpp
index e90fa71..708a45a 100644
--- a/include/rde/notifier_dbus_handler.hpp
+++ b/include/rde/notifier_dbus_handler.hpp
@@ -2,6 +2,8 @@
 
 #include "dbus/file_notifier.hpp"
 
+#include <sdbusplus/asio/object_server.hpp>
+
 #include <memory>
 #include <vector>
 
@@ -19,9 +21,10 @@
     /**
      * @brief Constructor for the CperFileNotifierHandler class.
      *
-     * @param bus - bus to attache to.
+     * @param conn - sdbusplus asio connection.
      */
-    explicit CperFileNotifierHandler(sdbusplus::bus_t& bus);
+    explicit CperFileNotifierHandler(
+        const std::shared_ptr<sdbusplus::asio::connection>& conn);
 
     /**
      * @brief Create a DBus object with the provided filePath value.
@@ -31,8 +34,8 @@
     void createEntry(const std::string& filePath);
 
   private:
-    sdbusplus::bus_t& bus;
     sdbusplus::server::manager_t objManager;
+    sdbusplus::asio::object_server objServer;
 
     /**
      * @brief A vector to keep track of DBus FilePath objects.
diff --git a/src/main.cpp b/src/main.cpp
index 31d6b03..6bb546c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -91,13 +91,12 @@
     std::shared_ptr<sdbusplus::asio::connection> conn =
         std::make_shared<sdbusplus::asio::connection>(io);
     conn->request_name("xyz.openbmc_project.bios_bmc_smm_error_logger");
-    sdbusplus::bus_t& bus = static_cast<sdbusplus::bus_t&>(*conn);
 
     std::unique_ptr<rde::FileHandlerInterface> fileIface =
         std::make_unique<rde::ExternalStorerFileWriter>();
     std::unique_ptr<rde::ExternalStorerInterface> exFileIface =
         std::make_unique<rde::ExternalStorerFileInterface>(
-            bus, "/run/bmcweb", std::move(fileIface));
+            conn, "/run/bmcweb", std::move(fileIface));
     std::shared_ptr<rde::RdeCommandHandler> rdeCommandHandler =
         std::make_unique<rde::RdeCommandHandler>(std::move(exFileIface));
 
diff --git a/src/rde/external_storer_file.cpp b/src/rde/external_storer_file.cpp
index 5cc14cf..1ffea44 100644
--- a/src/rde/external_storer_file.cpp
+++ b/src/rde/external_storer_file.cpp
@@ -46,10 +46,11 @@
 }
 
 ExternalStorerFileInterface::ExternalStorerFileInterface(
-    sdbusplus::bus_t& bus, std::string_view rootPath,
+    const std::shared_ptr<sdbusplus::asio::connection>& conn,
+    std::string_view rootPath,
     std::unique_ptr<FileHandlerInterface> fileHandler) :
     rootPath(rootPath), fileHandler(std::move(fileHandler)), logServiceId(""),
-    cperNotifier(std::make_unique<CperFileNotifierHandler>(bus))
+    cperNotifier(std::make_unique<CperFileNotifierHandler>(conn))
 {}
 
 bool ExternalStorerFileInterface::publishJson(std::string_view jsonStr)
diff --git a/src/rde/notifier_dbus_handler.cpp b/src/rde/notifier_dbus_handler.cpp
index 2151925..e6d5e4e 100644
--- a/src/rde/notifier_dbus_handler.cpp
+++ b/src/rde/notifier_dbus_handler.cpp
@@ -5,15 +5,17 @@
 namespace rde
 {
 
-CperFileNotifierHandler::CperFileNotifierHandler(sdbusplus::bus_t& bus) :
-    bus(bus), objManager(bus, CperFileNotifier::cperBasePath)
+CperFileNotifierHandler::CperFileNotifierHandler(
+    const std::shared_ptr<sdbusplus::asio::connection>& conn) :
+    objManager(static_cast<sdbusplus::bus_t&>(*conn),
+               CperFileNotifier::cperBasePath),
+    objServer(conn)
 {}
 
 void CperFileNotifierHandler::createEntry(const std::string& filePath)
 {
-    auto obj = std::make_unique<CperFileNotifier>(bus, filePath, nextEntry);
-    // Notify fault log monitor through InterfacesAdded signal.
-    obj->emit_added();
+    auto obj =
+        std::make_unique<CperFileNotifier>(objServer, filePath, nextEntry);
     notifierObjs.push_back(std::move(obj));
     ++nextEntry;
 }
diff --git a/test/external_storer_file_test.cpp b/test/external_storer_file_test.cpp
index 04f6b2b..3cba35d 100644
--- a/test/external_storer_file_test.cpp
+++ b/test/external_storer_file_test.cpp
@@ -1,7 +1,6 @@
 #include "rde/external_storer_file.hpp"
 
-#include <sdbusplus/bus.hpp>
-#include <sdbusplus/test/sdbus_mock.hpp>
+#include <boost/asio/io_context.hpp>
 
 #include <string_view>
 
@@ -18,7 +17,6 @@
 using ::testing::DoAll;
 using ::testing::Return;
 using ::testing::SaveArg;
-using ::testing::StrEq;
 
 class MockFileWriter : public FileHandlerInterface
 {
@@ -34,26 +32,18 @@
 {
   public:
     ExternalStorerFileTest() :
-        bus(sdbusplus::get_mocked_new(&sdbusMock)),
+        conn(std::make_shared<sdbusplus::asio::connection>(io)),
         mockFileWriter(std::make_unique<MockFileWriter>())
     {
         mockFileWriterPtr = dynamic_cast<MockFileWriter*>(mockFileWriter.get());
-
-        EXPECT_CALL(
-            sdbusMock,
-            sd_bus_add_object_manager(
-                nullptr, _,
-                StrEq(
-                    "/xyz/openbmc_project/external_storer/bios_bmc_smm_error_logger/CPER")))
-            .WillOnce(Return(0));
-
         exStorer = std::make_unique<ExternalStorerFileInterface>(
-            bus, rootPath, std::move(mockFileWriter));
+            conn, rootPath, std::move(mockFileWriter));
     }
 
   protected:
-    sdbusplus::SdBusMock sdbusMock;
-    sdbusplus::bus_t bus;
+    boost::asio::io_context io;
+    std::shared_ptr<sdbusplus::asio::connection> conn;
+
     std::unique_ptr<FileHandlerInterface> mockFileWriter;
     std::unique_ptr<ExternalStorerFileInterface> exStorer;
     MockFileWriter* mockFileWriterPtr;
@@ -168,24 +158,9 @@
     EXPECT_CALL(*mockFileWriterPtr, createFile(_, _))
         .WillOnce(DoAll(SaveArg<1>(&logEntryOut), Return(true)));
 
-    constexpr const char* dbusPath =
-        "/xyz/openbmc_project/external_storer/bios_bmc_smm_error_logger/CPER/entry0";
-    constexpr const char* dbusInterface = "xyz.openbmc_project.Common.FilePath";
-
-    EXPECT_CALL(sdbusMock, sd_bus_add_object_vtable(nullptr, _, StrEq(dbusPath),
-                                                    StrEq(dbusInterface), _, _))
-        .WillOnce(Return(0));
-    EXPECT_CALL(sdbusMock,
-                sd_bus_emit_interfaces_added_strv(nullptr, StrEq(dbusPath), _))
-        .WillOnce(Return(0));
-
     EXPECT_THAT(exStorer->publishJson(jsonLogEntry), true);
     EXPECT_NE(logEntryOut["Id"], nullptr);
     EXPECT_EQ(logEntryOut["@odata.id"], nullptr);
-
-    EXPECT_CALL(sdbusMock, sd_bus_emit_interfaces_removed_strv(
-                               nullptr, StrEq(dbusPath), _))
-        .WillOnce(Return(0));
 }
 
 TEST_F(ExternalStorerFileTest, OtherSchemaNoOdataIdTest)
