diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c
index 47740336ed7fe8a24f92ef90bae21bb259b76bc0..6b74b128727f49fdf73106d47a271a42120e7549 100644
--- a/modules/chain/dap_chain_ch.c
+++ b/modules/chain/dap_chain_ch.c
@@ -911,6 +911,8 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         }
         dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
         dap_chain_ch_summary_t *l_sum = (dap_chain_ch_summary_t *)l_chain_pkt->data;
+        if(l_chain->atom_num_last < l_sum->num_last)
+            l_chain->atom_num_last = l_sum->num_last;
         debug_if(s_debug_more, L_DEBUG, "In: CHAIN_SUMMARY of %s for net %s from source " NODE_ADDR_FP_STR
                                             " with %" DAP_UINT64_FORMAT_U " atoms to sync from %" DAP_UINT64_FORMAT_U " to %" DAP_UINT64_FORMAT_U,
                                 l_chain ? l_chain->name : "(null)",
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 9d28d183745b4833d4c829a2d874c37e1a80bae7..76def40e457ffacd4b9b23b1452cde56beccb63c 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -150,6 +150,7 @@ typedef struct dap_chain {
     dap_chain_type_t *default_datum_types;
     uint16_t autoproc_datum_types_count;
     uint16_t *autoproc_datum_types;
+    uint64_t atom_num_last;
 
     // To hold it in double-linked lists
     struct dap_chain * next;
diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c
index 951b8d04741fe1cb44eae563481c6f251738c2b1..8b681cfe8dfd73147ef99dd2555291b3130d935e 100644
--- a/modules/common/dap_chain_datum_decree.c
+++ b/modules/common/dap_chain_datum_decree.c
@@ -177,7 +177,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
         l_offset += dap_tsd_size(l_tsd);
         switch(l_tsd->type) {
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_VALUE:
-                if (l_tsd->size > sizeof(uint256_t)){
+                if (l_tsd->size != sizeof(uint256_t)){
                     dap_string_append_printf(a_str_out, "\tValue: <WRONG SIZE>\n");
                     break;
                 }
@@ -189,7 +189,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN:
             break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE:
-                if (l_tsd->size > sizeof(uint256_t)){
+                if (l_tsd->size != sizeof(uint256_t)){
                     dap_string_append_printf(a_str_out, "\tFee: <WRONG SIZE>\n");
                     break;
                 }
@@ -199,7 +199,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tFee: %s\n", l_fee_value_str);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER:
-                if (l_tsd->size < sizeof(dap_pkey_t)) {
+                if (l_tsd->size != sizeof(dap_pkey_t)) {
                     dap_string_append_printf(a_str_out, "\tOwner fingerprint: <WRONG SIZE>\n");
                     break;
                 }
@@ -210,7 +210,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tOwner fingerprint: %s\n", l_owner_pkey_str);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER:
-                if (l_tsd->size != sizeof(uint32_t)){
+                if (l_tsd->size != sizeof(uint256_t)) {
                     dap_string_append_printf(a_str_out, "\tOwner min: <WRONG SIZE>\n");
                     break;
                 }
@@ -220,7 +220,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tOwner min: %s\n", l_owner_min_str);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET:
-                if (l_tsd->size > sizeof(dap_chain_addr_t)) {
+                if (l_tsd->size != sizeof(dap_chain_addr_t)) {
                     dap_string_append_printf(a_str_out, "\tWallet for fee: <WRONG SIZE>\n");
                     break;
                 }
@@ -229,7 +229,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tWallet for fee: %s\n", dap_chain_addr_to_str(l_addr_fee_wallet));
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HASH:
-                if (l_tsd->size > sizeof(dap_hash_fast_t)) {
+                if (l_tsd->size != sizeof(dap_hash_fast_t)) {
                     dap_string_append_printf(a_str_out, "\tHash: <WRONG SIZE>\n");
                     break;
                 }
@@ -241,7 +241,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tHash: %s\n", l_stake_tx_hash);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE:
-                if (l_tsd->size > sizeof(uint256_t)){
+                if (l_tsd->size != sizeof(uint256_t)){
                     dap_string_append_printf(a_str_out, "\tStake value: <WRONG SIZE>\n");
                     break;
                 }
@@ -251,7 +251,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tStake value: %s\n", l_stake_value_str);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR:
-                if (l_tsd->size > sizeof(dap_chain_addr_t)) {
+                if (l_tsd->size != sizeof(dap_chain_addr_t)) {
                     dap_string_append_printf(a_str_out, "\tSigning addr: <WRONG SIZE>\n");
                     break;
                 }
@@ -265,7 +265,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_NODE_ADDR:
-                if(l_tsd->size > sizeof(dap_chain_node_addr_t)){
+                if (l_tsd->size != sizeof(dap_chain_node_addr_t)){
                     dap_string_append_printf(a_str_out, "\tNode addr: <WRONG SIZE>\n");
                     break;
                 }
@@ -274,7 +274,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                                          NODE_ADDR_FP_ARGS(l_node_addr));
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE:
-                if (l_tsd->size > sizeof(uint256_t)) {
+                if (l_tsd->size != sizeof(uint256_t)) {
                     dap_string_append_printf(a_str_out, "\tMin value: <WRONG SIZE>\n");
                     break;
                 }
@@ -284,7 +284,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree
                 dap_string_append_printf(a_str_out, "\tMin value: %s\n", l_min_value_str);
                 break;
             case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT:
-                if (l_tsd->size > sizeof(uint256_t)) {
+                if (l_tsd->size != sizeof(uint256_t)) {
                     dap_string_append_printf(a_str_out, "\tMin signers count: <WRONG SIZE>\n");
                     break;
                 }
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 401b6b28047d00d7c373c0f7109bba1a60726d10..b4cbb481ec3e1285ce1c0758cb412c3541999519 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -192,9 +192,9 @@ int dap_chain_cs_esbocs_init()
             "\tEnables or disables checks for blocks signs structure validity\n"
         "esbocs check_signs_structure show -net <net_name> -chain <chain_name>\n"
             "\tShow status of checks for blocks signs structure validity\n"
-        "esbocs emergency_validator {add|remove} -net <net_name> -chain <chain_name> -cert <poa_cert_name> -pkey_hash <validator_pkey_hash>\n"
+        "esbocs emergency_validators {add|remove} -net <net_name> -chain <chain_name> -cert <poa_cert_name> -pkey_hash <validator_pkey_hash>\n"
             "\tAdd or remove validator by its signature public key hash to list of validators allowed to work in emergency mode\n"
-        "esbocs emergency_validator show -net <net_name> -chain <chain_name>\n"
+        "esbocs emergency_validators show -net <net_name> -chain <chain_name>\n"
             "\tShow list of validators public key hashes allowed to work in emergency mode\n");
     return 0;
 }
@@ -2969,7 +2969,7 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply)
         [SUBCMD_UNDEFINED] = NULL,
         [SUBCMD_MIN_VALIDATORS_COUNT] = "min_validators_count",
         [SUBCMD_CHECK_SIGNS_STRUCTURE] = "check_signs_structure",
-        [SUBCMD_EMERGENCY_VALIDATOR] = "emergency_validator",
+        [SUBCMD_EMERGENCY_VALIDATOR] = "emergency_validators",
     };
 
     const size_t l_subcmd_str_count = sizeof(l_subcmd_strs) / sizeof(char *);
@@ -3100,7 +3100,7 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply)
     } break;
 
     default:
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized subcommand '%s'", a_argv[l_arg_index]);
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized subcommand '%s'", a_argv[l_arg_index - 1]);
     }
     return ret;
 }
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index e09b826d88412144b88eab1243c8e9d2f5996f8c..271f2c2b45221b6f42393d6f33adc335e5684fe9 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -231,7 +231,7 @@ static const dap_link_manager_callbacks_t s_link_manager_callbacks = {
 
 // State machine switchs here
 static bool s_net_states_proc(void *a_arg);
-struct json_object *s_net_states_json_collect(dap_chain_net_t * l_net);
+json_object *s_net_states_json_collect(dap_chain_net_t * l_net);
 static void s_net_states_notify(dap_chain_net_t * l_net);
 static void s_nodelist_change_notify(dap_store_obj_t *a_obj, void *a_arg);
 //static void s_net_proc_kill( dap_chain_net_t * a_net );
@@ -464,7 +464,7 @@ static void s_link_manager_callback_connected(dap_link_t *a_link, uint64_t a_net
     log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name,
            NODE_ADDR_FP_ARGS_S(a_link->addr));
 
-    struct json_object *l_json = s_net_states_json_collect(l_net);
+    json_object *l_json = s_net_states_json_collect(l_net);
     char l_err_str[128] = { };
     snprintf(l_err_str, sizeof(l_err_str)
                  , "Established connection with link " NODE_ADDR_FP_STR
@@ -528,7 +528,7 @@ static void s_link_manager_callback_error(dap_link_t *a_link, uint64_t a_net_id,
     log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR,
            l_net ? l_net->pub.name : "(unknown)", NODE_ADDR_FP_ARGS_S(a_link->addr));
     if (l_net){
-        struct json_object *l_json = s_net_states_json_collect(l_net);
+        json_object *l_json = s_net_states_json_collect(l_net);
         char l_err_str[512] = { };
         snprintf(l_err_str, sizeof(l_err_str)
                      , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d"
@@ -583,9 +583,37 @@ int s_link_manager_fill_net_info(dap_link_t *a_link)
     return 0;
 }
 
-struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
+json_object *s_net_sync_status(dap_chain_net_t *a_net) {
+// sanity check
+    dap_return_val_if_pass(!a_net, NULL);
+// func work
+    json_object *l_ret = json_object_new_object();
+    size_t
+        l_count_el = 0,
+        l_count_el_all = 0,
+        l_node_link_nodes = 0;
+    char *l_gdb_nodes = a_net->pub.gdb_nodes;
+
+    dap_chain_t *l_chain = NULL;
+    DL_FOREACH(a_net->pub.chains, l_chain){
+        l_count_el += l_chain->callback_count_atom(l_chain);
+        l_count_el_all += l_chain->atom_num_last;
+    }
+    double l_percent = l_count_el_all ? (double)(l_count_el * 100) / l_count_el_all : 0;
+    char *l_percent_str = dap_strdup_printf("%.3f", l_percent);
+    json_object *l_jobj_percent = json_object_new_string(l_percent_str);
+    DAP_DELETE(l_percent_str);
+    json_object *l_jobj_total = json_object_new_uint64(l_count_el_all);
+    json_object *l_jobj_current  = json_object_new_uint64(l_count_el);
+    json_object_object_add(l_ret, "current", l_jobj_current);
+    json_object_object_add(l_ret, "total", l_jobj_total);
+    json_object_object_add(l_ret, "percent", l_jobj_percent);
+    return l_ret;
+}
+
+json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
 {
-    struct json_object *l_json = json_object_new_object();
+    json_object *l_json = json_object_new_object();
     json_object_object_add(l_json, "class"            , json_object_new_string("NetStates"));
     json_object_object_add(l_json, "name"             , json_object_new_string((const char*)a_net->pub.name));
     json_object_object_add(l_json, "networkState"     , json_object_new_string(dap_chain_net_state_to_str(PVT(a_net)->state)));
@@ -595,6 +623,10 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
     char l_node_addr_str[24] = {'\0'};
     int l_tmp = snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(g_node_addr));
     json_object_object_add(l_json, "nodeAddress"     , json_object_new_string(l_tmp ? l_node_addr_str : "0000::0000::0000::0000"));
+    if (PVT(a_net)->state == NET_STATE_SYNC_CHAINS) {
+        json_object *l_json_sync_status = s_net_sync_status(a_net);
+        json_object_object_add(l_json, "processed", l_json_sync_status);
+    }
     return l_json;
 }
 
@@ -604,7 +636,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
  */
 static void s_net_states_notify(dap_chain_net_t *a_net)
 {
-    struct json_object *l_json = s_net_states_json_collect(a_net);
+    json_object *l_json = s_net_states_json_collect(a_net);
     json_object_object_add(l_json, "errorMessage", json_object_new_string(" ")); // regular notify has no error
     dap_notify_server_send_mt(json_object_get_string(l_json));
     json_object_put(l_json);
@@ -795,20 +827,24 @@ json_object* s_set_reply_text_node_status_json(dap_chain_net_t *a_net) {
     json_object_object_add(l_jobj_ret, "current_addr", l_jobj_cur_node_addr);
     if (PVT(a_net)->state != NET_STATE_OFFLINE) {
         json_object *l_jobj_links = json_object_new_object();
-        json_object *l_jobj_active_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/);  // need adopt to link manager
-        json_object *l_jobj_total_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/);
-        if (!l_jobj_links || !l_jobj_active_links || !l_jobj_total_links) {
+        json_object *l_jobj_active_links = json_object_new_uint64(dap_link_manager_links_count(a_net->pub.id.uint64));
+        json_object *l_jobj_required_links = json_object_new_uint64(dap_link_manager_required_links_count(a_net->pub.id.uint64));
+        if (!l_jobj_links || !l_jobj_active_links || !l_jobj_required_links) {
             json_object_put(l_jobj_ret);
             json_object_put(l_jobj_links);
             json_object_put(l_jobj_active_links);
-            json_object_put(l_jobj_total_links);
+            json_object_put(l_jobj_required_links);
             dap_json_rpc_allocation_error;
             return NULL;
         }
         json_object_object_add(l_jobj_links, "active", l_jobj_active_links);
-        json_object_object_add(l_jobj_links, "total", l_jobj_total_links);
+        json_object_object_add(l_jobj_links, "required", l_jobj_required_links);
         json_object_object_add(l_jobj_ret, "links", l_jobj_links);
     }
+
+    json_object *l_json_sync_status = s_net_sync_status(a_net);
+    json_object_object_add(l_jobj_ret, "processed", l_json_sync_status);
+
     json_object *l_jobj_states = json_object_new_object();
     json_object *l_jobj_current_states = json_object_new_string(c_net_states[PVT(a_net)->state]);
     json_object *l_jobj_target_states = json_object_new_string(c_net_states[PVT(a_net)->state_target]);
@@ -2134,7 +2170,7 @@ bool s_net_load(void *a_arg)
             dap_chain_save_all( l_chain );
             log_it (L_NOTICE, "Initialized chain files");
         }
-
+        l_chain->atom_num_last = l_chain->callback_count_atom(l_chain);
         l_chain = l_chain->next;
     }
     // Process thresholds if any
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index d58a9ad326056c1e5043542e897aa686f9240a78..1924ec2c250c444a28337cb756aa7b4c7cbded91 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -387,13 +387,17 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
     }
     json_object_array_add(json_obj_datum, json_obj_lim);
     size_t i_tmp = 0;
+    size_t
+            l_tx_ledger_accepted = 0,
+            l_tx_ledger_rejected = 0;
     // load transactions
     dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain);
-
+size_t datums = 0;
     for (dap_chain_datum_t *l_datum = a_chain->callback_datum_iter_get_first(l_datum_iter);
                             l_datum;
                             l_datum = a_chain->callback_datum_iter_get_next(l_datum_iter))
     {
+        datums++;
         json_object *l_corr_object = NULL;
         if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX)
             // go to next datum
@@ -405,11 +409,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
         if (!l_list_in_items) // a bad tx
             continue;
         // all in items should be from the same address
-        if (i_tmp >= l_arr_end || i_tmp < l_arr_start) {
-            i_tmp++;
-            continue;                    
-        }
-        i_tmp++;
+        
         dap_chain_addr_t *l_src_addr = NULL;
         bool l_base_tx = false, l_reward_collect = false;
         const char *l_noaddr_token = NULL;
@@ -600,6 +600,11 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                     l_corr_value = l_value;
                 }
                 const char *l_coins_str, *l_value_str = dap_uint256_to_char(l_value, &l_coins_str);
+                if (i_tmp >= l_arr_end || i_tmp < l_arr_start) {
+                    i_tmp++;
+                    continue;                    
+                }
+                i_tmp++;
                 
                 json_object *j_obj_data = json_object_new_object();
                 if (!j_obj_data) {
@@ -608,6 +613,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                     json_object_put(j_arr_data);
                     return NULL;
                 }
+                l_src_token ? l_tx_ledger_accepted++ : l_tx_ledger_rejected++;
                 json_object_object_add(j_obj_data, "tx_type", json_object_new_string("recv"));
                 json_object_object_add(j_obj_data, "recv_coins", json_object_new_string(l_coins_str));
                 json_object_object_add(j_obj_data, "recv_datoshi", json_object_new_string(l_value_str));
@@ -634,6 +640,11 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                                                         : dap_chain_tx_out_cond_subtype_to_str(
                                                               ((dap_chain_tx_out_cond_t *)it->data)->header.subtype);
                 const char *l_coins_str, *l_value_str = dap_uint256_to_char(l_value, &l_coins_str);
+                if (i_tmp >= l_arr_end || i_tmp < l_arr_start) {
+                    i_tmp++;
+                    continue;                    
+                }
+                i_tmp++;
                 json_object * j_obj_data = json_object_new_object();
                 if (!j_obj_data) {
                     dap_json_rpc_allocation_error;
@@ -641,6 +652,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                     json_object_put(j_arr_data);
                     return NULL;
                 }
+                l_src_token ? l_tx_ledger_accepted++ : l_tx_ledger_rejected++;
                 json_object_object_add(j_obj_data, "tx_type", json_object_new_string("send"));
                 json_object_object_add(j_obj_data, "send_coins", json_object_new_string(l_coins_str));
                 json_object_object_add(j_obj_data, "send_datoshi", json_object_new_string(l_value_str));
@@ -684,7 +696,9 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
     }    
     json_object_object_add(json_obj_summary, "network", json_object_new_string(l_net->pub.name));
     json_object_object_add(json_obj_summary, "chain", json_object_new_string(a_chain->name));
-    json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(i_tmp));    
+    json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(i_tmp));
+    json_object_object_add(json_obj_summary, "accepted_tx", json_object_new_int(l_tx_ledger_accepted));
+    json_object_object_add(json_obj_summary, "rejected_tx", json_object_new_int(l_tx_ledger_rejected));    
     return json_obj_datum;
 }
 
@@ -712,26 +726,28 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net,
             json_object_object_add(json_obj_lim, "offset", json_object_new_int(l_arr_start));            
         }
         size_t l_arr_end =  l_chain->callback_count_atom(l_chain);
-        l_arr_end = a_limit ? l_arr_start + a_limit : l_arr_start + 1000;
-        json_object_object_add(json_obj_lim, "limit", json_object_new_int(l_arr_end - l_arr_start));
+        l_arr_end = a_limit ? l_arr_start + a_limit : 0;
+        l_arr_end ? json_object_object_add(json_obj_lim, "limit", json_object_new_int(l_arr_end - l_arr_start)):
+                    json_object_object_add(json_obj_lim, "limit", json_object_new_string("unlimit"));
         json_object_array_add(json_arr_out, json_obj_lim);
         if (l_arr_end > l_chain->callback_count_atom(l_chain)) {
             l_arr_end = l_chain->callback_count_atom(l_chain);
         }
 
         bool look_for_unknown_service = (a_srv && strcmp(a_srv,"unknown") == 0);
-
-        HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) {
-            if (l_count_tx >= l_arr_end)
+size_t datums = 0;
+        HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) {            
+            if ((l_count_tx >= l_arr_end)&&(l_arr_end))
                 break;
             l_iter = l_chain->callback_atom_iter_create(l_chain, l_cell->id, NULL);
             size_t l_atom_size = 0;
             dap_chain_atom_ptr_t l_ptr = l_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size);
-            while (l_ptr && l_atom_size && (l_count_tx < l_arr_end)) {
+            while (l_ptr && l_atom_size && ((l_count_tx < l_arr_end)||(!l_arr_end))) {
                 size_t l_datums_count = 0;
                 dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count);
-                for (size_t i = 0; i < l_datums_count && (l_count_tx < l_arr_end); i++) {
+                for (size_t i = 0; i < l_datums_count && ((l_count_tx < l_arr_end)||(!l_arr_end)); i++) {
                     if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) {
+                        datums++;
                         if (l_count_tx < l_arr_start) {
                             l_count_tx++;
                             continue;
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 5c1d0941577a2fec5f45044b02092aff77da9336..ed77c8a7fb55bc4645f48f40b3625af3a2e32952 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -892,12 +892,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply)
             }
             json_object_array_add(json_arr_bl_cache_out, json_obj_lim);
             size_t i_tmp = 0;
-            for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) {                
-                if (i_tmp < l_start_arr || i_tmp >= l_arr_end) {
-                    i_tmp++;
-                    continue;
-                }
-                i_tmp++;
+            for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) {
                 dap_time_t l_ts = l_block_cache->block->hdr.ts_created;
                 if (l_from_time && l_ts < l_from_time)
                     continue;
@@ -958,6 +953,11 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply)
                             continue;
                     }
                 }
+                if (i_tmp < l_start_arr || i_tmp >= l_arr_end) {
+                    i_tmp++;
+                    continue;
+                }
+                i_tmp++;
                 char l_buf[DAP_TIME_STR_SIZE];
                 json_object* json_obj_bl_cache = json_object_new_object();
                 dap_time_to_str_rfc822(l_buf, DAP_TIME_STR_SIZE, l_ts);