diff --git a/dap-sdk b/dap-sdk
index be69f08335f87c02611bde352b3062f21eed1ef8..fa8ebb3bc4e5a9aaa9782f52199d2b00307f7ca2 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit be69f08335f87c02611bde352b3062f21eed1ef8
+Subproject commit fa8ebb3bc4e5a9aaa9782f52199d2b00307f7ca2
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index 9d73093321f8b4f7b8fb907a4d211caf5310ade9..8415b5b77d1b2ef8d267e376f78a70805b6207ff 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -680,31 +680,36 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not
  * @param a_atom_hash
  * @return
  */
-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)
+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_cell_id)
 {
-    bool l_ret = false;
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cel_id, 0);
-    dap_chain_atom_ptr_t * l_lasts_atom;
-    size_t l_lasts_atom_count = 0;
-    size_t* l_lasts_atom_size = NULL;
-    l_lasts_atom = a_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_atom_count, &l_lasts_atom_size);
-    if (l_lasts_atom && l_lasts_atom_count) {
-        assert(l_lasts_atom_size[0]);
-        assert(l_lasts_atom[0]);
-        if(a_atom_hash){
-            dap_hash_fast(l_lasts_atom[0], l_lasts_atom_size[0], a_atom_hash);
-            if(dap_log_level_get() <= L_DEBUG) {
-                char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
-                dap_chain_hash_fast_to_str(a_atom_hash, l_hash_str, sizeof(l_hash_str));
-                log_it(L_DEBUG, "Send sync chain request from %s to infinity",l_hash_str);
-            }
-        }
-        l_ret = true;
-    }
-    a_chain->callback_atom_iter_delete(l_atom_iter);
+    dap_chain_atom_iter_t *l_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id, false);
+    dap_chain_atom_ptr_t *l_ptr_list = a_chain->callback_atom_iter_get_lasts(l_iter, NULL, NULL);
+    DAP_DEL_Z(l_ptr_list);
+    *a_atom_hash = l_iter->cur_hash ? *l_iter->cur_hash : (dap_hash_fast_t){0};
+    bool l_ret = l_iter->cur_hash;
+    a_chain->callback_atom_iter_delete(l_iter);
     return l_ret;
 }
 
+struct chain_thread_notifier {
+    dap_chain_callback_notify_t callback;
+    void *callback_arg;
+    dap_chain_t *chain;
+    dap_chain_cell_id_t cell_id;
+    void *atom;
+    size_t atom_size;
+};
+
+static bool s_notify_atom_on_thread(void *a_arg)
+{
+    struct chain_thread_notifier *l_arg = a_arg;
+    assert(l_arg->atom && l_arg->callback);
+    l_arg->callback(l_arg->callback_arg, l_arg->chain, l_arg->cell_id, l_arg->atom, l_arg->atom_size);
+    DAP_DELETE(l_arg->atom);
+    DAP_DELETE(l_arg);
+    return false;
+}
+
 ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_atom, size_t a_atom_size, dap_hash_fast_t *a_new_atom_hash)
 {
     dap_return_val_if_fail(a_chain_cell && a_chain_cell->chain, -1);
@@ -727,7 +732,20 @@ ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_ato
         dap_list_t *l_iter;
         DL_FOREACH(l_chain->atom_notifiers, l_iter) {
             dap_chain_atom_notifier_t *l_notifier = (dap_chain_atom_notifier_t*)l_iter->data;
-            l_notifier->callback(l_notifier->arg, l_chain, a_chain_cell->id, (void*)a_atom, a_atom_size);
+            struct chain_thread_notifier *l_arg = DAP_NEW_Z(struct chain_thread_notifier);
+            if (!l_arg) {
+                log_it(L_CRITICAL, g_error_memory_alloc);
+                continue;
+            }
+            *l_arg = (struct chain_thread_notifier) { .callback = l_notifier->callback, .callback_arg = l_notifier->arg,
+                                                      .chain = l_chain, .cell_id = a_chain_cell->id, .atom_size = a_atom_size };
+            l_arg->atom = DAP_DUP_SIZE(a_atom, a_atom_size);
+            if (!l_arg->atom) {
+                DAP_DELETE(l_arg);
+                log_it(L_CRITICAL, g_error_memory_alloc);
+                continue;
+            }
+            dap_proc_thread_callback_add(NULL, s_notify_atom_on_thread, l_arg);
         }
     }
     if (l_chain->callback_atom_add_from_treshold) {
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index cd90370807ec279a8e1c5a1910160f5c7cd23b3e..df21f65198adf8f2c013def65e4581c1b8e83eb2 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -258,7 +258,7 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net
 void dap_chain_delete(dap_chain_t * a_chain);
 void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg);
 dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
-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);
+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_cell_id);
 ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_atom, size_t a_atom_size, dap_hash_fast_t *a_new_atom_hash);
 int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name);
 const char* dap_chain_get_path(dap_chain_t *a_chain);
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index ce52243862909d53b533f5274a1140424fa7dfb5..56d2b9c00ecb731e94a54f767c0573cd432ba588 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -50,7 +50,6 @@ enum s_esbocs_session_state {
 };
 
 static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_validators);
-static void s_get_last_block_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_last_hash_ptr);
 static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s_esbocs_session_state a_new_state, dap_time_t a_time);
 static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_node_addr, dap_chain_node_addr_t *a_receiver_node_addr,
                                 dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size);
@@ -346,14 +345,14 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d
     dap_global_db_objs_delete(l_objs, l_objs_count);
 }
 
-static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t UNUSED_ARG a_id,
+static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id,
                                 void *a_atom, size_t a_atom_size)
 {
     dap_chain_esbocs_session_t *l_session = a_arg;
     assert(l_session->chain == a_chain);
     pthread_mutex_lock(&l_session->mutex);
     dap_chain_hash_fast_t l_last_block_hash;
-    s_get_last_block_hash(l_session->chain, &l_last_block_hash);
+    dap_chain_get_atom_last_hash(l_session->chain, &l_last_block_hash, a_id);
     if (!dap_hash_fast_compare(&l_last_block_hash, &l_session->cur_round.last_block_hash))
         s_session_round_new(l_session);
     pthread_mutex_unlock(&l_session->mutex);
@@ -784,15 +783,6 @@ static dap_list_t *s_get_validators_list(dap_chain_esbocs_session_t *a_session,
     return l_ret;
 }
 
-static void s_get_last_block_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_last_hash_ptr)
-{
-    dap_chain_atom_iter_t *l_iter = a_chain->callback_atom_iter_create(a_chain, c_dap_chain_cell_id_null, false);
-    dap_chain_atom_ptr_t *l_ptr_list = a_chain->callback_atom_iter_get_lasts(l_iter, NULL, NULL);
-    DAP_DEL_Z(l_ptr_list);
-    *a_last_hash_ptr = l_iter->cur_hash ? *l_iter->cur_hash : (dap_hash_fast_t){0};
-    a_chain->callback_atom_iter_delete(l_iter);
-}
-
 static int s_callback_addr_compare(dap_list_t *a_list_elem, dap_list_t *a_addr_elem)
 {
     dap_chain_esbocs_validator_t *l_validator = a_list_elem->data;
@@ -831,7 +821,7 @@ static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session)
     if (a_session->cur_round.sync_sent)
         return;     // Sync message already was sent
     dap_chain_hash_fast_t l_last_block_hash;
-    s_get_last_block_hash(a_session->chain, &l_last_block_hash);
+    dap_chain_get_atom_last_hash(a_session->chain, &l_last_block_hash, c_dap_chain_cell_id_null);
     a_session->ts_round_sync_start = dap_time_now();
     if (!dap_hash_fast_compare(&l_last_block_hash, &a_session->cur_round.last_block_hash))
         return;     // My last block hash has changed, skip sync message
@@ -936,7 +926,7 @@ static void s_session_round_new(dap_chain_esbocs_session_t *a_session)
     a_session->ts_stage_entry = 0;
 
     dap_hash_fast_t l_last_block_hash;
-    s_get_last_block_hash(a_session->chain, &l_last_block_hash);
+    dap_chain_get_atom_last_hash(a_session->chain, &l_last_block_hash, c_dap_chain_cell_id_null);
     if (!dap_hash_fast_compare(&l_last_block_hash, &a_session->cur_round.last_block_hash) ||
             (!dap_hash_fast_is_blank(&l_last_block_hash) &&
                 dap_hash_fast_is_blank(&a_session->cur_round.last_block_hash))) {
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index d3d5e62f30213b737470d3e0a375d9766fe6ddd5..fadccfe53697b5ff48d867299c1c51717c43c5b9 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -192,6 +192,8 @@ dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_chain_node_cli
             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));
+                a_node_client->cur_chain = l_net->pub.chains;
+                a_node_client->cur_cell = a_node_client->cur_chain ? a_node_client->cur_chain->cells : NULL;
                 dap_chain_ch_sync_request_t l_sync_chain = {};
                 l_sync_chain.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
                 dap_chain_ch_pkt_write_unsafe(a_node_client->ch_chain,