diff --git a/CMakeLists.txt b/CMakeLists.txt
index 65c28d313556b5cf60f9cd6a3b875d9658a81ef5..b3dc45e24351856fd940d42f496c709b34b7da01 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 2.8)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.6-51")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.6-52")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 
 set(DAPSDK_MODULES "")
diff --git a/dap-sdk/crypto/include/dap_hash.h b/dap-sdk/crypto/include/dap_hash.h
index d81d94df5ad53a37499205ac2d93ede70b6874ff..368157ec342d67c2a194228bdda49f7295138813 100755
--- a/dap-sdk/crypto/include/dap_hash.h
+++ b/dap-sdk/crypto/include/dap_hash.h
@@ -45,15 +45,16 @@ typedef enum dap_hash_type {
 typedef union dap_chain_hash_fast{
     uint8_t raw[DAP_CHAIN_HASH_FAST_SIZE];
 } dap_chain_hash_fast_t;
+typedef dap_chain_hash_fast_t dap_hash_fast_t;
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 //size_t dap_chain_hash_fast_to_str(dap_chain_hash_fast_t * a_hash, char * a_str, size_t a_str_max);
-int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_chain_hash_fast_t * a_hash);
+int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_hash_fast_t * a_hash);
 
-static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, dap_chain_hash_fast_t *a_hash_out )
+static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, dap_hash_fast_t *a_hash_out )
 {
     if ( (a_data_in == NULL) || (a_data_in_size == 0) || (a_hash_out == NULL) )
         return false;
@@ -74,18 +75,18 @@ static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size,
  * @param a_hash2
  * @return
  */
-static inline bool dap_hash_fast_compare(dap_chain_hash_fast_t *a_hash1, dap_chain_hash_fast_t *a_hash2)
+static inline bool dap_hash_fast_compare(dap_hash_fast_t *a_hash1, dap_hash_fast_t *a_hash2)
 {
     if(!a_hash1 || !a_hash2)
         return false;
-    if(!memcmp(a_hash1, a_hash2, sizeof(dap_chain_hash_fast_t)))
+    if(!memcmp(a_hash1, a_hash2, sizeof(dap_hash_fast_t)))
         return true;
     return false;
 }
 
-static inline bool dap_hash_fast_is_blank( dap_chain_hash_fast_t *a_hash )
+static inline bool dap_hash_fast_is_blank( dap_hash_fast_t *a_hash )
 {
-    static dap_chain_hash_fast_t l_blank_hash = { 0};
+    static dap_hash_fast_t l_blank_hash = { 0};
 //    uint8_t *l_hast_bytes = (uint8_t*) a_hash;
 //    for(size_t i = 0; i < sizeof(dap_chain_hash_fast_t); i++) {
 //        if(l_hast_bytes[i])
@@ -95,7 +96,7 @@ static inline bool dap_hash_fast_is_blank( dap_chain_hash_fast_t *a_hash )
 }
 
 
-DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
+DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
 {
     assert(a_str_max >= (DAP_CHAIN_HASH_FAST_SIZE * 2 + 2));
     a_str[0] = '0';
@@ -105,7 +106,7 @@ DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash,
     return DAP_CHAIN_HASH_FAST_SIZE * 2 + 2;
 }
 
-static inline char *dap_chain_hash_fast_to_str_new(dap_chain_hash_fast_t * a_hash)
+static inline char *dap_chain_hash_fast_to_str_new(dap_hash_fast_t * a_hash)
 {
     const size_t c_hash_str_size = sizeof(*a_hash)*2 +1 /*trailing zero*/ +2 /* heading 0x */+4/*just to be sure*/ ;
     char * ret = DAP_NEW_Z_SIZE(char, c_hash_str_size);
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index db90df595e0f8f19ad47e9a1343ae0a7f30b59bd..79748f4a8e887ad8fdd3cc155003bb2836b5b64f 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -495,3 +495,34 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not
     a_chain->callback_notify = a_callback;
     a_chain->callback_notify_arg = a_callback_arg;
 }
+
+/**
+ * @brief dap_chain_get_last_atom_hash
+ * @param a_chain
+ * @param a_atom_hash
+ * @return
+ */
+bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash)
+{
+    bool l_ret = false;
+    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
+    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[128]={[0]='\0'};
+                dap_chain_hash_fast_to_str(a_atom_hash,l_hash_str,sizeof (l_hash_str)-1);
+                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);
+    return l_ret;
+}
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 8cb420e0b514c38f2f3e04abba52697c0f878411..cf6c1492664526add0905720fd802b14a08355b1 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -175,3 +175,4 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai
 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);
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 11648cfcda2451f0f5ae4fff7f69fdef6a8ba9a0..cb15c80a7f649ca1ef7627d9142cd062bcb0ae1b 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -525,64 +525,74 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
     }
         break;
     case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: {
-        char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from);
-        char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to);
-        log_it(L_INFO, "In:  SYNC_CHAINS pkt: net 0x%016x chain 0x%016x cell 0x%016x between %s and %s", l_ch_chain->request_hdr.net_id.uint64 ,
-               l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64,
-               l_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)");
-        dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
-        if(l_chain) {
-            if(l_ch_chain->state != CHAIN_STATE_IDLE) {
-                log_it(L_INFO, "Can't process SYNC_CHAINS request between %s and %s because not in idle state",
-                       l_hash_from_str? l_hash_from_str:"(null)",
-                       l_hash_to_str?l_hash_to_str:"(null)");
-                dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
-                        l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
-                        "ERROR_STATE_NOT_IN_IDLE");
-                dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-            } else {
-                // fill ids
-                if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
-                    memcpy(&l_ch_chain->request, l_chain_pkt->data, l_chain_pkt_data_size);
-                    memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
+        // fill ids
+        if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
+            memcpy(&l_ch_chain->request, l_chain_pkt->data, l_chain_pkt_data_size);
+            memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
+            char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from);
+            char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to);
+            log_it(L_INFO, "In:  SYNC_CHAINS pkt: net 0x%016x chain 0x%016x cell 0x%016x between %s and %s", l_ch_chain->request_hdr.net_id.uint64 ,
+                   l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64,
+                   l_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)");
+            dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
+            if(l_chain) {
+                if(l_ch_chain->state != CHAIN_STATE_IDLE) {
+                    log_it(L_INFO, "Can't process SYNC_CHAINS request between %s and %s because not in idle state",
+                           l_hash_from_str? l_hash_from_str:"(null)",
+                           l_hash_to_str?l_hash_to_str:"(null)");
+                    dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
+                            l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
+                            "ERROR_STATE_NOT_IN_IDLE");
+                    dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                } else {
+                    dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
+                    dap_proc_queue_add_callback_inter(  a_ch->stream_worker->worker->proc_queue_input, s_sync_chains_callback, a_ch);
                 }
-                dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
-                dap_proc_queue_add_callback_inter(  a_ch->stream_worker->worker->proc_queue_input, s_sync_chains_callback, a_ch);
             }
+            DAP_DELETE(l_hash_from_str);
+            DAP_DELETE(l_hash_to_str);
+        }else{
+            log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
+            dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
+                    l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
+                    "ERROR_CHAIN_PKT_DATA_SIZE" );
         }
-        DAP_DELETE(l_hash_from_str);
-        DAP_DELETE(l_hash_to_str);
-
     }
         break;
     case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: {
-        log_it(L_INFO, "In:  SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u",
-               l_ch_chain->request_hdr.net_id.uint64 , l_ch_chain->request_hdr.chain_id.uint64,
-               l_ch_chain->request_hdr.cell_id.uint64, l_ch_chain->request.id_start, l_ch_chain->request.id_end );
-        if(l_ch_chain->state != CHAIN_STATE_IDLE) {
-            log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state");
-            dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
-                    l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
-                    "ERROR_STATE_NOT_IN_IDLE");
-            dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
-            break;
-        }
-        // receive the latest global_db revision of the remote node -> go to send mode
         if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
             dap_stream_ch_chain_sync_request_t * l_request =
                     (dap_stream_ch_chain_sync_request_t *) l_chain_pkt->data;
             memcpy(&l_ch_chain->request, l_request, l_chain_pkt_data_size);
             memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
+
             dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
             dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch);
-        }
-        else {
-            log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request",
-                    a_ch->stream->session->id);
+            log_it(L_INFO, "In:  SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u",
+                   l_ch_chain->request_hdr.net_id.uint64 , l_ch_chain->request_hdr.chain_id.uint64,
+                   l_ch_chain->request_hdr.cell_id.uint64, l_ch_chain->request.id_start, l_ch_chain->request.id_end );
+            if(l_ch_chain->state != CHAIN_STATE_IDLE) {
+                log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state");
+                dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
+                        l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
+                        "ERROR_STATE_NOT_IN_IDLE");
+                dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                break;
+            }
+            // receive the latest global_db revision of the remote node -> go to send mode
+            else {
+                log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request",
+                        a_ch->stream->session->id);
+                dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
+                        l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
+                        "ERROR_SYNC_GLOBAL_DB_REQUEST_BAD");
+                dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+            }
+        }else{
+            log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
             dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
                     l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
-                    "ERROR_SYNC_GLOBAL_DB_REQUEST_BAD");
-            dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                    "ERROR_CHAIN_PKT_DATA_SIZE" );
         }
     }
         break;
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 980e62e7f8fc946ed2f4726882a7c8154bd181e5..3490234113f30e068257a98d2df1dde562ec9c47 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -554,6 +554,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
                 default:
                     log_it(L_INFO, "Node sync error %d",l_res);
                 }
+                /*
                 dap_chain_node_client_reset(l_node_client);
                 l_res = dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB_RVRS, a_net->pub.id,
                                                          l_chain_id, a_net->pub.cell_id, &l_sync_gdb, sizeof(l_sync_gdb));
@@ -568,6 +569,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
                 default:
                     log_it(L_INFO, "Node reverse sync error %d",l_res);
                 }
+                */
                 l_tmp = dap_list_next(l_tmp);
             }
             if (!l_pvt_net->links) {
@@ -597,12 +599,17 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
                 int l_res = 0;
                 DL_FOREACH (a_net->pub.chains, l_chain) {
                     dap_chain_node_client_reset(l_node_client);
-                    dap_stream_ch_chain_sync_request_t l_request = {};
-                    dap_chain_hash_fast_t *l_hash = dap_db_get_last_hash_remote(l_node_client->remote_node_addr.uint64, l_chain);
-                    if (l_hash) {
-                        memcpy(&l_request.hash_from, l_hash, sizeof(*l_hash));
-                        DAP_DELETE(l_hash);
-                    }  
+                    dap_stream_ch_chain_sync_request_t l_request = {0};
+                    dap_chain_get_atom_last_hash(l_chain,&l_request.hash_from);
+                    if ( !dap_hash_fast_is_blank(&l_request.hash_from) ){
+                        if(dap_log_level_get() <= L_DEBUG){
+                            char l_hash_str[128]={[0]='\0'};
+                            dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_str,sizeof (l_hash_str)-1);
+                            log_it(L_DEBUG,"Send sync chain request from %s to infinity",l_hash_str);
+                        }
+                    }else
+                        log_it(L_DEBUG,"Send sync chain request for all the chains for addr "NODE_ADDR_FP_STR,
+                               NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
                     dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, a_net->pub.id,
                                                      l_chain->id, a_net->pub.cell_id, &l_request, sizeof(l_request));
                     // wait for finishing of request
@@ -620,7 +627,10 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
                         default:
                             log_it(L_ERROR, "Sync of chain '%s' error %d", l_chain->name,l_res);
                     }
+
+                    /*
                     dap_chain_node_client_reset(l_node_client);
+
                     l_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(a_net);
                     dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS, a_net->pub.id,
                                                      l_chain->id, a_net->pub.cell_id, &l_request, sizeof(l_request));
@@ -642,6 +652,8 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
                         default:
                             log_it(L_ERROR, "Reverse sync of chain '%s' error %d", l_chain->name,l_res);
                     }
+                    */
+
                 }
                 l_tmp = dap_list_next(l_tmp);
             }