diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1b2dd143072429e86ceda949702b339e632515f6..33f358ff7e41a7b596507d4ffa9d4d1bbdf89809 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,8 +27,7 @@ file(GLOB IPUTILS_SRCS iputils/*.c iputils/traceroute/*.c)
 file(GLOB IPUTILS_HEADERS iputils/*.h ${IPUTILS_INCLUDE_DIRS}*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS} ${IPUTILS_SRCS} ${IPUTILS_HEADERS})
-
-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_net_srv dap_chain_mempool dap_chain_global_db -lresolv) 
+target_link_libraries(dap_chain_net dap_core dap_crypto dap_client  dap_core_server dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db -lresolv)
 target_include_directories(dap_chain_net INTERFACE . PUBLIC ${IPUTILS_INCLUDE_DIRS})
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
diff --git a/dap_chain_net.c b/dap_chain_net.c
index bfa260ac75c550ec54c0da32254035b190e63e97..b9672794e87da5756d53fa66a20c383b5adc98cc 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -22,7 +22,7 @@
     You should have received a copy of the GNU General Public License
     along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
 */
-
+#include <time.h>
 #include <stddef.h>
 #include <string.h>
 #include <pthread.h>
@@ -52,7 +52,6 @@
 
 #include "dap_module.h"
 
-#define _XOPEN_SOURCE 700
 #include <stdio.h>
 #include <sys/types.h>
 #include <dirent.h>
@@ -171,8 +170,13 @@ 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 )
-            dap_chain_net_sync_all(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);
+            }
+        }
     }
 }
 
@@ -634,12 +638,28 @@ static int s_cli_net(int argc, const char ** argv, char **a_str_reply)
         const char * l_links_str = NULL;
         const char * l_go_str = NULL;
         const char * l_get_str = NULL;
+        const char * l_stats_str = NULL;
         dap_chain_node_cli_find_option_val(argv, arg_index, argc, "sync", &l_sync_str);
         dap_chain_node_cli_find_option_val(argv, arg_index, argc, "link", &l_links_str);
         dap_chain_node_cli_find_option_val(argv, arg_index, argc, "go", &l_go_str);
         dap_chain_node_cli_find_option_val(argv, arg_index, argc, "get", &l_get_str);
-
-        if ( l_go_str){
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "stats", &l_stats_str);
+
+        if ( l_stats_str ){
+            if ( strcmp(l_stats_str,"tps") == 0 ) {
+                const char * l_to_str = NULL;
+                struct tm l_to_tm = {0};
+                const char * l_from_str = NULL;
+                struct tm l_from_tm = {0};
+
+                dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-from ", &l_from_str);
+                dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-to", &l_to_str);
+                if (l_from_str ){
+                    //strptime()
+                }
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" go from state %s to %s");
+            }
+        }if ( l_go_str){
             if ( strcmp(l_go_str,"online") == 0 ) {
                 dap_chain_net_state_go_to(l_net, NET_STATE_ONLINE);
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" go from state %s to %s",
@@ -882,6 +902,8 @@ int dap_chain_net_load(const char * a_net_name)
         if ( l_chains_dir ){
             struct dirent * l_dir_entry;
             while ( (l_dir_entry = readdir(l_chains_dir) )!= NULL ){
+                if (l_dir_entry->d_name[0]=='\0')
+                    continue;
                 char * l_entry_name = strdup(l_dir_entry->d_name);
                 l_chains_path_size = strlen(l_net->pub.name)+1+strlen("network")+1+strlen (l_entry_name)-3;
                 l_chains_path = DAP_NEW_Z_SIZE(char, l_chains_path_size);
@@ -900,10 +922,10 @@ int dap_chain_net_load(const char * a_net_name)
                             if(l_chain->callback_created)
                                 l_chain->callback_created(l_chain,l_cfg);
                         }
-                        free(l_entry_name);
                     }
                 }
                 DAP_DELETE (l_chains_path);
+                DAP_DELETE (l_entry_name);
             }
         } else {
             log_it(L_ERROR,"Can't any chains for network %s",l_net->pub.name);
diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c
index a1a9f13dde9d47c591584afacb623418987c06b3..4764281feb0d0bb49672e5dee44f42719488ac27 100644
--- a/dap_chain_node_cli.c
+++ b/dap_chain_node_cli.c
@@ -508,7 +508,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             );
 
     dap_chain_node_cli_cmd_item_create ("token_emit", com_token_emit, "Token emission",
-            "token_emit -net <net name> -chain_emission <chain for emission> -chain_base_tx <chain for base tx> -addr <addr> token <token ticker> -certs <cert> -emission_value <val>\n");
+            "token_emit -net <net name> -chain_emission <chain for emission> -chain_base_tx <chain for base tx> -addr <addr> -token <token ticker> -certs <cert> -emission_value <val>\n");
 
     dap_chain_node_cli_cmd_item_create ("mempool_list", com_mempool_list, "List mempool entries for selected chain network and chain id",
             "mempool_list -net <net name> -chain <chain name>\n");
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index daec8d9922538243fc79f74b93ca53ab8e5dfe4e..cf2e5961b1b86bce048dbf5c43d453acd8c5545e 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -836,7 +836,7 @@ int com_node(int a_argc, const char ** a_argv, char **a_str_reply)
         DAP_DELETE(l_remote_node_info);
         dap_client_disconnect(l_node_client->client);
         l_node_client->client = NULL;
-        dap_chain_node_client_close(l_node_client);
+        //dap_chain_node_client_close(l_node_client);
         dap_chain_node_cli_set_reply_text(a_str_reply, "Node sync completed: Chains and gdb are synced");
         return 0;
 
@@ -1243,7 +1243,7 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
             l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
         }
         if(!l_addr && addr_str)
-            l_addr = dap_chain_str_to_addr(addr_str);
+            l_addr = dap_chain_addr_from_str(addr_str);
 
         dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name);
         if(!l_net_name) {
@@ -1274,7 +1274,8 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
                 if(l_addr_tokens[i]) {
                     uint64_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]);
                     long  double l_balance_coins = (long double) l_balance / 1000000000000.0L;
-                    dap_string_append_printf(l_string_ret, "          %Lf %s\n", l_balance_coins, l_addr_tokens[i]);
+                    dap_string_append_printf(l_string_ret, "          %.3Lf (%llu) %s\n", l_balance_coins,
+                                             l_balance, l_addr_tokens[i]);
 
                 }
                 DAP_DELETE(l_addr_tokens[i]);
@@ -1903,7 +1904,7 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
         return -5;
     }
 
-    dap_chain_addr_t * l_addr = dap_chain_str_to_addr(l_addr_str);
+    dap_chain_addr_t * l_addr = dap_chain_addr_from_str(l_addr_str);
 
     if(!l_addr) {
         dap_chain_node_cli_set_reply_text(str_reply, "address \"%s\" is invalid", l_addr_str);
@@ -1967,7 +1968,8 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply)
     l_token_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_token_emission_size);
     strncpy(l_token_emission->hdr.ticker, l_ticker, sizeof(l_token_emission->hdr.ticker));
     l_token_emission->hdr.value = l_emission_value;
-
+    l_token_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
+    memcpy(&l_token_emission->hdr.address, l_addr, sizeof (l_token_emission->hdr.address));
     // Then add signs
     size_t l_offset=0;
     for (size_t i =0; i < l_certs_size; i++ ){
@@ -2128,6 +2130,8 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     const char * l_token_ticker = NULL;
     const char * l_net_name = NULL;
     const char * l_chain_name = NULL;
+    const char * l_tx_num_str = NULL;
+    size_t l_tx_num =0;
 
     uint64_t value = 0;
     uint64_t value_fee = 0;
@@ -2136,6 +2140,10 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-token", &l_token_ticker);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain", &l_chain_name);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx_num", &l_tx_num_str);
+
+    if ( l_tx_num_str )
+        l_tx_num = strtoul(l_tx_num_str,NULL,10);
 
     if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-fee", &addr_base58_fee)) {
         if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value_fee", &str_tmp)) {
@@ -2191,8 +2199,8 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
         return -1;
     }
     const dap_chain_addr_t *addr_from = (const dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
-    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);
+    dap_chain_addr_t *addr_to = dap_chain_addr_from_str(addr_base58_to);
+    dap_chain_addr_t *addr_fee = dap_chain_addr_from_str(addr_base58_fee);
 
     if(!addr_from) {
         dap_chain_node_cli_set_reply_text(str_reply, "source address is invalid");
@@ -2211,7 +2219,9 @@ int com_tx_create(int argc, const char ** argv, char **str_reply)
     //g_string_printf(string_ret, "from=%s\nto=%s\nval=%lld\nfee=%s\nval_fee=%lld\n\n",
     //        addr_base58_from, addr_base58_to, value, addr_base58_fee, value_fee);
 
-    int res = dap_chain_mempool_tx_create( l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee,
+    int res = l_tx_num? dap_chain_mempool_tx_create_massive( l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee,
+                                                     l_token_ticker, value, value_fee, l_tx_num)
+              :dap_chain_mempool_tx_create( l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee,
             l_token_ticker, value, value_fee);
     dap_string_append_printf(string_ret, "transfer=%s\n",
             (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for transfer" : "False");