diff --git a/manager.cpp b/manager.cpp
index 56e0d0b..bcc581c 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -134,20 +134,12 @@
         if (key == PROPERTY_TIME_MODE)
         {
             setCurrentTimeMode(value);
-            for (const auto listener : listeners)
-            {
-                listener->onModeChanged(timeMode);
-            }
-            // When time_mode is updated, update the NTP setting
-            updateNtpSetting(value);
+            onTimeModeChanged(value);
         }
         else if (key == PROPERTY_TIME_OWNER)
         {
             setCurrentTimeOwner(value);
-            for (const auto listener : listeners)
-            {
-                listener->onOwnerChanged(timeOwner);
-            }
+            onTimeOwnerChanged();
         }
     }
 }
@@ -259,20 +251,17 @@
     }
     if (!requestedMode.empty())
     {
-        setCurrentTimeMode(requestedMode);
-        for (const auto& listener : listeners)
+        if (setCurrentTimeMode(requestedMode))
         {
-            listener->onModeChanged(timeMode);
+            onTimeModeChanged(requestedMode);
         }
-        updateNtpSetting(requestedMode);
         setRequestedMode({}); // Clear requested mode
     }
     if (!requestedOwner.empty())
     {
-        setCurrentTimeOwner(requestedOwner);
-        for (const auto& listener : listeners)
+        if (setCurrentTimeOwner(requestedOwner))
         {
-            listener->onOwnerChanged(timeOwner);
+            onTimeOwnerChanged();
         }
         setRequestedOwner({}); // Clear requested owner
     }
@@ -300,20 +289,56 @@
     return 0;
 }
 
-void Manager::setCurrentTimeMode(const std::string& mode)
+bool Manager::setCurrentTimeMode(const std::string& mode)
 {
-    log<level::INFO>("Time mode is changed",
-                     entry("MODE=%s", mode.c_str()));
-    timeMode = convertToMode(mode);
-    utils::writeData(modeFile, mode);
+    auto newMode = convertToMode(mode);
+    if (newMode != timeMode)
+    {
+        log<level::INFO>("Time mode is changed",
+                         entry("MODE=%s", mode.c_str()));
+        timeMode = newMode;
+        utils::writeData(modeFile, mode);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
 }
 
-void Manager::setCurrentTimeOwner(const std::string& owner)
+bool Manager::setCurrentTimeOwner(const std::string& owner)
 {
-    log<level::INFO>("Time owner is changed",
-                     entry("OWNER=%s", owner.c_str()));
-    timeOwner = convertToOwner(owner);
-    utils::writeData(ownerFile, owner);
+    auto newOwner = convertToOwner(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)
+    {
+        listener->onModeChanged(timeMode);
+    }
+    // When time_mode is updated, update the NTP setting
+    updateNtpSetting(mode);
+}
+
+void Manager::onTimeOwnerChanged()
+{
+    for (const auto& listener : listeners)
+    {
+        listener->onOwnerChanged(timeOwner);
+    }
 }
 
 std::string Manager::getSettings(const char* value) const
