diff --git a/libpldmresponder/base.cpp b/libpldmresponder/base.cpp
index e1d86ec..076d894 100644
--- a/libpldmresponder/base.cpp
+++ b/libpldmresponder/base.cpp
@@ -174,65 +174,11 @@
     return response;
 }
 
-void Handler::processSetEventReceiver(
-    sdeventplus::source::EventBase& /*source */)
+void Handler::_processSetEventReceiver(sdeventplus::source::EventBase&
+                                       /*source */)
 {
     survEvent.reset();
-    std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
-                                    PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
-    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
-    auto instanceId = instanceIdDb.next(eid);
-    uint8_t eventMessageGlobalEnable =
-        PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
-    uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
-    uint8_t eventReceiverAddressInfo = pldm::responder::pdr::BmcMctpEid;
-    uint16_t heartbeatTimer = HEARTBEAT_TIMEOUT;
-
-    auto rc = encode_set_event_receiver_req(
-        instanceId, eventMessageGlobalEnable, transportProtocolType,
-        eventReceiverAddressInfo, heartbeatTimer, request);
-    if (rc != PLDM_SUCCESS)
-    {
-        instanceIdDb.free(eid, instanceId);
-        error("Failed to encode_set_event_receiver_req, rc = {RC}", "RC",
-              lg2::hex, rc);
-        return;
-    }
-
-    auto processSetEventReceiverResponse =
-        [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
-        if (response == nullptr || !respMsgLen)
-        {
-            error("Failed to receive response for setEventReceiver command");
-            return;
-        }
-
-        uint8_t completionCode{};
-        auto rc = decode_set_event_receiver_resp(response, respMsgLen,
-                                                 &completionCode);
-        if (rc || completionCode)
-        {
-            error(
-                "Failed to decode setEventReceiver command response, rc = {RC}, cc = {CC}",
-                "RC", rc, "CC", (unsigned)completionCode);
-            pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.InternalFailure");
-        }
-    };
-    rc = handler->registerRequest(
-        eid, instanceId, PLDM_PLATFORM, PLDM_SET_EVENT_RECEIVER,
-        std::move(requestMsg), std::move(processSetEventReceiverResponse));
-
-    if (rc != PLDM_SUCCESS)
-    {
-        error("Failed to send the setEventReceiver request");
-    }
-
-    if (oemPlatformHandler)
-    {
-        oemPlatformHandler->countSetEventReceiver();
-        oemPlatformHandler->checkAndDisableWatchDog();
-    }
+    oemPlatformHandler->processSetEventReceiver();
 }
 
 Response Handler::getTID(const pldm_msg* request, size_t /*payloadLength*/)
@@ -246,8 +192,11 @@
         return ccOnlyResponse(request, rc);
     }
 
-    survEvent = std::make_unique<sdeventplus::source::Defer>(
-        event, std::bind_front(&Handler::processSetEventReceiver, this));
+    if (oemPlatformHandler)
+    {
+        survEvent = std::make_unique<sdeventplus::source::Defer>(
+            event, std::bind_front(&Handler::_processSetEventReceiver, this));
+    }
 
     return response;
 }
