diff --git a/Makefile.am b/Makefile.am
index 806a0aa..2de74ce 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,21 +1,19 @@
 sbin_PROGRAMS = phosphor-watchdog
 
-noinst_HEADERS = timer.hpp \
-                 watchdog.hpp
+noinst_HEADERS = watchdog.hpp
 
 phosphor_watchdog_SOURCES =  \
                 argument.cpp \
-                timer.cpp    \
                 watchdog.cpp \
                 mainapp.cpp
 
-phosphor_watchdog_LDFLAGS = $(SYSTEMD_LIBS) \
-                            ${PHOSPHOR_LOGGING_LIBS} \
+phosphor_watchdog_LDFLAGS = ${PHOSPHOR_LOGGING_LIBS} \
                             ${SDBUSPLUS_LIBS} \
+                            ${SDEVENTPLUS_LIBS} \
                             ${PHOSPHOR_DBUS_INTERFACES_LIBS}
 
-phosphor_watchdog_CXXFLAGS = $(SYSTEMD_CFLAGS)\
-                             ${PHOSPHOR_LOGGING_CFLAGS} \
+phosphor_watchdog_CXXFLAGS = ${PHOSPHOR_LOGGING_CFLAGS} \
                              ${SDBUSPLUS_CFLAGS} \
+                             ${SDEVENTPLUS_CFLAGS} \
                              ${PHOSPHOR_DBUS_INTERFACES_CFLAGS}
 SUBDIRS = test
diff --git a/configure.ac b/configure.ac
index 6c5ac70..cd4ae00 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,9 +19,9 @@
 LT_INIT
 
 # Check for needed modules
-PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221], [], [AC_MSG_ERROR(["systemd required and not found"])])
 PKG_CHECK_MODULES([PHOSPHOR_LOGGING], [phosphor-logging], [], [AC_MSG_ERROR([Could not find phosphor-logging...openbmc/phosphor-logging package required])])
 PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus],, [AC_MSG_ERROR([Could not find sdbusplus...openbmc/sdbusplus package required])])
+PKG_CHECK_MODULES([SDEVENTPLUS], [sdeventplus],, [AC_MSG_ERROR([Could not find sdeventplus...openbmc/sdeventplus package required])])
 PKG_CHECK_MODULES([PHOSPHOR_DBUS_INTERFACES], [phosphor-dbus-interfaces], [], [AC_MSG_ERROR([Could not find phosphor-dbus-interfaces...openbmc/phosphor-dbus-interfaces package required])])
 PKG_CHECK_MODULES([GTEST_MAIN], [gtest_main], [],
     [
diff --git a/mainapp.cpp b/mainapp.cpp
index 29cd7e2..b98b108 100644
--- a/mainapp.cpp
+++ b/mainapp.cpp
@@ -196,29 +196,22 @@
         fallback->always = true;
     }
 
-    sd_event* event = nullptr;
-    auto r = sd_event_default(&event);
-    if (r < 0)
-    {
-        log<level::ERR>("Error creating a default sd_event handler");
-        return r;
-    }
-    phosphor::watchdog::EventPtr eventP{event};
-    event = nullptr;
-
-    // Get a handle to system dbus.
-    auto bus = sdbusplus::bus::new_default();
-
-    // Add systemd object manager.
-    sdbusplus::server::manager::manager(bus, path.c_str());
-
-    // Attach the bus to sd_event to service user requests
-    bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL);
-
     try
     {
+        // Get a default event loop
+        auto event = sdeventplus::Event::get_default();
+
+        // Get a handle to system dbus.
+        auto bus = sdbusplus::bus::new_default();
+
+        // Add systemd object manager.
+        sdbusplus::server::manager::manager(bus, path.c_str());
+
+        // Attach the bus to sd_event to service user requests
+        bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+
         // Create a watchdog object
-        Watchdog watchdog(bus, path.c_str(), eventP, std::move(actionTargetMap),
+        Watchdog watchdog(bus, path.c_str(), event, std::move(actionTargetMap),
                           std::move(fallback));
 
         // Claim the bus
@@ -227,13 +220,8 @@
         // Loop until our timer expires and we don't want to continue
         while (continueAfterTimeout || !watchdog.timerExpired())
         {
-            // -1 denotes wait for ever
-            r = sd_event_run(eventP.get(), (uint64_t)-1);
-            if (r < 0)
-            {
-                log<level::ERR>("Error waiting for events");
-                elog<InternalFailure>();
-            }
+            // Run and never timeout
+            event.run(std::nullopt);
         }
     }
     catch (InternalFailure& e)
diff --git a/test/Makefile.am b/test/Makefile.am
index 48b3559..1c44162 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -5,12 +5,12 @@
 
 # Build/add utest to test suite
 check_PROGRAMS = argument_test \
-                 timer_test \
                  watchdog_test
 
 utestCPPFLAGS = $(GTEST_MAIN_CFLAGS) \
                 $(AM_CPPFLAGS) \
                 $(SDBUSPLUS_CFLAGS) \
+                $(SDEVENTPLUS_CFLAGS) \
                 $(PHOSPHOR_LOGGING_CFLAGS) \
                 $(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
 
@@ -20,6 +20,7 @@
                $(PTHREAD_LIBS) \
                $(OESDK_TESTCASE_FLAGS) \
                $(SDBUSPLUS_LIBS) \
+               $(SDEVENTPLUS_LIBS) \
                $(PHOSPHOR_LOGGING_LIBS) \
                $(PHOSPHOR_DBUS_INTERFACES_LIBS)
 
@@ -27,14 +28,9 @@
 argument_test_CXXFLAGS = ${utestCXXFLAGS}
 argument_test_LDFLAGS = ${utestLDFLAGS}
 
-timer_test_CPPFLAGS = ${utestCPPFLAGS}
-timer_test_CXXFLAGS = ${utestCXXFLAGS}
-timer_test_LDFLAGS = ${utestLDFLAGS}
-
 watchdog_test_CPPFLAGS = ${utestCPPFLAGS}
 watchdog_test_CXXFLAGS = ${utestCXXFLAGS}
 watchdog_test_LDFLAGS = ${utestLDFLAGS}
 
 argument_test_SOURCES = ../argument.cpp argument_test.cpp
-timer_test_SOURCES = ../timer.cpp timer_test.cpp
-watchdog_test_SOURCES = ../timer.cpp ../watchdog.cpp watchdog_test.cpp
+watchdog_test_SOURCES = ../watchdog.cpp watchdog_test.cpp
diff --git a/test/timer_test.cpp b/test/timer_test.cpp
deleted file mode 100644
index ea00228..0000000
--- a/test/timer_test.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <chrono>
-#include <timer_test.hpp>
-
-using namespace std::chrono;
-using namespace std::chrono_literals;
-
-/** @brief Starts the timer and expects it to
- *         expire in configured time and expects the
- *         deault callback handler to kick-in
- */
-TEST_F(TimerTest, testTimerForExpirationDefaultTimeoutHandler)
-{
-    // Expect timer to expire in 2 seconds
-    auto expireTime = seconds(2s);
-
-    phosphor::watchdog::Timer timer(eventP);
-
-    // Set the expiration and enable the timer
-    timer.start(duration_cast<milliseconds>(expireTime));
-    timer.setEnabled<std::true_type>();
-
-    // Waiting 2 seconds to expect expiration
-    int count = 0;
-    while (count < expireTime.count() && !timer.expired())
-    {
-        // Returns -0- on timeout and positive number on dispatch
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(eventP.get(), sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_TRUE(timer.expired());
-    EXPECT_EQ(expireTime.count() - 1, count);
-
-    // Make sure secondary callback was not called.
-    EXPECT_FALSE(expired);
-}
-
-/** @brief Starts the timer and expects it to expire
- *         in configured time and expects the secondary
- *         callback to be called into along with default.
- */
-TEST_F(TimerTest, testTimerForExpirationSecondCallBack)
-{
-    // Expect timer to expire in 2 seconds
-    auto expireTime = seconds(2s);
-
-    phosphor::watchdog::Timer timer(
-        eventP, std::bind(&TimerTest::timeOutHandler, this));
-
-    // Set the expiration and enable the timer
-    timer.start(duration_cast<milliseconds>(expireTime));
-    timer.setEnabled<std::true_type>();
-
-    // Waiting 2 seconds to expect expiration
-    int count = 0;
-    while (count < expireTime.count() && !timer.expired())
-    {
-        // Returns -0- on timeout and positive number on dispatch
-        auto sleepTime = duration_cast<microseconds>(seconds(1));
-        if (!sd_event_run(eventP.get(), sleepTime.count()))
-        {
-            count++;
-        }
-    }
-    EXPECT_TRUE(timer.expired());
-    EXPECT_EQ(expireTime.count() - 1, count);
-
-    // This gets set as part of secondary callback
-    EXPECT_TRUE(expired);
-}
diff --git a/test/timer_test.hpp b/test/timer_test.hpp
deleted file mode 100644
index cab9086..0000000
--- a/test/timer_test.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <iostream>
-#include <timer.hpp>
-
-#include <gtest/gtest.h>
-
-// Base class for testing Timer
-class TimerTest : public testing::Test
-{
-  public:
-    // systemd event handler
-    sd_event* events;
-
-    // Need this so that events can be initialized.
-    int rc;
-
-    // Tells if the watchdog timer expired.
-    bool expired = false;
-
-    // Gets called as part of each TEST_F construction
-    TimerTest() : rc(sd_event_default(&events)), eventP(events)
-    {
-        // Check for successful creation of
-        // event handler and bus handler
-        EXPECT_GE(rc, 0);
-
-        // Its already wrapped in eventP
-        events = nullptr;
-    }
-
-    // unique_ptr for sd_event
-    phosphor::watchdog::EventPtr eventP;
-
-    // Handler called by timer expiration
-    inline void timeOutHandler()
-    {
-        std::cout << "Time out handler called" << std::endl;
-        expired = true;
-    }
-};
diff --git a/test/watchdog_test.cpp b/test/watchdog_test.cpp
index aa0ae0f..06b43b8 100644
--- a/test/watchdog_test.cpp
+++ b/test/watchdog_test.cpp
@@ -1,7 +1,7 @@
 #include "watchdog_test.hpp"
 
-#include <chrono>
 #include <memory>
+#include <thread>
 #include <utility>
 
 using namespace phosphor::watchdog;
@@ -15,9 +15,8 @@
     {
         previousTimeRemaining = wdog->timeRemaining();
 
-        // Returns -0- on timeout and positive number on dispatch
-        auto sleepTime = 1s;
-        if (!sd_event_run(eventP.get(), microseconds(sleepTime).count()))
+        constexpr auto sleepTime = 1s;
+        if (event.run(sleepTime) == 0)
         {
             ret += sleepTime;
         }
@@ -128,6 +127,10 @@
     // Sleep for 1 second
     std::this_thread::sleep_for(1s);
 
+    // Timer should still be running unexpired
+    EXPECT_FALSE(wdog->timerExpired());
+    EXPECT_TRUE(wdog->timerEnabled());
+
     // Next timer will expire in 5 seconds from now.
     auto expireTime = 5s;
     auto expireTimeMs = milliseconds(expireTime).count();
@@ -137,9 +140,6 @@
     EXPECT_EQ(expireTime - 1s, waitForWatchdog(expireTime));
     EXPECT_TRUE(wdog->timerExpired());
     EXPECT_FALSE(wdog->timerEnabled());
-
-    // Make sure secondary callback was not called.
-    EXPECT_FALSE(expired);
 }
 
 /** @brief Make sure the Interval can be updated directly.
@@ -218,7 +218,7 @@
         .action = Watchdog::Action::PowerOff,
         .interval = static_cast<uint64_t>(fallbackIntervalMs),
     };
-    wdog = std::make_unique<Watchdog>(bus, TEST_PATH, eventP,
+    wdog = std::make_unique<Watchdog>(bus, TEST_PATH, event,
                                       Watchdog::ActionTargetMap(),
                                       std::move(fallback));
     EXPECT_EQ(primaryInterval, milliseconds(wdog->interval(primaryIntervalMs)));
@@ -301,7 +301,7 @@
         .interval = static_cast<uint64_t>(fallbackIntervalMs),
         .always = false,
     };
-    wdog = std::make_unique<Watchdog>(bus, TEST_PATH, eventP,
+    wdog = std::make_unique<Watchdog>(bus, TEST_PATH, event,
                                       Watchdog::ActionTargetMap(),
                                       std::move(fallback));
     EXPECT_EQ(primaryInterval, milliseconds(wdog->interval(primaryIntervalMs)));
@@ -355,7 +355,7 @@
         .interval = static_cast<uint64_t>(fallbackIntervalMs),
         .always = true,
     };
-    wdog = std::make_unique<Watchdog>(bus, TEST_PATH, eventP,
+    wdog = std::make_unique<Watchdog>(bus, TEST_PATH, event,
                                       Watchdog::ActionTargetMap(),
                                       std::move(fallback));
     EXPECT_EQ(primaryInterval, milliseconds(wdog->interval(primaryIntervalMs)));
diff --git a/test/watchdog_test.hpp b/test/watchdog_test.hpp
index 50fa8f1..4c798a7 100644
--- a/test/watchdog_test.hpp
+++ b/test/watchdog_test.hpp
@@ -1,30 +1,33 @@
 #include <chrono>
 #include <memory>
-#include <timer_test.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdeventplus/event.hpp>
 #include <watchdog.hpp>
 
+#include <gtest/gtest.h>
+
 using namespace std::chrono;
 using namespace std::chrono_literals;
 
 // Test Watchdog functionality
-class WdogTest : public TimerTest
+class WdogTest : public ::testing::Test
 {
   public:
     // Gets called as part of each TEST_F construction
     WdogTest() :
+        event(sdeventplus::Event::get_default()),
         bus(sdbusplus::bus::new_default()),
         wdog(std::make_unique<phosphor::watchdog::Watchdog>(bus, TEST_PATH,
-                                                            eventP)),
+                                                            event)),
         defaultInterval(milliseconds(wdog->interval())), defaultDrift(30)
     {
-        // Check for successful creation of
-        // event handler and bus handler
-        EXPECT_GE(rc, 0);
-
         // Initially the watchdog would be disabled
         EXPECT_FALSE(wdog->enabled());
     }
 
+    // sdevent Event handle
+    sdeventplus::Event event;
+
     // sdbusplus handle
     sdbusplus::bus::bus bus;
 
diff --git a/timer.cpp b/timer.cpp
deleted file mode 100644
index 3dfe560..0000000
--- a/timer.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-#include "timer.hpp"
-
-#include <systemd/sd-event.h>
-
-#include <chrono>
-#include <phosphor-logging/elog-errors.hpp>
-#include <phosphor-logging/elog.hpp>
-#include <phosphor-logging/log.hpp>
-#include <xyz/openbmc_project/Common/error.hpp>
-namespace phosphor
-{
-namespace watchdog
-{
-
-// For throwing exception
-using namespace phosphor::logging;
-using InternalFailure =
-    sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
-
-// Initializes the timer object
-void Timer::initialize()
-{
-    // This can not be called more than once.
-    if (eventSource.get())
-    {
-        log<level::ERR>("Timer already initialized");
-        elog<InternalFailure>();
-    }
-
-    // Add infinite expiration time
-    decltype(eventSource.get()) sourcePtr = nullptr;
-    auto r = sd_event_add_time(event.get(), &sourcePtr,
-                               CLOCK_MONOTONIC, // Time base
-                               UINT64_MAX,      // Expire time - way long time
-                               0,               // Use default event accuracy
-                               timeoutHandler,  // Callback handler on timeout
-                               this);           // User data
-    eventSource.reset(sourcePtr);
-
-    if (r < 0)
-    {
-        log<level::ERR>("Timer initialization failed");
-        elog<InternalFailure>();
-    }
-
-    // Disable the timer for now
-    setEnabled<std::false_type>();
-}
-
-// callback handler on timeout
-int Timer::timeoutHandler(sd_event_source* eventSource, uint64_t usec,
-                          void* userData)
-{
-    using namespace phosphor::logging;
-
-    log<level::INFO>("Timer Expired");
-
-    auto timer = static_cast<Timer*>(userData);
-    timer->expire = true;
-
-    // Call an optional callback function
-    if (timer->userCallBack)
-    {
-        timer->userCallBack();
-    }
-    return 0;
-}
-
-// Gets the time from steady_clock
-std::chrono::microseconds Timer::getCurrentTime()
-{
-    using namespace std::chrono;
-    auto usec = steady_clock::now().time_since_epoch();
-    return duration_cast<microseconds>(usec);
-}
-
-// Sets the expiration time and arms the timer
-void Timer::start(std::chrono::microseconds usec)
-{
-    using namespace std::chrono;
-
-    // Get the current MONOTONIC time and add the delta
-    auto expireTime = getCurrentTime() + usec;
-
-    // Set the time
-    auto r = sd_event_source_set_time(eventSource.get(), expireTime.count());
-    if (r < 0)
-    {
-        log<level::ERR>(
-            "Error setting the expiration time",
-            entry("MSEC=%llu", duration_cast<milliseconds>(usec).count()));
-        elog<InternalFailure>();
-    }
-}
-
-// Returns current timer enablement type
-int Timer::getEnabled() const
-{
-    int enabled{};
-    auto r = sd_event_source_get_enabled(eventSource.get(), &enabled);
-    if (r < 0)
-    {
-        log<level::ERR>("Error getting current timer type enablement state");
-        elog<InternalFailure>();
-    }
-    return enabled;
-}
-
-// Enables / disables the timer
-void Timer::setEnabled(int type)
-{
-    auto r = sd_event_source_set_enabled(eventSource.get(), type);
-    if (r < 0)
-    {
-        log<level::ERR>("Error setting the timer type", entry("TYPE=%d", type));
-        elog<InternalFailure>();
-    }
-}
-
-// Returns time remaining before expiration
-std::chrono::microseconds Timer::getRemaining() const
-{
-    uint64_t next = 0;
-    auto r = sd_event_source_get_time(eventSource.get(), &next);
-    if (r < 0)
-    {
-        log<level::ERR>("Error fetching remaining time to expire");
-        elog<InternalFailure>();
-    }
-    return std::chrono::microseconds(next);
-}
-
-} // namespace watchdog
-} // namespace phosphor
diff --git a/timer.hpp b/timer.hpp
deleted file mode 100644
index 28222a2..0000000
--- a/timer.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-#pragma once
-
-#include <systemd/sd-event.h>
-
-#include <chrono>
-#include <functional>
-#include <memory>
-namespace phosphor
-{
-namespace watchdog
-{
-
-/* Need a custom deleter for freeing up sd_event */
-struct EventDeleter
-{
-    void operator()(sd_event* event) const
-    {
-        event = sd_event_unref(event);
-    }
-};
-using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
-
-/* Need a custom deleter for freeing up sd_event_source */
-struct EventSourceDeleter
-{
-    void operator()(sd_event_source* eventSource) const
-    {
-        eventSource = sd_event_source_unref(eventSource);
-    }
-};
-using EventSourcePtr = std::unique_ptr<sd_event_source, EventSourceDeleter>;
-
-/** @class Timer
- *  @brief Manages starting timers and handling timeouts
- */
-class Timer
-{
-  public:
-    Timer() = delete;
-    ~Timer() = default;
-    Timer(const Timer&) = delete;
-    Timer& operator=(const Timer&) = delete;
-    Timer(Timer&&) = delete;
-    Timer& operator=(Timer&&) = delete;
-
-    /** @brief Constructs timer object
-     *
-     *  @param[in] event        - sd_event unique pointer
-     *  @param[in] userCallBack - Optional function callback
-     *                            for timer expiration
-     */
-    Timer(EventPtr& event, std::function<void()> userCallBack = nullptr) :
-        event(event), userCallBack(userCallBack)
-    {
-        // Initialize the timer
-        initialize();
-    }
-
-    void clearExpired(void)
-    {
-        expire = false;
-    }
-
-    /** @brief Tells whether the timer is expired or not */
-    inline auto expired() const
-    {
-        return expire;
-    }
-
-    /** @brief Returns the current Timer enablement type */
-    int getEnabled() const;
-
-    /** @brief Enables / disables the timer.
-     *         <T> is an integral constant boolean
-     */
-    template <typename T>
-    void setEnabled()
-    {
-        constexpr auto type = T::value ? SD_EVENT_ONESHOT : SD_EVENT_OFF;
-        return setEnabled(type);
-    }
-
-    /** @brief Returns time remaining in usec before expiration
-     *         which is an offset to current steady clock
-     */
-    std::chrono::microseconds getRemaining() const;
-
-    /** @brief Starts the timer with specified expiration value.
-     *         std::steady_clock is used for base time.
-     *
-     *  @param[in] usec - Microseconds from the current time
-     *                    before expiration.
-     *
-     *  @return None.
-     *
-     *  @error Throws exception
-     */
-    void start(std::chrono::microseconds usec);
-
-    /** @brief Gets the current time from steady clock */
-    static std::chrono::microseconds getCurrentTime();
-
-  private:
-    /** @brief Reference to sd_event unique pointer */
-    EventPtr& event;
-
-    /** @brief event source */
-    EventSourcePtr eventSource;
-
-    /** @brief Set to true when the timeoutHandler is called into */
-    bool expire = false;
-
-    /** @brief Optional function to call on timer expiration
-     *         This is called from timeout handler.
-     */
-    std::function<void()> userCallBack;
-
-    /** @brief Initializes the timer object with infinite
-     *         expiration time and sets up the callback handler
-     *
-     *  @return None.
-     *
-     *  @error Throws exception
-     */
-    void initialize();
-
-    /** @brief Callback function when timer goes off
-     *
-     *  @param[in] eventSource - Source of the event
-     *  @param[in] usec        - time in microseconds
-     *  @param[in] userData    - User data pointer
-     *
-     */
-    static int timeoutHandler(sd_event_source* eventSource, uint64_t usec,
-                              void* userData);
-
-    /** @brief Enables / disables the timer
-     *
-     *  @param[in] type - Timer type.
-     *                    This implementation uses only SD_EVENT_OFF
-     *                    and SD_EVENT_ONESHOT
-     */
-    void setEnabled(int type);
-};
-
-} // namespace watchdog
-} // namespace phosphor
diff --git a/watchdog.cpp b/watchdog.cpp
index 92134ff..aed0443 100644
--- a/watchdog.cpp
+++ b/watchdog.cpp
@@ -47,18 +47,10 @@
     }
     else if (!this->enabled())
     {
-        // Start ONESHOT timer. Timer handles all in usec
-        auto usec = duration_cast<microseconds>(milliseconds(this->interval()));
-
-        // Update new expiration
-        timer.clearExpired();
-        timer.start(usec);
-
-        // Enable timer
-        timer.setEnabled<std::true_type>();
-
+        auto interval_ms = this->interval();
+        timer.restart(milliseconds(interval_ms));
         log<level::INFO>("watchdog: enabled and started",
-                         entry("INTERVAL=%llu", this->interval()));
+                         entry("INTERVAL=%llu", interval_ms));
     }
 
     return WatchdogInherits::enabled(value);
@@ -68,22 +60,13 @@
 // If the timer is disabled, returns 0
 uint64_t Watchdog::timeRemaining() const
 {
-    uint64_t timeRemain = 0;
-
     // timer may have already expired and disabled
-    if (timerEnabled())
+    if (!timerEnabled())
     {
-        // the one-shot timer does not expire yet
-        auto expiry = duration_cast<milliseconds>(timer.getRemaining());
-
-        // convert to msec per interface expectation.
-        auto timeNow = duration_cast<milliseconds>(Timer::getCurrentTime());
-
-        // Its possible that timer may have expired by now.
-        // So need to cross verify.
-        timeRemain = (expiry > timeNow) ? (expiry - timeNow).count() : 0;
+        return 0;
     }
-    return timeRemain;
+
+    return duration_cast<milliseconds>(timer.getRemaining()).count();
 }
 
 // Reset the timer to a new expiration value
@@ -103,8 +86,7 @@
     }
 
     // Update new expiration
-    auto usec = duration_cast<microseconds>(milliseconds(value));
-    timer.start(usec);
+    timer.setRemaining(milliseconds(value));
 
     // Update Base class data.
     return WatchdogInherits::timeRemaining(value);
@@ -159,19 +141,13 @@
     if (fallback && (fallback->always || this->enabled()))
     {
         auto interval_ms = fallback->interval;
-        auto interval_us =
-            duration_cast<microseconds>(milliseconds(interval_ms));
-
-        timer.clearExpired();
-        timer.start(interval_us);
-        timer.setEnabled<std::true_type>();
-
+        timer.restart(milliseconds(interval_ms));
         log<level::INFO>("watchdog: falling back",
                          entry("INTERVAL=%llu", interval_ms));
     }
     else if (timerEnabled())
     {
-        timer.setEnabled<std::false_type>();
+        timer.setEnabled(false);
 
         log<level::INFO>("watchdog: disabled");
     }
diff --git a/watchdog.hpp b/watchdog.hpp
index c9821db..34b0411 100644
--- a/watchdog.hpp
+++ b/watchdog.hpp
@@ -1,11 +1,11 @@
 #pragma once
 
-#include "timer.hpp"
-
 #include <functional>
 #include <optional>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server/object.hpp>
+#include <sdeventplus/event.hpp>
+#include <sdeventplus/utility/timer.hpp>
 #include <unordered_map>
 #include <utility>
 #include <xyz/openbmc_project/State/Watchdog/server.hpp>
@@ -53,13 +53,14 @@
 
     /** @brief Constructs the Watchdog object
      *
-     *  @param[in] bus             - DBus bus to attach to.
-     *  @param[in] objPath         - Object path to attach to.
-     *  @param[in] event           - reference to sd_event unique pointer
-     *  @param[in] actionTargetMap - map of systemd targets called on timeout
+     *  @param[in] bus            - DBus bus to attach to.
+     *  @param[in] objPath        - Object path to attach to.
+     *  @param[in] event          - reference to sdeventplus::Event loop
+     *  @param[in] actionTargets  - map of systemd targets called on timeout
      *  @param[in] fallback
      */
-    Watchdog(sdbusplus::bus::bus& bus, const char* objPath, EventPtr& event,
+    Watchdog(sdbusplus::bus::bus& bus, const char* objPath,
+             const sdeventplus::Event& event,
              ActionTargetMap&& actionTargetMap = {},
              std::optional<Fallback>&& fallback = std::nullopt) :
         WatchdogInherits(bus, objPath),
@@ -118,13 +119,13 @@
     /** @brief Tells if the referenced timer is expired or not */
     inline auto timerExpired() const
     {
-        return timer.expired();
+        return timer.hasExpired();
     }
 
     /** @brief Tells if the timer is running or not */
     inline bool timerEnabled() const
     {
-        return timer.getEnabled() != SD_EVENT_OFF;
+        return timer.isEnabled();
     }
 
   private:
@@ -138,7 +139,7 @@
     std::optional<Fallback> fallback;
 
     /** @brief Contained timer object */
-    Timer timer;
+    sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
 
     /** @brief Optional Callback handler on timer expirartion */
     void timeOutHandler();
