diff --git a/pldm.cpp b/pldm.cpp
index f4a1c73..1ce23f4 100644
--- a/pldm.cpp
+++ b/pldm.cpp
@@ -117,8 +117,7 @@
     {
         auto pdrPtr =
             reinterpret_cast<const pldm_state_sensor_pdr*>(pdr.data());
-        uint32_t key = (static_cast<uint32_t>(pdrPtr->container_id) << 16) |
-                       static_cast<uint32_t>(pdrPtr->entity_instance);
+        uint32_t key = pdrPtr->sensor_id;
         entityInstMap.emplace(key, static_cast<SensorID>(pdrPtr->sensor_id));
     }
 
@@ -132,6 +131,12 @@
 
 void Interface::sensorEvent(sdbusplus::message::message& msg)
 {
+    if (!open_power::occ::utils::isHostRunning())
+    {
+        clearData();
+        return;
+    }
+
     if (!isOCCSensorCacheValid())
     {
         fetchSensorInfo(PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS,
@@ -144,13 +149,14 @@
                         SBESensorOffset);
     }
 
-    TerminusID tid{};
+    TerminusID sensorTid{};
     SensorID sensorId{};
     SensorOffset msgSensorOffset{};
     EventState eventState{};
     EventState previousEventState{};
 
-    msg.read(tid, sensorId, msgSensorOffset, eventState, previousEventState);
+    msg.read(sensorTid, sensorId, msgSensorOffset, eventState,
+             previousEventState);
 
     if (msgSensorOffset == OCCSensorOffset)
     {
@@ -237,30 +243,49 @@
     }
 }
 
-void Interface::hostStateEvent(sdbusplus::message::message& msg)
-{
-    std::map<std::string, std::variant<std::string>> properties{};
-    std::string interface;
-    msg.read(interface, properties);
-    const auto stateEntry = properties.find("CurrentHostState");
-    if (stateEntry != properties.end())
-    {
-        auto stateEntryValue = stateEntry->second;
-        auto propVal = std::get<std::string>(stateEntryValue);
-        if (propVal == "xyz.openbmc_project.State.Host.HostState.Off")
-        {
-            clearData();
-        }
-    }
-}
-
 void Interface::clearData()
 {
-    sensorToOCCInstance.clear();
-    occInstanceToEffecter.clear();
-
-    sensorToSBEInstance.clear();
-    sbeInstanceToEffecter.clear();
+    if (!sensorToOCCInstance.empty())
+    {
+        log<level::INFO>(
+            fmt::format("clearData: Clearing sensorToOCCInstance ({} entries)",
+                        sensorToOCCInstance.size())
+                .c_str());
+        for (auto entry : sensorToOCCInstance)
+        {
+            log<level::INFO>(
+                fmt::format("clearData: OCC{} / sensorID: 0x{:04X}",
+                            entry.second, entry.first)
+                    .c_str());
+        }
+        sensorToOCCInstance.clear();
+    }
+    if (!occInstanceToEffecter.empty())
+    {
+        log<level::DEBUG>(
+            fmt::format(
+                "clearData: Clearing occInstanceToEffecter ({} entries)",
+                occInstanceToEffecter.size())
+                .c_str());
+        occInstanceToEffecter.clear();
+    }
+    if (!sensorToSBEInstance.empty())
+    {
+        log<level::DEBUG>(
+            fmt::format("clearData: Clearing sensorToSBEInstance ({} entries)",
+                        sensorToSBEInstance.size())
+                .c_str());
+        sensorToSBEInstance.clear();
+    }
+    if (!sbeInstanceToEffecter.empty())
+    {
+        log<level::DEBUG>(
+            fmt::format(
+                "clearData: Clearing sbeInstanceToEffecter ({} entries)",
+                sbeInstanceToEffecter.size())
+                .c_str());
+        sbeInstanceToEffecter.clear();
+    }
 }
 
 void Interface::fetchEffecterInfo(uint16_t stateSetId,
@@ -326,8 +351,7 @@
     {
         auto pdrPtr =
             reinterpret_cast<const pldm_state_effecter_pdr*>(pdr.data());
-        uint32_t key = (static_cast<uint32_t>(pdrPtr->container_id) << 16) |
-                       static_cast<uint32_t>(pdrPtr->entity_instance);
+        uint32_t key = pdrPtr->effecter_id;
         entityInstMap.emplace(key, static_cast<SensorID>(pdrPtr->effecter_id));
     }
 
@@ -850,6 +874,8 @@
                 "checkActiveSensor: Unable to find PLDM sensor for OCC{}",
                 instance)
                 .c_str());
+        // Clear cache to recollect the sensor ids
+        clearData();
     }
 }
 
diff --git a/pldm.hpp b/pldm.hpp
index 3f0c844..f67a36b 100644
--- a/pldm.hpp
+++ b/pldm.hpp
@@ -70,12 +70,6 @@
                 MatchRules::interface("xyz.openbmc_project.PLDM.Event"),
             std::bind(std::mem_fn(&Interface::sensorEvent), this,
                       std::placeholders::_1)),
-        hostStateSignal(
-            open_power::occ::utils::getBus(),
-            MatchRules::propertiesChanged("/xyz/openbmc_project/state/host0",
-                                          "xyz.openbmc_project.State.Host"),
-            std::bind(std::mem_fn(&Interface::hostStateEvent), this,
-                      std::placeholders::_1)),
         sdpEvent(sdeventplus::Event::get_default()),
         pldmRspTimer(
             sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>(
@@ -174,9 +168,6 @@
      */
     sdbusplus::bus::match_t pldmEventSignal;
 
-    /** @brief Used to subscribe for host state change signal */
-    sdbusplus::bus::match_t hostStateSignal;
-
     /** @brief PLDM Sensor ID to OCC Instance mapping
      */
     SensorToInstance sensorToOCCInstance;
@@ -259,14 +250,6 @@
      */
     void sensorEvent(sdbusplus::message::message& msg);
 
-    /** @brief When the host state changes and if the CurrentHostState is
-     *         xyz.openbmc_project.State.Host.HostState.Off then
-     *         the cache of OCC sensors and effecters mapping is cleared.
-     *
-     *  @param[in] msg - data associated with the subscribed signal
-     */
-    void hostStateEvent(sdbusplus::message::message& msg);
-
     /** @brief Called when it is determined that the Host is not running.
      *         The cache of OCC sensors and effecters mapping is cleared.
      */
