diff --git a/tests/src/stubs/dbus_sensor_object.cpp b/tests/src/stubs/dbus_sensor_object.cpp
index c3d4170..9d6f185 100644
--- a/tests/src/stubs/dbus_sensor_object.cpp
+++ b/tests/src/stubs/dbus_sensor_object.cpp
@@ -15,18 +15,13 @@
     ioc(ioc),
     bus(bus), objServer(objServer)
 {
-    sensorIface = objServer->add_interface(path(), interface());
-
-    sensorIface->register_property_r(property.value(), double{},
-                                     sdbusplus::vtable::property_::emits_change,
-                                     [this](const auto&) { return value; });
-
-    sensorIface->initialize();
-}
-
-DbusSensorObject::~DbusSensorObject()
-{
-    objServer->remove_interface(sensorIface);
+    sensorIface = objServer->add_unique_interface(
+        path(), interface(), [this](auto& iface) {
+            iface.register_property_r(
+                property.value(), value,
+                sdbusplus::vtable::property_::emits_change,
+                [this](const auto&) { return value; });
+        });
 }
 
 void DbusSensorObject::setValue(double v)
diff --git a/tests/src/stubs/dbus_sensor_object.hpp b/tests/src/stubs/dbus_sensor_object.hpp
index 99271fa..45ee4c7 100644
--- a/tests/src/stubs/dbus_sensor_object.hpp
+++ b/tests/src/stubs/dbus_sensor_object.hpp
@@ -15,7 +15,6 @@
         boost::asio::io_context& ioc,
         const std::shared_ptr<sdbusplus::asio::connection>& bus,
         const std::shared_ptr<sdbusplus::asio::object_server>& objServer);
-    ~DbusSensorObject();
 
     static const char* path();
     static const char* interface();
@@ -35,7 +34,7 @@
     std::shared_ptr<sdbusplus::asio::connection> bus;
     std::shared_ptr<sdbusplus::asio::object_server> objServer;
 
-    std::shared_ptr<sdbusplus::asio::dbus_interface> sensorIface;
+    std::unique_ptr<sdbusplus::asio::dbus_interface> sensorIface;
 
     double value = 0.0;
 };
diff --git a/tests/src/test_sensor.cpp b/tests/src/test_sensor.cpp
index 1398738..5339047 100644
--- a/tests/src/test_sensor.cpp
+++ b/tests/src/test_sensor.cpp
@@ -20,7 +20,7 @@
   public:
     void SetUp() override
     {
-        sensorObject.setValue(42.7);
+        sensorObject->setValue(42.7);
     }
 
     void TearDown() override
@@ -31,33 +31,36 @@
     void
         registerForUpdates(std::shared_ptr<interfaces::SensorListener> listener)
     {
-        DbusEnvironment::synchronizedPost(
-            [this, listener] { sut->registerForUpdates(listener); });
+        sut->registerForUpdates(listener);
+        DbusEnvironment::synchronizeIoc();
     }
 
-    std::chrono::milliseconds notifiesInGivenIntervalAfterSchedule(
-        std::chrono::milliseconds interval);
+    static std::unique_ptr<stubs::DbusSensorObject> makeSensorObject()
+    {
+        return std::make_unique<stubs::DbusSensorObject>(
+            DbusEnvironment::getIoc(), DbusEnvironment::getBus(),
+            DbusEnvironment::getObjServer());
+    }
 
-    stubs::DbusSensorObject sensorObject{DbusEnvironment::getIoc(),
-                                         DbusEnvironment::getBus(),
-                                         DbusEnvironment::getObjServer()};
+    std::unique_ptr<stubs::DbusSensorObject> sensorObject = makeSensorObject();
 
     SensorCache sensorCache;
     uint64_t timestamp = std::time(0);
     std::shared_ptr<Sensor> sut = sensorCache.makeSensor<Sensor>(
-        DbusEnvironment::serviceName(), sensorObject.path(),
+        DbusEnvironment::serviceName(), sensorObject->path(),
         DbusEnvironment::getIoc(), DbusEnvironment::getBus());
     std::shared_ptr<SensorListenerMock> listenerMock =
         std::make_shared<StrictMock<SensorListenerMock>>();
     std::shared_ptr<SensorListenerMock> listenerMock2 =
         std::make_shared<StrictMock<SensorListenerMock>>();
+    MockFunction<void()> checkPoint;
 };
 
 TEST_F(TestSensor, createsCorretlyViaSensorCache)
 {
     ASSERT_THAT(sut->id(),
                 Eq(Sensor::Id("Sensor", DbusEnvironment::serviceName(),
-                              sensorObject.path())));
+                              sensorObject->path())));
 }
 
 TEST_F(TestSensor, notifiesWithValueAfterRegister)
@@ -110,40 +113,36 @@
     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
 
-    sensorObject.setValue(42.7);
+    sensorObject->setValue(42.7);
 
     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
 }
 
 TEST_F(TestSensorNotification, notifiesListenerWithValueWhenNoChangeOccurs)
 {
-    Sequence seq;
+    InSequence seq;
 
-    EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
-        .InSequence(seq);
+    EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7));
     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp)))
-        .InSequence(seq)
         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
 
-    sensorObject.setValue(42.7);
-    sensorObject.setValue(42.7);
+    sensorObject->setValue(42.7);
+    sensorObject->setValue(42.7);
 
     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
 }
 
 TEST_F(TestSensorNotification, doesntNotifyExpiredListener)
 {
-    Sequence seq;
-    EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.))
-        .InSequence(seq);
+    InSequence seq;
+    EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
-        .InSequence(seq)
         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
 
     registerForUpdates(listenerMock2);
     listenerMock = nullptr;
 
-    sensorObject.setValue(42.7);
+    sensorObject->setValue(42.7);
 
     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
 }
@@ -154,3 +153,28 @@
 
     registerForUpdates(listenerMock2);
 }
+
+TEST_F(TestSensorNotification,
+       dbusSensorIsAddedToSystemAfterSensorIsCreatedThenValueIsUpdated)
+{
+    InSequence seq;
+
+    EXPECT_CALL(*listenerMock,
+                sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(42.7)))
+        .WillOnce(
+            InvokeWithoutArgs(DbusEnvironment::setPromise("notify-change")));
+    EXPECT_CALL(checkPoint, Call());
+    EXPECT_CALL(*listenerMock,
+                sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(0.)))
+        .WillOnce(
+            InvokeWithoutArgs(DbusEnvironment::setPromise("notify-create")));
+
+    sensorObject->setValue(42.7);
+    DbusEnvironment::waitForFuture("notify-change");
+
+    checkPoint.Call();
+
+    sensorObject = nullptr;
+    sensorObject = makeSensorObject();
+    DbusEnvironment::waitForFuture("notify-create");
+}
