diff --git a/src/nvidia-gpu/MctpRequester.cpp b/src/nvidia-gpu/MctpRequester.cpp
index 024f8cc..765859e 100644
--- a/src/nvidia-gpu/MctpRequester.cpp
+++ b/src/nvidia-gpu/MctpRequester.cpp
@@ -15,6 +15,7 @@
 #include <boost/asio/generic/datagram_protocol.hpp>
 #include <boost/asio/io_context.hpp>
 #include <boost/asio/steady_timer.hpp>
+#include <boost/container/devector.hpp>
 #include <phosphor-logging/lg2.hpp>
 
 #include <cerrno>
@@ -22,6 +23,7 @@
 #include <cstdint>
 #include <cstring>
 #include <functional>
+#include <memory>
 #include <span>
 #include <utility>
 
@@ -30,16 +32,38 @@
 namespace mctp
 {
 
-MctpRequester::MctpRequester(boost::asio::io_context& ctx) :
+Requester::Requester(boost::asio::io_context& ctx) :
     mctpSocket(ctx, boost::asio::generic::datagram_protocol{AF_MCTP, 0}),
     expiryTimer(ctx)
 {}
 
-void MctpRequester::processRecvMsg(
-    uint8_t eid, const std::span<const uint8_t> reqMsg,
-    const std::span<uint8_t> respMsg, const boost::system::error_code& ec,
-    const size_t /*length*/)
+void Requester::processRecvMsg(
+    const std::span<const uint8_t> reqMsg, const std::span<uint8_t> respMsg,
+    const boost::system::error_code& ec, const size_t /*length*/)
 {
+    const auto* respAddr =
+        // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
+        reinterpret_cast<const struct sockaddr_mctp*>(recvEndPoint.data());
+
+    uint8_t eid = respAddr->smctp_addr.s_addr;
+
+    if (!completionCallbacks.contains(eid))
+    {
+        lg2::error(
+            "MctpRequester failed to get the callback for the EID: {EID}",
+            "EID", static_cast<int>(eid));
+        return;
+    }
+
+    auto& callback = completionCallbacks.at(eid);
+
+    if (respAddr->smctp_type != msgType)
+    {
+        lg2::error("MctpRequester: Message type mismatch");
+        callback(EPROTO);
+        return;
+    }
+
     expiryTimer.cancel();
 
     if (ec)
@@ -47,29 +71,7 @@
         lg2::error(
             "MctpRequester failed to receive data from the MCTP socket - ErrorCode={EC}, Error={ER}.",
             "EC", ec.value(), "ER", ec.message());
-        completionCallback(EIO);
-        return;
-    }
-
-    const auto* respAddr =
-        // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
-        reinterpret_cast<const struct sockaddr_mctp*>(recvEndPoint.data());
-
-    if (respAddr->smctp_type != msgType)
-    {
-        lg2::error("MctpRequester: Message type mismatch");
-        completionCallback(EPROTO);
-        return;
-    }
-
-    uint8_t respEid = respAddr->smctp_addr.s_addr;
-
-    if (respEid != eid)
-    {
-        lg2::error(
-            "MctpRequester: EID mismatch - expected={EID}, received={REID}",
-            "EID", eid, "REID", respEid);
-        completionCallback(EPROTO);
+        callback(EIO);
         return;
     }
 
@@ -96,46 +98,56 @@
                 "MctpRequester: Instance ID mismatch - request={REQ}, response={RESP}",
                 "REQ", static_cast<int>(reqInstanceId), "RESP",
                 static_cast<int>(respInstanceId));
-            completionCallback(EPROTO);
+            callback(EPROTO);
             return;
         }
     }
 
-    completionCallback(0);
+    callback(0);
 }
 
-void MctpRequester::handleSendMsgCompletion(
+void Requester::handleSendMsgCompletion(
     uint8_t eid, const std::span<const uint8_t> reqMsg,
     std::span<uint8_t> respMsg, const boost::system::error_code& ec,
     size_t /* length */)
 {
+    if (!completionCallbacks.contains(eid))
+    {
+        lg2::error(
+            "MctpRequester failed to get the callback for the EID: {EID}",
+            "EID", static_cast<int>(eid));
+        return;
+    }
+
+    auto& callback = completionCallbacks.at(eid);
+
     if (ec)
     {
         lg2::error(
             "MctpRequester failed to send data from the MCTP socket - ErrorCode={EC}, Error={ER}.",
             "EC", ec.value(), "ER", ec.message());
-        completionCallback(EIO);
+        callback(EIO);
         return;
     }
 
     expiryTimer.expires_after(2s);
 
-    expiryTimer.async_wait([this](const boost::system::error_code& ec) {
+    expiryTimer.async_wait([this, eid](const boost::system::error_code& ec) {
         if (ec != boost::asio::error::operation_aborted)
         {
-            completionCallback(ETIME);
+            auto& callback = completionCallbacks.at(eid);
+            callback(ETIME);
         }
     });
 
     mctpSocket.async_receive_from(
         boost::asio::mutable_buffer(respMsg), recvEndPoint,
-        std::bind_front(&MctpRequester::processRecvMsg, this, eid, reqMsg,
-                        respMsg));
+        std::bind_front(&Requester::processRecvMsg, this, reqMsg, respMsg));
 }
 
-void MctpRequester::sendRecvMsg(
-    uint8_t eid, const std::span<const uint8_t> reqMsg,
-    std::span<uint8_t> respMsg, std::move_only_function<void(int)> callback)
+void Requester::sendRecvMsg(uint8_t eid, const std::span<const uint8_t> reqMsg,
+                            std::span<uint8_t> respMsg,
+                            std::move_only_function<void(int)> callback)
 {
     if (reqMsg.size() < sizeof(ocp::accelerator_management::BindingPciVid))
     {
@@ -144,7 +156,7 @@
         return;
     }
 
-    completionCallback = std::move(callback);
+    completionCallbacks[eid] = std::move(callback);
 
     struct sockaddr_mctp addr{};
     addr.smctp_family = AF_MCTP;
@@ -156,7 +168,53 @@
 
     mctpSocket.async_send_to(
         boost::asio::const_buffer(reqMsg), sendEndPoint,
-        std::bind_front(&MctpRequester::handleSendMsgCompletion, this, eid,
-                        reqMsg, respMsg));
+        std::bind_front(&Requester::handleSendMsgCompletion, this, eid, reqMsg,
+                        respMsg));
 }
+
+void QueuingRequester::sendRecvMsg(uint8_t eid, std::span<const uint8_t> reqMsg,
+                                   std::span<uint8_t> respMsg,
+                                   std::move_only_function<void(int)> callback)
+{
+    auto reqCtx =
+        std::make_unique<RequestContext>(reqMsg, respMsg, std::move(callback));
+
+    // Add request to queue
+    auto& queue = requestContextQueues[eid];
+    queue.push_back(std::move(reqCtx));
+
+    if (queue.size() == 1)
+    {
+        processQueue(eid);
+    }
+}
+
+void QueuingRequester::handleResult(uint8_t eid, int result)
+{
+    auto& queue = requestContextQueues[eid];
+    const auto& reqCtx = queue.front();
+
+    reqCtx->callback(result); // Call the original callback
+
+    queue.pop_front();
+
+    processQueue(eid);
+}
+
+void QueuingRequester::processQueue(uint8_t eid)
+{
+    auto& queue = requestContextQueues[eid];
+
+    if (queue.empty())
+    {
+        return;
+    }
+
+    const auto& reqCtx = queue.front();
+
+    requester.sendRecvMsg(
+        eid, reqCtx->reqMsg, reqCtx->respMsg,
+        std::bind_front(&QueuingRequester::handleResult, this, eid));
+}
+
 } // namespace mctp
