diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index c910fdfa481c2851c3c05b14b30935ad0dd53517..de9d7fe0fbbe317b5ac712539a54129019987220 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -41,6 +41,7 @@
 #include "dap_cert.h"
 #include "dap_chain_ledger.h"
 #include "dap_chain_cs.h"
+#include "dap_cert_file.h"
 #include "dap_chain_vf.h"
 #include <uthash.h>
 #include <pthread.h>
@@ -721,3 +722,40 @@ ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t
     }
     return l_res;
 }
+
+/**
+ * @brief dap_cert_chain_file_save
+ * @param datum
+ */
+int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name)
+{
+    const char *s_system_chain_ca_dir = dap_config_get_item_str(g_config, "resources", "chain_ca_folder");
+    if(dap_strlen(s_system_chain_ca_dir) == 0) {
+        log_it(L_ERROR, "Not found 'chain_ca_folder' in .cfg file");
+        return -1;
+    }
+    dap_cert_t *cert = dap_cert_mem_load(datum->data, datum->header.data_size);
+    if(!cert) {
+        log_it(L_ERROR, "Can't load cert, size: %d", datum->header.data_size);
+        return -1;
+    }
+    const char *cert_name = cert->name;
+    size_t cert_path_length = dap_strlen(net_name) + dap_strlen(cert_name) + 9 + dap_strlen(s_system_chain_ca_dir);
+    char *cert_path = DAP_NEW_Z_SIZE(char, cert_path_length);
+    snprintf(cert_path, cert_path_length, "%s/%s/%s.dcert", s_system_chain_ca_dir, net_name, cert_name);
+    // In cert_path resolve all `..` and `.`s
+    char *cert_path_c = dap_canonicalize_filename(cert_path, NULL);
+    DAP_DELETE(cert_path);
+    // Protect the ca folder from using "/.." in cert_name
+    if(dap_strncmp(s_system_chain_ca_dir, cert_path_c, dap_strlen(s_system_chain_ca_dir))) {
+        log_it(L_ERROR, "Cert path '%s' is not in ca dir: %s", cert_path_c, s_system_chain_ca_dir);
+        return -1;
+    }
+    int l_ret = dap_cert_file_save(cert, cert_path_c);
+    DAP_DELETE(cert_path_c);
+//  if ( access( l_cert_path, F_OK ) != -1 ) {
+//      log_it (L_ERROR, "File %s is already exists.", l_cert_path);
+//      return -1;
+//  } else
+    return l_ret;
+}
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 2bfd2a0333a8f4c40a2e587e3345dfe915e26031..9b508ea967aa15045aba56c9ad7894d77e9fa4fe 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -218,3 +218,4 @@ dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain
 bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id);
 ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id);
 void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg);
+int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name);
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 03e2325aff9b83640bdc1399260b905999fdd501..cfe5e391974526e10d9b33c7b28111c2c6a7afb5 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -204,6 +204,13 @@ static void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg)
     a_ch->internal = NULL; // To prevent its cleaning in worker
 }
 
+void dap_stream_ch_chain_reset(dap_stream_ch_chain_t *a_ch_chain)
+{
+    if (!a_ch_chain)
+        return;
+    dap_worker_exec_callback_on(DAP_STREAM_CH(a_ch_chain)->stream_worker->worker, s_stream_ch_delete_in_proc, a_ch_chain);
+}
+
 /**
  * @brief s_stream_ch_chain_delete
  * @param a_ch_chain
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 9da9ca66e27378937655cd0fb6029a6c3d0b92ef..1cf9b8cb9ed0aa5fc7a95e1437303d9c5ce7a1f3 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -490,11 +490,12 @@ static bool s_net_send_records_callback_get_raw (dap_global_db_context_t * a_glo
                     DAP_DELETE(l_link);
                     continue;
                 }
-                dap_stream_ch_chain_pkt_write_inter( a_global_db_context->queue_worker_ch_io_input[l_link->worker->worker->id],
+                if (!dap_stream_ch_chain_pkt_write_inter( a_global_db_context->queue_worker_ch_io_input[l_link->worker->worker->id],
                                                      l_link->ch_uuid,
                                                      DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64,
                                                      l_chain_id.uint64, l_cell_id.uint64, l_data_out,
-                                                     sizeof(dap_global_db_pkt_t) + l_data_out->data_size);
+                                                     sizeof(dap_global_db_pkt_t) + l_data_out->data_size))
+                    debug_if(g_debug_reactor, L_ERROR, "Can't send pkt to worker (%d) for writing", l_link->worker->worker->id);
             }
             DAP_DELETE(l_data_out);
             if (it)
@@ -608,9 +609,10 @@ static bool s_net_send_atoms(dap_proc_thread_t *a_thread, void *a_arg)
                     DAP_DELETE(l_link);
                     continue;
                 }
-                dap_stream_ch_chain_pkt_write_mt(l_link->worker, l_link->ch_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN,
+                if(!dap_stream_ch_chain_pkt_write_mt(l_link->worker, l_link->ch_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN,
                                                  l_net->pub.id.uint64, l_chain->id.uint64, l_cell_id,
-                                                 l_obj_cur->value, l_obj_cur->value_len);
+                                                 l_obj_cur->value, l_obj_cur->value_len))
+                    debug_if(g_debug_reactor, L_ERROR, "Can't send atom to worker (%d) for writing", l_link->worker->worker->id);
             }
             s_atom_obj_free(l_obj_cur);
             if (it)
@@ -771,7 +773,8 @@ static bool dap_chain_net_link_is_present(dap_chain_net_t *a_net, dap_chain_node
         return false;
     dap_list_t *l_net_links = l_net_pvt->net_links;
     while(l_net_links) {
-        dap_chain_node_info_t *l_link_node_info = (dap_chain_node_info_t*) l_net_links->data;
+        struct net_link *l_net_link = (struct net_link*) l_net_links->data;
+        dap_chain_node_info_t *l_link_node_info = l_net_link->link_info;
         if(dap_chain_node_info_addr_match(l_link_node_info, a_link_node_info))
             return true;
         l_net_links = dap_list_next(l_net_links);
@@ -800,6 +803,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net)
              continue;
 
          if (l_link_addr->uint64 == l_own_addr) {
+             DAP_DELETE(l_link_addr);
              continue;   // Do not link with self
          }
          dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(a_net, l_link_addr);
@@ -814,6 +818,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net)
                     NODE_ADDR_FP_ARGS(l_link_addr));
              DAP_DELETE(l_link_node_info);
          }
+         DAP_DELETE(l_link_addr);
      }
 }
 
@@ -1059,18 +1064,20 @@ static void s_node_link_callback_stage(dap_chain_node_client_t * a_node_client,d
 static void s_node_link_callback_error(dap_chain_node_client_t * a_node_client, int a_error, void * a_arg)
 {
     dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
-    log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR, l_net->pub.name,
+    log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR, l_net? l_net->pub.name : "(unknown)" ,
            NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr));
-    struct json_object *l_json = net_states_json_collect(l_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);
-    char l_err_str[128] = { };
-    dap_snprintf(l_err_str, sizeof(l_err_str)
-                 , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d"
-                 , NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address), l_node_addr_str, a_error);
-    json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str));
-    dap_notify_server_send_mt(json_object_get_string(l_json));
-    json_object_put(l_json);
+    if (l_net){
+        struct json_object *l_json = net_states_json_collect(l_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);
+        char l_err_str[128] = { };
+        dap_snprintf(l_err_str, sizeof(l_err_str)
+                     , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d"
+                     , NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address), l_node_addr_str, a_error);
+        json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str));
+        dap_notify_server_send_mt(json_object_get_string(l_json));
+        json_object_put(l_json);
+    }
 }
 
 /**
@@ -1094,10 +1101,6 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client,
             l_net_pvt->links_connected_count--;
         else
             log_it(L_ERROR, "Links count is zero in delete callback");
-        // If the last link is lost, change the status to NET_STATE_OFFLINE
-        if(!l_net_pvt->links_connected_count) {
-            l_net_pvt->state = NET_STATE_OFFLINE;
-        }
     }
     dap_chain_net_sync_unlock(l_net, a_node_client);
     pthread_rwlock_wrlock(&l_net_pvt->rwlock);
@@ -1192,6 +1195,8 @@ static void s_net_state_link_prepare_error(dap_worker_t * a_worker,dap_chain_nod
     if(l_net_pvt->links_dns_requests)
         l_net_pvt->links_dns_requests--;
 
+    log_it(L_DEBUG, "Still %u link dns requests in process",l_net_pvt->links_dns_requests);
+
     if(!l_net_pvt->links_dns_requests ){
         if( l_net_pvt->state_target != NET_STATE_OFFLINE){
             log_it(L_WARNING,"Can't prepare links via DNS requests. Prefilling links with root addresses");
@@ -1481,6 +1486,13 @@ bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t
 {
     dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
     pthread_rwlock_wrlock(&l_net_pvt->rwlock);
+    bool l_not_found = dap_chain_net_sync_trylock_nolock(a_net, a_client);
+    pthread_rwlock_unlock(&l_net_pvt->rwlock);
+    return l_not_found;
+}
+
+bool dap_chain_net_sync_trylock_nolock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client) {
+    dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
     bool l_found = false;
     if (l_net_pvt->active_link) {
         for (dap_list_t *l_links = l_net_pvt->net_links; l_links; l_links = dap_list_next(l_links)) {
@@ -1501,7 +1513,6 @@ bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t
         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);
     }
-    pthread_rwlock_unlock(&l_net_pvt->rwlock);
     return !l_found;
 }
 
@@ -1511,15 +1522,14 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *
         return false;
     dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
     pthread_rwlock_wrlock(&l_net_pvt->rwlock);
+    bool l_ret = false;
     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;
-        pthread_rwlock_unlock(&l_net_pvt->rwlock);
-        dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid);
-        pthread_rwlock_wrlock(&l_net_pvt->rwlock);
+        dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid, false);
         if (l_status != NODE_SYNC_STATUS_WAITING) {
-            DAP_DELETE(l_uuid);
+            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);
@@ -1527,8 +1537,9 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *
             break;
         }
     }
+    l_ret = l_net_pvt->active_link;
     pthread_rwlock_unlock(&l_net_pvt->rwlock);
-    return l_net_pvt->active_link;
+    return l_ret;
 }
 /**
  * @brief dap_chain_net_client_create_n_connect
@@ -1801,11 +1812,15 @@ bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net)
     char *l_cache_dir = dap_strdup_printf( "%s/%s", g_sys_dir_path, "cache");
     if (dap_mkdir_with_parents(l_cache_dir) != 0) {
         log_it(L_WARNING,"Error during disposable cache check file creation");
+        DAP_DELETE(l_cache_dir);
         return false;
     }
     // create file, if it not presented. If file exists, ledger cache operation is stopped
     char *l_cache_file = dap_strdup_printf( "%s/%s.cache", l_cache_dir, "5B0FEEF6-B0D5-48A9-BFA2-32E8B294366D");
+    DAP_DELETE(l_cache_dir);
     if (dap_file_simple_test(l_cache_file)) {
+        log_it(L_WARNING, "Cache file '%s' already exists", l_cache_file);
+        DAP_DELETE(l_cache_file);
         return false;
     }
 
@@ -1825,6 +1840,7 @@ bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net)
     if (dap_file_simple_test(l_cache_file))
         s_chain_net_ledger_cache_reload(l_net);
     fclose(s_cache_file);
+    DAP_DELETE(l_cache_file);
     return true;
 }
 
@@ -2690,6 +2706,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                            l_net_pvt->node_info->hdr.links_number,
                            l_net_pvt->node_info->hdr.cell_id.uint64);
                 }
+                DAP_DELETE(l_addr_hash_str);
             }
             else{
                 log_it(L_WARNING, "Not present our own address %s in database", (l_node_alias_str) ? l_node_alias_str: "");
@@ -2868,6 +2885,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
         // Start the proc thread
         log_it(L_INFO, "Chain network \"%s\" initialized",l_net_item->name);
 
+        DAP_DELETE(l_node_addr_str);
         dap_config_close(l_cfg);
     }
     return 0;
@@ -3744,43 +3762,6 @@ static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash)
     return NULL;
 }
 
-/**
- * @brief dap_cert_chain_file_save
- * @param datum
- */
-int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name)
-{
-    const char *s_system_chain_ca_dir = dap_config_get_item_str(g_config, "resources", "chain_ca_folder");
-    if(dap_strlen(s_system_chain_ca_dir) == 0) {
-        log_it(L_ERROR, "Not found 'chain_ca_folder' in .cfg file");
-        return -1;
-    }
-    dap_cert_t *cert = dap_cert_mem_load(datum->data, datum->header.data_size);
-    if(!cert) {
-        log_it(L_ERROR, "Can't load cert, size: %d", datum->header.data_size);
-        return -1;
-    }
-    const char *cert_name = cert->name;
-    size_t cert_path_length = dap_strlen(net_name) + dap_strlen(cert_name) + 9 + dap_strlen(s_system_chain_ca_dir);
-    char *cert_path = DAP_NEW_Z_SIZE(char, cert_path_length);
-    snprintf(cert_path, cert_path_length, "%s/%s/%s.dcert", s_system_chain_ca_dir, net_name, cert_name);
-    // In cert_path resolve all `..` and `.`s
-    char *cert_path_c = dap_canonicalize_filename(cert_path, NULL);
-    DAP_DELETE(cert_path);
-    // Protect the ca folder from using "/.." in cert_name
-    if(dap_strncmp(s_system_chain_ca_dir, cert_path_c, dap_strlen(s_system_chain_ca_dir))) {
-        log_it(L_ERROR, "Cert path '%s' is not in ca dir: %s", cert_path_c, s_system_chain_ca_dir);
-        return -1;
-    }
-    int l_ret = dap_cert_file_save(cert, cert_path_c);
-    DAP_DELETE(cert_path_c);
-//  if ( access( l_cert_path, F_OK ) != -1 ) {
-//      log_it (L_ERROR, "File %s is already exists.", l_cert_path);
-//      return -1;
-//  } else
-    return l_ret;
-}
-
 /**
  * @brief dap_chain_datum_list
  * Get datum list by filter
@@ -3791,38 +3772,59 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name)
  */
 dap_list_t* dap_chain_datum_list(dap_chain_net_t *a_net, dap_chain_t *a_chain, datum_filter_func_t *a_filter_func, void *a_filter_func_param)
 {
-    dap_list_t *l_list = NULL;
+    dap_list_t *l_list = NULL;  
     if(!a_net)
-        return l_list;
+//        return l_list;
+//    void *l_chain_tmp = (void*) 0x1;
+//    dap_chain_t *l_chain_cur;
+        return NULL;
     void *l_chain_tmp = (void*) 0x1;
-    dap_chain_t *l_chain_cur;
-    if(a_chain)
-        l_chain_cur = a_chain;
-    else
-        l_chain_cur = dap_chain_enum(&l_chain_tmp);
+    dap_chain_t *l_chain_cur = a_chain ? a_chain : dap_chain_enum(&l_chain_tmp);
+    size_t l_sz;
+
     while(l_chain_cur) {
         // Use chain only for selected net and with callback_atom_get_datums
-        if(a_net->pub.id.uint64 == l_chain_cur->net_id.uint64 && l_chain_cur->callback_atom_get_datums) {
+        if(a_net->pub.id.uint64 == l_chain_cur->net_id.uint64 && l_chain_cur->callback_atom_get_datums)
+        {
             dap_chain_cell_t *l_cell = l_chain_cur->cells;
             size_t l_atom_size = 0;
             dap_chain_atom_iter_t *l_atom_iter = l_chain_cur->callback_atom_iter_create(l_chain_cur, l_cell->id, 0);
             dap_chain_atom_ptr_t l_atom = l_chain_cur->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
-            while(l_atom && l_atom_size) {
+            while(l_atom && l_atom_size)
+            {
                 size_t l_datums_count = 0;
                 dap_chain_datum_t **l_datums = l_chain_cur->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count);
+                dap_chain_datum_t *l_datum, *l_datum2;
                 for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) {
-                    dap_chain_datum_t *l_datum = l_datums[l_datum_n];
-                    if(l_datum) {
-                        // If there is a filter, then check the datum in it
-                        if(a_filter_func) {
-                            if(a_filter_func(l_datum, l_chain_cur, a_filter_func_param))
-                                l_list = dap_list_append(l_list, l_datum);
-                        }
-                        else
-                            l_list = dap_list_append(l_list, l_datum);
-                    }
+                    if ( ! (l_datum = l_datums[l_datum_n]) )
+                        continue;
+
+                    if ( a_filter_func)
+                        if ( !a_filter_func(l_datum, l_chain_cur, a_filter_func_param) )
+                            continue;
+//                    if(l_datum) {
+//                        // If there is a filter, then check the datum in it
+//                        if(a_filter_func) {
+//                            if(a_filter_func(l_datum, l_chain_cur, a_filter_func_param))
+//                                l_list = dap_list_append(l_list, l_datum);
+//                        }
+//                        else
+//                            l_list = dap_list_append(l_list, l_datum);
+//                    }
+                    /*
+                    * Make a copy of the datum, copy is placed into the list,
+                    * so don't forget to free whole list
+                    */
+                   l_sz = sizeof(dap_chain_datum_t) + l_datum->header.data_size + 16;
+                   l_datum2 = DAP_NEW_Z_SIZE(dap_chain_datum_t, l_sz);
+                   assert ( l_datum2 );
+                   memcpy(l_datum2, l_datum, l_sz);
+
+                   /* Add new entry into the list */
+                   l_list = dap_list_append(l_list, l_datum2);
+
                 }
-                DAP_DELETE(l_datums);
+                DAP_DEL_Z(l_datums);
                 // go to next transaction
                 l_atom = l_chain_cur->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
             }
@@ -3901,7 +3903,7 @@ int dap_chain_datum_add(dap_chain_t * a_chain, dap_chain_datum_t *a_datum, size_
         }break;
         case DAP_CHAIN_DATUM_CA:{
 
-            if ( dap_cert_chain_file_save(a_datum, a_chain->net_name) < 0 )
+            if (dap_cert_chain_file_save(a_datum, a_chain->net_name) < 0)
                 return -5;
         }break;
         case DAP_CHAIN_DATUM_SIGNER:
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index e97b4f724170c8a1e79d22085efffc598c5ad885..11dcbf7cabce78e04f8d3680dd6f74c96f67cb38 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -95,17 +95,17 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
 //                    "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n"
             );
     dap_cli_server_cmd_add("mempool", com_signer, "Sign operations",
-               "mempool sign -cert <cert name> -net <net name> -chain <chain name> -file <filename> [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n"
-               "mempool check -cert <cert name> -net <net name> {-file <filename> | -hash <hash>} [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n"
+               "mempool sign -cert <priv_cert_name> -net <net_name> -chain <chain_name> -file <filename> [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n"
+               "mempool check -cert <priv_cert_name> -net <net_name> {-file <filename> | -hash <hash>} [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n"
                                           );
     dap_cli_server_cmd_add("node", com_node, "Work with node",
-            "node add  -net <net name> {-addr <node address> | -alias <node alias>} -port <port> -cell <cell id>  {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n"
-                    "node del -net <net name> {-addr <node address> | -alias <node alias>}\n\n"
-                    "node link {add | del}  -net <net name> {-addr <node address> | -alias <node alias>} -link <node address>\n\n"
-                    "node alias -addr <node address> -alias <node alias>\n\n"
-                    "node connect -net <net name> {-addr <node address> | -alias <node alias> | auto}\n\n"
-                    "node handshake -net <net name> {-addr <node address> | -alias <node alias>}\n"
-                    "node dump -net <net name> [ -addr <node address> | -alias <node alias>] [-full]\n\n"
+            "node add  -net <net_name> {-addr <node_address> | -alias <node_alias>} -port <port> -cell <cell id>  {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n"
+                    "node del -net <net_name> {-addr <node_address> | -alias <node_alias>}\n\n"
+                    "node link {add | del}  -net <net_name> {-addr <node_address> | -alias <node_alias>} -link <node_address>\n\n"
+                    "node alias -addr <node_address> -alias <node_alias>\n\n"
+                    "node connect -net <net_name> {-addr <node_address> | -alias <node_alias> | auto}\n\n"
+                    "node handshake -net <net_name> {-addr <node_address> | -alias <node_alias>}\n"
+                    "node dump -net <net_name> [ -addr <node_address> | -alias <node_alias>] [-full]\n\n"
                                         );
     dap_cli_server_cmd_add ("ping", com_ping, "Send ICMP ECHO_REQUEST to network hosts",
             "ping [-c <count>] host\n");
@@ -127,13 +127,13 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
                                         "\tObtain help for <command> or get the total list of the commands\n"
                                         );
     dap_cli_server_cmd_add("wallet", com_tx_wallet, "Wallet operations",
-            "wallet {new -w <wallet_name> [-sign <sign_type>] [-restore <hex value>] [-net <net_name>] [-force]| list | info {-addr <addr> | -w <wallet_name>} -net <net_name>}\n");
+            "wallet {new -w <wallet_name> [-sign <sign_type>] [-restore <hex_value>] [-net <net_name>] [-force] | list | info {-addr <addr> | -w <wallet_name>} -net <net_name>}\n");
 
     // Token commands
     dap_cli_server_cmd_add ("token_update", com_token_update, "Token update",
             "\nPrivate token update\n"
-            "token_update -net <net name> -chain <chain name> -token <token ticker> [-type private] [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n"
-            "\t   Update private token <token ticker> for <netname>:<chain name> with"
+            "token_update -net <net_name> -chain <chain_name> -token <token_ticker> [-type private] [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n"
+            "\t   Update private token <token_ticker> for <netname>:<chain_name> with"
             "\t   custom parameters list <Param 1>, <Param 2>...<Param N>."
             "\n"
             "==Params==\n"
@@ -182,18 +182,18 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
     // Token commands
     dap_cli_server_cmd_add ("token_decl", com_token_decl, "Token declaration",
             "Simple token declaration:\n"
-            "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -total_supply <total supply> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n"
-            "\t  Declare new simple token for <netname>:<chain name> with ticker <token ticker>, maximum emission <total supply> and <signs for emission> from <signs total> signatures on valid emission\n"
+            "token_decl -net <net_name> -chain <chain_name> -token <token_ticker> -total_supply <total supply> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n"
+            "\t  Declare new simple token for <netname>:<chain_name> with ticker <token_ticker>, maximum emission <total supply> and <signs for emission> from <signs total> signatures on valid emission\n"
             "\nExtended private token declaration\n"
-            "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -type private -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n"
+            "token_decl -net <net_name> -chain <chain_name> -token <token_ticker> -type private -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n"
             "\t [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n"
-            "\t   Declare new token for <netname>:<chain name> with ticker <token ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n"
+            "\t   Declare new token for <netname>:<chain_name> with ticker <token_ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n"
             "\t   and custom parameters list <Param 1>, <Param 2>...<Param N>.\n"
             "\nExtended CF20 token declaration\n"
-            "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -type CF20 -decimals <18> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>"
+            "token_decl -net <net_name> -chain <chain_name> -token <token_ticker> -type CF20 -decimals <18> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>"
             "\t -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n"
             "\t [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n"
-            "\t   Declare new token for <netname>:<chain name> with ticker <token ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n"
+            "\t   Declare new token for <netname>:<chain_name> with ticker <token_ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n"
             "\t   and custom parameters list <Param 1>, <Param 2>...<Param N>.\n"
             "\n"
             "==Flags=="
@@ -227,67 +227,67 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             );
 
     dap_cli_server_cmd_add ("token_decl_sign", com_token_decl_sign, "Token declaration add sign",
-            "token_decl_sign -net <net name> -chain <chain name> -datum <datum_hash> -certs <certs list>\n"
+            "token_decl_sign -net <net_name> -chain <chain_name> -datum <datum_hash> -certs <certs list>\n"
             "\t Sign existent <datum hash> in mempool with <certs list>\n"
             );
 
     dap_cli_server_cmd_add ("token_emit", com_token_emit, "Token emission",
-            "token_emit {sign | -token <token ticker> -emission_value <val>} -net <net name> [-chain_emission <chain for emission>] [-chain_base_tx <chain for base tx> -addr <addr>] -certs <cert list>\n");
+            "token_emit {sign | -token <mempool_token_ticker> -emission_value <val>} -net <net_name> [-chain_emission <chain_name>] [-chain_base_tx <chain_name> -addr <addr>] -certs <cert list>\n");
 
     dap_cli_server_cmd_add ("mempool_list", com_mempool_list, "List mempool entries for selected chain network",
-            "mempool_list -net <net name>\n");
+            "mempool_list -net <net_name>\n");
 
     dap_cli_server_cmd_add ("mempool_proc", com_mempool_proc, "Proc mempool entrie with specified hash for selected chain network",
-            "mempool_proc -net <net name> -datum <datum hash>\n");
+            "mempool_proc -net <net_name> -datum <datum hash>\n");
 
     dap_cli_server_cmd_add ("mempool_delete", com_mempool_delete, "Delete datum with hash <datum hash> for selected chain network",
-            "mempool_delete -net <net name> -datum <datum hash>\n");
+            "mempool_delete -net <net_name> -datum <datum hash>\n");
 
     dap_cli_server_cmd_add ("mempool_add_ca", com_mempool_add_ca,
                                         "Add pubic certificate into the mempool to prepare its way to chains",
-            "mempool_add_ca -net <net name> [-chain <chain name>] -ca_name <Certificate name>\n");
+            "mempool_add_ca -net <net_name> [-chain <chain_name>] -ca_name <priv_cert_name>\n");
 
     dap_cli_server_cmd_add ("chain_ca_pub", com_chain_ca_pub,
                                         "Add pubic certificate into the mempool to prepare its way to chains",
-            "chain_ca_pub -net <net name> [-chain <chain name>] -ca_name <Certificate name>\n");
+            "chain_ca_pub -net <net_name> [-chain <chain_name>] -ca_name <priv_cert_name>\n");
 
     dap_cli_server_cmd_add ("chain_ca_copy", com_chain_ca_copy,
                                         "Copy pubic certificate into the mempool to prepare its way to chains",
-            "chain_ca_copy -net <net name> [-chain <chain name>] -ca_name <Public certificate name>\n");
+            "chain_ca_copy -net <net_name> [-chain <chain_name>] -ca_name <pub_cert_name>\n");
 
     // Transaction commands
     dap_cli_server_cmd_add ("tx_create", com_tx_create, "Make transaction",
-            "tx_create -net <net name> -chain <chain name> {-from_wallet <name> -token <token ticker> -value <value> -to_addr <addr> | -from_emission <emission_hash>} [-fee <addr> -value_fee <val>]\n" );
+            "tx_create -net <net_name> -chain <chain_name> {-from_wallet <wallet_name> -token <token_ticker> -value <value> -to_addr <addr> | -from_emission <emission_hash>} [-fee <addr> -value_fee <val>]\n" );
     dap_cli_server_cmd_add ("tx_create_json", com_tx_create_json, "Make transaction",
-                "tx_create_json -net <net name> -chain <chain name> -json <json file path>\n" );
+                "tx_create_json -net <net_name> -chain <chain_name> -json <json_file_path>\n" );
     dap_cli_server_cmd_add ("tx_cond_create", com_tx_cond_create, "Make cond transaction",
-                                        "tx_cond_create -net <net name> -token <token ticker> -wallet <from wallet> -cert <public cert> -value <value datoshi> -unit {mb | kb | b | sec | day} -srv_uid <numeric uid>\n" );
+                                        "tx_cond_create -net <net_name> -token <token_ticker> -wallet <wallet_name> -cert <pub_cert_name> -value <value_datoshi> -unit {mb | kb | b | sec | day} -srv_uid <numeric_uid>\n" );
 
     dap_cli_server_cmd_add ("tx_verify", com_tx_verify, "Verifing transaction in mempool",
-            "tx_verify -net <net name> -chain <chain name> -tx <tx_hash>\n" );
+            "tx_verify -net <net_name> -chain <chain_name> -tx <tx_hash>\n" );
 
     // Transaction history
     dap_cli_server_cmd_add("tx_history", com_tx_history, "Transaction history (for address or by hash)",
-            "tx_history  {-addr <addr> | -w <wallet name> | -tx <tx_hash>} -net <net name> -chain <chain name>\n");
+            "tx_history  {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} -net <net_name> -chain <chain_name>\n");
 
     // Ledger info
     dap_cli_server_cmd_add("ledger", com_ledger, "Ledger information",
-            "ledger list coins -net <network name>\n"
-            "ledger list threshold [-hash <tx_treshold_hash>] -net <network name>\n"
-            "ledger list balance -net <network name>\n"
-            "ledger info -hash <tx_hash> -net <network name> [-unspent]\n"
-            "ledger tx -all -net <network name>\n"
-            "ledger tx {-addr <addr> | -w <wallet name> | -tx <tx_hash>} [-chain <chain name>] -net <network name>\n");
+            "ledger list coins -net <net_name>\n"
+            "ledger list threshold [-hash <tx_treshold_hash>] -net <net_name>\n"
+            "ledger list balance -net <net_name>\n"
+            "ledger info -hash <tx_hash> -net <net_name> [-unspent]\n"
+            "ledger tx -all -net <net_name>\n"
+            "ledger tx {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} [-chain <chain_name>] -net <net_name>\n");
 
     // Token info
     dap_cli_server_cmd_add("token", com_token, "Token info",
-            "token list -net <network name>\n"
-            "token info -net <network name> -name <token name>\n"
-            "token tx [all | -addr <wallet_addr> | -wallet <wallet_name>] -name <token name> -net <network name> [-page_start <page>] [-page <page>]\n");
+            "token list -net <net_name>\n"
+            "token info -net <net_name> -name <token_ticker>\n"
+            "token tx [all | -addr <wallet_addr> | -wallet <wallet_name>] -name <token_ticker> -net <net_name> [-page_start <page>] [-page <page>]\n");
 
     // Log
     dap_cli_server_cmd_add ("print_log", com_print_log, "Print log info",
-                "print_log [ts_after <timestamp >] [limit <line numbers>]\n" );
+                "print_log [ts_after <timestamp>] [limit <line_numbers>]\n" );
 
     // Statisticss
     dap_cli_server_cmd_add("stats", com_stats, "Print statistics",
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index b3ca737d0ca2ca1a623458dc008c5ba792de2b75..5837cd4897b0cec8a0dd3c92b8e77321c95f166a 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -481,10 +481,8 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons
             l_time_str[0] = ' ', l_time_str[1] = '\0';                      /* Prefill string with the space */
 
             if ( l_tx->header.ts_created) {
-                struct tm l_tm;                                             /* Convert ts to  Sat May 17 01:17:08 2014 */
                 uint64_t l_ts = l_tx->header.ts_created;
-                if ( (localtime_r((time_t *) &l_ts, &l_tm )) )
-                    asctime_r (&l_tm, l_time_str);
+                dap_ctime_r(&l_ts, l_time_str);                             /* Convert ts to  Sat May 17 01:17:08 2014 */
             }
 
             char *l_tx_hash_str;
@@ -788,14 +786,16 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
 
     //switch ledger params list | tx | info
     int l_cmd = CMD_NONE;
-    if (dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "list", NULL)){
+    if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "list", NULL)){
         l_cmd = CMD_LIST;
-    } else if (dap_cli_server_cmd_find_option_val(a_argv, 1, 2, "tx", NULL)){
+    } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "tx", NULL)){
         l_cmd = CMD_TX_HISTORY;
-    } else if (dap_cli_server_cmd_find_option_val(a_argv, 2, 3, "info", NULL))
+    } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "info", NULL))
         l_cmd = CMD_TX_INFO;
 
-    bool l_is_all = dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-all", NULL);
+    bool l_is_all = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-all", NULL);
+
+    arg_index++;
 
     // command tx_history
     if(l_cmd == CMD_TX_HISTORY) {
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index fc0826f2361f80f52341ff9a6914cbdb15c14a1c..911dd035f443dd7811d5d06fe99b9b78c0d1c06e 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -152,13 +152,13 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
     bool l_is_last_attempt = a_arg ? true : false;
     if (l_is_last_attempt) {
         pthread_mutex_lock(&l_node_client->wait_mutex);
+        pthread_mutex_unlock(&l_node_client->wait_mutex);
         l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED;
 #ifndef _WIN32
         pthread_cond_broadcast(&l_node_client->wait_cond);
 #else
         SetEvent( l_node_client->wait_cond );
 #endif
-        pthread_mutex_unlock(&l_node_client->wait_mutex);
         l_node_client->esocket_uuid = 0;
 
         dap_chain_net_sync_unlock(l_node_client->net, l_node_client);
@@ -196,7 +196,13 @@ static void s_node_client_connected_synchro_start_callback(dap_worker_t *a_worke
         DAP_DELETE(a_arg);
 }
 
-dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *a_uuid)
+/**
+ * @brief dap_chain_node_client_start_sync
+ * @param a_uuid
+ * @param a_wrlock
+ * @return
+ */
+dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *a_uuid, bool a_wrlock)
 {
     dap_chain_node_client_handle_t *l_client_found = NULL;
     HASH_FIND(hh, s_clients, a_uuid, sizeof(*a_uuid), l_client_found);
@@ -228,7 +234,9 @@ dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_
                     // If we do nothing - init sync process
 
                     if (l_ch_chain->state == CHAIN_STATE_IDLE) {
-                        if (dap_chain_net_sync_trylock(l_net, l_node_client)) {
+                        bool l_trylocked = a_wrlock ? dap_chain_net_sync_trylock(l_net, l_node_client)
+                                                    : dap_chain_net_sync_trylock_nolock(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);
@@ -258,7 +266,7 @@ 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);
+    dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid, true);
     if (l_status == NODE_SYNC_STATUS_MISSING) {
         DAP_DELETE(l_uuid);
         return false;
@@ -344,6 +352,8 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
                 }
             }
         }
+        pthread_mutex_lock(&l_node_client->wait_mutex);
+        pthread_mutex_unlock(&l_node_client->wait_mutex);
 #ifndef _WIN32
         pthread_cond_broadcast(&l_node_client->wait_cond);
 #else
@@ -410,10 +420,11 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
         dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size,
         void * a_arg)
 {
-    UNUSED(a_ch_chain);
     UNUSED(a_pkt_data_size);
     dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t *) a_arg;
-
+    dap_chain_net_t *l_net = l_node_client->net;
+    assert(l_net);
+    bool l_finished = false;
     switch (a_pkt_type) {
         case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR:
             dap_snprintf(l_node_client->last_error, sizeof(l_node_client->last_error),
@@ -421,12 +432,10 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
             log_it(L_WARNING, "In: Received packet DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR with error \"%s\"",
                     l_node_client->last_error);
             l_node_client->state = NODE_CLIENT_STATE_ERROR;
-
-    #ifndef _WIN32
-            pthread_cond_broadcast(&l_node_client->wait_cond);
-    #else
-            SetEvent( l_node_client->wait_cond );
-    #endif
+            if (!strcmp(l_node_client->last_error, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS")) {
+                dap_stream_ch_chain_reset(a_ch_chain);
+                l_finished = true;
+            }
         break;
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ:{
             l_node_client->state = NODE_CLIENT_STATE_SYNC_GDB_UPDATES;
@@ -454,8 +463,6 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
         }break;
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB:
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS: {
-            dap_chain_net_t *l_net = l_node_client->net;
-            assert(l_net);
             dap_chain_id_t  l_chain_id = {};
             dap_chain_cell_id_t l_cell_id = {};
             if (a_pkt_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB) {
@@ -464,7 +471,8 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
                         log_it(L_INFO,"In: Link %s."NODE_ADDR_FP_STR" synced GDB. Going to update chains", l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr ));
                     l_node_client->cur_chain = l_net->pub.chains;
                     l_node_client->cur_cell = l_node_client->cur_chain ? l_node_client->cur_chain->cells : NULL;
-                }
+                } else
+                    l_node_client->cur_chain = NULL;
             } else {
                 // Check if we over with it before
                 if ( ! l_node_client->cur_cell ){
@@ -504,28 +512,31 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
                 dap_stream_ch_chain_pkt_write_unsafe(l_node_client->ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ,
                                                      l_net->pub.id.uint64 ,
                                                      l_chain_id.uint64,l_cell_id.uint64,NULL,0);
-            }else{ // If no - over with sync process
+            } else { // If no - over with sync process
                 log_it(L_INFO, "In: State node %s."NODE_ADDR_FP_STR" is SYNCED",l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_node_addr) );
-                bool l_have_waiting = dap_chain_net_sync_unlock(l_net, l_node_client);
-                l_node_client->state = NODE_CLIENT_STATE_SYNCED;
-                if (dap_chain_net_get_target_state(l_net) == NET_STATE_ONLINE) {
-                    dap_timerfd_reset(l_node_client->sync_timer);
-                    dap_chain_net_set_state(l_net, NET_STATE_ONLINE);
-                } 
-                else if (!l_have_waiting)
-                {
-                    #ifndef _WIN32
-                        pthread_cond_broadcast(&l_node_client->wait_cond);
-                    #else
-                        SetEvent( l_node_client->wait_cond );
-                    #endif
-                    // l_node_client object is not presented after dap_chain_net_state_go_to with NET_STATE_OFFLINE
-                    dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE);
-                }
+                l_finished = true;
             }
         } break;
         default: break;
     }
+    if (l_finished) {
+#ifndef _WIN32
+        pthread_cond_broadcast(&l_node_client->wait_cond);
+#else
+        SetEvent( l_node_client->wait_cond);
+#endif
+        bool l_have_waiting = dap_chain_net_sync_unlock(l_net, l_node_client);
+        l_node_client->state = NODE_CLIENT_STATE_SYNCED;
+        if (dap_chain_net_get_target_state(l_net) == NET_STATE_ONLINE) {
+            dap_timerfd_reset(l_node_client->sync_timer);
+            dap_chain_net_set_state(l_net, NET_STATE_ONLINE);
+        }
+        else if (!l_have_waiting)
+        {
+            // l_node_client object is not presented after dap_chain_net_state_go_to with NET_STATE_OFFLINE
+            dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE);
+        }
+    }
 }
 
 
@@ -639,8 +650,8 @@ static int s_save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_req
     int l_ret = 0;
     if(!a_request)
         return -1;
-    long l_t1_ms = (long) a_request->send_time1.tv_sec * 1000 + a_request->send_time1.tv_usec / 1000;
-    long l_t2_ms = (long) a_request->recv_time1.tv_sec * 1000 + a_request->recv_time1.tv_usec / 1000;
+    long l_t1_ms = a_request->send_time1.tv_sec * 1000 + a_request->send_time1.tv_nsec / 1e6;
+    long l_t2_ms = a_request->recv_time1.tv_sec * 1000 + a_request->recv_time1.tv_nsec / 1e6;
     struct json_object *jobj = json_object_new_object();
     time_t l_cur_t = time(NULL);
     char buf[1024];
@@ -852,8 +863,11 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
     HASH_FIND(hh,s_clients,&a_client->uuid,sizeof(a_client->uuid),l_client_found);
     if (l_client_found) {
 
-        if (l_client_found->client->sync_timer)
+        if (l_client_found->client->sync_timer) {
+            // Free memory callback_arg=uuid
+            DAP_DELETE(l_client_found->client->sync_timer->callback_arg);
             dap_timerfd_delete(l_client_found->client->sync_timer);
+        }
 
         HASH_DEL(s_clients,l_client_found);
         DAP_DELETE(l_client_found);
diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h
index 3026a70ba0da367e49304a64f484dd9aeafad376..14a0cbb542e9a22cb80339bc559be024060b0c1e 100644
--- a/modules/net/include/dap_chain_node_client.h
+++ b/modules/net/include/dap_chain_node_client.h
@@ -188,7 +188,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
 
 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_events_socket_uuid_t *l_uuid, bool a_wrlock);
 
 static inline const char * dap_chain_node_client_state_to_str( dap_chain_node_client_state_t a_state)
 {
diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c
index 84b92fe75fa4209d419229c9883825feca0966a8..ace4bf6002ab4d0348d8a94865426775edf9d597 100644
--- a/modules/net/srv/dap_chain_net_srv_client.c
+++ b/modules/net/srv/dap_chain_net_srv_client.c
@@ -119,8 +119,8 @@ static void s_srv_client_pkt_in(dap_stream_ch_chain_net_srv_t *a_ch_chain, uint8
                                               l_srv_client->callbacks_arg);
             break;
         }
-        struct timeval l_recv_time;
-        gettimeofday(&l_recv_time, NULL);
+        struct timespec l_recv_time;
+        clock_gettime(CLOCK_REALTIME, &l_recv_time);
         l_response->recv_time1 = l_recv_time;
         dap_chain_hash_fast_t l_data_hash;
         dap_hash_fast(l_response->data, l_response->data_size, &l_data_hash);
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index 2273807c230919401a2df16334f6b59300b2752f..e42da15fa07f4eb2493ff6046702cee35b52ea39 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -165,22 +165,16 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_error{
 
 // data packet for connectiont test
 typedef struct dap_stream_ch_chain_net_srv_pkt_test {
-    uint32_t usage_id;
-    dap_chain_net_id_t net_id;
+    uint32_t                usage_id;
+    dap_chain_net_id_t      net_id;
     dap_chain_net_srv_uid_t srv_uid;
-    int32_t  time_connect_ms;
-    struct timeval recv_time1;
-    struct timespec recv_time2;
-    struct timeval send_time1;
-    struct timeval send_time2;
-    byte_t ip_send[16];
-    byte_t ip_recv[16];
-    int32_t err_code;
-    uint64_t data_size_send;
-    uint64_t data_size_recv;
-    uint64_t data_size;
-    dap_chain_hash_fast_t data_hash;
-    uint8_t data[];
+    int32_t                 time_connect_ms;
+    struct timespec         recv_time1, recv_time2, send_time1, send_time2;
+    byte_t                  ip_send[INET_ADDRSTRLEN], ip_recv[INET_ADDRSTRLEN];
+    int32_t                 err_code;
+    uint64_t                data_size_send, data_size_recv, data_size;
+    dap_chain_hash_fast_t   data_hash;
+    uint8_t                 data[];
 } DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_test_t;
 
 typedef struct dap_chain_net_srv dap_chain_net_srv_t;
diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c
index 75b81fec1b19f9dde0851ac76a2ac6f895daa975..9362ed3f250cd9d97573d994ef9ac6e1bdd9afb6 100644
--- a/modules/service/datum/dap_chain_net_srv_datum.c
+++ b/modules/service/datum/dap_chain_net_srv_datum.c
@@ -41,9 +41,9 @@ void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group,
 int dap_chain_net_srv_datum_init()
 {
     dap_cli_server_cmd_add("srv_datum", s_srv_datum_cli, "Service Datum commands", 
-        "srv_datum -net <chain net name> -chain <chain name> datum save -datum <datum hash>\n"
+        "srv_datum -net <net_name> -chain <chain_name> datum save -datum <datum_hash>\n"
             "\tSaving datum from mempool to file.\n\n"
-        "srv_datum -net <chain net name> -chain <chain name> datum load -datum <datum hash>\n"
+        "srv_datum -net <net_name> -chain <chain_name> datum load -datum <datum_hash>\n"
             "\tLoad datum custum from file to mempool.\n\n");
     s_srv_datum = DAP_NEW_Z(dap_chain_net_srv_t);
     s_srv_datum->uid.uint64 = DAP_CHAIN_NET_SRV_DATUM_ID;
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index edbce30708106c24a6ec057057ed3e07873883b7..ecac0fa8833a4c4374ea4bcb68c51676fb5510d6 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -504,9 +504,9 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
 
 
     // measuring connection time
-    struct timeval l_t;
-    gettimeofday(&l_t, NULL);//get_cur_time_msec
-    long l_t1 = (long) l_t.tv_sec * 1000 + l_t.tv_usec / 1000;
+    struct timespec l_t;
+    clock_gettime(CLOCK_REALTIME, &l_t);//get_cur_time_msec
+    long l_t1 = l_t.tv_sec * 1000 + l_t.tv_nsec / 1e6;
 
     const char l_active_channels[] = { dap_stream_ch_chain_net_srv_get_id(), 0 }; //only R, without S
     if(a_ipv4_str)
@@ -533,9 +533,9 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
         return -3;
     }
 
-    gettimeofday(&l_t, NULL);
-    long l_t2 = (long) l_t.tv_sec * 1000 + l_t.tv_usec / 1000;
-    int l_dtime_connect_ms = l_t2-l_t1;
+    clock_gettime(CLOCK_REALTIME, &l_t);
+    long l_t2 = l_t.tv_sec * 1000 + l_t.tv_nsec / 1e6;
+    int l_dtime_connect_ms = l_t2 - l_t1;
 
     //l_ret = dap_chain_net_vpn_client_tun_init(a_ipv4_str);
 
@@ -555,8 +555,8 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
             if(a_ipv4_str)
                 memcpy(l_request->ip_recv, a_ipv4_str, min(sizeof(l_request->ip_recv), strlen(a_ipv4_str)));
             l_request->time_connect_ms = l_dtime_connect_ms;
-            gettimeofday(&l_t, NULL);
-            l_t = l_request->send_time1;
+            clock_gettime(CLOCK_REALTIME, &l_t);
+            l_request->send_time1 = l_t;
             size_t l_request_size = l_request->data_size + sizeof(dap_stream_ch_chain_net_srv_pkt_test_t);
             dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_REQUEST, l_request, l_request_size);
             dap_stream_ch_set_ready_to_write_unsafe(l_ch, true);