diff --git a/CMakeLists.txt b/CMakeLists.txt
index f3633b819cf59e489340dfd74522eb695ae63020..6674d2d72a5583ec16cdf69cb9d6bfe559a16b91 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 2.8)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.6-54")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.6-55")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 
 set(DAPSDK_MODULES "")
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 97984100805038c474e8d6815424dd269eef1219..5d635959b24720673871e6e768a148e03365c3d1 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -565,12 +565,10 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                     (dap_stream_ch_chain_sync_request_t *) l_chain_pkt->data;
             memcpy(&l_ch_chain->request, l_request, l_chain_pkt_data_size);
             memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
-
-            dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
-            dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch);
             log_it(L_INFO, "In:  SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u",
                    l_ch_chain->request_hdr.net_id.uint64 , l_ch_chain->request_hdr.chain_id.uint64,
                    l_ch_chain->request_hdr.cell_id.uint64, l_ch_chain->request.id_start, l_ch_chain->request.id_end );
+
             if(l_ch_chain->state != CHAIN_STATE_IDLE) {
                 log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state");
                 dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
@@ -583,10 +581,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             else {
                 log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request",
                         a_ch->stream->session->id);
-                dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
-                        l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
-                        "ERROR_SYNC_GLOBAL_DB_REQUEST_BAD");
-                dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
+                dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
+                dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch);
             }
         }else{
             log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
@@ -607,7 +603,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             log_it(L_WARNING,"Incorrect data size %zd in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN", l_chain_pkt_data_size);
             dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
                     l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
-                    "ERROR_CHAIN_PACKET_TYPE_FIRST_CHAIN_INCORRET_DATA_SIZE");
+                    "ERROR_CHAIN_PACKET_TYPE_FIRST_CHAIN_INCORRET_DATA_SIZE(%zd/%zd)",l_chain_pkt_data_size, sizeof(dap_chain_node_addr_t));
         }
     }
         break;
diff --git a/modules/channel/chain/include/dap_stream_ch_chain_pkt.h b/modules/channel/chain/include/dap_stream_ch_chain_pkt.h
index ae718a35bf8de012426777f25357c9e5b2c13224..4fd1b254e7077bd551d2a944f64b50d396551caa 100644
--- a/modules/channel/chain/include/dap_stream_ch_chain_pkt.h
+++ b/modules/channel/chain/include/dap_stream_ch_chain_pkt.h
@@ -26,6 +26,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <string.h>
+#include <stdarg.h>
 
 #include "dap_common.h"
 #include "dap_chain_common.h"
@@ -55,9 +56,9 @@
 
 typedef enum dap_stream_ch_chain_state{
     CHAIN_STATE_IDLE=0,
-    CHAIN_STATE_SYNC_CHAINS,
-    CHAIN_STATE_SYNC_GLOBAL_DB,
-    CHAIN_STATE_SYNC_ALL
+    CHAIN_STATE_SYNC_CHAINS=1,
+    CHAIN_STATE_SYNC_GLOBAL_DB=2,
+    CHAIN_STATE_SYNC_ALL=3
 } dap_stream_ch_chain_state_t;
 
 typedef struct dap_stream_ch_chain_sync_request{
@@ -106,7 +107,20 @@ size_t dap_stream_ch_chain_pkt_write_mt(dap_stream_worker_t *a_worker, dap_strea
                                         const void * a_data, size_t a_data_size);
 
 inline static size_t dap_stream_ch_chain_pkt_write_error(dap_stream_ch_t *a_ch, dap_chain_net_id_t a_net_id,
-                                                  dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, const char * a_err_string )
+                                                  dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, const char * a_err_string_format,... )
 {
-    return  dap_stream_ch_chain_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, a_net_id, a_chain_id, a_cell_id, a_err_string,strlen (a_err_string)+1 );
+    va_list l_va;
+    char * l_str;
+    va_start(l_va, a_err_string_format);
+    int l_size = vsnprintf(NULL,0,a_err_string_format,l_va);
+    if(l_size >0){
+        l_size++;
+        l_str = DAP_NEW_S_SIZE(char, l_size);
+        vsnprintf(l_str,l_size,a_err_string_format,l_va);
+        va_end(l_va);
+        return  dap_stream_ch_chain_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, a_net_id, a_chain_id, a_cell_id, l_str,l_size );
+    }else{
+        va_end(l_va);
+        return 0;
+    }
 }
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index aac0e599e44eb706b08d5701a8f42af536baa53f..940b411ceb809fc9e4e1466bfcd6a09f3ead25fa 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -99,8 +99,9 @@
 
 #define LOG_TAG "chain_net"
 
-#define F_DAP_CHAIN_NET_SHUTDOWN  ( 1 << 9 )
-#define F_DAP_CHAIN_NET_GO_SYNC   ( 1 << 10 )
+#define F_DAP_CHAIN_NET_SYNC_FROM_ZERO   ( 1 << 8 )
+#define F_DAP_CHAIN_NET_SHUTDOWN         ( 1 << 9 )
+#define F_DAP_CHAIN_NET_GO_SYNC          ( 1 << 10 )
 
 // maximum number of connections
 static size_t s_max_links_count = 5;// by default 5
@@ -1124,6 +1125,12 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply)
             }
 
         } else if( l_sync_str) {
+
+            const char * l_sync_mode_str = "updates";
+            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-mode", &l_sync_mode_str);
+            if ( !dap_strcmp(l_sync_mode_str,"all") )
+                dap_chain_net_get_flag_sync_from_zero(l_net);
+
             if ( strcmp(l_sync_str,"all") == 0 ) {
                 dap_chain_node_cli_set_reply_text(a_str_reply,
                                                   "SYNC_ALL state requested to state machine. Current state: %s\n",
@@ -2016,6 +2023,29 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net)
     return l_node_list;
 }
 
+/**
+ * @brief dap_chain_net_set_flag_sync_from_zero
+ * @param a_net
+ * @param a_flag_sync_from_zero
+ */
+void dap_chain_net_set_flag_sync_from_zero( dap_chain_net_t * a_net, bool a_flag_sync_from_zero)
+{
+    if( a_flag_sync_from_zero)
+        PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;
+    else
+        PVT(a_net)->flags ^= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;
+}
+
+/**
+ * @brief dap_chain_net_get_flag_sync_from_zero
+ * @param a_net
+ * @return
+ */
+bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net)
+{
+    return PVT(a_net)->flags &F_DAP_CHAIN_NET_SYNC_FROM_ZERO ;
+}
+
 /**
  * @brief dap_chain_net_proc_datapool
  * @param a_net
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index c59c2aee0fc5398353d28912c1f1609eda16d752..f35e099d4680f994c652d55afc179fcc8af90dcc 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -85,6 +85,9 @@ inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_c
 
 void dap_chain_net_delete( dap_chain_net_t * a_net);
 void dap_chain_net_proc_mempool (dap_chain_net_t * a_net);
+void dap_chain_net_set_flag_sync_from_zero( dap_chain_net_t * a_net, bool a_flag_sync_from_zero);
+bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net);
+
 
 dap_chain_net_t * dap_chain_net_by_name( const char * a_name);
 dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id);