diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c
index 103637acd36038468f3f6a14dc9487a86d06fa42..aa4139aa4ce2b4a7e2d264759098a4fd6e881eea 100644
--- a/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c
@@ -230,11 +230,11 @@ json_object *dap_chain_datum_token_to_json(dap_chain_datum_token_t * a_token, si
     }
     size_t l_offset = 0;
     size_t l_certs_field_size = a_token_size - sizeof(*a_token);
-    while (l_offset < l_certs_field_size) {
+    while ((l_offset + l_tsd_total_size) < l_certs_field_size) {
         dap_sign_t *l_sign = (dap_sign_t *) ((byte_t*)a_token->data_n_tsd + l_tsd_total_size + l_offset);
         l_offset += dap_sign_get_size(l_sign);
         json_object *l_obj_sign = dap_sign_to_json(l_sign);
-        if (!l_obj_sign) {
+        if (!l_obj_sign || !dap_sign_get_size(l_sign)) {
             json_object_put(l_obj_signs);
             json_object_put(l_jobj_token);
             dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "Failed to convert signature to JSON.");
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index ef2d6db661751058efcdf601023385531392f682..c0d081d6bffa6b9c42ebd034112591fabf34f8f9 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -252,8 +252,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             );
 
     dap_cli_server_cmd_add ("token_emit", com_token_emit, "Token emission",
-                            "token_emit { sign | -token <mempool_token_ticker> -emission_value <value>"
-                            "-addr <addr> [-chain_emission <chain_name>] -net <net_name> -certs <cert list>\n");
+                            "token_emit { sign -emission <hash> | -token <mempool_token_ticker> -emission_value <value>\n" 
+                            "\t-addr <addr> } [-chain_emission <chain_name>] -net <net_name> -certs <cert_list>\n");
 
     dap_cli_server_cmd_add("mempool", com_mempool, "Command for working with mempool",
                            "mempool list -net <net_name> [-chain <chain_name>] [-addr <addr>] [-brief] [-limit] [-offset]\n"
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 2fe0e6a52714f740480cacb4d8f6a17edc4a2c6a..85db305dd0e41e8054156dc24b0227813922b3a8 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -2428,7 +2428,6 @@ static dap_chain_datum_token_t * s_sign_cert_in_cycle(dap_cert_t ** l_certs, dap
     {
         dap_sign_t * l_sign = dap_cert_sign(l_certs[i],  l_datum_token,
            sizeof(*l_datum_token) + l_tsd_size, 0);
-
         if (l_sign) {
             size_t l_sign_size = dap_sign_get_size(l_sign);
             l_datum_token = DAP_REALLOC(l_datum_token, sizeof(*l_datum_token) + (*l_datum_signs_offset) + l_sign_size);
@@ -2534,9 +2533,11 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply)
                     l_tsd_size = l_datum_token->header_native_decl.tsd_total_size;
                 // Check for signatures, are they all in set and are good enought?
                 size_t l_signs_size = 0, i = 1;
-                for (i = 1; i <= l_datum_token->signs_total; i++){
+                uint16_t l_tmp_signs_total = l_datum_token->signs_total;
+                l_datum_token->signs_total = 0;
+                for (i = 1; i <= l_tmp_signs_total; i++){
                     dap_sign_t *l_sign = (dap_sign_t *)(l_datum_token->data_n_tsd + l_tsd_size + l_signs_size);
-                    if(dap_sign_verify(l_sign, l_datum_token, sizeof(*l_datum_token) - sizeof(uint16_t))) {
+                    if( dap_sign_verify(l_sign, l_datum_token, sizeof(*l_datum_token)) != 1) {
                         log_it(L_WARNING, "Wrong signature %zu for datum_token with key %s in mempool!", i, l_datum_hash_out_str);
                         dap_cli_server_cmd_set_reply_text(a_str_reply,
                                 "Datum %s with datum token has wrong signature %zu, break process and exit",
@@ -2549,7 +2550,7 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply)
                     }
                     l_signs_size += dap_sign_get_size(l_sign);
                 }
-
+                l_datum_token->signs_total = l_tmp_signs_total;
                 log_it(L_DEBUG, "Datum %s with token declaration: %hu signatures are verified well (sign_size = %zu)",
                                  l_datum_hash_out_str, l_datum_token->signs_total, l_signs_size);
 
@@ -4889,24 +4890,24 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply)
         }
     }
 
-    // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled.
-    if (!dap_chain_addr_is_blank(l_addr) && l_addr->net_id.uint64 != l_net->pub.id.uint64) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "destination wallet network ID=0x%"DAP_UINT64_FORMAT_x
-                                                       " and network ID=0x%"DAP_UINT64_FORMAT_x" is not equal."
-                                                       " Please, change network name or wallet address",
-                                                       l_addr->net_id.uint64, l_net->pub.id.uint64);
-        DAP_DEL_Z(l_addr);
-        DAP_DEL_Z(l_emission);
-        return -3;
-    }
-
-    if(!l_ticker) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-token'");
-        DAP_DEL_Z(l_addr);
-        return -3;
-    }
-
     if (!l_add_sign) {
+        // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled.
+        if (!dap_chain_addr_is_blank(l_addr) && l_addr->net_id.uint64 != l_net->pub.id.uint64) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "destination wallet network ID=0x%"DAP_UINT64_FORMAT_x
+                                                           " and network ID=0x%"DAP_UINT64_FORMAT_x" is not equal."
+                                                           " Please, change network name or wallet address",
+                                                           l_addr->net_id.uint64, l_net->pub.id.uint64);
+            DAP_DEL_Z(l_addr);
+            DAP_DEL_Z(l_emission);
+            return -3;
+        }
+
+        if(!l_ticker) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-token'");
+            DAP_DEL_Z(l_addr);
+            return -3;
+        }
+    
         if (!l_chain_emission) {
 			if ( (l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net,CHAIN_TYPE_EMISSION)) == NULL ) {
 				DAP_DEL_Z(l_addr);
diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
index 1067c0bcf72ae91ca0d285a6b4f718898db19a61..6287d6a0582666f8df5782ea0fe42162a54813ee 100644
--- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
@@ -1901,36 +1901,6 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index
     dap_hash_fast_t l_tx_hash = {};
     if (l_tx_hash_str) {
         dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash);
-        dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash);
-        if (!l_tx) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is not found", l_tx_hash_str);
-            return -21;
-        }
-        int l_out_num = 0;
-        if (!dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_num)) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is invalid", l_tx_hash_str);
-            return -22;
-        }
-        dap_hash_fast_t l_spender_hash = {};
-        if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_out_num, &l_spender_hash)) {
-            l_tx_hash = l_spender_hash;
-            if (!dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash)) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Previous transaction %s is not found", l_tx_hash_str);
-                return -21;
-            }
-        }
-        dap_chain_net_srv_stake_item_t *l_stake;
-        HASH_FIND(ht, s_srv_stake->tx_itemlist, &l_tx_hash, sizeof(dap_hash_t), l_stake);
-        if (l_stake) {
-            char *l_delegated_hash_str = dap_hash_fast_is_blank(&l_spender_hash) ? dap_strdup(l_tx_hash_str)
-                                                                                 : dap_hash_fast_to_str_new(&l_spender_hash);
-            char l_pkey_hash_str[DAP_HASH_FAST_STR_SIZE];
-            dap_hash_fast_to_str(&l_stake->signing_addr.data.hash_fast, l_pkey_hash_str, DAP_HASH_FAST_STR_SIZE);
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s has active delegated key %s, need to revoke it first",
-                                              l_delegated_hash_str, l_pkey_hash_str);
-            DAP_DELETE(l_delegated_hash_str);
-            return -30;
-        }
     } else {
         dap_chain_addr_t l_signing_addr;
         if (l_cert_str) {
@@ -1960,6 +1930,40 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index
         }
         l_tx_hash = l_stake->tx_hash;
     }
+
+    char *l_tx_hash_str_tmp = l_tx_hash_str ? l_tx_hash_str : dap_hash_fast_to_str_static(&l_tx_hash);
+    dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash);
+    if (!l_tx) {
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s not found", l_tx_hash_str_tmp);
+        return -21;
+    }
+
+    int l_out_num = 0;
+    if (!dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_num)) {
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is invalid", l_tx_hash_str_tmp);
+        return -22;
+    }
+    dap_hash_fast_t l_spender_hash = {};
+    if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_out_num, &l_spender_hash)) {
+        l_tx_hash = l_spender_hash;
+        l_tx_hash_str_tmp = dap_hash_fast_to_str_static(&l_spender_hash);
+        if (!dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash)) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Previous transaction %s is not found", l_tx_hash_str_tmp);
+            return -21;
+        }
+    }
+    if (l_tx_hash_str || l_cert_str) {
+        dap_chain_net_srv_stake_item_t *l_stake;
+        HASH_FIND(ht, s_srv_stake->tx_itemlist, &l_tx_hash, sizeof(dap_hash_t), l_stake);
+        if (l_stake) {
+            char l_pkey_hash_str[DAP_HASH_FAST_STR_SIZE]; 
+            dap_hash_fast_to_str(&l_stake->signing_addr.data.hash_fast, l_pkey_hash_str, DAP_HASH_FAST_STR_SIZE);
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s has active delegated key %s, need to revoke it first",
+                                              l_tx_hash_str_tmp, l_pkey_hash_str);
+            return -30;
+        }
+    }
+
     if (l_wallet_str) {
         const char* l_sign_str = "";
         dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));