diff --git a/softoff/Makefile.am b/softoff/Makefile.am
index cf50cdb..ed0c226 100644
--- a/softoff/Makefile.am
+++ b/softoff/Makefile.am
@@ -6,7 +6,6 @@
 #  https://debbugs.gnu.org/cgi/bugreport.cgi?bug=13928
 phosphor_softpoweroff_SOURCES = \
                     softoff.cpp \
-                    ../timer.cpp   \
                     mainapp.cpp \
                     xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.cpp \
                     ../utils.cpp
@@ -35,4 +34,3 @@
 	@mkdir -p `dirname $@`
 	$(SDBUSPLUSPLUS) -r $(top_srcdir) interface server-header xyz.openbmc_project.Ipmi.Internal.SoftPowerOff > $@
 
-SUBDIRS = test
diff --git a/softoff/mainapp.cpp b/softoff/mainapp.cpp
index 3b153a8..f6a52ac 100644
--- a/softoff/mainapp.cpp
+++ b/softoff/mainapp.cpp
@@ -16,12 +16,12 @@
 #include "config.h"
 
 #include "softoff.hpp"
-#include "timer.hpp"
 
 #include <systemd/sd-event.h>
 
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/elog.hpp>
+#include <sdbusplus/timer.hpp>
 #include <xyz/openbmc_project/State/Host/error.hpp>
 
 // Return -1 on any errors to ensure we follow the calling targets OnFailure=
diff --git a/softoff/softoff.cpp b/softoff/softoff.cpp
index 921536f..803efc0 100644
--- a/softoff/softoff.cpp
+++ b/softoff/softoff.cpp
@@ -103,7 +103,7 @@
 // Starts a timer
 int SoftPowerOff::startTimer(const std::chrono::microseconds& usec)
 {
-    return timer.startTimer(usec);
+    return timer.start(usec);
 }
 
 // Host Response handler
@@ -115,7 +115,7 @@
     {
         // Disable the timer since Host has quiesced and we are
         // done with soft power off part
-        auto r = timer.setTimer(SD_EVENT_OFF);
+        auto r = timer.stop();
         if (r < 0)
         {
             log<level::ERR>("Failure to STOP the timer",
diff --git a/softoff/softoff.hpp b/softoff/softoff.hpp
index b7555e3..1c9341b 100644
--- a/softoff/softoff.hpp
+++ b/softoff/softoff.hpp
@@ -2,11 +2,10 @@
 
 #include "config.h"
 
-#include "timer.hpp"
-
 #include <functional>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server/object.hpp>
+#include <sdbusplus/timer.hpp>
 #include <xyz/openbmc_project/Control/Host/server.hpp>
 #include <xyz/openbmc_project/Ipmi/Internal/SoftPowerOff/server.hpp>
 namespace phosphor
diff --git a/softoff/test/Makefile.am b/softoff/test/Makefile.am
deleted file mode 100644
index afdb620..0000000
--- a/softoff/test/Makefile.am
+++ /dev/null
@@ -1,12 +0,0 @@
-AM_CPPFLAGS = -I$(top_srcdir)/softoff
-
-# Run all 'check' test programs
-TESTS = $(check_PROGRAMS)
-
-# # Build/add utest to test suite
-check_PROGRAMS = utest
-utest_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
-utest_CXXFLAGS = $(PTHREAD_CFLAGS)
-utest_LDFLAGS = -lgtest_main -lgtest $(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS) $(SYSTEMD_LIBS) ${SDBUSPLUS_LIBS}
-utest_SOURCES = utest.cpp
-utest_LDADD = $(top_builddir)/timer.o
diff --git a/softoff/test/utest.cpp b/softoff/test/utest.cpp
deleted file mode 100644
index 0dd99ae..0000000
--- a/softoff/test/utest.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-#include "timer.hpp"
-
-#include <chrono>
-#include <iostream>
-
-#include <gtest/gtest.h>
-
-using namespace phosphor::ipmi;
-
-class TimerTest : public ::testing::Test
-{
-  public:
-    // systemd event handler
-    sd_event* events;
-
-    // Need this so that events can be initialized.
-    int rc;
-
-    // Source of event
-    sd_event_source* eventSource = nullptr;
-
-    // Add a Timer Object
-    Timer timer;
-
-    // Gets called as part of each TEST_F construction
-    TimerTest() : rc(sd_event_default(&events)), timer(events)
-    {
-        // Check for successful creation of
-        // event handler and timer object.
-        EXPECT_GE(rc, 0);
-    }
-
-    // Gets called as part of each TEST_F destruction
-    ~TimerTest()
-    {
-        events = sd_event_unref(events);
-    }
-};
-
-class TimerTestCallBack : public ::testing::Test
-{
-  public:
-    // systemd event handler
-    sd_event* events;
-
-    // Need this so that events can be initialized.
-    int rc;
-
-    // Source of event
-    sd_event_source* eventSource = nullptr;
-
-    // Add a Timer Object
-    std::unique_ptr<Timer> timer = nullptr;
-
-    // Indicates optional call back fun was called
-    bool callBackDone = false;
-
-    void callBack()
-    {
-        callBackDone = true;
-    }
-
-    // Gets called as part of each TEST_F construction
-    TimerTestCallBack() : rc(sd_event_default(&events))
-
-    {
-        // Check for successful creation of
-        // event handler and timer object.
-        EXPECT_GE(rc, 0);
-
-        std::function<void()> func(
-            std::bind(&TimerTestCallBack::callBack, this));
-        timer = std::make_unique<Timer>(events, func);
-    }
-
-    // Gets called as part of each TEST_F destruction
-    ~TimerTestCallBack()
-    {
-        events = sd_event_unref(events);
-    }
-};
-
-/** @brief Makes sure that timer is expired and the
- *  callback handler gets invoked post 2 seconds
- */
-TEST_F(TimerTest, timerExpiresAfter2seconds)
-{
-    using namespace std::chrono;
-
-    auto time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer.startTimer(time), 0);
-
-    // Waiting 2 seconds is enough here since we have
-    // already spent some usec now
-    int count = 0;
-    while (count < 2 && !timer.isExpired())
-    {
-        // Returns -0- on timeout and positive number on dispatch
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(events, sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_EQ(true, timer.isExpired());
-    EXPECT_EQ(1, count);
-}
-
-/** @brief Makes sure that timer is not expired
- */
-TEST_F(TimerTest, timerNotExpiredAfter2Seconds)
-{
-    using namespace std::chrono;
-
-    auto time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer.startTimer(time), 0);
-
-    // Now turn off the timer post a 1 second sleep
-    sleep(1);
-    EXPECT_GE(timer.setTimer(SD_EVENT_OFF), 0);
-
-    // Wait 2 seconds and see that timer is not expired
-    int count = 0;
-    while (count < 2)
-    {
-        // Returns -0- on timeout
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(events, sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_EQ(false, timer.isExpired());
-
-    // 2 because of one more count that happens prior to exiting
-    EXPECT_EQ(2, count);
-}
-
-/** @brief Makes sure that timer value is changed in between
- *  and that the new timer expires
- */
-TEST_F(TimerTest, updateTimerAndExpectExpire)
-{
-    using namespace std::chrono;
-
-    auto time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer.startTimer(time), 0);
-
-    // Now sleep for a second and then set the new timeout value
-    sleep(1);
-
-    // New timeout is 3 seconds from THIS point.
-    time = duration_cast<microseconds>(seconds(3));
-    EXPECT_GE(timer.startTimer(time), 0);
-
-    // Wait 3 seconds and see that timer is expired
-    int count = 0;
-    while (count < 3 && !timer.isExpired())
-    {
-        // Returns -0- on timeout
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(events, sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_EQ(true, timer.isExpired());
-    EXPECT_EQ(2, count);
-}
-
-/** @brief Makes sure that timer value is changed in between
- *  and turn off and make sure that timer does not expire
- */
-TEST_F(TimerTest, updateTimerAndNeverExpire)
-{
-    using namespace std::chrono;
-
-    auto time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer.startTimer(time), 0);
-
-    // Now sleep for a second and then set the new timeout value
-    sleep(1);
-
-    // New timeout is 2 seconds from THIS point.
-    time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer.startTimer(time), 0);
-
-    // Now turn off the timer post a 1 second sleep
-    sleep(1);
-    EXPECT_GE(timer.setTimer(SD_EVENT_OFF), 0);
-
-    // Wait 2 seconds and see that timer is expired
-    int count = 0;
-    while (count < 2)
-    {
-        // Returns -0- on timeout
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(events, sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_EQ(false, timer.isExpired());
-
-    // 2 because of one more count that happens prior to exiting
-    EXPECT_EQ(2, count);
-}
-
-/** @brief Makes sure that optional callback is called */
-TEST_F(TimerTestCallBack, optionalFuncCallBackDone)
-{
-    using namespace std::chrono;
-
-    auto time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer->startTimer(time), 0);
-
-    // Waiting 2 seconds is enough here since we have
-    // already spent some usec now
-    int count = 0;
-    while (count < 2 && !timer->isExpired())
-    {
-        // Returns -0- on timeout and positive number on dispatch
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(events, sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_EQ(true, timer->isExpired());
-    EXPECT_EQ(true, callBackDone);
-    EXPECT_EQ(1, count);
-}
-
-/** @brief Makes sure that timer is not expired
- */
-TEST_F(TimerTestCallBack, timerNotExpiredAfter2SecondsNoOptionalCallBack)
-{
-    using namespace std::chrono;
-
-    auto time = duration_cast<microseconds>(seconds(2));
-    EXPECT_GE(timer->startTimer(time), 0);
-
-    // Now turn off the timer post a 1 second sleep
-    sleep(1);
-    EXPECT_GE(timer->setTimer(SD_EVENT_OFF), 0);
-
-    // Wait 2 seconds and see that timer is not expired
-    int count = 0;
-    while (count < 2)
-    {
-        // Returns -0- on timeout
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(events, sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_EQ(false, timer->isExpired());
-    EXPECT_EQ(false, callBackDone);
-
-    // 2 because of one more count that happens prior to exiting
-    EXPECT_EQ(2, count);
-}
