diff --git a/receiver/src/receiver_data_server/net_server.h b/receiver/src/receiver_data_server/net_server.h
index ffdaaaf003a058127e41e03e69523d539f7761d8..c07d06b4948a2aeb6df4897962861dcf84d77256 100644
--- a/receiver/src/receiver_data_server/net_server.h
+++ b/receiver/src/receiver_data_server/net_server.h
@@ -4,13 +4,16 @@
 #include "common/error.h"
 
 #include "request/request.h"
+#include "../data_cache.h"
 
 namespace asapo {
 
 class NetServer {
   public:
     virtual GenericRequests GetNewRequests(Error* err) const noexcept = 0;
-    virtual Error SendData(uint64_t source_id, void* buf, uint64_t size) const noexcept = 0;
+    virtual Error SendResponse(uint64_t source_id, GenericNetworkResponse* response) const noexcept = 0;
+    virtual Error SendResponseAndSlotData(uint64_t source_id, GenericNetworkResponse* response,
+                                          GenericRequestHeader* request, CacheMeta* cache_slot) const noexcept = 0;
     virtual void HandleAfterError(uint64_t source_id) const noexcept = 0;
     virtual ~NetServer() = default;
 };
diff --git a/receiver/src/receiver_data_server/receiver_data_server_request_handler.cpp b/receiver/src/receiver_data_server/receiver_data_server_request_handler.cpp
index 03d8ae764549afee64c6e3e5f4a555bcf2f67ac6..97bbb69e6ffcf3295efe6a89b32a8496ecd5fd2f 100644
--- a/receiver/src/receiver_data_server/receiver_data_server_request_handler.cpp
+++ b/receiver/src/receiver_data_server/receiver_data_server_request_handler.cpp
@@ -15,34 +15,30 @@ bool ReceiverDataServerRequestHandler::CheckRequest(const ReceiverDataServerRequ
     return  request->header.op_code == kOpcodeGetBufferData;
 }
 
-Error ReceiverDataServerRequestHandler::SendData(const ReceiverDataServerRequest* request,
-                                                 void* data,
-                                                 CacheMeta* meta) {
-    auto err = SendResponce(request, kNetErrorNoError);
-    if (err) {
-        data_cache_->UnlockSlot(meta);
-        return err;
-    }
-    err = server_->SendData(request->source_id, data, request->header.data_size);
-    log__->Debug("sending data from memory cache, id:" + std::to_string(request->header.data_id));
-    data_cache_->UnlockSlot(meta);
-    return err;
+Error ReceiverDataServerRequestHandler::SendResponse(const ReceiverDataServerRequest* request, NetworkErrorCode code) {
+    GenericNetworkResponse response{};
+    response.op_code = kOpcodeGetBufferData;
+    response.error_code = code;
+    return server_->SendResponse(request->source_id, &response);
+}
+
+Error ReceiverDataServerRequestHandler::SendResponseAndSlotData(const ReceiverDataServerRequest* request,
+                                                                CacheMeta* meta) {
+    GenericNetworkResponse response{};
+    response.op_code = kOpcodeGetBufferData;
+    response.error_code = kNetErrorNoError;
+    return server_->SendResponseAndSlotData(request->source_id, &response, (GenericRequestHeader*) &request->header, meta);
 }
 
-void* ReceiverDataServerRequestHandler::GetSlot(const ReceiverDataServerRequest* request, CacheMeta** meta) {
-    void* buf = nullptr;
+CacheMeta* ReceiverDataServerRequestHandler::GetSlotAndLock(const ReceiverDataServerRequest* request) {
+    CacheMeta* meta = nullptr;
     if (data_cache_) {
-        buf = data_cache_->GetSlotToReadAndLock(request->header.data_id, request->header.data_size,
-                                                meta);
-        if (!buf) {
+        data_cache_->GetSlotToReadAndLock(request->header.data_id, request->header.data_size, &meta);
+        if (!meta) {
             log__->Debug("data not found in memory cache, id:" + std::to_string(request->header.data_id));
         }
-
     }
-    if (buf == nullptr) {
-        SendResponce(request, kNetErrorNoData);
-    }
-    return buf;
+    return meta;
 }
 
 
@@ -50,19 +46,26 @@ bool ReceiverDataServerRequestHandler::ProcessRequestUnlocked(GenericRequest* re
     *retry = false;
     auto receiver_request = dynamic_cast<ReceiverDataServerRequest*>(request);
     if (!CheckRequest(receiver_request)) {
-        SendResponce(receiver_request, kNetErrorWrongRequest);
+        SendResponse(receiver_request, kNetErrorWrongRequest);
         server_->HandleAfterError(receiver_request->source_id);
         log__->Error("wrong request, code:" + std::to_string(receiver_request->header.op_code));
         return true;
     }
 
-    CacheMeta* meta;
-    auto buf = GetSlot(receiver_request, &meta);
-    if (buf == nullptr) {
+    CacheMeta* meta = GetSlotAndLock(receiver_request);
+    if (!meta) {
+        SendResponse(receiver_request, kNetErrorNoData);
+        return true;
+    }
+
+    auto err = SendResponseAndSlotData(receiver_request, meta);
+    data_cache_->UnlockSlot(meta);
+    if (err) {
+        log__->Error("failed to send slot:" + err->Explain());
+        server_->HandleAfterError(receiver_request->source_id);
         return true;
     }
 
-    SendData(receiver_request, buf, meta);
     statistics__->IncreaseRequestCounter();
     statistics__->IncreaseRequestDataVolume(receiver_request->header.data_size);
     return true;
@@ -76,19 +79,12 @@ void ReceiverDataServerRequestHandler::PrepareProcessingRequestLocked() {
 // do nothing
 }
 
-void ReceiverDataServerRequestHandler::TearDownProcessingRequestLocked(bool processing_succeeded) {
+void ReceiverDataServerRequestHandler::TearDownProcessingRequestLocked(bool /*processing_succeeded*/) {
 // do nothing
 }
 
-Error ReceiverDataServerRequestHandler::SendResponce(const ReceiverDataServerRequest* request, NetworkErrorCode code) {
-    GenericNetworkResponse responce;
-    responce.op_code = kOpcodeGetBufferData;
-    responce.error_code = code;
-    return server_->SendData(request->source_id, &responce, sizeof(GenericNetworkResponse));
-}
-
-void ReceiverDataServerRequestHandler::ProcessRequestTimeout(GenericRequest* request) {
+void ReceiverDataServerRequestHandler::ProcessRequestTimeout(GenericRequest* /*request*/) {
 // do nothing
 }
 
-}
\ No newline at end of file
+}
diff --git a/receiver/src/receiver_data_server/receiver_data_server_request_handler.h b/receiver/src/receiver_data_server/receiver_data_server_request_handler.h
index 4bae2ee45e590dc1d3e699d72e90675c04cc2b9a..34b0cd0b074d7a05b2e44740022a76df26ebc9af 100644
--- a/receiver/src/receiver_data_server/receiver_data_server_request_handler.h
+++ b/receiver/src/receiver_data_server/receiver_data_server_request_handler.h
@@ -25,9 +25,9 @@ class ReceiverDataServerRequestHandler: public RequestHandler {
     const NetServer* server_;
     DataCache* data_cache_;
     bool CheckRequest(const ReceiverDataServerRequest* request);
-    Error SendResponce(const ReceiverDataServerRequest* request, NetworkErrorCode code);
-    Error SendData(const ReceiverDataServerRequest* request, void* data, CacheMeta* meta);
-    void* GetSlot(const ReceiverDataServerRequest* request, CacheMeta** meta);
+    Error SendResponse(const ReceiverDataServerRequest* request, NetworkErrorCode code);
+    Error SendResponseAndSlotData(const ReceiverDataServerRequest* request, CacheMeta* meta);
+    CacheMeta* GetSlotAndLock(const ReceiverDataServerRequest* request);
 };
 
 }
diff --git a/receiver/src/receiver_data_server/tcp_server.cpp b/receiver/src/receiver_data_server/tcp_server.cpp
index 4a924745f9cab11081790b2b52b2fcb6b6e88776..fa1d61afa01645adfe2b248c9946b9e623584f22 100644
--- a/receiver/src/receiver_data_server/tcp_server.cpp
+++ b/receiver/src/receiver_data_server/tcp_server.cpp
@@ -51,7 +51,7 @@ ReceiverDataServerRequestPtr TcpServer::ReadRequest(SocketDescriptor socket, Err
                     );
         return nullptr;
     }
-    return ReceiverDataServerRequestPtr{new ReceiverDataServerRequest{std::move(header), (uint64_t) socket}};
+    return ReceiverDataServerRequestPtr{new ReceiverDataServerRequest{header, (uint64_t) socket}};
 }
 
 GenericRequests TcpServer::ReadRequests(const ListSocketDescriptors& sockets) const noexcept {
@@ -90,18 +90,33 @@ TcpServer::~TcpServer() {
     io__->CloseSocket(master_socket_, nullptr);
 }
 
+void TcpServer::HandleAfterError(uint64_t source_id) const noexcept {
+    CloseSocket(source_id);
+}
 
-Error TcpServer::SendData(uint64_t source_id, void* buf, uint64_t size) const noexcept {
+Error TcpServer::SendResponse(uint64_t source_id, GenericNetworkResponse* response) const noexcept {
     Error err;
-    io__->Send(source_id, buf, size, &err);
+    io__->Send(source_id, response, sizeof(*response), &err);
     if (err) {
         log__->Error("cannot send to consumer" + err->Explain());
     }
     return err;
 }
 
-void TcpServer::HandleAfterError(uint64_t source_id) const noexcept {
-    CloseSocket(source_id);
+Error TcpServer::SendResponseAndSlotData(uint64_t source_id, GenericNetworkResponse* response,
+                                         GenericRequestHeader* /*request*/, CacheMeta* cache_slot) const noexcept {
+    Error err;
+
+    err = SendResponse(source_id, response);
+    if (err) {
+        return err;
+    }
+
+    io__->Send(source_id, cache_slot->addr, cache_slot->size, &err);
+    if (err) {
+        log__->Error("cannot send slot to worker" + err->Explain());
+    }
+    return err;
 }
 
-}
\ No newline at end of file
+}
diff --git a/receiver/src/receiver_data_server/tcp_server.h b/receiver/src/receiver_data_server/tcp_server.h
index af4f9c6579a85e28ff8aae946f2c0c37a503147f..306aba82cbc6c1596cba8a56b45fd431ae1a9546 100644
--- a/receiver/src/receiver_data_server/tcp_server.h
+++ b/receiver/src/receiver_data_server/tcp_server.h
@@ -1,5 +1,5 @@
-#ifndef ASAPO_TCP_SERVER_H
-#define ASAPO_TCP_SERVER_H
+#ifndef ASAPO_RDS_TCP_SERVER_H
+#define ASAPO_RDS_TCP_SERVER_H
 
 #include "net_server.h"
 #include "io/io.h"
@@ -11,10 +11,12 @@ const int kMaxPendingConnections = 5;
 
 class TcpServer : public NetServer {
   public:
-    TcpServer(std::string address);
-    ~TcpServer();
+    explicit TcpServer(std::string address);
+    ~TcpServer() override;
     GenericRequests GetNewRequests(Error* err) const noexcept override ;
-    Error SendData(uint64_t source_id, void* buf, uint64_t size) const noexcept override;
+    Error SendResponse(uint64_t source_id, GenericNetworkResponse* response) const noexcept override;
+    Error SendResponseAndSlotData(uint64_t source_id, GenericNetworkResponse* response,
+                                          GenericRequestHeader* request, CacheMeta* cache_slot) const noexcept override;
     void HandleAfterError(uint64_t source_id) const noexcept override;
     std::unique_ptr<IO> io__;
     const AbstractLogger* log__;
@@ -31,4 +33,4 @@ class TcpServer : public NetServer {
 
 }
 
-#endif //ASAPO_TCP_SERVER_H
+#endif //ASAPO_RDS_TCP_SERVER_H
diff --git a/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h b/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h
index 6eacdb6c706bd8c47e13b757b2704930fee179ed..7e058a536bba55cbe823b268bc6cb28d3b248a68 100644
--- a/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h
+++ b/receiver/unittests/receiver_data_server/receiver_dataserver_mocking.h
@@ -27,12 +27,17 @@ class MockNetServer : public NetServer {
     MOCK_CONST_METHOD1(GetNewRequests_t, std::vector<ReceiverDataServerRequest> (ErrorInterface**
                        error));
 
-    Error SendData(uint64_t source_id, void* buf, uint64_t size) const noexcept override {
-        return  Error{SendData_t(source_id, buf, size)};
-
+    Error SendResponse(uint64_t source_id, GenericNetworkResponse* response) const noexcept override  {
+        return  Error{SendResponse_t(source_id, response)};
     };
+    MOCK_CONST_METHOD2(SendResponse_t, ErrorInterface * (uint64_t source_id, GenericNetworkResponse* response));
 
-    MOCK_CONST_METHOD3(SendData_t, ErrorInterface * (uint64_t source_id, void* buf, uint64_t size));
+    Error SendResponseAndSlotData(uint64_t source_id, GenericNetworkResponse* response, GenericRequestHeader* request,
+                                  CacheMeta* cache_slot) const noexcept override {
+        return  Error{SendResponseAndSlotData_t(source_id, response, request, cache_slot)};
+    };
+    MOCK_CONST_METHOD4(SendResponseAndSlotData_t, ErrorInterface * (uint64_t source_id, GenericNetworkResponse* response,
+            GenericRequestHeader* request, CacheMeta* cache_slot));
 
     void  HandleAfterError(uint64_t source_id) const noexcept override {
         HandleAfterError_t(source_id);
@@ -47,7 +52,7 @@ class MockPool : public RequestPool {
     Error AddRequests(GenericRequests requests) noexcept override {
         std::vector<GenericRequest> reqs;
         for (const auto& preq : requests) {
-            reqs.push_back(GenericRequest{preq->header, 0});
+            reqs.emplace_back(preq->header, 0);
         }
         return Error(AddRequests_t(std::move(reqs)));
 
diff --git a/receiver/unittests/receiver_data_server/test_request_handler.cpp b/receiver/unittests/receiver_data_server/test_request_handler.cpp
index fa5b8d8dd1dd9e38d42eb20eb39d982e68b75564..9ac87d78d8bd03c3dce3d6aa8b181729715ac81e 100644
--- a/receiver/unittests/receiver_data_server/test_request_handler.cpp
+++ b/receiver/unittests/receiver_data_server/test_request_handler.cpp
@@ -31,10 +31,10 @@ using asapo::ReceiverDataServerRequestHandler;
 
 namespace {
 
-MATCHER_P3(M_CheckResponce, op_code, error_code, message,
-           "Checks if a valid GenericNetworkResponse was used") {
+MATCHER_P3(M_CheckResponse, op_code, error_code, message,
+    "Checks if a valid GenericNetworkResponse was used") {
     return ((asapo::GenericNetworkResponse*)arg)->op_code == op_code
-           && ((asapo::GenericNetworkResponse*)arg)->error_code == uint64_t(error_code);
+            && ((asapo::GenericNetworkResponse*)arg)->error_code == uint64_t(error_code);
 }
 
 TEST(RequestHandlerTest, Constructor) {
@@ -57,6 +57,7 @@ class RequestHandlerTests : public Test {
     uint64_t expected_meta_size = 100;
     uint64_t expected_buf_id = 12345;
     uint64_t expected_source_id = 11;
+    asapo::CacheMeta expected_meta;
     bool retry;
     asapo::GenericRequestHeader header{asapo::kOpcodeGetBufferData, expected_buf_id, expected_data_size,
               expected_meta_size, ""};
@@ -67,22 +68,42 @@ class RequestHandlerTests : public Test {
     }
     void TearDown() override {
     }
-    void MockGetSlot(bool ok = true);
-    void MockSendResponce(asapo::NetworkErrorCode err_code, bool ok = true);
+    void MockGetSlotAndUnlockIt(bool return_without_error = true);
+    void MockSendResponse(asapo::NetworkErrorCode expected_response_code, bool return_without_error);
+    void MockSendResponseAndSlotData(asapo::NetworkErrorCode expected_response_code, bool return_without_error);
+
 
 };
 
-void RequestHandlerTests::MockGetSlot(bool ok) {
-    EXPECT_CALL(mock_cache, GetSlotToReadAndLock(expected_buf_id, expected_data_size, _)).WillOnce(
-        Return(ok ? &tmp : nullptr)
+void RequestHandlerTests::MockGetSlotAndUnlockIt(bool return_without_error) {
+    EXPECT_CALL(mock_cache, GetSlotToReadAndLock(expected_buf_id, expected_data_size, _)).WillOnce(DoAll(
+        SetArgPointee<2>(return_without_error ? &expected_meta : nullptr),
+        Return(return_without_error ? &tmp : nullptr)
+    ));
+    if (return_without_error) {
+        EXPECT_CALL(mock_cache, UnlockSlot(_));
+    }
+}
+
+void RequestHandlerTests::MockSendResponse(asapo::NetworkErrorCode expected_response_code, bool return_without_error) {
+    EXPECT_CALL(mock_net, SendResponse_t(
+            expected_source_id,
+            M_CheckResponse(asapo::kOpcodeGetBufferData, expected_response_code, "")
+    )).WillOnce(
+            Return(return_without_error ? nullptr : asapo::IOErrorTemplates::kUnknownIOError.Generate().release())
     );
 }
 
-void RequestHandlerTests::MockSendResponce(asapo::NetworkErrorCode err_code, bool ok) {
-    EXPECT_CALL(mock_net, SendData_t(expected_source_id,
-                                     M_CheckResponce(asapo::kOpcodeGetBufferData, err_code, ""), sizeof(asapo::GenericNetworkResponse))).WillOnce(
-                                         Return(ok ? nullptr : asapo::IOErrorTemplates::kUnknownIOError.Generate().release())
-                                     );
+void RequestHandlerTests::MockSendResponseAndSlotData(asapo::NetworkErrorCode expected_response_code,
+                                                      bool return_without_error) {
+    EXPECT_CALL(mock_net, SendResponseAndSlotData_t(
+            expected_source_id,
+            M_CheckResponse(asapo::kOpcodeGetBufferData, expected_response_code, ""),
+            &request.header,
+            &expected_meta
+    )).WillOnce(
+            Return(return_without_error ? nullptr : asapo::IOErrorTemplates::kUnknownIOError.Generate().release())
+    );
 }
 
 TEST_F(RequestHandlerTests, RequestAlwaysReady) {
@@ -91,9 +112,9 @@ TEST_F(RequestHandlerTests, RequestAlwaysReady) {
     ASSERT_THAT(res, Eq(true));
 }
 
-TEST_F(RequestHandlerTests, ProcessRequest_WronOpCode) {
+TEST_F(RequestHandlerTests, ProcessRequest_WrongOpCode) {
     request.header.op_code = asapo::kOpcodeUnknownOp;
-    MockSendResponce(asapo::kNetErrorWrongRequest, false);
+    MockSendResponse(asapo::kNetErrorWrongRequest, false);
     EXPECT_CALL(mock_net, HandleAfterError_t(expected_source_id));
 
     EXPECT_CALL(mock_logger, Error(HasSubstr("wrong request")));
@@ -103,8 +124,8 @@ TEST_F(RequestHandlerTests, ProcessRequest_WronOpCode) {
     ASSERT_THAT(success, Eq(true));
 }
 
-TEST_F(RequestHandlerTests, ProcessRequestReturnsNoDataWhenCacheNotUsed) {
-    MockSendResponce(asapo::kNetErrorNoData, true);
+TEST_F(RequestHandlerTests, ProcessRequest_ReturnsNoDataWhenCacheNotUsed) {
+    MockSendResponse(asapo::kNetErrorNoData, true);
 
     auto success  = handler_no_cache.ProcessRequestUnlocked(&request, &retry);
     EXPECT_CALL(mock_logger, Debug(_)).Times(0);
@@ -112,9 +133,9 @@ TEST_F(RequestHandlerTests, ProcessRequestReturnsNoDataWhenCacheNotUsed) {
     ASSERT_THAT(success, Eq(true));
 }
 
-TEST_F(RequestHandlerTests, ProcessRequestReadSlotReturnsNull) {
-    MockGetSlot(false);
-    MockSendResponce(asapo::kNetErrorNoData, true);
+TEST_F(RequestHandlerTests, ProcessRequest_ReadSlotReturnsNull) {
+    MockGetSlotAndUnlockIt(false);
+    MockSendResponse(asapo::kNetErrorNoData, true);
     EXPECT_CALL(mock_logger, Debug(HasSubstr("not found")));
 
     auto success = handler.ProcessRequestUnlocked(&request, &retry);
@@ -122,28 +143,19 @@ TEST_F(RequestHandlerTests, ProcessRequestReadSlotReturnsNull) {
     ASSERT_THAT(success, Eq(true));
 }
 
-
-TEST_F(RequestHandlerTests, ProcessRequestReadSlotErrorSendingResponce) {
-    MockGetSlot(true);
-    MockSendResponce(asapo::kNetErrorNoError, false);
-    EXPECT_CALL(mock_net, SendData_t(expected_source_id, &tmp, expected_data_size)).Times(0);
-    EXPECT_CALL(mock_cache, UnlockSlot(_));
+TEST_F(RequestHandlerTests, ProcessRequest_ReadSlotErrorSendingResponse) {
+    MockGetSlotAndUnlockIt(true);
+    MockSendResponseAndSlotData(asapo::kNetErrorNoError, false);
+    EXPECT_CALL(mock_net, HandleAfterError_t(_));
 
     auto success  = handler.ProcessRequestUnlocked(&request, &retry);
 
     ASSERT_THAT(success, Eq(true));
 }
 
-
-
-TEST_F(RequestHandlerTests, ProcessRequestOk) {
-    MockGetSlot(true);
-    MockSendResponce(asapo::kNetErrorNoError, true);
-    EXPECT_CALL(mock_net, SendData_t(expected_source_id, &tmp, expected_data_size)).WillOnce(
-        Return(nullptr)
-    );
-    EXPECT_CALL(mock_cache, UnlockSlot(_));
-    EXPECT_CALL(mock_logger, Debug(HasSubstr("sending")));
+TEST_F(RequestHandlerTests, ProcessRequest_Ok) {
+    MockGetSlotAndUnlockIt(true);
+    MockSendResponseAndSlotData(asapo::kNetErrorNoError, true);
     EXPECT_CALL(mock_stat, IncreaseRequestCounter_t());
     EXPECT_CALL(mock_stat, IncreaseRequestDataVolume_t(expected_data_size));
     auto success  = handler.ProcessRequestUnlocked(&request, &retry);
diff --git a/receiver/unittests/receiver_data_server/test_tcp_server.cpp b/receiver/unittests/receiver_data_server/test_tcp_server.cpp
index 9b8985ef3f03f68a85344fa01c398864e5f29b86..d5eef7895130c8cf3476afd9d550159bc9678634 100644
--- a/receiver/unittests/receiver_data_server/test_tcp_server.cpp
+++ b/receiver/unittests/receiver_data_server/test_tcp_server.cpp
@@ -234,23 +234,94 @@ TEST_F(TCPServerTests, GetNewRequestsReadOk) {
 
 }
 
-TEST_F(TCPServerTests, SendData) {
-    uint8_t tmp;
+TEST_F(TCPServerTests, SendResponse) {
+    asapo::GenericNetworkResponse tmp {};
 
-    EXPECT_CALL(mock_io, Send_t(1, &tmp, 10, _))
-    .WillOnce(
-        DoAll(
-            testing::SetArgPointee<3>(asapo::IOErrorTemplates::kUnknownIOError.Generate().release()),
-            Return(1)
-        ));
+    EXPECT_CALL(mock_io, Send_t(1, &tmp, sizeof(asapo::GenericNetworkResponse), _))
+            .WillOnce(
+                    DoAll(
+                            testing::SetArgPointee<3>(asapo::IOErrorTemplates::kUnknownIOError.Generate().release()),
+                            Return(1)
+                    ));
 
     EXPECT_CALL(mock_logger, Error(HasSubstr("cannot send")));
 
-    auto err = tcp_server.SendData(1, &tmp, 10);
+    auto err = tcp_server.SendResponse(1, &tmp);
 
     ASSERT_THAT(err, Ne(nullptr));
 }
 
+TEST_F(TCPServerTests, SendResponseAndSlotData_SendResponseError) {
+    asapo::GenericNetworkResponse tmp {};
+
+
+    asapo::GenericRequestHeader expectedRequest {};
+    asapo::CacheMeta expectedMeta {};
+    expectedMeta.id = 20;
+    expectedMeta.addr = (void*)0x9234;
+    expectedMeta.size = 50;
+    expectedMeta.lock = 123;
+
+    EXPECT_CALL(mock_io, Send_t(1, &tmp, sizeof(asapo::GenericNetworkResponse), _))
+            .WillOnce(DoAll(
+                    testing::SetArgPointee<3>(asapo::IOErrorTemplates::kUnknownIOError.Generate().release()),
+                    Return(0)
+            ));
+    EXPECT_CALL(mock_logger, Error(HasSubstr("cannot send")));
+
+    auto err = tcp_server.SendResponseAndSlotData(1, &tmp, &expectedRequest, &expectedMeta);
+
+    ASSERT_THAT(err, Ne(nullptr));
+}
+
+TEST_F(TCPServerTests, SendResponseAndSlotData_SendDataError) {
+    asapo::GenericNetworkResponse tmp {};
+
+
+    asapo::GenericRequestHeader expectedRequest {};
+    asapo::CacheMeta expectedMeta {};
+    expectedMeta.id = 20;
+    expectedMeta.addr = (void*)0x9234;
+    expectedMeta.size = 50;
+    expectedMeta.lock = 123;
+
+    EXPECT_CALL(mock_io, Send_t(1, &tmp, sizeof(asapo::GenericNetworkResponse), _))
+            .WillOnce(Return(1));
+    EXPECT_CALL(mock_io, Send_t(1, expectedMeta.addr, expectedMeta.size, _))
+            .WillOnce(
+                    DoAll(
+                            testing::SetArgPointee<3>(asapo::IOErrorTemplates::kUnknownIOError.Generate().release()),
+                            Return(0)
+                    ));
+
+    EXPECT_CALL(mock_logger, Error(HasSubstr("cannot send")));
+
+    auto err = tcp_server.SendResponseAndSlotData(1, &tmp, &expectedRequest, &expectedMeta);
+
+    ASSERT_THAT(err, Ne(nullptr));
+}
+
+TEST_F(TCPServerTests, SendResponseAndSlotData_Ok) {
+    asapo::GenericNetworkResponse tmp {};
+
+
+    asapo::GenericRequestHeader expectedRequest {};
+    asapo::CacheMeta expectedMeta {};
+    expectedMeta.id = 20;
+    expectedMeta.addr = (void*)0x9234;
+    expectedMeta.size = 50;
+    expectedMeta.lock = 123;
+
+    EXPECT_CALL(mock_io, Send_t(1, &tmp, sizeof(asapo::GenericNetworkResponse), _))
+            .WillOnce(Return(1));
+    EXPECT_CALL(mock_io, Send_t(1, expectedMeta.addr, expectedMeta.size, _))
+            .WillOnce(Return(expectedMeta.size));
+
+    auto err = tcp_server.SendResponseAndSlotData(1, &tmp, &expectedRequest, &expectedMeta);
+
+    ASSERT_THAT(err, Eq(nullptr));
+}
+
 TEST_F(TCPServerTests, HandleAfterError) {
     EXPECT_CALL(mock_io, CloseSocket_t(expected_client_sockets[0], _));
     tcp_server.HandleAfterError(expected_client_sockets[0]);