diff --git a/dap_chain_net.c b/dap_chain_net.c
index daa5646928a92fa835731c2051e8da80a5a1898c..958f226588f64228b7f0471541578786c080b62b 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -239,13 +239,44 @@ lb_proc_state:
                 case NODE_ROLE_MASTER:
                 case NODE_ROLE_LIGHT:{
                     // If we haven't any assigned shard - connect to root-0
-                    if ( l_net->pub.cell_id.uint64 == 0 ){
-                        PVT(l_net)->links_addrs_count=1;
-                        PVT(l_net)->links_addrs = DAP_NEW_Z_SIZE(dap_chain_node_addr_t,
-                                                                 PVT(l_net)->links_addrs_count * sizeof(dap_chain_node_addr_t));
-                        dap_chain_node_addr_t * l_node_addr = dap_chain_node_alias_find(l_net, PVT(l_net)->seed_aliases[0] );
-                        PVT(l_net)->links_addrs[0].uint64 = l_node_addr? l_node_addr->uint64 : 0;
-                    }else {
+                if(l_net->pub.cell_id.uint64 == 0) {
+
+                    // get current node address
+                    dap_chain_node_addr_t l_address;
+                    l_address.uint64 = dap_chain_net_get_cur_addr(l_net) ?
+                                         dap_chain_net_get_cur_addr(l_net)->uint64 :
+                                         dap_db_get_cur_node_addr();
+                    // get current node info
+                    dap_chain_node_info_t *l_cur_node_info = dap_chain_node_info_read(l_net, &l_address);
+
+                    uint16_t l_links_addrs_count = l_cur_node_info->hdr.links_number + PVT(l_net)->seed_aliases_count;
+                    PVT(l_net)->links_addrs = DAP_NEW_Z_SIZE(dap_chain_node_addr_t,
+                            l_links_addrs_count * sizeof(dap_chain_node_addr_t));
+
+                    // add linked nodes for connect
+                    for(uint16_t i = 0; i < min(1, l_cur_node_info->hdr.links_number); i++) {
+                        dap_chain_node_addr_t *l_addr = l_cur_node_info->links + i;
+                        dap_chain_node_info_t *l_remore_node_info = dap_chain_node_info_read(l_net, l_addr);
+                        // if only nodes from the same cell
+                        if(l_cur_node_info->hdr.cell_id.uint64 == l_remore_node_info->hdr.cell_id.uint64) {
+                            PVT(l_net)->links_addrs[PVT(l_net)->links_addrs_count].uint64 =
+                                    l_remore_node_info->hdr.address.uint64;
+                            PVT(l_net)->links_addrs_count++;
+                        }
+                        DAP_DELETE(l_remore_node_info);
+                    }
+
+                    // add root nodes for connect
+                    if(!PVT(l_net)->links_addrs_count)
+                        for(uint16_t i = 0; i < min(1, PVT(l_net)->seed_aliases_count); i++) {
+                            dap_chain_node_addr_t * l_node_addr = dap_chain_node_alias_find(l_net, PVT(l_net)->seed_aliases[i]);
+                            if(l_node_addr) {
+                                PVT(l_net)->links_addrs[PVT(l_net)->links_addrs_count].uint64 = l_node_addr->uint64;
+                                PVT(l_net)->links_addrs_count++;
+                            }
+                        }
+                    DAP_DELETE(l_cur_node_info);
+                }else {
                         // TODO read cell's nodelist and populate array with it
                     }
                 } break;
@@ -402,11 +433,20 @@ lb_proc_state:
             HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){
                 dap_stream_ch_chain_sync_request_t l_sync_gdb = {{0}};
                 // Get last timestamp in log
-                l_sync_gdb.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote(l_node_client->remote_node_addr.uint64);
+                l_sync_gdb.id_start = (uint64_t) dap_db_log_get_last_id_remote(l_node_client->remote_node_addr.uint64);
                 // no limit
-                l_sync_gdb.ts_end = (uint64_t)0;// time(NULL);
+                l_sync_gdb.id_end = (uint64_t)0;
 
-                log_it(L_DEBUG,"Prepared request to gdb sync from %llu to %llu",l_sync_gdb.ts_start,l_sync_gdb.ts_end);
+                l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net) ?
+                                                  dap_chain_net_get_cur_addr(l_net)->uint64 :
+                                                  dap_db_get_cur_node_addr();
+
+                dap_chain_id_t l_chain_id_null = { { 0 } };
+                dap_chain_cell_id_t l_chain_cell_id_null = { { 0 } };
+                l_chain_id_null.uint64 = l_net->pub.id.uint64;
+                l_chain_cell_id_null.uint64 = dap_chain_net_get_cur_cell(l_net) ? dap_chain_net_get_cur_cell(l_net)->uint64 : 0;
+
+                log_it(L_DEBUG,"Prepared request to gdb sync from %llu to %llu",l_sync_gdb.id_start,l_sync_gdb.id_end);
                 size_t l_res =  dap_stream_ch_chain_pkt_write( dap_client_get_stream_ch(l_node_client->client,
                                                                                    dap_stream_ch_chain_get_id() ) ,
                            DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_net->pub.id, (dap_chain_id_t){{0}} ,
@@ -1175,10 +1215,14 @@ dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const ch
  */
 dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net)
 {
-    dap_chain_net_pvt_t *pvt_dbg = PVT(l_net);
     return  PVT(l_net)->node_info? &PVT(l_net)->node_info->hdr.address: PVT(l_net)->node_addr;
 }
 
+dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net)
+{
+    return  PVT(l_net)->node_info? &PVT(l_net)->node_info->hdr.cell_id: 0;
+}
+
 /**
  * @brief dap_chain_net_proc_datapool
  * @param a_net
diff --git a/dap_chain_net.h b/dap_chain_net.h
index fb904da4a30bb0710f652a8e2de48e11e0e7a6d4..08ec015c8a64910bef9dc8f6b83c9aed94b4fae8 100644
--- a/dap_chain_net.h
+++ b/dap_chain_net.h
@@ -89,6 +89,7 @@ dap_ledger_t * dap_chain_ledger_by_net_name( const char * a_net_name);
 dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const char * a_name);
 
 dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net);
+dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net);
 
 void dap_chain_net_links_connect(dap_chain_net_t * a_net);
 
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 4b0611d91aa78361db310a7535562020ed959f12..015907c10ff0619beafe27c6053f12a70570d57d 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -681,7 +681,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     dap_chain_node_addr_t l_node_addr={0};
     const char *l_addr_str = NULL, *alias_str = NULL;
     const char * l_net_str = NULL;
-// find addr, alias
+    // find addr, alias
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-alias", &alias_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str);
@@ -763,7 +763,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             return -1;
         }
         // wait connected
-        int timeout_ms = 15000; //15 sec = 15000 ms
+        int timeout_ms = 5000; //5 sec = 5000 ms
         int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
         if(res ) {
             dap_chain_node_cli_set_reply_text(a_str_reply, "no response from node: code %d",res);
@@ -775,19 +775,28 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         log_it(L_NOTICE, "Stream connection established, now lets sync all");
         dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } };
         dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id());
-        // fill begin time
-        l_sync_request.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote(
+        // fill begin id
+        l_sync_request.id_start = (uint64_t) dap_db_log_get_last_id_remote(
                 l_remote_node_info->hdr.address.uint64);
-        // fill end time = 0 - no time limit
-        //l_sync_request.ts_end = (time_t) time(NULL);
+        // fill end id = 0 - no time limit
+        //l_sync_request.ts_end = 0;
         // fill current node address
         l_sync_request.node_addr.uint64 =
                 dap_chain_net_get_cur_addr(l_net) ? dap_chain_net_get_cur_addr(l_net)->uint64 :
                                                     dap_db_get_cur_node_addr();
         dap_chain_id_t l_chain_id_null = { { 0 } };
         dap_chain_cell_id_t l_chain_cell_id_null = { { 0 } };
-        log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %llu:%llu period", l_sync_request.ts_start,
-                l_sync_request.ts_end);
+        l_chain_id_null.uint64 = l_net->pub.id.uint64;
+        l_chain_cell_id_null.uint64 = dap_chain_net_get_cur_cell(l_net) ? dap_chain_net_get_cur_cell(l_net)->uint64 : 0;
+
+        log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %llu:%llu period", l_sync_request.id_start,
+                l_sync_request.id_end);
+        // copy l_sync_request to current
+        //dap_stream_ch_chain_t * l_s_ch_chain = DAP_STREAM_CH_CHAIN(l_ch_chain);
+        //l_s_ch_chain->request_net_id.uint64 = l_net->pub.id.uint64;
+        //l_s_ch_chain->request_cell_id.uint64 = l_chain_cell_id_null.uint64;
+        //memcpy(&l_s_ch_chain->request, &l_sync_request, sizeof(l_sync_request));
+
         if(0 == dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB,
                 l_net->pub.id, l_chain_id_null, l_chain_cell_id_null, &l_sync_request,
                 sizeof(l_sync_request))) {
@@ -799,13 +808,13 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         }
         dap_stream_ch_set_ready_to_write(l_ch_chain, true);
         // wait for finishing of request
-        timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
+        timeout_ms = 120000; // 20 min = 1200 sec = 1 200 000 ms
         // TODO add progress info to console
         res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
         if ( res <0 ){
             dap_chain_node_client_close(l_node_client);
             DAP_DELETE(l_remote_node_info);
-            dap_chain_node_cli_set_reply_text(a_str_reply, "Error: can't connect to node "NODE_ADDR_FP_STR,
+            dap_chain_node_cli_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));
 
             return -2;
diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c
index c2a29e7f7c9d44a9e3eb09ea7d9fc9a27eaa49fe..25dce5bc72c2a8e3736ed22e50a77d6f5f110a20 100644
--- a/dap_chain_node_client.c
+++ b/dap_chain_node_client.c
@@ -195,11 +195,11 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
                 l_request = (dap_stream_ch_chain_sync_request_t* ) a_pkt->data;
 
             if ( l_request ){
-                if ( l_request->ts_start < (uint64_t) dap_db_log_get_last_id() ){
+                if ( l_request->id_start < (uint64_t) dap_db_log_get_last_id() ){
                     log_it(L_INFO, "Remote is synced but we have updates for it");
                     // Get log diff
                     a_ch_chain->request_last_ts = dap_db_log_get_last_id();
-                    dap_list_t *l_list = dap_db_log_get_list((time_t) l_request->ts_start);
+                    dap_list_t *l_list = dap_db_log_get_list((time_t) l_request->id_start);
 
                     if ( l_list ) {
                         // Add it to outgoing list
@@ -210,6 +210,12 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
                         a_ch_chain->request_chain_id.uint64 = a_pkt->hdr.chain_id.uint64;
                         a_ch_chain->state = CHAIN_STATE_SYNC_GLOBAL_DB ;
 
+                        dap_chain_node_addr_t l_node_addr = { 0 };
+                        l_node_addr.uint64 = dap_db_get_cur_node_addr();
+                        dap_stream_ch_chain_pkt_write(a_ch_chain->ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB,
+                                a_ch_chain->request_net_id, a_ch_chain->request_chain_id,
+                                a_ch_chain->request_cell_id, &l_node_addr, sizeof(dap_chain_node_addr_t));
+
                         log_it(L_INFO, "Sync for remote tr_count=%d",dap_list_length(l_list));
                         dap_stream_ch_set_ready_to_write(a_ch_chain->ch, true);
                     }
@@ -319,13 +325,15 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *a_
 void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
 {
     if(a_client) {
-        // clean client
-        //dap_client_delete(a_client->client);
 
         pthread_mutex_lock(&a_client->wait_mutex);
         a_client->client->_inheritor = NULL;// because client->_inheritor == a_client
         pthread_mutex_unlock(&a_client->wait_mutex);
 
+        // clean client
+        //dap_client_delete(a_client->client);
+        //a_client->client = NULL;
+
         pthread_cond_destroy(&a_client->wait_cond);
         pthread_mutex_destroy(&a_client->wait_mutex);
         DAP_DELETE(a_client);