diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
index 2e6bd4c..9c312c7 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
@@ -2,12 +2,12 @@
 
 #include "libpldm/entity.h"
 
+#include "libpldmresponder/pdr_utils.hpp"
+
 namespace pldm
 {
-
 namespace responder
 {
-
 namespace oem_ibm_platform
 {
 
@@ -23,7 +23,7 @@
     for (size_t i = 0; i < compSensorCnt; i++)
     {
         uint8_t sensorOpState{};
-        if (entityType == PLDM_ENTITY_VIRTUAL_MACHINE_MANAGER &&
+        if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
             stateSetId == PLDM_OEM_IBM_BOOT_STATE)
         {
             sensorOpState = fetchBootSide(entityInstance, codeUpdate);
@@ -51,7 +51,7 @@
     {
         if (stateField[currState].set_request == PLDM_REQUEST_SET)
         {
-            if (entityType == PLDM_ENTITY_VIRTUAL_MACHINE_MANAGER &&
+            if (entityType == PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE &&
                 stateSetId == PLDM_OEM_IBM_BOOT_STATE)
             {
                 rc = setBootSide(entityInstance, currState, stateField,
@@ -70,6 +70,119 @@
     return rc;
 }
 
+void buildAllCodeUpdateEffecterPDR(platform::Handler* platformHandler,
+                                   uint16_t entityInstance, uint16_t stateSetID,
+                                   pdr_utils::Repo& repo)
+{
+    size_t pdrSize = 0;
+    pdrSize = sizeof(pldm_state_effecter_pdr) +
+              sizeof(state_effecter_possible_states);
+    std::vector<uint8_t> entry{};
+    entry.resize(pdrSize);
+    pldm_state_effecter_pdr* pdr =
+        reinterpret_cast<pldm_state_effecter_pdr*>(entry.data());
+    if (!pdr)
+    {
+        std::cerr << "Failed to get record by PDR type, ERROR:"
+                  << PLDM_PLATFORM_INVALID_EFFECTER_ID << std::endl;
+    }
+    pdr->hdr.record_handle = 0;
+    pdr->hdr.version = 1;
+    pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
+    pdr->hdr.record_change_num = 0;
+    pdr->hdr.length = sizeof(pldm_state_effecter_pdr) - sizeof(pldm_pdr_hdr);
+    pdr->terminus_handle = pdr::BmcPldmTerminusHandle;
+    pdr->effecter_id = platformHandler->getNextEffecterId();
+    pdr->entity_type = PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE;
+    pdr->entity_instance = entityInstance;
+    pdr->container_id = 0;
+    pdr->effecter_semantic_id = 0;
+    pdr->effecter_init = PLDM_NO_INIT;
+    pdr->has_description_pdr = false;
+    pdr->composite_effecter_count = 1;
+
+    auto* possibleStatesPtr = pdr->possible_states;
+    auto possibleStates =
+        reinterpret_cast<state_effecter_possible_states*>(possibleStatesPtr);
+    possibleStates->state_set_id = stateSetID;
+    possibleStates->possible_states_size = 2;
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(possibleStates);
+    if (stateSetID == PLDM_OEM_IBM_BOOT_STATE)
+        state->states[0].byte = 6;
+    else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
+        state->states[0].byte = 126;
+    pldm::responder::pdr_utils::PdrEntry pdrEntry{};
+    pdrEntry.data = entry.data();
+    pdrEntry.size = pdrSize;
+    repo.addRecord(pdrEntry);
+}
+
+void buildAllCodeUpdateSensorPDR(platform::Handler* platformHandler,
+                                 uint16_t entityInstance, uint16_t stateSetID,
+                                 pdr_utils::Repo& repo)
+{
+    size_t pdrSize = 0;
+    pdrSize =
+        sizeof(pldm_state_sensor_pdr) + sizeof(state_sensor_possible_states);
+    std::vector<uint8_t> entry{};
+    entry.resize(pdrSize);
+    pldm_state_sensor_pdr* pdr =
+        reinterpret_cast<pldm_state_sensor_pdr*>(entry.data());
+    if (!pdr)
+    {
+        std::cerr << "Failed to get record by PDR type, ERROR:"
+                  << PLDM_PLATFORM_INVALID_SENSOR_ID << std::endl;
+    }
+    pdr->hdr.record_handle = 0;
+    pdr->hdr.version = 1;
+    pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
+    pdr->hdr.record_change_num = 0;
+    pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
+    pdr->terminus_handle = pdr::BmcPldmTerminusHandle;
+    pdr->sensor_id = platformHandler->getNextSensorId();
+    pdr->entity_type = PLDM_ENTITY_VIRTUAL_MACHINE_MANAGER;
+    pdr->entity_instance = entityInstance;
+    pdr->container_id = 0;
+    pdr->sensor_init = PLDM_NO_INIT;
+    pdr->sensor_auxiliary_names_pdr = false;
+    pdr->composite_sensor_count = 1;
+
+    auto* possibleStatesPtr = pdr->possible_states;
+    auto possibleStates =
+        reinterpret_cast<state_sensor_possible_states*>(possibleStatesPtr);
+    possibleStates->state_set_id = stateSetID;
+    possibleStates->possible_states_size = 2;
+    auto state =
+        reinterpret_cast<state_sensor_possible_states*>(possibleStates);
+    if (stateSetID == PLDM_OEM_IBM_BOOT_STATE)
+        state->states[0].byte = 6;
+    else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
+        state->states[0].byte = 126;
+    pldm::responder::pdr_utils::PdrEntry pdrEntry{};
+    pdrEntry.data = entry.data();
+    pdrEntry.size = pdrSize;
+    repo.addRecord(pdrEntry);
+}
+
+void pldm::responder::oem_ibm_platform::Handler::buildOEMPDR(
+    pdr_utils::Repo& repo)
+{
+    buildAllCodeUpdateEffecterPDR(platformHandler, ENTITY_INSTANCE_0,
+                                  PLDM_OEM_IBM_BOOT_STATE, repo);
+    buildAllCodeUpdateEffecterPDR(platformHandler, ENTITY_INSTANCE_1,
+                                  PLDM_OEM_IBM_BOOT_STATE, repo);
+    buildAllCodeUpdateEffecterPDR(platformHandler, ENTITY_INSTANCE_0,
+                                  PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
+
+    buildAllCodeUpdateSensorPDR(platformHandler, ENTITY_INSTANCE_0,
+                                PLDM_OEM_IBM_BOOT_STATE, repo);
+    buildAllCodeUpdateSensorPDR(platformHandler, ENTITY_INSTANCE_1,
+                                PLDM_OEM_IBM_BOOT_STATE, repo);
+    buildAllCodeUpdateSensorPDR(platformHandler, ENTITY_INSTANCE_0,
+                                PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
+}
+
 void pldm::responder::oem_ibm_platform::Handler::setPlatformHandler(
     pldm::responder::platform::Handler* handler)
 {
