diff --git a/dap_chain_net.c b/dap_chain_net.c
index 688a4f1d2052094cfe023b4721996d64a8f1c9ed..842db6a27203521b80e4abee2f1cdb90e3db0fb1 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -39,6 +39,12 @@
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
 
+#include "dap_stream_ch_chain_net.h"
+#include "dap_stream_ch_chain.h"
+#include "dap_stream_ch_chain_pkt.h"
+#include "dap_stream_ch.h"
+#include "dap_stream_ch_pkt.h"
+
 #include "dap_module.h"
 
 #define _XOPEN_SOURCE 700
@@ -59,10 +65,10 @@ typedef struct dap_chain_net_pvt{
     dap_chain_node_role_t node_role;
     uint8_t padding[4];
 
-    dap_chain_node_client_t * links_by_node_addr;
-    dap_chain_node_client_t * clients_by_ipv4;
-    dap_chain_node_client_t * clients_by_ipv6;
-    size_t clients_count;
+    dap_chain_node_info_t * node_info; // Current node's info
+
+    dap_chain_node_client_t * links;
+    size_t links_count;
 
     char ** seed_aliases;
     uint16_t seed_aliases_count;
@@ -92,7 +98,7 @@ static const char * c_net_states[]={
     [NET_STATE_LINKS_ESTABLISHED]= "NET_STATE_LINKS_ESTABLISHED",
     [NET_STATE_SYNC_GDB]= "NET_STATE_SYNC_GDB",
     [NET_STATE_SYNC_CHAINS]= "NET_STATE_SYNC_CHAINS",
-    [NET_STATE_SYNC_ALL]= "NET_STATE_STAND_BY"
+    [NET_STATE_STAND_BY]= "NET_STATE_STAND_BY"
 };
 
 static dap_chain_net_t * s_net_new(const char * a_id, const char * a_name , const char * a_node_role);
@@ -140,55 +146,136 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
 static int s_net_states_proc(dap_chain_net_t * l_net)
 {
     int ret=0;
+    pthread_mutex_lock(&PVT(l_net)->state_mutex );
+lb_proc_state:
     switch ( PVT(l_net)->state ){
         case NET_STATE_OFFLINE:{
+            log_it(L_NOTICE,"%s.state: NET_STATE_OFFLINE",l_net->pub.name);
             if ( PVT(l_net)->state_target != NET_STATE_OFFLINE ){
-                // Check if there are root nodes in list
-                switch ( PVT(l_net)->node_role.enums){
-                    case NODE_ROLE_ROOT_MASTER:
-                    case NODE_ROLE_ROOT:{
-                    }break;
-                    case NODE_ROLE_ARCHIVE:
-                    case NODE_ROLE_CELL_MASTER:
-                    case NODE_ROLE_MASTER:
-                    case NODE_ROLE_FULL:
-                    case NODE_ROLE_LIGHT:
-                    default:{};
-                };
+                PVT(l_net)->state_target = NET_STATE_LINKS_PING;
+                goto lb_proc_state;
             }
-        }break;
-        case NET_STATE_LINKS_PINGING:{
-            switch ( PVT(l_net)->node_role.enums){
-                case NODE_ROLE_ROOT_MASTER:
-                case NODE_ROLE_ROOT:{
-                }break;
-                case NODE_ROLE_ARCHIVE:
-                case NODE_ROLE_CELL_MASTER:
-                case NODE_ROLE_MASTER:
-                case NODE_ROLE_FULL:
-                case NODE_ROLE_LIGHT:
-                default:{}
-            };
-
+        } break;
+        case NET_STATE_LINKS_PING:{
+            log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_PING",l_net->pub.name);
+            PVT(l_net)->state_target = NET_STATE_LINKS_CONNECTING;
+            goto lb_proc_state;
         }break;
         case NET_STATE_LINKS_CONNECTING:{
-
-            log_it(L_DEBUG,"Connected %u/% links", PVT(l_net)->clients_count );
-            ret = 1;
-        }break;
+            log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name);
+            if ( PVT(l_net)->node_info ) {
+                size_t l_links_established = 0;
+                for (size_t i =0 ; i < PVT(l_net)->node_info->hdr.links_number; i++ ){
+                    dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read( &PVT(l_net)->node_info->links[i] );
+                    if ( l_link_node_info ) {
+                        dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_link_node_info );
+                        if(!l_node_client) {
+                            DAP_DELETE(l_link_node_info);
+                            ret = -1;
+                            break;
+                        }
+                        // wait connected
+                        int timeout_ms = 15000; //15 sec = 15000 ms
+                        int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+                        if (res == 0 ){
+                            log_it(L_NOTICE, "Connected link %u",i);
+                            l_links_established++;
+                            HASH_ADD(hh,PVT(l_net)->links, remote_node_addr,sizeof(l_node_client->remote_node_addr), l_node_client);
+                        }else {
+                            log_it(L_NOTICE, "Cant establish link %u",i);
+                            dap_chain_node_client_close(l_node_client);
+                        }
+                    }
+                }
+                if (l_links_established >0 ){
+                    log_it(L_NOTICE, "Established %u links",l_links_established);
+                    PVT(l_net)->state = NET_STATE_LINKS_ESTABLISHED;
+                    goto lb_proc_state;
+                }
+            }
+        } break;
         case NET_STATE_LINKS_ESTABLISHED:{
-
+            log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_ESTABLISHED",l_net->pub.name);
+            switch (PVT(l_net)->state_target) {
+                case NET_STATE_STAND_BY:
+                case NET_STATE_SYNC_GDB: PVT(l_net)->state = NET_STATE_SYNC_GDB ; goto lb_proc_state;
+                case NET_STATE_SYNC_CHAINS: PVT(l_net)->state = NET_STATE_SYNC_CHAINS ; goto lb_proc_state;
+                default:{}
+            }
         }break;
         case NET_STATE_SYNC_GDB:{
+            // send request
+            dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL;
+            HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){
+                size_t l_data_size_out = 0;
+                // Get last timestamp in log
+                time_t l_timestamp_start = dap_db_log_get_last_timestamp();
+                size_t l_data_send_len = 0;
+                uint8_t *l_data_send = dap_stream_ch_chain_net_make_packet(PVT(l_net)->node_info->hdr.address.uint64 ,
+                                            l_node_client->remote_node_addr.uint64,
+                        l_timestamp_start, NULL, 0, &l_data_send_len);
+
+                uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for global_db sync
+                int res = dap_chain_node_client_send_chain_net_request(l_node_client, l_ch_id,
+                            STREAM_CH_CHAIN_NET_PKT_TYPE_GLOBAL_DB_REQUEST_SYNC, l_data_send, l_data_send_len); //, NULL);
+                DAP_DELETE(l_data_send);
+                if(res != 1) {
+                    log_it(L_WARNING,"Can't send GDB sync request");
+                    HASH_DEL(PVT(l_net)->links,l_node_client);
+                    dap_chain_node_client_close(l_node_client);
+                    continue;
+                }
 
+                // wait for finishing of request
+                int timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
+                // TODO add progress info to console
+                res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_END, timeout_ms);
+                switch (res) {
+                    case 0:
+                        log_it(L_WARNING,"Timeout with link sync");
+                    break;
+                    case 1:
+                        log_it(L_INFO, "Node sync completed");
+                    break;
+                    default:
+                        log_it(L_INFO, "Node sync error %d",res);
+                }
+            }
+            if ( PVT(l_net)->state_target == NET_STATE_STAND_BY ){
+                PVT(l_net)->state = NET_STATE_SYNC_CHAINS;
+            }else {
+                PVT(l_net)->state = NET_STATE_STAND_BY;
+            }
+            goto lb_proc_state;
         }break;
         case NET_STATE_SYNC_CHAINS:{
+            dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL;
+            HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){
+                uint8_t l_ch_id = dap_stream_ch_chain_get_id(); // Channel id for global_db sync
+                dap_chain_t * l_chain = NULL;
+                DL_FOREACH(l_net->pub.chains, l_chain ){
+                    dap_stream_t * l_stream = dap_client_get_stream( l_node_client->client );
+                    if ( l_stream ){
+                        dap_stream_ch_t * l_ch = l_stream->channel [l_ch_id];
+                        if ( l_ch ) {
+                            dap_stream_ch_chain_pkt_t * l_chain_pkt;
+                            size_t l_chain_pkt_size = sizeof (l_chain_pkt->hdr) + sizeof (dap_stream_ch_chain_request_t );
+                            dap_stream_ch_chain_request_t * l_request = (dap_stream_ch_chain_request_t *) l_chain_pkt->data;
+
+                            dap_stream_ch_pkt_write(l_ch,'b',l_chain_pkt,l_chain_pkt_size);
+                        }
+                    }
+                }
+            }
+            PVT(l_net)->state = NET_STATE_STAND_BY;
+            goto lb_proc_state;
 
         }break;
-        case NET_STATE_SYNC_ALL:{
+        case NET_STATE_STAND_BY:{
 
         } break;
     }
+    pthread_mutex_unlock(&PVT(l_net)->state_mutex );
     return ret;
 }
 
@@ -409,6 +496,10 @@ int dap_chain_net_load(const char * a_net_name)
                                             dap_config_get_item_str(l_cfg , "general" , "name" ),
                                             dap_config_get_item_str(l_cfg , "general" , "node-role" )
                                            );
+        if(!l_net) {
+            log_it(L_ERROR,"Can't create l_net");
+            return -1;
+        }
         l_net->pub.gdb_groups_prefix = dap_strdup (
                     dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix","" ) );
 
@@ -437,7 +528,42 @@ int dap_chain_net_load(const char * a_net_name)
         // Check if seed nodes are present in local db alias
         PVT(l_net)->seed_aliases = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_aliases"
                                                              ,&PVT(l_net)->seed_aliases_count);
+        const char * l_node_ipv4_str = dap_config_get_item_str(l_cfg , "general" ,"node-ipv4");
+        const char * l_node_addr_str = dap_config_get_item_str(l_cfg , "general" ,"node-addr");
+        const char * l_node_alias_str = dap_config_get_item_str(l_cfg , "general" , "node-alias");
+         if ( l_node_alias_str ){
+            dap_chain_node_addr_t * l_node_addr;
+            if ( l_node_addr_str == NULL)
+                l_node_addr = dap_chain_node_alias_find(l_node_alias_str);
+            else{
+                l_node_addr = DAP_NEW_Z(dap_chain_node_addr_t);
+                if ( sscanf(l_node_addr_str, "0x%016lx",&l_node_addr->uint64 ) != 1 ){
+                    sscanf(l_node_addr_str,"0x%016lX",&l_node_addr->uint64);
+                }
+                if( l_node_addr->uint64 == 0 ){
+                    log_it(L_ERROR,"Can't parse node address");
+                    DAP_DELETE(l_node_addr);
+                    l_node_addr = NULL;
+                }
+                //}
+            }
+            if ( l_node_addr ) {
+                char *l_addr_hash_str = dap_chain_node_addr_to_hash_str(l_node_addr);
+                if(!l_addr_hash_str){
+                    log_it(L_ERROR,"Can't get hash string for node address!");
+                } else {
+                    PVT(l_net)->node_info = dap_chain_node_info_read (l_node_addr);
+                    if ( PVT(l_net)->node_info ) {
+                        log_it(L_NOTICE,"GDB Info: node_addr_hash: %s  links: %u cell_id: 0x%016X ",
+                               l_addr_hash_str,
+                               PVT(l_net)->node_info->hdr.links_number,
+                               PVT(l_net)->node_info->hdr.cell_id.uint64);
+                    }
+                }
+            }
+
 
+         }
         // Init chains
         size_t l_chains_path_size =strlen(dap_config_path())+1+strlen(l_net->pub.name)+1+strlen("network")+1;
         char * l_chains_path = DAP_NEW_Z_SIZE (char,l_chains_path_size);
@@ -490,7 +616,7 @@ int dap_chain_net_load(const char * a_net_name)
                 if (l_chain )
                    l_chain->is_datum_pool_proc = true;
 
-                PVT(l_net)->state_target = NET_STATE_SYNC_ALL;
+                PVT(l_net)->state_target = NET_STATE_STAND_BY;
                 log_it(L_INFO,"Root node role established");
             } break;
             case NODE_ROLE_CELL_MASTER:
@@ -499,12 +625,12 @@ int dap_chain_net_load(const char * a_net_name)
                 dap_chain_id_t l_chain_id = { .raw = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x01} };
                 dap_chain_t * l_chain = dap_chain_find_by_id(l_net->pub.id, l_chain_id );
                 l_chain->is_datum_pool_proc = true;
-                PVT(l_net)->state_target = NET_STATE_SYNC_ALL;
+                PVT(l_net)->state_target = NET_STATE_STAND_BY;
                 log_it(L_INFO,"Master node role established");
             } break;
             case NODE_ROLE_FULL:{
                 log_it(L_INFO,"Full node role established");
-                PVT(l_net)->state_target = NET_STATE_SYNC_ALL;
+                PVT(l_net)->state_target = NET_STATE_STAND_BY;
             } break;
             case NODE_ROLE_LIGHT:
             default:
@@ -603,7 +729,20 @@ dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const ch
    return NULL;
 }
 
+/**
+ * @brief dap_chain_net_get_cur_addr
+ * @param l_net
+ * @return
+ */
+dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net)
+{
+    return  PVT(l_net)->node_info? &PVT(l_net)->node_info->hdr.address: NULL;
+}
 
+/**
+ * @brief dap_chain_net_proc_datapool
+ * @param a_net
+ */
 void dap_chain_net_proc_datapool (dap_chain_net_t * a_net)
 {
 
diff --git a/dap_chain_net.h b/dap_chain_net.h
index e738dd252771315d0a12191692c94491a45d3c6a..f0b183e741622219ef00fd7828afa8b323024c76 100644
--- a/dap_chain_net.h
+++ b/dap_chain_net.h
@@ -28,6 +28,7 @@
 #include <stdint.h>
 #include <string.h>
 #include "dap_chain_common.h"
+#include "dap_chain_node.h"
 #include "dap_chain.h"
 
 
@@ -35,12 +36,12 @@
 
 typedef  enum dap_chain_net_state{
     NET_STATE_OFFLINE = 0,
-    NET_STATE_LINKS_PINGING,
+    NET_STATE_LINKS_PING,
     NET_STATE_LINKS_CONNECTING,
     NET_STATE_LINKS_ESTABLISHED,
     NET_STATE_SYNC_GDB,
     NET_STATE_SYNC_CHAINS,
-    NET_STATE_SYNC_ALL,
+    NET_STATE_STAND_BY,
 } dap_chain_net_state_t;
 
 
@@ -63,12 +64,12 @@ int dap_chain_net_load(const char * a_net_name);
 
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state);
 
-inline static int dap_chain_net_start(dap_chain_net_t * a_net){ return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_ALL); }
+inline static int dap_chain_net_start(dap_chain_net_t * a_net){ return dap_chain_net_state_go_to(a_net,NET_STATE_STAND_BY); }
 inline static int dap_chain_net_stop(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_OFFLINE); }
 inline static int dap_chain_net_links_establish(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_LINKS_ESTABLISHED); }
 inline static int dap_chain_net_sync_chains(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_CHAINS); }
 inline static int dap_chain_net_sync_gdb(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_GDB); }
-inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_ALL); }
+inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_STAND_BY); }
 
 void dap_chain_net_delete( dap_chain_net_t * a_net);
 void dap_chain_net_proc_datapool (dap_chain_net_t * a_net);
@@ -79,8 +80,11 @@ dap_chain_net_id_t dap_chain_net_id_by_name( const char * a_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);
+
 void dap_chain_net_links_connect(dap_chain_net_t * a_net);
 
+
 /**
  * @brief dap_chain_net_get_gdb_group_mempool
  * @param l_chain
diff --git a/dap_chain_node.c b/dap_chain_node.c
index 980ce0bd52e15a45e7d15e6641ac1e7dddfbff85..290a4ce4bca5a769a780f5fe9a48d0491213d4b0 100644
--- a/dap_chain_node.c
+++ b/dap_chain_node.c
@@ -72,7 +72,7 @@ bool dap_chain_node_alias_register(const char *alias, dap_chain_node_addr_t *add
 //    if(bin2hex(a_value, (const unsigned char *) addr, sizeof(dap_chain_node_addr_t)) == -1)
 //        return false;
 //    a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0';
-    bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t*) addr, sizeof(dap_chain_node_addr_t), GROUP_ALIAS);
+    bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t*) addr, sizeof(dap_chain_node_addr_t), GROUP_GLOBAL_ALIAS);
     return res;
 }
 
@@ -85,7 +85,7 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(const char *a_alias)
 {
     size_t l_addr_size =0;
     dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *)
-            dap_chain_global_db_gr_get(a_alias, &l_addr_size, GROUP_ALIAS);
+            dap_chain_global_db_gr_get(a_alias, &l_addr_size, GROUP_GLOBAL_ALIAS);
     return  l_addr;
 }
 
@@ -95,7 +95,7 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(const char *a_alias)
 bool dap_chain_node_alias_delete(const char *alias)
 {
     const char *a_key = alias;
-    bool res = dap_chain_global_db_gr_del(a_key, GROUP_ALIAS);
+    bool res = dap_chain_global_db_gr_del(a_key, GROUP_GLOBAL_ALIAS);
     return res;
 }
 
@@ -114,8 +114,66 @@ size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info)
     return (sizeof(dap_chain_node_info_t) + node_info->hdr.links_number * sizeof(dap_chain_node_addr_t));
 }
 
+/**
+ * @brief dap_chain_node_info_save
+ * @param node_info
+ * @return
+ */
+int dap_chain_node_info_save(dap_chain_node_info_t *node_info)
+{
+    if(!node_info || !node_info->hdr.address.uint64)
+        return  -1;
+
+    char *l_key = dap_chain_node_addr_to_hash_str(&node_info->hdr.address);
+
+    if(!l_key)
+        return -2;
 
+    //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
+    size_t node_info_size = dap_chain_node_info_get_size(node_info);
+    bool res = dap_chain_global_db_gr_set(l_key, (const uint8_t *) node_info, node_info_size, GROUP_GLOBAL_ADDRS_LEASED);
+    DAP_DELETE(l_key);
+    //DAP_DELETE(a_value);
+    return res;
+}
 
+/**
+ * Read node from base
+ */
+dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_node_addr_t *address)
+{
+    char *l_key = dap_chain_node_addr_to_hash_str(address);
+    if(!l_key) {
+        log_it(L_WARNING,"Can't calculate hash of addr");
+        return NULL;
+    }
+    size_t node_info_size = 0;
+    dap_chain_node_info_t *node_info;
+    // read node
+    node_info = (dap_chain_node_info_t *) dap_chain_global_db_gr_get(l_key, &node_info_size, GROUP_GLOBAL_ADDRS_LEASED);
+
+    if(!node_info) {
+        log_it(L_ERROR, "node not found in base");
+        DAP_DELETE(l_key);
+        return NULL;
+    }
+
+    size_t node_info_size_must_be = dap_chain_node_info_get_size(node_info);
+    if(node_info_size_must_be != node_info_size) {
+        log_it(L_ERROR, "Node has bad size in base=%u (must be %u)", node_info_size, node_info_size_must_be);
+        DAP_DELETE(node_info);
+        DAP_DELETE(l_key);
+        return NULL;
+    }
+
+//    dap_chain_node_info_t *node_info = dap_chain_node_info_deserialize(str, (str) ? strlen(str) : 0);
+//    if(!node_info) {
+//        set_reply_text(str_reply, "node has invalid format in base");
+//    }
+//    DAP_DELETE(str);
+    DAP_DELETE(l_key);
+    return node_info;
+}
 
 
 /**
diff --git a/dap_chain_node.h b/dap_chain_node.h
index 62b3f3a44a8aae24815849f3e6fb1323ef187393..be639a86f1f3c6b4a252f458e25d584bcb656eff 100644
--- a/dap_chain_node.h
+++ b/dap_chain_node.h
@@ -30,6 +30,7 @@
 
 #include "dap_common.h"
 #include "dap_chain_common.h"
+#include "dap_chain_global_db.h"
 
 /**
   * @struct Node address
@@ -124,4 +125,13 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(const char *alias);
 bool dap_chain_node_alias_register(const char *alias, dap_chain_node_addr_t *addr);
 bool dap_chain_node_alias_delete(const char *alias);
 
+int dap_chain_node_info_save(dap_chain_node_info_t *node_info);
+dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_node_addr_t *address);
+
+inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *address)
+{
+    char *a_key = dap_chain_global_db_hash((const uint8_t*) address, sizeof(dap_chain_node_addr_t));
+    return a_key;
+}
+
 
diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c
index 4913852c03a7f9f15a013a65904addba881f2d94..c82d0f28149921c3be85438a139794a9c269f359 100644
--- a/dap_chain_node_cli.c
+++ b/dap_chain_node_cli.c
@@ -356,7 +356,7 @@ void dap_chain_node_cli_set_reply_text(char **str_reply, const char *str, ...)
 {
     if(str_reply) {
         if(*str_reply) {
-            assert(!*str_reply);
+            assert(! *str_reply );
             DAP_DELETE(*str_reply);
             *str_reply = NULL;
         }
@@ -459,9 +459,9 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
                     "global_db node link {add|del}  -net <net name> {-addr <node address> | -alias <node alias>} -link <node address>\n\n"
                     "global_db node dump  -net <net name>\n\n"
                     "global_db node dump  -net <net name> -addr <node address> | -alias <node alias>\n\n"
-                    "global_db node get -net <net name>\n\n"
-                    "global_db node set -net <net name> -addr <node address> | -alias <node alias>\n\n"
-          "global_db node remote_set -addr <node address> | -alias <node alias>\n");
+                    "global_db node cur_node get -net <net name>\n\n"
+                    "global_db node cur_node_set -net <net name> -addr <node address> | -alias <node alias>\n\n"
+                    "global_db node cur_node_set_from_remote -addr <node address> | -alias <node alias>\n");
     dap_chain_node_cli_cmd_item_create ("node", com_node, "Work with node",
             "node alias {<node address> | -alias <node alias>}\n\n"
                     "node connect {<node address> | -alias <node alias>}\n\n"
diff --git a/dap_chain_node_cli_cmd.h b/dap_chain_node_cli_cmd.h
index c8aeecae1631e9e3b403ba62909716a239dfb858..98b77ac556cf053ef74c9fc6ab547995011e5ad9 100644
--- a/dap_chain_node_cli_cmd.h
+++ b/dap_chain_node_cli_cmd.h
@@ -115,6 +115,10 @@ int com_tx_cond_create(int argc, const char ** argv, char **str_reply);
  */
 int com_tx_verify(int argc, const char ** argv, char **str_reply);
 
+// Print log info
+int com_print_log(int argc, const char ** argv, char **str_reply);
+
 int com_mempool_delete(int argc, const char ** argv, char ** a_str_reply);
 int com_mempool_list(int argc, const char ** argv, char ** a_str_reply);
 int com_mempool_proc(int argc, const char ** argv, char ** a_str_reply);
+
diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c
index b3171682fb21cafdb603178e6527326b58477914..28b09a0a53c5c8b83585594706609299da838399 100644
--- a/dap_chain_node_client.c
+++ b/dap_chain_node_client.c
@@ -49,8 +49,6 @@ static int listen_port_tcp = 8079;
 
 int dap_chain_node_client_init(void)
 {
-    int res = dap_client_init();
-    res = dap_http_client_simple_init();
     dap_config_t *g_config;
     // read listen_port_tcp from settings
     dap_config_init(SYSTEM_CONFIGS_DIR);
@@ -63,7 +61,7 @@ int dap_chain_node_client_init(void)
     }
     if(g_config)
         dap_config_close(g_config);
-    return res;
+    return 0;
 }
 
 void dap_chain_node_client_deinit()
@@ -86,13 +84,15 @@ static void stage_status_error_callback(dap_client_t *a_client, void *a_arg)
 // callback for the end of connection in dap_chain_node_client_connect()->dap_client_go_stage()
 static void a_stage_end_callback(dap_client_t *a_client, void *a_arg)
 {
-    dap_chain_node_client_t *client = a_client->_inheritor;
-    assert(client);
-    if(client) {
-        pthread_mutex_lock(&client->wait_mutex);
-        client->state = NODE_CLIENT_STATE_CONNECTED;
-        pthread_cond_signal(&client->wait_cond);
-        pthread_mutex_unlock(&client->wait_mutex);
+    dap_chain_node_client_t *l_node_client = a_client->_inheritor;
+    assert(l_node_client);
+    if(l_node_client) {
+        pthread_mutex_lock(&l_node_client->wait_mutex);
+        l_node_client->state = NODE_CLIENT_STATE_CONNECTED;
+        if ( l_node_client->callback_connected )
+            l_node_client->callback_connected(l_node_client,a_arg);
+        pthread_cond_signal(&l_node_client->wait_cond);
+        pthread_mutex_unlock(&l_node_client->wait_mutex);
     }
 }
 
@@ -295,7 +295,7 @@ int dap_chain_node_client_send_chain_net_request(dap_chain_node_client_t *a_clie
  * waited_state state which we will wait, sample NODE_CLIENT_STATE_CONNECT or NODE_CLIENT_STATE_SENDED
  * return -1 false, 0 timeout, 1 end of connection or sending data
  */
-int chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int timeout_ms)
+int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int timeout_ms)
 {
     int ret = -1;
     if(!a_client)
diff --git a/dap_chain_node_client.h b/dap_chain_node_client.h
index a9fd376732a8c113d9266b97cd66ffebceb32b9a..46158cf7338ee393bbc0d54b6c265c7a1c7485a9 100644
--- a/dap_chain_node_client.h
+++ b/dap_chain_node_client.h
@@ -57,7 +57,7 @@ typedef struct dap_chain_node_client {
     dap_client_t *client;
     dap_events_t *events;
 
-    dap_chain_node_client_callback_t callback_stream_connected;
+    dap_chain_node_client_callback_t callback_connected;
     pthread_cond_t wait_cond;
     pthread_mutex_t wait_mutex;
     uint8_t *recv_data;
@@ -102,5 +102,5 @@ int dap_chain_node_client_send_chain_net_request(dap_chain_node_client_t *a_clie
  * waited_state state which we will wait, sample NODE_CLIENT_STATE_CONNECT or NODE_CLIENT_STATE_SENDED
  * return -1 false, 0 timeout, 1 end of connection or sending data
  */
-int chain_node_client_wait(dap_chain_node_client_t *client, dap_chain_node_client_state_t waited_state, int timeout_ms);
+int dap_chain_node_client_wait(dap_chain_node_client_t *client, dap_chain_node_client_state_t waited_state, int timeout_ms);