diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index f76fc708cf9ed5b77daa41323bfb93b986b1ac1f..7694b786979b6f1c01c2693e27a24facdbeaaca4 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -788,7 +788,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
         const char *l_last_group = l_store_obj->group;
         uint32_t l_last_type = l_store_obj->type;
         bool l_group_changed = false;
-        uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "resources", "dap_global_db_time_store_limit", 72);
+        uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "global_db", "time_store_limit", 72);
         dap_nanotime_t l_time_now = dap_nanotime_now() + dap_nanotime_from_sec(120);    // time differnece consideration
         dap_nanotime_t l_limit_time = l_time_store_lim_hours ? l_time_now - dap_nanotime_from_sec(l_time_store_lim_hours * 3600) : 0;
         for (size_t i = 0; i < l_data_obj_count; i++) {
@@ -950,12 +950,9 @@ static bool s_chain_timer_callback(void *a_arg)
 
 static void s_chain_timer_reset(dap_stream_ch_chain_t *a_ch_chain)
 {
-    if (s_ch_chain_get_idle(a_ch_chain))
-        return;
-    if (!a_ch_chain->activity_timer) {
-        dap_stream_ch_chain_timer_start(a_ch_chain);
-    }
     a_ch_chain->timer_shots = 0;
+    if (!a_ch_chain->activity_timer)
+        dap_stream_ch_chain_timer_start(a_ch_chain);
 }
 
 void dap_stream_ch_chain_timer_start(dap_stream_ch_chain_t *a_ch_chain)
@@ -1585,6 +1582,7 @@ static void s_ch_chain_go_idle(dap_stream_ch_chain_t *a_ch_chain)
         DAP_DELETE(l_hash_item);
     }
     a_ch_chain->remote_atoms = NULL;
+    a_ch_chain->sent_breaks = 0;
 }
 
 struct chain_io_complete {
@@ -1870,9 +1868,10 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
     }
     if (l_go_idle)
         s_ch_chain_go_idle(l_ch_chain);
+    else
+        s_chain_timer_reset(l_ch_chain);
     if (l_was_sent_smth)
         l_ch_chain->sent_breaks = 0;
     else
         l_ch_chain->sent_breaks++;
-    s_chain_timer_reset(l_ch_chain);
 }
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index a22e47f6f7eb928220bec2dd13a8812c15b8b3c7..daef86b3808c1bb4ff561589b5bc7d0407fc4834 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -170,8 +170,9 @@ typedef struct dap_chain_net_pvt{
     bool only_static_links;
     uint16_t required_links_count;
     uint16_t max_links_count;
+    uint16_t reconnect_delay;         // sec
 
-    struct downlink *downlinks;             // HT of links who sent SYNC REQ, it used for sync broadcasting
+    struct downlink *downlinks;         // HT of links who sent SYNC REQ, it used for sync broadcasting
     dap_list_t *records_queue;
     dap_list_t *atoms_queue;
 
@@ -245,12 +246,12 @@ static void s_node_link_callback_stage(dap_chain_node_client_t * a_node_client,d
 static void s_node_link_callback_error(dap_chain_node_client_t * a_node_client, int a_error, void * a_arg);
 static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, void * a_arg);
 
-static const dap_chain_node_client_callbacks_t s_node_link_callbacks={
-    .connected=s_node_link_callback_connected,
-    .disconnected=s_node_link_callback_disconnected,
-    .stage=s_node_link_callback_stage,
-    .error=s_node_link_callback_error,
-    .delete=s_node_link_callback_delete
+static const dap_chain_node_client_callbacks_t s_node_link_callbacks = {
+    .connected      = s_node_link_callback_connected,
+    .disconnected   = s_node_link_callback_disconnected,
+    .stage          = s_node_link_callback_stage,
+    .error          = s_node_link_callback_error,
+    .delete         = s_node_link_callback_delete
 };
 
 // State machine switchs here
@@ -679,6 +680,43 @@ static size_t s_net_get_active_links_count(dap_chain_net_t * a_net)
     return l_ret;
 }
 
+static struct net_link *s_get_free_link(dap_chain_net_t *a_net)
+{
+    struct net_link *l_link, *l_link_tmp;
+    HASH_ITER(hh,  PVT(a_net)->net_links, l_link, l_link_tmp) {
+        if (l_link->link == NULL)  // We have a free prepared link
+            return l_link;
+    }
+    return NULL;
+}
+
+static bool s_net_link_callback_connect_delayed(void *a_arg)
+{
+    dap_chain_node_client_t *l_client = a_arg;
+    debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", NODE_ADDR_FP_ARGS_S(l_client->info->hdr.address));
+    dap_chain_node_client_connect(l_client, "CN");
+    return false;
+}
+
+static bool s_net_link_start(dap_chain_net_t *a_net, struct net_link *a_link, uint16_t a_delay)
+{
+    assert(a_net && a_link);
+    dap_chain_node_info_t *l_link_info = a_link->link_info;
+    dap_chain_node_client_t *l_client = dap_chain_node_client_create(a_net, l_link_info, &s_node_link_callbacks, a_net);
+    if (l_client)
+        l_client->keep_connection = true;
+    else
+        return false;
+    a_link->link = l_client;
+    a_link->client_uuid = l_client->uuid;
+    if (a_delay) {
+        dap_timerfd_start(a_delay * 1000, s_net_link_callback_connect_delayed, l_client);
+        return true;
+    }
+    debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address));
+    return dap_chain_node_client_connect(l_client, "CN");
+}
+
 /**
  * @brief s_fill_links_from_root_aliases
  * @param a_net
@@ -744,21 +782,6 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie
 
 }
 
-static bool s_start_free_link(dap_chain_net_t *a_net)
-{
-    struct net_link *l_link, *l_link_tmp;
-    HASH_ITER(hh,  PVT(a_net)->net_links, l_link, l_link_tmp) {
-        if (l_link->link == NULL) {  // We have a free prepared link
-            dap_chain_node_client_t *l_client_new = dap_chain_net_client_create_n_connect(
-                                                              a_net, l_link->link_info);
-            l_link->link = l_client_new;
-            l_link->client_uuid = l_client_new->uuid;
-            return true;
-        }
-    }
-    return false;
-}
-
 /**
  * @brief s_node_link_callback_disconnected
  * @param a_node_client
@@ -779,7 +802,9 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_cl
         pthread_rwlock_wrlock(&l_net_pvt->uplinks_lock);
         s_net_link_remove(l_net_pvt, a_node_client->uuid, l_net_pvt->only_static_links);
         a_node_client->keep_connection = false;
-        if (s_start_free_link(l_net)) {
+        struct net_link *l_free_link = s_get_free_link(l_net);
+        if (l_free_link) {
+            s_net_link_start(l_net, l_free_link, l_net_pvt->reconnect_delay);
             pthread_rwlock_unlock(&l_net_pvt->uplinks_lock);
             return;
         }
@@ -863,10 +888,8 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client,
     struct net_link *l_link, *l_link_tmp;
     HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) {
         if (l_link->link == a_node_client) {
-            log_it(L_DEBUG,"Replace node client with new one");
-            dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, a_node_client->info);
-            l_link->link = l_client;
-            l_link->client_uuid = l_client->uuid;
+            log_it(L_DEBUG, "Replace node client with new one with %d sec", l_net_pvt->reconnect_delay);
+            s_net_link_start(l_net, l_link, l_net_pvt->reconnect_delay);
         }
     }
     pthread_rwlock_unlock(&l_net_pvt->uplinks_lock);
@@ -941,12 +964,11 @@ static void s_net_balancer_link_prepare_success(dap_worker_t * a_worker, dap_cha
             // Auto-start new link
             pthread_rwlock_rdlock(&PVT(l_net)->states_lock);
             if (PVT(l_net)->state_target != NET_STATE_OFFLINE) {
-                debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started",
-                                                       NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address));
-                dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, a_node_info);
                 struct net_link *l_new_link = s_net_link_find(l_net, a_node_info);
-                l_new_link->link = l_client;
-                l_new_link->client_uuid = l_client->uuid;
+                if (l_new_link)
+                    s_net_link_start(l_net, l_new_link, PVT(l_net)->reconnect_delay);
+                else
+                    s_new_balancer_link_request(l_net, l_balancer_request->link_replace_tries);
             }
             pthread_rwlock_unlock(&PVT(l_net)->states_lock);
         }
@@ -1031,7 +1053,8 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla
         // network problems, make static links
         s_fill_links_from_root_aliases(a_net);
         pthread_rwlock_wrlock(&l_net_pvt->uplinks_lock);
-        s_start_free_link(a_net);
+        struct net_link *l_free_link = s_get_free_link(a_net);
+        s_net_link_start(a_net, l_free_link, 0);
         pthread_rwlock_unlock(&l_net_pvt->uplinks_lock);
         return false;
     }
@@ -1228,10 +1251,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
             size_t l_used_links = 0;
             struct net_link *l_link, *l_link_tmp;
             HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) {
-                dap_chain_node_info_t *l_link_info = l_link->link_info;
-                dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, l_link_info);
-                l_link->link = l_client;
-                l_link->client_uuid = l_client->uuid;
+                s_net_link_start(l_net, l_link, 0);
                 if (++l_used_links == l_net_pvt->required_links_count)
                     break;
             }
@@ -1322,36 +1342,6 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *
     pthread_rwlock_unlock(&l_net_pvt->uplinks_lock);
     return l_ret;
 }
-/**
- * @brief dap_chain_net_client_create_n_connect
- * @param a_net
- * @param a_link_info
- * @return
- */
-struct dap_chain_node_client * dap_chain_net_client_create_n_connect( dap_chain_net_t * a_net,struct dap_chain_node_info* a_link_info)
-{
-    dap_chain_node_client_t *l_ret = dap_chain_node_client_create_n_connect(a_net,
-                                                                            a_link_info,
-                                                                            "CN",
-                                                                            (dap_chain_node_client_callbacks_t *)&s_node_link_callbacks,
-                                                                            a_net);
-    if (l_ret)
-        l_ret->keep_connection = true;
-    return l_ret;
-}
-
-/**
- * @brief dap_chain_net_client_create_n_connect_channels
- * @param a_net
- * @param a_link_info
- * @param a_channels
- * @return
- */
-struct dap_chain_node_client * dap_chain_net_client_create_n_connect_channels( dap_chain_net_t * a_net,struct dap_chain_node_info* a_link_info,const char * a_channels )
-{
-    return dap_chain_node_client_create_n_connect(a_net, a_link_info,a_channels,(dap_chain_node_client_callbacks_t *)&s_node_link_callbacks,a_net);
-}
-
 
 /**
  * @brief dap_chain_net_get_role
@@ -2255,6 +2245,8 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
         l_net_pvt->max_links_count = dap_config_get_item_int16_default(l_cfg, "general", "max_links", 5);
         // required number of active connections to other nodes
         l_net_pvt->required_links_count = dap_config_get_item_int16_default(l_cfg, "general", "require_links", 3);
+        // wait time before reconnect attempt with same link
+        l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10);
 
         const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto");
 
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index ea1af2558b987d1bb8b8ae1c3f410072c7adaf26..95c52c38118e280229b6a390c68c850680cd923e 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1147,7 +1147,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
                 return -1;
             }
             // start connect
-            l_node_client = dap_chain_node_client_connect(l_net,l_remote_node_info);
+            l_node_client = dap_chain_node_client_connect_default_channels(l_net,l_remote_node_info);
             if(!l_node_client) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "can't connect");
                 DAP_DELETE(l_remote_node_info);
@@ -1210,8 +1210,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             uint8_t l_ch_id = dap_stream_ch_chain_net_get_id();
             dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, l_ch_id);
 
-            int l_res = dap_chain_node_client_set_callbacks( l_node_client->client, l_ch_id);
-
             size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain,
             DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST,
             //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST,
@@ -1224,7 +1222,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
                 return -1;
             }
             int timeout_ms = 15000; // 15 sec = 15 000 ms
-            l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms);
+            int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms);
             switch (l_res) {
             case 0:
                 if(l_node_client->cur_node_addr.uint64 != 0) {
@@ -1358,7 +1356,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             return -6;
         int timeout_ms = 5000; //5 sec = 5000 ms
         // start handshake
-        dap_chain_node_client_t *client = dap_chain_node_client_connect(l_net,node_info);
+        dap_chain_node_client_t *client = dap_chain_node_client_connect_default_channels(l_net,node_info);
         if(!client) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
             DAP_DELETE(node_info);
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 4a9ad7d32375cdef9cf6e570b0e58d1cfc2dbbe7..5ea1d1d8c8f3ef988ffd825498ed9b2aab01796b 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -85,14 +85,13 @@ static dap_chain_node_client_handle_t * s_clients = NULL;
 
 static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg);
 static bool s_timer_update_states_callback(void *a_arg);
-
+static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_ch_id);
 static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t*, uint8_t a_pkt_type,
         dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size,
         void * a_arg);
 static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_chain, uint8_t a_pkt_type,
         dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size,
         void * a_arg);
-static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels);
 
 bool s_stream_ch_chain_debug_more = false;
 uint32_t s_timer_update_states = 600;
@@ -342,7 +341,7 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
         if(l_client_internal && l_client_internal->active_channels) {
             size_t l_channels_count = dap_strlen(l_client_internal->active_channels);
             for(size_t i = 0; i < l_channels_count; i++) {
-                if(dap_chain_node_client_set_callbacks(a_client, l_client_internal->active_channels[i]) == -1) {
+                if(s_node_client_set_notify_callbacks(a_client, l_client_internal->active_channels[i]) == -1) {
                     log_it(L_WARNING, "No ch_chain channel, can't init notify callback for pkt type CH_CHAIN");
                     return;
                 }
@@ -729,20 +728,6 @@ static void s_ch_chain_callback_notify_packet_R(dap_stream_ch_chain_net_srv_t* a
     }
 }
 
-
-/**
- * @brief dap_chain_node_client_connect_channels
- * Create connection to server
- * @param l_net
- * @param a_node_info
- * @param a_active_channels
- * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error
- */
-dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * l_net, dap_chain_node_info_t *a_node_info, const char *a_active_channels)
-{
-    return dap_chain_net_client_create_n_connect_channels(l_net,a_node_info,a_active_channels);
-}
-
 /**
  * @brief dap_chain_node_client_create_n_connect
  * @param a_net
@@ -752,8 +737,22 @@ dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t
  * @param a_callback_arg
  * @return
  */
-dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info,
-        const char *a_active_channels,dap_chain_node_client_callbacks_t *a_callbacks, void * a_callback_arg )
+dap_chain_node_client_t *dap_chain_node_client_create_n_connect(dap_chain_net_t *a_net,
+                                                                dap_chain_node_info_t *a_node_info,
+                                                                const char *a_active_channels,
+                                                                const dap_chain_node_client_callbacks_t *a_callbacks,
+                                                                void *a_callback_arg)
+{
+    dap_chain_node_client_t *l_node_client = dap_chain_node_client_create(a_net, a_node_info, a_callbacks, a_callback_arg);
+    if (dap_chain_node_client_connect(l_node_client, a_active_channels))
+        return l_node_client;
+    return NULL;
+}
+
+dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net,
+                                                      dap_chain_node_info_t *a_node_info,
+                                                      const dap_chain_node_client_callbacks_t *a_callbacks,
+                                                      void *a_callback_arg)
 {
     if(!a_node_info) {
         log_it(L_ERROR, "Can't connect to the node: null object node_info");
@@ -763,7 +762,7 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
 
     l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED;
     l_node_client->callbacks_arg = a_callback_arg;
-    if(a_callbacks)
+    if (a_callbacks)
         l_node_client->callbacks = *a_callbacks;
     l_node_client->info = DAP_DUP(a_node_info);
     l_node_client->uuid = dap_uuid_generate_uint64();
@@ -786,21 +785,21 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
 
     pthread_mutex_init(&l_node_client->wait_mutex, NULL);
     l_node_client->remote_node_addr.uint64 = a_node_info->hdr.address.uint64;
-    if (dap_chain_node_client_connect_internal(l_node_client, a_active_channels))
-        return l_node_client;
-    return NULL;
+    return l_node_client;
 }
 
 /**
- * @brief dap_chain_node_client_connect_internal
+ * @brief dap_chain_node_client_connect
  * Create new dap_client, setup it, and send it in adventure trip
  * @param a_node_client dap_chain_node_client_t
  * @param a_active_channels a_active_channels
  * @return true
  * @return false
  */
-static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels)
+bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const char *a_active_channels)
 {
+    if (!a_node_client)
+        return false;
     a_node_client->client = dap_client_new( s_stage_status_callback,
             s_stage_status_error_callback);
     dap_client_set_is_always_reconnect(a_node_client->client, false);
@@ -814,15 +813,14 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
     if(a_node_client->info->hdr.ext_addr_v4.s_addr){
         struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_client->info->hdr.ext_addr_v4 };
         inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen);
-        log_it(L_INFO, "Connecting to %s address",host);
     } else {
         struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_client->info->hdr.ext_addr_v6 };
         inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen);
-        log_it(L_INFO, "Connecting to %s address",host);
     }
+    log_it(L_INFO, "Connecting to %s address", host);
     // address not defined
     if(!strcmp(host, "::")) {
-        dap_chain_node_client_close(a_node_client->uuid);
+        log_it(L_WARNING, "Undefined address with node client connect to");
         return false;
     }
     dap_client_set_uplink_unsafe(a_node_client->client, host, a_node_client->info->hdr.ext_port);
@@ -832,19 +830,6 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
     return true;
 }
 
-/**
- * @brief dap_chain_node_client_connect
- * Create connection to server
- * @param a_net
- * @param a_node_info
- * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error
- */
-dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net,dap_chain_node_info_t *a_node_info)
-{
-    const char *l_active_channels = "CN";
-    return dap_chain_node_client_connect_channels(a_net,a_node_info, l_active_channels);
-}
-
 /**
  * @brief dap_chain_node_client_reset
  *
@@ -1021,14 +1006,16 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s
 }
 
 /**
- * @brief dap_chain_node_client_set_callbacks
+ * @brief s_node_client_set_notify_callbacks
  *
  * @param a_client dap_client_t
  * @param a_ch_id uint8_t
  * @return int
  */
-int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
+static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
 {
+    //TODO pass callbacks through stream creation to internal ch structures
+
     int l_ret = -1;
     dap_chain_node_client_t *l_node_client = a_client->_inheritor;
     if(l_node_client) {
@@ -1059,9 +1046,9 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
             // R
             if(a_ch_id == dap_stream_ch_chain_net_srv_get_id()) {
                 dap_stream_ch_chain_net_srv_t *l_ch_chain = DAP_STREAM_CH_CHAIN_NET_SRV(l_ch);
-                if (l_node_client->callbacks.srv_pkt_in) {
+                if (l_node_client->notify_callbacks.srv_pkt_in) {
                     l_ch_chain->notify_callback = (dap_stream_ch_chain_net_srv_callback_packet_t)
-                                                             l_node_client->callbacks.srv_pkt_in;
+                                                             l_node_client->notify_callbacks.srv_pkt_in;
                     l_ch_chain->notify_callback_arg = l_node_client->callbacks_arg;
                 } else {
                     l_ch_chain->notify_callback = s_ch_chain_callback_notify_packet_R;
@@ -1086,15 +1073,6 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
     return l_ret;
 }
 
-/*static void nodelist_response_callback(dap_client_t *a_client, void *data, size_t data_len)
-{
-}
-
-static void nodelist_response_error_callback(dap_client_t *a_client, int a_err)
-{
-}*/
-
-
 /**
  * @brief dap_chain_node_client_send_nodelist_req
  * Send nodelist request to server
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 1aecefcb8a96e92c24778025c1ceb2a28b81bbd5..dd739d590761ede5d9a26e8ccdd7f61815b88f33 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -185,10 +185,6 @@ int dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_wo
 void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg);
 void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg);
 
-struct dap_chain_node_client * dap_chain_net_client_create_n_connect( dap_chain_net_t * a_net, struct dap_chain_node_info *a_link_info);
-struct dap_chain_node_client * dap_chain_net_client_create_n_connect_channels( dap_chain_net_t * a_net,struct dap_chain_node_info *a_link_info,
-                                                                               const char * a_channels);
-
 /**
  * @brief dap_chain_datum_list
  * Get datum list by filter
diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h
index b8d06075cfa14572d5e3af0385d83ae72f34fa3f..6a311c5f3aabd104e5a68efc5dc55a793953c45b 100644
--- a/modules/net/include/dap_chain_node_client.h
+++ b/modules/net/include/dap_chain_node_client.h
@@ -64,20 +64,22 @@ typedef void (*dap_chain_node_client_callback_t)(dap_chain_node_client_t *, void
 typedef void (*dap_chain_node_client_callback_stage_t)(dap_chain_node_client_t *, dap_client_stage_t, void * );
 typedef void (*dap_chain_node_client_callback_error_t)(dap_chain_node_client_t *, int, void *);
 
-typedef struct dap_chain_node_client_callbacks{
+typedef struct dap_chain_node_client_callbacks {
     dap_chain_node_client_callback_t connected;
     dap_chain_node_client_callback_t disconnected;
     dap_chain_node_client_callback_t delete;
     dap_chain_node_client_callback_stage_t stage;
     dap_chain_node_client_callback_error_t error;
+} dap_chain_node_client_callbacks_t;
 
+typedef struct dap_chain_node_client_notify_callbacks {
     dap_stream_ch_callback_packet_t chain_pkt_in;
     dap_stream_ch_callback_packet_t chain_pkt_out;
     dap_stream_ch_callback_packet_t net_pkt_in;
     dap_stream_ch_callback_packet_t net_pkt_out;
     dap_stream_ch_callback_packet_t srv_pkt_in;
     dap_stream_ch_callback_packet_t srv_pkt_out;
-} dap_chain_node_client_callbacks_t;
+} dap_chain_node_client_notify_callbacks_t;
 
 // state for a client connection
 typedef struct dap_chain_node_client {
@@ -136,7 +138,8 @@ typedef struct dap_chain_node_client {
     dap_timerfd_t *sync_timer;
     // callbacks
     dap_chain_node_client_callbacks_t callbacks;
-    void * callbacks_arg;
+    dap_chain_node_client_notify_callbacks_t notify_callbacks;
+    void *callbacks_arg;
 } dap_chain_node_client_t;
 
 #define DAP_CHAIN_NODE_CLIENT(a) (a ? (dap_chain_node_client_t *) (a)->_inheritor : NULL)
@@ -145,18 +148,28 @@ int dap_chain_node_client_init(void);
 
 void dap_chain_node_client_deinit(void);
 
-dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info,
-                                                                const char *a_active_channels,dap_chain_node_client_callbacks_t *a_callbacks,
-                                                                void * a_callback_arg );
+dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net, dap_chain_node_info_t *a_node_info,
+                                                      const dap_chain_node_client_callbacks_t *a_callbacks, void *a_callback_arg);
 
+bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const char *a_active_channels);
 
-dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info,  const char *a_active_channels);
 /**
  * Create handshake to server
  *
  * return a connection handle, or NULL, if an error
  */
-dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net, dap_chain_node_info_t *node_info);
+dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t *a_net, dap_chain_node_info_t *a_node_info,
+                                                                const char *a_active_channels, const dap_chain_node_client_callbacks_t *a_callbacks,
+                                                                void *a_callback_arg);
+
+DAP_STATIC_INLINE dap_chain_node_client_t *dap_chain_node_client_connect_channels(dap_chain_net_t *a_net,
+                                                                                  dap_chain_node_info_t *a_node_info,
+                                                                                  const char *a_active_channels)
+{ return dap_chain_node_client_create_n_connect(a_net, a_node_info, a_active_channels, NULL, NULL); }
+
+DAP_STATIC_INLINE dap_chain_node_client_t* dap_chain_node_client_connect_default_channels(dap_chain_net_t *a_net, dap_chain_node_info_t *a_node_info)
+{ return dap_chain_node_client_connect_channels(a_net,a_node_info, "CN"); }
+
 
 dap_chain_node_client_t *dap_chain_node_client_find(dap_events_socket_uuid_t a_uuid);
 
@@ -184,8 +197,6 @@ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t
  */
 int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int a_timeout_ms);
 
-int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id);
-
 int dap_chain_node_client_send_nodelist_req(dap_chain_node_client_t *a_client);
 
 dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *l_uuid);
diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c
index 6084e6895177ba0f05129d6f4977469e61ec3eb2..6f0cb58542fb9b6b9304a426eb8c297b01d4b36d 100644
--- a/modules/net/srv/dap_chain_net_srv_client.c
+++ b/modules/net/srv/dap_chain_net_srv_client.c
@@ -49,7 +49,6 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_
         .disconnected = s_srv_client_callback_disconnected,
         .delete = s_srv_client_callback_deleted
     };
-    l_callbacks.srv_pkt_in = (dap_stream_ch_callback_packet_t)s_srv_client_pkt_in;
     dap_chain_node_info_t *l_info = DAP_NEW_Z(dap_chain_node_info_t);
     inet_pton(AF_INET, a_addr, &l_info->hdr.ext_addr_v4);
     l_info->hdr.ext_port = a_port;
@@ -57,6 +56,7 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_
     l_ret->node_client = dap_chain_node_client_create_n_connect(a_net, l_info,
                                                                 l_channels,
                                                                 &l_callbacks, l_ret);
+    l_ret->node_client->notify_callbacks.srv_pkt_in = (dap_stream_ch_callback_packet_t)s_srv_client_pkt_in;
     DAP_DELETE(l_info);
     return l_ret;
 }