diff --git a/watchdog.hpp b/watchdog.hpp
new file mode 100644
index 0000000..47484af
--- /dev/null
+++ b/watchdog.hpp
@@ -0,0 +1,92 @@
+#pragma once
+
+#include <systemd/sd-event.h>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+#include <xyz/openbmc_project/State/Watchdog/server.hpp>
+#include "timer.hpp"
+
+namespace phosphor
+{
+namespace watchdog
+{
+using WatchdogInherits = sdbusplus::server::object::object<
+        sdbusplus::xyz::openbmc_project::State::server::Watchdog>;
+
+/** @class Watchdog
+ *  @brief OpenBMC watchdog implementation.
+ *  @details A concrete implementation for the
+ *  xyz.openbmc_project.State.Watchdog DBus API.
+ */
+class Watchdog : public WatchdogInherits
+{
+    public:
+        Watchdog() = delete;
+        ~Watchdog() = default;
+        Watchdog(const Watchdog&) = delete;
+        Watchdog& operator=(const Watchdog&) = delete;
+        Watchdog(Watchdog&&) = delete;
+        Watchdog& operator=(Watchdog &&) = delete;
+
+        /** @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
+         */
+        Watchdog(sdbusplus::bus::bus& bus,
+                const char* objPath,
+                EventPtr& event) :
+            WatchdogInherits(bus, objPath),
+            bus(bus),
+            timer(event)
+        {
+            // Nothing
+        }
+
+        /** @brief Enable or disable watchdog
+         *         If a watchdog state is changed from disable to enable,
+         *         the watchdog timer is set with the default expiration
+         *         interval and it starts counting down.
+         *         If a watchdog is already enabled, setting @value to true
+         *         has no effect.
+         *
+         *  @param[in] value - 'true' to enable. 'false' to disable
+         *
+         *  @return : applied value if success, previous value otherwise
+         */
+        bool enabled(bool value) override;
+
+        /** @brief Gets the remaining time before watchdog expires.
+         *
+         *  @return 0 if watchdog is disabled or expired.
+         *          Remaining time in milliseconds otherwise.
+         */
+        uint64_t timeRemaining() const override;
+
+        /** @brief Reset timer to expire after new timeout in milliseconds.
+         *
+         *  @param[in] value - the time in miliseconds after which
+         *                     the watchdog will expire
+         *
+         *  @return: updated timeout value if watchdog is enabled.
+         *           0 otherwise.
+         */
+        uint64_t timeRemaining(uint64_t value) override;
+
+        /** @brief Tells if the referenced timer is expired or not */
+        inline auto timerExpired() const
+        {
+            return timer.expired();
+        }
+
+    private:
+        /** @brief sdbusplus handle */
+        sdbusplus::bus::bus& bus;
+
+        /** @brief Contained timer object */
+        Timer timer;
+};
+
+} // namespace watchdog
+} // namespace phosphor
