diff --git a/manager.cpp b/manager.cpp
index 51bd5bf..92a7a3c 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -27,8 +27,7 @@
 
 using namespace phosphor::logging;
 
-const std::set<std::string> Manager::managedProperties = {PROPERTY_TIME_MODE,
-                                                          PROPERTY_TIME_OWNER};
+const std::set<std::string> Manager::managedProperties = {PROPERTY_TIME_MODE};
 
 Manager::Manager(sdbusplus::bus::bus& bus) : bus(bus), settings(bus)
 {
@@ -39,10 +38,6 @@
             std::bind(std::mem_fn(&Manager::onHostStateChanged), this,
                       std::placeholders::_1));
     settingsMatches.emplace_back(
-        bus, propertiesChanged(settings.timeOwner, settings::timeOwnerIntf),
-        std::bind(std::mem_fn(&Manager::onSettingsChanged), this,
-                  std::placeholders::_1));
-    settingsMatches.emplace_back(
         bus, propertiesChanged(settings.timeSyncMethod, settings::timeSyncIntf),
         std::bind(std::mem_fn(&Manager::onSettingsChanged), this,
                   std::placeholders::_1));
@@ -55,18 +50,14 @@
     // Check the settings daemon to process the new settings
     auto mode = getSetting(settings.timeSyncMethod.c_str(),
                            settings::timeSyncIntf, PROPERTY_TIME_MODE);
-    auto owner = getSetting(settings.timeOwner.c_str(), settings::timeOwnerIntf,
-                            PROPERTY_TIME_OWNER);
 
     onPropertyChanged(PROPERTY_TIME_MODE, mode);
-    onPropertyChanged(PROPERTY_TIME_OWNER, owner);
 }
 
 void Manager::addListener(PropertyChangeListner* listener)
 {
     // Notify listener about the initial value
     listener->onModeChanged(timeMode);
-    listener->onOwnerChanged(timeOwner);
 
     listeners.insert(listener);
 }
@@ -78,11 +69,6 @@
     {
         timeMode = utils::strToMode(mode);
     }
-    auto owner = utils::readData<std::string>(ownerFile);
-    if (!owner.empty())
-    {
-        timeOwner = utils::strToOwner(owner);
-    }
 }
 
 void Manager::checkHostOn()
@@ -102,7 +88,7 @@
 {
     if (hostOn)
     {
-        // If host is on, set the values as requested time mode/owner.
+        // If host is on, set the values as requested time mode.
         // And when host becomes off, notify the listeners.
         setPropertyAsRequested(key, value);
     }
@@ -114,11 +100,6 @@
             setCurrentTimeMode(value);
             onTimeModeChanged(value);
         }
-        else if (key == PROPERTY_TIME_OWNER)
-        {
-            setCurrentTimeOwner(value);
-            onTimeOwnerChanged();
-        }
     }
 }
 
@@ -149,10 +130,6 @@
     {
         setRequestedMode(value);
     }
-    else if (key == PROPERTY_TIME_OWNER)
-    {
-        setRequestedOwner(value);
-    }
     else
     {
         // The key shall be already the supported one
@@ -170,11 +147,6 @@
     requestedMode = mode;
 }
 
-void Manager::setRequestedOwner(const std::string& owner)
-{
-    requestedOwner = owner;
-}
-
 void Manager::updateNtpSetting(const std::string& value)
 {
     bool isNtp =
@@ -238,14 +210,6 @@
         }
         setRequestedMode({}); // Clear requested mode
     }
-    if (!requestedOwner.empty())
-    {
-        if (setCurrentTimeOwner(requestedOwner))
-        {
-            onTimeOwnerChanged();
-        }
-        setRequestedOwner({}); // Clear requested owner
-    }
 }
 
 bool Manager::setCurrentTimeMode(const std::string& mode)
@@ -265,23 +229,6 @@
     }
 }
 
-bool Manager::setCurrentTimeOwner(const std::string& owner)
-{
-    auto newOwner = utils::strToOwner(owner);
-    if (newOwner != timeOwner)
-    {
-        log<level::INFO>("Time owner is changed",
-                         entry("OWNER=%s", owner.c_str()));
-        timeOwner = newOwner;
-        utils::writeData(ownerFile, owner);
-        return true;
-    }
-    else
-    {
-        return false;
-    }
-}
-
 void Manager::onTimeModeChanged(const std::string& mode)
 {
     for (const auto listener : listeners)
@@ -292,14 +239,6 @@
     updateNtpSetting(mode);
 }
 
-void Manager::onTimeOwnerChanged()
-{
-    for (const auto& listener : listeners)
-    {
-        listener->onOwnerChanged(timeOwner);
-    }
-}
-
 std::string Manager::getSetting(const char* path, const char* interface,
                                 const char* setting) const
 {
