diff --git a/dap_chain_net.c b/dap_chain_net.c
index acb59dc6fd92ca667eeaf3cda8f25c57ab3d7d31..699562998018dead356c6276ddff8d65db0949ab 100755
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -106,6 +106,7 @@ typedef struct dap_chain_net_pvt{
 #else
     HANDLE state_proc_cond;
 #endif    
+    pthread_mutex_t state_mutex_cond;
     pthread_mutex_t state_mutex;
     dap_chain_node_role_t node_role;
     uint32_t  flags;
@@ -168,6 +169,8 @@ int s_net_load(const char * a_net_name);
 static void s_gbd_history_callback_notify (void * a_arg,const char a_op_code, const char * a_prefix, const char * a_group,
                                                      const char * a_key, const void * a_value,
                                                      const size_t a_value_len);
+static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id);
+
 static int s_cli_net(int argc, char ** argv, char **str_reply);
 
 static bool s_seed_mode = false;
@@ -180,8 +183,9 @@ static bool s_seed_mode = false;
  */
 void s_net_set_go_sync(dap_chain_net_t * a_net)
 {
-    if(a_net)
-        PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC;
+    if(!a_net)
+        return;
+    dap_chain_net_start(a_net);
 }
 
 /**
@@ -201,22 +205,28 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state)
  */
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state)
 {
-    pthread_mutex_lock( &PVT(a_net)->state_mutex);
+    pthread_mutex_lock( &PVT(a_net)->state_mutex_cond);
     if (PVT(a_net)->state_target == a_new_state){
         log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state));
     }
-    PVT(a_net)->state_target = a_new_state;
+    if(pthread_mutex_trylock(&PVT(a_net)->state_mutex) == 0) {
+        PVT(a_net)->state_target = a_new_state;
+        pthread_mutex_unlock(&PVT(a_net)->state_mutex);
+    }
+    // set flag for sync
+    PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC;
 #ifndef _WIN32
     pthread_cond_signal( &PVT(a_net)->state_proc_cond );
 #else
     SetEvent( PVT(a_net)->state_proc_cond );
 #endif    
-    pthread_mutex_unlock( &PVT(a_net)->state_mutex);
+    pthread_mutex_unlock( &PVT(a_net)->state_mutex_cond);
     return 0;
 }
 
 /**
  * @brief s_gbd_history_callback_notify
+ * @param a_arg
  * @param a_op_code
  * @param a_prefix
  * @param a_group
@@ -232,16 +242,30 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c
 
     if (a_arg) {
         dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
-        if (!PVT (l_net)->load_mode ){
+        s_net_set_go_sync(l_net);
+        /*if (!PVT (l_net)->load_mode ){
             if( pthread_mutex_trylock( &PVT (l_net)->state_mutex) == 0 ){
                 if ( PVT(l_net)->state == NET_STATE_ONLINE || PVT(l_net)->state == NET_STATE_ONLINE  )
                     dap_chain_net_sync_all(l_net);
                 pthread_mutex_unlock( &PVT (l_net)->state_mutex);
             }
-        }
+        }*/
     }
 }
 
+/**
+ * @brief s_chain_callback_notify
+ * @param a_arg
+ * @param a_chain
+ * @param a_id
+ */
+static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id)
+{
+    if(!a_arg)
+        return;
+    dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
+    s_net_set_go_sync(l_net);
+}
 
 
 /**
@@ -275,6 +299,9 @@ lb_proc_state:
                 pthread_mutex_unlock(&PVT(l_net)->state_mutex );
                 goto lb_proc_state;
             }
+            // disable SYNC_GDB
+            if(PVT(l_net)->flags & F_DAP_CHAIN_NET_GO_SYNC)
+                PVT(l_net)->flags &= ~F_DAP_CHAIN_NET_GO_SYNC;
         } break;
         case NET_STATE_LINKS_PREPARE:{
             log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_PREPARE",l_net->pub.name);
@@ -289,7 +316,7 @@ lb_proc_state:
                             DAP_DELETE(PVT(l_net)->links_addrs);
                         PVT(l_net)->links_addrs_count = PVT(l_net)->node_info->hdr.links_number;
                         PVT(l_net)->links_addrs = DAP_NEW_Z_SIZE( dap_chain_node_addr_t,
-                                                                  PVT(l_net)->links_addrs_count);
+                                                                  PVT(l_net)->links_addrs_count * sizeof(dap_chain_node_addr_t));
                         for (size_t i =0 ; i < PVT(l_net)->node_info->hdr.links_number; i++ ){
                             PVT(l_net)->links_addrs[i].uint64 = PVT(l_net)->node_info->links[i].uint64;
                         }
@@ -337,9 +364,9 @@ 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) {
+                    if(1) { //if(l_net->pub.cell_id.uint64 == 0) {
 
-                    dap_chain_net_pvt_t *pvt_debug = PVT(l_net);
+                    //dap_chain_net_pvt_t *pvt_debug = PVT(l_net);
                     // get current node address
                     dap_chain_node_addr_t l_address;
                     l_address.uint64 = dap_chain_net_get_cur_addr(l_net) ?
@@ -355,19 +382,23 @@ lb_proc_state:
                                 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++) {
+                        for(uint16_t i = 0; i < min(4, l_cur_node_info->hdr.links_number); i++) {
                             dap_chain_node_addr_t *l_addr = l_cur_node_info->links + i;
+                            dap_chain_node_addr_t link_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++;
+                            if(l_remore_node_info) {
+                                // if only nodes from the same cell of cell=0
+                                if(!l_cur_node_info->hdr.cell_id.uint64 ||
+                                    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);
                             }
-                            DAP_DELETE(l_remore_node_info);
                         }
                     }
-                    // add root nodes for connect
+                    // if no links then add root nodes for connect
                     if(!PVT(l_net)->links_addrs_count){
                         // use no more then 4 root node
                         int l_use_root_nodes = min(4, PVT(l_net)->seed_aliases_count);
@@ -397,7 +428,7 @@ lb_proc_state:
                     }
                 } break;
             }
-            if ( PVT(l_net)->state_target != NET_STATE_LINKS_PREPARE ){
+            if ( PVT(l_net)->state_target > NET_STATE_LINKS_PREPARE ){
                 if ( PVT(l_net)->links_addrs_count>0 ) { // If links are present
                     PVT(l_net)->state = NET_STATE_LINKS_CONNECTING;
                     log_it(L_DEBUG,"Prepared %u links, start to establish them", PVT(l_net)->links_addrs_count );
@@ -411,7 +442,10 @@ lb_proc_state:
                 log_it(L_WARNING,"Target state is NET_STATE_LINKS_PREPARE? Realy?");
                 PVT(l_net)->state = NET_STATE_OFFLINE;
             }
-        } pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state;
+        }
+        pthread_mutex_unlock(&PVT(l_net)->state_mutex );
+        goto lb_proc_state;
+
         case NET_STATE_LINKS_CONNECTING:{
             log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name);
             //size_t l_links_established = 0;
@@ -450,7 +484,9 @@ lb_proc_state:
                 PVT(l_net)->state = NET_STATE_OFFLINE ;
                 PVT(l_net)->state_target = NET_STATE_OFFLINE ;
             }
-        } pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state;
+        }
+        pthread_mutex_unlock(&PVT(l_net)->state_mutex );
+        goto lb_proc_state;
 
         case NET_STATE_LINKS_ESTABLISHED:{
             log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_ESTABLISHED",l_net->pub.name);
@@ -459,7 +495,7 @@ lb_proc_state:
                     switch ( PVT(l_net)->node_role.enums ){
                         case NODE_ROLE_ROOT_MASTER:
                         case NODE_ROLE_ROOT:{
-                            dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL;
+                            /*dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL;
 
                             // Send everybody your address when linked
                             HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){
@@ -468,12 +504,12 @@ lb_proc_state:
                                                    DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR, l_net->pub.id,
                                                    dap_chain_net_get_cur_addr(l_net),
                                                    sizeof (dap_chain_node_addr_t) );
-                            }
+                            }*/
                             PVT(l_net)->state = NET_STATE_SYNC_GDB;
                         }break;
                         case NODE_ROLE_CELL_MASTER:
                         case NODE_ROLE_MASTER:{
-                            PVT(l_net)->state = NET_STATE_ADDR_REQUEST;
+                            PVT(l_net)->state = NET_STATE_SYNC_GDB;//NET_STATE_ADDR_REQUEST;
                         } break;
                        default:{
                         // get addr for current node if it absent
@@ -483,7 +519,10 @@ lb_proc_state:
                             PVT( l_net)->state = NET_STATE_SYNC_GDB;
                        }
                     }
-                }pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state;
+                }
+                pthread_mutex_unlock(&PVT(l_net)->state_mutex );
+                goto lb_proc_state;
+
                 case NET_STATE_SYNC_GDB: // we need only to sync gdb
                     PVT(l_net)->state = NET_STATE_SYNC_GDB ;
                     if ( PVT(l_net)->addr_request_attempts >=10 && PVT(l_net)->state == NET_STATE_ADDR_REQUEST){
@@ -494,6 +533,7 @@ lb_proc_state:
                                 PVT(l_net)->state = NET_STATE_SYNC_GDB;
                             pthread_mutex_unlock(&PVT(l_net)->state_mutex );
                             goto lb_proc_state;
+
                             case NET_STATE_SYNC_CHAINS:
                                 PVT(l_net)->state = NET_STATE_SYNC_CHAINS;
                             pthread_mutex_unlock(&PVT(l_net)->state_mutex );
@@ -504,14 +544,19 @@ lb_proc_state:
                             }
                         }
                     }
-                pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state;
+                pthread_mutex_unlock(&PVT(l_net)->state_mutex );
+                goto lb_proc_state;
+
                 case NET_STATE_SYNC_CHAINS:
                     PVT(l_net)->state = (PVT(l_net)->node_info && PVT(l_net)->node_info->hdr.address.uint64)?
                                 NET_STATE_SYNC_CHAINS : NET_STATE_ADDR_REQUEST;
-                pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state;
+                pthread_mutex_unlock(&PVT(l_net)->state_mutex );
+                goto lb_proc_state;
+
                 case NET_STATE_ADDR_REQUEST :
                     PVT(l_net)->state = NET_STATE_ADDR_REQUEST;
-                pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state;
+                pthread_mutex_unlock(&PVT(l_net)->state_mutex );
+                goto lb_proc_state;
                 default:{}
             }
         }break;
@@ -615,7 +660,7 @@ lb_proc_state:
                 }
 
                 // wait for finishing of request
-                int timeout_ms = 50000; // 2 min = 120 sec = 120 000 ms
+                int timeout_ms = 300000; // 5 min = 300 sec = 300 000 ms
                 // TODO add progress info to console
                 int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
                 switch (res) {
@@ -675,6 +720,8 @@ lb_proc_state:
                             log_it(L_WARNING,"Timeout with sync of chain '%s' ", l_chain->name);
                             break;
                         case 0:
+                            // flush global_db
+                            dap_chain_global_db_flush();
                             log_it(L_INFO, "sync of chain '%s' completed ", l_chain->name);
                             // set time of last sync
                             {
@@ -694,9 +741,11 @@ lb_proc_state:
 
             }
             PVT(l_net)->state = NET_STATE_ONLINE;
+            // end sync, go to offline state
+            PVT(l_net)->state_target = NET_STATE_OFFLINE;
             // end sync, return to online state
-            if(PVT(l_net)->state_target > NET_STATE_ONLINE)
-                PVT(l_net)->state_target = NET_STATE_ONLINE;
+            //if(PVT(l_net)->state_target > NET_STATE_ONLINE)
+            //    PVT(l_net)->state_target = NET_STATE_ONLINE;
         }
         pthread_mutex_unlock(&PVT(l_net)->state_mutex);
         goto lb_proc_state;
@@ -718,12 +767,13 @@ lb_proc_state:
                         break;
                     // sync
                 case NET_STATE_SYNC_GDB:
+                    // if flag set then go to SYNC_GDB
+                    if(PVT(l_net)->flags & F_DAP_CHAIN_NET_GO_SYNC)
+                        PVT(l_net)->flags &= ~F_DAP_CHAIN_NET_GO_SYNC;
+
                     PVT(l_net)->state = NET_STATE_SYNC_GDB;
                     pthread_mutex_unlock(&PVT(l_net)->state_mutex);
                     goto lb_proc_state;
-                        PVT(l_net)->state = NET_STATE_SYNC_GDB;
-                        pthread_mutex_unlock(&PVT(l_net)->state_mutex);
-                        goto lb_proc_state;
 
             }
         }
@@ -734,6 +784,18 @@ lb_proc_state:
     return ret;
 }
 
+// Global
+/*static void s_net_proc_thread_callback_update_db(void)
+{
+    dap_chain_net_item_t *l_net_item, *l_net_item_tmp;
+    printf("update0\n");
+    HASH_ITER(hh, s_net_items, l_net_item, l_net_item_tmp)
+    {
+        s_net_set_go_sync(l_net_item->chain_net);
+    }
+    printf("update1\n");
+}*/
+
 /**
  * @brief s_net_proc_thread
  * @details Brings up and check the Dap Chain Network
@@ -745,44 +807,50 @@ static void *s_net_proc_thread ( void *a_net )
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_net;
     dap_chain_net_pvt_t *p_net = (dap_chain_net_pvt_t *)(void *)l_net->pvt;
 
-    const uint64_t l_timeout_ms = 20000;// 20 sec
+    const uint64_t l_timeout_ms = 60000;// 60 sec
+
+    // set callback to update data
+    //dap_chain_global_db_set_callback_for_update_base(s_net_proc_thread_callback_update_db);
 
     while( !(p_net->flags & F_DAP_CHAIN_NET_SHUTDOWN) ) {
 
+        // check or start sync
         s_net_states_proc( l_net );
-    #ifndef _WIN32
-        pthread_mutex_lock( &p_net->state_mutex );
-
-        // prepare for signal waiting
-
-        struct timespec l_to;
 
-        clock_gettime( CLOCK_MONOTONIC, &l_to );
-        int64_t l_nsec_new = l_to.tv_nsec + l_timeout_ms * 1000000ll;
-
-        // if the new number of nanoseconds is more than a second
-        if(l_nsec_new > (long) 1e9) {
-            l_to.tv_sec += l_nsec_new / (long) 1e9;
-            l_to.tv_nsec = l_nsec_new % (long) 1e9;
-        }
-        else
-            l_to.tv_nsec = (long) l_nsec_new;
 
-        // signal waiting
-        pthread_cond_timedwait( &p_net->state_proc_cond, &p_net->state_mutex, &l_to );
-
-        // checking whether new sync is needed
-        time_t l_sync_timeout = 300;// 300 sec = 5 min
-        clock_gettime( CLOCK_MONOTONIC, &l_to );
-        if(l_to.tv_sec >= p_net->last_sync + l_sync_timeout)
-            p_net->flags |= F_DAP_CHAIN_NET_GO_SYNC;
+        // wait if flag not set then go to SYNC_GDB
+        if(!(PVT(l_net)->flags & F_DAP_CHAIN_NET_GO_SYNC)) {
+#ifndef _WIN32
+            pthread_mutex_lock( &p_net->state_mutex_cond );
+            // prepare for signal waiting
+            struct timespec l_to;
+            clock_gettime( CLOCK_MONOTONIC, &l_to );
+            int64_t l_nsec_new = l_to.tv_nsec + l_timeout_ms * 1000000ll;
+
+            // if the new number of nanoseconds is more than a second
+            if(l_nsec_new > (long) 1e9) {
+                l_to.tv_sec += l_nsec_new / (long) 1e9;
+                l_to.tv_nsec = l_nsec_new % (long) 1e9;
+            }
+            else
+                l_to.tv_nsec = (long) l_nsec_new;
 
-        pthread_mutex_unlock( &p_net->state_mutex );
-    #else // WIN32
+            // signal waiting
+            pthread_cond_timedwait( &p_net->state_proc_cond, &p_net->state_mutex_cond, &l_to );
+            pthread_mutex_unlock(&p_net->state_mutex_cond);
+#else // WIN32
 
-        WaitForSingleObject( p_net->state_proc_cond, (uint32_t)l_timeout_ms );
+            WaitForSingleObject( p_net->state_proc_cond, (uint32_t)l_timeout_ms );
 
-    #endif
+#endif
+            // checking whether new sync is needed
+            time_t l_sync_timeout = 300; // 300 sec = 5 min
+            clock_gettime(CLOCK_MONOTONIC, &l_to);
+            // start sync every l_sync_timeout sec
+            if(l_to.tv_sec >= p_net->last_sync + l_sync_timeout) {
+                p_net->flags |= F_DAP_CHAIN_NET_GO_SYNC;
+            }
+        }
         log_it( L_DEBUG, "Waked up s_net_proc_thread( )" );
     }
 
@@ -847,6 +915,7 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name ,
     ret->pub.name = strdup( a_name );
 
     pthread_mutex_init( &PVT(ret)->state_mutex, NULL );
+    pthread_mutex_init( &PVT(ret)->state_mutex_cond, NULL );
 
 #ifndef _WIN32
     pthread_condattr_t l_attr;
@@ -1558,6 +1627,8 @@ int s_net_load(const char * a_net_name)
                     DL_APPEND(l_net->pub.chains, l_chain);
                     if(l_chain->callback_created)
                         l_chain->callback_created(l_chain, l_cfg);
+                    // add a callback to monitor changes in the chain
+                    dap_chain_add_callback_notify(l_chain, s_chain_callback_notify, l_net);
                 }
                 DAP_DELETE (l_chain_prior->chains_path);
                 l_list = dap_list_next(l_list);
@@ -1922,8 +1993,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net)
             // Delete processed objects
             size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
             for(size_t i = 0; i < l_objs_processed; i++) {
-                if(dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool))
-                    s_net_set_go_sync(a_net);
+                dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
                 if(i < l_objs_processed_tmp) {
                     dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
                             l_objs[i].key);
diff --git a/dap_chain_node.c b/dap_chain_node.c
index e0a8dfb2cb00d50888792f622648826a163853f4..79820191b65bc4ccaac69b0797486f7d3c6a3022 100644
--- a/dap_chain_node.c
+++ b/dap_chain_node.c
@@ -92,8 +92,6 @@ bool dap_chain_node_alias_register(dap_chain_net_t * a_net,const char *alias, da
 //    a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0';
     bool res = dap_chain_global_db_gr_set( dap_strdup(a_key),  l_addr, sizeof(dap_chain_node_addr_t)
                                           , a_net->pub.gdb_nodes_aliases);
-    if(res)
-        s_net_set_go_sync(a_net);
     return res;
 }
 
@@ -117,8 +115,6 @@ bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias)
 {
     char *a_key = strdup(a_alias);
     bool res = dap_chain_global_db_gr_del(a_key, a_net->pub.gdb_nodes_aliases);
-    if(res)
-        s_net_set_go_sync(a_net);
     return res;
 }
 
@@ -159,8 +155,6 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n
     dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
     memcpy(l_node_info, a_node_info, sizeof (*a_node_info) );
     bool res = dap_chain_global_db_gr_set( dap_strdup(l_key), l_node_info, l_node_info_size, a_net->pub.gdb_nodes);
-    if(res)
-        s_net_set_go_sync(a_net);
     DAP_DELETE(l_key);
     //DAP_DELETE(a_value);
     return res?0:-3;
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index c63b7d439a93dccc6312e3a13479ea0725dc43e3..422f2c0b72d78f00b58c1be915f1b895b3b42d51 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -218,14 +218,18 @@ static bool node_info_save_and_reply(dap_chain_net_t * a_net, dap_chain_node_inf
     }
     //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
     size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info);
-    dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
-    memcpy(l_node_info, a_node_info, sizeof (*a_node_info) );
+    //dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
+    //memcpy(l_node_info, a_node_info, l_node_info_size );
 
-    bool res = dap_chain_global_db_gr_set(a_key, (uint8_t *) l_node_info, l_node_info_size,a_net->pub.gdb_nodes);
-    DAP_DELETE(a_key);
+    //size_t data_len_out = 0;
+    //dap_chain_node_info_t *a_node_info1 = dap_chain_global_db_gr_get(a_key, &data_len_out, a_net->pub.gdb_nodes);
+
+    bool res = dap_chain_global_db_gr_set(a_key, (uint8_t *) a_node_info, l_node_info_size, a_net->pub.gdb_nodes);
+
+    //data_len_out = 0;
+    //dap_chain_node_info_t *a_node_info2 = dap_chain_global_db_gr_get(a_key, &data_len_out, a_net->pub.gdb_nodes);
+    //DAP_DELETE(a_key);
     //DAP_DELETE(a_value);
-    if(res)
-        s_net_set_go_sync(a_net);
     return res;
 }
 
@@ -326,7 +330,6 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info
             }
             // set text response
             dap_chain_node_cli_set_reply_text(str_reply, "node deleted");
-            s_net_set_go_sync(a_net);
         }
         else
             dap_chain_node_cli_set_reply_text(str_reply, "node not deleted");
@@ -397,9 +400,10 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in
     // add link
     if(cmd_int == 1) {
         if(index_link == -1) {
-            l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size += sizeof(*link));
-            memcpy(&(l_node_info_read->links[l_node_info_read->hdr.links_number]), link, sizeof(dap_chain_node_addr_t));
             l_node_info_read->hdr.links_number++;
+            l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read);
+            l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size);
+            memcpy(&(l_node_info_read->links[l_node_info_read->hdr.links_number-1]), link, sizeof(dap_chain_node_addr_t));
             res_successful = true;
         }
     }
@@ -862,7 +866,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters");
             return -1;
         }
-        // handler of command 'global_db node add'
+        // handler of command 'node add'
         int l_ret = node_info_add_with_reply(l_net, l_node_info, alias_str, l_cell_str, a_ipv4_str, a_ipv6_str,
                 a_str_reply);
         DAP_DELETE(l_node_info);
@@ -870,7 +874,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         //break;
 
     case CMD_DEL:
-        // handler of command 'global_db node del'
+        // handler of command 'node del'
     {
         int l_ret = node_info_del_with_reply(l_net, l_node_info, alias_str, a_str_reply);
         DAP_DELETE(l_node_info);
@@ -878,13 +882,13 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     }
     case CMD_LINK:
         if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL)) {
-            // handler of command 'global_db node link add -addr <node address> -link <node address>'
+            // handler of command 'node link add -addr <node address> -link <node address>'
             int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "add", alias_str, &l_link, a_str_reply);
             DAP_DELETE(l_node_info);
             return l_ret;
         }
         else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL)) {
-            // handler of command 'global_db node link del -addr <node address> -link <node address>'
+            // handler of command 'node link del -addr <node address> -link <node address>'
             int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "del", alias_str, &l_link, a_str_reply);
             DAP_DELETE(l_node_info);
             return l_ret;
@@ -1144,6 +1148,8 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             return -2;
 
         }
+        // flush global_db
+        dap_chain_global_db_flush();
         log_it(L_INFO, "Gdb synced Ok");
 
         // Requesting chains
@@ -1896,7 +1902,6 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
 
                     // Add datum to mempool with datum_token hash as a key
                     if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
-                        s_net_set_go_sync(l_net);
 
                         char* l_hash_str = strdup(l_datum_hash_str);
                         // Remove old datum from pool
@@ -1908,7 +1913,6 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                             DAP_DELETE(l_datum);
                             //DAP_DELETE(l_datum_token);
                             DAP_DELETE(l_gdb_group_mempool);
-                            s_net_set_go_sync(l_net);
                             return 0;
                         } else {
                             dap_chain_node_cli_set_reply_text(a_str_reply,
@@ -2063,7 +2067,6 @@ int com_mempool_delete(int argc, char ** argv, char ** a_str_reply)
             if(dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_str2), l_gdb_group_mempool)) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_str);
                 DAP_DELETE( l_datum_hash_str2);
-                s_net_set_go_sync(l_net);
                 return 0;
             } else {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str);
@@ -2153,8 +2156,7 @@ int com_mempool_proc(int argc, char ** argv, char ** a_str_reply)
             for(size_t i = 0; i < l_datums_size; i++) {
                 if(l_procecced[i]!=1)
                     continue;
-                if(dap_chain_global_db_gr_del( dap_strdup(l_objs[i].key), l_gdb_group_mempool_tmp))
-                    s_net_set_go_sync(l_net);
+                dap_chain_global_db_gr_del( dap_strdup(l_objs[i].key), l_gdb_group_mempool_tmp);
                 l_objs_processed_cur++;
                 if(l_objs_processed_cur < l_objs_processed_tmp) {
                     dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
@@ -2346,7 +2348,6 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
 
     }
     if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
-        s_net_set_go_sync(l_net);
         dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str,
                 l_ticker);
         DAP_DELETE(l_datum);
@@ -2561,7 +2562,6 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     // Add to mempool emission token
     if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum_emission, l_datum_emission_size
             , l_gdb_group_mempool_emission)) {
-        s_net_set_go_sync(l_net);
         str_reply_tmp = dap_strdup_printf("datum emission %s is placed in datum pool ", l_key_str);
         DAP_DELETE(l_key_str);
     }
@@ -2618,7 +2618,6 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     // Add to mempool tx token
     if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), l_datum_tx, l_datum_tx_size
             , l_gdb_group_mempool_base_tx)) {
-        s_net_set_go_sync(l_net);
         dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp,
                 l_key_str);
         DAP_DELETE(l_key_str);