diff --git a/const.hpp b/const.hpp
index 4b50b1f..50cc9c7 100644
--- a/const.hpp
+++ b/const.hpp
@@ -80,6 +80,7 @@
 constexpr auto mapperObjectPath = "/xyz/openbmc_project/object_mapper";
 constexpr auto mapperInterface = "xyz.openbmc_project.ObjectMapper";
 constexpr auto mapperDestination = "xyz.openbmc_project.ObjectMapper";
+constexpr auto loggerService = "xyz.openbmc_project.Logging";
 constexpr auto loggerObjectPath = "/xyz/openbmc_project/logging";
 constexpr auto loggerCreateInterface = "xyz.openbmc_project.Logging.Create";
 constexpr auto errIntfForBlankSystemVPD = "com.ibm.VPD.Error.BlankSystemVPD";
@@ -90,6 +91,7 @@
 constexpr auto errIntfForBusFailure = "com.ibm.VPD.Error.DbusFailure";
 constexpr auto errIntfForInvalidSystemType =
     "com.ibm.VPD.Error.UnknownSytemType";
+constexpr auto errIntfForEssentialFru = "com.ibm.VPD.Error.RequiredFRUMissing";
 constexpr auto errIntfForGpioError = "com.ibm.VPD.Error.GPIOError";
 constexpr auto motherBoardInterface =
     "xyz.openbmc_project.Inventory.Item.Board.Motherboard";
diff --git a/ibm_vpd_utils.cpp b/ibm_vpd_utils.cpp
index 2eba0b1..cc46aa2 100644
--- a/ibm_vpd_utils.cpp
+++ b/ibm_vpd_utils.cpp
@@ -644,29 +644,6 @@
     return str;
 }
 
-/*
- * @brief Log PEL for GPIO exception
- *
- * @param[in] gpioErr gpioError type exception
- * @param[in] i2cBusAddr I2C bus and address
- */
-void logGpioPel(const std::string& gpioErr, const std::string& i2cBusAddr)
-{
-    // Get the IIC details
-    std::vector<std::string> i2cReg;
-    boost::split(i2cReg, i2cBusAddr, boost::is_any_of("-"));
-
-    PelAdditionalData additionalData{};
-    if (i2cReg.size() == 2)
-    {
-        additionalData.emplace("CALLOUT_IIC_BUS", i2cReg[0]);
-        additionalData.emplace("CALLOUT_IIC_ADDR", "0x" + i2cReg[1]);
-    }
-
-    additionalData.emplace("DESCRIPTION", gpioErr);
-    createPEL(additionalData, PelSeverity::WARNING, errIntfForGpioError);
-}
-
 void executePostFailAction(const nlohmann::json& json, const std::string& file)
 {
     if ((json["frus"][file].at(0)).find("postActionFail") ==
@@ -721,9 +698,12 @@
         {
             i2cBusAddr =
                 json["frus"][file].at(0)["postActionFail"]["gpioI2CAddress"];
+            errMsg += " i2cBusAddress: " + i2cBusAddr;
         }
 
-        logGpioPel(errMsg, i2cBusAddr);
+        PelAdditionalData additionalData{};
+        additionalData.emplace("DESCRIPTION", errMsg);
+        createPEL(additionalData, PelSeverity::WARNING, errIntfForGpioError);
     }
 
     return;
@@ -778,9 +758,14 @@
                 {
                     i2cBusAddr =
                         json["frus"][file].at(0)["presence"]["gpioI2CAddress"];
+                    errMsg += " i2cBusAddress: " + i2cBusAddr;
                 }
 
-                logGpioPel(errMsg, i2cBusAddr);
+                PelAdditionalData additionalData{};
+                additionalData.emplace("DESCRIPTION", errMsg);
+                createPEL(additionalData, PelSeverity::WARNING,
+                          errIntfForGpioError);
+
                 // Take failure postAction
                 executePostFailAction(json, file);
                 return false;
@@ -854,9 +839,13 @@
                 {
                     i2cBusAddr =
                         json["frus"][file].at(0)["preAction"]["gpioI2CAddress"];
+                    errMsg += " i2cBusAddress: " + i2cBusAddr;
                 }
 
-                logGpioPel(errMsg, i2cBusAddr);
+                PelAdditionalData additionalData{};
+                additionalData.emplace("DESCRIPTION", errMsg);
+                createPEL(additionalData, PelSeverity::WARNING,
+                          errIntfForGpioError);
 
                 // Take failure postAction
                 executePostFailAction(json, file);
diff --git a/types.hpp b/types.hpp
index 5ea0c07..a46e677 100644
--- a/types.hpp
+++ b/types.hpp
@@ -60,6 +60,7 @@
     std::map<Path, std::map<Service, std::vector<Interface>>>;
 using RestoredEeproms = std::tuple<Path, std::string, Keyword, Binary>;
 using ReplaceableFrus = std::vector<VPDfilepath>;
+using EssentialFrus = std::vector<Path>;
 } // namespace inventory
 
 } // namespace vpd
diff --git a/vpd-manager/manager.cpp b/vpd-manager/manager.cpp
index 2375d93..7fa09ee 100644
--- a/vpd-manager/manager.cpp
+++ b/vpd-manager/manager.cpp
@@ -39,6 +39,7 @@
     _bus(std::move(bus)), _manager(_bus, objPath)
 {
     _bus.request_name(busName);
+    sd_bus_default(&sdBus);
 }
 
 void Manager::run()
@@ -175,7 +176,34 @@
             [this](sdbusplus::message_t& msg) { hostStateCallBack(msg); });
 }
 
-void Manager::hostStateCallBack(sdbusplus::message_t& msg)
+void Manager::checkEssentialFrus()
+{
+    for (const auto& invPath : essentialFrus)
+    {
+        const auto res = readBusProperty(invPath, invItemIntf, "Present");
+
+        // implies the essential FRU is missing. Log PEL.
+        if (res == "false")
+        {
+            auto rc = sd_bus_call_method_async(
+                sdBus, NULL, loggerService, loggerObjectPath,
+                loggerCreateInterface, "Create", NULL, NULL, "ssa{ss}",
+                errIntfForEssentialFru,
+                "xyz.openbmc_project.Logging.Entry.Level.Warning", 2,
+                "DESCRIPTION", "Essential fru missing from the system.",
+                "CALLOUT_INVENTORY_PATH", (pimPath + invPath).c_str());
+
+            if (rc < 0)
+            {
+                log<level::ERR>("Error calling sd_bus_call_method_async",
+                                entry("RC=%d", rc),
+                                entry("MSG=%s", strerror(-rc)));
+            }
+        }
+    }
+}
+
+void Manager::hostStateCallBack(sdbusplus::message::message& msg)
 {
     if (msg.is_method_error())
     {
@@ -194,6 +222,9 @@
             if (*hostState == "xyz.openbmc_project.State.Host.HostState."
                               "TransitioningToRunning")
             {
+                // detect if essential frus are present in the system.
+                checkEssentialFrus();
+
                 // check and perfrom recollection for FRUs replaceable at
                 // standby.
                 performVPDRecollection();
@@ -302,6 +333,11 @@
             {
                 replaceableFrus.emplace_back(itemFRUS.key());
             }
+
+            if (itemEEPROM.value("essentialFru", false))
+            {
+                essentialFrus.emplace_back(itemEEPROM["inventoryPath"]);
+            }
         }
     }
 }
diff --git a/vpd-manager/manager.hpp b/vpd-manager/manager.hpp
index 6d8314b..4992801 100644
--- a/vpd-manager/manager.hpp
+++ b/vpd-manager/manager.hpp
@@ -49,7 +49,10 @@
     Manager(const Manager&) = delete;
     Manager& operator=(const Manager&) = delete;
     Manager(Manager&&) = delete;
-    ~Manager() = default;
+    ~Manager()
+    {
+        sd_bus_unref(sdBus);
+    }
 
     /** @brief Constructor to put object onto bus at a dbus path.
      *  @param[in] bus - Bus connection.
@@ -159,6 +162,13 @@
      */
     void restoreSystemVpd();
 
+    /**
+     * @brief Check for essential fru in the system.
+     * The api check for the presence of FRUs marked as essential and logs PEL
+     * in case they are missing.
+     */
+    void checkEssentialFrus();
+
     /** @brief Persistent sdbusplus DBus bus connection. */
     sdbusplus::bus_t _bus;
 
@@ -177,6 +187,12 @@
 
     // map to hold FRUs which can be replaced at standby
     inventory::ReplaceableFrus replaceableFrus;
+
+    // List of FRUs marked as essential in the system.
+    inventory::EssentialFrus essentialFrus;
+
+    // sd-bus
+    sd_bus* sdBus = nullptr;
 };
 
 } // namespace manager
