diff --git a/dap_chain_wallet.c b/dap_chain_wallet.c
index 10f38e8c9217ce9d15f8b9f110b60dfadac178ed..fb997282608ab7b37283ab3542df1aa8a3cc4247 100644
--- a/dap_chain_wallet.c
+++ b/dap_chain_wallet.c
@@ -24,6 +24,8 @@
 
 #include <string.h>
 #include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
 #include "dap_common.h"
 #include "dap_chain_cert_file.h"
 #include "dap_chain_wallet.h"
@@ -93,7 +95,7 @@ void dap_chain_wallet_close( dap_chain_wallet_t * a_wallet)
     DAP_CHAIN_WALLET_INTERNAL_LOCAL(a_wallet);
     if(a_wallet->name)
         DAP_DELETE (a_wallet->name);
-
+    // TODO Make clean struct dap_chain_wallet_internal_t
     DAP_DELETE(l_wallet_internal);
     DAP_DELETE(a_wallet);
 }
@@ -157,7 +159,7 @@ int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet)
 {
     if ( a_wallet ){
         DAP_CHAIN_WALLET_INTERNAL_LOCAL (a_wallet);
-        FILE * l_file = fopen( l_wallet_internal->file_name ,"w");
+        FILE * l_file = fopen( l_wallet_internal->file_name ,"wb");
         if ( l_file ){
             dap_chain_wallet_file_hdr_t l_file_hdr = {0};
             l_file_hdr.signature = DAP_CHAIN_WALLETS_FILE_SIGNATURE;
@@ -165,7 +167,13 @@ int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet)
             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);
+            // write name
+            uint16_t name_len = (a_wallet->name) ? (uint16_t)strlen(a_wallet->name) : 0;
+            fwrite(&name_len,1,sizeof(uint16_t),l_file);
+            fwrite(a_wallet->name,1,name_len,l_file);
+            // write certs
             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;
@@ -199,22 +207,27 @@ int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet)
  */
 dap_chain_wallet_t * dap_chain_wallet_open_file(const char * a_file_name)
 {
-    FILE * l_file = fopen( a_file_name ,"r");
+    FILE * l_file = fopen( a_file_name ,"rb");
     fseek(l_file, 0L, SEEK_END);
     uint64_t l_file_size = ftell(l_file);
     rewind(l_file);
 
     if ( l_file ){
         dap_chain_wallet_file_hdr_t l_file_hdr={0};
-
+        // read header
         if ( fread(&l_file_hdr,1,sizeof(l_file_hdr),l_file) == sizeof (l_file_hdr) ) {
             if ( l_file_hdr.signature == DAP_CHAIN_WALLETS_FILE_SIGNATURE ) {
                 dap_chain_wallet_t * l_wallet = DAP_NEW_Z(dap_chain_wallet_t);
                 DAP_CHAIN_WALLET_INTERNAL_LOCAL_NEW(l_wallet);
+                // read name
+                uint16_t name_len = 0;
+                fread(&name_len, 1, sizeof(uint16_t), l_file);
+                l_wallet->name = DAP_NEW_Z_SIZE(char, name_len + 1);
+                fread(l_wallet->name, 1, name_len, l_file);
 
                 l_wallet_internal->file_name = strdup(a_file_name);
-
-                size_t i = sizeof (l_file_hdr);
+                size_t i = sizeof (l_file_hdr) + sizeof(uint16_t) + name_len;
+                // calculate certs count
                 while (i <  l_file_size ){
                     dap_chain_wallet_cert_hdr_t l_cert_hdr={0};
                     fread(&l_cert_hdr,1,sizeof(l_cert_hdr),l_file);
@@ -232,7 +245,8 @@ dap_chain_wallet_t * dap_chain_wallet_open_file(const char * a_file_name)
                         break;
                     }
                 }
-                fseek(l_file,sizeof(l_file_hdr),SEEK_SET);
+                // 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);
                 for (i = 0; i < l_wallet_internal->certs_count; i++ ){
                     dap_chain_wallet_cert_hdr_t l_cert_hdr={0};
@@ -243,6 +257,9 @@ dap_chain_wallet_t * dap_chain_wallet_open_file(const char * a_file_name)
                     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");