diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9f39fae0270e87948077680944c78f7bbf23fa2a..b02e90542e7f106fc08f385c56d4f6c8dc7f7ee4 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,7 +33,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS
 find_package(PkgConfig REQUIRED)
 pkg_search_module(GLIB REQUIRED glib-2.0)
 
-target_link_libraries(dap_chain_net dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_wallet dap_chain_mempool dap_chain_global_db -lresolv ${GLIB_LDFLAGS})
+target_link_libraries(dap_chain_net dap_core dap_crypto dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_crypto dap_chain_wallet dap_chain_mempool dap_chain_global_db -lresolv ${GLIB_LDFLAGS})
 target_include_directories(dap_chain_net INTERFACE . PUBLIC ${GLIB_INCLUDE_DIRS} ${IPUTILS_INCLUDE_DIRS})
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c
index 11b6405c511f6a77ca3e1e1d0a755dc76e5ac799..4efe82a53ba64bccab20b14b706cf8657a06433f 100644
--- a/dap_chain_node_cli.c
+++ b/dap_chain_node_cli.c
@@ -76,6 +76,7 @@ static const COMMAND commands[] =
                 "tracepath host" },
             { "help", com_help, "Description of command parameters", "" },
             { "?", com_help, "Synonym for 'help'", "" },
+            { "wallet", com_tx_wallet, "Wallet info", "wallet [list | info -addr <addr> -w <wallet_name>]" },
             { "tx_create", com_tx_create, "Make transaction",
                 "tx_create from <addr> to <addr> value <val> [fee <addr> value_fee <val>]" },
             { "tx_verify", com_tx_verify, "Verifing transaction",
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index b9949e13d57abb8c77852306f1a567607d57d588..2ddfdd6d2ee82167747a9b28c0d020a54c53b779 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -46,6 +46,8 @@
 #include "dap_chain_datum_tx_items.h"
 #include "dap_chain_datum_tx_cache.h"
 
+#include "dap_stream_ch_chain_net.h"
+
 // Max and min macros
 #define max(a,b)              ((a) > (b) ? (a) : (b))
 #define min(a,b)              ((a) < (b) ? (a) : (b))
@@ -668,7 +670,7 @@ int com_global_db(int argc, const char ** argv, char **str_reply)
 int com_node(int argc, const char ** argv, char **str_reply)
 {
     enum {
-        CMD_NONE, CMD_ALIAS, CMD_HANDSHAKE
+        CMD_NONE, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT
     };
     int arg_index = 1;
     int cmd_num = CMD_NONE;
@@ -677,6 +679,9 @@ int com_node(int argc, const char ** argv, char **str_reply)
     if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "handshake", NULL)) {
         cmd_num = CMD_HANDSHAKE;
     }
+    else if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "connect", NULL)) {
+        cmd_num = CMD_CONNECT;
+    }
     else if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "alias", NULL)) {
         cmd_num = CMD_ALIAS;
     }
@@ -718,9 +723,70 @@ int com_node(int argc, const char ** argv, char **str_reply)
         }
 
         break;
+        // make connect
+    case CMD_CONNECT: {
+        // get address from alias if addr not defined
+        if(alias_str && !address.uint64) {
+            dap_chain_node_addr_t *address_tmp = get_name_by_alias(alias_str);
+            if(address_tmp) {
+                memcpy(&address, address_tmp, sizeof(address_tmp));
+                DAP_DELETE(address_tmp);
+            }
+            else {
+                set_reply_text(str_reply, "no address found by alias");
+                return -1;
+            }
+        }
+        if(!address.uint64) {
+            set_reply_text(str_reply, "addr not found");
+            return -1;
+        }
+
+        dap_chain_node_info_t *node_info = dap_chain_node_info_read(&address, str_reply);
+        if(!node_info) {
+            set_reply_text(str_reply, "node by addr not found");
+            return -1;
+        }
+        int timeout_ms = 1000000; //10 sec = 10000 ms
+        // start connect
+        dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info);
+        if(!client) {
+            set_reply_text(str_reply, "can't connect");
+            DAP_DELETE(node_info);
+            return -1;
+        }
+        // wait connected
+        int res = chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
+        if(res != 1) {
+            set_reply_text(str_reply, "no response from node");
+            // clean client struct
+            dap_chain_node_client_close(client);
+            DAP_DELETE(node_info);
+            return -1;
+        }
+
+        // send request
+        uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for global_db sync
+        res = dap_chain_node_client_send_chain_request(client, l_ch_id, "start", 5); //, NULL);
+        if(res != 1) {
+            set_reply_text(str_reply, "no response from node(send request)");
+            // clean client struct
+            dap_chain_node_client_close(client);
+            DAP_DELETE(node_info);
+            return -1;
+        }
+
+        // wait for finishing of request
+        res = chain_node_client_wait(client, NODE_CLIENT_STATE_PONG, timeout_ms);
+        DAP_DELETE(node_info);
+        dap_client_disconnect(client->client);
+        dap_chain_node_client_close(client);
 
+        set_reply_text(str_reply, "getting pong");
+    }
+        break;
         // make handshake
-    case CMD_HANDSHAKE:
+    case CMD_HANDSHAKE: {
         // get address from alias if addr not defined
         if(alias_str && !address.uint64) {
             dap_chain_node_addr_t *address_tmp = get_name_by_alias(alias_str);
@@ -740,9 +806,10 @@ int com_node(int argc, const char ** argv, char **str_reply)
 
         dap_chain_node_info_t *node_info = dap_chain_node_info_read(&address, str_reply);
         if(!node_info) {
+            set_reply_text(str_reply, "node by addr not found");
             return -1;
         }
-        int timeout_ms = 10000; //10 sec.
+        int timeout_ms = 10000; //10 sec = 10000 ms
         // start handshake
         dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info);
         if(!client) {
@@ -775,6 +842,7 @@ int com_node(int argc, const char ** argv, char **str_reply)
             return -1;
         }
         set_reply_text(str_reply, "connection established");
+    }
         break;
     }
     return 0;
@@ -919,17 +987,29 @@ int com_tracepath(int argc, const char** argv, char **str_reply)
  */
 int com_ping(int argc, const char** argv, char **str_reply)
 {
-    const char *addr = NULL;
     int n = 4;
-    if(argc > 1)
-        addr = argv[1];
+    if(argc < 2) {
+        set_reply_text(str_reply, "host not specified");
+        return -1;
+    }
     const char *n_str = NULL;
-    if(find_option_val(argv, 2, argc, "-n", &n_str))
-        n = (n_str) ? atoi(n_str) : 4;
-    else if(find_option_val(argv, 2, argc, "-c", &n_str))
+    int argc_host = 1;
+    int argc_start = 1;
+    argc_start = find_option_val(argv, argc_start, argc, "-n", &n_str);
+    if(argc_start) {
+        argc_host = argc_start + 1;
         n = (n_str) ? atoi(n_str) : 4;
+    }
+    else {
+        argc_start = find_option_val(argv, argc_start, argc, "-c", &n_str);
+        if(argc_start) {
+            argc_host = argc_start + 1;
+            n = (n_str) ? atoi(n_str) : 4;
+        }
+    }
     if(n <= 1)
         n = 1;
+    const char *addr = argv[argc_host];
     iputils_set_verbose();
     int res = (addr) ? ping_util(addr, n) : -EADDRNOTAVAIL;
     if(res >= 0) {
@@ -984,7 +1064,103 @@ int com_help(int argc, const char ** argv, char **str_reply)
 /**
  * com_tx_create command
  *
- * Signing transaction
+ * Wallet info
+ */
+int com_tx_wallet(int argc, const char ** argv, char **str_reply)
+{
+    const char *c_wallets_path = "/opt/kelvin-node/etc";
+    // Get address of wallet
+    enum {
+        CMD_NONE, CMD_WALLET_LIST, CMD_WALLET_INFO
+    };
+    int arg_index = 1;
+    int cmd_num = CMD_NONE;
+    const char *cmd_str = NULL;
+    // find  add parameter ('alias' or 'handshake')
+    if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "list", NULL)) {
+        cmd_num = CMD_WALLET_LIST;
+    }
+    else if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "info", NULL)) {
+        cmd_num = CMD_WALLET_INFO;
+    }
+    arg_index++;
+    if(cmd_num == CMD_NONE) {
+        set_reply_text(str_reply, "format of command: wallet [list | info -addr <addr> -w <wallet_name>]");
+        return -1;
+    }
+
+    dap_chain_node_addr_t address;
+    memset(&address, 0, sizeof(dap_chain_node_addr_t));
+    const char *addr_str = NULL, *wallet_name = NULL;
+    // find wallet addr
+    find_option_val(argv, arg_index, argc, "-addr", &addr_str);
+    find_option_val(argv, arg_index, argc, "-w", &wallet_name);
+
+    GString *l_string_ret = g_string_new(NULL);
+    switch (cmd_num) {
+    // wallet list
+    case CMD_WALLET_LIST: {
+        GDir *l_dir = g_dir_open(c_wallets_path, 0, NULL);
+        if(l_dir) {
+            const char *l_file = NULL;
+            do {
+                l_file = g_dir_read_name(l_dir);
+                int l_file_len = (l_file) ? strlen(l_file) : 0;
+                if(l_file_len > 8 && !g_strcmp0(l_file + l_file_len - 8, ".dwallet")) {
+                    char *l_file_path_tmp = g_strdup_printf("%s/%s", c_wallets_path, l_file);
+                    dap_chain_wallet_t *l_wallet = dap_chain_wallet_open_file(l_file_path_tmp);
+                    if(l_wallet) {
+                        dap_chain_addr_t *l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
+                        char *l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr);
+                        g_string_append_printf(l_string_ret, "\nwallet: %s\n", l_wallet->name);
+                        g_string_append_printf(l_string_ret, "addr: %s\n", (l_addr_str) ? l_addr_str : "-");
+                        DAP_DELETE(l_addr_str);
+                        dap_chain_wallet_close(l_wallet);
+                    }
+                    g_free(l_file_path_tmp);
+                }
+            }
+            while(l_file);
+            g_dir_close(l_dir);
+        }
+    }
+        break;
+
+        // wallet info
+    case CMD_WALLET_INFO: {
+        dap_chain_wallet_t *l_wallet = NULL;
+        if(wallet_name)
+            l_wallet = dap_chain_wallet_open(wallet_name, c_wallets_path);
+        if(l_wallet) {
+            dap_chain_addr_t *l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
+            char *l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr);
+            uint64_t balance = dap_chain_datum_tx_cache_calc_balance(l_addr);
+            g_string_append_printf(l_string_ret, "\nwallet: %s\n", l_wallet->name);
+            g_string_append_printf(l_string_ret, "addr: %s\n", (l_addr_str) ? l_addr_str : "-");
+            g_string_append_printf(l_string_ret, "balance: %lld\n", balance);
+            DAP_DELETE(l_addr_str);
+            dap_chain_wallet_close(l_wallet);
+        }
+        else {
+            g_string_free(l_string_ret, TRUE);
+            set_reply_text(str_reply, "wallet not found");
+            return -1;
+        }
+    }
+        break;
+    }
+
+    char *l_str_ret_tmp = g_string_free(l_string_ret, FALSE);
+    char *str_ret = strdup(l_str_ret_tmp);
+    set_reply_text(str_reply, str_ret);
+    g_free(l_str_ret_tmp);
+    return 0;
+}
+
+/**
+ * com_tx_create command
+ *
+ * Create transaction
  */
 int com_tx_create(int argc, const char ** argv, char **str_reply)
 {
@@ -1024,27 +1200,32 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
         return -1;
     }
 
-    const char *a_wallets_path = "/opt/kelvin-node/etc";
+    const char *c_wallets_path = "/opt/kelvin-node/etc";
     const char *a_wallet_name_bliss = "w_bliss";
     const char *a_wallet_name_bliss2 = "w_bliss2";
     const char *a_wallet_name_picnic = "w_picnic";
     const char *a_wallet_name_tesla = "w_tesla";
 
-    dap_chain_wallet_t *wallet_bliss = dap_chain_wallet_open(a_wallet_name_bliss, a_wallets_path);
-    dap_chain_wallet_t *wallet_bliss2 = dap_chain_wallet_open(a_wallet_name_bliss2, a_wallets_path);
-    dap_chain_wallet_t *wallet_picnic = dap_chain_wallet_open(a_wallet_name_picnic, a_wallets_path);
-    //dap_chain_wallet_t *wallet_tesla = dap_chain_wallet_open(a_wallet_name_tesla, a_wallets_path);
+    dap_chain_wallet_t *wallet_bliss = dap_chain_wallet_open(a_wallet_name_bliss, c_wallets_path);
+    dap_chain_wallet_t *wallet_bliss2 = dap_chain_wallet_open(a_wallet_name_bliss2, c_wallets_path);
+    dap_chain_wallet_t *wallet_picnic = dap_chain_wallet_open(a_wallet_name_picnic, c_wallets_path);
+    dap_chain_wallet_t *wallet_tesla = dap_chain_wallet_open(a_wallet_name_tesla, c_wallets_path);
     dap_enc_key_t *l_key_bliss = dap_chain_wallet_get_key(wallet_bliss, 0);
     dap_enc_key_t *l_key_bliss2 = dap_chain_wallet_get_key(wallet_bliss2, 0);
     dap_enc_key_t *l_key_picnic = dap_chain_wallet_get_key(wallet_picnic, 0);
-    //dap_enc_key_t *l_key_tesla = dap_chain_wallet_get_key(wallet_tesla, 0);
+    dap_enc_key_t *l_key_tesla = dap_chain_wallet_get_key(wallet_tesla, 0);
 
     char *addr_w_bliss =
-            "EXh66KVCxChbKHQcTWKYJXhua6HVZecpxuTTmWGuqm1V4vy5mVq52wD8rMQvfUnmJHsL4MuoJ7YVSFqn2RrdoN19mqHP1aQXSQPnXDR6oP9vsBPwYC9PhSvAxFystX";
+            //"EXh66KVCxChbKHQcTWKYJXhua6HVZecpxuTTmWGuqm1V4vy5mVq52wD8rMQvfUnmJHsL4MuoJ7YVSFqn2RrdoN19mqHP1aQXSQPnXDR6oP9vsBPwYC9PhSvAxFystX";
+            "EXh66KVCxChbKHQcSCRnMTByuFRDU2UsZUViPz2BoUAEYYWPfu8WhHhqX9HSyL3U3Q54JvJoKRZhRtumsAVNV6j8pzgtZDkkwzLgHBCAQHcG2FaSwCxESjkCYkgHUo";
     char *addr_w_bliss2 =
-            "EXh66KVCxChbKHQcTeGf8TT7KhcCiiQ9TrPn6rcbNoNKuhAyJ4T9zr5yMfMCXGLVHmxVKZ6J4E9Zc7pNmAa4yrKNb3DkS34jxD6Q4MCXbHJMAPFEVtMoDdFMtCysE2";
+            //"EXh66KVCxChbKHQcTeGf8TT7KhcCiiQ9TrPn6rcbNoNKuhAyJ4T9zr5yMfMCXGLVHmxVKZ6J4E9Zc7pNmAa4yrKNb3DkS34jxD6Q4MCXbHJMAPFEVtMoDdFMtCysE2";
+            "EXh66KVCxChbKHQcSx27VwwbUnT2rRGNDBJm6zdC3DQw8XWtHqHrpoc9NEVd6Ub5rdFosQiXgWc5VhiNoySB6T4E49LMhMnLhr9sMSVqRr7Mix4bPrPEZXsYnNLzeX";
     char *addr_w_picnic =
-            "EXh66KVCxChbKJLxZbyNJLxfF8CfGZmdenQWuqtr8MnXavhJaLo6vckjpYgpcevBo3zB65sAGQJT3ctYVwQnASc6sYyaawFHnacsrcP47PB4XfLYiEDZvwog4AVdbC";
+            //"EXh66KVCxChbKJLxZbyNJLxfF8CfGZmdenQWuqtr8MnXavhJaLo6vckjpYgpcevBo3zB65sAGQJT3ctYVwQnASc6sYyaawFHnacsrcP47PB4XfLYiEDZvwog4AVdbC";
+            "EXh66KVCxChbKJLxXTwipYMooUpoGvpwpkcjpmGLbubwzqR2vVsH9HEgT2LcU2hDs2BTFkaNC8itE8nuCWxskVtRJG4iaubBDcRWAt2awtCVHAULffQGrwe8ocRCzS";
+    char *addr_w_tesla =
+            "EXh66KVCxChbTZ9umzb4Y6nJcMti8DPUdrsE1V4adjoKyPG3VvyrzHh6wrP6wGERLq9Qj5qK4hMEjd6uidcbsSSpzKQuADC2g1DzYkCCcitAs2Nsxk4dhespDdximc";
 
     dap_chain_wallet_t *l_wallet;
     dap_enc_key_t *l_key;
@@ -1057,7 +1238,7 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
         l_key = l_key_bliss2;
     }
     else if(!strcmp(addr_base58_from, addr_w_picnic)) {
-        l_wallet = l_key_picnic;
+        l_wallet = wallet_picnic;
         l_key = l_key_picnic;
     }
     if(!l_wallet || !l_key) {
@@ -1069,6 +1250,33 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     dap_chain_addr_t *addr_to = dap_chain_str_to_addr(addr_base58_to);
     dap_chain_addr_t *addr_fee = dap_chain_str_to_addr(addr_base58_fee);
 
+    if(!addr_from) {
+        set_reply_text(str_reply, "source address is invalid");
+        return -1;
+    }
+    if(!addr_to) {
+        set_reply_text(str_reply, "destination address is invalid");
+        return -1;
+    }
+    if(addr_base58_fee && !addr_fee) {
+        set_reply_text(str_reply, "fee address is invalid");
+        return -1;
+    }
+    /*    dap_chain_addr_t *addr_b2 = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_bliss2);
+     dap_chain_addr_t *addr_p = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_picnic);
+     dap_chain_addr_t *addr_t = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_tesla);
+
+     char *addr_str_b2 = dap_chain_addr_to_str((dap_chain_addr_t*) addr_b2);
+     char *addr_str_p = dap_chain_addr_to_str((dap_chain_addr_t*) addr_p);
+     char *addr_str_t = dap_chain_addr_to_str((dap_chain_addr_t*) addr_t);
+
+     char *addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) addr_from);
+     const dap_chain_addr_t *addr2 = dap_chain_str_to_addr(addr_str);
+     char *addr_str2 = dap_chain_addr_to_str(addr2);
+     int a1 = strcmp(addr_str, addr_str2);
+     int a2 = strcmp(addr_str, addr_w_bliss);
+     int a3 = strcmp(addr_str, addr_w_bliss2);*/
+
     static bool l_first_start = true;
     if(l_first_start)
     {
@@ -1085,7 +1293,8 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     uint64_t balance2 = dap_chain_datum_tx_cache_calc_balance(addr_to);
     uint64_t balance3 = dap_chain_datum_tx_cache_calc_balance(addr_fee);
     uint64_t balance1 = dap_chain_datum_tx_cache_calc_balance(addr_from);
-    g_string_append_printf(string_ret, "balance w1=%lld w2=%lld w3=%lld\n",
+    g_string_append_printf(string_ret, "transactions in cache=%d balance w_from=%lld w_to=%lld w_feee=%lld\n",
+            dap_chain_node_datum_tx_cache_count(),
             balance1, balance2, balance3);
 
     int res = dap_chain_datum_tx_ctrl_create_transfer(l_key, addr_from, addr_to, addr_fee, value, value_fee);
@@ -1095,18 +1304,22 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
         uint64_t balance1 = dap_chain_datum_tx_cache_calc_balance(addr_from);
         uint64_t balance2 = dap_chain_datum_tx_cache_calc_balance(addr_to);
         uint64_t balance3 = dap_chain_datum_tx_cache_calc_balance(addr_fee);
-        g_string_append_printf(string_ret, "balance w1=%lld w2=%lld w3=%lld\n",
+        g_string_append_printf(string_ret, "transactions in cache=%d balance w_from=%lld w_to=%lld w_feee=%lld\n",
+                dap_chain_node_datum_tx_cache_count(),
                 balance1, balance2, balance3);
     }
 
     char *str_ret_tmp = g_string_free(string_ret, FALSE);
     char *str_ret = strdup(str_ret_tmp);
     set_reply_text(str_reply, str_ret);
+
     g_free(str_ret_tmp);
+    DAP_DELETE(addr_to);
+    DAP_DELETE(addr_fee);
     dap_chain_wallet_close(wallet_bliss);
     dap_chain_wallet_close(wallet_bliss2);
     dap_chain_wallet_close(wallet_picnic);
-    //dap_chain_wallet_close(wallet_tesla);
+    dap_chain_wallet_close(wallet_tesla);
     return 0;
 }
 
diff --git a/dap_chain_node_cli_cmd.h b/dap_chain_node_cli_cmd.h
index 61f9e4484e0700b846c583238b64ac625a994e09..59c0e0dec64bd169ad16ad38e6e1750097068efb 100644
--- a/dap_chain_node_cli_cmd.h
+++ b/dap_chain_node_cli_cmd.h
@@ -76,7 +76,14 @@ int com_help(int argc, const char ** argv, char **str_reply);
 /**
  * com_tx_create command
  *
- * Signing transaction
+ * Wallet info
+ */
+int com_tx_wallet(int argc, const char ** argv, char **str_reply);
+
+/**
+ * com_tx_create command
+ *
+ * Create transaction
  */
 int com_tx_create(int argc, const char ** argv, char **str_reply);
 
diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c
index c6c2c16ea9035a6a6b192b897fd20334a8eefc7d..e7ef53cfc906c0fdde49767862dec8ecba4f5ff9 100644
--- a/dap_chain_node_client.c
+++ b/dap_chain_node_client.c
@@ -32,6 +32,11 @@
 #include "dap_config.h"
 #include "dap_events.h"
 #include "dap_http_client_simple.h"
+#include "dap_client_pvt.h"
+#include "dap_stream_ch_pkt.h"
+#include "dap_stream_ch_chain_net.h"
+#include "dap_stream_ch_chain_net_pkt.h"
+#include "dap_stream_pkt.h"
 #include "dap_chain_node_client.h"
 
 #define LOG_TAG "dap_chain_node_client"
@@ -78,14 +83,14 @@ static void stage_status_error_callback(dap_client_t *a_client, void *a_arg)
     //printf("* tage_status_error_callback client=%x data=%x\n", a_client, a_arg);
 }
 
-// callback for the end of handshake in dap_client_go_stage() / chain_node_client_connect()
+// 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_CONNECT;
+        client->state = NODE_CLIENT_STATE_CONNECTED;
         pthread_cond_signal(&client->wait_cond);
         pthread_mutex_unlock(&client->wait_mutex);
     }
@@ -107,7 +112,7 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *no
     pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
     pthread_cond_init(&l_node_client->wait_cond, &attr);
     pthread_mutex_init(&l_node_client->wait_mutex, NULL);
-    l_node_client->events = dap_events_new();
+    l_node_client->events = NULL; //dap_events_new();
     l_node_client->client = dap_client_new(l_node_client->events, stage_status_callback, stage_status_error_callback);
     l_node_client->client->_inheritor = l_node_client;
 
@@ -128,17 +133,16 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *no
         dap_chain_node_client_close(l_node_client);
         return NULL;
     }
-    dap_client_set_uplink( l_node_client->client, strdup(host), listen_port_tcp );
+    dap_client_set_uplink(l_node_client->client, strdup(host), listen_port_tcp);
 //    dap_client_stage_t a_stage_target = STAGE_ENC_INIT;
     dap_client_stage_t a_stage_target = STAGE_STREAM_STREAMING;
 
     l_node_client->state = NODE_CLIENT_STATE_CONNECT;
-    // Handshake
+    // Handshake & connect
     dap_client_go_stage(l_node_client->client, a_stage_target, a_stage_end_callback);
     return l_node_client;
 }
 
-
 /**
  * Close connection to server, delete chain_node_client_t *client
  */
@@ -154,6 +158,94 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
     }
 }
 
+/*
+// callback for dap_client_request_enc() in client_mempool_send_datum()
+static void s_response_proc(dap_client_t *a_client, void *str, size_t str_len)
+{
+    printf("* s_response_proc a_client=%x str=%s str_len=%d\n", a_client, str, str_len);
+    dap_chain_node_client_t *l_client = a_client->_inheritor;
+    assert(l_client);
+    if(l_client) {
+        if(str_len > 0) {
+//            l_client->read_data_t.data = DAP_NEW_Z_SIZE(uint8_t, str_len + 1);
+//          if(l_client->read_data_t.data) {
+//                memcpy(l_client->read_data_t.data, str, str_len);
+//                l_client->read_data_t.data_len = str_len;
+        }
+    }
+    pthread_mutex_lock(&l_client->wait_mutex);
+    l_client->state = NODE_CLIENT_STATE_SENDED;
+    pthread_cond_signal(&l_client->wait_cond);
+    pthread_mutex_unlock(&l_client->wait_mutex);
+}
+*/
+
+/*// callback for dap_client_request_enc() in client_mempool_send_datum()
+ static void s_response_error(dap_client_t *a_client, int val)
+ {
+ printf("* s_response_error a_client=%x val=%d\n", a_client, val);
+ client_mempool_t *mempool = a_client->_inheritor;
+ assert(mempool);
+ if(mempool) {
+ pthread_mutex_lock(&mempool->wait_mutex);
+ mempool->state = CLIENT_MEMPOOL_ERROR;
+ pthread_cond_signal(&mempool->wait_cond);
+ pthread_mutex_unlock(&mempool->wait_mutex);
+ }
+ }
+
+ // set new state and delete previous read data
+ static void dap_chain_node_client_reset(dap_chain_node_client_t *a_client, int new_state)
+ {
+ if(!a_client)
+ return;
+ pthread_mutex_lock(&a_client->wait_mutex);
+ //a_client->read_data_t.data_len = 0;
+ //DAP_DELETE(a_client->read_data_t.data);
+ //a_client->read_data_t.data = NULL;
+ a_client->state = new_state;
+ pthread_mutex_unlock(&a_client->wait_mutex);
+ }*/
+
+static void dap_chain_node_client_callback(dap_stream_ch_chain_net_pkt_t *a_ch_chain_net, void *a_arg)
+{
+    dap_chain_node_client_t *client = (dap_chain_node_client_t*)a_arg;
+    assert(client);
+    if(a_ch_chain_net->hdr.type==STREAM_CH_CHAIN_NET_PKT_TYPE_PONG) {
+        pthread_mutex_lock(&client->wait_mutex);
+        client->state = NODE_CLIENT_STATE_PONG;
+        pthread_cond_signal(&client->wait_cond);
+        pthread_mutex_unlock(&client->wait_mutex);
+    }
+}
+
+/**
+ * Send stream request to server
+ */
+int dap_chain_node_client_send_chain_request(dap_chain_node_client_t *a_client, uint8_t a_ch_id,
+        char *a_buf, size_t a_buf_size)
+{
+    if(!a_client || a_client->state < NODE_CLIENT_STATE_CONNECTED)
+        return -1;
+    dap_stream_t *l_stream = dap_client_get_stream(a_client->client);
+    dap_stream_ch_t * l_ch = dap_client_get_stream_ch(a_client->client, a_ch_id);
+    if(l_ch)
+    {
+        dap_stream_ch_chain_net_t * l_ch_chain = DAP_STREAM_CH_CHAIN_NET(l_ch);
+        l_ch_chain->notify_callback = dap_chain_node_client_callback;
+        l_ch_chain->notify_callback_arg = a_client;
+        int l_res = dap_stream_ch_chain_net_pkt_write(l_ch, STREAM_CH_CHAIN_NET_PKT_TYPE_PING, a_buf, a_buf_size);
+        if(l_res <=0)
+            return -1;
+        bool is_ready = true;
+        dap_events_socket_set_writable(l_ch->stream->events_socket, is_ready);
+        //dap_stream_ch_ready_to_write(ch, true);
+    }
+    else
+        return -1;
+    return 1;
+}
+
 /**
  * wait for the complete of request
  *
@@ -161,15 +253,15 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
  * 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, int waited_state, int timeout_ms)
+int chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int timeout_ms)
 {
     int ret = -1;
-    if(!client)
+    if(!a_client)
         return -1;
-    pthread_mutex_lock(&client->wait_mutex);
+    pthread_mutex_lock(&a_client->wait_mutex);
     // have waited
-    if(client->state == waited_state) {
-        pthread_mutex_unlock(&client->wait_mutex);
+    if(a_client->state == a_waited_state) {
+        pthread_mutex_unlock(&a_client->wait_mutex);
         return 1;
     }
     // prepare for signal waiting
@@ -184,11 +276,11 @@ int chain_node_client_wait(dap_chain_node_client_t *client, int waited_state, in
     else
         to.tv_nsec = (long) nsec_new;
     // signal waiting
-    int wait = pthread_cond_timedwait(&client->wait_cond, &client->wait_mutex, &to);
+    int wait = pthread_cond_timedwait(&a_client->wait_cond, &a_client->wait_mutex, &to);
     if(wait == 0) //0
         ret = 1;
     else if(wait == ETIMEDOUT) // 110 260
         ret = 0;
-    pthread_mutex_unlock(&client->wait_mutex);
+    pthread_mutex_unlock(&a_client->wait_mutex);
     return ret;
 }
diff --git a/dap_chain_node_client.h b/dap_chain_node_client.h
index d6b86bfd6bc1f3f79ea7951a3235a7c04d5ac13f..5f2a0e88cff2c8af1e2230fac8b147127a42e816 100644
--- a/dap_chain_node_client.h
+++ b/dap_chain_node_client.h
@@ -33,8 +33,10 @@ enum {
     NODE_CLIENT_STATE_INIT,
     NODE_CLIENT_STATE_CONNECT,
     NODE_CLIENT_STATE_CONNECTED,
-    NODE_CLIENT_STATE_SEND,
-    NODE_CLIENT_STATE_SENDED,
+    //NODE_CLIENT_STATE_SEND,
+    //NODE_CLIENT_STATE_SENDED,
+    NODE_CLIENT_STATE_PING,
+    NODE_CLIENT_STATE_PONG,
     NODE_CLIENT_STATE_END
 };
 
@@ -72,6 +74,12 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *no
  */
 void dap_chain_node_client_close(dap_chain_node_client_t *client);
 
+/**
+ * Send stream request to server
+ */
+int dap_chain_node_client_send_chain_request(dap_chain_node_client_t *a_client, uint8_t a_ch_id,
+        char *a_buf, size_t a_buf_size);
+
 /**
  * wait for the complete of request
  *
diff --git a/iputils/ping_common.c b/iputils/ping_common.c
index a7d257082e121c60a47ab98ea83421b6d61a53f9..15eddebc098579e168f75c8bf6cb3f956d63a69f 100755
--- a/iputils/ping_common.c
+++ b/iputils/ping_common.c
@@ -145,7 +145,7 @@ void usage(void)
                     "  -N <nodeinfo opt>  use icmp6 node info query, try <help> as argument\n"
                     "\nFor more details see ping(8).\n"
             );
-    exit(2);
+    //exit(2);
 }
 
 void limit_capabilities(void)