diff --git a/manager.cpp b/manager.cpp
index 92a7a3c..4cc0b57 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -2,17 +2,17 @@
 
 #include "utils.hpp"
 
+#include <assert.h>
+
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/elog.hpp>
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
-#include <xyz/openbmc_project/State/Host/server.hpp>
 
 namespace rules = sdbusplus::bus::match::rules;
 
 namespace // anonymous
 {
-constexpr auto HOST_CURRENT_STATE = "CurrentHostState";
 
 constexpr auto SYSTEMD_TIME_SERVICE = "org.freedesktop.timedate1";
 constexpr auto SYSTEMD_TIME_PATH = "/org/freedesktop/timedate1";
@@ -27,26 +27,14 @@
 
 using namespace phosphor::logging;
 
-const std::set<std::string> Manager::managedProperties = {PROPERTY_TIME_MODE};
-
 Manager::Manager(sdbusplus::bus::bus& bus) : bus(bus), settings(bus)
 {
     using namespace sdbusplus::bus::match::rules;
-    hostStateChangeMatch =
-        std::make_unique<decltype(hostStateChangeMatch)::element_type>(
-            bus, propertiesChanged(settings.hostState, settings::hostStateIntf),
-            std::bind(std::mem_fn(&Manager::onHostStateChanged), this,
-                      std::placeholders::_1));
     settingsMatches.emplace_back(
         bus, propertiesChanged(settings.timeSyncMethod, settings::timeSyncIntf),
         std::bind(std::mem_fn(&Manager::onSettingsChanged), this,
                   std::placeholders::_1));
 
-    checkHostOn();
-
-    // Restore settings from persistent storage
-    restoreSettings();
-
     // Check the settings daemon to process the new settings
     auto mode = getSetting(settings.timeSyncMethod.c_str(),
                            settings::timeSyncIntf, PROPERTY_TIME_MODE);
@@ -54,53 +42,14 @@
     onPropertyChanged(PROPERTY_TIME_MODE, mode);
 }
 
-void Manager::addListener(PropertyChangeListner* listener)
-{
-    // Notify listener about the initial value
-    listener->onModeChanged(timeMode);
-
-    listeners.insert(listener);
-}
-
-void Manager::restoreSettings()
-{
-    auto mode = utils::readData<std::string>(modeFile);
-    if (!mode.empty())
-    {
-        timeMode = utils::strToMode(mode);
-    }
-}
-
-void Manager::checkHostOn()
-{
-    using Host = sdbusplus::xyz::openbmc_project::State::server::Host;
-    auto hostService = utils::getService(bus, settings.hostState.c_str(),
-                                         settings::hostStateIntf);
-    auto stateStr = utils::getProperty<std::string>(
-        bus, hostService.c_str(), settings.hostState.c_str(),
-        settings::hostStateIntf, HOST_CURRENT_STATE);
-    auto state = Host::convertHostStateFromString(stateStr);
-    hostOn = (state == Host::HostState::Running);
-}
-
 void Manager::onPropertyChanged(const std::string& key,
                                 const std::string& value)
 {
-    if (hostOn)
-    {
-        // If host is on, set the values as requested time mode.
-        // And when host becomes off, notify the listeners.
-        setPropertyAsRequested(key, value);
-    }
-    else
-    {
-        // If host is off, notify listeners
-        if (key == PROPERTY_TIME_MODE)
-        {
-            setCurrentTimeMode(value);
-            onTimeModeChanged(value);
-        }
-    }
+    assert(key == PROPERTY_TIME_MODE);
+
+    // Notify listeners
+    setCurrentTimeMode(value);
+    onTimeModeChanged(value);
 }
 
 int Manager::onSettingsChanged(sdbusplus::message::message& msg)
@@ -123,30 +72,6 @@
     return 0;
 }
 
-void Manager::setPropertyAsRequested(const std::string& key,
-                                     const std::string& value)
-{
-    if (key == PROPERTY_TIME_MODE)
-    {
-        setRequestedMode(value);
-    }
-    else
-    {
-        // The key shall be already the supported one
-        using InvalidArgumentError =
-            sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
-        using namespace xyz::openbmc_project::Common;
-        elog<InvalidArgumentError>(
-            InvalidArgument::ARGUMENT_NAME(key.c_str()),
-            InvalidArgument::ARGUMENT_VALUE(value.c_str()));
-    }
-}
-
-void Manager::setRequestedMode(const std::string& mode)
-{
-    requestedMode = mode;
-}
-
 void Manager::updateNtpSetting(const std::string& value)
 {
     bool isNtp =
@@ -168,50 +93,6 @@
     }
 }
 
-void Manager::onHostStateChanged(sdbusplus::message::message& msg)
-{
-    using Interface = std::string;
-    using Property = std::string;
-    using Value = std::string;
-    using Properties = std::map<Property, std::variant<Value>>;
-    using Host = sdbusplus::xyz::openbmc_project::State::server::Host;
-
-    Interface interface;
-    Properties properties;
-
-    msg.read(interface, properties);
-
-    for (const auto& p : properties)
-    {
-        if (p.first == HOST_CURRENT_STATE)
-        {
-            auto state = Host::convertHostStateFromString(
-                std::get<std::string>(p.second));
-            onHostState(state == Host::HostState::Running);
-            break;
-        }
-    }
-}
-
-void Manager::onHostState(bool on)
-{
-    hostOn = on;
-    if (hostOn)
-    {
-        log<level::INFO>("Changing time settings is *deferred* now");
-        return;
-    }
-    log<level::INFO>("Changing time settings allowed now");
-    if (!requestedMode.empty())
-    {
-        if (setCurrentTimeMode(requestedMode))
-        {
-            onTimeModeChanged(requestedMode);
-        }
-        setRequestedMode({}); // Clear requested mode
-    }
-}
-
 bool Manager::setCurrentTimeMode(const std::string& mode)
 {
     auto newMode = utils::strToMode(mode);
@@ -220,7 +101,6 @@
         log<level::INFO>("Time mode is changed",
                          entry("MODE=%s", mode.c_str()));
         timeMode = newMode;
-        utils::writeData(modeFile, mode);
         return true;
     }
     else
@@ -231,10 +111,6 @@
 
 void Manager::onTimeModeChanged(const std::string& mode)
 {
-    for (const auto listener : listeners)
-    {
-        listener->onModeChanged(timeMode);
-    }
     // When time_mode is updated, update the NTP setting
     updateNtpSetting(mode);
 }
