diff --git a/dap-sdk b/dap-sdk
index 4f8979acd221c1b9b82187052550c085048e206e..c7b6e75b903529d767159b7fecb7a7b32a7d272c 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 4f8979acd221c1b9b82187052550c085048e206e
+Subproject commit c7b6e75b903529d767159b7fecb7a7b32a7d272c
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index c020d0515da4a38f059acdec9c0e5ba32e3a900d..280f7776d7d203fe8afe741307acc9f4cee5066f 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -277,6 +277,7 @@ typedef struct dap_ledger_private {
     const char *net_native_ticker;
     uint256_t fee_value;
     dap_chain_addr_t fee_addr;
+    dap_list_t *poa_certs;
     // List of ledger - unspent transactions cache
     dap_chain_ledger_tx_item_t *threshold_txs;
     dap_chain_ledger_token_emission_item_t * threshold_emissions;
@@ -2404,12 +2405,13 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
  * @param a_net_name char * network name, for example "kelvin-testnet"
  * @return dap_ledger_t*
  */
-dap_ledger_t *dap_chain_ledger_create(uint16_t a_flags, char *a_net_name, const char *a_net_native_ticker)
+dap_ledger_t *dap_chain_ledger_create(uint16_t a_flags, char *a_net_name, const char *a_net_native_ticker, dap_list_t *a_poa_certs)
 {
     dap_ledger_t *l_ledger = dap_chain_ledger_handle_new();
     l_ledger->net_name = a_net_name;
     dap_ledger_private_t *l_ledger_pvt = PVT(l_ledger);
     l_ledger_pvt->net_native_ticker = a_net_native_ticker;
+    l_ledger_pvt->poa_certs = a_poa_certs;
     l_ledger_pvt->flags = a_flags;
     l_ledger_pvt->check_ds = a_flags & DAP_CHAIN_LEDGER_CHECK_LOCAL_DS;
     l_ledger_pvt->check_cells_ds = a_flags & DAP_CHAIN_LEDGER_CHECK_CELLS_DS;
@@ -3307,6 +3309,19 @@ bool s_tx_match_sign(dap_chain_datum_token_emission_t *a_datum_emission, dap_cha
     return false;
 }
 
+static int s_callback_sign_compare(const void *a, const void *b)
+{
+    return !dap_pkey_match_sign((dap_pkey_t *)a, (dap_sign_t *)b);
+}
+
+bool dap_chain_ledger_tx_poa_signed(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx)
+{
+    dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_SIG, NULL);
+    dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t *)l_tx_sig);
+    return dap_list_find_custom(PVT(a_ledger)->poa_certs, l_sign, s_callback_sign_compare);
+}
+
+
 /**
  * Checking a new transaction before adding to the cache
  *
@@ -3961,12 +3976,15 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
 
     // 7. Check the network fee
     if (l_fee_check && compare256(l_fee_sum, l_ledger_pvt->fee_value) == -1) {
-        char *l_current_fee = dap_chain_balance_to_coins(l_fee_sum);
-        char *l_expected_fee = dap_chain_balance_to_coins(l_ledger_pvt->fee_value);
-        log_it(L_ERROR, "Fee value is invalid, expected %s pointed %s", l_expected_fee, l_current_fee);
-        l_err_num = -55;
-        DAP_DEL_Z(l_current_fee);
-        DAP_DEL_Z(l_expected_fee);
+        // Check for PoA-cert-signed "service" no-tax tx
+        if (!dap_chain_ledger_tx_poa_signed(a_ledger, a_tx)) {
+            char *l_current_fee = dap_chain_balance_to_coins(l_fee_sum);
+            char *l_expected_fee = dap_chain_balance_to_coins(l_ledger_pvt->fee_value);
+            log_it(L_ERROR, "Fee value is invalid, expected %s pointed %s", l_expected_fee, l_current_fee);
+            l_err_num = -55;
+            DAP_DEL_Z(l_current_fee);
+            DAP_DEL_Z(l_expected_fee);
+        }
     }
 
     if (a_main_ticker && !l_err_num)
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index b38dd418703480d2bbbac1349f0392ad6793fefa..e07f544e7fb0fc4163ddaa798f848b0688e8e180 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -146,7 +146,7 @@ typedef struct dap_chain_net dap_chain_net_t;
 int dap_chain_ledger_init();
 void dap_chain_ledger_deinit();
 
-dap_ledger_t *dap_chain_ledger_create(uint16_t a_flags, char *a_net_name, const char *a_net_native_ticker);
+dap_ledger_t *dap_chain_ledger_create(uint16_t a_flags, char *a_net_name, const char *a_net_native_ticker, dap_list_t *a_poa_certs);
 
 void dap_chain_ledger_set_fee(dap_ledger_t *a_ledger, uint256_t a_fee, dap_chain_addr_t a_fee_addr);
 
@@ -251,6 +251,8 @@ void dap_chain_ledger_addr_get_token_ticker_all_depricated(dap_ledger_t *a_ledge
 void dap_chain_ledger_addr_get_token_ticker_all(dap_ledger_t *a_ledger, dap_chain_addr_t * a_addr,
         char *** a_tickers, size_t * a_tickers_size);
 
+bool dap_chain_ledger_tx_poa_signed(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx);
+
 // Checking a new transaction before adding to the cache
 int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash,
                                     bool a_from_threshold, dap_list_t **a_list_bound_items, dap_list_t **a_list_tx_out, char **a_main_ticker);
diff --git a/modules/chain/tests/dap_chain_ledger_tests.c b/modules/chain/tests/dap_chain_ledger_tests.c
index da64d64ce39b8e4ba83c2f4351374a2481b981f4..609408f87ae3650b825b0a9716aa83d9d30b1944 100644
--- a/modules/chain/tests/dap_chain_ledger_tests.c
+++ b/modules/chain/tests/dap_chain_ledger_tests.c
@@ -369,7 +369,7 @@ void dap_chain_ledger_test_run(void){
     dap_print_module_name("dap_chain_ledger");
     uint16_t l_flags = 0;
     l_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION;
-    dap_ledger_t *l_ledger = dap_chain_ledger_create(l_flags, "Snet", s_token_ticker);
+    dap_ledger_t *l_ledger = dap_chain_ledger_create(l_flags, "Snet", s_token_ticker, NULL);
     char *l_seed_ph = "H58i9GJKbn91238937^#$t6cjdf";
     size_t l_seed_ph_size = strlen(l_seed_ph);
     dap_cert_t *l_cert = dap_cert_generate_mem_with_seed("testCert", DAP_ENC_KEY_TYPE_SIG_PICNIC, l_seed_ph, l_seed_ph_size);
diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
index 742271b5612c855b4d84d4163ace24004f0ea7b0..27629e395411f8a7ae6a61f43de8adb8b79165b9 100644
--- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
+++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
@@ -821,13 +821,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         // Update actual receipt
         bool l_is_first_sign = false;
         if (! l_usage->receipt_next && l_usage->receipt){
-            DAP_DELETE(l_usage->receipt);
+            DAP_DEL_Z(l_usage->receipt);
             l_usage->receipt = DAP_NEW_SIZE(dap_chain_datum_tx_receipt_t,l_receipt_size);
             l_is_first_sign = true;
             l_usage->is_active = true;
             memcpy( l_usage->receipt, l_receipt, l_receipt_size);
         } else if (l_usage->receipt_next ){
-            DAP_DELETE(l_usage->receipt_next);
+            DAP_DEL_Z(l_usage->receipt_next);
             l_usage->receipt_next = DAP_NEW_SIZE(dap_chain_datum_tx_receipt_t,l_receipt_size);
             l_usage->is_active = true;
             memcpy( l_usage->receipt_next, l_receipt, l_receipt_size);
@@ -1012,21 +1012,26 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         char *l_tx_in_hash_str = dap_chain_hash_fast_to_str_new(&l_responce->hdr.tx_cond);
         log_it(L_NOTICE, "Received new tx cond %s", l_tx_in_hash_str);
         DAP_DELETE(l_tx_in_hash_str);
-        l_usage->is_waiting_new_tx_cond = false;
 
+        if(!l_usage->is_waiting_new_tx_cond || !l_usage->is_grace)
+            break;
+
+        l_usage->is_waiting_new_tx_cond = false;
+        dap_stream_ch_chain_net_srv_pkt_error_t l_err = { };
         usages_in_grace_t *l_curr_grace_item = NULL;
         pthread_mutex_lock(&s_ht_grace_table_mutex);
         HASH_FIND(hh, s_grace_table, &l_usage->tx_cond_hash, sizeof(dap_hash_fast_t), l_curr_grace_item);
         pthread_mutex_unlock(&s_ht_grace_table_mutex);
 
-//        if (dap_hash_fast_compare(&l_responce->hdr.tx_cond, &l_usage->tx_cond_hash) || !l_usage->is_grace){ //check new tx not equals to old tx or tx waiting grace period is over
-//            // if equals delete receipt and tx and stop grace if running
-//            if (l_curr_grace_item){
-//                HASH_DEL(s_grace_table, l_curr_grace_item);
-//                dap_timerfd_delete_mt(l_curr_grace_item->grace->stream_worker->worker, l_curr_grace_item->grace->timer_es_uuid);
-//            }
-//            break;
-//        }
+        if (dap_hash_fast_is_blank(&l_responce->hdr.tx_cond)){ //if new tx cond creation failed tx_cond in responce will be blank
+            if (l_curr_grace_item){
+                HASH_DEL(s_grace_table, l_curr_grace_item);
+                dap_timerfd_delete_mt(l_curr_grace_item->grace->stream_worker->worker, l_curr_grace_item->grace->timer_es_uuid);
+                s_grace_error(l_curr_grace_item->grace, l_err);
+                DAP_DEL_Z(l_curr_grace_item);
+            }
+            break;
+        }
 
         dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_hash(l_usage->net->pub.ledger, &l_responce->hdr.tx_cond);
         if (l_tx){
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index c438ca2e17e297014a600981de0665e688c8fea6..a3478c334bd8c53b9ff603de72679dd5e22763a1 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -840,9 +840,10 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
     dap_list_t *l_list_used_out;
     const char *l_native_ticker = dap_chain_net_by_id(a_chain->net_id)->pub.native_ticker;
     bool not_native = dap_strcmp(a_ticker, l_native_ticker);
-    bool l_net_fee_used = dap_chain_net_tx_get_fee(a_chain->net_id, &l_net_fee, &l_addr_to_fee);
-    if(l_net_fee_used)
-        SUM_256_256(l_total_fee,l_net_fee,&l_total_fee);
+    bool l_net_fee_used = IS_ZERO_256(a_value_fee) ? false :
+                                                     dap_chain_net_tx_get_fee(a_chain->net_id, &l_net_fee, &l_addr_to_fee);
+    if (l_net_fee_used)
+        SUM_256_256(l_total_fee, l_net_fee, &l_total_fee);
 
     dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
     l_tx->header.ts_created = time(NULL);
@@ -855,14 +856,14 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
         dap_chain_datum_tx_delete(l_tx);
         return NULL;
     }
-    if (not_native)
+    if (not_native && !IS_ZERO_256(l_total_fee))
     {
         if (dap_chain_addr_fill_from_key(&l_addr_from_fee, a_private_key, a_chain->net_id) != 0 ) {
             log_it(L_WARNING,"Can't fill address from transfer");
             dap_chain_datum_tx_delete(l_tx);
             return NULL;
         }
-            // list of transaction with 'out' items
+        // list of transaction with 'out' items
         l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, l_native_ticker,
                                                                      &l_addr_from_fee, l_total_fee, &l_value_transfer);
         if (!l_list_used_out) {
@@ -878,45 +879,50 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast
         }
          //add out
         uint256_t l_value_back = l_value_transfer; // how much datoshi add to 'out' items
-         // Network fee
-        if (!dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_addr_to_fee, l_net_fee, l_native_ticker)){
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
+        // Network fee
+        if (l_net_fee_used) {
+            SUBTRACT_256_256(l_value_back, l_net_fee, &l_value_back);
+            if (!dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_addr_to_fee, l_net_fee, l_native_ticker)){
+                dap_chain_datum_tx_delete(l_tx);
+                return NULL;
+            }
         }
-        SUBTRACT_256_256(l_value_back, l_net_fee, &l_value_back);
-        if (!IS_ZERO_256(a_value_fee))
+        if (!IS_ZERO_256(a_value_fee)) {
             SUBTRACT_256_256(l_value_back, a_value_fee, &l_value_back);
+            if (!dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee)){
+                dap_chain_datum_tx_delete(l_tx);
+                return NULL;
+            }
+        }
         // coin back
-        if (!dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_addr_from_fee, l_value_back, l_native_ticker)){
+        if (!dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_addr_from_fee, l_value_back, l_native_ticker)) {
             dap_chain_datum_tx_delete(l_tx);
             return NULL;
         }
-
-        if (!dap_chain_datum_tx_add_out_ext_item(&l_tx, a_addr_to, l_value_need, a_ticker)){
+        if (!dap_chain_datum_tx_add_out_ext_item(&l_tx, a_addr_to, l_value_need, a_ticker)) {
             dap_chain_datum_tx_delete(l_tx);
             return NULL;
         }
     } else { //native ticker
-        if (!IS_ZERO_256(a_value_fee))
+        if (!IS_ZERO_256(a_value_fee)) {
             SUBTRACT_256_256(l_value_need, a_value_fee, &l_value_need);
-        if(l_net_fee_used){
+            if (!dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee)){
+                dap_chain_datum_tx_delete(l_tx);
+                return NULL;
+            }
+        }
+        if (l_net_fee_used) {
             SUBTRACT_256_256(l_value_need, l_net_fee, &l_value_need);
-            if (!dap_chain_datum_tx_add_out_item(&l_tx, &l_addr_to_fee, l_net_fee)){
+            if (!dap_chain_datum_tx_add_out_item(&l_tx, &l_addr_to_fee, l_net_fee)) {
                 dap_chain_datum_tx_delete(l_tx);
                 return NULL;
             }
         }
-        if (!dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, l_value_need)){
+        if (!dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, l_value_need)) {
             dap_chain_datum_tx_delete(l_tx);
             return NULL;
         }        
     }
-    if (!IS_ZERO_256(a_value_fee)){
-        if (!dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee)){
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-    }
     //sign item
     if(dap_chain_datum_tx_add_sign_item(&l_tx, a_private_key) < 0) {
         log_it(L_WARNING, "No private key for sign");
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index a2677ed38016ebd2488cb9f2afc53a515a2dfc5d..bed281532d916e7329b853aaa14f0883343d86c5 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -2300,8 +2300,18 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
         default:
             l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS;
         }
+        dap_list_t *l_net_keys = NULL;
+        for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) {
+            if (!l_chain->callback_get_poa_certs)
+                continue;
+            l_net_keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL);
+            if (l_net_keys)
+                break;
+        }
+        if (!l_net_keys)
+            log_it(L_WARNING,"PoA certificates for net %s not found.", l_net->pub.name);
         // init LEDGER model
-        l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.name, l_net->pub.native_ticker);
+        l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.name, l_net->pub.native_ticker, l_net_keys);
         // Check if seed nodes are present in local db alias
         char **l_seed_aliases = dap_config_get_array_str(l_cfg, "general", "seed_nodes_aliases",
                                                          &l_net_pvt->seed_aliases_count);
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index b7eabde8dc274e538785639794edc1f723b85291..f03f7a412d539fe2e72838c10bdd90a376c78d50 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -257,19 +257,25 @@ void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force)
                 if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX &&
                         a_chain->callback_get_minimum_fee){
                     uint256_t l_tx_fee = {};
-                    if (dap_chain_datum_tx_get_fee_value ((dap_chain_datum_tx_t*)l_datum->data, &l_tx_fee)) {
-                        log_it(L_WARNING, "Can't get fee value from tx");
-                        continue;
-                    }
-                    uint256_t l_min_fee = a_chain->callback_get_minimum_fee(a_chain);
-                    if (compare256(l_tx_fee, l_min_fee) < 0) {
-                        char *l_tx_fee_str = dap_chain_balance_to_coins(l_tx_fee);
-                        char *l_min_fee_str = dap_chain_balance_to_coins(l_min_fee);
-                        log_it(L_WARNING, "Fee %s is lower than minimum fee %s for tx %s",
-                               l_tx_fee_str, l_min_fee_str, l_objs[i].key);
-                        DAP_DELETE(l_tx_fee_str);
-                        DAP_DELETE(l_min_fee_str);
-                        continue;
+                    dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data;
+                    if (dap_chain_datum_tx_get_fee_value (l_tx, &l_tx_fee) ||
+                            IS_ZERO_256(l_tx_fee)) {
+                        if (!dap_chain_ledger_tx_poa_signed(l_net->pub.ledger, l_tx)) {
+                            log_it(L_WARNING, "Can't get fee value from tx");
+                            continue;
+                        } else
+                            log_it(L_DEBUG, "Process service tx without fee");
+                    } else {
+                        uint256_t l_min_fee = a_chain->callback_get_minimum_fee(a_chain);
+                        if (compare256(l_tx_fee, l_min_fee) < 0) {
+                            char *l_tx_fee_str = dap_chain_balance_to_coins(l_tx_fee);
+                            char *l_min_fee_str = dap_chain_balance_to_coins(l_min_fee);
+                            log_it(L_WARNING, "Fee %s is lower than minimum fee %s for tx %s",
+                                   l_tx_fee_str, l_min_fee_str, l_objs[i].key);
+                            DAP_DELETE(l_tx_fee_str);
+                            DAP_DELETE(l_min_fee_str);
+                            continue;
+                        }
                     }
                 }
 
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index ab2c1621d94e489f2d347caca14c9648e8ae1d42..8fcaeaa80827de0589db594d283e59c46d932458 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1993,7 +1993,7 @@ char    l_buf[1024];
         case CMD_WALLET_NEW: {
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-password", &l_pass_str);
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-sign", &l_sign_type_str);
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-restore", &l_restore_str);
+            int l_restore_opt = dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-restore", &l_restore_str);
             // rewrite existing wallet
             int l_is_force = dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-force", NULL);
 
@@ -2038,9 +2038,23 @@ char    l_buf[1024];
             if (l_sign_type.type == SIG_TYPE_TESLA)
                 return  dap_cli_server_cmd_set_reply_text(a_str_reply, "Tesla algorithm is no longer supported, please, use another variant"), -1;
 
+            uint8_t *l_seed = NULL;
+            size_t l_seed_size = 0, l_restore_str_size = dap_strlen(l_restore_str);
+
+            if(l_restore_opt) {
+                if (l_restore_str_size > 3 && !dap_strncmp(l_restore_str, "0x", 2) && !dap_is_hex_string(l_restore_str + 2, l_restore_str_size - 2)) {
+                    l_seed_size = (l_restore_str_size - 2) / 2;
+                    l_seed = DAP_NEW_SIZE(uint8_t, l_seed_size);
+                    dap_hex2bin(l_seed, l_restore_str + 2, l_restore_str_size - 2);
+                } else {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Restored hash is invalid or too short, wallet is not created. Please use -restore 0x<hex value>");
+                    return -1;
+                }
+            }
+
             // Creates new wallet
             dap_chain_wallet_t *l_wallet = dap_chain_wallet_create_with_seed(l_wallet_name, c_wallets_path, l_sign_type,
-                    l_restore_str, dap_strlen(l_restore_str), l_pass_str);
+                    l_seed, l_seed_size, l_pass_str);
 
             if (!l_wallet)
                 return  dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet is not created because of internal error"), -1;
@@ -5219,9 +5233,9 @@ int com_tx_create(int a_argc, char **a_argv, char **a_str_reply)
     }
 
     // Validator's fee
-    if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-fee", &str_tmp))
+    if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-fee", &str_tmp))
         l_value_fee = dap_chain_balance_scan(str_tmp);
-    if (IS_ZERO_256(l_value_fee)) {
+    if (IS_ZERO_256(l_value_fee) && (!l_emission_hash_str || (str_tmp && strcmp(str_tmp, "0")))) {
         dap_cli_server_cmd_set_reply_text(a_str_reply,
                 "tx_create requires parameter '-fee' to be valid uint256");
         return -5;
@@ -5278,38 +5292,24 @@ int com_tx_create(int a_argc, char **a_argv, char **a_str_reply)
             return -9;
         }
 
-        const char *l_native_ticker = l_net->pub.native_ticker;
-        bool not_native = dap_strcmp(l_token_ticker, l_native_ticker);
-
-        if (not_native) {
-            if (l_wallet_fee_name){
-                l_wallet_fee = dap_chain_wallet_open(l_wallet_fee_name, c_wallets_path);
-                if (!l_wallet_fee) {
-                    dap_cli_server_cmd_set_reply_text(a_str_reply, "wallet %s does not exist", l_wallet_fee_name);
-                    return -12;
-                }
-                l_priv_key = dap_chain_wallet_get_key(l_wallet_fee, 0);
-            } else {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "To create a basic transaction with a "
-                                                               "non-native ticker, you must specify the '-wallet_fee' "
-                                                               "parameter. It is required to pay a commission for the "
-                                                               "transaction.");
-                return -11;
+        if (l_wallet_fee_name){
+            l_wallet_fee = dap_chain_wallet_open(l_wallet_fee_name, c_wallets_path);
+            if (!l_wallet_fee) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet %s does not exist", l_wallet_fee_name);
+                return -12;
             }
-        } else {
-            if (l_cert_str) {
-                l_cert = dap_cert_find_by_name(l_cert_str);
-                if (!l_cert) {
-                    dap_cli_server_cmd_set_reply_text(a_str_reply,
-                                                      "tx_create requires one valid certificate to sign the basic transaction of emission");
-                    return -5;
-                }
-                l_priv_key = l_cert->enc_key;
-            } else {
-                dap_cli_server_cmd_set_reply_text(a_str_reply,
-                                                  "tx_create requires parameter '-cert' for create base tx for emission in native token");
-                return -10;
+            l_priv_key = dap_chain_wallet_get_key(l_wallet_fee, 0);
+        } else if (l_cert_str) {
+            l_cert = dap_cert_find_by_name(l_cert_str);
+            if (!l_cert) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate %s is invalid", l_cert_str);
+                return -5;
             }
+            l_priv_key = l_cert->enc_key;
+        } else {
+            dap_cli_server_cmd_set_reply_text(a_str_reply,
+                                              "tx_create requires parameter '-cert' or '-wallet' for create base tx for emission");
+            return -10;
         }
     }
 
@@ -5335,7 +5335,6 @@ int com_tx_create(int a_argc, char **a_argv, char **a_str_reply)
     dap_string_t *l_string_ret = dap_string_new(NULL);
     int res = 0;
     if (l_emission_hash_str) {
-        bool not_native = dap_strcmp(l_token_ticker, l_net->pub.native_ticker);
         char *l_tx_hash_str = NULL;
         if (!l_priv_key) {
             dap_string_append_printf(l_string_ret, "No private key defined for creating the underlying "
@@ -5344,7 +5343,7 @@ int com_tx_create(int a_argc, char **a_argv, char **a_str_reply)
         }
         l_tx_hash_str = dap_chain_mempool_base_tx_create(l_chain, &l_emission_hash, l_emission_chain->id,
                                                          l_value, l_token_ticker, l_addr_to, l_priv_key,
-                                                         l_hash_out_type,l_value_fee);
+                                                         l_hash_out_type, l_value_fee);
         if (l_tx_hash_str) {
             dap_string_append_printf(l_string_ret, "\nDatum %s with 256bit TX is placed in datum pool\n", l_tx_hash_str);
             DAP_DELETE(l_tx_hash_str);
diff --git a/modules/net/srv/dap_chain_net_srv_stream_session.c b/modules/net/srv/dap_chain_net_srv_stream_session.c
index 5a5d8e99e744fbc8b582b94d34c73913bc89a350..98136f6fbcfbdf72f7fd82ac7e4694c00048ad69 100644
--- a/modules/net/srv/dap_chain_net_srv_stream_session.c
+++ b/modules/net/srv/dap_chain_net_srv_stream_session.c
@@ -100,9 +100,9 @@ void dap_chain_net_srv_usage_delete (dap_chain_net_srv_stream_session_t * a_srv_
         return;
 
     if ( a_srv_session->usage_active->receipt )
-        DAP_DELETE( a_srv_session->usage_active->receipt );
+        DAP_DEL_Z( a_srv_session->usage_active->receipt );
     if ( a_srv_session->usage_active->receipt_next )
-        DAP_DELETE( a_srv_session->usage_active->receipt_next );
+        DAP_DEL_Z( a_srv_session->usage_active->receipt_next);
     if ( a_srv_session->usage_active->client ){
         for (dap_chain_net_srv_client_remote_t * l_srv_client = a_srv_session->usage_active->client, * tmp = NULL; l_srv_client; ){
             tmp = l_srv_client;
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index b2ff5ae724d0851897898eaf962219a03cdd4379..41f000cce27399c095ddaba5a7f2a41893bc50d0 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -1188,7 +1188,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch ,
 
         if( a_srv_session->limits_ts <= 0 && !a_usage->is_grace){
             log_it(L_INFO, "Limits by timestamp are over. Switch to the next receipt");
-            DAP_DELETE(a_usage->receipt);
+            DAP_DEL_Z(a_usage->receipt);
             a_usage->receipt = a_usage->receipt_next;
             a_usage->receipt_next = NULL;
             if ( a_usage->receipt){ // If there is next receipt add the time and request the next receipt
@@ -1245,7 +1245,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch ,
 
         if (a_srv_session->limits_bytes <= 0  && !a_usage->is_grace){
             log_it(L_INFO, "Limits by traffic is over. Switch to the next receipt");
-            DAP_DELETE(a_usage->receipt);
+            DAP_DEL_Z(a_usage->receipt);
             a_usage->receipt = a_usage->receipt_next;
             a_usage->receipt_next = NULL;
             if ( a_usage->receipt){ // If there is next receipt add the time and request the next receipt