diff --git a/dap_chain_net.c b/dap_chain_net.c
index f67f435c1ea390f827cfa133f3eeada5ca293e53..b87c97b62e17d6eab4831edb0ccf75034d86997a 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -630,6 +630,7 @@ lb_proc_state:
             }
         }
             break;
+        default: log_it (L_DEBUG, "Unprocessed state");
     }
     pthread_mutex_unlock(&PVT(l_net)->state_mutex );
     return ret;
diff --git a/dap_chain_net.h b/dap_chain_net.h
index 05d9e73f13bd4e687299c83e89e91d342501908a..953a3d99905f402cf2d3100bbc39687a9c82efbc 100644
--- a/dap_chain_net.h
+++ b/dap_chain_net.h
@@ -1,27 +1,28 @@
 /*
- * Authors:
- * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
- * Alexander Lysikov <alexander.lysikov@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net
- * Kelvin Project https://github.com/kelvinblockchain
- * Copyright  (c) 2017-2019
- * All rights reserved.
-
- This file is part of DAP (Deus Applications Prototypes) the open source project
-
-    DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    DAP is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    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/>.
+* Authors:
+* Dmitriy Gerasimov <naeper@demlabs.net>
+* Aleksandr Lysikov <alexander.lysikov@demlabs.net>
+* Cellframe       https://cellframe.net
+* DeM Labs Inc.   https://demlabs.net
+* Copyright  (c) 2017-2019
+* All rights reserved.
+
+This file is part of CellFrame SDK the open source project
+
+CellFrame SDK is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+CellFrame SDK is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/licenses/>.
 */
+
 #pragma once
 
 #ifndef _WIN32
diff --git a/dap_chain_node.c b/dap_chain_node.c
index 68436d22441b736aeefc2a47cee8b17486fff6ef..1fb9ae970c2cd5b2eda0b3bc9e9e4cfe6385f54c 100644
--- a/dap_chain_node.c
+++ b/dap_chain_node.c
@@ -86,12 +86,12 @@ bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *ad
  */
 bool dap_chain_node_alias_register(dap_chain_net_t * a_net,const char *alias, dap_chain_node_addr_t *addr)
 {
-    const char *a_key = alias;
+    char *a_key = strdup(alias);
 //    char a_value[2 * sizeof(dap_chain_node_addr_t) + 1];
 //    if(bin2hex(a_value, (const unsigned char *) addr, sizeof(dap_chain_node_addr_t)) == -1)
 //        return false;
 //    a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0';
-    bool res = dap_chain_global_db_gr_set(a_key, (const uint8_t*) addr, sizeof(dap_chain_node_addr_t)
+    bool res = dap_chain_global_db_gr_set(a_key,  addr, sizeof(dap_chain_node_addr_t)
                                           , a_net->pub.gdb_nodes_aliases);
     return res;
 }
@@ -114,7 +114,7 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const
  */
 bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias)
 {
-    const char *a_key = a_alias;
+    char *a_key = strdup(a_alias);
     bool res = dap_chain_global_db_gr_del(a_key, a_net->pub.gdb_nodes_aliases);
     return res;
 }
@@ -153,7 +153,7 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *nod
     }
     //char *a_value = dap_chain_node_info_serialize(node_info, NULL);
     size_t node_info_size = dap_chain_node_info_get_size(node_info);
-    bool res = dap_chain_global_db_gr_set(l_key, (const uint8_t *) node_info, node_info_size, a_net->pub.gdb_nodes);
+    bool res = dap_chain_global_db_gr_set(l_key, node_info, node_info_size, a_net->pub.gdb_nodes);
     DAP_DELETE(l_key);
     //DAP_DELETE(a_value);
     return res?0:-3;
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 416898cac5a0cc05cc2e75976e9d2ae6ba4429b1..8ae4d435ec1287844df1348ff3611867331300a7 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -63,7 +63,7 @@
 #include "dap_strfuncs.h"
 #include "dap_list.h"
 #include "dap_string.h"
-#include "dap_chain_cert.h"
+#include "dap_cert.h"
 #include "dap_chain_wallet.h"
 #include "dap_chain_node.h"
 #include "dap_chain_global_db.h"
@@ -1580,6 +1580,8 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-w", &wallet_name);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name); // for
 
+    dap_chain_net_t * l_net = l_net_name ? dap_chain_net_by_name( l_net_name) : NULL;
+
     dap_string_t *l_string_ret = dap_string_new(NULL);
     switch (cmd_num) {
     // new wallet
@@ -1589,18 +1591,18 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
                     "wallet name option <-w>  not defined");
             return -1;
         }
-        dap_chain_sign_type_t l_sign_type = { SIG_TYPE_BLISS };
-        dap_chain_net_id_t l_net_id = { 0x1 };
+        dap_sign_type_t l_sign_type = { SIG_TYPE_BLISS };
         // Creates new wallet
-        dap_chain_wallet_t *l_wallet = dap_chain_wallet_create(wallet_name, c_wallets_path, l_net_id, l_sign_type);
-        dap_chain_addr_t *l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
-        if(!l_wallet || !l_addr) {
+        dap_chain_wallet_t *l_wallet = dap_chain_wallet_create(wallet_name, c_wallets_path,  l_sign_type);
+        dap_chain_addr_t *l_addr = l_net? dap_chain_wallet_get_addr(l_wallet,l_net->pub.id ) : NULL;
+        if(!l_wallet ) {
             dap_chain_node_cli_set_reply_text(str_reply, "wallet is not created");
             return -1;
         }
-        char *l_addr_str = dap_chain_addr_to_str(l_addr);
+        char *l_addr_str = l_addr? dap_chain_addr_to_str(l_addr) : NULL;
         dap_string_append_printf(l_string_ret, "wallet '%s' successfully created\n", l_wallet->name);
-        dap_string_append_printf(l_string_ret, "new address %s", l_addr_str);
+        if ( l_addr_str )
+            dap_string_append_printf(l_string_ret, "new address %s", l_addr_str);
         DAP_DELETE(l_addr_str);
         dap_chain_wallet_close(l_wallet);
     }
@@ -1617,11 +1619,13 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
                     char *l_file_path_tmp = dap_strdup_printf("%s/%s", c_wallets_path, l_file_name);
                     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_wallet_get_addr(l_wallet);
+                        dap_chain_addr_t *l_addr = l_net? dap_chain_wallet_get_addr(l_wallet, l_net->pub.id) : NULL;
                         char *l_addr_str = dap_chain_addr_to_str(l_addr);
                         dap_string_append_printf(l_string_ret, "\nwallet: %s\n", l_wallet->name);
-                        dap_string_append_printf(l_string_ret, "addr: %s\n", (l_addr_str) ? l_addr_str : "-");
-                        DAP_DELETE(l_addr_str);
+                        if ( l_addr_str){
+                            dap_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);
                     }
                     DAP_DELETE(l_file_path_tmp);
@@ -1639,7 +1643,8 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
 
         if(wallet_name) {
             l_wallet = dap_chain_wallet_open(wallet_name, c_wallets_path);
-            l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
+            if ( l_net )
+                l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id );
         }
         if(!l_addr && addr_str)
             l_addr = dap_chain_addr_from_str(addr_str);
@@ -1779,7 +1784,7 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
 
     if(l_datum_hash_str) {
         const char * l_certs_str = NULL;
-        dap_chain_cert_t ** l_certs = NULL;
+        dap_cert_t ** l_certs = NULL;
         size_t l_certs_count = 0;
         dap_chain_t * l_chain;
 
@@ -1800,7 +1805,7 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
 
         // Load certs lists
         if (l_certs_str)
-            dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_count);
+            dap_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_count);
 
         if(!l_certs_count) {
             dap_chain_node_cli_set_reply_text(a_str_reply,
@@ -1831,9 +1836,9 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                 size_t l_signs_count = 0;
 
                 for(size_t l_offset = 0; l_offset < l_signs_size; l_signs_count++) {
-                    dap_chain_sign_t * l_sign = (dap_chain_sign_t *) l_datum_token->signs + l_offset;
-                    l_offset += dap_chain_sign_get_size(l_sign);
-                    if( dap_chain_sign_verify(l_sign, l_datum_token, sizeof(l_datum_token->header)) != 1) {
+                    dap_sign_t * l_sign = (dap_sign_t *) l_datum_token->signs + l_offset;
+                    l_offset += dap_sign_get_size(l_sign);
+                    if( dap_sign_verify(l_sign, l_datum_token, sizeof(l_datum_token->header)) != 1) {
                         log_it(L_WARNING, "Wrong signature %u for datum_token with key %s in mempool!", l_signs_count, l_datum_hash_str);
                         dap_chain_node_cli_set_reply_text(a_str_reply,
                                 "Datum %s with datum token has wrong signature %u, break process and exit",
@@ -1870,10 +1875,10 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                 else if(l_datum_token->header.signs_total >= l_signs_count + l_certs_count) {
                     size_t l_offset = 0;
                     for(size_t i = 0; i < l_certs_count; i++) {
-                        dap_chain_sign_t * l_sign = dap_chain_sign_create(l_certs[i]->enc_key,
+                        dap_sign_t * l_sign = dap_sign_create(l_certs[i]->enc_key,
                                 l_datum_token,
                                 sizeof(l_datum_token->header), 0);
-                        size_t l_sign_size = dap_chain_sign_get_size(l_sign);
+                        size_t l_sign_size = dap_sign_get_size(l_sign);
 
 
                         l_signs_size+= l_sign_size;
@@ -1899,14 +1904,15 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                     // Recalc hash, string and place new datum
 
                     // Calc datum's hash
-                    dap_chain_hash_fast_t l_key_hash;
-                    dap_hash_fast(l_datum, l_datum_size, (uint8_t*) &l_key_hash);
+                    dap_chain_hash_fast_t l_key_hash={0};
+                    dap_hash_fast(l_datum, l_datum_size, &l_key_hash);
                     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
 
                     // Add datum to mempool with datum_token hash as a key
                     if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
+                        char* l_hash_str = strdup(l_datum_hash_str);
                         // Remove old datum from pool
-                        if(dap_chain_global_db_gr_del(l_datum_hash_str, l_gdb_group_mempool)) {
+                        if(dap_chain_global_db_gr_del( l_hash_str, l_gdb_group_mempool)) {
                             dap_chain_node_cli_set_reply_text(a_str_reply,
                                     "datum %s produced from %s is replacing the %s in datum pool",
                                     l_key_str, l_datum_hash_str, l_datum_hash_str);
@@ -1924,6 +1930,7 @@ int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply)
                             DAP_DELETE(l_gdb_group_mempool);
                             return 1;
                         }
+                        DAP_DELETE(l_hash_str);
 
                     }
                     else {
@@ -2061,12 +2068,15 @@ int com_mempool_delete(int argc, char ** argv, char ** a_str_reply)
         const char * l_datum_hash_str = NULL;
         dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str);
         if(l_datum_hash_str) {
+            char * l_datum_hash_str2 = strdup(l_datum_hash_str);
             char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
-            if(dap_chain_global_db_gr_del(l_datum_hash_str, l_gdb_group_mempool)) {
+            if(dap_chain_global_db_gr_del(l_datum_hash_str2, l_gdb_group_mempool)) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_str);
+                DAP_DELETE( l_datum_hash_str2);
                 return 0;
             } else {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str);
+                DAP_DELETE( l_datum_hash_str2);
                 return -4;
             }
         } else {
@@ -2192,7 +2202,7 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
 
     const char * l_certs_str = NULL;
 
-    dap_chain_cert_t ** l_certs = NULL;
+    dap_cert_t ** l_certs = NULL;
     size_t l_certs_size = 0;
 
     dap_chain_t * l_chain = NULL;
@@ -2274,7 +2284,7 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
     }
 
     // Load certs lists
-    dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
+    dap_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
     if(!l_certs_size) {
         dap_chain_node_cli_set_reply_text(a_str_reply,
                 "token_create command requres at least one valid certificate to sign the basic transaction of emission");
@@ -2297,11 +2307,11 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
     // Sign header with all certificates in the list and add signs to the end of ticker declaration
     // Important:
     for(size_t i = 0; i < l_certs_size; i++) {
-        dap_chain_sign_t * l_sign = dap_chain_cert_sign(l_certs[i],
+        dap_sign_t * l_sign = dap_cert_sign(l_certs[i],
                 l_datum_token,
                 sizeof(l_datum_token->header),
                 0);
-        size_t l_sign_size = dap_chain_sign_get_size(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->header) + l_signs_offset + l_sign_size);
         memcpy(l_datum_token->signs + l_signs_offset, l_sign, l_sign_size);
         l_signs_offset += l_sign_size;
@@ -2313,7 +2323,7 @@ int com_token_decl(int argc, char ** argv, char ** a_str_reply)
 
     // Calc datum's hash
     dap_chain_hash_fast_t l_key_hash;
-    dap_hash_fast(l_datum, l_datum_size, (uint8_t*) &l_key_hash);
+    dap_hash_fast(l_datum, l_datum_size, &l_key_hash);
     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
 
     // Add datum to mempool with datum_token hash as a key
@@ -2363,7 +2373,7 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
 
     const char * l_certs_str = NULL;
 
-    dap_chain_cert_t ** l_certs = NULL;
+    dap_cert_t ** l_certs = NULL;
     size_t l_certs_size = 0;
 
     const char * l_chain_emission_str = NULL;
@@ -2410,7 +2420,7 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     }
 
     // Load certs
-    dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
+    dap_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
 
     if(!l_certs_size) {
         dap_chain_node_cli_set_reply_text(str_reply,
@@ -2506,9 +2516,9 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     // Then add signs
     size_t l_offset = 0;
     for(size_t i = 0; i < l_certs_size; i++) {
-        dap_chain_sign_t * l_sign = dap_chain_cert_sign(l_certs[i], &l_token_emission->hdr,
+        dap_sign_t * l_sign = dap_cert_sign(l_certs[i], &l_token_emission->hdr,
                 sizeof(l_token_emission->hdr), 0);
-        size_t l_sign_size = dap_chain_sign_get_size(l_sign);
+        size_t l_sign_size = dap_sign_get_size(l_sign);
         l_token_emission_size += l_sign_size;
         l_token_emission = DAP_REALLOC(l_token_emission, l_token_emission_size);
         memcpy(l_token_emission->data.type_auth.signs + l_offset, l_sign, l_sign_size);
@@ -2524,7 +2534,7 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
 
     // Calc token's hash
     dap_chain_hash_fast_t l_token_emission_hash;
-    dap_hash_fast(l_token_emission, l_token_emission_size, (uint8_t*) &l_token_emission_hash);
+    dap_hash_fast(l_token_emission, l_token_emission_size, &l_token_emission_hash);
     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_token_emission_hash);
 
     // Delete token emission
@@ -2585,12 +2595,12 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     //dap_hash_fast(l_tx, l_tx_size, &l_key_hash); //dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_key_hash);
     // calc datum hash
     dap_chain_hash_fast_t l_datum_tx_hash;
-    dap_hash_fast(l_datum_tx, l_datum_tx_size, (uint8_t*) &l_datum_tx_hash);
+    dap_hash_fast(l_datum_tx, l_datum_tx_size,  &l_datum_tx_hash);
     l_key_str = dap_chain_hash_fast_to_str_new(&l_datum_tx_hash);
     DAP_DELETE(l_tx);
 
     // Add to mempool tx token
-    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum_tx, l_datum_tx_size
+    if(dap_chain_global_db_gr_set(l_key_str, l_datum_tx, l_datum_tx_size
             , l_gdb_group_mempool_base_tx)) {
         dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp,
                 l_key_str);
@@ -2616,19 +2626,12 @@ int com_tx_cond_create(int argc, char ** argv, char **str_reply)
 {
     (void) argc;
     // test
+    /*
     const char * l_token_ticker = NULL;
     const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
     const char *c_wallet_name_from = "w_tesla"; // where to take coins for service
     const char *c_wallet_name_cond = "w_picnic"; // who will be use service, usually the same address (addr_from)
-//    const char *c_net_name = "kelvin-testnet";
     uint64_t l_value = 50;
-    //debug
-    {
-//        dap_chain_wallet_t * l_wallet_tesla = dap_chain_wallet_open("w_picnic", c_wallets_path);
-//        const dap_chain_addr_t *l_addr_tesla = dap_chain_wallet_get_addr(l_wallet_tesla);
-        //      char *addr = dap_chain_addr_to_str(l_addr_tesla);
-//        addr = 0;
-    }
 
     dap_chain_wallet_t *l_wallet_from = dap_chain_wallet_open(c_wallet_name_from, c_wallets_path);
     dap_enc_key_t *l_key = dap_chain_wallet_get_key(l_wallet_from, 0);
@@ -2653,6 +2656,8 @@ int com_tx_cond_create(int argc, char ** argv, char **str_reply)
     dap_chain_node_cli_set_reply_text(str_reply, "cond create=%s\n",
             (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for service fee" : "False");
     return res;
+    */
+    return  -1;
 }
 
 /**
@@ -2745,7 +2750,7 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
         dap_chain_node_cli_set_reply_text(str_reply, "wallet %s does not exist", l_from_wallet_name);
         return -1;
     }
-    const dap_chain_addr_t *addr_from = (const dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
+    const dap_chain_addr_t *addr_from = (const dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
     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);
 
@@ -2875,7 +2880,7 @@ int com_tx_history(int argc, char ** argv, char **str_reply)
             const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
             dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path);
             if(l_wallet) {
-                dap_chain_addr_t *l_addr_tmp = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet);
+                dap_chain_addr_t *l_addr_tmp = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
                 l_addr = DAP_NEW_SIZE(dap_chain_addr_t, sizeof(dap_chain_addr_t));
                 memcpy(l_addr, l_addr_tmp, sizeof(dap_chain_addr_t));
                 dap_chain_wallet_close(l_wallet);