diff --git a/CMakeLists.txt b/CMakeLists.txt
index 16097f62b5258e20e82f34f257f9635b33081d92..14bcb0d0ffb08c56dfcc2b28cd60498c045696a4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -85,7 +85,7 @@ endif()
 if (CELLFRAME_MODULES MATCHES "network")
     message("[+] Module 'network'")
     set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_io dap_json_rpc dap_enc_server dap_notify_srv dap_http_server dap_session
-        dap_stream dap_stream_ch dap_client dap_cli_server dap_stream_ch_chain_net dap_chain_net dap_chain_net_srv dap_stream_ch_chain_voting dap_chain_mempool )
+        dap_stream dap_stream_ch dap_client dap_cli_server dap_stream_ch_chain_net dap_chain_net dap_chain_net_srv dap_chain_mempool)
 endif()
 
 # Chain net services
diff --git a/dap-sdk b/dap-sdk
index 277fc0459376d770da32c4a6d885824fbebd7b69..40ff133c163d177dbfb2bbc1bf3ddfd0740ab1a4 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 277fc0459376d770da32c4a6d885824fbebd7b69
+Subproject commit 40ff133c163d177dbfb2bbc1bf3ddfd0740ab1a4
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 188c40318a74c72a529f19877ee7b0ecc95003ab..1aca3bdd4b20b06554a6cc296a9731a0bcbd42e9 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -23,7 +23,6 @@ if (CELLFRAME_MODULES MATCHES "network")
     add_subdirectory(json_rpc)
     # Stream channels
     add_subdirectory(channel/chain-net)
-    add_subdirectory(channel/chain-voting)
 endif()
 
 # Mining
diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
index 762a57f1caf58836a566a090667950eda0375457..b1d9e9998fb10c93662452edf0cd803da679d740 100644
--- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
+++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
@@ -1190,7 +1190,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         }
         l_request->err_code = 0;
 
-        dap_strncpy(l_request->host_send, a_ch->stream->esocket->remote_addr_str, 0xFF);
+        dap_strncpy(l_request->host_send, a_ch->stream->esocket->remote_addr_str, DAP_HOSTADDR_STRLEN);
         l_request->recv_time2 = dap_nanotime_now();
 
         dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE, l_request,
diff --git a/modules/channel/chain-voting/CMakeLists.txt b/modules/channel/chain-voting/CMakeLists.txt
deleted file mode 100644
index f9efc7aa2bda54f5d0f283bf8f0e71ee8034ef8c..0000000000000000000000000000000000000000
--- a/modules/channel/chain-voting/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-cmake_minimum_required(VERSION 3.10)
-project (dap_stream_ch_chain_voting)
-  
-file(GLOB DAP_STREAM_CH_CHAIN_VOTING_SRCS *.c)
-file(GLOB DAP_STREAM_CH_CHAIN_VOTING_HDRS include/*.h)
-
-add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_VOTING_SRCS} ${DAP_STREAM_CH_CHAIN_VOTING_HDRS})
-
-target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch dap_chain_net)
-
-
-target_include_directories(${PROJECT_NAME} INTERFACE .)
-target_include_directories(${PROJECT_NAME} PUBLIC include)
-target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../../dap-sdk/3rdparty/uthash/src)
-
-if (INSTALL_SDK)
-set_target_properties(${PROJECT_NAME}  PROPERTIES PUBLIC_HEADER "${DAP_STREAM_CH_CHAIN_VOTING_HDRS}")
-INSTALL(TARGETS ${PROJECT_NAME} 
-        LIBRARY DESTINATION lib/modules/channel/chain-voting/
-        ARCHIVE DESTINATION lib/modules/channel/chain-voting/
-        PUBLIC_HEADER DESTINATION include/modules/channel/chain-voting/
-)
-endif()
\ No newline at end of file
diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
deleted file mode 100644
index 4f3c204c3719c19078659613fc100f268d700bbc..0000000000000000000000000000000000000000
--- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
+++ /dev/null
@@ -1,236 +0,0 @@
-#include "dap_stream.h"
-#include "dap_stream_worker.h"
-#include "dap_stream_ch_pkt.h"
-#include "dap_stream_ch.h"
-#include "dap_stream_ch_proc.h"
-#include "dap_chain_ch.h"
-#include "dap_stream_ch_chain_voting.h"
-#include "dap_chain_net.h"
-#include "dap_client_pvt.h"
-#include "dap_chain_node_cli.h"
-#include "dap_chain_cs_blocks.h"
-
-#define LOG_TAG "dap_stream_ch_chain_voting"
-
-#define PKT_SIGN_N_HDR_OVERHEAD (15 * 1024)
-
-struct voting_pkt_in_callback {
-    void * arg;
-    dap_chain_voting_ch_callback_t packet_in_callback;
-};
-
-struct voting_node_client_list {
-    dap_chain_node_addr_t node_addr;    // HT key
-    dap_chain_node_info_t *node_info;
-    dap_chain_node_client_t *node_client;
-    UT_hash_handle hh;
-};
-
-static struct voting_node_client_list *s_node_client_list = NULL;
-
-static size_t s_pkt_in_callback_count = 0;
-static struct voting_pkt_in_callback s_pkt_in_callback[16] = {};
-static pthread_rwlock_t s_node_client_list_lock;
-
-static void s_stream_ch_new(dap_stream_ch_t *a_ch, void *a_arg);
-static void s_stream_ch_delete(dap_stream_ch_t *a_ch, void *a_arg);
-static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg);
-
-int dap_stream_ch_chain_voting_init()
-{
-    log_it(L_NOTICE, "Chains voting channel initialized");
-
-    pthread_rwlock_init(&s_node_client_list_lock, NULL);
-    dap_stream_ch_proc_add(DAP_STREAM_CH_VOTING_ID,
-                           s_stream_ch_new,
-                           s_stream_ch_delete,
-                           s_stream_ch_packet_in,
-                           NULL);
-
-    return 0;
-}
-
-void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, dap_chain_voting_ch_callback_t packet_in_callback)
-{
-    size_t i = s_pkt_in_callback_count;
-    s_pkt_in_callback[i].arg = a_arg;
-    s_pkt_in_callback[i].packet_in_callback = packet_in_callback;
-    s_pkt_in_callback_count++;
-}
-
-static bool s_callback_pkt_in_call_all(void *a_arg)
-{
-    dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = a_arg;
-    for (size_t i = 0; i < s_pkt_in_callback_count; i++) {
-        struct voting_pkt_in_callback *l_callback = s_pkt_in_callback + i;
-        if (l_callback->packet_in_callback) {
-            l_callback->packet_in_callback(l_callback->arg, &l_voting_pkt->hdr.sender_node_addr, &l_voting_pkt->hdr.receiver_node_addr,
-                                           &l_voting_pkt->hdr.data_hash, l_voting_pkt->data, l_voting_pkt->hdr.data_size);
-        }
-    }
-    DAP_DELETE(a_arg);
-    return false;
-}
-
-void dap_stream_ch_voting_queue_clear()
-{
-    for (struct voting_node_client_list *it = s_node_client_list; it; it = it->hh.next)
-        dap_chain_node_client_queue_clear(it->node_client);
-}
-
-void dap_stream_ch_chain_voting_message_write(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_remote_node_addr,
-                                              dap_stream_ch_chain_voting_pkt_t *a_voting_pkt)
-{
-    size_t l_voting_pkt_size =  sizeof(*a_voting_pkt) + a_voting_pkt->hdr.data_size;
-    struct voting_node_client_list *l_node_client_item = NULL;
-    if (a_remote_node_addr->uint64 != dap_chain_net_get_cur_addr_int(a_net)) {
-        pthread_rwlock_rdlock(&s_node_client_list_lock);
-        HASH_FIND(hh, s_node_client_list, a_remote_node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item);
-        pthread_rwlock_unlock(&s_node_client_list_lock);
-        if (!l_node_client_item) {
-            size_t node_info_size = 0;
-            dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t*)dap_global_db_get_sync(a_net->pub.gdb_nodes,
-                    dap_chain_node_addr_to_str_static(a_remote_node_addr),
-                    &node_info_size, NULL, NULL);
-            if (!l_node_info) {
-                log_it(L_WARNING, "Can't find validator's addr "NODE_ADDR_FP_STR" in database", NODE_ADDR_FP_ARGS(a_remote_node_addr));
-                return;
-            }
-            char l_channels[] = { DAP_STREAM_CH_VOTING_ID, '\0' };
-            dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect_channels(a_net, l_node_info, l_channels);
-            if (!l_node_client || !l_node_client->client) {
-                log_it(L_ERROR, "Can't connect to remote node "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_remote_node_addr));
-                return;
-            }
-            l_node_client->client->connect_on_demand = true;
-            l_node_client->client->always_reconnect = true;
-
-            l_node_client_item = DAP_NEW_Z(struct voting_node_client_list);
-            if (!l_node_client_item) {
-                log_it(L_CRITICAL, "Memory allocation error");
-                return;
-            }
-            l_node_client_item->node_addr = *a_remote_node_addr;
-            l_node_client_item->node_info = l_node_info;
-            l_node_client_item->node_client = l_node_client;
-            pthread_rwlock_wrlock(&s_node_client_list_lock);
-            HASH_ADD(hh, s_node_client_list, node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item);
-            pthread_rwlock_unlock(&s_node_client_list_lock);
-        }
-        if (!l_node_client_item->node_client) {
-            log_it(L_ERROR, "NULL node_client in item of voting channel");
-            return;
-        }
-        dap_chain_node_client_write_mt(l_node_client_item->node_client, DAP_STREAM_CH_VOTING_ID,
-                                       DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA, a_voting_pkt,
-                                       l_voting_pkt_size);
-    } else
-        dap_proc_thread_callback_add(NULL, s_callback_pkt_in_call_all,
-                                    DAP_DUP_SIZE(a_voting_pkt, l_voting_pkt_size));
-}
-
-void dap_stream_ch_chain_voting_deinit()
-{
-    struct voting_node_client_list *l_node_info_item, *l_node_info_tmp;
-    HASH_ITER(hh, s_node_client_list, l_node_info_item, l_node_info_tmp) {
-        // Clang bug at this, l_node_info_item should change at every loop cycle
-        HASH_DEL(s_node_client_list, l_node_info_item);
-        dap_chain_node_client_close_mt(l_node_info_item->node_client);
-        DAP_DELETE(l_node_info_item);
-    }
-}
-
-void dap_stream_ch_chain_voting_close_all_clients(dap_chain_net_id_t a_net_id)
-{
-    struct voting_node_client_list *l_node_info_item, *l_node_info_tmp;
-    pthread_rwlock_wrlock(&s_node_client_list_lock);
-    HASH_ITER(hh, s_node_client_list, l_node_info_item, l_node_info_tmp) {
-        // Clang bug at this, l_node_info_item should change at every loop cycle
-        if (l_node_info_item->node_client->net->pub.id.uint64 == a_net_id.uint64){
-            HASH_DEL(s_node_client_list, l_node_info_item);
-            dap_chain_node_client_close_mt(l_node_info_item->node_client);
-            DAP_DELETE(l_node_info_item);
-        }
-    }
-    pthread_rwlock_unlock(&s_node_client_list_lock);
-}
-
-static void s_stream_ch_new(dap_stream_ch_t *a_ch, void *a_arg)
-{
-    UNUSED(a_arg);
-    a_ch->internal = DAP_NEW_Z(dap_stream_ch_chain_voting_t);
-    dap_stream_ch_chain_voting_t *l_ch_chain_voting = DAP_STREAM_CH_CHAIN_VOTING(a_ch);
-    l_ch_chain_voting->_inheritor = a_ch;
-}
-
-static void s_stream_ch_delete(dap_stream_ch_t *a_ch, UNUSED_ARG void *a_arg)
-{
-    DAP_DEL_Z(a_ch->internal);
-}
-
-static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
-{
-    dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *) a_arg;
-    if (!l_ch_pkt)
-        return;
-
-    size_t l_voting_pkt_size = l_ch_pkt->hdr.data_size;
-    if (!l_voting_pkt_size || l_voting_pkt_size < sizeof(dap_stream_ch_chain_voting_pkt_t) ||
-            l_voting_pkt_size > DAP_CHAIN_CS_BLOCKS_MAX_BLOCK_SIZE + PKT_SIGN_N_HDR_OVERHEAD) {
-        log_it(L_ERROR, "Invalid packet size %zu, drop this packet", l_voting_pkt_size);
-        return;
-    }
-
-    dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = (dap_stream_ch_chain_voting_pkt_t *)l_ch_pkt->data;
-    dap_chain_net_t *l_net = dap_chain_net_by_id(l_voting_pkt->hdr.net_id);
-
-    if (!l_net)
-        return;
-    if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) {
-        log_it(L_ERROR, "Reject packet because net %s is offline", l_net->pub.name);
-        dap_stream_ch_chain_voting_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_ERROR, l_voting_pkt->hdr.net_id.uint64,
-                                                    &l_voting_pkt->hdr.sender_node_addr, &l_voting_pkt->hdr.receiver_node_addr, NULL, 0);
-        a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
-        return;
-    }
-
-    dap_proc_thread_callback_add(dap_proc_thread_get(a_ch->stream_worker->worker->id), s_callback_pkt_in_call_all,
-                                DAP_DUP_SIZE(l_voting_pkt, l_voting_pkt_size));
-    dap_stream_ch_chain_voting_t *l_ch_chain_voting = DAP_STREAM_CH_CHAIN_VOTING(a_ch);
-    if (l_ch_chain_voting->callback_notify)
-        l_ch_chain_voting->callback_notify(l_ch_chain_voting, l_ch_pkt->hdr.type, l_voting_pkt,
-                                           l_voting_pkt->hdr.data_size, l_ch_chain_voting->callback_notify_arg);
-}
-
-dap_stream_ch_chain_voting_pkt_t *dap_stream_ch_chain_voting_pkt_new(uint64_t a_net_id,
-                                                                     dap_chain_node_addr_t *a_sender_node_addr,
-                                                                     dap_chain_node_addr_t *a_receiver_node_addr,
-                                                                     const void *a_data, size_t a_data_size)
-{
-    dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_voting_pkt_t,
-                                                                   sizeof(dap_stream_ch_chain_voting_pkt_t) + a_data_size);
-    l_voting_pkt->hdr.data_size = a_data_size;
-    l_voting_pkt->hdr.version = 1;
-    l_voting_pkt->hdr.net_id.uint64 = a_net_id;
-    if (a_sender_node_addr)
-        l_voting_pkt->hdr.sender_node_addr = *a_sender_node_addr;
-    if (a_receiver_node_addr)
-        l_voting_pkt->hdr.receiver_node_addr = *a_receiver_node_addr;
-    dap_hash_fast(a_data, a_data_size, &l_voting_pkt->hdr.data_hash);
-    if (a_data_size && a_data)
-        memcpy(l_voting_pkt->data, a_data, a_data_size);
-    return l_voting_pkt;
-}
-
-size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id,
-                                                   dap_chain_node_addr_t *a_sender_node_addr,
-                                                   dap_chain_node_addr_t *a_receiver_node_addr,
-                                                   const void * a_data, size_t a_data_size)
-{
-    dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = dap_stream_ch_chain_voting_pkt_new(a_net_id, a_sender_node_addr,
-                                                                                        a_receiver_node_addr, a_data,
-                                                                                        a_data_size);
-    size_t l_ret  = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_voting_pkt, sizeof(l_voting_pkt) + a_data_size);
-    DAP_DELETE(l_voting_pkt);
-    return l_ret;
-}
diff --git a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
deleted file mode 100644
index 5f55d10dea0daee4f7209fb5d484fbf5ba52f438..0000000000000000000000000000000000000000
--- a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-
-#include <pthread.h>
-
-#include "dap_chain_common.h"
-#include "dap_chain.h"
-#include "dap_chain_node_client.h"
-#include "dap_list.h"
-#include "uthash.h"
-
-#define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA        0x01
-#define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_TEST        0x02
-#define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_ERROR       0xFF
-
-#define DAP_STREAM_CH_VOTING_ID 'V'
-
-typedef void (*dap_chain_voting_ch_callback_t)(void *a_arg, dap_chain_node_addr_t *a_sender_addr, dap_chain_node_addr_t *a_receiver_addr,
-                                               dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size);
-
-typedef struct dap_stream_ch_chain_voting_pkt_hdr {
-    uint8_t version;
-    uint8_t padding[7];
-    uint64_t data_size;
-    dap_chain_hash_fast_t data_hash;
-    dap_chain_net_id_t net_id;
-    dap_chain_node_addr_t sender_node_addr;
-    dap_chain_node_addr_t receiver_node_addr;
-}  DAP_ALIGN_PACKED dap_stream_ch_chain_voting_pkt_hdr_t;
-
-typedef struct dap_stream_ch_chain_voting_pkt {
-    dap_stream_ch_chain_voting_pkt_hdr_t hdr;
-    uint8_t data[];
-} DAP_ALIGN_PACKED dap_stream_ch_chain_voting_pkt_t;
-
-
-typedef struct dap_stream_ch_chain_voting dap_stream_ch_chain_voting_t;
-typedef void (*dap_stream_ch_chain_voting_callback_packet_t)(dap_stream_ch_chain_voting_t *a_ch_voting, uint8_t a_pkt_type,
-                                                             dap_stream_ch_chain_voting_pkt_t *a_pkt, size_t a_pkt_data_size,
-                                                             void * a_arg);
-
-typedef struct dap_stream_ch_chain_voting {
-    void *_inheritor;   // parent stream ch
-    dap_stream_ch_chain_voting_callback_packet_t callback_notify;
-    void *callback_notify_arg;
-} dap_stream_ch_chain_voting_t;
-
-#define DAP_STREAM_CH_CHAIN_VOTING(a) ((dap_stream_ch_chain_voting_t *) ((a)->internal) )
-
-inline static uint8_t dap_stream_ch_chain_voting_get_id(void) { return (uint8_t) 'V'; }
-
-void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, dap_chain_voting_ch_callback_t packet_in_callback);
-
-void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_chain_node_addr_t *a_remote_node_addr,
-                                              dap_stream_ch_chain_voting_pkt_t *a_voting_pkt);
-
-dap_stream_ch_chain_voting_pkt_t *dap_stream_ch_chain_voting_pkt_new(uint64_t a_net_id,
-                                                                     dap_chain_node_addr_t *a_sender_node_addr,
-                                                                     dap_chain_node_addr_t *a_receiver_node_addr,
-                                                                     const void *a_data, size_t a_data_size);
-
-size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id,
-                                                   dap_chain_node_addr_t *a_sender_node_addr,
-                                                   dap_chain_node_addr_t *a_receiver_node_addr,
-                                                   const void * a_data, size_t a_data_size);
-
-int dap_stream_ch_chain_voting_init();
-void dap_stream_ch_chain_voting_deinit();
-void dap_stream_ch_chain_voting_close_all_clients(dap_chain_net_id_t a_net_id);
-void dap_stream_ch_voting_queue_clear();
diff --git a/modules/consensus/esbocs/CMakeLists.txt b/modules/consensus/esbocs/CMakeLists.txt
index 9c1ccd621372ddc6438b9d009ea8559ea453275f..68598f99038dce11e73fa6aa6bb6639f1f3028a7 100644
--- a/modules/consensus/esbocs/CMakeLists.txt
+++ b/modules/consensus/esbocs/CMakeLists.txt
@@ -8,7 +8,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_ESBOCS_SRCS} ${DAP_CHAIN_CS_ESBOC
 
 target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
-target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_stream_ch_chain_voting dap_chain_net_srv_stake)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake)
 
 if (INSTALL_SDK)
 set_target_properties(${PROJECT_NAME}  PROPERTIES PUBLIC_HEADER "${DAP_CHAIN_CS_ESBOCS_HEADERS}")
@@ -17,4 +17,4 @@ INSTALL(TARGETS ${PROJECT_NAME}
         ARCHIVE DESTINATION lib/modules/consensus/esbocs/
         PUBLIC_HEADER DESTINATION include/modules/consensus/esbocs/ 
         )
-endif()
\ No newline at end of file
+endif()
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 58306e4d9b0cd7baa5ff8d3429a440fa74c57573..b1b5ac2f6f86ed783ca8404ba9ad97ae0b6060a3 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -25,6 +25,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "utlist.h"
 #include "dap_timerfd.h"
 #include "rand/dap_rand.h"
+#include "dap_stream_ch_proc.h"
 #include "dap_chain_net.h"
 #include "dap_chain_common.h"
 #include "dap_chain_mempool.h"
@@ -32,7 +33,6 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_blocks.h"
 #include "dap_chain_cs_esbocs.h"
-#include "dap_stream_ch_chain_voting.h"
 #include "dap_chain_net_srv_stake_pos_delegate.h"
 #include "dap_chain_ledger.h"
 #include "dap_chain_node_cli.h"
@@ -51,8 +51,8 @@ enum s_esbocs_session_state {
 
 static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_validators);
 static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s_esbocs_session_state a_new_state, dap_time_t a_time);
-static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_node_addr, dap_chain_node_addr_t *a_receiver_node_addr,
-                                dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size);
+static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg);
+static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain_node_addr_t *a_sender_node_addr, uint8_t *a_data, size_t a_data_size);
 static void s_session_round_clear(dap_chain_esbocs_session_t *a_session);
 static void s_session_round_new(dap_chain_esbocs_session_t *a_session);
 static bool s_session_candidate_to_chain(
@@ -164,9 +164,14 @@ DAP_STATIC_INLINE uint16_t s_get_round_skip_timeout(dap_chain_esbocs_session_t *
     return PVT(a_session->esbocs)->round_attempt_timeout * 6 * PVT(a_session->esbocs)->round_attempts_max;
 }
 
-int dap_chain_cs_esbocs_init() {
-    dap_stream_ch_chain_voting_init();
+int dap_chain_cs_esbocs_init()
+{
     dap_chain_cs_add("esbocs", s_callback_new);
+    dap_stream_ch_proc_add(DAP_STREAM_CH_ESBOCS_ID,
+                           NULL,
+                           NULL,
+                           s_stream_ch_packet_in,
+                           NULL);
     dap_cli_server_cmd_add ("esbocs", s_cli_esbocs, "ESBOCS commands",
         "esbocs min_validators_count set -net <net_name> -chain <chain_name> -cert <poa_cert_name> -val_count <value>"
             "\tSets minimum validators count for ESBOCS consensus\n"
@@ -527,7 +532,6 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf
     pthread_mutexattr_settype(&l_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
     pthread_mutex_init(&l_session->mutex, &l_mutex_attr);
     pthread_mutexattr_destroy(&l_mutex_attr);
-    dap_stream_ch_chain_voting_in_callback_add(l_session, s_session_packet_in);
     dap_chain_add_callback_notify(a_chain, s_new_atom_notifier, l_session);
     s_session_round_new(l_session);
 
@@ -580,7 +584,6 @@ void dap_chain_esbocs_stop_timer(dap_chain_net_id_t a_net_id)
             l_session->cs_timer = NULL;
         }
     }
-    dap_stream_ch_chain_voting_close_all_clients(a_net_id);
 }
 
 void dap_chain_esbocs_start_timer(dap_chain_net_id_t a_net_id)
@@ -910,10 +913,8 @@ static void s_session_round_clear(dap_chain_esbocs_session_t *a_session)
 
 static void s_session_round_new(dap_chain_esbocs_session_t *a_session)
 {
-    if (!a_session->round_fast_forward) {
+    if (!a_session->round_fast_forward)
         s_session_update_penalty(a_session);
-        dap_stream_ch_voting_queue_clear();
-    }
     s_session_round_clear(a_session);
     a_session->cur_round.id++;
     a_session->cur_round.sync_attempt++;
@@ -956,11 +957,9 @@ static void s_session_round_new(dap_chain_esbocs_session_t *a_session)
                             a_session->chain->net_name, a_session->chain->name, a_session->cur_round.id);
         l_round_already_started = true;
         for (dap_list_t *it = l_item->messages; it; it = it->next) {
-            dap_hash_fast_t l_msg_hash;
             dap_chain_esbocs_message_t *l_msg = it->data;
             size_t l_msg_size = s_get_esbocs_message_size(l_msg);
-            dap_hash_fast(l_msg, l_msg_size, &l_msg_hash);
-            s_session_packet_in(a_session, NULL, NULL, &l_msg_hash, (uint8_t *)l_msg, l_msg_size);
+            s_session_packet_in(a_session, NULL, (uint8_t *)l_msg, l_msg_size);
         }
     }
     HASH_ITER(hh, a_session->sync_items, l_item, l_tmp) {
@@ -1451,8 +1450,7 @@ static void s_session_candidate_verify(dap_chain_esbocs_session_t *a_session, da
                     l_item->message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_COMMIT_SIGN) &&
                 dap_hash_fast_compare(&l_item->message->hdr.candidate_hash, a_candidate_hash) &&
                 l_item->message->hdr.attempt_num == a_session->cur_round.attempt_num) {
-            s_session_packet_in(a_session, NULL, NULL, &l_item->message_hash,
-                                (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message));
+            s_session_packet_in(a_session, NULL, (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message));
         }
     }
     // Process candidate
@@ -1770,8 +1768,7 @@ static void s_session_directive_process(dap_chain_esbocs_session_t *a_session, d
                     l_item->message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_AGAINST) &&
                 dap_hash_fast_compare(&l_item->message->hdr.candidate_hash, a_directive_hash) &&
                 l_item->message->hdr.attempt_num == a_session->cur_round.attempt_num) {
-            s_session_packet_in(a_session, NULL, NULL, &l_item->message_hash,
-                                (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message));
+            s_session_packet_in(a_session, NULL, (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message));
         }
     }
     // Send own vote
@@ -1849,6 +1846,81 @@ static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive,
     return 0;
 }
 
+struct esbocs_msg_args {
+    dap_stream_node_addr_t addr_from;
+    dap_chain_esbocs_session_t *session;
+    size_t message_size;
+    byte_t message[];
+};
+
+static bool s_process_incoming_message(void *a_arg)
+{
+    struct esbocs_msg_args *l_args = a_arg;
+    s_session_packet_in(l_args->session, &l_args->addr_from, l_args->message, l_args->message_size);
+    DAP_DELETE(l_args);
+    return false;
+}
+
+static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
+{
+    dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *)a_arg;
+    if (!l_ch_pkt)
+        return;
+    dap_chain_esbocs_message_t *l_message = (dap_chain_esbocs_message_t *)l_ch_pkt->data;
+    size_t l_message_size = l_ch_pkt->hdr.data_size;
+    if (l_message_size < sizeof(dap_chain_esbocs_message_t) ||
+            l_message_size > DAP_CHAIN_CS_BLOCKS_MAX_BLOCK_SIZE + PKT_SIGN_N_HDR_OVERHEAD ||
+            l_message_size != sizeof(*l_message) + l_message->hdr.sign_size + l_message->hdr.message_size) {
+        log_it(L_WARNING, "Invalid message size %zu, drop this packet", l_message_size);
+        return;
+    }
+    dap_chain_net_t *l_net = dap_chain_net_by_id(l_message->hdr.net_id);
+    if (!l_net) {
+        log_it(L_WARNING, "Can't find net with ID 0x%" DAP_UINT64_FORMAT_x, l_message->hdr.net_id.uint64);
+        return;
+    }
+    if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) {
+        log_it(L_MSG, "Reject packet because net %s is offline", l_net->pub.name);
+        a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
+        return;
+    }
+    if (l_message->hdr.recv_addr.uint64 != g_node_addr.uint64) {
+        log_it(L_WARNING, "Wrong packet destination address" NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_message->hdr.recv_addr));
+        return;
+    }
+    dap_chain_esbocs_session_t *l_session;
+    DL_FOREACH(s_session_items, l_session)
+        if (l_session->chain->net_id.uint64 == l_net->pub.id.uint64)
+            break;
+    if (!l_session) {
+        log_it(L_WARNING, "Session for net %s not found", l_net->pub.name);
+        a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
+        return;
+    }
+    if (l_message->hdr.version != DAP_CHAIN_ESBOCS_PROTOCOL_VERSION) {
+        debug_if(PVT(l_session->esbocs)->debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U
+                            " Message is rejected - different protocol version %hu (need %u)",
+                                l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id,
+                                    l_message->hdr.version, DAP_CHAIN_ESBOCS_PROTOCOL_VERSION);
+        return;
+    }
+    debug_if(PVT(l_session->esbocs)->debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
+                            " Receive pkt type:0x%x from addr:"NODE_ADDR_FP_STR", my_addr:"NODE_ADDR_FP_STR"",
+                                l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id,
+                                    l_session->cur_round.attempt_num, l_message->hdr.type,
+                                        NODE_ADDR_FP_ARGS_S(a_ch->stream->node), NODE_ADDR_FP_ARGS_S(l_session->my_addr));
+    struct esbocs_msg_args *l_args = DAP_NEW_SIZE(struct esbocs_msg_args, sizeof(struct esbocs_msg_args) + l_message_size);
+    if (!l_args) {
+        log_it(L_CRITICAL, g_error_memory_alloc);
+        return;
+    }
+    l_args->addr_from = a_ch->stream->node;
+    l_args->session = l_session;
+    l_args->message_size = l_message_size;
+    memcpy(l_args->message, l_message, l_message_size);
+    dap_proc_thread_callback_add(NULL, s_process_incoming_message, l_args);
+}
+
 /**
  * @brief s_session_packet_in
  * @param a_arg
@@ -1857,19 +1929,13 @@ static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive,
  * @param a_data
  * @param a_data_size
  */
-static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_node_addr, dap_chain_node_addr_t *a_receiver_node_addr,
-                                dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size)
+static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain_node_addr_t *a_sender_node_addr, uint8_t *a_data, size_t a_data_size)
 {
-    dap_chain_esbocs_session_t *l_session = a_arg;
+    dap_chain_esbocs_session_t *l_session = a_session;
     dap_chain_esbocs_message_t *l_message = (dap_chain_esbocs_message_t *)a_data;
     bool l_cs_debug = PVT(l_session->esbocs)->debug;
     uint16_t l_cs_level = PVT(l_session->esbocs)->min_validators_count;
 
-    if (a_data_size < sizeof(dap_chain_esbocs_message_hdr_t)) {
-        log_it(L_WARNING, "Too smalll message size %zu, less than header size %zu", a_data_size, sizeof(dap_chain_esbocs_message_hdr_t));
-        return;
-    }
-
     size_t l_message_data_size = l_message->hdr.message_size;
     void *l_message_data = l_message->msg_n_sign;
     dap_chain_hash_fast_t *l_candidate_hash = &l_message->hdr.candidate_hash;
@@ -1878,46 +1944,26 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
     dap_chain_esbocs_round_t *l_round = &l_session->cur_round;
     dap_chain_addr_t l_signing_addr;
     char l_validator_addr_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = {0};
+    dap_chain_hash_fast_t l_data_hash = {};
+
+    dap_hash_fast(l_message, a_data_size, &l_data_hash);
 
     if (a_sender_node_addr) { //Process network messages only
         pthread_mutex_lock(&l_session->mutex);
-        debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
-                                    " Receive pkt type:0x%x from addr:"NODE_ADDR_FP_STR", my_addr:"NODE_ADDR_FP_STR"",
-                                        l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id,
-                                            l_session->cur_round.attempt_num, l_message->hdr.type,
-                                                NODE_ADDR_FP_ARGS(a_sender_node_addr), NODE_ADDR_FP_ARGS_S(l_session->my_addr));
-        if (a_receiver_node_addr->uint64 != l_session->my_addr.uint64) {
-            debug_if(l_cs_debug, L_MSG, "Wrong packet destination address");
-            goto session_unlock;
-        }
-        if (l_message->hdr.version != DAP_CHAIN_ESBOCS_PROTOCOL_VERSION) {
-            debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U
-                                        " SYNC message is rejected - different protocol version %hu (need %u)",
-                                           l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id,
-                                               l_message->hdr.version, DAP_CHAIN_ESBOCS_PROTOCOL_VERSION);
-            goto session_unlock;
-        }
-        if (sizeof(*l_message) + l_message->hdr.sign_size + l_message->hdr.message_size != a_data_size) {
-            log_it(L_WARNING, "incorrect message size in header is %zu when data size is only %zu and header size is %zu",
-                   l_message->hdr.sign_size, a_data_size, sizeof(*l_message));
-            goto session_unlock;
-        }
-
         if (l_message->hdr.chain_id.uint64 != l_session->chain->id.uint64) {
             debug_if(l_cs_debug, L_MSG, "Invalid chain ID %"DAP_UINT64_FORMAT_U, l_message->hdr.chain_id.uint64);
             goto session_unlock;
         }
-
-        dap_chain_hash_fast_t l_data_hash = {};
-        dap_hash_fast(l_message, a_data_size, &l_data_hash);
-        if (!dap_hash_fast_compare(a_data_hash, &l_data_hash)) {
+        // check hash message dup
+        dap_chain_esbocs_message_item_t *l_message_item_temp = NULL;
+        HASH_FIND(hh, l_round->message_items, &l_data_hash, sizeof(dap_chain_hash_fast_t), l_message_item_temp);
+        if (l_message_item_temp) {
             debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
-                                        " Message rejected: message hash does not match",
+                                        " Message rejected: message hash is exists in chain (duplicate)",
                                             l_session->chain->net_name, l_session->chain->name,
-                                                l_session->cur_round.id, l_session->cur_round.attempt_num);
+                                                l_session->cur_round.id, l_message->hdr.attempt_num);
             goto session_unlock;
         }
-
         l_message->hdr.sign_size = 0;   // restore header on signing time
         if (dap_sign_verify_all(l_sign, l_sign_size, l_message, l_message_data_size + sizeof(l_message->hdr))) {
             debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
@@ -1948,16 +1994,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                                                             l_session->cur_round.id, l_message->hdr.round_id);
         }
 
-        // check hash message dup
-        dap_chain_esbocs_message_item_t *l_message_item_temp = NULL;
-        HASH_FIND(hh, l_round->message_items, a_data_hash, sizeof(dap_chain_hash_fast_t), l_message_item_temp);
-        if (l_message_item_temp) {
-            debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
-                                        " Message rejected: message hash is exists in chain (duplicate)",
-                                            l_session->chain->net_name, l_session->chain->name,
-                                                l_session->cur_round.id, l_message->hdr.attempt_num);
-            goto session_unlock;
-        }
         dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_session->chain->net_id);
         // check messages chain
         dap_chain_esbocs_message_item_t *l_chain_message, *l_chain_message_tmp;
@@ -1985,7 +2021,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                 }
             }
         }
-        s_message_chain_add(l_session, l_message, a_data_size, a_data_hash, &l_signing_addr);
+        s_message_chain_add(l_session, l_message, a_data_size, &l_data_hash, &l_signing_addr);
     } else
         dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_session->chain->net_id);
 
@@ -1998,7 +2034,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
     case DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC:
         // Add local sync messages, cause a round clear
         if (!a_sender_node_addr)
-            s_message_chain_add(l_session, l_message, a_data_size, a_data_hash, &l_signing_addr);
+            s_message_chain_add(l_session, l_message, a_data_size, &l_data_hash, &l_signing_addr);
         // Accept all validators
         l_not_in_list = !dap_chain_net_srv_stake_key_delegated(&l_signing_addr);
         break;
@@ -2164,7 +2200,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                                        l_session->cur_round.id, l_message->hdr.attempt_num,
                                             l_approve ? "APPROVE" : "REJECT", l_candidate_hash_str);
             dap_chain_esbocs_message_item_t *l_unprocessed_item = NULL;
-            HASH_FIND(hh, l_round->message_items, a_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item);
+            HASH_FIND(hh, l_round->message_items, &l_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item);
             if (l_unprocessed_item)
                 l_unprocessed_item->unprocessed = true;
             break;
@@ -2313,7 +2349,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod
                                                     l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_FOR ?
                                                         "FOR" : "AGAINST");
             dap_chain_esbocs_message_item_t *l_unprocessed_item = NULL;
-            HASH_FIND(hh, l_round->message_items, a_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item);
+            HASH_FIND(hh, l_round->message_items, &l_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item);
             if (l_unprocessed_item)
                 l_unprocessed_item->unprocessed = true;
             break;
@@ -2353,50 +2389,60 @@ session_unlock:
 static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_message_type, dap_hash_fast_t *a_block_hash,
                                     const void *a_data, size_t a_data_size, dap_list_t *a_validators)
 {
-    dap_chain_net_t *l_net = dap_chain_net_by_id(a_session->chain->net_id);
     size_t l_message_size = sizeof(dap_chain_esbocs_message_hdr_t) + a_data_size;
     dap_chain_esbocs_message_t *l_message = NULL;
     DAP_NEW_Z_SIZE_RET(l_message, dap_chain_esbocs_message_t, l_message_size, NULL);
     l_message->hdr.version = DAP_CHAIN_ESBOCS_PROTOCOL_VERSION;
+    l_message->hdr.type = a_message_type;
     l_message->hdr.round_id = a_session->cur_round.id;
     l_message->hdr.attempt_num = a_session->cur_round.attempt_num;
+    l_message->hdr.net_id = a_session->chain->net_id;
     l_message->hdr.chain_id = a_session->chain->id;
     l_message->hdr.ts_created = dap_time_now();
-    l_message->hdr.type = a_message_type;
     l_message->hdr.message_size = a_data_size;
     l_message->hdr.candidate_hash = *a_block_hash;
     if (a_data && a_data_size)
         memcpy(l_message->msg_n_sign, a_data, a_data_size);
 
-    dap_sign_t *l_sign = dap_sign_create(PVT(a_session->esbocs)->blocks_sign_key, l_message,
-                                         sizeof(l_message->hdr) + a_data_size, 0);
-    size_t l_sign_size = dap_sign_get_size(l_sign);
-    l_message_size += l_sign_size;
-    l_message = DAP_REALLOC(l_message, l_message_size);
-    if (!l_message) {
-        log_it(L_CRITICAL, "Memory allocation error");
-        return;
-    }
-    memcpy(l_message->msg_n_sign + a_data_size, l_sign, l_sign_size);
-    DAP_DELETE(l_sign);
-    l_message->hdr.sign_size = l_sign_size;
-
-    dap_stream_ch_chain_voting_pkt_t *l_voting_pkt =
-            dap_stream_ch_chain_voting_pkt_new(l_net->pub.id.uint64, &a_session->my_addr,
-                                               NULL, l_message, l_message_size);
-    DAP_DELETE(l_message);
-
     for (dap_list_t *it = a_validators; it; it = it->next) {
         dap_chain_esbocs_validator_t *l_validator = it->data;
         if (l_validator->is_synced ||
                 a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC) {
             debug_if(PVT(a_session->esbocs)->debug, L_MSG, "Send pkt type 0x%x to "NODE_ADDR_FP_STR,
                                                             a_message_type, NODE_ADDR_FP_ARGS_S(l_validator->node_addr));
-            l_voting_pkt->hdr.receiver_node_addr = l_validator->node_addr;
-            dap_stream_ch_chain_voting_message_write(l_net, &l_validator->node_addr, l_voting_pkt);
+            l_message->hdr.recv_addr = l_validator->node_addr;
+            l_message->hdr.sign_size = 0;
+            dap_sign_t *l_sign = dap_sign_create(PVT(a_session->esbocs)->blocks_sign_key, l_message,
+                                                 l_message_size, 0);
+            size_t l_sign_size = dap_sign_get_size(l_sign);
+            l_message->hdr.sign_size = l_sign_size;
+            l_message = DAP_REALLOC(l_message, l_message_size + l_sign_size);
+            if (!l_message) {
+                log_it(L_CRITICAL, "Memory allocation error");
+                return;
+            }
+            memcpy(l_message->msg_n_sign + a_data_size, l_sign, l_sign_size);
+            DAP_DELETE(l_sign);
+            
+            if (l_validator->node_addr.uint64 != a_session->my_addr.uint64) {
+                dap_stream_ch_pkt_send_by_addr(&l_validator->node_addr, DAP_STREAM_CH_ESBOCS_ID,
+                                               a_message_type, l_message, l_message_size + l_sign_size);
+                continue;
+            }
+            struct esbocs_msg_args *l_args = DAP_NEW_SIZE(struct esbocs_msg_args,
+                                                          sizeof(struct esbocs_msg_args) + l_message_size + l_sign_size);
+            if (!l_args) {
+                log_it(L_CRITICAL, g_error_memory_alloc);
+                return;
+            }
+            l_args->addr_from = a_session->my_addr;
+            l_args->session = a_session;
+            l_args->message_size = l_message_size + l_sign_size;
+            memcpy(l_args->message, l_message, l_message_size + l_sign_size);
+            dap_proc_thread_callback_add(NULL, s_process_incoming_message, l_args);
         }
     }
-    DAP_DELETE(l_voting_pkt);
+    DAP_DELETE(l_message);
 }
 
 
diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
index 53b9533a3a9ac7320099e7db6682b6c24ae1b7ab..ab8eb9743be616510df3a054efd0cd96ab8a86cd 100644
--- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
+++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h
@@ -30,6 +30,8 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_cert.h"
 #include "dap_global_db_driver.h"
 
+#define DAP_STREAM_CH_ESBOCS_ID                     'E'
+
 #define DAP_CHAIN_ESBOCS_PROTOCOL_VERSION           8
 #define DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX          "esbocs"
 #define DAP_CHAIN_CLUSTER_ID_ESBOCS                 0x8000
@@ -53,6 +55,8 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 
 #define DAP_CHAIN_ESBOCS_DIRECTIVE_TSD_TYPE_ADDR    0x01
 
+#define PKT_SIGN_N_HDR_OVERHEAD (15 * 1024)
+
 typedef struct dap_chain_esbocs_session dap_chain_esbocs_session_t;
 
 /* consensus messages
@@ -74,9 +78,10 @@ typedef struct dap_chain_esbocs_message_hdr {
     uint64_t sign_size;
     uint64_t message_size;
     dap_time_t ts_created;
-    dap_chain_net_id_t net_it;
+    dap_chain_net_id_t net_id;
     dap_chain_id_t chain_id;
     dap_chain_cell_id_t cell_id;
+    dap_stream_node_addr_t recv_addr;
     dap_hash_fast_t candidate_hash;
 } DAP_ALIGN_PACKED dap_chain_esbocs_message_hdr_t;
 
diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt
index 6fca1d33d2056731e63a2ece9cc51ae9c02e6383..4cc53c5c4e335ae4ddd37c241026abad795140a8 100644
--- a/modules/net/CMakeLists.txt
+++ b/modules/net/CMakeLists.txt
@@ -30,7 +30,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS
 
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_client dap_io dap_notify_srv dap_cli_server dap_chain dap_chain_wallet
                                         dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_net_srv_xchange dap_chain_cs_none
-                                        dap_stream_ch_chain_net dap_stream_ch_chain_voting dap_chain_cs_esbocs dap_json_rpc dap_json_rpc_chain_common)
+                                        dap_stream_ch_chain_net dap_chain_cs_esbocs dap_json_rpc dap_json_rpc_chain_common)
 if(LINUX)
     target_link_libraries(${PROJECT_NAME} resolv)
 endif()
@@ -50,4 +50,4 @@ INSTALL(TARGETS ${PROJECT_NAME}
         ARCHIVE DESTINATION lib/modules/net/
         PUBLIC_HEADER DESTINATION include/modules/net/
 )
-endif()
\ No newline at end of file
+endif()
diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c
index dc920e8a48c15779b88d07845bad27bb366245ba..8e5a61dbc4e29a37949eb41db997c803fd9f0f09 100644
--- a/modules/net/dap_chain_net_node_list.c
+++ b/modules/net/dap_chain_net_node_list.c
@@ -127,7 +127,7 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple,
         uint8_t l_host_size = dap_min(INET6_ADDRSTRLEN, (int)dap_strlen(a_http_simple->es_hostaddr) + 1);
         l_node_info = DAP_NEW_STACK_SIZE(dap_chain_node_info_t, sizeof(dap_chain_node_info_t) + l_host_size);
         *l_node_info = (dap_chain_node_info_t) {
-            .address = addr,
+            .address.uint64 = addr,
             .ext_port = port,
             .ext_host_len = dap_strncpy(l_node_info->ext_host, a_http_simple->es_hostaddr, l_host_size) - l_node_info->ext_host
         };
@@ -363,4 +363,4 @@ int dap_chain_net_node_list_init()
     }
     DAP_DELETE(l_addr_by_alias);
     return l_res;
-}*/
\ No newline at end of file
+}*/
diff --git a/modules/net/dap_chain_net_voting.c b/modules/net/dap_chain_net_voting.c
index ab69757fb3a2f3e70347dad8daf2bfdc60c0d5b4..0f2b73180c160cd6997417f39d18ffdf40b509df 100644
--- a/modules/net/dap_chain_net_voting.c
+++ b/modules/net/dap_chain_net_voting.c
@@ -572,7 +572,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
         }
 
         if(dap_list_length(l_options_list)>DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT){
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can to contain no more than %d options", DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT);
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can contain no more than %d options", DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT);
             return -102;
         }
 
@@ -626,7 +626,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply)
                 return DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX;
             } break;
             case DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX: {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can to contain no more than %d options",
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can contain no more than %d options",
                                                   DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT);
                 return DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX;
             } break;
@@ -1574,17 +1574,15 @@ dap_list_t *dap_chain_net_vote_list(dap_chain_net_t *a_net) {
     return l_list;
 }
 
-dap_chain_net_vote_info_t *dap_chain_net_vote_extract_info(dap_chain_net_t *a_net, dap_hash_fast_t *a_voting) {
+dap_chain_net_vote_info_t *dap_chain_net_vote_extract_info(dap_chain_net_t *a_net, dap_hash_fast_t *a_voting)
+{
     if (!a_net || !a_voting)
         return NULL;
     dap_chain_net_votings_t *l_voting = NULL;
     pthread_rwlock_rdlock(&s_votings_rwlock);
-    HASH_FIND(hh, s_votings, &a_voting, sizeof(dap_hash_fast_t), l_voting);
+    HASH_FIND(hh, s_votings, a_voting, sizeof(dap_hash_fast_t), l_voting);
     pthread_rwlock_unlock(&s_votings_rwlock);
-    if(!l_voting){
-        return NULL;
-    }
-    return s_dap_chain_net_vote_extract_info(l_voting);
+    return l_voting ? s_dap_chain_net_vote_extract_info(l_voting) : NULL;
 }
 
 void dap_chain_net_vote_info_free(dap_chain_net_vote_info_t *a_info){
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 57a7739067d95b7591629ae48e1bf0a1c8565bb0..206764e7db10b5d2e05363a1cccd4648f730f3de 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -982,7 +982,7 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
             dap_cli_server_cmd_set_reply_text(a_str_reply, "node requires parameter -port");
             return -1;
         }
-        l_node_info->ext_host_len = dap_strncpy(l_node_info->ext_host, l_hostname, 0xFF) - l_node_info->ext_host;
+        l_node_info->ext_host_len = dap_strncpy(l_node_info->ext_host, l_hostname, DAP_HOSTADDR_STRLEN) - l_node_info->ext_host;
         l_node_info->address.uint64 = dap_chain_net_get_cur_addr_int(l_net);
         if (l_addr_str) {
             if (dap_chain_node_info_save(l_net, &l_node_info) == DAP_GLOBAL_DB_RC_SUCCESS) {
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 60d9bbf32f5ae1716c20f3b0f811c1b7c80008db..14d7c426dae8246dfe1727c997eefb42142b0ffc 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -67,7 +67,6 @@
 #include "dap_stream_ch_proc.h"
 #include "dap_stream_ch_chain_net_pkt.h"
 #include "dap_stream_ch_chain_net_srv.h"
-#include "dap_stream_ch_chain_voting.h"
 #include "dap_stream_pkt.h"
 #include "dap_chain_node_client.h"
 
@@ -962,15 +961,6 @@ static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_
                 l_node_client->ch_chain_net_srv         = l_ch;
                 l_node_client->ch_chain_net_srv_uuid    = l_ch->uuid;
                 break;
-            }
-                // 'V'
-            case DAP_STREAM_CH_VOTING_ID: {
-                dap_stream_ch_chain_voting_t *l_ch_chain    = DAP_STREAM_CH_CHAIN_VOTING(l_ch);
-                // l_ch_chain->callback_notify              = s_ch_chain_callback_notify_voting_packet_in;
-                l_ch_chain->callback_notify_arg             = l_node_client;
-                l_node_client->ch_chain_net         = l_ch;
-                l_node_client->ch_chain_net_uuid    = l_ch->uuid;
-                break;
             }
             default: {
                 l_ret = -2;
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index 091c90e48a1d767f10cd9011971683daa70f915c..8669a791d98b5ce2cb57c41df83b20e29c59519a 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -178,7 +178,7 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_test {
     dap_chain_net_srv_uid_t srv_uid;
     int32_t                 time_connect_ms;
     dap_nanotime_t          recv_time1, recv_time2, send_time1, send_time2;
-    char                    host_send[0xFF + 1], host_recv[0xFF + 1];
+    char                    host_send[DAP_HOSTADDR_STRLEN], host_recv[DAP_HOSTADDR_STRLEN];
     int32_t                 err_code;
     uint64_t                data_size_send, data_size_recv, data_size;
     dap_chain_hash_fast_t   data_hash;
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index dbe305b35043720a3f9c2313c261c83c23e2e739..1ef5e9feddf6250a2c4a2e3b946ab569f1319ee6 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -504,7 +504,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_host, u
 
     int l_timeout_conn_ms = 10000;
     int l_ret = 0;
-    unsigned l_hostlen = dap_min((int)dap_strlen(a_host), 0xFF);
+    unsigned l_hostlen = dap_min((int)dap_strlen(a_host), DAP_HOSTADDR_STRLEN);
     if(!s_node_info)
         s_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, sizeof(dap_chain_node_info_t) + l_hostlen + 1);
     s_node_info->ext_host_len = dap_strncpy(s_node_info->ext_host, a_host, l_hostlen) - s_node_info->ext_host;
@@ -551,7 +551,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_host, u
             l_request->data_size = a_data_size_to_send;
             randombytes(l_request->data, a_data_size_to_send);
             dap_hash_fast(l_request->data, l_request->data_size, &l_request->data_hash);
-            dap_strncpy(l_request->host_recv, a_host, 0xFF);
+            dap_strncpy(l_request->host_recv, a_host, DAP_HOSTADDR_STRLEN);
             l_request->time_connect_ms = l_dtime_connect_ms;
             l_request->send_time1 = dap_nanotime_now();
             size_t l_request_size = l_request->data_size + sizeof(dap_stream_ch_chain_net_srv_pkt_test_t);
@@ -586,10 +586,10 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_host, u
 {
     dap_return_val_if_fail(a_net && a_host, -1);
     int l_ret = 0;
-    unsigned l_hostlen = dap_min((int)strlen(a_host), 0xFF);
+    unsigned l_hostlen = dap_min((int)strlen(a_host), DAP_HOSTADDR_STRLEN);
     if(!s_node_info)
         s_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, sizeof(dap_chain_node_info_t) + l_hostlen + 1);
-    s_node_info->ext_host_len = dap_strncpy(s_node_info->ext_host, a_host, l_hostlen);
+    s_node_info->ext_host_len = dap_strncpy(s_node_info->ext_host, a_host, l_hostlen) - s_node_info->ext_host;
     s_node_info->ext_port = a_port;
 
     const char l_active_channels[] = { DAP_STREAM_CH_NET_SRV_ID, DAP_STREAM_CH_NET_SRV_ID_VPN, 0 }; //R, S