diff --git a/epoch_base.hpp b/epoch_base.hpp
index fc505d0..f31a32b 100644
--- a/epoch_base.hpp
+++ b/epoch_base.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "property_change_listener.hpp"
+
 #include <sdbusplus/bus.hpp>
 #include <xyz/openbmc_project/Time/EpochTime/server.hpp>
 
@@ -16,64 +18,30 @@
  *  DBus API for epoch time.
  */
 class EpochBase : public sdbusplus::server::object::object <
-    sdbusplus::xyz::openbmc_project::Time::server::EpochTime >
+    sdbusplus::xyz::openbmc_project::Time::server::EpochTime >,
+    public PropertyChangeListner
 {
     public:
         friend class TestEpochBase;
 
-        /** @brief Supported time modes
-         *  NTP     Time sourced by Network Time Server
-         *  MANUAL  User of the system need to set the time
-         */
-        enum class Mode
-        {
-            NTP,
-            MANUAL,
-        };
-
-        /** @brief Supported time owners
-         *  BMC     Time source may be NTP or MANUAL but it has to be set natively
-         *          on the BMC. Meaning, host can not set the time. What it also
-         *          means is that when BMC gets IPMI_SET_SEL_TIME, then its ignored.
-         *          similarly, when BMC gets IPMI_GET_SEL_TIME, then the BMC's time
-         *          is returned.
-         *
-         *  HOST    Its only IPMI_SEL_SEL_TIME that will set the time on BMC.
-         *          Meaning, IPMI_GET_SEL_TIME and request to get BMC time will
-         *          result in same value.
-         *
-         *  SPLIT   Both BMC and HOST will maintain their individual clocks but then
-         *          the time information is stored in BMC. BMC can have either NTP
-         *          or MANUAL as it's source of time and will set the time directly
-         *          on the BMC. When IPMI_SET_SEL_TIME is received, then the delta
-         *          between that and BMC's time is calculated and is stored.
-         *          When BMC reads the time, the current time is returned.
-         *          When IPMI_GET_SEL_TIME is received, BMC's time is retrieved and
-         *          then the delta offset is factored in prior to returning.
-         *
-         *  BOTH:   BMC's time is set with whoever that sets the time. Similarly,
-         *          BMC's time is returned to whoever that asks the time.
-         */
-        enum class Owner
-        {
-            BMC,
-            HOST,
-            SPLIT,
-            BOTH,
-        };
-
         EpochBase(sdbusplus::bus::bus& bus,
                   const char* objPath);
 
+        /** @brief Notified on time mode changed */
+        void onModeChanged(Mode mode) override;
+
+        /** @brief Notified on time owner changed */
+        void onOwnerChanged(Owner owner) override;
+
     protected:
         /** @brief Persistent sdbusplus DBus connection */
         sdbusplus::bus::bus& bus;
 
         /** @brief The current time mode */
-        Mode timeMode;
+        Mode timeMode = Mode::NTP;
 
         /** @brief The current time owner */
-        Owner timeOwner;
+        Owner timeOwner = Owner::BMC;
 
         /** @brief Set current time to system
          *
@@ -89,57 +57,6 @@
          * @return Microseconds since UTC
          */
         std::chrono::microseconds getTime() const;
-
-        /** @brief Convert a string to enum Mode
-         *
-         * Convert the time mode string to enum.
-         * Valid strings are "NTP", "MANUAL"
-         * If it's not a valid time mode string, return NTP.
-         *
-         * @param[in] mode - The string of time mode
-         *
-         * @return The Mode enum
-         */
-        static Mode convertToMode(const std::string& mode);
-
-        /** @brief Convert a string to enum Owner
-         *
-         * Convert the time owner string to enum.
-         * Valid strings are "BMC", "HOST", "SPLIT", "BOTH"
-         * If it's not a valid time owner string, return BMC.
-         *
-         * @param[in] owner - The string of time owner
-         *
-         * @return The Owner enum
-         */
-        static Owner convertToOwner(const std::string& owner);
-
-    private:
-        /** @brief Initialize the time mode and owner */
-        void initialize();
-
-        /** @brief Set current time mode
-         *
-         * @param[in] mode - The string of time mode
-         */
-        void setCurrentTimeMode(const std::string& mode);
-
-        /** @brief Set current time owner
-         *
-         * @param[in] owner - The string of time owner
-         */
-        void setCurrentTimeOwner(const std::string& owner);
-
-        /** @brief Get setting value from settings manager
-         *
-         * @param[in] setting - The string of the setting to get
-         *
-         * @return The value of the setting
-         */
-        std::string getSettings(const char* setting) const;
-
-        /** @brief The map maps the string key to enum Owner */
-        static const std::map<std::string, Owner> ownerMap;
 };
 
 } // namespace time
