diff --git a/CMakeLists.txt b/CMakeLists.txt
index fbecb5ed9377df7c5a9f236a2a5ac7918baea81b..e7ae039b5fb50a7dd29e522c460b1c97bc9c5143 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 3.0)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.9-28")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.9-29")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 set(DAPSDK_MODULES "")
 message("Cellframe modules: ${CELLFRAME_MODULES}")
diff --git a/dap-sdk/crypto/src/oaes/oaes_lib.c b/dap-sdk/crypto/src/oaes/oaes_lib.c
index 96d06863eec204916e3f47f5aa1914a1c29f80a8..326cbf8b502c299734188acb7e2b7433a04a7795 100755
--- a/dap-sdk/crypto/src/oaes/oaes_lib.c
+++ b/dap-sdk/crypto/src/oaes/oaes_lib.c
@@ -615,8 +615,9 @@ static OAES_RET oaes_key_gen( OAES_CTX * ctx, size_t key_size )
 		return OAES_RET_ARG1;
 	
 	oaes_key_destroy( &(_ctx->key_flat) );
-    if(_key == NULL)
+    if(_key == NULL) {
         return OAES_RET_ARG1;
+    }
 
 	_key->data_len = key_size;
 	
diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c
index cfdcbfcb087aab4ac844ab4e26440e6cc0988225..138c188502380b2ef4192a64bf068deec562db5f 100644
--- a/dap-sdk/net/client/dap_client.c
+++ b/dap-sdk/net/client/dap_client.c
@@ -439,7 +439,7 @@ const char * dap_client_error_str(dap_client_error_t a_client_error)
  */
 const char * dap_client_get_error_str(dap_client_t * a_client)
 {
-    if(a_client == NULL){
+    if(a_client == NULL || DAP_CLIENT_PVT(a_client) == NULL){
         log_it(L_ERROR,"Client is NULL for dap_client_get_error_str");
         return NULL;
     }
diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c
index 94c34ab001ee09f0800ca9e4dd0256d582dacc7d..c1741a56ee5c4a2a499458ecc29665b78ffb981d 100644
--- a/dap-sdk/net/client/dap_client_http.c
+++ b/dap-sdk/net/client/dap_client_http.c
@@ -286,29 +286,12 @@ static void s_http_read(dap_events_socket_t * a_es, void * arg)
     }
     // process http header
     if(l_http_pvt->is_header_read) {
-        l_http_pvt->response[l_http_pvt->header_length - 1] = 0;
-        // search strings in header
-        char **l_strings = dap_strsplit((char*) l_http_pvt->response, "\r\n", -1);
-        if(l_strings) {
-            int i = 0;
-            while(l_strings[i]) {
-                char *l_string = l_strings[i];
-                char **l_values = dap_strsplit(l_string, ":", 2);
-                if(l_values && l_values[0] && l_values[1])
-                    if(!dap_strcmp("Content-Length", l_values[0])) {
-                        l_http_pvt->content_length = atoi(l_values[1]);
-                        l_http_pvt->is_header_read = false;
-                    }
-                dap_strfreev(l_values);
-                if(l_http_pvt->content_length)
-                    break;
-                i++;
-            }
-            dap_strfreev(l_strings);
+        const char *l_token = "Content-Length: ";
+        char *l_content_len_ptr = strstr((char*)l_http_pvt->response, l_token);
+        if (l_content_len_ptr) {
+            l_http_pvt->content_length = atoi(l_content_len_ptr + strlen(l_token));
+            l_http_pvt->is_header_read = false;
         }
-
-        // restore last symbol
-        l_http_pvt->response[l_http_pvt->header_length - 1] = '\n';
     }
 
     // process data
diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c
index 323a66af107fa1530f4a4ba84de8c8c590a624f4..537221e0b2c7e201b55ee3389e6756fcf39dfbdd 100644
--- a/dap-sdk/net/client/dap_client_pvt.c
+++ b/dap-sdk/net/client/dap_client_pvt.c
@@ -606,6 +606,8 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt)
         break;
 
         case STAGE_STATUS_ERROR: {
+            if (a_client_pvt->is_to_delete)
+                break;
             // limit the number of attempts
             a_client_pvt->stage_errors++;
             bool l_is_last_attempt = a_client_pvt->stage_errors > s_max_attempts ? true : false;
@@ -613,11 +615,7 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt)
             //    l_is_last_attempt = true;
             //}
 
-            //if (a_client_pvt->is_always_reconnect ){
-            //    l_is_last_attempt = false;
-            //}
-
-            log_it(L_ERROR, "Error state( %s), doing callback if present", dap_client_get_error_str(a_client_pvt->client));
+            log_it(L_ERROR, "Error state( %s), doing callback if present", dap_client_error_str(a_client_pvt->last_error));
             if(a_client_pvt->stage_status_error_callback)
                 a_client_pvt->stage_status_error_callback(a_client_pvt->client, (void*) l_is_last_attempt);
 
@@ -637,16 +635,20 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt)
                         log_it(L_ERROR,"Can't run timer for small delay before the next enc_init request");
                     }
                 } else {
-
-                    log_it(L_INFO, "Too many attempts, reconnect attempt in %d seconds with %s:%u",s_timeout*3,
-                           a_client_pvt->uplink_addr,a_client_pvt->uplink_port);                    // Trying the step again
-                    a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS;
-                    a_client_pvt->stage_errors = 0;
-
-                    // bigger delay before next request
-                    if(dap_timerfd_start( s_timeout*3000,(dap_timerfd_callback_t) s_stage_status_after,
-                                                   a_client_pvt ) == NULL){
-                        log_it(L_ERROR,"Can't run timer for bigger delay before the next enc_init request");
+                    if (a_client_pvt->is_always_reconnect) {
+                        log_it(L_INFO, "Too many attempts, reconnect attempt in %d seconds with %s:%u",s_timeout*3,
+                               a_client_pvt->uplink_addr,a_client_pvt->uplink_port);                    // Trying the step again
+                        a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS;
+                        a_client_pvt->stage_errors = 0;
+
+                        // bigger delay before next request
+                        if(dap_timerfd_start( s_timeout*3000,(dap_timerfd_callback_t) s_stage_status_after,
+                                                       a_client_pvt ) == NULL){
+                            log_it(L_ERROR,"Can't run timer for bigger delay before the next enc_init request");
+                        }
+                    } else {
+                        log_it(L_ERROR, "Connet to %s:%u failed", a_client_pvt->uplink_addr, a_client_pvt->uplink_port);
+                        dap_client_delete_mt(a_client_pvt->client);
                     }
                 }
             }
@@ -868,7 +870,8 @@ static void s_request_error(int a_err_code, void * a_obj)
 
     if(l_client_pvt && l_client_pvt->request_error_callback && l_client_pvt->client)
     {
-        if(l_client_pvt && l_client_pvt->request_error_callback && l_client_pvt->client && l_client_pvt->client->_internal)
+        if(l_client_pvt && l_client_pvt->request_error_callback
+                && l_client_pvt->client && l_client_pvt->client->_internal && l_client_pvt->client->_internal == l_client_pvt)
             l_client_pvt->request_error_callback(l_client_pvt->client, a_err_code);
     }
 }
@@ -1335,7 +1338,13 @@ static void s_stream_es_callback_write(dap_events_socket_t * a_es, void * arg)
  */
 static void s_stream_es_callback_error(dap_events_socket_t * a_es, int a_error)
 {
-    dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t *) a_es->_inheritor;
+    a_es->flags |= DAP_SOCK_SIGNAL_CLOSE;
+    dap_client_pvt_t *l_client_pvt = (dap_client_pvt_t *) a_es->_inheritor;
+    if (!l_client_pvt)
+        return;
+    l_client_pvt = dap_client_pvt_find(l_client_pvt->uuid);
+    if (!l_client_pvt)
+        return;
 
     char l_errbuf[128];
     l_errbuf[0]='\0';
@@ -1344,9 +1353,7 @@ static void s_stream_es_callback_error(dap_events_socket_t * a_es, int a_error)
     else
         strncpy(l_errbuf,"Unknown Error",sizeof(l_errbuf)-1);
 
-    log_it(L_WARNING, "STREAM error \"%s\" (code %d)", l_errbuf, a_error);
-
-    l_client_pvt->stream_es->flags |= DAP_SOCK_SIGNAL_CLOSE;
+    log_it(L_WARNING, "STREAM error \"%s\" (code %d)", l_errbuf, a_error);    
 
     if (a_error == ETIMEDOUT) {
         l_client_pvt->last_error = ERROR_NETWORK_CONNECTION_TIMEOUT;
diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c
index 741096c7987226aefc7e451da2c896cc3275288c..80c31d96ca1b6a4c18402c7ea1b9f0010c937d50 100644
--- a/dap-sdk/net/core/dap_events_socket.c
+++ b/dap-sdk/net/core/dap_events_socket.c
@@ -127,6 +127,13 @@ int dap_events_socket_init( )
     char l_cmd[256];
     snprintf(l_cmd,sizeof (l_cmd),"rm /dev/mqueue/%s-queue_ptr*", dap_get_appname());
     system(l_cmd);
+    FILE *l_mq_msg_max = fopen("/proc/sys/fs/mqueue/msg_max", "w");
+    if (l_mq_msg_max) {
+        fprintf(l_mq_msg_max, "%d", DAP_QUEUE_MAX_MSGS);
+        fclose(l_mq_msg_max);
+    } else {
+        log_it(L_ERROR, "Сan't open /proc/sys/fs/mqueue/msg_max file for writing");
+    }
 #endif
     dap_timerfd_init();
     return 0;
@@ -434,9 +441,9 @@ dap_events_socket_t * dap_events_socket_queue_ptr_create_input(dap_events_socket
 {
     dap_events_socket_t * l_es = DAP_NEW_Z(dap_events_socket_t);
     l_es->type = DESCRIPTOR_TYPE_QUEUE;
-    l_es->buf_out_size_max = 8 * sizeof(void*);
+    l_es->buf_out_size_max = DAP_QUEUE_MAX_MSGS * sizeof(void*);
     l_es->buf_out       = DAP_NEW_Z_SIZE(byte_t,l_es->buf_out_size_max );
-    l_es->buf_in_size_max = 8 * sizeof(void*);
+    l_es->buf_in_size_max = DAP_QUEUE_MAX_MSGS * sizeof(void*);
     l_es->buf_in       = DAP_NEW_Z_SIZE(byte_t,l_es->buf_in_size_max );
     //l_es->buf_out_size  = 8 * sizeof(void*);
     l_es->events = a_es->events;
@@ -463,7 +470,7 @@ dap_events_socket_t * dap_events_socket_queue_ptr_create_input(dap_events_socket
     char l_mq_name[64];
     struct mq_attr l_mq_attr;
     memset(&l_mq_attr,0,sizeof (l_mq_attr));
-    l_mq_attr.mq_maxmsg = 8; // Don't think we need to hold more than 1024 messages
+    l_mq_attr.mq_maxmsg = DAP_QUEUE_MAX_MSGS; // Don't think we need to hold more than 1024 messages
     l_mq_attr.mq_msgsize = sizeof (void*); // We send only pointer on memory,
                                             // so use it with shared memory if you do access from another process
     snprintf(l_mq_name,sizeof (l_mq_name),"/%s-queue_ptr-%u",dap_get_appname(), a_es->mqd_id );
@@ -556,7 +563,8 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc
         l_es->worker = a_w;
     }
     l_es->callbacks.queue_ptr_callback = a_callback; // Arm event callback
-    l_es->buf_in_size_max = 8 * sizeof(void*);
+    l_es->buf_in_size_max = DAP_QUEUE_MAX_MSGS * sizeof(void*);
+    l_es->buf_in = DAP_NEW_Z_SIZE(byte_t,l_es->buf_in_size_max);
     l_es->buf_out = NULL;
 
 #if defined(DAP_EVENTS_CAPS_EPOLL)
@@ -621,7 +629,6 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc
         char l_file_buf[l_file_buf_size];
         memset(l_file_buf, 0, l_file_buf_size);
         fread(l_file_buf, l_file_buf_size, 1, l_sys_max_pipe_size_fd);
-        l_sys_max_pipe_size_fd = NULL;
         uint64_t l_sys_max_pipe_size = strtoull(l_file_buf, 0, 10);
         fcntl(l_pipe[0], F_SETPIPE_SZ, l_sys_max_pipe_size);
         fclose(l_sys_max_pipe_size_fd);
@@ -633,7 +640,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc
     struct mq_attr l_mq_attr;
     static uint32_t l_mq_last_number=0;
     memset(&l_mq_attr,0,sizeof (l_mq_attr));
-    l_mq_attr.mq_maxmsg = 8; // Don't think we need to hold more than 1024 messages
+    l_mq_attr.mq_maxmsg = DAP_QUEUE_MAX_MSGS; // Don't think we need to hold more than 1024 messages
     l_mq_attr.mq_msgsize = sizeof (void*); // We send only pointer on memory,
                                             // so use it with shared memory if you do access from another process
     snprintf(l_mq_name,sizeof (l_mq_name),"/%s-queue_ptr-%u",dap_get_appname(),l_mq_last_number );
diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h
index b756ef154722f7e8e510c72cf64903c06aa08515..e7463c46cb389a2b737f296e40ce60c5030180b3 100644
--- a/dap-sdk/net/core/include/dap_events_socket.h
+++ b/dap-sdk/net/core/include/dap_events_socket.h
@@ -143,6 +143,7 @@ typedef struct dap_events_socket_callbacks {
 } dap_events_socket_callbacks_t;
 
 #define DAP_EVENTS_SOCKET_BUF 100000
+#define DAP_QUEUE_MAX_MSGS 8
 
 typedef enum {
     DESCRIPTOR_TYPE_SOCKET_CLIENT = 0,
diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
index 6a93998d27e8591b9de3c85005986c2698e9156f..f3bbcc5f9330b3ba73d43dec4cd1057f22e8d3af 100644
--- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c
+++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
@@ -647,9 +647,9 @@ void dap_http_client_out_header_generate(dap_http_client_t *a_http_client)
             log_it(L_DEBUG,"output: Content-Type = '%s'",a_http_client->out_content_type);
         }
         if ( a_http_client->out_content_length ) {
-            dap_snprintf(buf,sizeof(buf),"%"DAP_UINT64_FORMAT_U"",(unsigned long long)a_http_client->out_content_length);
+            dap_snprintf(buf,sizeof(buf),"%"DAP_UINT64_FORMAT_u"",a_http_client->out_content_length);
             dap_http_header_add(&a_http_client->out_headers,"Content-Length",buf);
-            log_it(L_DEBUG,"output: Content-Length = %"DAP_UINT64_FORMAT_U"",a_http_client->out_content_length);
+            log_it(L_DEBUG,"output: Content-Length = %"DAP_UINT64_FORMAT_u"",a_http_client->out_content_length);
         }
     }else
         if (s_debug_http)
diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c
index 9f19d041c5e5377bf8e75759f69781da871a6a6c..ba48ef50dccc779073b509be2e76c141fcd4c9dd 100644
--- a/dap-sdk/net/stream/stream/dap_stream.c
+++ b/dap-sdk/net/stream/stream/dap_stream.c
@@ -664,14 +664,13 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream)
      //   log_it(DEBUG,"No prefill or defrag buffer, process directly buf_in");
     // Now lets see how many packets we have in buffer now
     while ( (pkt = dap_stream_pkt_detect( proc_data , bytes_left_to_read)) ){
-        if(bytes_left_to_read -((byte_t*)pkt- proc_data  ) >=sizeof (dap_stream_pkt_t)){
-            if(pkt->hdr.size > STREAM_PKT_SIZE_MAX ){
-                //log_it(L_ERROR, "stream_pkt_detect() Too big packet size %u",
-                //       pkt->hdr.size);
-                bytes_left_to_read=0;
-                break;
-            }
+        if(pkt->hdr.size > STREAM_PKT_SIZE_MAX ){
+            //log_it(L_ERROR, "stream_pkt_detect() Too big packet size %u",
+            //       pkt->hdr.size);
+            bytes_left_to_read=0;
+            break;
         }
+
         size_t pkt_offset=( ((uint8_t*)pkt)- proc_data );
         bytes_left_to_read -= pkt_offset ;
         found_sig=true;
diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c
index 645875763a6453aba0647717e7a605cd1ef7d2c0..542d5758af4b53788311cf2a6543c897cca5ef88 100644
--- a/modules/global-db/dap_chain_global_db_driver.c
+++ b/modules/global-db/dap_chain_global_db_driver.c
@@ -325,9 +325,9 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz
         memcpy(obj->key, pkt->data + offset, str_length);
         offset += str_length;
 
-        if (offset+sizeof (uint32_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries
-        memcpy(&obj->value_len, pkt->data + offset, sizeof(uint32_t));
-        offset += sizeof(uint32_t);
+        if (offset+sizeof (size_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries
+        memcpy(&obj->value_len, pkt->data + offset, sizeof(size_t));
+        offset += sizeof(size_t);
 
         if (offset+obj->value_len> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value' field"); break;} // Check for buffer boundries
         obj->value = DAP_NEW_Z_SIZE(uint8_t, obj->value_len + 1);
diff --git a/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c b/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c
index 079cd913b5732c513d22c670ed727c307a0ed3ed..4b234c34f7e77afbf603d3fa7902f401acaae6e0 100644
--- a/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c
+++ b/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c
@@ -32,38 +32,53 @@
 #define LOG_TAG "dap_http"
 
 static const char * s_default_path_modules = "var/modules";
+static void *s_cdb_handle = NULL;
 
-int dap_modules_dynamic_load_cdb(dap_http_t * a_server){
+void dap_modules_dynamic_close_cdb()
+{
+    if (s_cdb_handle) {
+        dlclose(s_cdb_handle);
+        s_cdb_handle = NULL;
+    }
+}
+
+void *dap_modules_dynamic_get_cdb_func(const char *a_func_name)
+{
     char l_lib_path[MAX_PATH] = {'\0'};
+    void *l_ref_func = NULL;
+    //  find func from dynamic library
 #if defined (DAP_OS_LINUX) && !defined (__ANDROID__)
     const char * l_cdb_so_name = "libcellframe-node-cdb.so";
-    dap_sprintf(l_lib_path, "%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name);
+    if (!s_cdb_handle) {
+        dap_sprintf(l_lib_path, "%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name);
 
-    void* l_cdb_handle = NULL;
-    l_cdb_handle = dlopen(l_lib_path, RTLD_NOW);
-    if(!l_cdb_handle){
-        log_it(L_ERROR,"Can't load %s module: %s", l_cdb_so_name, dlerror());
-        return -1;
+        s_cdb_handle = dlopen(l_lib_path, RTLD_NOW);
+        if (!s_cdb_handle) {
+            log_it(L_ERROR,"Can't load %s module: %s", l_cdb_so_name, dlerror());
+            return NULL;
+        }
     }
 
-    int (*dap_chain_net_srv_vpn_cdb_init)(dap_http_t*);
-    const char * l_init_func_name = "dap_chain_net_srv_vpn_cdb_init";
-    *(void **) (&dap_chain_net_srv_vpn_cdb_init) = dlsym(l_cdb_handle, l_init_func_name);
-    char* error;
-    if (( error = dlerror()) != NULL) {
-        log_it(L_ERROR,"%s module: %s error loading (%s)", l_cdb_so_name, l_init_func_name, error);
-        return -2;
-     }
+    l_ref_func = dlsym(s_cdb_handle, a_func_name);
 
-    int l_init_res = (*dap_chain_net_srv_vpn_cdb_init)(a_server);
-    if(l_init_res){
-        log_it(L_ERROR,"%s: %s returns %d", l_cdb_so_name, l_init_func_name, error);
-        return -3;
+    if (!l_ref_func) {
+        log_it(L_ERROR,"%s module: %s error loading (%s)", l_cdb_so_name, a_func_name, dlerror());
+        return NULL;
     }
-
-    return 0;
 #else
     log_it(L_ERROR,"%s: module is not supported on current platfrom", __PRETTY_FUNCTION__);
-    return -3;
 #endif
+    return l_ref_func;
+}
+
+int dap_modules_dynamic_load_cdb(dap_http_t * a_server)
+{
+    int (*dap_chain_net_srv_vpn_cdb_init)(dap_http_t *);
+    dap_chain_net_srv_vpn_cdb_init = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_init");
+    int l_init_res = dap_chain_net_srv_vpn_cdb_init(a_server);
+    if (l_init_res) {
+        log_it(L_ERROR,"dap_modules_dynamic: dap_chain_net_srv_vpn_cdb_init returns %d", l_init_res);
+        return -3;
+    }
+    return 0;
 }
diff --git a/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h b/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h
index 492b98c71127b030ed44527e276fa41eeda9d9e1..5f395b833ac6c5342b46cbd54932c086c8d62773 100644
--- a/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h
+++ b/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h
@@ -26,4 +26,5 @@
 #include "dap_http.h"
 
 int dap_modules_dynamic_load_cdb(dap_http_t * a_server);
-
+void *dap_modules_dynamic_get_cdb_func(const char *a_func_name);
+void dap_modules_dynamic_close_cdb();
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 6dfd45a8ef99b8afdffb8493c5dfb052c9c3ddaa..a54f91f39d300c41a993c758f6fed23ba895e36e 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -392,7 +392,7 @@ static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chai
         pthread_rwlock_rdlock(&PVT(l_net)->rwlock);
         for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) {
             dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data;
-            dap_worker_t * l_worker = dap_client_get_stream_worker( l_node_client->client);
+            dap_stream_worker_t * l_worker = dap_client_get_stream_worker( l_node_client->client);
             if(l_worker)
                 dap_stream_ch_chain_pkt_write_mt(l_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN,
                                               l_net->pub.id.uint64, a_chain->id.uint64, a_id.uint64, a_atom, a_atom_size);
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index e1c0cd0ae665ab0d0f17a59a938bf6ff5d23b56f..9c8ffa7d18299fdac22f5b512c3ddd4abc7b8720 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -271,6 +271,7 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg)
         dap_stream_t * l_stream  = dap_client_get_stream(a_client);
         if (l_stream) {
             l_node_client->esocket_uuid = l_stream->esocket->uuid;
+            l_node_client->stream_worker = l_stream->stream_worker;
             if (l_node_client->keep_connection) {
                 dap_events_socket_uuid_t *l_uuid = DAP_NEW(dap_events_socket_uuid_t);
                 memcpy(l_uuid, &l_node_client->uuid, sizeof(dap_events_socket_uuid_t));
@@ -628,7 +629,7 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
     a_node_client->client = dap_client_new(a_node_client->events, s_stage_status_callback,
             s_stage_status_error_callback);
     a_node_client->keep_connection = true;
-    dap_client_set_is_always_reconnect(a_node_client->client, true);
+    dap_client_set_is_always_reconnect(a_node_client->client, false);
     a_node_client->client->_inheritor = a_node_client;
     dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels);
 
@@ -691,6 +692,10 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
         inet_ntop(AF_INET, &a_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN);
         log_it(L_INFO, "Closing node client to uplink %s:%d", l_node_addr_str, a_client->info->hdr.ext_port);
         // clean client
+        DAP_CLIENT_PVT(a_client->client)->stage_status_error_callback = NULL;
+        a_client->client->_inheritor = NULL;
+        if (a_client->stream_worker)
+            dap_events_socket_remove_and_delete_mt(a_client->stream_worker->worker, a_client->esocket_uuid);
         dap_client_delete_mt(a_client->client);
 #ifndef _WIN32
         pthread_cond_destroy(&a_client->wait_cond);
@@ -698,7 +703,6 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
         CloseHandle( a_client->wait_cond );
 #endif
         pthread_mutex_destroy(&a_client->wait_mutex);
-        a_client->client->_inheritor = NULL;
         a_client->client = NULL;
         dap_chain_node_client_handle_t * l_client_found = NULL;
         HASH_FIND(hh,s_clients,&a_client->uuid,sizeof(a_client->uuid),l_client_found);
diff --git a/modules/net/srv/CMakeLists.txt b/modules/net/srv/CMakeLists.txt
index 54d4d4be1e00cd1770be36a7ec91907aa3e86b9d..70e34da69704e70015fa7b91f5c9d6f2292b6148 100644
--- a/modules/net/srv/CMakeLists.txt
+++ b/modules/net/srv/CMakeLists.txt
@@ -7,7 +7,7 @@ file(GLOB DAP_CHAIN_NET_SRV_HEADERS include/*.h libmaxminddb/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_SRCS} ${DAP_CHAIN_NET_SRV_HEADERS})
 
-target_link_libraries(dap_chain_net_srv dap_core dap_crypto dap_chain dap_chain_net dap_chain_wallet)
+target_link_libraries(dap_chain_net_srv dap_core dap_crypto dap_chain dap_chain_net dap_chain_wallet dap_modules_dynamic_cdb)
 
 target_include_directories(dap_chain_net_srv INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index a3de7a17fb2b51dfa0f8a2fcde6f35395c8392b8..abec2696aeb8f709f6f07f660ca55ec1b6846a14 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -60,6 +60,7 @@
 #include "dap_chain_net_srv.h"
 #include "dap_chain_net_srv_order.h"
 #include "dap_chain_net_srv_stream_session.h"
+#include "dap_modules_dynamic_cdb.h"
 
 #include "dap_chain_node_cli_cmd.h"
 
@@ -178,29 +179,6 @@ void dap_chain_net_srv_deinit(void)
     dap_chain_net_srv_del_all();
 }
 
-
-static void* get_cdb_func(const char *func_name)
-{
-    void *l_ref_func = NULL;
-    //  find func from dynamic library
-#if defined (DAP_OS_LINUX) && !defined (__ANDROID__) && defined(DAP_MODULES_DYNAMIC)
-    const char * s_default_path_modules = "var/modules";
-    const char * l_cdb_so_name = "libcellframe-node-cdb.so";
-    char *l_lib_path = dap_strdup_printf("%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name);
-    void* l_cdb_handle = NULL;
-    l_cdb_handle = dlopen(l_lib_path, RTLD_NOW);
-    DAP_DELETE(l_lib_path);
-    if(!l_cdb_handle) {
-        log_it(L_ERROR, "Can't load %s module: %s", l_cdb_so_name, dlerror());
-    }
-    else {
-        l_ref_func = dlsym(l_cdb_handle, func_name);
-        dlclose(l_cdb_handle);
-    }
-#endif
-    return l_ref_func;
-}
-
 /**
  * @brief s_cli_net_srv
  * @param argc
@@ -554,10 +532,9 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re
             }
         }else if( dap_strcmp( l_order_str, "recheck" ) == 0 ){
             //int dap_chain_net_srv_vpn_cdb_server_list_check_orders(dap_chain_net_t *a_net);
-            int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net) = NULL;
-            *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_check_orders) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders");
-            int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(l_net) : -5;
-            //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net);
+            int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net);
+            dap_chain_net_srv_vpn_cdb_server_list_check_orders = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders");
+            int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net) : -5;
             ret = (l_init_res > 0) ? 0 : -10;
 
         }else if( dap_strcmp( l_order_str, "static" ) == 0 ){
@@ -570,12 +547,11 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re
             int (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(dap_chain_net_t *a_net) = NULL;
             //  find func from dinamic library
             if(l_subcmd_save || l_subcmd_del) {
-                *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_create) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_create");
-                *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_delete) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_delete");
+                dap_chain_net_srv_vpn_cdb_server_list_static_create = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_create");
+                dap_chain_net_srv_vpn_cdb_server_list_static_delete = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_delete");
             }
             if(l_subcmd_save) {
-                int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create ? (*dap_chain_net_srv_vpn_cdb_server_list_static_create)(l_net) : -5;
-                //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create(l_net);
+                int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create ? dap_chain_net_srv_vpn_cdb_server_list_static_create(l_net) : -5;
                 if(l_init_res >= 0){
                     dap_string_append_printf(l_string_ret, "Static node list saved, %d orders in list\n", l_init_res);
                     ret = 0;
@@ -586,8 +562,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re
                 }
 
             } else if(l_subcmd_del) {
-                int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete ? (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(l_net) : -5;
-                //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete(l_net);
+                int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete ? dap_chain_net_srv_vpn_cdb_server_list_static_delete(l_net) : -5;
                 if(!l_init_res){
                     dap_string_append_printf(l_string_ret, "Static node list deleted\n");
                     ret = 0;
diff --git a/modules/service/vpn/CMakeLists.txt b/modules/service/vpn/CMakeLists.txt
index 9383e4082f41b431e5e78cd81f503898e1d44044..30e2258599f8a27aaac447963f2206034dbe6b67 100644
--- a/modules/service/vpn/CMakeLists.txt
+++ b/modules/service/vpn/CMakeLists.txt
@@ -15,7 +15,7 @@ endif()
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_VPN_SRCS} ${DAP_CHAIN_NET_SRV_VPN_HEADERS})
 
-target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv dap_modules_dynamic_cdb)
 add_definitions("-DDAP_TUN_IN_WORKER")
 
 target_include_directories(${PROJECT_NAME} INTERFACE .)
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 5034adb19a356c15ee43a7271fc6050261c71e32..c653df47a16de9735a236c415e021433ab92208c 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -79,7 +79,6 @@
 #include "dap_chain_net_srv.h"
 #include "dap_chain_net_srv_client.h"
 #include "dap_chain_net_srv_vpn.h"
-#include "dap_chain_net_srv_vpn_cdb.h"
 #include "dap_chain_net_srv_stream_session.h"
 #include "dap_chain_net_vpn_client.h"
 #include "dap_chain_net_vpn_client_tun.h"
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index c41ca37e10a2eca76e11855fec0ff643a35e16a1..4021249ad7183dc948d52fdd2c0d4cfb7f013555 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -58,16 +58,13 @@
 #include "dap_chain_mempool.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_net_srv_vpn.h"
-#include "dap_chain_net_srv_vpn_cdb.h" // for DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX
 #include "dap_chain_net_vpn_client.h"
 
 #include "dap_stream_ch_pkt.h"
 #include "dap_stream_ch_chain_net_srv.h"
-//#include "dap_stream_ch_chain_net_srv.h"
 #include "dap_chain_net_vpn_client_tun.h"
 #include "dap_chain_net_srv_vpn_cmd.h"
-#include "dap_chain_net_srv_vpn_cdb_server_list.h"
-//#include "dap_chain_net_vpn_client_data.h"
+#include "dap_modules_dynamic_cdb.h"
 
 /*
  #if !defined( dap_http_client_state_t )
@@ -416,7 +413,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
     if(a_timeout_test_ms==-1)
         a_timeout_test_ms = 10000;
     // default 5 sec = 5000 ms
-    int l_timeout_conn_ms = 5000;
+    int l_timeout_conn_ms = 25000;
 
     int l_ret = 0;
     if(!a_ipv4_str) // && !a_ipv6_str)
@@ -437,7 +434,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
     if(a_ipv6_str)
         inet_pton(AF_INET6, a_ipv6_str, &(s_node_info->hdr.ext_addr_v6));
 
-    s_vpn_client = dap_chain_node_client_connect_channels(a_net, s_node_info, l_active_channels);
+    s_vpn_client = dap_chain_node_client_create_n_connect(a_net, s_node_info, l_active_channels, NULL, NULL);
     if(!s_vpn_client) {
         log_it(L_ERROR, "Can't connect to VPN server=%s:%d", a_ipv4_str, a_port);
         // clean client struct
diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn.h b/modules/service/vpn/include/dap_chain_net_srv_vpn.h
index cb396c969577d647c4e59f48d42a22ee7e535f2d..810330bb7b254f9dde8bb34a31a4b9db14fd1382 100644
--- a/modules/service/vpn/include/dap_chain_net_srv_vpn.h
+++ b/modules/service/vpn/include/dap_chain_net_srv_vpn.h
@@ -29,6 +29,7 @@
 #include "dap_chain_net_srv.h"
 #include "dap_events.h"
 
+#define DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX "srv.vpn"
 
 #define DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_CLIENT    0x01
 #define DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA      0x02
diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb.h
deleted file mode 100644
index 94e0772aa5314e45d065e7be31a893a0b2de662e..0000000000000000000000000000000000000000
--- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Authors:
- * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net
- * CellFrame       https://cellframe.net
- * Sources         https://gitlab.demlabs.net/cellframe
- * 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
-#include "dap_http.h"
-#include "dap_enc_http.h"
-#include "dap_config.h"
-
-#define DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX "srv.vpn"
-
-extern dap_config_t * g_dap_config_cdb;
-
-int dap_chain_net_srv_vpn_cdb_init(dap_http_t * a_http);
-void dap_chain_net_srv_vpn_cdb_deinit();
-void dap_chain_net_srv_vpn_cdb_auth_after(enc_http_delegate_t* a_delegate, const char * a_login, const char * a_pkey_b64 );
diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h
deleted file mode 100644
index 820d9f81936a8ada6244ff6706c28434aeba1003..0000000000000000000000000000000000000000
--- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Authors:
- * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net
- * CellFrame       https://cellframe.net
- * Sources         https://gitlab.demlabs.net/cellframe
- * Copyright  (c) 2017-2020
- * 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
-
-#include "dap_http.h"
-#include "dap_enc_http.h"
-
-typedef struct dap_serial_key {
-    struct {
-        char serial[20];
-        time_t activated; // if set, then serial is activated
-        // if zero then time no expired
-        union{
-            time_t expired;
-            int64_t license_length;// in sec
-        };
-        int32_t pkey_type;// dap_enc_key_type_t pkey type
-        size_t ext_size;
-    }DAP_ALIGN_PACKED header;
-    uint8_t ext[];// pkey here
-}DAP_ALIGN_PACKED dap_serial_key_t;
-
-size_t dap_serial_key_len(dap_serial_key_t *a_serial_key);
-dap_serial_key_t* dap_chain_net_srv_vpn_cdb_auth_get_serial_param(const char *a_serial_str, const char **a_group_out);
-
-int dap_chain_net_srv_vpn_cdb_auth_init (const char * a_domain, const char * a_mode, bool a_is_registration_open);
-void dap_chain_net_srv_vpn_cdb_auth_deinit();
-
-void dap_chain_net_srv_vpn_cdb_auth_add_proc(dap_http_t * a_http, const char * a_url);
-void dap_chain_net_srv_vpn_cdb_auth_set_callback(dap_enc_http_callback_t a_callback_success);
-int dap_chain_net_srv_vpn_cdb_auth_cli_cmd_serial(const char *a_serial_str, int a_arg_index, int a_argc, char ** a_argv, char **a_str_reply);
-int dap_chain_net_srv_vpn_cdb_auth_cli_cmd_user(const char *a_user_str, int a_arg_index, int a_argc, char ** a_argv, char **a_str_reply);
-
-int dap_chain_net_srv_vpn_cdb_auth_check_login(const char * a_login, const char * a_password);
-int dap_chain_net_srv_vpn_cdb_auth_activate_serial(const char * a_serial_raw, const char * a_serial, const char * a_sign, const char * a_pkey);
-int dap_chain_net_srv_vpn_cdb_auth_check_serial(const char * a_serial, const char * a_pkey);
diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_server_list.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_server_list.h
deleted file mode 100644
index 1aa4f8be6c3d5aed3da64426dff8392cbe31cbb5..0000000000000000000000000000000000000000
--- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_server_list.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Authors:
- * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
- * Alexander Lysikov <alexander.lysikov@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net
- * CellFrame       https://cellframe.net
- * Sources         https://gitlab.demlabs.net/cellframe
- * 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
-
-#include "dap_enc_http.h"
-#include <stdbool.h>
-
-struct dap_http;
-
-int get_order_state(dap_chain_node_addr_t a_node_addr);
-
-int dap_chain_net_srv_vpn_cdb_server_list_init(void);
-void dap_chain_net_srv_vpn_cdb_server_list_deinit(void);
-void dap_chain_net_srv_vpn_cdb_server_list_add_proc(struct dap_http * sh, const char * url);
-
-void dap_chain_net_srv_vpn_cdb_server_list_cache_reset(void);
-int dap_chain_net_srv_vpn_cdb_server_list_static_create(dap_chain_net_t *a_net);
-