diff --git a/package/boot/uboot-envtools/Makefile b/package/boot/uboot-envtools/Makefile
index 601627011d56..e7ecfefec73a 100644
--- a/package/boot/uboot-envtools/Makefile
+++ b/package/boot/uboot-envtools/Makefile
@@ -68,6 +68,8 @@ define Package/uboot-envtools/install
 	$(INSTALL_DIR) $(1)/usr/sbin
 	$(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/env/fw_printenv $(1)/usr/sbin
 	$(LN) fw_printenv $(1)/usr/sbin/fw_setenv
+	$(LN) fw_printenv $(1)/usr/sbin/fw_printsys
+	$(LN) fw_printenv $(1)/usr/sbin/fw_setsys
 	$(INSTALL_DIR) $(1)/lib
 	$(INSTALL_DATA) ./files/uboot-envtools.sh $(1)/lib
 	$(INSTALL_DIR) $(1)/etc/uci-defaults
diff --git a/package/boot/uboot-envtools/patches/002-support-alternate-config.patch b/package/boot/uboot-envtools/patches/002-support-alternate-config.patch
new file mode 100644
index 000000000000..aa341545a03c
--- /dev/null
+++ b/package/boot/uboot-envtools/patches/002-support-alternate-config.patch
@@ -0,0 +1,91 @@
+From e5255e1ca3af000adb5ff686ea5c5b5b60fb7d9d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bmork@telenor.net>
+Date: Thu, 10 Dec 2020 12:32:21 +0100
+Subject: [PATCH 1/2] tools: env: add support for alternate config file
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some devices use two distinct environment partitions for
+different variable sets.  Add basic support for choosing
+between two configuration files based on application name.
+
+Signed-off-by: Bjørn Mork <bmork@telenor.net>
+---
+ tools/env/fw_env_main.c    | 28 +++++++++++++++++++++++++---
+ tools/env/fw_env_private.h |  4 +++-
+ 2 files changed, 28 insertions(+), 4 deletions(-)
+
+diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c
+index 1d193bd437d8..d67c2ed407e3 100644
+--- a/tools/env/fw_env_main.c
++++ b/tools/env/fw_env_main.c
+@@ -42,6 +42,12 @@
+ #define CMD_SETENV	"fw_setenv"
+ static int do_printenv;
+ 
++#ifdef CONFIG_SYSFILE
++#define CMD_PRINTSYS	"fw_printsys"
++#define CMD_SETSYS	"fw_setsys"
++static int do_sys;
++#endif
++
+ static struct option long_options[] = {
+ 	{"config", required_argument, NULL, 'c'},
+ 	{"help", no_argument, NULL, 'h'},
+@@ -117,7 +123,7 @@ static void parse_common_args(int argc, char *argv[])
+ 	int c;
+ 
+ #ifdef CONFIG_FILE
+-	env_opts.config_file = CONFIG_FILE;
++	env_opts.config_file = do_sys ? CONFIG_SYSFILE : CONFIG_FILE;
+ #endif
+ 
+ 	while ((c = getopt_long(argc, argv, ":a:c:l:h:v", long_options, NULL)) !=
+@@ -219,10 +225,26 @@ int main(int argc, char *argv[])
+ 		do_printenv = 1;
+ 	} else if (strcmp(_cmdname, CMD_SETENV) == 0) {
+ 		do_printenv = 0;
++#ifdef CONFIG_SYSFILE
++	} else if (strcmp(_cmdname, CMD_PRINTSYS) == 0) {
++		do_printenv = 1;
++		do_sys = 1;
++	} else if (strcmp(_cmdname, CMD_SETSYS) == 0) {
++		do_printenv = 0;
++		do_sys = 1;
++#endif
+ 	} else {
+ 		fprintf(stderr,
+-			"Identity crisis - may be called as `%s' or as `%s' but not as `%s'\n",
+-			CMD_PRINTENV, CMD_SETENV, _cmdname);
++			"Identity crisis - may be called as `%s',"
++#ifdef CONFIG_SYSFILE
++			"`%s', `%s',"
++#endif
++			" or as `%s' but not as `%s'\n",
++			CMD_PRINTENV, CMD_SETENV,
++#ifdef CONFIG_SYSFILE
++			CMD_PRINTSYS, CMD_SETSYS,
++#endif
++			_cmdname);
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+diff --git a/tools/env/fw_env_private.h b/tools/env/fw_env_private.h
+index 86be16dabc62..35b9bfc70aee 100644
+--- a/tools/env/fw_env_private.h
++++ b/tools/env/fw_env_private.h
+@@ -23,7 +23,9 @@
+  */
+ #define CONFIG_FILE     "/etc/fw_env.config"
+ 
+-#ifndef CONFIG_FILE
++#ifdef CONFIG_FILE
++#define CONFIG_SYSFILE  "/etc/fw_sys.config"
++#else
+ #define HAVE_REDUND /* For systems with 2 env sectors */
+ #define DEVICE1_NAME      "/dev/mtd1"
+ #define DEVICE2_NAME      "/dev/mtd2"
+-- 
+2.29.2
+
diff --git a/package/boot/uboot-envtools/patches/003-fix-usage-text.patch b/package/boot/uboot-envtools/patches/003-fix-usage-text.patch
new file mode 100644
index 000000000000..220239ac2150
--- /dev/null
+++ b/package/boot/uboot-envtools/patches/003-fix-usage-text.patch
@@ -0,0 +1,167 @@
+From 2b3239c16749a175b189971a25025872774d690e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bmork@telenor.net>
+Date: Thu, 10 Dec 2020 12:54:53 +0100
+Subject: [PATCH 2/2] tools: env: fix usage text for alternate cmd names
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Bjørn Mork <bmork@telenor.net>
+---
+ tools/env/fw_env_main.c | 65 ++++++++++++++++++++++-------------------
+ 1 file changed, 35 insertions(+), 30 deletions(-)
+
+diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c
+index d67c2ed407e3..034db42813e2 100644
+--- a/tools/env/fw_env_main.c
++++ b/tools/env/fw_env_main.c
+@@ -66,41 +66,46 @@ static int noheader;
+ /* getenv options */
+ static char *script_file;
+ 
+-void usage_printenv(void)
++void usage_common(const char *prog)
+ {
+-
++#ifdef CONFIG_FILE
++	const char *cfgfile = do_sys ? CONFIG_SYSFILE : CONFIG_FILE;
++#endif
+ 	fprintf(stderr,
+-		"Usage: fw_printenv [OPTIONS]... [VARIABLE]...\n"
+-		"Print variables from U-Boot environment\n"
++		"Usage: %s [OPTIONS]... [VARIABLE]...\n"
++		"%s variables from U-Boot environment\n"
+ 		"\n"
+ 		" -h, --help           print this help.\n"
+ 		" -v, --version        display version\n"
+ #ifdef CONFIG_FILE
+-		" -c, --config         configuration file, default:" CONFIG_FILE "\n"
++		" -c, --config         configuration file, default:%s\n"
++#endif
++		" -l, --lock           lock node, default:/var/lock\n",
++		prog, do_printenv ? "Print" : "Modify"
++#ifdef CONFIG_FILE
++		, cfgfile
+ #endif
++		);
++}
++
++void usage_printenv(const char *prog)
++{
++	usage_common(prog);
++	fprintf(stderr,
+ 		" -n, --noheader       do not repeat variable name in output\n"
+-		" -l, --lock           lock node, default:/var/lock\n"
+ 		"\n");
+ }
+ 
+-void usage_env_set(void)
++void usage_env_set(const char *prog)
+ {
++	usage_common(prog);
+ 	fprintf(stderr,
+-		"Usage: fw_setenv [OPTIONS]... [VARIABLE]...\n"
+-		"Modify variables in U-Boot environment\n"
+-		"\n"
+-		" -h, --help           print this help.\n"
+-		" -v, --version        display version\n"
+-#ifdef CONFIG_FILE
+-		" -c, --config         configuration file, default:" CONFIG_FILE "\n"
+-#endif
+-		" -l, --lock           lock node, default:/var/lock\n"
+ 		" -s, --script         batch mode to minimize writes\n"
+ 		"\n"
+ 		"Examples:\n"
+-		"  fw_setenv foo bar   set variable foo equal bar\n"
+-		"  fw_setenv foo       clear variable foo\n"
+-		"  fw_setenv --script file run batch script\n"
++		"  %s foo bar   set variable foo equal bar\n"
++		"  %s foo       clear variable foo\n"
++		"  %s --script file run batch script\n"
+ 		"\n"
+ 		"Script Syntax:\n"
+ 		"  key [space] value\n"
+@@ -115,10 +120,10 @@ void usage_env_set(void)
+ 		"  kernel_addr    400000\n"
+ 		"  foo            empty empty empty    empty empty empty\n"
+ 		"  bar\n"
+-		"\n");
++		"\n", prog, prog, prog);
+ }
+ 
+-static void parse_common_args(int argc, char *argv[])
++static void parse_common_args(char *prog, int argc, char *argv[])
+ {
+ 	int c;
+ 
+@@ -138,7 +143,7 @@ static void parse_common_args(int argc, char *argv[])
+ 			env_opts.lockname = optarg;
+ 			break;
+ 		case 'h':
+-			do_printenv ? usage_printenv() : usage_env_set();
++			do_printenv ? usage_printenv(prog) : usage_env_set(prog);
+ 			exit(EXIT_SUCCESS);
+ 			break;
+ 		case 'v':
+@@ -156,11 +161,11 @@ static void parse_common_args(int argc, char *argv[])
+ 	optind = 1;
+ }
+ 
+-int parse_printenv_args(int argc, char *argv[])
++int parse_printenv_args(char *prog, int argc, char *argv[])
+ {
+ 	int c;
+ 
+-	parse_common_args(argc, argv);
++	parse_common_args(prog, argc, argv);
+ 
+ 	while ((c = getopt_long(argc, argv, "a:c:ns:l:h:v", long_options, NULL))
+ 		!= EOF) {
+@@ -175,7 +180,7 @@ int parse_printenv_args(int argc, char *argv[])
+ 			/* ignore common options */
+ 			break;
+ 		default: /* '?' */
+-			usage_printenv();
++			usage_printenv(prog);
+ 			exit(EXIT_FAILURE);
+ 			break;
+ 		}
+@@ -183,11 +188,11 @@ int parse_printenv_args(int argc, char *argv[])
+ 	return 0;
+ }
+ 
+-int parse_setenv_args(int argc, char *argv[])
++int parse_setenv_args(char *prog, int argc, char *argv[])
+ {
+ 	int c;
+ 
+-	parse_common_args(argc, argv);
++	parse_common_args(prog, argc, argv);
+ 
+ 	while ((c = getopt_long(argc, argv, "a:c:ns:l:h:v", long_options, NULL))
+ 		!= EOF) {
+@@ -202,7 +207,7 @@ int parse_setenv_args(int argc, char *argv[])
+ 			/* ignore common options */
+ 			break;
+ 		default: /* '?' */
+-			usage_env_set();
++			usage_env_set(prog);
+ 			exit(EXIT_FAILURE);
+ 			break;
+ 		}
+@@ -249,10 +254,10 @@ int main(int argc, char *argv[])
+ 	}
+ 
+ 	if (do_printenv) {
+-		if (parse_printenv_args(argc, argv))
++		if (parse_printenv_args(_cmdname, argc, argv))
+ 			exit(EXIT_FAILURE);
+ 	} else {
+-		if (parse_setenv_args(argc, argv))
++		if (parse_setenv_args(_cmdname, argc, argv))
+ 			exit(EXIT_FAILURE);
+ 	}
+ 
+-- 
+2.29.2
+
