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/server/json_rpc/rpc_core/CMakeLists.txt b/net/server/json_rpc/rpc_core/CMakeLists.txt
index 1fd3cb30946491a2e6358540b6ab298e0d313910..7d3a1f14cd65f0c0729e4e20b91f65a7e4c21482 100644
--- a/net/server/json_rpc/rpc_core/CMakeLists.txt
+++ b/net/server/json_rpc/rpc_core/CMakeLists.txt
@@ -18,3 +18,12 @@ target_include_directories(${PROJECT_NAME} INTERFACE . include/)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 
 target_link_libraries(${PROJECT_NAME} dap_core dap_json-c dap_client dap_cli_server)
+
+if(INSTALL_DAP_SDK)
+set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${JSON_RPC_CORE_HEADERS}")
+INSTALL(TARGETS ${PROJECT_NAME} 
+        LIBRARY DESTINATION lib/dap/net/server/json_rpc/rpc_core/
+        ARCHIVE DESTINATION lib/dap/net/server/json_rpc/rpc_core/
+        PUBLIC_HEADER DESTINATION include/dap/net/server/json_rpc/rpc_core/
+)
+endif()
\ No newline at end of file
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 42a11bfa517cc9da35d7333cc978ce9d26a91bfa..4bc84c85f06c1120fe08e7ef79eda5852e288aba 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
@@ -136,6 +136,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 901a5b09625d9eccec18525df13ecd2de0faba51..9809915e9839fab1ec2c9670170582ba1f0f465e 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"
 
@@ -118,6 +119,83 @@ 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 )
+        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;
+        }
+    }
+
+    if (a_args){        
+        json_object_object_foreach(a_args, key, val){
+            const char *l_key_str = NULL;
+            const char *l_val_str = NULL;
+            enum json_type l_arg_type = json_object_get_type(val);
+            if(l_arg_type == json_type_string || 
+                l_arg_type == json_type_null || l_arg_type == json_type_object) {
+                l_key_str = key;
+                l_val_str = json_object_get_string(val);
+            } else if(l_arg_type == json_type_array){
+                int length = json_object_array_length(val);
+                dap_string_append_printf(l_str_tmp, "-%s;", key);
+
+                for (int i = 0; i < length; i++){
+                    json_object *jobj = json_object_array_get_idx(val, 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%s", json_object_get_string(jobj), i == length - 1 ? ";" : ",");
+                }
+                continue;
+            }
+
+            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 a17bec4878dba2e5c20cf3252dbc025d50b73273..18eda8317e916117b8384f6c1a3ef764f55071cb 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,9 @@ 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,
+                *jobj_subcmd = NULL,
+                *l_arguments_obj = NULL;
     if (jterr == json_tokener_success)
         do {
             if (json_object_object_get_ex(jobj, "id", &jobj_id))
@@ -253,13 +255,21 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data)
                 break;
             }
 
-            if (json_object_object_get_ex(jobj, "params", &jobj_params))
+            json_object_object_get_ex(jobj, "params", &jobj_params);
+            json_object_object_get_ex(jobj, "subcommand", &jobj_subcmd);
+            json_object_object_get_ex(jobj, "arguments", &l_arguments_obj);
+
+            if (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);
-                break;
-            }
+            else 
+                request->params = dap_json_rpc_params_create_from_subcmd_and_args(jobj_subcmd, l_arguments_obj, request->method);
+
             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