diff --git a/bindings/lua_swupdate.c b/bindings/lua_swupdate.c
index 2fa0b61..d17a596 100644
--- a/bindings/lua_swupdate.c
+++ b/bindings/lua_swupdate.c
@@ -137,7 +137,7 @@ static int ctrl_connect(lua_State *L) {
 		return 2;
 	}
 
-	int connfd = ipc_inst_start_ext(SOURCE_LOCAL, 0, NULL, false);
+	int connfd = ipc_inst_start_ext(SOURCE_LOCAL, NULL, 0);
 	if (connfd < 0) {
 		lua_pop(L, 1);
 		lua_pushnil(L);
diff --git a/corelib/channel_curl.c b/corelib/channel_curl.c
index a91cf5f..5c80770 100644
--- a/corelib/channel_curl.c
+++ b/corelib/channel_curl.c
@@ -1037,11 +1037,14 @@ channel_op_res_t channel_get_file(channel_t *this, void *data)
 		goto cleanup_header;
 	}
 
+	struct swupdate_request req;
+	swupdate_prepare_req(&req);
+	req.dry_run = channel_data->dry_run;
+	req.len = channel_data->info == NULL ? 0 : strlen(channel_data->info);
+	req.info = channel_data->info;
 	for (int retries = 3; retries >= 0; retries--) {
 		file_handle = ipc_inst_start_ext(channel_data->source,
-			channel_data->info == NULL ? 0 : strlen(channel_data->info),
-			channel_data->info,
-			channel_data->dry_run);
+			&req, sizeof(struct swupdate_request));
 		if (file_handle > 0)
 			break;
 		sleep(1);
diff --git a/include/network_ipc.h b/include/network_ipc.h
index b30f10b..18da134 100644
--- a/include/network_ipc.h
+++ b/include/network_ipc.h
@@ -11,6 +11,7 @@
 
 #include <stdlib.h>
 #include <stdbool.h>
+#include <string.h>
 #include "swupdate_status.h"
 
 #ifdef __cplusplus
@@ -34,7 +35,8 @@ typedef enum {
 	SWUPDATE_SUBPROCESS,
 	REQ_INSTALL_DRYRUN,
 	SET_AES_KEY,
-	SET_UPDATE_STATE	/* set bootloader ustate */
+	SET_UPDATE_STATE,	/* set bootloader ustate */
+	REQ_INSTALL_EXT
 } msgtype;
 
 /*
@@ -77,9 +79,24 @@ typedef struct {
 	msgdata data;
 } ipc_message;
 
+#define SWUPDATE_API_VERSION 	0x1
+/*
+ * Install structure to be filled before calling
+ * ipc and async functions
+ */
+struct swupdate_request {
+	unsigned int apiversion;
+	int type;
+	bool dry_run;
+	size_t len;
+	const char *info;
+	char *software_set;
+	char *running_mode;
+};
+
 char *get_ctrl_socket(void);
 int ipc_inst_start(void);
-int ipc_inst_start_ext(sourcetype source, size_t len, const char *info, bool dry_run);
+int ipc_inst_start_ext(sourcetype source, void *priv, ssize_t size);
 int ipc_send_data(int connfd, char *buf, int size);
 void ipc_end(int connfd);
 int ipc_get_status(ipc_message *msg);
@@ -91,9 +108,11 @@ typedef int (*writedata)(char **buf, int *size);
 typedef int (*getstatus)(ipc_message *msg);
 typedef int (*terminated)(RECOVERY_STATUS status);
 int ipc_wait_for_complete(getstatus callback);
+void swupdate_prepare_req(struct swupdate_request *req);
 int swupdate_image_write(char *buf, int size);
 int swupdate_async_start(writedata wr_func, getstatus status_func,
-				terminated end_func, bool dry_run);
+				terminated end_func,
+				void *priv, ssize_t size);
 int swupdate_set_aes(char *key, char *ivt);
 
 #ifdef __cplusplus
diff --git a/ipc/network_ipc-if.c b/ipc/network_ipc-if.c
index 6db1522..ba521ec 100644
--- a/ipc/network_ipc-if.c
+++ b/ipc/network_ipc-if.c
@@ -108,7 +108,7 @@ static pthread_t start_ipc_thread(void *(* start_routine) (void *), void *arg)
  * Only one running request is accepted
  */
 int swupdate_async_start(writedata wr_func, getstatus status_func,
-				terminated end_func, bool dry_run)
+				terminated end_func, void *priv, ssize_t size)
 {
 	struct async_lib *rq;
 	int connfd;
@@ -122,7 +122,7 @@ int swupdate_async_start(writedata wr_func, getstatus status_func,
 	rq->get = status_func;
 	rq->end = end_func;
 
-	connfd = ipc_inst_start_ext(SOURCE_UNKNOWN, 0, NULL, dry_run);
+	connfd = ipc_inst_start_ext(SOURCE_UNKNOWN, priv, size);
 
 	if (connfd < 0)
 		return connfd;
@@ -171,3 +171,11 @@ int swupdate_set_aes(char *key, char *ivt)
 
 	return ipc_send_cmd(&msg);
 }
+
+void swupdate_prepare_req(struct swupdate_request *req) {
+	if (!req)
+		return;
+	memset(req, 0, sizeof(struct swupdate_request));
+	req->apiversion = SWUPDATE_API_VERSION;
+	return;
+}
diff --git a/ipc/network_ipc.c b/ipc/network_ipc.c
index 9b5d811..d817ffc 100644
--- a/ipc/network_ipc.c
+++ b/ipc/network_ipc.c
@@ -11,6 +11,7 @@
 #include <string.h>
 #include <strings.h>
 #include <unistd.h>
+#include <errno.h>
 #include <sys/socket.h>
 #include <sys/select.h>
 #include <sys/un.h>
@@ -175,12 +176,24 @@ int ipc_get_status_timeout(ipc_message *msg, unsigned int timeout_ms)
 	return ret;
 }
 
-int ipc_inst_start_ext(sourcetype source, size_t len, const char *buf, bool dry_run)
+int ipc_inst_start_ext(sourcetype source, void *priv, ssize_t size)
 {
 	int connfd;
 	ipc_message msg;
 	ssize_t ret;
-
+	bool dry_run = false;
+	struct swupdate_request *req = NULL;
+	size_t len = 0;
+	const char *buf = NULL;
+
+	if (priv) {
+		if (size != sizeof(struct swupdate_request))
+			return -EINVAL;
+		req = (struct swupdate_request *)priv;
+		dry_run = req->dry_run;
+		len = req->len;
+		buf = req->info;
+	}
 	connfd = prepare_ipc();
 	if (connfd < 0)
 		return -1;
@@ -233,7 +246,7 @@ int ipc_inst_start_ext(sourcetype source, size_t len, const char *buf, bool dry_
  */
 int ipc_inst_start(void)
 {
-	return ipc_inst_start_ext(SOURCE_UNKNOWN, 0, NULL, false);
+	return ipc_inst_start_ext(SOURCE_UNKNOWN, NULL, 0);
 }
 
 /*
diff --git a/mongoose/mongoose_interface.c b/mongoose/mongoose_interface.c
index 588f62a..d34262b 100644
--- a/mongoose/mongoose_interface.c
+++ b/mongoose/mongoose_interface.c
@@ -288,7 +288,11 @@ static void upload_handler(struct mg_connection *nc, int ev, void *p)
 			break;
 		}
 
-		fus->fd = ipc_inst_start_ext(SOURCE_WEBSERVER, strlen(mp->file_name), mp->file_name, false);
+		struct swupdate_request req;
+		swupdate_prepare_req(&req);
+		req.len = strlen(mp->file_name);
+		req.info = mp->file_name;
+		fus->fd = ipc_inst_start_ext(SOURCE_WEBSERVER, &req, sizeof(req));
 		if (fus->fd < 0) {
 			mg_http_send_error(nc, 500, "Failed to queue command");
 			free(fus);
diff --git a/tools/swupdate-client.c b/tools/swupdate-client.c
index 32928f5..0dc19a2 100644
--- a/tools/swupdate-client.c
+++ b/tools/swupdate-client.c
@@ -129,8 +129,11 @@ static int send_file(const char* filename) {
 	/* May be set non-zero by end() function on failure */
 	end_status = EXIT_SUCCESS;
 
+	struct swupdate_request req;
+	swupdate_prepare_req(&req);
+	req.dry_run = dry_run;
 	rc = swupdate_async_start(readimage, printstatus,
-				end, dry_run);
+				end, &req, sizeof(req));
 
 	/* return if we've hit an error scenario */
 	if (rc < 0) {
