diff --git a/dap-sdk/core/src/dap_config.c b/dap-sdk/core/src/dap_config.c
index fea4cf8e0dadae744a13b357e12ee3cd36c5e641..9064f362ca409d65c9acdad231224168c94e368e 100755
--- a/dap-sdk/core/src/dap_config.c
+++ b/dap-sdk/core/src/dap_config.c
@@ -595,7 +595,7 @@ const char * dap_config_get_item_str_default(dap_config_t * a_config, const char
  */
 bool dap_config_get_item_bool(dap_config_t * a_config, const char * a_section_path, const char * a_item_name)
 {
-char	*cp;
+    const char *cp;
 
     if ( !(cp = dap_config_get_item_str(a_config, a_section_path, a_item_name)) )
         return	false;
diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c
index 7bb858d07ffe2ccf0e5358487d72915280ea7fde..628d1e0bf3e746c5940a36a11f93ffb3953a398d 100755
--- a/dap-sdk/crypto/src/dap_sign.c
+++ b/dap-sdk/crypto/src/dap_sign.c
@@ -441,7 +441,7 @@ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t
  */
 size_t dap_sign_get_size(dap_sign_t * a_chain_sign)
 {
-    if(!a_chain_sign)
+    if(!a_chain_sign || a_chain_sign->header.type.type == SIG_TYPE_NULL)
         return 0;
     return (sizeof(dap_sign_t) + a_chain_sign->header.sign_size + a_chain_sign->header.sign_pkey_size);
 }
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index c97c38f0a56f1a5c8ad702d2bb7bb24093115dd8..821db99af59892057dd8b0e26bd833ae1fe37e83 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -664,7 +664,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
         }
 
         uint64_t l_last_id = l_store_obj->id;
-        char *l_last_group = l_store_obj->group;
+        const char *l_last_group = l_store_obj->group;
         int l_last_type = l_store_obj->type;
         bool l_group_changed = false;
 
@@ -740,15 +740,14 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
             dap_chain_t *l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id);
             if(l_chain) {
                 if(l_chain->callback_add_datums_with_group){
-                    void * restrict l_store_obj_value = l_store_obj[i].value;
+                    const void * restrict l_store_obj_value = l_store_obj[i].value;
                     l_chain->callback_add_datums_with_group(l_chain,
                             (dap_chain_datum_t** restrict) l_store_obj_value, 1,
                             l_store_obj[i].group);
                 }
             }
             // save data to global_db
-            dap_store_obj_t *l_obj_copy = dap_store_obj_copy(l_obj, 1);
-            if(!dap_chain_global_db_obj_save(l_obj_copy, 1)) {
+            if(!dap_chain_global_db_obj_save(l_obj, 1)) {
                 struct sync_request *l_sync_req_err = DAP_DUP(l_sync_request);
                 dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id,
                                                   s_gdb_in_pkt_error_worker_callback, l_sync_req_err);
@@ -756,8 +755,6 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
                 if (s_debug_more)
                     log_it(L_DEBUG, "Added new GLOBAL_DB synchronization record");
             }
-            DAP_DELETE(l_obj_copy->group);
-            DAP_DELETE(l_obj_copy);
         }
         if(l_store_obj) {
             dap_store_obj_free(l_store_obj, l_data_obj_count);
diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h
index 0b112fa6b1eb23f27bcf49693dcaa4294b11d38d..1c27bd58292cbbee4ac50cb89a56331cda678a1c 100644
--- a/modules/common/include/dap_chain_datum.h
+++ b/modules/common/include/dap_chain_datum.h
@@ -141,9 +141,9 @@ typedef void (*dap_chain_datum_callback_iter_delete_t)(dap_chain_datum_iter_t *
  * @param a_datum
  * @return
  */
-static inline size_t dap_chain_datum_size(dap_chain_datum_t * a_datum)
+static inline size_t dap_chain_datum_size(const dap_chain_datum_t *a_datum)
 {
-    if(!a_datum)
+    if (!a_datum)
         return 0;
     return  sizeof(a_datum->header) + a_datum->header.data_size;
 }
diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index 2d457e059cc608c4676fe3bff9393266aa382aeb..2afb73402da10f3fd0b39c3ea16481e0b3f5d67f 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -385,7 +385,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev
             l_item->signs_count = l_event->header.signs_count;
             // l_item->ts_update = l_events_round[l_index].timestamp;
             l_item->ts_update = l_event_round_item->cfg.ts_update;
-            l_item->hash_str = l_events_round[l_index].key;
+            l_item->hash_str = (char *)l_events_round[l_index].key;
             HASH_ADD_STR(s_event_clean_dup_items, hash_str, l_item);
             if ( l_event->header.signs_count > l_max_signs_count ) {
                 l_max_signs_count = l_event->header.signs_count;
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index da89542409c95420fcdf35af3941426d0e64f1d4..d425ad77c57a515c1d5251ce0fdbe13b9aa16eec 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -337,7 +337,7 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out)
  * @param a_timestamp an object time stamp
  * @return True if successful, false otherwise.
  */
-static bool global_db_gr_del_add(char *a_key,const char *a_group, time_t a_timestamp)
+static bool global_db_gr_del_add(const char *a_key, const char *a_group, time_t a_timestamp)
 {
 dap_store_obj_t store_data = {0};
 char	l_group[DAP_DB_K_MAXGRPLEN];
@@ -390,7 +390,7 @@ int	l_res = 0;
  * @param a_key an object key string, looked like "0x8FAFBD00B..."
  * @return If successful, a time stamp, otherwise 0.
  */
-time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key)
+time_t global_db_gr_del_get_timestamp(const char *a_group, const char *a_key)
 {
     time_t l_timestamp = 0;
     if(!a_key)
@@ -410,7 +410,7 @@ time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key)
         dap_store_obj_free(l_obj, l_count_out);
     }
     unlock();
-    DAP_DELETE(store_data.group);
+    DAP_DELETE((char *)store_data.group);
     return l_timestamp;
 }
 
diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c
index 45d7dff218ba4d787268f1474e0da7696803ab14..74ddac6d9a0b9bda0e7b9c3c5053a83decb65cd8 100644
--- a/modules/global-db/dap_chain_global_db_driver.c
+++ b/modules/global-db/dap_chain_global_db_driver.c
@@ -157,9 +157,9 @@ void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count)
         return;
     for(size_t i = 0; i < a_store_count; i++) {
         dap_store_obj_t *l_store_obj_cur = a_store_obj + i;
-        DAP_DELETE(l_store_obj_cur->group);
-        DAP_DELETE(l_store_obj_cur->key);
-        DAP_DELETE(l_store_obj_cur->value);
+        DAP_DELETE((char *)l_store_obj_cur->group);
+        DAP_DELETE((char *)l_store_obj_cur->key);
+        DAP_DELETE((char *)l_store_obj_cur->value);
     }
     DAP_DELETE(a_store_obj);
 }
diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c
index 16252d46783a000909f27b4c946eeae623201f29..6fa70eca99b9b9bf92f6a5ea2aaa0ac64c000d7d 100644
--- a/modules/global-db/dap_chain_global_db_driver_cdb.c
+++ b/modules/global-db/dap_chain_global_db_driver_cdb.c
@@ -78,10 +78,10 @@ static struct __cuttdb_req_list__ {
 
 atomic_int	s_req_flag;
 
-static pthread_mutex_t	s_req_list_lock = PTHREAD_MUTEX_INITIALIZER;		/* Coordinate access to the req_list */
+static pthread_mutex_t s_req_list_lock = PTHREAD_MUTEX_INITIALIZER;		/* Coordinate access to the req_list */
 
-static pthread_mutex_t	s_req_list_async_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t	s_req_list_async_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t s_req_list_async_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_req_list_async_cond = PTHREAD_COND_INITIALIZER;
 
 static int s_req_async_proc_stop_flag = 0;
 
@@ -136,7 +136,7 @@ static void cdb_serialize_val_to_dap_store_obj(pdap_store_obj_t a_obj, const cha
     a_obj->value_len = dap_hex_to_uint(val + offset, sizeof(uint64_t));
     offset += sizeof(uint64_t);
     a_obj->value = DAP_NEW_SIZE(uint8_t, a_obj->value_len);
-    memcpy(a_obj->value, val + offset, a_obj->value_len);
+    memcpy((byte_t *)a_obj->value, val + offset, a_obj->value_len);
     offset += a_obj->value_len;
     a_obj->timestamp = dap_hex_to_uint(val + offset, sizeof(uint64_t));
 }
@@ -217,7 +217,7 @@ bool dap_cdb_get_count_iter_callback(void *arg, const char *key, int ksize, cons
    CDB_PAGEWARMUP
  * @return A pointer to CDB, if success. NULL, if error.
  */
-pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) {
+pcdb_instance dap_cdb_init_group(const char *a_group, int a_flags) {
     pcdb_instance l_cdb_i = NULL;
     pthread_mutex_lock(&cdb_mutex);
     char l_cdb_path[strlen(s_cdb_path) + strlen(a_group) + 2];
@@ -658,7 +658,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
             }
         }*/
         cdb_record l_rec;
-        l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key);
+        l_rec.key = (char *)a_store_obj->key; //dap_strdup(a_store_obj->key);
         int offset = 0;
         char *l_val = DAP_NEW_Z_SIZE(char, sizeof(uint64_t) + sizeof(uint64_t) + a_store_obj->value_len + sizeof(uint64_t));
         dap_uint_to_hex(l_val, ++l_cdb_i->id, sizeof(uint64_t));
@@ -667,7 +667,6 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
         offset += sizeof(uint64_t);
         if(a_store_obj->value && a_store_obj->value_len){
             memcpy(l_val + offset, a_store_obj->value, a_store_obj->value_len);
-            DAP_DELETE(a_store_obj->value);
         }
         offset += a_store_obj->value_len;
         dap_uint_to_hex(l_val + offset, a_store_obj->timestamp, sizeof(uint64_t));
@@ -677,13 +676,11 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
             log_it(L_ERROR, "Couldn't add record with key [%s] to CDB: \"%s\"", l_rec.key, cdb_errmsg(cdb_errno(l_cdb_i->cdb)));
             ret = -1;
         }
-        DAP_DELETE(l_rec.key);
         DAP_DELETE(l_rec.val);
     } else if(a_store_obj->type == DAP_DB$K_OPTYPE_DEL) {
         if(a_store_obj->key) {
             if(cdb_del(l_cdb_i->cdb, a_store_obj->key, (int) strlen(a_store_obj->key)) == -3)
                 ret = 1;
-            DAP_DELETE(a_store_obj->key);
         } else {
             cdb_destroy(l_cdb_i->cdb);
             if (!dap_cdb_init_group(a_store_obj->group, CDB_TRUNC | CDB_PAGEWARMUP)) {
diff --git a/modules/global-db/dap_chain_global_db_driver_pgsql.c b/modules/global-db/dap_chain_global_db_driver_pgsql.c
index 389e2fa09103c1b89bb0eed859c7deae640daf7d..418dd10ccd41728bbecb98b0158d2877c66421ca 100644
--- a/modules/global-db/dap_chain_global_db_driver_pgsql.c
+++ b/modules/global-db/dap_chain_global_db_driver_pgsql.c
@@ -89,7 +89,7 @@ static void s_pgsql_free_connection(PGconn *a_conn)
  * @param a_drv_callback a pointer to a structure of callback functions 
  * @return If successful returns 0, else a error code <0.
  */
-int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback)
+int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback, bool a_async_mode)
 {
     dap_hash_fast_t l_dir_hash;
     dap_hash_fast(a_filename_dir, strlen(a_filename_dir), &l_dir_hash);
@@ -304,8 +304,6 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj)
 
         // execute add request
         l_res = PQexecParams(l_conn, l_query_str, 2, NULL, l_param_vals, l_param_lens, l_param_formats, 0);
-        DAP_DELETE(a_store_obj->value);
-        DAP_DELETE(a_store_obj->key);
         if (PQresultStatus(l_res) != PGRES_COMMAND_OK) {
             if (s_trans_conn) { //we shouldn't fail within a transaacion
                 dap_db_driver_pgsql_end_transaction();
@@ -329,7 +327,6 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj)
         // remove all group
         else
             l_query_str = dap_strdup_printf("DROP TABLE \"%s\"", a_store_obj->group);
-        DAP_DELETE(a_store_obj->key);
         // execute delete request
         l_res = PQexec(l_conn, l_query_str);
         if (PQresultStatus(l_res) != PGRES_COMMAND_OK) {
diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c
index c24f5fc07267168beb10b12656cf372130517868..1975f4dea5823f8aa15ae309121b8d58cd85ac18 100644
--- a/modules/global-db/dap_chain_global_db_driver_sqlite.c
+++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c
@@ -536,7 +536,7 @@ static bool dap_db_driver_sqlite_query_free(sqlite3_stmt *l_res)
  * @param len a length of byte array
  * @return Returns a hexadecimal string
  */
-static char* dap_db_driver_get_string_from_blob(uint8_t *blob, int len)
+static char* dap_db_driver_get_string_from_blob(const uint8_t *blob, int len)
 {
     char *str_out;
     int ret;
@@ -669,7 +669,6 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         if(!a_store_obj->key)
             return -1;
         char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len);
-        DAP_DEL_Z(a_store_obj->value);
         //add one record
         l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'', '%lld', x'%s')",
                                    l_table_name, a_store_obj->key, a_store_obj->timestamp, l_blob_value);
@@ -728,8 +727,6 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         l_ret = -1;
     }
     s_sqlite_free_connection(s_db);
-    if (a_store_obj->key)
-        DAP_DELETE(a_store_obj->key);
     dap_db_driver_sqlite_free(l_query);
     DAP_DELETE(l_table_name);
     return l_ret;
@@ -766,7 +763,7 @@ static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_RO
             {
                 a_obj->value_len = (size_t) l_cur_val->len;
                 a_obj->value = DAP_NEW_SIZE(uint8_t, a_obj->value_len);
-                memcpy(a_obj->value, l_cur_val->val.val_blob, a_obj->value_len);
+                memcpy((byte_t *)a_obj->value, l_cur_val->val.val_blob, a_obj->value_len);
             }
             break; // value
         }
diff --git a/modules/global-db/dap_chain_global_db_hist.c b/modules/global-db/dap_chain_global_db_hist.c
index ae23e302ad91d00e6bc6dc2320b020891c7d277c..d6e93f0569627dd4cc3630d3ad5f73b8fab4628d 100644
--- a/modules/global-db/dap_chain_global_db_hist.c
+++ b/modules/global-db/dap_chain_global_db_hist.c
@@ -119,7 +119,7 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_
     if(l_rec.keys_count >= 1)
         l_rec.group = a_store_obj->group;
     if(l_rec.keys_count == 1)
-        l_rec.keys = a_store_obj->key;
+        l_rec.keys = (char *)a_store_obj->key;
     else {
         // make keys vector
         char **l_keys = DAP_NEW_Z_SIZE(char*, sizeof(char*) * (((size_t ) a_dap_store_count) + 1));
@@ -128,14 +128,9 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_
             // if it is marked, the data has not been saved
             if(a_store_obj[i].timestamp == (time_t) -1)
                 continue;
-            l_keys[i] = a_store_obj[i].key;
+            l_keys[i] = (char *)a_store_obj[i].key;
         }
-        l_keys[i] = NULL;
         l_rec.keys = dap_strjoinv(GLOBAL_DB_HIST_KEY_SEPARATOR, l_keys);
-        for(i = 0; i < a_dap_store_count; i++) {
-            DAP_DELETE(l_keys[i]);
-            DAP_DEL_Z(a_store_obj[i].value);
-        }
         DAP_DELETE(l_keys);
     }
 
@@ -221,8 +216,8 @@ static void *s_list_thread_proc(void *arg)
                 dap_store_obj_t *l_obj_cur = l_objs + i;
                 l_obj_cur->type = l_obj_type;
                 if (l_obj_type == 'd') {
-                    DAP_DELETE(l_obj_cur->group);
-                    l_obj_cur->group = dap_strdup(l_del_group_name_replace);
+                    DAP_DELETE((char *)l_obj_cur->group);
+                    l_obj_cur->group = l_del_group_name_replace;
                 }
                 dap_db_log_list_obj_t *l_list_obj = DAP_NEW_Z(dap_db_log_list_obj_t);
                 uint64_t l_cur_id = l_obj_cur->id;
@@ -244,9 +239,6 @@ static void *s_list_thread_proc(void *arg)
                 l_dap_db_log_list->list_read = l_list;
             pthread_mutex_unlock(&l_dap_db_log_list->list_mutex);
         }
-
-        if (l_del_group_name_replace)
-            DAP_DELETE(l_del_group_name_replace);
     }
 
     pthread_mutex_lock(&l_dap_db_log_list->list_mutex);
diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c
index e2e4729888fa2aed4f9f0c7bf574033ff0943f96..a0bb5fbdef6f52de7b2982f7479a065c5138a1bb 100644
--- a/modules/global-db/dap_chain_global_db_remote.c
+++ b/modules/global-db/dap_chain_global_db_remote.c
@@ -316,8 +316,8 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz
 
         if (offset+str_length> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'group' field"); break;} // Check for buffer boundries
         obj->group = DAP_NEW_SIZE(char, str_length + 1);
-        memcpy(obj->group, pkt->data + offset, str_length);
-        obj->group[str_length] = '\0';
+        memcpy((char *)obj->group, pkt->data + offset, str_length);
+        ((char *)obj->group)[str_length] = '\0';
         offset += str_length;
 
         if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'id' field"); break;} // Check for buffer boundries
@@ -334,8 +334,8 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz
 
         if (offset+ str_length > pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'key' field"); break;} // Check for buffer boundries
         obj->key = DAP_NEW_SIZE(char, str_length + 1);
-        memcpy(obj->key, pkt->data + offset, str_length);
-        obj->key[str_length] = '\0';
+        memcpy((char *)obj->key, pkt->data + offset, str_length);
+        ((char *)obj->key)[str_length] = '\0';
         offset += str_length;
 
         if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries
@@ -344,7 +344,7 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz
 
         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_SIZE(uint8_t, obj->value_len);
-        memcpy(obj->value, pkt->data + offset, obj->value_len);
+        memcpy((char *)obj->value, pkt->data + offset, obj->value_len);
         offset += obj->value_len;
     }
     assert(pkt->data_size == offset);
diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h
index d8f7705fd31a4c4d686dce2abbf9933ce04f91a3..4bdbffbd0d337e4efb4d55baa981a50989008e61 100644
--- a/modules/global-db/include/dap_chain_global_db.h
+++ b/modules/global-db/include/dap_chain_global_db.h
@@ -85,7 +85,7 @@ bool dap_chain_global_db_del(char *a_key);
 /**
  * Get timestamp of the deleted entry
  */
-time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key);
+time_t global_db_gr_del_get_timestamp(const char *a_group, const char *a_key);
 
 /**
  * Read the entire database into an array of size bytes
diff --git a/modules/global-db/include/dap_chain_global_db_driver.h b/modules/global-db/include/dap_chain_global_db_driver.h
index e9c6670fbf24eb05bf5fcbd301f3998028d04e99..ce523785ad25e9b9b94f5ceae34eb340d9cf6e9b 100644
--- a/modules/global-db/include/dap_chain_global_db_driver.h
+++ b/modules/global-db/include/dap_chain_global_db_driver.h
@@ -40,10 +40,10 @@ typedef struct dap_store_obj {
     uint64_t id;
     uint64_t timestamp;
     uint32_t type;                               /* Operation type: ADD/DELETE, see DAP_DB$K_OPTYPE_* constants */
-    char *group;
-    char *key;
+    const char *group;
+    const char *key;
     const char *c_key;
-    uint8_t *value;
+    const uint8_t *value;
     uint64_t value_len;
 }DAP_ALIGN_PACKED dap_store_obj_t, *pdap_store_obj_t;
 
diff --git a/modules/global-db/include/dap_chain_global_db_driver_pgsql.h b/modules/global-db/include/dap_chain_global_db_driver_pgsql.h
index 78fb58e3dabc39d33ca5e4ddabd42f8dc513adef..5d59b15b1311b1b989e208c46ecfd781eaab478e 100644
--- a/modules/global-db/include/dap_chain_global_db_driver_pgsql.h
+++ b/modules/global-db/include/dap_chain_global_db_driver_pgsql.h
@@ -9,7 +9,7 @@
 #define DAP_PGSQL_POOL_COUNT        16
 #define PGSQL_INVALID_TABLE         "42P01"
 
-int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback);
+int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback, bool a_async_mode);
 int dap_db_driver_pgsql_deinit();
 int dap_db_driver_pgsql_start_transaction(void);
 int dap_db_driver_pgsql_end_transaction(void);
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index e7080e4b9c1317e9655dbddbe8fcb06b3baba9f6..3caefa9b72fff61d4dc365f59f48f6c41364ad4a 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -77,7 +77,7 @@ int dap_datum_mempool_init(void)
  * @param a_datum
  * @return
  */
-char *dap_chain_mempool_datum_add(const dap_chain_datum_t * a_datum, const dap_chain_t * a_chain )
+char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t *a_chain)
 {
     if( a_datum == NULL){
         log_it(L_ERROR, "NULL datum trying to add in mempool");
@@ -90,7 +90,7 @@ char *dap_chain_mempool_datum_add(const dap_chain_datum_t * a_datum, const dap_c
     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
     char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain);
 
-    if(dap_chain_global_db_gr_set( l_key_str, a_datum, dap_chain_datum_size(a_datum), l_gdb_group)) {
+    if (dap_chain_global_db_gr_set(l_key_str, a_datum, dap_chain_datum_size(a_datum), l_gdb_group)) {
         log_it(L_NOTICE, "Datum with data's hash %s was placed in mempool", l_key_str);
     } else {
         log_it(L_WARNING, "Can't place data's hash %s was placed in mempool", l_key_str);
diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h
index 56dc212e3eb3957c3e1065f27a5bade5cac5f6e4..4ecf470e0bddcf7f2f05fea13d0d7a23e57298f8 100644
--- a/modules/mempool/include/dap_chain_mempool.h
+++ b/modules/mempool/include/dap_chain_mempool.h
@@ -43,7 +43,7 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum);
 
 void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url);
 
-char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, const dap_chain_t *a_chain);
+char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t *a_chain);
 dap_hash_fast_t*  dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from,
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index edb8e96262f4b8573b28eb96314ef8dae0599cf0..bab62c72b1c4df00440011611066e3501aba71df 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -417,16 +417,19 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
             l_group = (char *)a_group;
         }
         dap_store_obj_t *l_obj = (dap_store_obj_t *)dap_chain_global_db_obj_get(a_key, l_group);
-        if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) {
-            DAP_DELETE(l_group);
-        }
         if (!l_obj) {
+            if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) {
+                DAP_DELETE(l_group);
+            }
             log_it(L_DEBUG, "Notified GDB event does not exist");
             return;
         }
         l_obj->type = a_op_code;
-        DAP_DELETE(l_obj->group);
-        l_obj->group = dap_strdup(a_group);
+        DAP_DELETE((char *)l_obj->group);
+        l_obj->group = dap_strdup(l_group);
+        if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) {
+            DAP_DELETE(l_group);
+        }
         dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj);
         dap_store_obj_free(l_obj, 1);
         dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb");
@@ -1805,7 +1808,6 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                     return -11;
                 }
                 ret = dap_chain_global_db_gr_del(l_hash_string, l_gdb_group_str);
-                DAP_DELETE(l_hash_string);
                 DAP_DELETE(l_gdb_group_str);
                 if (!ret) {
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Cant't find certificate public key hash in database");
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 109be05169e0e4d2deb307b111909b423126a7a6..05564dc4e22265c9b24d1c075702245cb8991ce7 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -4435,7 +4435,7 @@ int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply)
             dap_enc_base64_decode(l_value_str, strlen(l_value_str), l_val, DAP_ENC_DATA_TYPE_B64);
             l_group_store[j].value  = (uint8_t*)l_val;
         }
-        if (dap_chain_global_db_driver_appy(l_group_store, l_records_count)) {
+        if (dap_chain_global_db_driver_apply(l_group_store, l_records_count)) {
             log_it(L_CRITICAL, "An error occured on importing group %s...", l_group_name);
         }
         //dap_store_obj_free(l_group_store, l_records_count);
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index a2416a54bdc94de1536463d9717ea4c852b45fb5..ff03823de2f918c4e952f55fbb476b0ae4783718 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -92,16 +92,23 @@ size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order)
     if (!a_order)
         return 0;
     size_t l_sign_size = 0;
-    size_t l_header_size = sizeof(dap_chain_net_srv_order_old_t);
-    if (a_order->version > 1) {
+    if (a_order->version == 3) {
         dap_sign_t *l_sign = (dap_sign_t *)&a_order->ext_n_sign[a_order->ext_size];
         if (l_sign->header.type.type == SIG_TYPE_NULL)
             l_sign_size = sizeof(dap_sign_type_t);
         else
             l_sign_size = dap_sign_get_size(l_sign);
-        l_header_size = sizeof(dap_chain_net_srv_order_t);
+        return sizeof(dap_chain_net_srv_order_t) + a_order->ext_size + l_sign_size;
     }
-    return l_header_size + a_order->ext_size + l_sign_size;
+    dap_chain_net_srv_order_old_t *l_order = (dap_chain_net_srv_order_old_t *)a_order;
+    if(l_order->version == 2) {
+        dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size];
+        if (l_sign->header.type.type == SIG_TYPE_NULL)
+            l_sign_size = sizeof(dap_sign_type_t);
+        else
+            l_sign_size = dap_sign_get_size(l_sign);
+    }
+    return sizeof(dap_chain_net_srv_order_old_t) + l_order->ext_size + l_sign_size;
 }
 
 /**
@@ -277,7 +284,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(
         )
 {
     UNUSED(a_expires);
-    if (!a_net)
+    if (!a_net && !a_key)   // Order must have network & sign
         return NULL;
     dap_chain_net_srv_order_t *l_order;
     if (a_ext_size) {
@@ -290,7 +297,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(
         dap_chain_net_srv_order_set_continent_region(&l_order, a_continent_num, a_region);
     }
 
-    l_order->version = 2;
+    l_order->version = 3;
     l_order->srv_uid = a_srv_uid;
     l_order->direction = a_direction;
     l_order->ts_created = (dap_chain_time_t) time(NULL);
@@ -304,21 +311,13 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(
 
     if ( a_price_ticker)
         strncpy(l_order->price_ticker, a_price_ticker,sizeof(l_order->price_ticker)-1);
-    if (a_key) {
-        dap_sign_t *l_sign = dap_sign_create(a_key, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size, 0);
-        if (!l_sign) {
-            return NULL;
-        }
-        size_t l_sign_size = dap_sign_get_size(l_sign); // sign data
-        l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + l_sign_size);
-        memcpy(&l_order->ext_n_sign[l_order->ext_size], l_sign, l_sign_size);
-        DAP_DELETE(l_sign);
-    } else {
-        dap_sign_type_t l_type = { .type = SIG_TYPE_NULL };
-        l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + sizeof(dap_sign_type_t));
-        memcpy(&l_order->ext_n_sign[l_order->ext_size], &l_type, sizeof(dap_sign_type_t));
+    dap_sign_t *l_sign = dap_sign_create(a_key, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size, 0);
+    if (!l_sign) {
+        return NULL;
     }
-
+    size_t l_sign_size = dap_sign_get_size(l_sign); // sign data
+    l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + l_sign_size);
+    memcpy(&l_order->ext_n_sign[l_order->ext_size], l_sign, l_sign_size);
     return l_order;
 }
 
@@ -345,6 +344,41 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord
     return l_order_hash_str;
 }
 
+dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order)
+{
+    if (((dap_chain_net_srv_order_t *)a_order)->version == 3)
+        return DAP_DUP_SIZE(a_order, dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)a_order));
+    dap_chain_net_srv_order_old_t *l_old = (dap_chain_net_srv_order_old_t *)a_order;
+    size_t l_ret_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_old) +
+                            sizeof(dap_chain_net_srv_order_t) - sizeof(dap_chain_net_srv_order_old_t);
+    if (l_old->version == 1)
+        l_ret_size += sizeof(dap_sign_type_t);
+    dap_chain_net_srv_order_t *l_ret = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_ret_size);
+    l_ret->version = 3;
+#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
+    l_ret->srv_uid.uint64 = l_old->srv_uid.uint64;
+#else
+    l_ret->srv_uid.uint128 = dap_chain_uint128_from(l_old->srv_uid.uint64);
+#endif
+    l_ret->direction = l_old->direction;
+    l_ret->node_addr.uint64 = l_old->node_addr.uint64;
+    memcpy(&l_ret->tx_cond_hash, &l_old->tx_cond_hash, sizeof(dap_chain_hash_fast_t));
+    l_ret->price_unit.uint32 = l_old->price_unit.uint32;
+    l_ret->ts_created = l_old->ts_created;
+    l_ret->ts_expires = l_old->ts_expires;
+    l_ret->price = dap_chain_uint256_from(l_old->price);
+    strncpy(l_ret->price_ticker, l_old->price_ticker, DAP_CHAIN_TICKER_SIZE_MAX);
+    l_ret->ext_size = l_old->ext_size;
+    memcpy(&l_ret->ext_n_sign, &l_old->ext, l_old->ext_size);
+    dap_sign_t *l_sign = (dap_sign_t *)&l_old->ext[l_old->ext_size];
+    size_t l_sign_size = l_old->version == 1 ? 0 : dap_sign_get_size(l_sign);
+    if (l_sign_size)
+        memcpy(&l_ret->ext_n_sign[l_ret->ext_size], l_sign, l_sign_size);
+    else
+        ((dap_sign_type_t *)&l_ret->ext_n_sign[l_ret->ext_size])->type = SIG_TYPE_NULL;
+    return l_ret;
+}
+
 
 /**
  * @brief dap_chain_net_srv_order_find_by_hash_str
@@ -389,83 +423,60 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_
                                         const uint256_t a_price_min, const uint256_t a_price_max,
                                         dap_chain_net_srv_order_t ** a_output_orders, size_t * a_output_orders_count)
 {
-    if ( a_net && a_output_orders && a_output_orders_count ){
-        char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net);
-        size_t l_orders_count = 0;
-        dap_global_db_obj_t * l_orders = dap_chain_global_db_gr_load(l_gdb_group_str,&l_orders_count);
-        log_it( L_DEBUG ,"Loaded %zd orders", l_orders_count);
-        bool l_order_pass_first=true;
-        size_t l_order_passed_index;
-        size_t l_orders_size;
-lb_order_pass:
-        l_order_passed_index = 0;
-        l_orders_size = 0;
-        for (size_t i=0; i< l_orders_count; i++){
-            dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *)l_orders[i].value;
-            if (l_order_pass_first) {
-                if (l_order->version > 2 || l_order->direction > SERV_DIR_SELL ||
-                        dap_chain_net_srv_order_get_size(l_order) != l_orders[i].value_len) {
-                    dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str);
-                    continue; // order is corrupted
-                }
-                dap_chain_hash_fast_t l_hash, l_hash_gdb;
-                dap_hash_fast(l_order, dap_chain_net_srv_order_get_size(l_order), &l_hash);
-                dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb);
-                if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) {
-                    dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str);
-                    continue; // order is corrupted
-                }
-            }
-            // Check direction
-            if (a_direction != SERV_DIR_UNDEFINED )
-                if ( l_order->direction != a_direction )
-                    continue;
-
-            // Check srv uid
-            if ( a_srv_uid.uint64 )
-                if ( l_order->srv_uid.uint64 != a_srv_uid.uint64 )
-                    continue;
-            // check price unit
-            if ( a_price_unit.uint32 )
-                if ( a_price_unit.uint32 != l_order->price_unit.uint32 )
-                    continue;
-            // Check price minimum
-            if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1)
-                    continue;
-            // Check price maximum
-            if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1)
-                    continue;
-            // Check ticker
-            if ( a_price_ticker )
-                if ( strcmp( l_order->price_ticker, a_price_ticker) != 0 )
-                    continue;
-
-            if( !l_order_pass_first ){
-                size_t l_order_size = dap_chain_net_srv_order_get_size(l_order);
-                memcpy((char*)*a_output_orders + l_orders_size, l_order, l_order_size);
-                l_orders_size += l_order_size;
-            }
-            else
-                // calc size of all orders
-                l_orders_size += dap_chain_net_srv_order_get_size(l_order);
-            l_order_passed_index++;
-
+    if (!a_net || !a_output_orders || !a_output_orders_count)
+        return -1;
+    char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net);
+    size_t l_orders_count = 0;
+    dap_global_db_obj_t *l_orders = dap_chain_global_db_gr_load(l_gdb_group_str, &l_orders_count);
+    log_it( L_DEBUG, "Loaded %zu orders", l_orders_count);
+    dap_chain_net_srv_order_t *l_order = NULL;
+    *a_output_orders = NULL;
+    *a_output_orders_count = 0;
+    size_t l_orders_size = 0;
+    for (size_t i = 0; i < l_orders_count; i++) {
+        DAP_DEL_Z(l_order);
+        l_order = dap_chain_net_srv_order_read(l_orders[i].value);
+        size_t l_order_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_orders[i].value);
+        if (l_order->version > 3 || l_order->direction > SERV_DIR_SELL ||
+                l_order_size != l_orders[i].value_len) {
+            dap_chain_global_db_gr_del(l_orders[i].key, l_gdb_group_str);
+            continue; // order is corrupted
         }
-        // Dirty goto usage ho ho ho
-        if (l_order_pass_first) {
-            l_order_pass_first = false;
-            *a_output_orders_count = l_order_passed_index;
-            if(l_orders_size)
-                *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_orders_size);
-            goto lb_order_pass;
+        dap_chain_hash_fast_t l_hash, l_hash_gdb;
+        dap_hash_fast(l_orders[i].value, l_order_size, &l_hash);
+        dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb);
+        if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) {
+            dap_chain_global_db_gr_del(l_orders[i].key, l_gdb_group_str);
+            continue; // order is corrupted
         }
-        // If we here - its the second pass through
-
-        dap_chain_global_db_objs_delete(l_orders, l_orders_count);
-        DAP_DELETE( l_gdb_group_str);
-        return 0;
+        // Check direction
+        if (a_direction != SERV_DIR_UNDEFINED && l_order->direction != a_direction)
+            continue;
+        // Check srv uid
+        if (a_srv_uid.uint64 && l_order->srv_uid.uint64 != a_srv_uid.uint64)
+            continue;
+        // check price unit
+        if (a_price_unit.uint32 && a_price_unit.uint32 != l_order->price_unit.uint32)
+            continue;
+        // Check price minimum
+        if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1)
+            continue;
+        // Check price maximum
+        if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1)
+            continue;
+        // Check ticker
+        if (a_price_ticker && strcmp( l_order->price_ticker, a_price_ticker))
+            continue;
+        size_t l_order_mem_size = dap_chain_net_srv_order_get_size(l_order);
+        *a_output_orders = DAP_REALLOC(*a_output_orders, l_orders_size + l_order_mem_size);
+        memcpy((byte_t *)*a_output_orders + l_orders_size, l_order, l_order_mem_size);
+        l_orders_size += l_order_mem_size;
+        a_output_orders_count++;
     }
-    return -1;
+    DAP_DEL_Z(l_order);
+    dap_chain_global_db_objs_delete(l_orders, l_orders_count);
+    DAP_DELETE(l_gdb_group_str);
+    return 0;
 }
 
 /**
diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h
index 54220f22e028a0257ed60ab36c885b0b30481973..93a92d529263c41a5db437433a80c1bf35b81ae7 100644
--- a/modules/net/srv/include/dap_chain_net_srv_order.h
+++ b/modules/net/srv/include/dap_chain_net_srv_order.h
@@ -52,8 +52,11 @@ typedef struct dap_chain_net_srv_order
 {
     uint16_t version;
     dap_chain_net_srv_uid_t srv_uid; // Service UID
-    byte_t padding; // some padding
+#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
+    byte_t padding[8];
+#endif
     dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE
+    byte_t padding_dir[3];
     dap_chain_node_addr_t node_addr; // Node address that servs the order (if present)
     dap_chain_hash_fast_t tx_cond_hash; // Hash index of conditioned transaction attached with order
     dap_chain_net_srv_price_unit_uid_t price_unit; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
@@ -61,8 +64,8 @@ typedef struct dap_chain_net_srv_order
     dap_chain_time_t ts_expires;
     uint256_t price; //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
     char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service
-    byte_t free_space[128];  // for future changes
     uint32_t ext_size;
+    byte_t free_space[128];  // for future changes
     uint8_t ext_n_sign[];
 } DAP_ALIGN_PACKED dap_chain_net_srv_order_t;