diff --git a/dap-sdk b/dap-sdk
index 024a62ba532fb809e88129c9bd47a4a88e3587ac..69e6e0d245c8d0ded155a79f268ff45300981021 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 024a62ba532fb809e88129c9bd47a4a88e3587ac
+Subproject commit 69e6e0d245c8d0ded155a79f268ff45300981021
diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
index a289daba669399d30553ed47dfc39a5a7fd3c36c..22542e7b20ce4c3c5ba611f7be65afe3cc47cec3 100644
--- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
+++ b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
@@ -33,7 +33,6 @@ typedef struct voting_pkt_items {
 typedef struct voting_node_client_list {
     dap_chain_node_info_t *node_info;
     dap_chain_node_client_t *node_client;
-    dap_events_socket_uuid_t uuid;
     dap_chain_node_addr_t node_addr;
     UT_hash_handle hh;
 } voting_node_client_list_t;
@@ -139,16 +138,8 @@ void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t *a_net, dap_list_t
         if ( l_remote_node_addr->uint64 != dap_chain_net_get_cur_addr_int(a_net) ) {
             HASH_FIND(hh, s_node_client_list, l_remote_node_addr, sizeof(dap_chain_node_addr_t), l_node_item);
             if (l_node_item) {
-                dap_chain_node_client_t *l_usable = dap_chain_node_client_find(l_node_item->uuid);
-                if (l_usable && !dap_client_get_stream(l_usable->client)) {
-                        dap_chain_node_client_close(l_node_item->uuid);
-                        l_usable = NULL;
-                }
-                if (!l_usable) {
-                    char l_channels[] = {dap_stream_ch_chain_voting_get_id(),0};
-                    l_node_item->node_client = dap_chain_node_client_connect_channels(a_net, l_node_item->node_info, l_channels);
-                    l_node_item->uuid = l_node_item->node_client->uuid;
-                }
+                if (!dap_client_get_stream(l_node_item->node_client->client))
+                    dap_chain_node_client_close_mt(l_node_item->node_client);
             } else {
                 size_t node_info_size = 0;
                 char *l_key = dap_chain_node_addr_to_hash_str(l_remote_node_addr);
@@ -168,17 +159,12 @@ void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t *a_net, dap_list_t
                 l_node_client_item->node_addr = *l_remote_node_addr;
                 l_node_client_item->node_info = l_node_info;
                 l_node_client_item->node_client = l_node_client;
-                l_node_client_item->uuid = l_node_client->uuid;
                 HASH_ADD(hh, s_node_client_list, node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item);
                 l_node_item = l_node_client_item;
             }
             if ( !l_node_item || !l_node_item->node_client ) {
                 continue;
             }
-            dap_client_pvt_t * l_client_pvt = dap_client_pvt_find(l_node_item->node_client->client->pvt_uuid);
-            if (NULL == l_client_pvt) {
-                continue;
-            }
             pthread_rwlock_wrlock(&s_pkt_items->rwlock_out);
             dap_list_t* l_pkts_list_temp = s_pkt_items->pkts_out;
             while(l_pkts_list_temp) {
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 2196aa014307827e71b7a974ef0e729f50561dc3..83926112676f0ea1f812857fca17a36e30f6ed80 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -1656,10 +1656,12 @@ static void s_stream_ch_io_complete(dap_events_socket_t *a_es, void *a_arg, int
     if (a_errno)
         return;
     dap_stream_t *l_stream = NULL;
-    dap_client_pvt_t *l_client_pvt = DAP_ESOCKET_CLIENT_PVT(a_es);
-    if (l_client_pvt && dap_client_pvt_find(l_client_pvt->uuid) == l_client_pvt)
+    if (!a_es->server) {
+        dap_client_t *l_client = DAP_ESOCKET_CLIENT(a_es);
+        assert(l_client);
+        dap_client_pvt_t *l_client_pvt = DAP_CLIENT_PVT(l_client);
         l_stream = l_client_pvt->stream;
-    else {
+    } else {
         dap_http_client_t *l_http_client = DAP_HTTP_CLIENT(a_es);
         if (l_http_client)
             l_stream = DAP_STREAM(l_http_client);
diff --git a/modules/channel/chain/include/dap_stream_ch_chain_pkt.h b/modules/channel/chain/include/dap_stream_ch_chain_pkt.h
index 531f54d3f667fc1c16e9873f496a2f6dcd599e48..dabfa60e075034053aa74c81ea011364604041e8 100644
--- a/modules/channel/chain/include/dap_stream_ch_chain_pkt.h
+++ b/modules/channel/chain/include/dap_stream_ch_chain_pkt.h
@@ -113,7 +113,7 @@ typedef struct dap_stream_ch_chain_pkt_hdr{
             uint8_t padding[7];
         } DAP_ALIGN_PACKED;
         uint64_t ext_id;
-    }DAP_ALIGN_PACKED;
+    } DAP_ALIGN_PACKED;
     dap_chain_net_id_t net_id;
     dap_chain_id_t chain_id;
     dap_chain_cell_id_t cell_id;
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index e038862770f87f2d4ba1b0ccdedf25c98a73a01b..09c070799482605cc42ed512bf61aef1de91b83c 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -233,8 +233,8 @@ typedef struct dap_chain_receipt_info {
     union {
         uint256_t value_datoshi; // Receipt value
         uint64_t value_64;       // Old receipts compliance
-    };
-} dap_chain_receipt_info_t;
+    } DAP_ALIGN_PACKED;
+} DAP_ALIGN_PACKED dap_chain_receipt_info_t;
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/modules/common/include/dap_chain_datum_tx_receipt.h b/modules/common/include/dap_chain_datum_tx_receipt.h
index 464973febbce36ce4f24a9691876f62db258e12a..60d2dd15ae0e7b2df648a6e1781f45668578a318 100644
--- a/modules/common/include/dap_chain_datum_tx_receipt.h
+++ b/modules/common/include/dap_chain_datum_tx_receipt.h
@@ -37,7 +37,7 @@ typedef struct dap_chain_datum_tx_receipt {
     uint64_t size;
     uint64_t exts_size;
     byte_t exts_n_signs[]; // Signatures, first from provider, second from client
-}DAP_ALIGN_PACKED dap_chain_datum_tx_receipt_t;
+} DAP_ALIGN_PACKED dap_chain_datum_tx_receipt_t;
 
 
 #ifdef __cplusplus
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index a69304f6947e0a9c33eef80e806ab2ca72a5d0c7..22e6b51e5b939fdb1e6dd526cb80e4472126b399 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -138,7 +138,6 @@ struct net_link {
     uint64_t uplink_ip;
     dap_chain_node_info_t *link_info;
     dap_chain_node_client_t *link;
-    dap_events_socket_uuid_t client_uuid;
     UT_hash_handle hh;
 };
 
@@ -343,6 +342,10 @@ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net)
  */
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state)
 {
+    if (PVT(a_net)->load_mode) {
+        log_it(L_ERROR, "Can't chage state of loading network '%s'", a_net->pub.name);
+        return -1;
+    }
     pthread_rwlock_wrlock(&PVT(a_net)->states_lock);
     if (PVT(a_net)->state != NET_STATE_OFFLINE){
         PVT(a_net)->state = PVT(a_net)->state_target = NET_STATE_OFFLINE;
@@ -354,8 +357,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
     //PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;  // TODO set this flag according to -mode argument from command line
     pthread_rwlock_unlock(&PVT(a_net)->states_lock);
 
-    dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_states_proc, a_net);
-    return 0;
+    return dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_states_proc, a_net);
 }
 
 dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net)
@@ -629,23 +631,26 @@ static int s_net_link_add(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_
     return 0;
 }
 
-static void s_net_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_events_socket_uuid_t a_client_uuid, bool a_rebase)
+static void s_net_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_chain_node_client_t *a_link, bool a_rebase)
 {
     struct net_link *l_link, *l_link_tmp, *l_link_found = NULL;
     HASH_ITER(hh, a_net_pvt->net_links, l_link, l_link_tmp) {
-        if (l_link->client_uuid == a_client_uuid) {
+        if (l_link->link == a_link) {
             l_link_found = l_link;
             break;
         }
     }
     if (!l_link_found) {
-        log_it(L_WARNING, "Can't find link UUID 0x%"DAP_UINT64_FORMAT_x" to remove it from links HT", a_client_uuid);
+        log_it(L_WARNING, "Can't find link %p to remove it from links HT", a_link);
         return;
     }
     HASH_DEL(a_net_pvt->net_links, l_link_found);
+    dap_chain_node_client_t *l_client = l_link_found->link;
+    l_client->callbacks.delete = NULL;
+    a_net_pvt->links_queue = dap_list_remove_all(a_net_pvt->links_queue, l_client);
+    dap_chain_node_client_close_mt(l_client);
     if (a_rebase) {
         l_link_found->link = NULL;
-        l_link_found->client_uuid = 0;
         // Add it to the list end
         HASH_ADD(hh, a_net_pvt->net_links, uplink_ip, sizeof(l_link_found->uplink_ip), l_link_found);
     } else {
@@ -659,7 +664,7 @@ static size_t s_net_get_active_links_count(dap_chain_net_t * a_net)
     int l_ret = 0;
     struct net_link *l_link, *l_link_tmp;
     HASH_ITER(hh, PVT(a_net)->net_links, l_link, l_link_tmp)
-        if (l_link->client_uuid)
+        if (l_link->link)
             l_ret++;
     return l_ret;
 }
@@ -692,7 +697,6 @@ static bool s_net_link_start(dap_chain_net_t *a_net, struct net_link *a_link, ui
     else
         return false;
     a_link->link = l_client;
-    a_link->client_uuid = l_client->uuid;
     if (a_delay) {
         dap_timerfd_start(a_delay * 1000, s_net_link_callback_connect_delayed, l_client);
         return true;
@@ -784,7 +788,7 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_cl
     }
     if (l_net_pvt->state_target != NET_STATE_OFFLINE) {
         pthread_rwlock_wrlock(&l_net_pvt->uplinks_lock);
-        s_net_link_remove(l_net_pvt, a_node_client->uuid, l_net_pvt->only_static_links);
+        s_net_link_remove(l_net_pvt, a_node_client, l_net_pvt->only_static_links);
         a_node_client->keep_connection = false;
         struct net_link *l_free_link = s_get_free_link(l_net);
         if (l_free_link) {
@@ -1073,7 +1077,7 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla
                                                 s_net_http_link_prepare_success,
                                                 s_net_http_link_prepare_error,
                                                 l_balancer_request,
-                                                NULL);
+                                                NULL) == NULL;
     } else {
         l_link_node_info->hdr.ext_port = DNS_LISTEN_PORT;
         ret = dap_chain_node_info_dns_request(l_balancer_request->worker,
@@ -1163,8 +1167,11 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
             struct net_link *l_link, *l_link_tmp;
             HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) {
                 HASH_DEL(l_net_pvt->net_links, l_link);
-                if (l_link->link)
-                    dap_chain_node_client_close(l_link->client_uuid);
+                if (l_link->link) {
+                    dap_chain_node_client_t *l_client = l_link->link;
+                    l_client->callbacks.delete = NULL;
+                    dap_chain_node_client_close_mt(l_client);
+                }
                 DAP_DEL_Z(l_link->link_info);
                 DAP_DELETE(l_link);
             }
@@ -1268,15 +1275,10 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
     return ! l_repeat_after_exit;
 }
 
-int s_net_list_compare_uuids(const void *a_uuid1, const void *a_uuid2)
-{
-    return memcmp(a_uuid1, a_uuid2, sizeof(dap_events_socket_uuid_t));
-}
-
 bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client)
 {
     dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
-    int a_err = pthread_rwlock_rdlock(&l_net_pvt->uplinks_lock);
+    int a_err = pthread_rwlock_wrlock(&l_net_pvt->uplinks_lock);
     bool l_found = false;
     if (l_net_pvt->active_link) {
         struct net_link *l_link, *l_link_tmp;
@@ -1294,10 +1296,8 @@ bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t
     if (!l_found) {
         l_net_pvt->active_link = a_client;
     }
-    if (l_found && !dap_list_find_custom(l_net_pvt->links_queue, &a_client->uuid, s_net_list_compare_uuids)) {
-        dap_events_socket_uuid_t *l_uuid = DAP_DUP(&a_client->uuid);
-        l_net_pvt->links_queue = dap_list_append(l_net_pvt->links_queue, l_uuid);
-    }
+    if (l_found && !dap_list_find(l_net_pvt->links_queue, a_client))
+        l_net_pvt->links_queue = dap_list_append(l_net_pvt->links_queue, a_client);
     if (a_err != EDEADLK)
         pthread_rwlock_unlock(&l_net_pvt->uplinks_lock);
     return !l_found;
@@ -1313,10 +1313,9 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *
     if (!a_client || l_net_pvt->active_link == a_client)
         l_net_pvt->active_link = NULL;
     while (l_net_pvt->active_link == NULL && l_net_pvt->links_queue) {
-        dap_events_socket_uuid_t *l_uuid = l_net_pvt->links_queue->data;
-        dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid);
+        dap_chain_node_client_t *l_link = l_net_pvt->links_queue->data;
+        dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_link);
         if (l_status != NODE_SYNC_STATUS_WAITING) {
-            DAP_DELETE(l_net_pvt->links_queue->data);
             dap_list_t *l_to_remove = l_net_pvt->links_queue;
             l_net_pvt->links_queue = l_net_pvt->links_queue->next;
             DAP_DELETE(l_to_remove);
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index cb8f668ede6ba21da022074baff6c88c41067c8c..41c0f5730f0fc4974ed01f46a2eeb3ee63c9b203 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1167,7 +1167,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
                     l_node_addr.uint64 = l_remote_node_addr->uint64;
 
                     // clean client struct
-                    dap_chain_node_client_close(l_node_client->uuid);
+                    dap_chain_node_client_close_mt(l_node_client);
                     DAP_DELETE(l_remote_node_info);
                     //return -1;
                     continue;
@@ -1189,7 +1189,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_cli_server_cmd_set_reply_text(a_str_reply, "no response from remote node(s)");
             log_it(L_WARNING, "No response from remote node(s): err code %d", res);
             // clean client struct
-            dap_chain_node_client_close(l_node_client->uuid);
+            dap_chain_node_client_close_mt(l_node_client);
             //DAP_DELETE(l_remote_node_info);
             return -1;
         }
@@ -1216,7 +1216,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             NULL, 0);
             if(res == 0) {
                 log_it(L_WARNING, "Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST packet");
-                dap_chain_node_client_close(l_node_client->uuid);
+                dap_chain_node_client_close_mt(l_node_client);
                 DAP_DELETE(l_remote_node_info);
                 return -1;
             }
@@ -1266,7 +1266,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
                 sizeof(l_sync_request))) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Error: Can't send sync chains request");
             // clean client struct
-            dap_chain_node_client_close(l_node_client->uuid);
+            dap_chain_node_client_close_mt(l_node_client);
             DAP_DELETE(l_remote_node_info);
             return -1;
         }
@@ -1278,7 +1278,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         if(res < 0) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Error: can't sync with node "NODE_ADDR_FP_STR,
                                             NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
-            dap_chain_node_client_close(l_node_client->uuid);
+            dap_chain_node_client_close_mt(l_node_client);
             DAP_DELETE(l_remote_node_info);
             log_it(L_WARNING, "Gdb synced err -2");
             return -2;
@@ -1306,7 +1306,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
                     sizeof(l_sync_request))) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Error: Can't send sync chains request");
                 // clean client struct
-                dap_chain_node_client_close(l_node_client->uuid);
+                dap_chain_node_client_close_mt(l_node_client);
                 DAP_DELETE(l_remote_node_info);
                 log_it(L_INFO, "Chain '%s' synced error: Can't send sync chains request", l_chain->name);
                 return -3;
@@ -1326,7 +1326,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         DAP_DELETE(l_remote_node_info);
         //dap_client_disconnect(l_node_client->client);
         //l_node_client->client = NULL;
-        dap_chain_node_client_close(l_node_client->uuid);
+        dap_chain_node_client_close_mt(l_node_client);
         dap_cli_server_cmd_set_reply_text(a_str_reply, "Node sync completed: Chains and gdb are synced");
         return 0;
 
@@ -1355,18 +1355,18 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             return -6;
         int timeout_ms = 5000; //5 sec = 5000 ms
         // start handshake
-        dap_chain_node_client_t *client = dap_chain_node_client_connect_default_channels(l_net,node_info);
-        if(!client) {
+        dap_chain_node_client_t *l_client = dap_chain_node_client_connect_default_channels(l_net,node_info);
+        if(!l_client) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
             DAP_DELETE(node_info);
             return -7;
         }
         // wait handshake
-        int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
+        int res = dap_chain_node_client_wait(l_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
         if (res) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
             // clean client struct
-            dap_chain_node_client_close(client->uuid);
+            dap_chain_node_client_close_mt(l_client);
             DAP_DELETE(node_info);
             return -8;
         }
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index ec000344e8781e77e94df92d154e8a9d635406a5..e8c4e591510e73b3aae5d8a31eaf5b9c15f6de9e 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -73,16 +73,6 @@
 
 #define LOG_TAG "dap_chain_node_client"
 
-typedef struct dap_chain_node_client_handle {
-    uint64_t uuid;
-    dap_chain_node_client_t * client;
-    UT_hash_handle hh;
-} dap_chain_node_client_handle_t;
-
-static dap_chain_node_client_handle_t * s_clients = NULL;
-
-//static int listen_port_tcp = 8079;
-
 static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg);
 static bool s_timer_update_states_callback(void *a_arg);
 static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_ch_id);
@@ -118,51 +108,21 @@ int dap_chain_node_client_init(void)
  */
 void dap_chain_node_client_deinit()
 {
-    dap_chain_node_client_handle_t *l_client = NULL, *l_tmp = NULL;
-    HASH_ITER(hh, s_clients,l_client, l_tmp){
-        // Clang bug at this, l_client should change at every loop cycle
-        HASH_DEL(s_clients,l_client);
-        DAP_DELETE(l_client);
-    }
-    //dap_http_client_simple_deinit();
     dap_client_deinit();
 }
 
-/**
- * @brief stage_status_callback
- * @param a_client
- * @param a_arg
- */
-static void s_stage_status_callback(dap_client_t *a_client, void *a_arg)
-{
-    (void) a_client;
-    (void) a_arg;
-
-    //printf("* stage_status_callback client=%x data=%x\n", a_client, a_arg);
-}
-
 static bool s_timer_node_reconnect(void *a_arg)
 {
-    dap_events_socket_uuid_t *l_uuid = (dap_events_socket_uuid_t *)a_arg;
-    assert(l_uuid);
-    dap_chain_node_client_handle_t *l_client_found = NULL;
-    HASH_FIND(hh, s_clients, l_uuid, sizeof(*l_uuid), l_client_found);
-    if(l_client_found) {
-        dap_chain_node_client_t *l_me = l_client_found->client;
-        if (l_me->keep_connection && l_me->state == NODE_CLIENT_STATE_DISCONNECTED) {
-            if (dap_client_pvt_find(l_me->client->pvt_uuid)) {
-                if (dap_client_get_stage(l_me->client) == STAGE_BEGIN) {
-                    log_it(L_INFO, "Reconnecting node client with peer "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_me->remote_node_addr));
-                    l_me->state = NODE_CLIENT_STATE_CONNECTING ;
-                    dap_client_go_stage(l_me->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
-                } else {
-                    dap_chain_node_client_close(*l_uuid);
-                }
-            } else
-                dap_chain_node_client_close(*l_uuid);
+    if (!a_arg)
+        return false;
+    dap_chain_node_client_t *l_me = a_arg;
+    if (l_me->keep_connection && l_me->state == NODE_CLIENT_STATE_DISCONNECTED) {
+        if (dap_client_get_stage(l_me->client) == STAGE_BEGIN) {
+            log_it(L_INFO, "Reconnecting node client with peer "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_me->remote_node_addr));
+            l_me->state = NODE_CLIENT_STATE_CONNECTING ;
+            dap_client_go_stage(l_me->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
         }
     }
-    DAP_DELETE(l_uuid);
     return false;
 }
 
@@ -196,10 +156,8 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
         if (l_node_client->keep_connection) {
             if (dap_client_get_stage(l_node_client->client) != STAGE_BEGIN)
                 dap_client_go_stage(l_node_client->client, STAGE_BEGIN, NULL);
-            dap_timerfd_start(45 * 1000, s_timer_node_reconnect, DAP_DUP(&l_node_client->uuid));
-        } else
-            dap_chain_node_client_close(l_node_client->uuid);
-
+            dap_timerfd_start(45 * 1000, s_timer_node_reconnect, l_node_client);
+        }
     } else if(l_node_client->callbacks.error) // TODO make different error codes
         l_node_client->callbacks.error(l_node_client, EINVAL, l_node_client->callbacks_arg);
 }
@@ -213,8 +171,7 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
 static void s_node_client_connected_synchro_start_callback(dap_worker_t *a_worker, void *a_arg)
 {
     UNUSED(a_worker);
-    if (s_timer_update_states_callback(a_arg))
-        DAP_DELETE(a_arg);
+    s_timer_update_states_callback(a_arg);
 }
 
 /**
@@ -223,56 +180,34 @@ static void s_node_client_connected_synchro_start_callback(dap_worker_t *a_worke
  * @param a_wrlock
  * @return
  */
-dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *a_uuid)
+dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_chain_node_client_t *a_node_client)
 {
-    dap_chain_node_client_handle_t *l_client_found = NULL;
-    HASH_FIND(hh, s_clients, a_uuid, sizeof(*a_uuid), l_client_found);
-    if(!l_client_found){
-        log_it(L_DEBUG,"Chain node client %p was deleted before timer fired, nothing to do", a_uuid);
-        return NODE_SYNC_STATUS_MISSING;
-    }
-
-    dap_chain_node_client_t *l_me = l_client_found->client;
-    dap_worker_t * l_worker = dap_worker_get_current();
-    if (!l_worker)
-        return NODE_SYNC_STATUS_FAILED;
-    assert(l_me);
-    dap_events_socket_t * l_es = NULL;
-    dap_events_socket_uuid_t l_es_uuid = l_me->esocket_uuid;
+    assert(a_node_client);
     // check if esocket still in worker
-    if( (l_es = dap_context_find(l_worker->context, l_es_uuid)) != NULL ) {
-        dap_client_t * l_client = dap_client_from_esocket(l_es);
-        if (l_client ) {
-            dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t*) l_client->_inheritor;
-            assert(l_node_client == l_me);
-            if (l_node_client && l_node_client->ch_chain && l_node_client->stream_worker && l_node_client->ch_chain_uuid) {
-                dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(l_node_client->stream_worker, l_node_client->ch_chain_uuid);
-                if (l_ch) {
-                    dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
-                    assert(l_ch_chain);
-                    dap_chain_net_t * l_net = l_node_client->net;
-                    assert(l_net);
-                    // If we do nothing - init sync process
-
-                    if (l_ch_chain->state == CHAIN_STATE_IDLE) {
-                        bool l_trylocked = dap_chain_net_sync_trylock(l_net, l_node_client);
-                        if (l_trylocked) {
-                            log_it(L_INFO, "Start synchronization process with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
-                            dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
-                            l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
-                            dap_stream_ch_chain_pkt_write_unsafe(l_node_client->ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ,
-                                                                 l_net->pub.id.uint64, 0, 0,
-                                                                 &l_sync_gdb, sizeof(l_sync_gdb));
-                            if (!l_ch_chain->activity_timer)
-                                dap_stream_ch_chain_timer_start(l_ch_chain);
-                            return NODE_SYNC_STATUS_STARTED;
-                        } else
-                            return NODE_SYNC_STATUS_WAITING;
-                    } else
-                        return NODE_SYNC_STATUS_IN_PROGRESS;
-                }
-            }
-        }
+    dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(a_node_client->stream_worker, a_node_client->ch_chain_uuid);
+    if (l_ch) {
+        dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
+        assert(l_ch_chain);
+        dap_chain_net_t * l_net = a_node_client->net;
+        assert(l_net);
+        // If we do nothing - init sync process
+
+        if (l_ch_chain->state == CHAIN_STATE_IDLE) {
+            bool l_trylocked = dap_chain_net_sync_trylock(l_net, a_node_client);
+            if (l_trylocked) {
+                log_it(L_INFO, "Start synchronization process with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr));
+                dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
+                l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
+                dap_stream_ch_chain_pkt_write_unsafe(a_node_client->ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ,
+                                                     l_net->pub.id.uint64, 0, 0,
+                                                     &l_sync_gdb, sizeof(l_sync_gdb));
+                if (!l_ch_chain->activity_timer)
+                    dap_stream_ch_chain_timer_start(l_ch_chain);
+                return NODE_SYNC_STATUS_STARTED;
+            } else
+                return NODE_SYNC_STATUS_WAITING;
+        } else
+            return NODE_SYNC_STATUS_IN_PROGRESS;
     }
     return NODE_SYNC_STATUS_FAILED;
 }
@@ -284,41 +219,25 @@ dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_
  */
 static bool s_timer_update_states_callback(void *a_arg)
 {
-    dap_events_socket_uuid_t *l_uuid = (dap_events_socket_uuid_t *)a_arg;
-    assert(l_uuid);
-    dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid);
-    if (l_status == NODE_SYNC_STATUS_MISSING) {
-        DAP_DELETE(l_uuid);
+    if (!a_arg)
         return false;
-    }
+    dap_chain_node_client_t *l_me = a_arg;
+    dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_me);
     if (l_status == NODE_SYNC_STATUS_FAILED) {
-        dap_chain_node_client_handle_t *l_client_found = NULL;
-        HASH_FIND(hh, s_clients, l_uuid, sizeof(*l_uuid), l_client_found);
-        if(l_client_found) {
-            dap_chain_node_client_t *l_me = l_client_found->client;
-            l_me->state = NODE_CLIENT_STATE_DISCONNECTED;
+        l_me->state = NODE_CLIENT_STATE_DISCONNECTED;
+        if (l_me->keep_connection) {
+            if (dap_client_get_stage(l_me->client) != STAGE_BEGIN) {
+                dap_client_go_stage(l_me->client, STAGE_BEGIN, NULL);
+                return true;
+            }
+            if (l_me->is_connected && l_me->callbacks.disconnected)
+                l_me->callbacks.disconnected(l_me, l_me->callbacks_arg);
             if (l_me->keep_connection) {
-                if (dap_client_pvt_find(l_me->client->pvt_uuid)) {
-                    if (dap_client_get_stage(l_me->client) != STAGE_BEGIN) {
-                        dap_client_go_stage(l_me->client, STAGE_BEGIN, NULL);
-                        return true;
-                    }
-                    if (l_me->is_connected && l_me->callbacks.disconnected)
-                        l_me->callbacks.disconnected(l_me, l_me->callbacks_arg);
-                    if (l_me->keep_connection) {
-                        log_it(L_INFO, "Reconnecting node client with peer "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_me->remote_node_addr));
-                        l_me->state = NODE_CLIENT_STATE_CONNECTING ;
-                        dap_client_go_stage(l_me->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
-                        return true;
-                    } else {
-                        dap_chain_node_client_close(*l_uuid);
-                    }
-                } else
-                    dap_chain_node_client_close(*l_uuid);
+                log_it(L_INFO, "Reconnecting node client with peer "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_me->remote_node_addr));
+                l_me->state = NODE_CLIENT_STATE_CONNECTING ;
+                dap_client_go_stage(l_me->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
             }
         }
-        DAP_DELETE(l_uuid);
-        return false;
     }
     return true;
 }
@@ -337,11 +256,10 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
         log_it(L_NOTICE, "Stream connection with node " NODE_ADDR_FP_STR " established",
                 NODE_ADDR_FP_ARGS_S( l_node_client->remote_node_addr));
         // set callbacks for C and N channels; for R and S it is not needed
-        dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client);
-        if(l_client_internal && l_client_internal->active_channels) {
-            size_t l_channels_count = dap_strlen(l_client_internal->active_channels);
+        if (a_client->active_channels) {
+            size_t l_channels_count = dap_strlen(a_client->active_channels);
             for(size_t i = 0; i < l_channels_count; i++) {
-                if(s_node_client_set_notify_callbacks(a_client, l_client_internal->active_channels[i]) == -1) {
+                if(s_node_client_set_notify_callbacks(a_client, a_client->active_channels[i]) == -1) {
                     log_it(L_WARNING, "No ch_chain channel, can't init notify callback for pkt type CH_CHAIN");
                     return;
                 }
@@ -362,14 +280,12 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
             l_node_client->esocket_uuid = l_stream->esocket->uuid;
             l_node_client->stream_worker = l_stream->stream_worker;
             if (l_node_client->keep_connection) {
-                dap_events_socket_uuid_t *l_uuid = DAP_DUP(&l_node_client->uuid);
-                dap_events_socket_uuid_t *l_uuid_timer = DAP_DUP(&l_node_client->uuid);
                 if(l_node_client->stream_worker){
-                    dap_worker_exec_callback_on(l_stream->esocket->context->worker, s_node_client_connected_synchro_start_callback, l_uuid);
+                    dap_worker_exec_callback_on(l_stream->esocket->context->worker, s_node_client_connected_synchro_start_callback, l_node_client);
                     l_node_client->sync_timer = dap_timerfd_start_on_worker(l_stream->esocket->context->worker,
                                                                             s_timer_update_states * 1000,
                                                                             s_timer_update_states_callback,
-                                                                            l_uuid_timer);
+                                                                            l_node_client);
                 }else{
                     log_it(L_ERROR,"After NODE_CLIENT_STATE_ESTABLISHED: Node client has no worker, too dangerous to run update states in alien context");
                 }
@@ -576,11 +492,13 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch
             if(s_stream_ch_chain_debug_more)
                 log_it(L_INFO,"Out: chain %"DAP_UINT64_FORMAT_x" sent to uplink "NODE_ADDR_FP_STR,l_node_client->cur_chain ? l_node_client->cur_chain->id.uint64 : 0, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
         } break;
-        case DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT: {
+        case DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT:
+        case DAP_STREAM_CH_CHAIN_PKT_TYPE_DELETE: {
             dap_chain_net_t *l_net = l_node_client->net;
             assert(l_net);
             dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(l_net);
-            log_it(L_DEBUG, "In: State node %s."NODE_ADDR_FP_STR" is timeout for sync", l_net->pub.name, NODE_ADDR_FP_ARGS(l_node_addr));
+            log_it(L_DEBUG, "In: State node %s."NODE_ADDR_FP_STR" %s", l_net->pub.name, NODE_ADDR_FP_ARGS(l_node_addr),
+                            a_pkt_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT ? "is timeout for sync" : "stream closed");
             l_node_client->state = NODE_CLIENT_STATE_ERROR;
             dap_timerfd_reset(l_node_client->sync_timer);
             bool l_have_waiting = dap_chain_net_sync_unlock(l_net, l_node_client);
@@ -591,11 +509,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch
                     dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE);
             }
         } break;
-        case DAP_STREAM_CH_CHAIN_PKT_TYPE_DELETE: {
-            dap_chain_node_client_close(l_node_client->uuid);
-        } break;
-        default: {
-        }
+        default:;
     }
 }
 
@@ -765,13 +679,7 @@ dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net,
     if (a_callbacks)
         l_node_client->callbacks = *a_callbacks;
     l_node_client->info = DAP_DUP(a_node_info);
-    l_node_client->uuid = dap_uuid_generate_uint64();
     l_node_client->net = a_net;
-    dap_chain_node_client_handle_t * l_client_handle = DAP_NEW_Z(dap_chain_node_client_handle_t);
-    l_client_handle->uuid = l_node_client->uuid;
-    l_client_handle->client = l_node_client;
-    HASH_ADD(hh, s_clients, uuid, sizeof(l_client_handle->uuid), l_client_handle);
-
 #ifndef _WIN32
     pthread_condattr_t attr;
     pthread_condattr_init(&attr);
@@ -788,6 +696,12 @@ dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net,
     return l_node_client;
 }
 
+
+ void s_client_delete_callback(UNUSED_ATTR dap_client_t *a_client, void *a_arg)
+ {
+     assert(a_arg);
+     dap_chain_node_client_close_unsafe(a_arg);
+ }
 /**
  * @brief dap_chain_node_client_connect
  * Create new dap_client, setup it, and send it in adventure trip
@@ -800,31 +714,29 @@ bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const
 {
     if (!a_node_client)
         return false;
-    a_node_client->client = dap_client_new( s_stage_status_callback,
-            s_stage_status_error_callback);
+    a_node_client->client = dap_client_new(s_client_delete_callback, s_stage_status_error_callback, a_node_client);
     dap_client_set_is_always_reconnect(a_node_client->client, false);
     a_node_client->client->_inheritor = a_node_client;
     dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels);
 
     dap_client_set_auth_cert(a_node_client->client, a_node_client->net->pub.name);
 
-    int hostlen = 128;
-    char host[hostlen];
+    char l_host_addr[INET6_ADDRSTRLEN];
     if(a_node_client->info->hdr.ext_addr_v4.s_addr){
         struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_client->info->hdr.ext_addr_v4 };
-        inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen);
+        inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), l_host_addr, INET6_ADDRSTRLEN);
     } else {
         struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_client->info->hdr.ext_addr_v6 };
-        inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen);
+        inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), l_host_addr, INET6_ADDRSTRLEN);
     }
-    log_it(L_INFO, "Connecting to %s address", host);
+    log_it(L_INFO, "Connecting to %s address", l_host_addr);
     // address not defined
-    if(!strcmp(host, "::")) {
+    if(!strcmp(l_host_addr, "::")) {
         log_it(L_WARNING, "Undefined address with node client connect to");
         return false;
     }
-    dap_client_set_uplink_unsafe(a_node_client->client, host, a_node_client->info->hdr.ext_port);
-    a_node_client->state = NODE_CLIENT_STATE_CONNECTING ;
+    dap_client_set_uplink_unsafe(a_node_client->client, l_host_addr, a_node_client->info->hdr.ext_port);
+    a_node_client->state = NODE_CLIENT_STATE_CONNECTING;
     // Handshake & connect
     dap_client_go_stage(a_node_client->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
     return true;
@@ -842,69 +754,62 @@ void dap_chain_node_client_reset(dap_chain_node_client_t *a_client)
     }
 }
 
-dap_chain_node_client_t *dap_chain_node_client_find(dap_events_socket_uuid_t a_uuid)
-{
-    dap_chain_node_client_handle_t * l_client_found = NULL;
-    HASH_FIND(hh,s_clients, &a_uuid, sizeof(a_uuid), l_client_found);
-    return l_client_found ? l_client_found->client : NULL;
-}
-
 /**
  * @brief dap_chain_node_client_close
  * Close connection to server, delete chain_node_client_t *client
  * @param a_client dap_chain_node_client_t
  */
-void dap_chain_node_client_close(dap_events_socket_uuid_t a_uuid)
+void dap_chain_node_client_close_unsafe(dap_chain_node_client_t *a_node_client)
 {
-    dap_chain_node_client_handle_t * l_client_found = NULL;
-    HASH_FIND(hh, s_clients, &a_uuid, sizeof(a_uuid), l_client_found);
-    if (l_client_found) {
-        dap_chain_node_client_t *l_client = l_client_found->client;
-        if (l_client->sync_timer) {
-            DAP_DEL_Z(l_client->sync_timer->callback_arg);
-            dap_timerfd_delete(l_client->sync_timer);
-        }
-        HASH_DEL(s_clients,l_client_found);
-        DAP_DELETE(l_client_found);
-        if (l_client->callbacks.delete)
-            l_client->callbacks.delete(l_client, l_client->net);
-        char l_node_addr_str[INET_ADDRSTRLEN] = {};
-        inet_ntop(AF_INET, &l_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN);
-        log_it(L_INFO, "Closing node client to uplink %s:%d", l_node_addr_str, l_client->info->hdr.ext_port);
-        if (l_client->stream_worker) {
-            dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(l_client->stream_worker, l_client->ch_chain_uuid);
-            if (l_ch) {
-                dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
-                l_ch_chain->callback_notify_packet_in = NULL;
-                l_ch_chain->callback_notify_packet_out = NULL;
-            }
-            l_ch = dap_stream_ch_find_by_uuid_unsafe(l_client->stream_worker, l_client->ch_chain_net_uuid);
-            if (l_ch) {
-                dap_stream_ch_chain_net_t *l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(l_ch);
-                l_ch_chain_net->notify_callback = NULL;
-            }
+    if (a_node_client->sync_timer) {
+        a_node_client->sync_timer->callback_arg = NULL;
+        dap_timerfd_delete(a_node_client->sync_timer);
+    }
+    if (a_node_client->callbacks.delete)
+        a_node_client->callbacks.delete(a_node_client, a_node_client->net);
+    char l_node_addr_str[INET_ADDRSTRLEN] = {};
+    inet_ntop(AF_INET, &a_node_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN);
+    log_it(L_INFO, "Closing node client to uplink %s:%d", l_node_addr_str, a_node_client->info->hdr.ext_port);
+    if (a_node_client->stream_worker) {
+        dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(a_node_client->stream_worker, a_node_client->ch_chain_uuid);
+        if (l_ch) {
+            dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
+            l_ch_chain->callback_notify_packet_in = NULL;
+            l_ch_chain->callback_notify_packet_out = NULL;
         }
-        // clean client
-        dap_client_pvt_t *l_client_pvt = dap_client_pvt_find(l_client->client->pvt_uuid);
-        if (l_client_pvt) {
-            dap_client_delete_mt(l_client->client);
-            l_client->client->_inheritor = NULL;
+        l_ch = dap_stream_ch_find_by_uuid_unsafe(a_node_client->stream_worker, a_node_client->ch_chain_net_uuid);
+        if (l_ch) {
+            dap_stream_ch_chain_net_t *l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(l_ch);
+            l_ch_chain_net->notify_callback = NULL;
         }
+    }
+    // clean client
+    a_node_client->client->delete_callback = NULL;
+    dap_client_delete_unsafe(a_node_client->client);
 #ifndef _WIN32
-        pthread_cond_destroy(&l_client->wait_cond);
+    pthread_cond_destroy(&a_node_client->wait_cond);
 #else
-        CloseHandle( l_client->wait_cond );
+    CloseHandle( a_node_client->wait_cond );
 #endif
-        pthread_mutex_destroy(&l_client->wait_mutex);
-        l_client->client = NULL;
-        if (l_client->info)
-            DAP_DELETE(l_client->info);
-        DAP_DELETE(l_client);
-    } else {
-        log_it(L_WARNING, "Chain node client was removed from hash table before for some reasons");
-    }
+    pthread_mutex_destroy(&a_node_client->wait_mutex);
+    a_node_client->client = NULL;
+    DAP_DEL_Z(a_node_client->info);
+    DAP_DELETE(a_node_client);
 }
 
+void s_close_on_worker_callback(UNUSED_ATTR dap_worker_t *a_worker, void *a_arg)
+{
+    assert(a_arg);
+    dap_chain_node_client_close_unsafe(a_arg);
+}
+
+void dap_chain_node_client_close_mt(dap_chain_node_client_t *a_node_client)
+{
+    if (a_node_client->client)
+        dap_worker_exec_callback_on(DAP_CLIENT_PVT(a_node_client->client)->worker, s_close_on_worker_callback, a_node_client);
+    else
+        dap_chain_node_client_close_unsafe(a_node_client);
+}
 
 /**
  * @brief dap_chain_node_client_send_ch_pkt
@@ -1021,10 +926,7 @@ static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_
     if(l_node_client) {
         pthread_mutex_lock(&l_node_client->wait_mutex);
         // find current channel code
-        dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client);
-        dap_stream_ch_t * l_ch = NULL;
-        if(l_client_internal)
-            l_ch = dap_client_get_stream_ch_unsafe(a_client, a_ch_id);
+        dap_stream_ch_t *l_ch = dap_client_get_stream_ch_unsafe(a_client, a_ch_id);
         if(l_ch) {
             // C
             if(a_ch_id == dap_stream_ch_chain_get_id()) {
diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h
index 6a311c5f3aabd104e5a68efc5dc55a793953c45b..51c86e53e127c6b56eb5fe062adaba54b404827f 100644
--- a/modules/net/include/dap_chain_node_client.h
+++ b/modules/net/include/dap_chain_node_client.h
@@ -54,8 +54,7 @@ typedef enum dap_chain_node_sync_status {
     NODE_SYNC_STATUS_STARTED = 0,
     NODE_SYNC_STATUS_WAITING = 1,
     NODE_SYNC_STATUS_IN_PROGRESS = 2,
-    NODE_SYNC_STATUS_FAILED = -1,
-    NODE_SYNC_STATUS_MISSING = -2
+    NODE_SYNC_STATUS_FAILED = -1
 } dap_chain_node_sync_status_t;
 
 typedef struct dap_chain_node_client dap_chain_node_client_t;
@@ -83,9 +82,6 @@ typedef struct dap_chain_node_client_notify_callbacks {
 
 // state for a client connection
 typedef struct dap_chain_node_client {
-    // Sould be first with current architecture
-    dap_events_socket_uuid_t uuid;
-
     dap_chain_node_client_state_t state;
     bool resync_gdb;
     bool resync_chains;
@@ -171,6 +167,12 @@ DAP_STATIC_INLINE dap_chain_node_client_t* dap_chain_node_client_connect_default
 { return dap_chain_node_client_connect_channels(a_net,a_node_info, "CN"); }
 
 
+DAP_STATIC_INLINE ssize_t dap_chain_node_client_write_unsafe(dap_chain_node_client_t *a_client, const char a_ch_id, uint8_t a_type, void *a_data, size_t a_data_size)
+{ return dap_client_write_unsafe(a_client->client, a_ch_id, a_type, a_data, a_data_size); }
+
+DAP_STATIC_INLINE int dap_chain_node_client_write_mt(dap_chain_node_client_t *a_client, const char a_ch_id, uint8_t a_type, void *a_data, size_t a_data_size)
+{ return dap_client_write_mt(a_client->client, a_ch_id, a_type, a_data, a_data_size); }
+
 dap_chain_node_client_t *dap_chain_node_client_find(dap_events_socket_uuid_t a_uuid);
 
 /**
@@ -180,7 +182,8 @@ void dap_chain_node_client_reset(dap_chain_node_client_t *a_client);
 /**
  * Close connection to server, delete chain_node_client_t with specified UUID
  */
-void dap_chain_node_client_close(dap_events_socket_uuid_t a_uuid);
+void dap_chain_node_client_close_unsafe(dap_chain_node_client_t *a_node_client);
+void dap_chain_node_client_close_mt(dap_chain_node_client_t *a_node_client);
 
 /**
  * Send stream request to server
@@ -199,7 +202,7 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s
 
 int dap_chain_node_client_send_nodelist_req(dap_chain_node_client_t *a_client);
 
-dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *l_uuid);
+dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_chain_node_client_t *a_node_client);
 
 static inline const char * dap_chain_node_client_state_to_str( dap_chain_node_client_state_t a_state)
 {
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index 031f517523735314fb41d07a6d018c14da04f9e3..79388b31622ecb97db2af1edd7f3989a2d1e2580 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -531,7 +531,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
     if(l_res) {
         log_it(L_ERROR, "No response from VPN server=%s:%d", a_ipv4_str, a_port);
         // clean client struct
-        dap_chain_node_client_close(s_vpn_client->uuid);
+        dap_chain_node_client_close_mt(s_vpn_client);
         DAP_DELETE(s_node_info);
         s_node_info = NULL;
         return -3;
@@ -577,7 +577,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
         log_it(L_NOTICE, "Got response from VPN server=%s:%d", a_ipv4_str, a_port);
     }
     // clean client struct
-    dap_chain_node_client_close(s_vpn_client->uuid);
+    dap_chain_node_client_close_mt(s_vpn_client);
     DAP_DELETE(s_node_info);
     s_node_info = NULL;
     if(l_res)
@@ -610,7 +610,7 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st
     if(!s_vpn_client) {
         log_it(L_ERROR, "Can't connect to VPN server=%s:%d", a_ipv4_str, a_port);
         // clean client struct
-        dap_chain_node_client_close(s_vpn_client->uuid);
+        dap_chain_node_client_close_mt(s_vpn_client);
         DAP_DELETE(s_node_info);
         s_node_info = NULL;
         return -2;
@@ -621,7 +621,7 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st
     if(res) {
         log_it(L_ERROR, "No response from VPN server=%s:%d", a_ipv4_str, a_port);
         // clean client struct
-        dap_chain_node_client_close(s_vpn_client->uuid);
+        dap_chain_node_client_close_mt(s_vpn_client);
         DAP_DELETE(s_node_info);
         s_node_info = NULL;
         return -3;
@@ -660,7 +660,7 @@ int dap_chain_net_vpn_client_stop(void)
 {
     // delete connection with VPN server
     if(s_vpn_client) {
-        dap_chain_node_client_close(s_vpn_client->uuid);
+        dap_chain_node_client_close_mt(s_vpn_client);
         s_vpn_client = NULL;
     }
     DAP_DELETE(s_node_info);