diff --git a/dap_chain_cert.c b/dap_chain_cert.c
index f87982634de623145966a1d2ff19c08e3b2e80d4..b785f94af9ee4659f4aded5bfef3e2fbb84be2d1 100755
--- a/dap_chain_cert.c
+++ b/dap_chain_cert.c
@@ -21,9 +21,12 @@
     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/>.
 */
+#include <sys/types.h>
+#include <dirent.h>
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
+
 #include "uthash.h"
 #include "utlist.h"
 #include "dap_common.h"
@@ -55,7 +58,8 @@ typedef struct dap_chain_cert_pvt
 
 #define PVT(a) ( ( dap_chain_cert_pvt_t *)(a->_pvt) )
 
-dap_chain_cert_item_t * s_certs = NULL;
+static dap_chain_cert_item_t * s_certs = NULL;
+
 dap_chain_cert_t * dap_chain_cert_new(const char * a_name);
 void dap_chain_cert_delete(dap_chain_cert_t * a_cert);
 /**
@@ -179,7 +183,7 @@ dap_chain_cert_t * dap_chain_cert_generate(const char * a_cert_name
 {
     dap_chain_cert_t * l_cert = dap_chain_cert_generate_mem(a_cert_name,a_key_type);
     if ( l_cert){
-        if ( dap_chain_cert_save_file(l_cert, a_file_path) == 0 ){
+        if ( dap_chain_cert_file_save(l_cert, a_file_path) == 0 ){
             return l_cert;
         } else{
             dap_chain_cert_delete(l_cert);
@@ -285,6 +289,23 @@ dap_chain_cert_t * dap_chain_cert_add_file(const char * a_cert_name,const char *
     return l_cert;
 }
 
+/**
+ * @brief dap_chain_cert_save_to_folder
+ * @param a_cert
+ * @param a_file_dir_path
+ */
+int dap_chain_cert_save_to_folder(dap_chain_cert_t * a_cert, const char *a_file_dir_path)
+{
+    int ret = 0;
+    const char * l_cert_name = a_cert->name;
+    size_t l_cert_path_length = strlen(l_cert_name)+8+strlen(a_file_dir_path);
+    char * l_cert_path = DAP_NEW_Z_SIZE(char,l_cert_path_length);
+    snprintf(l_cert_path,l_cert_path_length,"%s/%s.dcert",a_file_dir_path,l_cert_name);
+    ret = dap_chain_cert_file_save(a_cert,l_cert_path);
+    DAP_DELETE( l_cert_path);
+    return ret;
+}
+
 /**
  * @brief dap_chain_cert_to_pkey
  * @param a_cert
@@ -339,21 +360,27 @@ void dap_chain_cert_dump(dap_chain_cert_t * a_cert)
 {
     printf ("Certificate name: %s\n",a_cert->name);
     printf ("Signature type: %s\n", dap_chain_sign_type_to_str( dap_chain_sign_type_from_key_type(a_cert->enc_key->type) ) );
-    printf ("Private key size: %u\n",a_cert->enc_key->priv_key_data_size);
-    printf ("Public key size: %u\n", a_cert->enc_key->pub_key_data_size);
-    printf ("Metadata section size: %u\n",a_cert->metadata?strlen(a_cert->metadata):0);
-    printf ("Certificates signatures chain size: %u\n",dap_chain_cert_count_cert_sign (a_cert));
+    printf ("Private key size: %lu\n",a_cert->enc_key->priv_key_data_size);
+    printf ("Public key size: %lu\n", a_cert->enc_key->pub_key_data_size);
+    printf ("Metadata section size: %lu\n",a_cert->metadata?strlen(a_cert->metadata):0);
+    printf ("Certificates signatures chain size: %lu\n",dap_chain_cert_count_cert_sign (a_cert));
 }
 
 
 /**
  * @brief dap_chain_cert_add_folder
- * @param a_cert_name_prefix
  * @param a_folder_path
  */
-void dap_chain_cert_add_folder(const char * a_cert_name_prefix,const char *a_folder_path)
+void dap_chain_cert_add_folder(const char *a_folder_path)
 {
-
+    DIR * l_dir = opendir(a_folder_path);
+    if( l_dir ) {
+        struct dirent * l_dir_entry;
+        while((l_dir_entry=readdir(l_dir))!=NULL){
+            log_it(L_DEBUG,"%s",l_dir_entry->d_name);
+        }
+        closedir(l_dir);
+    }
 }
 
 /**
diff --git a/dap_chain_cert.h b/dap_chain_cert.h
index 385edd983ae534c08de1d5bac7f6592394b38493..3a49f5ede91dc130fc70733f18084dae24a3b0ad 100755
--- a/dap_chain_cert.h
+++ b/dap_chain_cert.h
@@ -44,6 +44,7 @@ int dap_chain_cert_init();
 
 dap_chain_cert_t * dap_chain_cert_new(const char * a_name);
 
+
 dap_chain_cert_t * dap_chain_cert_generate(const char * a_cert_name,const char * a_file_path,dap_enc_key_type_t a_key_type );
 
 dap_chain_cert_t * dap_chain_cert_generate_mem(const char * a_cert_name,
@@ -52,7 +53,8 @@ dap_chain_cert_t * dap_chain_cert_generate_mem(const char * a_cert_name,
 dap_chain_addr_t * dap_chain_cert_to_addr(dap_chain_cert_t * a_cert, dap_chain_net_id_t a_net_id);
 
 dap_chain_cert_t * dap_chain_cert_add_file(const char * a_cert_name,const char *a_file_path);
-void dap_chain_cert_add_folder(const char* a_cert_name_prefix,const char *a_folder_path);
+int dap_chain_cert_save_to_folder(dap_chain_cert_t * a_cert, const char *a_file_dir_path);
+void dap_chain_cert_add_folder(const char *a_folder_path);
 void dap_chain_cert_dump(dap_chain_cert_t * a_cert);
 dap_chain_pkey_t * dap_chain_cert_to_pkey(dap_chain_cert_t * a_cert);
 
diff --git a/dap_chain_cert_file.c b/dap_chain_cert_file.c
index 348b43b0bc663f0f4e296d326470010571664c37..c7e8c2e476200bbdda624672173902343564b624 100755
--- a/dap_chain_cert_file.c
+++ b/dap_chain_cert_file.c
@@ -38,12 +38,12 @@
  * @param a_cert_file_path
  * @return
  */
-int dap_chain_cert_save_file(dap_chain_cert_t * a_cert, const char * a_cert_file_path)
+int dap_chain_cert_file_save(dap_chain_cert_t * a_cert, const char * a_cert_file_path)
 {
     FILE * l_file = fopen(a_cert_file_path,"w");
     if( l_file ){
         uint32_t l_data_size = 0;
-        void * l_data = dap_chain_cert_save_mem(a_cert, &l_data_size);
+        void * l_data = dap_chain_cert_mem_save(a_cert, &l_data_size);
         if ( l_data ){
             size_t l_retbytes;
             if ( (l_retbytes = fwrite(l_data,1,l_data_size,l_file)) != l_data_size ){
@@ -70,16 +70,21 @@ int dap_chain_cert_save_file(dap_chain_cert_t * a_cert, const char * a_cert_file
  * @param a_cert_size_out
  * @return
  */
-uint8_t* dap_chain_cert_save_mem(dap_chain_cert_t * a_cert, uint32_t *a_cert_size_out)
+uint8_t* dap_chain_cert_mem_save(dap_chain_cert_t * a_cert, uint32_t *a_cert_size_out)
 {
     dap_chain_cert_file_hdr_t l_hdr={0};
     uint32_t l_data_offset = 0;
     dap_enc_key_t * l_key = a_cert->enc_key;
     uint8_t *l_data = NULL;
 
-    size_t l_priv_key_data_size, l_pub_key_data_size;
-    uint8_t *l_pub_key_data = dap_enc_key_serealize_pub_key(l_key, &l_pub_key_data_size);
-    uint8_t *l_priv_key_data = dap_enc_key_serealize_priv_key(l_key, &l_priv_key_data_size);
+    size_t l_priv_key_data_size = a_cert->enc_key->priv_key_data,
+            l_pub_key_data_size = a_cert->enc_key->pub_key_data_size;
+    uint8_t *l_pub_key_data = a_cert->enc_key->pub_key_data_size ?
+                dap_enc_key_serealize_pub_key(l_key, &l_pub_key_data_size) :
+                NULL;
+    uint8_t *l_priv_key_data = a_cert->enc_key->priv_key_data ?
+                dap_enc_key_serealize_priv_key(l_key, &l_priv_key_data_size) :
+                NULL;
 
     l_hdr.sign = DAP_CHAIN_CERT_FILE_HDR_SIGN;
     l_hdr.type = DAP_CHAIN_CERT_FILE_TYPE_PUBLIC;
@@ -115,13 +120,15 @@ uint8_t* dap_chain_cert_save_mem(dap_chain_cert_t * a_cert, uint32_t *a_cert_siz
     memcpy(l_data +l_data_offset, l_pub_key_data ,l_pub_key_data_size );
     l_data_offset += l_pub_key_data_size;
 
-    memcpy(l_data +l_data_offset, l_priv_key_data ,l_priv_key_data_size );
-    l_data_offset += l_priv_key_data_size;
-
-    memcpy(l_data +l_data_offset, l_key->_inheritor ,l_key->_inheritor_size );
-    l_data_offset += l_key->_inheritor_size;
-
+    if ( l_priv_key_data_size ) {
+        memcpy(l_data +l_data_offset, l_priv_key_data ,l_priv_key_data_size );
+        l_data_offset += l_priv_key_data_size;
+    }
 
+    if ( l_key->_inheritor_size ) {
+        memcpy(l_data +l_data_offset, l_key->_inheritor ,l_key->_inheritor_size );
+        l_data_offset += l_key->_inheritor_size;
+    }
 lb_exit:
     DAP_DELETE(l_pub_key_data);
     DAP_DELETE(l_priv_key_data);
diff --git a/dap_chain_cert_file.h b/dap_chain_cert_file.h
index 30f2ec9e73265708be451f0137d673fea0381ca8..a15f71b3d67fe11dd08a78c7b2bd1ac98b5f34bd 100755
--- a/dap_chain_cert_file.h
+++ b/dap_chain_cert_file.h
@@ -53,8 +53,8 @@ typedef struct dap_chain_cert_file{
     uint8_t data[];
 }DAP_ALIGN_PACKED dap_chain_cert_file_t;
 
-int dap_chain_cert_save_file(dap_chain_cert_t * a_cert, const char * a_cert_file_path);
-uint8_t* dap_chain_cert_save_mem(dap_chain_cert_t * a_cert, uint32_t *a_cert_size_out);
+int dap_chain_cert_file_save(dap_chain_cert_t * a_cert, const char * a_cert_file_path);
+uint8_t* dap_chain_cert_mem_save(dap_chain_cert_t * a_cert, uint32_t *a_cert_size_out);
 
 dap_chain_cert_t* dap_chain_cert_file_load(const char * a_cert_file_path);
 dap_chain_cert_t* dap_chain_cert_mem_load(void * a_data, size_t a_data_size);
diff --git a/dap_chain_sign.c b/dap_chain_sign.c
index 856266ea99a6f63841ed857a66ad1257b2a2f415..d784e1fcb6c195c05b270aebc99e57b6b6f92a89 100755
--- a/dap_chain_sign.c
+++ b/dap_chain_sign.c
@@ -194,7 +194,7 @@ dap_chain_sign_t * dap_chain_sign_create(dap_enc_key_t *a_key, const void * a_da
  * @param a_sign_out
  * @return
  */
-const uint8_t* dap_chain_sign_get_sign(const dap_chain_sign_t *a_sign, size_t *a_sign_out)
+uint8_t* dap_chain_sign_get_sign(dap_chain_sign_t *a_sign, size_t *a_sign_out)
 {
     if(!a_sign)
         return NULL;
@@ -209,7 +209,7 @@ const uint8_t* dap_chain_sign_get_sign(const dap_chain_sign_t *a_sign, size_t *a
  * @param a_pub_key_out
  * @return
  */
-const uint8_t* dap_chain_sign_get_pkey(const dap_chain_sign_t *a_sign, size_t *a_pub_key_out)
+uint8_t* dap_chain_sign_get_pkey(dap_chain_sign_t *a_sign, size_t *a_pub_key_out)
 {
     if(!a_sign)
         return NULL;
@@ -227,7 +227,7 @@ dap_enc_key_t *dap_chain_sign_to_enc_key(dap_chain_sign_t * a_chain_sign)
 {
     dap_enc_key_t * l_ret =  dap_enc_key_new( dap_chain_sign_type_to_key_type( a_chain_sign->header.type  ) );
     size_t l_pkey_size = 0;
-    uint8_t *l_pkey = dap_chain_sign_get_pkey(a_chain_sign, &l_pkey_size);
+    const uint8_t *l_pkey = dap_chain_sign_get_pkey(a_chain_sign, &l_pkey_size);
     // deserialize public key
     dap_enc_key_deserealize_pub_key(l_ret, l_pkey, l_pkey_size);
     return l_ret;
diff --git a/dap_chain_sign.h b/dap_chain_sign.h
index 0cd308b308086973fa362700937a9095774938ca..a5def39e94267468f052a61acd2e20c4a2cae62d 100755
--- a/dap_chain_sign.h
+++ b/dap_chain_sign.h
@@ -61,8 +61,8 @@ size_t dap_chain_sign_create_output_cals_size(dap_enc_key_t * a_key,size_t a_out
 dap_chain_sign_type_t dap_chain_sign_type_from_key_type( dap_enc_key_type_t a_key_type);
 dap_enc_key_type_t  dap_chain_sign_type_to_key_type(dap_chain_sign_type_t  a_chain_sign_type);
 
-const uint8_t* dap_chain_sign_get_sign(const dap_chain_sign_t *a_sign, size_t *a_sign_out);
-const uint8_t* dap_chain_sign_get_pkey(const dap_chain_sign_t *a_sign, size_t *a_pub_key_out);
+uint8_t* dap_chain_sign_get_sign(dap_chain_sign_t *a_sign, size_t *a_sign_out);
+uint8_t* dap_chain_sign_get_pkey(dap_chain_sign_t *a_sign, size_t *a_pub_key_out);
 
 dap_enc_key_t *dap_chain_sign_to_enc_key(dap_chain_sign_t * a_chain_sign);
 const char * dap_chain_sign_type_to_str(dap_chain_sign_type_t a_chain_sign_type);
diff --git a/monero_crypto/common/int-util.h b/monero_crypto/common/int-util.h
index 7cec571ad8364146acef48ac744d111ca7165deb..780cb06eb41e415673e7a714669da275a3afee75 100755
--- a/monero_crypto/common/int-util.h
+++ b/monero_crypto/common/int-util.h
@@ -166,6 +166,7 @@ static inline uint64_t swap64(uint64_t x) {
 #endif /* __OpenBSD__ */
 
 #if defined(__GNUC__)
+#undef UNUSED
 #define UNUSED __attribute__((unused))
 #else
 #define UNUSED