diff --git a/CMakeLists.txt b/CMakeLists.txt
index 761ed7e08d4f63d03154a7332e560aa94cc64ebb..b0f8e7f872df84a9dd89e9b7a71acac08c66ca13 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,6 @@ if(WIN32)
   include_directories(../3rdparty/wepoll/include/)
   include_directories(../3rdparty/uthash/src/)
   include_directories(../3rdparty/libjson-c/)
-  include_directories(../3rdparty/libmagic/src/)
   include_directories(../3rdparty/curl/include/)
   include_directories(../3rdparty/libsqlite3/)
 endif()
diff --git a/dap_chain_wallet.c b/dap_chain_wallet.c
index 0c5fca88e11cfe90e2a7da9b39fe992b5324759e..7b45bd1b08bf715f58126e73f3e6207b1e8fccc4 100755
--- a/dap_chain_wallet.c
+++ b/dap_chain_wallet.c
@@ -53,7 +53,7 @@
 #include "dap_common.h"
 #include "dap_strfuncs.h"
 #include "dap_string.h"
-#include "dap_chain_cert_file.h"
+#include "dap_cert_file.h"
 #include "dap_chain_wallet.h"
 #include "dap_chain_wallet_internal.h"
 
@@ -63,7 +63,7 @@
  * @brief dap_chain_wallet_init
  * @return
  */
-int dap_chain_wallet_init()
+int dap_chain_wallet_init(void)
 {
     // load certificates from existing wallets
     const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
@@ -98,7 +98,7 @@ int dap_chain_wallet_init()
 /**
  * @brief dap_chain_wallet_deinit
  */
-void dap_chain_wallet_deinit()
+void dap_chain_wallet_deinit(void)
 {
 
 }
@@ -131,23 +131,22 @@ RET:
  * @details Creates new wallet
  * @return Wallet, new wallet or NULL if errors
  */
-dap_chain_wallet_t * dap_chain_wallet_create(const char * a_wallet_name, const char * a_wallets_path, dap_chain_net_id_t a_net_id,
-                                             dap_chain_sign_type_t a_sig_type)
+dap_chain_wallet_t * dap_chain_wallet_create(const char * a_wallet_name, const char * a_wallets_path, dap_sign_type_t a_sig_type)
 {
     dap_chain_wallet_t * l_wallet = DAP_NEW_Z(dap_chain_wallet_t);
     DAP_CHAIN_WALLET_INTERNAL_LOCAL_NEW(l_wallet);
     l_wallet->name = strdup(a_wallet_name);
     l_wallet_internal->certs_count = 1;
-    l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_chain_cert_t *,l_wallet_internal->certs_count);
+    l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_cert_t *,l_wallet_internal->certs_count);
 
     size_t l_file_name_size = strlen(a_wallet_name)+strlen(a_wallets_path)+13;
     l_wallet_internal->file_name = DAP_NEW_Z_SIZE (char, l_file_name_size);
 
     dap_snprintf(l_wallet_internal->file_name,l_file_name_size,"%s/%s.dwallet",a_wallets_path,a_wallet_name);
 
-    l_wallet_internal->certs[0] = dap_chain_cert_generate_mem(a_wallet_name,
-                                                         dap_chain_sign_type_to_key_type(a_sig_type));
-    l_wallet_internal->addr = dap_chain_cert_to_addr (l_wallet_internal->certs[0],a_net_id);
+    l_wallet_internal->certs[0] = dap_cert_generate_mem(a_wallet_name,
+                                                         dap_sign_type_to_key_type(a_sig_type));
+
 
     if ( dap_chain_wallet_save(l_wallet) == 0 )
         return l_wallet;
@@ -177,14 +176,28 @@ void dap_chain_wallet_close( dap_chain_wallet_t * a_wallet)
 /**
  * @brief dap_chain_wallet_get_addr
  * @param a_wallet
+ * @param a_net_id
  * @return
  */
-dap_chain_addr_t* dap_chain_wallet_get_addr(dap_chain_wallet_t * a_wallet)
+dap_chain_addr_t* dap_chain_wallet_get_addr(dap_chain_wallet_t * a_wallet, dap_chain_net_id_t a_net_id)
 {
     if(!a_wallet)
         return NULL;
     DAP_CHAIN_WALLET_INTERNAL_LOCAL(a_wallet);
-    return l_wallet_internal->addr;
+    return a_net_id.uint64? dap_cert_to_addr (l_wallet_internal->certs[0], a_net_id) : NULL;
+}
+
+/**
+ * @brief dap_cert_to_addr
+ * @param a_cert
+ * @param a_net_id
+ * @return
+ */
+dap_chain_addr_t * dap_cert_to_addr(dap_cert_t * a_cert, dap_chain_net_id_t a_net_id)
+{
+    dap_chain_addr_t * l_addr = DAP_NEW_Z(dap_chain_addr_t);
+    dap_chain_addr_fill(l_addr, a_cert->enc_key, &a_net_id);
+    return l_addr;
 }
 
 /**
@@ -193,11 +206,11 @@ dap_chain_addr_t* dap_chain_wallet_get_addr(dap_chain_wallet_t * a_wallet)
  * @param a_pkey_idx
  * @return serialized object if success, NULL if not
  */
-dap_chain_pkey_t* dap_chain_wallet_get_pkey( dap_chain_wallet_t * a_wallet,uint32_t a_pkey_idx )
+dap_pkey_t* dap_chain_wallet_get_pkey( dap_chain_wallet_t * a_wallet,uint32_t a_pkey_idx )
 {
     DAP_CHAIN_WALLET_INTERNAL_LOCAL(a_wallet);
     if( l_wallet_internal->certs_count > a_pkey_idx ){
-        return dap_chain_cert_to_pkey(l_wallet_internal->certs[a_pkey_idx]);
+        return dap_cert_to_pkey(l_wallet_internal->certs[a_pkey_idx]);
     }else{
         log_it( L_WARNING, "No pkey with index %u in the wallet (total size %u)",a_pkey_idx,l_wallet_internal->certs_count);
         return 0;
@@ -252,7 +265,6 @@ int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet)
             l_file_hdr.signature = DAP_CHAIN_WALLETS_FILE_SIGNATURE;
             l_file_hdr.type = 0;
             l_file_hdr.version = 1;
-            l_file_hdr.net_id = l_wallet_internal->addr->net_id;
             size_t i;
             // write header
             fwrite(&l_file_hdr,1,sizeof(l_file_hdr),l_file);
@@ -264,8 +276,8 @@ int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet)
             for ( i = 0; i < l_wallet_internal->certs_count ; i ++) {
                 dap_chain_wallet_cert_hdr_t l_wallet_cert_hdr = {0};
                 l_wallet_cert_hdr.version = 1;
-                uint8_t * l_buf = dap_chain_cert_mem_save(l_wallet_internal->certs[i], &l_wallet_cert_hdr.cert_raw_size);
-                //l_wallet_cert_hdr.cert_raw_size = dap_chain_cert_save_mem_size(  l_wallet_internal->certs[i] );
+                uint8_t * l_buf = dap_cert_mem_save(l_wallet_internal->certs[i], &l_wallet_cert_hdr.cert_raw_size);
+                //l_wallet_cert_hdr.cert_raw_size = dap_cert_save_mem_size(  l_wallet_internal->certs[i] );
                 //uint8_t * l_buf = DAP_NEW_SIZE (uint8_t, l_wallet_cert_hdr.cert_raw_size);
                 fwrite( &l_wallet_cert_hdr,1, sizeof (l_wallet_cert_hdr), l_file);
                 if ( l_buf ){
@@ -339,19 +351,16 @@ dap_chain_wallet_t * dap_chain_wallet_open_file(const char * a_file_name)
                 }
                 // read certs
                 fseek(l_file,sizeof (l_file_hdr) + sizeof(uint16_t) + name_len,SEEK_SET);
-                l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_chain_cert_t *,l_wallet_internal->certs_count * sizeof(dap_chain_cert_t *));
+                l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_cert_t *,l_wallet_internal->certs_count * sizeof(dap_cert_t *));
                 for (i = 0; i < l_wallet_internal->certs_count; i++ ){
                     dap_chain_wallet_cert_hdr_t l_cert_hdr={0};
                     fread(&l_cert_hdr,1,sizeof(l_cert_hdr),l_file);
                     uint8_t * l_data = DAP_NEW_SIZE(uint8_t,l_cert_hdr.cert_raw_size);
                     fread(l_data,1,l_cert_hdr.cert_raw_size,l_file);
-                    l_wallet_internal->certs[i] = dap_chain_cert_mem_load(l_data,l_cert_hdr.cert_raw_size);
+                    l_wallet_internal->certs[i] = dap_cert_mem_load(l_data,l_cert_hdr.cert_raw_size);
                     DAP_DELETE (l_data);
                 }
                 fclose(l_file);
-                // make addr
-                if(l_wallet_internal->certs_count>0)
-                    l_wallet_internal->addr = dap_chain_cert_to_addr (l_wallet_internal->certs[0], l_file_hdr.net_id);
                 return l_wallet;
             } else {
                 log_it(L_ERROR,"Wrong wallet file signature: corrupted file or wrong format");
diff --git a/dap_chain_wallet.h b/dap_chain_wallet.h
index 19ebad978a549608bf72e1f3702ed1065ce43f4b..2dbb780c655876616b203504ea174be126fb06a2 100755
--- a/dap_chain_wallet.h
+++ b/dap_chain_wallet.h
@@ -25,8 +25,9 @@
 #pragma once
 #include "dap_chain_common.h"
 #include "dap_enc_key.h"
-#include "dap_chain_pkey.h"
-#include "dap_chain_sign.h"
+#include "dap_pkey.h"
+#include "dap_sign.h"
+#include "dap_cert.h"
 #include "dap_chain_net.h"
 
 typedef struct dap_chain_wallet{
@@ -36,22 +37,23 @@ typedef struct dap_chain_wallet{
 } dap_chain_wallet_t;
 
 
-int dap_chain_wallet_init();
-void dap_chain_wallet_deinit();
+int dap_chain_wallet_init(void);
+void dap_chain_wallet_deinit(void);
 
 const char* dap_chain_wallet_get_path(dap_config_t * a_config);
 
-dap_chain_wallet_t * dap_chain_wallet_create(const char * a_wallet_name, const char * a_wallets_path, dap_chain_net_id_t a_net_id,
-                                             dap_chain_sign_type_t a_sig_type); // Creates new one if not found
+dap_chain_wallet_t * dap_chain_wallet_create(const char * a_wallet_name, const char * a_wallets_path, dap_sign_type_t a_sig_type); // Creates new one if not found
 dap_chain_wallet_t * dap_chain_wallet_open_file(const char * a_file_name);
 dap_chain_wallet_t * dap_chain_wallet_open(const char * a_wallet_name, const char * a_wallets_path);
 int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet);
 
 void dap_chain_wallet_close( dap_chain_wallet_t * a_wallet);
 
-dap_chain_addr_t* dap_chain_wallet_get_addr(dap_chain_wallet_t * a_wallet);
+dap_chain_addr_t * dap_cert_to_addr(dap_cert_t * a_cert, dap_chain_net_id_t a_net_id);
+
+dap_chain_addr_t* dap_chain_wallet_get_addr(dap_chain_wallet_t * a_wallet, dap_chain_net_id_t a_net_id);
 size_t dap_chain_wallet_get_certs_number( dap_chain_wallet_t * a_wallet);
-dap_chain_pkey_t * dap_chain_wallet_get_pkey( dap_chain_wallet_t * a_wallet,uint32_t a_key_idx);
+dap_pkey_t * dap_chain_wallet_get_pkey( dap_chain_wallet_t * a_wallet,uint32_t a_key_idx);
 dap_enc_key_t * dap_chain_wallet_get_key( dap_chain_wallet_t * a_wallet,uint32_t a_key_idx);
 
 int dap_chain_wallet_save_file( dap_chain_wallet_t * a_wallet);
diff --git a/dap_chain_wallet_internal.h b/dap_chain_wallet_internal.h
index deb4aeb2e40884688de8c3f3b5132a721cd011d2..dfaaaf7a5bfcfc599d24b413bad980980da3100b 100755
--- a/dap_chain_wallet_internal.h
+++ b/dap_chain_wallet_internal.h
@@ -24,8 +24,8 @@
 
 #pragma once
 
-#include "dap_chain_cert.h"
-#include "dap_chain_cert_file.h"
+#include "dap_cert.h"
+#include "dap_cert_file.h"
 #include "dap_chain_common.h"
 
 #include "dap_chain_wallet.h"
@@ -39,14 +39,14 @@ typedef struct dap_chain_wallet_cert_hdr{
 
 typedef struct dap_chain_wallet_cert{
     dap_chain_wallet_cert_hdr_t header;
-    dap_chain_cert_file_t cert_raw; /// Raw certs data
+    dap_cert_file_t cert_raw; /// Raw certs data
 } DAP_ALIGN_PACKED dap_chain_wallet_cert_t;
 
 typedef struct dap_chain_wallet_file_hdr{
     uint64_t signature;
     uint32_t version;
     uint8_t type; /// Wallets storage type 0x00 - uncompressed and unencrypted
-    dap_chain_net_id_t net_id; // Network where the wallet certificate is used
+    uint64_t padding;
     uint8_t certs[];
 } DAP_ALIGN_PACKED dap_chain_wallet_file_hdr_t;
 
@@ -61,7 +61,7 @@ typedef struct dap_chain_wallet_internal
     dap_chain_addr_t *addr;
     char * file_name;
     size_t certs_count;
-    dap_chain_cert_t ** certs;
+    dap_cert_t ** certs;
 } dap_chain_wallet_internal_t;
 
 #define DAP_CHAIN_WALLET_INTERNAL(a) ((dap_chain_wallet_internal_t *) a->_internal  )