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/src/dap_json_rpc_params.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_params.c
index 3e3f98fe5ef0981df47d4ce4cf3e60a0aea572da..f5c4de2f7aa384bc31f3fced15944aab9bf401a9 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
@@ -136,7 +136,7 @@ dap_json_rpc_params_t * dap_json_rpc_params_create_from_array_list(json_object *
 
 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)
+    if (a_method == NULL )
         return NULL;
     dap_json_rpc_params_t *params = dap_json_rpc_params_create();
 
@@ -166,21 +166,40 @@ dap_json_rpc_params_t * dap_json_rpc_params_create_from_subcmd_and_args(json_obj
             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;
+
+    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;
+            }
         }
     }
 
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 c217f1e6576d9c0768f1d900c437ab5de7770fcf..be4e112cf34f57d77cfb0efd8a4708eacc0d3975 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
@@ -237,6 +237,7 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data)
                 *jobj_id = NULL,
                 *jobj_method = NULL,
                 *jobj_params = NULL,
+                *jobj_subcmd = NULL,
                 *l_arguments_obj = NULL;
     if (jterr == json_tokener_success)
         do {
@@ -254,15 +255,16 @@ 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))
-                request->params = dap_json_rpc_params_create_from_array_list(jobj_params);
-            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;
+            if(!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 
+                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);