diff --git a/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh b/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh
index 8619310144b7bfcbfa885b5df3c2da0a2ac3590e..57c2caa917498e02df0e7fd13845d75ded136c06 100755
--- a/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh
+++ b/src/files/usr/share/bbfdm/scripts/bbf_activate_handler.sh
@@ -19,6 +19,7 @@ log() {
 
 activate_and_reboot_device() {
 	local bank_id="${1}"
+	local keep_config="${2}"
 	local success
 
 	success=$(ubus call fwbank set_bootbank "{'bank':${bank_id}}" | jsonfilter -e @.success)
@@ -27,6 +28,14 @@ activate_and_reboot_device() {
 		exit 1
 	fi
 
+	if [ "${keep_config}" = "1" ]; then
+		success=$(/etc/sysmngr/fwbank call copy_config 2> /dev/null | jsonfilter -e @.success)
+		if [ "${success}" != "true" ]; then
+			log "Can't copy config"
+			exit 1
+		fi
+	fi
+
 	log "The device will restart after a few seconds"
 	ubus call rpc-sys reboot
 	exit 0
@@ -36,6 +45,7 @@ handle_whenidle_mode() {
 	local bank_id="${1}"
 	local end_time="${2}"
 	local force_activation="${3}"
+	local keep_config="${4}"
 	local diff=0
 	
 	[ ! -x "${CHECK_IDLE_FILE}" ] && {
@@ -71,7 +81,7 @@ handle_whenidle_mode() {
 	done
 
 	[ "${force_activation}" = "1" ] && {
-		activate_and_reboot_device "${bank_id}"
+		activate_and_reboot_device "${bank_id}" "${keep_config}"
 	}
 }
 
@@ -83,11 +93,11 @@ handle_confirmation_needed_mode() {
 
 ######################## main ########################
 if [ "${MODE}" = "Immediately" ] || [ "${MODE}" = "AnyTime" ]; then
-	activate_and_reboot_device "${2}"
+	activate_and_reboot_device "${2}" "${7}"
 elif [ "${MODE}" = "WhenIdle" ]; then
-	handle_whenidle_mode "${2}" "${3}" "${4}"
+	handle_whenidle_mode "${2}" "${3}" "${4}" "${7}"
 elif [ "${MODE}" = "ConfirmationNeeded" ]; then
-	handle_confirmation_needed_mode "${2}" "${3}" "${4}" "${5}" "${6}"
+	handle_confirmation_needed_mode "${2}" "${3}" "${4}" "${5}" "${6}" "${7}"
 else
 	log "[${MODE}] mode is not supported"
 	exit 1
diff --git a/src/fw_images.c b/src/fw_images.c
index 98769283e057db939ca57e14e2e748683139b438..38a50c4e32d22e70807a986b1f7dbf80218a5fe4 100644
--- a/src/fw_images.c
+++ b/src/fw_images.c
@@ -12,13 +12,16 @@
 #include "utils.h"
 #include "fwbank.h"
 
-#define MAX_TIME_WINDOW 5
-
 struct sysupgrade_ev_data {
 	const char *bank_id;
 	bool status;
 };
 
+#define CRONTABS_ROOT "/etc/crontabs/root"
+#define ACTIVATE_HANDLER_FILE "/usr/share/bbfdm/scripts/bbf_activate_handler.sh"
+#define COPY_CONFIG_CMD "/etc/sysmngr/fwbank call copy_config 2> /dev/null"
+#define MAX_TIME_WINDOW 5
+
 /*************************************************************
 * COMMON FUNCTIONS
 **************************************************************/
@@ -92,7 +95,25 @@ static char *get_fwbank_bank_id(const char *option_name)
 	return bank_id ? bank_id : "";
 }
 
-static bool fwbank_set_bootbank(char *bank_id)
+static struct uci_section *is_varstate_section_exist(const char *package, const char *section)
+{
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_sections(varstate, package, section, s) {
+		return s;
+	}
+
+	return NULL;
+}
+
+static void fwbank_copy_config(void)
+{
+	char output[64] = {0};
+
+	run_cmd(COPY_CONFIG_CMD, output, sizeof(output));
+}
+
+static bool fwbank_set_bootbank(const char *bank_id)
 {
 	int res = sysmngr_fwbank_set_bootbank((uint32_t)DM_STRTOUL(bank_id), NULL);
 
@@ -102,7 +123,7 @@ static bool fwbank_set_bootbank(char *bank_id)
 static bool fwbank_upgrade(const char *path, const char *auto_activate, const char *bank_id, const char *keep_settings)
 {
 	json_object *json_obj = NULL;
-	int res = 0;
+	bool res = false;
 
 	dmubus_call_blocking("fwbank", "upgrade", UBUS_ARGS{{"path", path, String}, {"auto_activate", auto_activate, Boolean}, {"bank", bank_id, Integer}, {"keep_settings", keep_settings, Boolean}}, 4, &json_obj);
 
@@ -533,6 +554,7 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
 {
 	const char *command = "Download()";
 	char obj_path[256] = {0};
+	char *keep_config = NULL;
 
 	char *ret = DM_STRRCHR(refparam, '.');
 	if (!ret)
@@ -557,9 +579,17 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
 	char *checksum_algorithm = dmjson_get_value((json_object *)value, 1, "CheckSumAlgorithm");
 	char *checksum = dmjson_get_value((json_object *)value, 1, "CheckSum");
 	char *commandKey = dmjson_get_value((json_object *)value, 1, "CommandKey");
-	char *keep_config = NULL;
+
 #ifdef SYSMNGR_VENDOR_EXTENSIONS
 	keep_config = dmjson_get_value((json_object *)value, 1, CUSTOM_PREFIX"KeepConfig");
+
+	bool keep = DM_STRLEN(keep_config) ? dmuci_string_to_boolean(keep_config) : true;
+
+	struct uci_section *s = is_varstate_section_exist("sysmngr", "globals");
+	if (!s) dmuci_add_section_varstate("sysmngr", "globals", &s);
+
+	dmuci_set_value_by_section_varstate(s, "keep_config", keep ? "1" : "0");
+	dmuci_commit_package_varstate("sysmngr");
 #endif
 	char *bank_id = get_fwbank_option_value(data, "id");
 
@@ -574,7 +604,6 @@ static int operate_DeviceInfoFirmwareImage_Download(char *refparam, struct dmctx
 
 static operation_args firmware_image_activate_args = {
 	.in = (const char *[]) {
-
 		"TimeWindow.{i}.Start",
 		"TimeWindow.{i}.End",
 		"TimeWindow.{i}.Mode",
@@ -592,17 +621,20 @@ static int get_operate_args_DeviceInfoFirmwareImage_Activate(char *refparam, str
 
 static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
 {
-#define CRONTABS_ROOT "/etc/crontabs/root"
-#define ACTIVATE_HANDLER_FILE "/usr/share/bbfdm/scripts/bbf_activate_handler.sh"
-
 	char *FW_Mode[] = {"AnyTime", "Immediately", "WhenIdle", "ConfirmationNeeded", NULL};
 	char *start_time[MAX_TIME_WINDOW] = {0};
 	char *end_time[MAX_TIME_WINDOW] = {0};
 	char *mode[MAX_TIME_WINDOW] = {0};
 	char *user_message[MAX_TIME_WINDOW] = {0};
 	char *max_retries[MAX_TIME_WINDOW] = {0};
+	char *keep_config = NULL;
 	int res = 0, last_idx = -1;
 
+	dmuci_get_option_value_string_varstate("sysmngr", "globals", "keep_config", &keep_config);
+	if (DM_STRLEN(keep_config) == 0) {
+		keep_config = dmstrdup("1");
+	}
+
 	for (int i = 0; i < MAX_TIME_WINDOW; i++) {
 		char buf[32] = {0};
 
@@ -666,7 +698,7 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
 			t_time += start_t;
 			struct tm *tm_local = localtime(&t_time);
 
-			snprintf(buffer, sizeof(buffer), "%d %d %d %d * sh %s '%s' '%s' '%ld' '%d' '%s' '%s'\n",
+			snprintf(buffer, sizeof(buffer), "%d %d %d %d * sh %s '%s' '%s' '%ld' '%d' '%s' '%s' '%s'\n",
 											tm_local->tm_min,
 											tm_local->tm_hour,
 											tm_local->tm_mday,
@@ -677,7 +709,8 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
 											(DM_STRTOL(end_time[i]) - DM_STRTOL(start_time[i])),
 											(i == last_idx),
 											user_message[i],
-											max_retries[i]);
+											max_retries[i],
+											keep_config);
 
 			fprintf(file, "%s", buffer);
 		}
@@ -689,6 +722,9 @@ static int operate_DeviceInfoFirmwareImage_Activate(char *refparam, struct dmctx
 		if (!fwbank_set_bootbank(bank_id))
 			return USP_FAULT_COMMAND_FAILURE;
 
+		if (DM_STRCMP(keep_config, "1") == 0)
+			fwbank_copy_config();
+
 		bbfdm_task_fork(_exec_reboot, NULL, NULL, NULL);
 	}