diff --git a/powermode.cpp b/powermode.cpp
index fd8679d..7db3565 100644
--- a/powermode.cpp
+++ b/powermode.cpp
@@ -195,28 +195,9 @@
 
     if (!persistedData.ipsAvailable())
     {
-        // Read the default IPS parameters
-        bool ipsEnabled;
-        uint8_t enterUtil, exitUtil;
-        uint16_t enterTime, exitTime;
-        if (!getDefaultIPSParms(ipsEnabled, enterUtil, enterTime, exitUtil,
-                                exitTime))
-        {
-            // Unable to read defaults
-            return false;
-        }
-        log<level::INFO>(
-            fmt::format(
-                "PowerMode::initPersistentData: Using default IPS parms: Enabled: {}, EnterUtil: {}%, EnterTime: {}s, ExitUtil: {}%, ExitTime: {}s",
-                ipsEnabled, enterUtil, enterTime, exitUtil, exitTime)
-                .c_str());
-
-        // Save IPS
-        persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
-                                exitTime);
-
-        // Write default IPS data to DBus
-        updateDbusIPS(ipsEnabled, enterUtil, enterTime, exitUtil, exitTime);
+        // Read the default IPS parameters, write persistent file and update
+        // DBus
+        return useDefaultIPSParms();
     }
     return true;
 }
@@ -373,12 +354,6 @@
 
 void PowerMode::ipsChanged(sdbusplus::message::message& msg)
 {
-    if (!masterActive || !masterOccSet)
-    {
-        // Nothing to do
-        return;
-    }
-
     bool parmsChanged = false;
     std::string interface;
     std::map<std::string, std::variant<bool, uint8_t, uint64_t>>
@@ -443,9 +418,22 @@
 
     if (parmsChanged)
     {
-        // Update persistant data with new DBus values
-        persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
-                                exitTime);
+        if (exitUtil == 0)
+        {
+            // Setting the exitUtil to 0 will force restoring the default IPS
+            // parmeters (0 is not valid exit utilization)
+            log<level::INFO>(
+                "Idle Power Saver Exit Utilization is 0%. Restoring default parameters");
+            // Read the default IPS parameters, write persistent file and update
+            // DBus
+            useDefaultIPSParms();
+        }
+        else
+        {
+            // Update persistant data with new DBus values
+            persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
+                                    exitTime);
+        }
 
         // Trigger IPS data to get sent to the OCC
         sendIpsData();
@@ -600,6 +588,7 @@
     return status;
 }
 
+// Print the current values
 void OccPersistData::print()
 {
     if (modeData.modeInitialized)
@@ -638,7 +627,7 @@
             "OccPersistData::save: Writing Power Mode persisted data to {}",
             opath.c_str())
             .c_str());
-    print();
+    // print();
 
     std::ofstream stream{opath.c_str()};
     cereal::JSONOutputArchive oarchive{stream};
@@ -682,7 +671,7 @@
         modeData.ipsInitialized = false;
     }
 
-    print();
+    // print();
 }
 
 // Called when PowerModeProperties defaults are available on DBus
@@ -859,6 +848,34 @@
     return true;
 }
 
+/* Read default IPS parameters, save them to the persistent file and update
+ DBus. Return true if successful */
+bool PowerMode::useDefaultIPSParms()
+{
+    // Read the default IPS parameters
+    bool ipsEnabled;
+    uint8_t enterUtil, exitUtil;
+    uint16_t enterTime, exitTime;
+    if (!getDefaultIPSParms(ipsEnabled, enterUtil, enterTime, exitUtil,
+                            exitTime))
+    {
+        // Unable to read defaults
+        return false;
+    }
+    log<level::INFO>(
+        fmt::format(
+            "PowerMode::useDefaultIPSParms: Using default IPS parms: Enabled: {}, EnterUtil: {}%, EnterTime: {}s, ExitUtil: {}%, ExitTime: {}s",
+            ipsEnabled, enterUtil, enterTime, exitUtil, exitTime)
+            .c_str());
+
+    // Save IPS parms to the persistent file
+    persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
+                            exitTime);
+
+    // Write IPS parms to DBus
+    return updateDbusIPS(ipsEnabled, enterUtil, enterTime, exitUtil, exitTime);
+}
+
 } // namespace powermode
 
 } // namespace occ
