diff --git a/src/ncsi_util.cpp b/src/ncsi_util.cpp
index 8c628aa..7a13590 100644
--- a/src/ncsi_util.cpp
+++ b/src/ncsi_util.cpp
@@ -6,8 +6,6 @@
 #include <netlink/netlink.h>
 
 #include <phosphor-logging/lg2.hpp>
-#include <stdplus/numeric/str.hpp>
-#include <stdplus/str/buf.hpp>
 
 #include <vector>
 
@@ -20,26 +18,6 @@
 
 using CallBack = int (*)(struct nl_msg* msg, void* arg);
 
-static stdplus::StrBuf toHexStr(std::span<const uint8_t> c) noexcept
-{
-    stdplus::StrBuf ret;
-    if (c.empty())
-    {
-        return ret;
-    }
-    stdplus::IntToStr<16, uint8_t> its;
-    auto oit = ret.append(c.size() * 3);
-    auto cit = c.begin();
-    oit = its(oit, *cit++, 2);
-    for (; cit != c.end(); ++cit)
-    {
-        *oit++ = ' ';
-        oit = its(oit, *cit, 2);
-    }
-    *oit = 0;
-    return ret;
-}
-
 namespace internal
 {
 
@@ -223,7 +201,12 @@
     return static_cast<int>(NL_STOP);
 };
 
-CallBack sendCallBack = [](struct nl_msg* msg, void*) {
+struct sendCallBackContext
+{
+    std::vector<unsigned char> msg;
+};
+
+CallBack sendCallBack = [](struct nl_msg* msg, void* arg) {
     using namespace phosphor::network::ncsi;
     auto nlh = nlmsg_hdr(msg);
     struct nlattr* tb[NCSI_ATTR_MAX + 1] = {nullptr};
@@ -233,6 +216,14 @@
         {NLA_FLAG, 0, 0},   {NLA_U32, 0, 0}, {NLA_U32, 0, 0},
     };
 
+    if (arg == nullptr)
+    {
+        lg2::error("Internal error: invalid send callback context");
+        return -1;
+    }
+
+    struct sendCallBackContext* ctx = (struct sendCallBackContext*)arg;
+
     auto ret = genlmsg_parse(nlh, 0, tb, NCSI_ATTR_MAX, ncsiPolicy);
     if (ret)
     {
@@ -250,10 +241,7 @@
     unsigned char* data =
         (unsigned char*)nla_data(tb[NCSI_ATTR_DATA]) + sizeof(NCSIPacketHeader);
 
-    // Dump the response to stdout. Enhancement: option to save response data
-    auto str = toHexStr(std::span<const unsigned char>(data, data_len));
-    lg2::debug("Response {DATA_LEN} bytes: {DATA}", "DATA_LEN", data_len,
-               "DATA", str);
+    ctx->msg.assign(data, data + data_len);
 
     return static_cast<int>(NL_STOP);
 };
@@ -411,23 +399,29 @@
     return std::to_string(interface.ifindex);
 }
 
-int Interface::sendOemCommand(int package, int channel, int operation,
+std::optional<std::vector<unsigned char>>
+    Interface::sendOemCommand(int package, int channel, int operation,
                               std::span<const unsigned char> payload)
 {
     lg2::debug("Send OEM Command, CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, "
                "INTERFACE: {INTERFACE}",
                "CHANNEL", lg2::hex, channel, "PACKAGE", lg2::hex, package,
                "INTERFACE", this);
-    if (!payload.empty())
-    {
-        lg2::debug("Payload: {PAYLOAD}", "PAYLOAD", toHexStr(payload));
-    }
 
-    return internal::applyCmd(
+    internal::sendCallBackContext ctx{};
+
+    int rc = internal::applyCmd(
         *this,
         internal::Command(ncsi_nl_commands::NCSI_CMD_SEND_CMD, operation,
                           payload),
-        package, channel, NONE, internal::sendCallBack);
+        package, channel, NONE, internal::sendCallBack, &ctx);
+
+    if (rc < 0)
+    {
+        return {};
+    }
+
+    return ctx.msg;
 }
 
 int Interface::setChannel(int package, int channel)
