diff --git a/json_config.hpp b/json_config.hpp
index 7043e8f..82d7c58 100644
--- a/json_config.hpp
+++ b/json_config.hpp
@@ -145,7 +145,6 @@
                 }
             }
             _loadFunc();
-            _match.reset();
         }
         else
         {
@@ -157,7 +156,6 @@
             try
             {
                 _loadFunc();
-                _match.reset();
             }
             catch (const NoConfigFound&)
             {
diff --git a/monitor/system.cpp b/monitor/system.cpp
index f3863b0..fc38645 100644
--- a/monitor/system.cpp
+++ b/monitor/system.cpp
@@ -22,6 +22,7 @@
 #include "types.hpp"
 #include "utility.hpp"
 #ifdef MONITOR_USE_JSON
+#include "json_config.hpp"
 #include "json_parser.hpp"
 #endif
 
@@ -55,19 +56,54 @@
 
 void System::start()
 {
-    _started = true;
+    namespace match = sdbusplus::bus::match;
+
+    // must be done before service detection
+    _inventoryMatch = std::make_unique<match::match>(
+        _bus, match::rules::nameOwnerChanged(util::INVENTORY_SVC),
+        std::bind(&System::inventoryOnlineCb, this, std::placeholders::_1));
+
+    bool invServiceRunning = util::SDBusPlus::callMethodAndRead<bool>(
+        _bus, "org.freedesktop.DBus", "/org/freedesktop/DBus",
+        "org.freedesktop.DBus", "NameHasOwner", util::INVENTORY_SVC);
+
+    if (invServiceRunning)
+    {
+        _inventoryMatch.reset();
+
+        if (!_loaded)
+        {
+            load();
+        }
+    }
+}
+
+void System::load()
+{
     json jsonObj = json::object();
 #ifdef MONITOR_USE_JSON
-    auto confFile =
-        fan::JsonConfig::getConfFile(_bus, confAppName, confFileName);
-    jsonObj = fan::JsonConfig::load(confFile);
+    try
+    {
+        jsonObj = getJsonObj(_bus);
 #endif
-    // Retrieve and set trust groups within the trust manager
-    setTrustMgr(getTrustGroups(jsonObj));
-    // Retrieve fan definitions and create fan objects to be monitored
-    setFans(getFanDefinitions(jsonObj));
-    setFaultConfig(jsonObj);
-    log<level::INFO>("Configuration loaded");
+        auto trustGrps = getTrustGroups(jsonObj);
+        auto fanDefs = getFanDefinitions(jsonObj);
+        // Retrieve and set trust groups within the trust manager
+        setTrustMgr(getTrustGroups(jsonObj));
+        // Clear/set configured fan definitions
+        _fans.clear();
+        _fanHealth.clear();
+        // Retrieve fan definitions and create fan objects to be monitored
+        setFans(fanDefs);
+        setFaultConfig(jsonObj);
+        log<level::INFO>("Configuration loaded");
+
+        _loaded = true;
+#ifdef MONITOR_USE_JSON
+    }
+    catch (const phosphor::fan::NoConfigFound&)
+    {}
+#endif
 
     if (_powerState->isPowerOn())
     {
@@ -77,16 +113,15 @@
                       });
     }
 
-    if (_sensorMatch.empty())
-    {
-        subscribeSensorsToServices();
-    }
+    subscribeSensorsToServices();
 }
 
 void System::subscribeSensorsToServices()
 {
     namespace match = sdbusplus::bus::match;
 
+    _sensorMatch.clear();
+
     SensorMapType sensorMap;
 
     // build a list of all interfaces, always including the value interface
@@ -152,38 +187,43 @@
     }
 }
 
+void System::inventoryOnlineCb(sdbusplus::message::message& msg)
+{
+    namespace match = sdbusplus::bus::match;
+
+    std::string iface;
+    msg.read(iface);
+
+    if (util::INVENTORY_INTF != iface)
+    {
+        return;
+    }
+
+    std::string oldName;
+    msg.read(oldName);
+
+    std::string newName;
+    msg.read(newName);
+
+    // newName should never be empty since match was reset on the first
+    // nameOwnerChanged signal received from the service.
+    if (!_loaded && !newName.empty())
+    {
+        load();
+    }
+
+    // cancel any further notifications about the service state
+    _inventoryMatch.reset();
+}
+
 void System::sighupHandler(sdeventplus::source::Signal&,
                            const struct signalfd_siginfo*)
 {
     try
     {
-        json jsonObj = json::object();
-#ifdef MONITOR_USE_JSON
-        jsonObj = getJsonObj(_bus);
-#endif
-        auto trustGrps = getTrustGroups(jsonObj);
-        auto fanDefs = getFanDefinitions(jsonObj);
-        // Set configured trust groups
-        setTrustMgr(trustGrps);
-        // Clear/set configured fan definitions
-        _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);
-                          });
-        }
-
-        _sensorMatch.clear();
-        subscribeSensorsToServices();
+        load();
     }
-    catch (const std::runtime_error& re)
+    catch (std::runtime_error& re)
     {
         log<level::ERR>("Error reloading config, no config changes made",
                         entry("LOAD_ERROR=%s", re.what()));
@@ -317,7 +357,7 @@
 
     if (powerStateOn)
     {
-        if (!_started)
+        if (!_loaded)
         {
             log<level::ERR>("No conf file found at power on");
             throw std::runtime_error("No conf file found at power on");
diff --git a/monitor/system.hpp b/monitor/system.hpp
index 328c958..3997807 100644
--- a/monitor/system.hpp
+++ b/monitor/system.hpp
@@ -113,11 +113,25 @@
     }
 
     /**
-     * @brief Parses and populates the fan monitor trust groups and list of fans
+     * @brief tests the presence of Inventory and calls load() if present, else
+     *  waits for Inventory asynchronously and has a callback to load() when
+     * present
      */
     void start();
 
+    /**
+     * @brief Parses and populates the fan monitor trust groups and list of fans
+     */
+    void load();
+
   private:
+    /**
+     * @brief Callback from D-Bus when Inventory service comes online
+     *
+     * @param[in] msg - Service details.
+     */
+    void inventoryOnlineCb(sdbusplus::message::message& msg);
+
     /* The mode of fan monitor */
     Mode _mode;
 
@@ -130,6 +144,9 @@
     /* Trust manager of trust groups */
     std::unique_ptr<phosphor::fan::trust::Manager> _trust;
 
+    /* match object to detect Inventory service */
+    std::unique_ptr<sdbusplus::bus::match::match> _inventoryMatch;
+
     /* List of fan objects to monitor */
     std::vector<std::unique_ptr<Fan>> _fans;
 
@@ -173,9 +190,9 @@
     std::vector<std::unique_ptr<sdbusplus::bus::match::match>> _sensorMatch;
 
     /**
-     * @brief If start() has been called
+     * @brief true if config files have been loaded
      */
-    bool _started = false;
+    bool _loaded = false;
 
     /**
      * @brief Captures tach sensor data as JSON for use in
