diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
index d595c2e..7fa7570 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
@@ -146,7 +146,7 @@
     return rc;
 }
 
-void buildAllCodeUpdateEffecterPDR(platform::Handler* platformHandler,
+void buildAllCodeUpdateEffecterPDR(oem_ibm_platform::Handler* platformHandler,
                                    uint16_t entityType, uint16_t entityInstance,
                                    uint16_t stateSetID, pdr_utils::Repo& repo)
 {
@@ -197,7 +197,7 @@
     repo.addRecord(pdrEntry);
 }
 
-void buildAllCodeUpdateSensorPDR(platform::Handler* platformHandler,
+void buildAllCodeUpdateSensorPDR(oem_ibm_platform::Handler* platformHandler,
                                  uint16_t entityType, uint16_t entityInstance,
                                  uint16_t stateSetID, pdr_utils::Repo& repo)
 {
@@ -249,31 +249,31 @@
 void pldm::responder::oem_ibm_platform::Handler::buildOEMPDR(
     pdr_utils::Repo& repo)
 {
-    buildAllCodeUpdateEffecterPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
-        PLDM_OEM_IBM_BOOT_STATE, repo);
-    buildAllCodeUpdateEffecterPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_1,
-        PLDM_OEM_IBM_BOOT_STATE, repo);
-    buildAllCodeUpdateEffecterPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
-        PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
-    buildAllCodeUpdateEffecterPDR(platformHandler, PLDM_ENTITY_SYSTEM_CHASSIS,
+    buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                  ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
+                                  repo);
+    buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                  ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
+                                  repo);
+    buildAllCodeUpdateEffecterPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                  ENTITY_INSTANCE_0,
+                                  PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
+    buildAllCodeUpdateEffecterPDR(this, PLDM_ENTITY_SYSTEM_CHASSIS,
                                   ENTITY_INSTANCE_0,
                                   PLDM_OEM_IBM_SYSTEM_POWER_STATE, repo);
 
-    buildAllCodeUpdateSensorPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
-        PLDM_OEM_IBM_BOOT_STATE, repo);
-    buildAllCodeUpdateSensorPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_1,
-        PLDM_OEM_IBM_BOOT_STATE, repo);
-    buildAllCodeUpdateSensorPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
-        PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
-    buildAllCodeUpdateSensorPDR(
-        platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
-        PLDM_OEM_IBM_VERIFICATION_STATE, repo);
+    buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                ENTITY_INSTANCE_0, PLDM_OEM_IBM_BOOT_STATE,
+                                repo);
+    buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                ENTITY_INSTANCE_1, PLDM_OEM_IBM_BOOT_STATE,
+                                repo);
+    buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                ENTITY_INSTANCE_0,
+                                PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
+    buildAllCodeUpdateSensorPDR(this, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+                                ENTITY_INSTANCE_0,
+                                PLDM_OEM_IBM_VERIFICATION_STATE, repo);
     auto sensorId = findStateSensorId(
         repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
         ENTITY_INSTANCE_0, 0, PLDM_OEM_IBM_VERIFICATION_STATE);
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
index b574262..ee1081e 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
@@ -80,7 +80,7 @@
      * @return platformHandler->getNextEffecterId() - returns the
      *             effecter ID from the platform handler
      */
-    uint16_t getNextEffecterId()
+    virtual uint16_t getNextEffecterId()
     {
         return platformHandler->getNextEffecterId();
     }
@@ -90,7 +90,7 @@
      * @return platformHandler->getNextSensorId() - returns the
      *             Sensor ID from the platform handler
      */
-    uint16_t getNextSensorId()
+    virtual uint16_t getNextSensorId()
     {
         return platformHandler->getNextSensorId();
     }
diff --git a/oem/ibm/test/libpldmresponder_fileio_test.cpp b/oem/ibm/test/libpldmresponder_fileio_test.cpp
index a0b5a5e..e7a5945 100644
--- a/oem/ibm/test/libpldmresponder_fileio_test.cpp
+++ b/oem/ibm/test/libpldmresponder_fileio_test.cpp
@@ -209,6 +209,8 @@
     uint32_t offset = 0;
     uint32_t length = 10;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -223,7 +225,8 @@
 
     // Pass invalid payload length
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileIntoMemory(request, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -236,6 +239,8 @@
     uint32_t offset = 0;
     uint32_t length = 0;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -254,7 +259,8 @@
     auto& table = buildFileTable(fileTableConfig.c_str());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
@@ -269,6 +275,8 @@
     uint32_t offset = 1024;
     uint32_t length = 0;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -286,7 +294,8 @@
     auto& table = buildFileTable(fileTableConfig.c_str());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
@@ -301,6 +310,8 @@
     // Length should be a multiple of dma min size(16)
     uint32_t length = 10;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -318,7 +329,8 @@
     auto& table = buildFileTable(fileTableConfig.c_str());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -336,6 +348,8 @@
     // DMA min size(16)
     uint32_t length = 1024;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -353,7 +367,8 @@
     auto& table = buildFileTable(fileTableConfig.c_str());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -367,6 +382,8 @@
     uint32_t offset = 0;
     uint32_t length = 10;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -382,7 +399,8 @@
 
     // Pass invalid payload length
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.writeFileFromMemory(request, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -400,6 +418,8 @@
     uint32_t offset = 0;
     uint32_t length = 16;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -418,7 +438,8 @@
     auto& table = buildFileTable(fileTableConfig.c_str());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.writeFileFromMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
@@ -433,6 +454,8 @@
     uint32_t offset = 1024;
     uint32_t length = 16;
     uint64_t address = 0;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
         requestMsg{};
@@ -451,7 +474,8 @@
     auto& table = buildFileTable(TestFileTable::fileTableConfig.c_str());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.writeFileFromMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
@@ -509,6 +533,8 @@
     uint8_t type = PLDM_FILE_ATTRIBUTE_TABLE;
     uint32_t nextTransferHandle = 0;
     uint8_t transferFlag = PLDM_START_AND_END;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
         requestMsg{};
@@ -521,7 +547,8 @@
     request->table_type = type;
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
@@ -539,13 +566,16 @@
 
 TEST_F(TestFileTable, GetFileTableCommandReqLengthMismatch)
 {
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
         requestMsg{};
     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
 
     // Pass invalid command payload length
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.getFileTable(request, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -556,6 +586,8 @@
     uint32_t transferHandle = 0;
     uint8_t opFlag = 0;
     uint8_t type = PLDM_OEM_FILE_ATTRIBUTE_TABLE;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
         requestMsg{};
@@ -568,7 +600,8 @@
     request->table_type = type;
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_TABLE_TYPE);
@@ -579,6 +612,8 @@
     uint32_t fileHandle = 1;
     uint32_t offset = 0;
     uint32_t length = 0x4;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
         requestMsg{};
@@ -597,7 +632,8 @@
 
     // Invalid payload length
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFile(requestMsgPtr, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -624,6 +660,8 @@
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
     uint32_t length = 0x4;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
         requestMsg{};
@@ -648,7 +686,8 @@
     stream.read(buffer.data(), length);
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto responseMsg = handler.readFile(requestMsgPtr, payload_length);
     auto response = reinterpret_cast<pldm_read_file_resp*>(
         responseMsg.data() + sizeof(pldm_msg_hdr));
@@ -681,6 +720,8 @@
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
     uint32_t length = 0x10;
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
                                     PLDM_WRITE_FILE_REQ_BYTES + length);
@@ -699,7 +740,8 @@
 
     // Invalid payload length
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.writeFile(requestMsgPtr, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
@@ -727,6 +769,8 @@
     uint32_t offset = 0;
     std::array<uint8_t, 4> fileData = {0x41, 0x42, 0x43, 0x44};
     uint32_t length = fileData.size();
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
 
     std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
                                     PLDM_WRITE_FILE_REQ_BYTES + length);
@@ -747,7 +791,8 @@
     memcpy(request->file_data, fileData.data(), fileData.size());
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto responseMsg = handler.writeFile(requestMsgPtr, payload_length);
     auto response = reinterpret_cast<pldm_read_file_resp*>(
         responseMsg.data() + sizeof(pldm_msg_hdr));
@@ -766,6 +811,9 @@
 
 TEST(writeFileByTypeFromMemory, testBadPath)
 {
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
+
     const auto hdr_size = sizeof(pldm_msg_hdr);
     std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
         requestMsg{};
@@ -781,7 +829,8 @@
     request->address = 0;
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.writeFileByTypeFromMemory(req, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
 
@@ -844,6 +893,8 @@
 
 TEST(readFileByTypeIntoMemory, testBadPath)
 {
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
     const auto hdr_size = sizeof(pldm_msg_hdr);
     std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
         requestMsg{};
@@ -858,7 +909,8 @@
     request->address = 0;
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileByTypeIntoMemory(req, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     struct pldm_read_write_file_by_type_memory_resp* resp =
@@ -884,6 +936,8 @@
 
 TEST(readFileByType, testBadPath)
 {
+    uint8_t host_eid = 0;
+    int hostSocketFd = 0;
     const auto hdr_size = sizeof(pldm_msg_hdr);
     std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_REQ_BYTES> requestMsg{};
     auto payloadLength = requestMsg.size() - hdr_size;
@@ -897,7 +951,8 @@
     request->length = 13;
 
     std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-    oem_ibm::Handler handler(oemPlatformHandler.get());
+    oem_ibm::Handler handler(oemPlatformHandler.get(), hostSocketFd, host_eid,
+                             nullptr);
     auto response = handler.readFileByType(req, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     struct pldm_read_write_file_by_type_resp* resp =
@@ -924,7 +979,7 @@
     char tmplt[] = "/tmp/lid.XXXXXX";
     auto fd = mkstemp(tmplt);
     std::vector<uint8_t> in = {100, 10, 56, 78, 34, 56, 79, 235, 111};
-    write(fd, in.data(), in.size());
+    rc = write(fd, in.data(), in.size());
     close(fd);
     length = in.size() + 1000;
     rc = handler.readFile(tmplt, 0, length, response);
diff --git a/oem/ibm/test/libpldmresponder_oem_platform_test.cpp b/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
index 09132cf..62ca129 100644
--- a/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
+++ b/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
@@ -189,26 +189,13 @@
     auto event = sdeventplus::Event::get_default();
     std::unique_ptr<CodeUpdate> mockCodeUpdate =
         std::make_unique<MockCodeUpdate>(mockDbusHandler.get());
-    std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-
-    oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
-        mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, requester,
-        event);
     std::unique_ptr<oem_ibm_platform::Handler> mockoemPlatformHandler =
         std::make_unique<MockOemPlatformHandler>(mockDbusHandler.get(),
                                                  mockCodeUpdate.get(), 0x1, 0x9,
                                                  requester, event);
-    pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
-        dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
-            oemPlatformHandler.get());
-    pldm::responder::platform::Handler* mckPltHandler =
-        reinterpret_cast<pldm::responder::platform::Handler*>(
-            mockoemPlatformHandler.get());
-    oemIbmPlatformHandler->setPlatformHandler(mckPltHandler);
-
     Repo inRepo(inPDRRepo);
 
-    oemPlatformHandler->buildOEMPDR(inRepo);
+    mockoemPlatformHandler->buildOEMPDR(inRepo);
     ASSERT_EQ(inRepo.empty(), false);
 
     pdr_utils::PdrEntry e;
@@ -308,37 +295,24 @@
     auto event = sdeventplus::Event::get_default();
     std::unique_ptr<CodeUpdate> mockCodeUpdate =
         std::make_unique<MockCodeUpdate>(mockDbusHandler.get());
-    std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
-
-    oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
-        mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, requester,
-        event);
     std::unique_ptr<oem_ibm_platform::Handler> mockoemPlatformHandler =
         std::make_unique<MockOemPlatformHandler>(mockDbusHandler.get(),
                                                  mockCodeUpdate.get(), 0x1, 0x9,
                                                  requester, event);
-    pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
-        dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
-            oemPlatformHandler.get());
-    pldm::responder::platform::Handler* mckPltHandler =
-        reinterpret_cast<pldm::responder::platform::Handler*>(
-            mockoemPlatformHandler.get());
-    oemIbmPlatformHandler->setPlatformHandler(mckPltHandler);
     Repo inRepo(inPDRRepo);
-
-    oemPlatformHandler->buildOEMPDR(inRepo);
+    mockoemPlatformHandler->buildOEMPDR(inRepo);
     ASSERT_EQ(inRepo.empty(), false);
 
     pdr_utils::PdrEntry e;
 
     // Test for sensor number 1, for current boot side state
-    auto record1 = pdr::getRecordByHandle(inRepo, 4, e);
+    auto record1 = pdr::getRecordByHandle(inRepo, 5, e);
     ASSERT_NE(record1, nullptr);
 
     pldm_state_sensor_pdr* pdr =
         reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
 
-    ASSERT_EQ(pdr->hdr.record_handle, 4);
+    ASSERT_EQ(pdr->hdr.record_handle, 5);
     ASSERT_EQ(pdr->hdr.version, 1);
     ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
     ASSERT_EQ(pdr->hdr.record_change_num, 0);
@@ -359,12 +333,12 @@
     ASSERT_EQ(states->states[0].byte, bf1.byte);
 
     // Test for sensor number 2, for next boot side state
-    auto record2 = pdr::getRecordByHandle(inRepo, 5, e);
+    auto record2 = pdr::getRecordByHandle(inRepo, 6, e);
     ASSERT_NE(record2, nullptr);
 
     pdr = reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
 
-    ASSERT_EQ(pdr->hdr.record_handle, 5);
+    ASSERT_EQ(pdr->hdr.record_handle, 6);
     ASSERT_EQ(pdr->hdr.version, 1);
     ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
     ASSERT_EQ(pdr->hdr.record_change_num, 0);
@@ -385,12 +359,12 @@
     ASSERT_EQ(states->states[0].byte, bf2.byte);
 
     // Test for sensor number 3, for firmware update state control
-    auto record3 = pdr::getRecordByHandle(inRepo, 6, e);
+    auto record3 = pdr::getRecordByHandle(inRepo, 7, e);
     ASSERT_NE(record3, nullptr);
 
     pdr = reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
 
-    ASSERT_EQ(pdr->hdr.record_handle, 6);
+    ASSERT_EQ(pdr->hdr.record_handle, 7);
     ASSERT_EQ(pdr->hdr.version, 1);
     ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
     ASSERT_EQ(pdr->hdr.record_change_num, 0);
