diff --git a/monitor/system.cpp b/monitor/system.cpp
index 41a5750..f9a8804 100644
--- a/monitor/system.cpp
+++ b/monitor/system.cpp
@@ -41,6 +41,10 @@
     _mode(mode),
     _bus(bus), _event(event)
 {
+    _powerState = std::make_unique<PGoodState>(
+        bus, std::bind(std::mem_fn(&System::powerStateChanged), this,
+                       std::placeholders::_1));
+
     json jsonObj = json::object();
 #ifdef MONITOR_USE_JSON
     jsonObj = getJsonObj(bus);
@@ -49,7 +53,26 @@
     setTrustMgr(getTrustGroups(jsonObj));
     // Retrieve fan definitions and create fan objects to be monitored
     setFans(getFanDefinitions(jsonObj));
+    setFaultConfig(jsonObj);
     log<level::INFO>("Configuration loaded");
+
+    // Since this doesn't run at standby yet, powerStateChanged
+    // will never be called so for now treat start up as the
+    // pgood.  When this does run at standby, the 'atPgood'
+    // rules won't need to be checked here.
+    if (_powerState->isPowerOn())
+    {
+        std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                      [this](auto& rule) {
+                          rule->check(PowerRuleState::atPgood, _fanHealth);
+                      });
+        // Runtime rules still need to be checked since fans may already
+        // be missing that could trigger a runtime rule.
+        std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                      [this](auto& rule) {
+                          rule->check(PowerRuleState::runtime, _fanHealth);
+                      });
+    }
 }
 
 void System::sighupHandler(sdeventplus::source::Signal&,
@@ -69,7 +92,16 @@
         _fans.clear();
         _fanHealth.clear();
         setFans(fanDefs);
+        setFaultConfig(jsonObj);
         log<level::INFO>("Configuration reloaded successfully");
+
+        if (_powerState->isPowerOn())
+        {
+            std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                          [this](auto& rule) {
+                              rule->check(PowerRuleState::runtime, _fanHealth);
+                          });
+        }
     }
     catch (std::runtime_error& re)
     {
@@ -138,6 +170,45 @@
 void System::fanStatusChange(const Fan& fan)
 {
     updateFanHealth(fan);
+
+    if (_powerState->isPowerOn())
+    {
+        std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                      [this](auto& rule) {
+                          rule->check(PowerRuleState::runtime, _fanHealth);
+                      });
+    }
+}
+
+void System::setFaultConfig(const json& jsonObj)
+{
+#ifdef MONITOR_USE_JSON
+    std::shared_ptr<PowerInterfaceBase> powerInterface =
+        std::make_shared<PowerInterface>();
+
+    _powerOffRules = getPowerOffRules(jsonObj, powerInterface);
+#endif
+}
+
+void System::powerStateChanged(bool powerStateOn)
+{
+    if (powerStateOn)
+    {
+        std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                      [this](auto& rule) {
+                          rule->check(PowerRuleState::atPgood, _fanHealth);
+                      });
+        std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                      [this](auto& rule) {
+                          rule->check(PowerRuleState::runtime, _fanHealth);
+                      });
+    }
+    else
+    {
+        // Cancel any in-progress power off actions
+        std::for_each(_powerOffRules.begin(), _powerOffRules.end(),
+                      [this](auto& rule) { rule->cancel(); });
+    }
 }
 
 } // namespace phosphor::fan::monitor
diff --git a/monitor/system.hpp b/monitor/system.hpp
index 7c424a2..b1b80a5 100644
--- a/monitor/system.hpp
+++ b/monitor/system.hpp
@@ -16,6 +16,8 @@
 #pragma once
 
 #include "fan.hpp"
+#include "power_off_rule.hpp"
+#include "power_state.hpp"
 #include "tach_sensor.hpp"
 #include "trust_manager.hpp"
 #include "types.hpp"
@@ -93,6 +95,17 @@
     FanHealth _fanHealth;
 
     /**
+     * @brief The object to watch the power state
+     */
+    std::unique_ptr<PowerState> _powerState;
+
+    /**
+     * @brief The power off rules, for shutting down the system
+     *        due to fan failures.
+     */
+    std::vector<std::unique_ptr<PowerOffRule>> _powerOffRules;
+
+    /**
      * @brief Retrieve the configured trust groups
      *
      * @param[in] jsonObj - JSON object to parse from
@@ -130,6 +143,21 @@
      * @param[in] fan - The fan to update the health map with
      */
     void updateFanHealth(const Fan& fan);
+
+    /**
+     * @brief The function that runs when the power state changes
+     *
+     * @param[in] powerStateOn - If power is now on or not
+     */
+    void powerStateChanged(bool powerStateOn);
+
+    /**
+     * @brief Reads the fault configuration from the JSON config
+     *        file, such as the power off rule configuration.
+     *
+     * @param[in] jsonObj - JSON object to parse from
+     */
+    void setFaultConfig(const json& jsonObj);
 };
 
 } // namespace phosphor::fan::monitor
