diff --git a/core/include/dap_common.h b/core/include/dap_common.h
index 164650a209ba341640698c6b852535f6282159aa..a21aa11a79b6c3af5964813ebb44997be6a57174 100755
--- a/core/include/dap_common.h
+++ b/core/include/dap_common.h
@@ -61,10 +61,11 @@
 #ifndef __cplusplus
 # include <stdatomic.h>
 #else
-# include <atomic>
-# define _Atomic(X) std::atomic< X >
+#include <atomic>
+#define _Atomic(X) std::atomic< X >
 #define atomic_bool _Atomic(bool)
 #define atomic_uint _Atomic(uint)
+#define atomic_int _Atomic(int)
 #endif
 
 #ifdef __MACH__
diff --git a/crypto/include/dap_guuid.h b/crypto/include/dap_guuid.h
index 44cb53e08baab7b30ceb880366e1ff55d059a871..51d9f1c9c1926bea7abf34ee949e7a46dfe33061 100644
--- a/crypto/include/dap_guuid.h
+++ b/crypto/include/dap_guuid.h
@@ -45,7 +45,7 @@ static inline dap_guuid_t dap_guuid_new()
 
 DAP_STATIC_INLINE dap_guuid_t dap_guuid_compose(uint64_t a_net_id, uint64_t a_service_id)
 {
-    return (dap_guuid_t){ .net_id = a_net_id, .srv_id = a_service_id };
+    return (dap_guuid_t){{ .net_id = a_net_id, .srv_id = a_service_id }};
 }
 dap_guuid_str_t dap_guuid_to_hex_str_(dap_guuid_t a_guuid);
 #define dap_guuid_to_hex_str(guid) dap_guuid_to_hex_str_(guid).s
diff --git a/net/link_manager/CMakeLists.txt b/net/link_manager/CMakeLists.txt
index dea1cd3d086193bf2e7080d2ec366d0eabcb7c40..43690c742af8ff7bb8fd54e6a3f700a78b70af76 100644
--- a/net/link_manager/CMakeLists.txt
+++ b/net/link_manager/CMakeLists.txt
@@ -23,7 +23,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE .)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src)
 
 if(INSTALL_DAP_SDK)
-set_target_properties(${PROJECT_NAME}  PROPERTIES PUBLIC_HEADER "${DAP_CLIENT_HEADERS}")
+set_target_properties(${PROJECT_NAME}  PROPERTIES PUBLIC_HEADER "${DAP_LINK_MANAGER_HEADERS}")
 INSTALL(TARGETS ${PROJECT_NAME} 
         LIBRARY DESTINATION lib/dap/net/link_manager/
         ARCHIVE DESTINATION lib/dap/net/link_manager/
diff --git a/net/server/cli_server/dap_cli_server.c b/net/server/cli_server/dap_cli_server.c
index 6f427f282164b292930a2cf8c733d772ff214e9e..612040c655f4fa00fe53a45bb40edd9dfe371da4 100644
--- a/net/server/cli_server/dap_cli_server.c
+++ b/net/server/cli_server/dap_cli_server.c
@@ -210,6 +210,7 @@ int is_json_clear_method(const char *a_name) {
     return 0;
 }
 
+
 int json_commands(const char * a_name) {
     static const char* long_cmd[] = {
             "tx_history",
diff --git a/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h b/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h
index 1bc7872a85ce3139b2164a72199affb4f252c9ae..82d2ad7ff1480d0b402d94252311066f64e292da 100644
--- a/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h
+++ b/net/server/json_rpc/rpc_core/include/dap_json_rpc_params.h
@@ -137,6 +137,8 @@ dap_json_rpc_type_param_t dap_json_rpc_params_get_type_param(dap_json_rpc_params
  */
 dap_json_rpc_params_t * dap_json_rpc_params_create_from_array_list(json_object *a_array_list);
 
+dap_json_rpc_params_t * dap_json_rpc_params_create_from_subcmd_and_args(json_object *a_subcmd, json_object *a_args, const char* a_method);
+
 /**
  * Get a JSON string representation of dap_json_rpc_params_t.
  *
diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c
index 6ee00f96ec3c579a31563ca3e7393fcb204645d5..3e3f98fe5ef0981df47d4ce4cf3e60a0aea572da 100644
--- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c
+++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c
@@ -1,4 +1,5 @@
 #include "dap_json_rpc_params.h"
+#include "dap_string.h"
 
 #define LOG_TAG "dap_json_rpc_params"
 
@@ -133,6 +134,64 @@ dap_json_rpc_params_t * dap_json_rpc_params_create_from_array_list(json_object *
     return params;
 }
 
+dap_json_rpc_params_t * dap_json_rpc_params_create_from_subcmd_and_args(json_object *a_subcmd, json_object *a_args, const char* a_method)
+{
+    if (a_method == NULL || a_args == NULL)
+        return NULL;
+    dap_json_rpc_params_t *params = dap_json_rpc_params_create();
+
+    dap_string_t * l_str_tmp = dap_string_new("");
+    // add subcmd to params
+    dap_string_append_printf(l_str_tmp, "%s;", a_method);
+    if(a_subcmd){
+        enum json_type l_subcmd_type = json_object_get_type(a_subcmd);
+        if(l_subcmd_type == json_type_array){
+            int length = json_object_array_length(a_subcmd);
+            
+            for (int i = 0; i < length; i++){
+                json_object *jobj = json_object_array_get_idx(a_subcmd, i);
+                json_type jobj_type = json_object_get_type(jobj);
+
+                if (jobj_type != json_type_string){
+                    log_it(L_ERROR, "Bad subcommand type");
+                    dap_string_free(l_str_tmp, true);
+                    return NULL;
+                }
+
+                dap_string_append_printf(l_str_tmp, "%s;", json_object_get_string(jobj));
+            }
+        } else if (l_subcmd_type == json_type_string) { 
+            dap_string_append_printf(l_str_tmp, "%s;", json_object_get_string( a_subcmd));
+        } else {
+            return log_it(L_CRITICAL, "Subcomand must be array or string type."), dap_string_free(l_str_tmp, true),  NULL;
+        }
+    }
+        
+    json_object_object_foreach(a_args, key, val){
+        const char *l_key_str = NULL;
+        const char *l_val_str = NULL;
+        enum json_type l_subcmd_type = json_object_get_type(val);
+        if(l_subcmd_type == json_type_string || 
+            l_subcmd_type == json_type_null || l_subcmd_type == json_type_object) {
+            l_key_str = key;
+            l_val_str = json_object_get_string(val);
+        } 
+
+        if(l_key_str){
+            dap_string_append_printf(l_str_tmp, "-%s;%s;", l_key_str, l_val_str ? l_val_str : "");
+        } else {
+            return log_it(L_CRITICAL, "Bad argument!"), dap_string_free(l_str_tmp, true),  NULL;
+        }
+    }
+
+    l_str_tmp->str[strlen(l_str_tmp->str) - 1] = '\0';
+
+    dap_json_rpc_params_add_data(params, l_str_tmp->str, TYPE_PARAM_STRING);
+    dap_string_free(l_str_tmp, true);
+
+    return params;
+}
+
 char *dap_json_rpc_params_get_string_json(dap_json_rpc_params_t * a_params)
 {
     dap_return_val_if_fail(a_params, NULL);
diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c
index c4fe280dfda139f4cbcb5e9e6df35331a6a1e0d8..c217f1e6576d9c0768f1d900c437ab5de7770fcf 100644
--- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c
+++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c
@@ -236,7 +236,8 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data)
     json_object *jobj = json_tokener_parse_verbose(a_data, &jterr),
                 *jobj_id = NULL,
                 *jobj_method = NULL,
-                *jobj_params = NULL;
+                *jobj_params = NULL,
+                *l_arguments_obj = NULL;
     if (jterr == json_tokener_success)
         do {
             if (json_object_object_get_ex(jobj, "id", &jobj_id))
@@ -255,11 +256,19 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data)
 
             if (json_object_object_get_ex(jobj, "params", &jobj_params))
                 request->params = dap_json_rpc_params_create_from_array_list(jobj_params);
-            else {
-                log_it(L_ERROR, "Error parse JSON string, Can't find array params for request with id: %" DAP_UINT64_FORMAT_U, request->id);
+            else if(json_object_object_get_ex(jobj, "arguments", &l_arguments_obj)){
+                    json_object_object_get_ex(jobj, "subcommand", &jobj_params);                   
+                    request->params = dap_json_rpc_params_create_from_subcmd_and_args(jobj_params, l_arguments_obj, request->method);
+            } else {
+                log_it(L_ERROR, "Error parse JSON string, Can't find array params or subcomand and arguments for request with id: %" DAP_UINT64_FORMAT_U, request->id);
                 break;
             }
             json_object_put(jobj);
+            if (!request->params){
+                dap_json_rpc_params_remove_all(request->params);
+                DAP_DEL_MULTY(request->method, request);
+                return NULL;
+            }
             return request;
         } while (0);
     else