diff --git a/.gitignore b/.gitignore
index 4bf974a8994c2ee687383ddb4194759098412bb5..b6eb71ba4601efdbc251fd08cb1d2cd7751e17d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,3 +50,6 @@ modules.order
 Module.symvers
 Mkfile.old
 dkms.conf
+/build/
+/.cproject
+/.project
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..592ddeed7c0a2840b78e36d903fd71aa27a873e9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "libdap"]
+	path = libdap
+	url = https://github.com/kelvinblockchain/libdap
+[submodule "test/libdap-test"]
+	path = test/libdap-test
+	url = https://github.com/kelvinblockchain/libdap-test/
+[submodule "libdap-chain"]
+	path = libdap-chain
+	url = https://github.com/kelvinblockchain/libdap-chain
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c3f4e90422f4902a3fe6085544711b69f779775e
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,21 @@
+language: c
+compiler: gcc
+dist: xenial
+notifications:
+  email: false
+
+before_install:
+    - git submodule init
+    - git submodule update --recursive
+
+script:
+    - mkdir build
+    - cd build 
+    - cmake ../
+    - make
+    - ctest --verbose
+
+addons:
+  apt:
+    sources:
+    - ubuntu-toolchain-r-test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bcc690816734967ed8e62af1b8f34b474ed29d85..50b6ce128e95e14f822e03d494280a3b240807ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,6 +24,13 @@ set(DAP_CHAIN_CRYPTO_HEADERS
 
     )
 
+if(NOT (${SUBMODULES_NO_BUILD} MATCHES ON))
+    add_subdirectory(libdap)
+    add_subdirectory(libdap-chain)
+    enable_testing()
+    add_subdirectory(test)
+endif()
+
 add_subdirectory(monero_crypto)
 
 include_directories("${monero_crypto_INCLUDE_DIRS}")
diff --git a/dap_chain_cert.c b/dap_chain_cert.c
index a0f881fc7485eed95e8fdd51527fe40f96c23b4d..f87982634de623145966a1d2ff19c08e3b2e80d4 100644
--- a/dap_chain_cert.c
+++ b/dap_chain_cert.c
@@ -248,8 +248,10 @@ void dap_chain_cert_delete(dap_chain_cert_t * a_cert)
 {
     dap_chain_cert_item_t * l_cert_item = NULL;
     HASH_FIND_STR(s_certs, a_cert->name, l_cert_item);
-    if ( l_cert_item )
+    if ( l_cert_item ){
          HASH_DEL(s_certs,l_cert_item);
+         DAP_DELETE (l_cert_item);
+    }
 
     if( a_cert->enc_key )
         dap_enc_key_delete (a_cert->enc_key );
diff --git a/dap_chain_cert_file.c b/dap_chain_cert_file.c
index b6af8f33013a5236206aea1d2f3fa4dd59339a32..348b43b0bc663f0f4e296d326470010571664c37 100644
--- a/dap_chain_cert_file.c
+++ b/dap_chain_cert_file.c
@@ -103,11 +103,15 @@ uint8_t* dap_chain_cert_save_mem(dap_chain_cert_t * a_cert, uint32_t *a_cert_siz
     l_hdr.ts_last_used = l_key->last_used_timestamp;
     l_hdr.sign_type = dap_chain_sign_type_from_key_type ( l_key->type );
 
-    l_data = DAP_NEW_SIZE(void, sizeof(l_hdr) + l_priv_key_data_size + l_pub_key_data_size + l_hdr.metadata_size);
+
+    l_data = DAP_NEW_SIZE(void, sizeof(l_hdr) + DAP_CHAIN_CERT_ITEM_NAME_MAX + l_priv_key_data_size + l_pub_key_data_size + l_hdr.metadata_size);
 
     memcpy(l_data +l_data_offset, &l_hdr ,sizeof(l_hdr) );
     l_data_offset += sizeof(l_hdr);
 
+    memcpy(l_data +l_data_offset, a_cert->name, DAP_CHAIN_CERT_ITEM_NAME_MAX );//save cert name
+    l_data_offset += DAP_CHAIN_CERT_ITEM_NAME_MAX;
+
     memcpy(l_data +l_data_offset, l_pub_key_data ,l_pub_key_data_size );
     l_data_offset += l_pub_key_data_size;
 
@@ -153,7 +157,7 @@ dap_chain_cert_t* dap_chain_cert_file_load(const char * a_cert_file_path)
         }else{
             l_ret = dap_chain_cert_mem_load(l_data,l_file_size);
         }
-
+        DAP_DELETE(l_data);
     }
 lb_exit:
     if( l_file )
@@ -187,7 +191,12 @@ dap_chain_cert_t* dap_chain_cert_mem_load(void * a_data, size_t a_data_size)
             goto l_exit;
         }
 
-        l_ret = DAP_NEW_Z(dap_chain_cert_t);
+        char l_name[DAP_CHAIN_CERT_ITEM_NAME_MAX];
+        memcpy(l_name, l_data +l_data_offset, DAP_CHAIN_CERT_ITEM_NAME_MAX );//save cert name
+        l_data_offset += DAP_CHAIN_CERT_ITEM_NAME_MAX;
+
+        //l_ret = DAP_NEW_Z(dap_chain_cert_t);
+        l_ret = dap_chain_cert_new(l_name);
         l_ret->enc_key = dap_enc_key_new( dap_chain_sign_type_to_key_type( l_hdr.sign_type ));
         l_ret->enc_key->last_used_timestamp = l_hdr.ts_last_used;
 
diff --git a/libdap b/libdap
new file mode 160000
index 0000000000000000000000000000000000000000..581d28044d21461982965e904e30e9a8171ee732
--- /dev/null
+++ b/libdap
@@ -0,0 +1 @@
+Subproject commit 581d28044d21461982965e904e30e9a8171ee732
diff --git a/libdap-chain b/libdap-chain
new file mode 160000
index 0000000000000000000000000000000000000000..7e3e787bed969d4aa0554fa45ccba024a00f316b
--- /dev/null
+++ b/libdap-chain
@@ -0,0 +1 @@
+Subproject commit 7e3e787bed969d4aa0554fa45ccba024a00f316b
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..19060335f8dcd28078d1cd0f9309443fae642bd4
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,18 @@
+if(TARGET chain_crypto_test)
+    return() # The project has already been built.
+endif()
+project(chain_crypto_test)
+
+add_subdirectory(libdap-test)
+
+file(GLOB SOURCES *.c)
+file(GLOB HEADERS *.h)
+
+add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
+
+target_link_libraries(${PROJECT_NAME} dap_test dap_core dap_crypto dap_chain)
+
+add_test(
+    NAME chain_crypto_test
+    COMMAND chain_crypto_test
+)
diff --git a/test/dap_chain_cert_save_tests.c b/test/dap_chain_cert_save_tests.c
new file mode 100644
index 0000000000000000000000000000000000000000..9e1930faedfbbafa3f7d0de5ad4121ccc55fec88
--- /dev/null
+++ b/test/dap_chain_cert_save_tests.c
@@ -0,0 +1,64 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "dap_test.h"
+#include "dap_enc_key.h"
+#include "dap_chain_cert.h"
+#include "dap_chain_cert_file.h"
+
+#define CERT_FILE_PATH "cert_file_path.tmp"
+
+static void test_cert_memory_file(dap_enc_key_type_t a_key_type)
+{
+    uint32_t l_cert_buf_size = 0;
+    dap_chain_cert_t *l_cert = dap_chain_cert_generate_mem("name 1", a_key_type);
+    dap_assert_PIF(l_cert, "Fail create cert");
+    uint8_t * l_cert_buf = dap_chain_cert_save_mem(l_cert, &l_cert_buf_size);
+    dap_assert_PIF(l_cert_buf, "Fail save cert to memory");
+    dap_chain_cert_delete(l_cert);
+
+    dap_chain_cert_t *l_cert2 = dap_chain_cert_mem_load(l_cert_buf, l_cert_buf_size);
+    dap_assert_PIF(l_cert2, "Fail read cert from memory");
+
+    dap_chain_cert_delete(l_cert2);
+    DAP_DELETE(l_cert_buf);
+
+    dap_pass_msg("Save and load cert in memory successfully");
+
+    dap_chain_cert_t *l_certf = dap_chain_cert_generate_mem("name 2", a_key_type);
+    int l_res = dap_chain_cert_save_file(l_certf, CERT_FILE_PATH);
+    dap_assert_PIF(!l_res, "Fail save cert to file");
+    dap_chain_cert_delete(l_certf);
+
+    dap_chain_cert_t *l_certf2 = dap_chain_cert_file_load(CERT_FILE_PATH);
+    dap_assert_PIF(l_certf2, "Fail load cert from file");
+    dap_chain_cert_delete(l_certf2);
+    // delete temp file
+    unlink(CERT_FILE_PATH);
+
+    dap_pass_msg("Save and load cert in file successfully");
+
+}
+
+void init_test_case()
+{
+    dap_enc_key_init();
+}
+
+void cleanup_test_case()
+{
+    dap_enc_key_deinit();
+}
+
+void dap_chain_cert_save_tests_run(void)
+{
+    dap_print_module_name("dap_chain_cert_save");
+    init_test_case();
+
+    test_cert_memory_file(DAP_ENC_KEY_TYPE_SIG_BLISS);
+    test_cert_memory_file(DAP_ENC_KEY_TYPE_SIG_TESLA);
+    test_cert_memory_file(DAP_ENC_KEY_TYPE_SIG_PICNIC);
+
+    cleanup_test_case();
+}
diff --git a/test/dap_chain_cert_save_tests.h b/test/dap_chain_cert_save_tests.h
new file mode 100644
index 0000000000000000000000000000000000000000..eb7d56fe843285619205fdc82dabaa1b49a20e04
--- /dev/null
+++ b/test/dap_chain_cert_save_tests.h
@@ -0,0 +1,4 @@
+#pragma once
+#include "dap_test.h"
+
+void dap_chain_cert_save_tests_run(void);
diff --git a/test/libdap-test b/test/libdap-test
new file mode 160000
index 0000000000000000000000000000000000000000..b76175acc517f085c319c8e66c62bd143f96bf94
--- /dev/null
+++ b/test/libdap-test
@@ -0,0 +1 @@
+Subproject commit b76175acc517f085c319c8e66c62bd143f96bf94
diff --git a/test/main.c b/test/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..fd16469cbd7f6f591504a065d93d4de445e09b7b
--- /dev/null
+++ b/test/main.c
@@ -0,0 +1,9 @@
+#include "dap_common.h"
+#include "dap_chain_cert_save_tests.h"
+
+int main(void) {
+    // switch off debug info from library
+    set_log_level(L_CRITICAL);
+    dap_chain_cert_save_tests_run();
+    return 0;
+}