diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c
index 9adfefaf6aac9c89cfec7e86429da150aabace33..9be4c728bf151bde6eb73e3ee98c40a25cddf3a5 100644
--- a/board/keymile/common/common.c
+++ b/board/keymile/common/common.c
@@ -32,6 +32,7 @@
 #include <net.h>
 #include <netdev.h>
 #include <asm/io.h>
+#include <linux/ctype.h>
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
@@ -716,3 +717,158 @@ static int do_setboardid(cmd_tbl_t *cmdtp, int flag, int argc,
 
 U_BOOT_CMD(km_setboardid, 1, 0, do_setboardid, "setboardid", "read out bid and "
 				 "hwkey from IVM and set in environment");
+
+/*
+ * command km_checkbidhwk
+ *	if "boardid" and "hwkey" are not already set in the environment, do:
+ *		if a "boardIdListHex" exists in the environment:
+ *			- read ivm data for boardid and hwkey
+ *			- compare each entry of the boardIdListHex with the
+ *				IVM data:
+ *			if match:
+ *				set environment variables boardid, boardId,
+ *				hwkey, hwKey to	the found values
+ *				both (boardid and boardId) are set because
+ *				they might be used differently in the
+ *				application and in the init scripts (?)
+ *	return 0 in case of match, 1 if not match or error
+ */
+int do_checkboardidhwk(cmd_tbl_t *cmdtp, int flag, int argc,
+			char *const argv[])
+{
+	unsigned long ivmbid = 0, ivmhwkey = 0;
+	unsigned long envbid = 0, envhwkey = 0;
+	char *p;
+	int verbose = argc > 1 && *argv[1] == 'v';
+	int rc = 0;
+
+	/*
+	 * first read out the real inventory values, these values are
+	 * already stored in the local hush variables
+	 */
+	p = get_local_var("IVM_BoardId");
+	if (p == NULL) {
+		printf("can't get the IVM_Boardid\n");
+		return 1;
+	}
+	rc = strict_strtoul(p, 16, &ivmbid);
+
+	p = get_local_var("IVM_HWKey");
+	if (p == NULL) {
+		printf("can't get the IVM_HWKey\n");
+		return 1;
+	}
+	rc = strict_strtoul(p, 16, &ivmhwkey);
+
+	if (!ivmbid || !ivmhwkey) {
+		printf("Error: IVM_BoardId and/or IVM_HWKey not set!\n");
+		return rc;
+	}
+
+	/* now try to read values from environment if available */
+	p = getenv("boardid");
+	if (p != NULL)
+		rc = strict_strtoul(p, 16, &envbid);
+	p = getenv("hwkey");
+	if (p != NULL)
+		rc = strict_strtoul(p, 16, &envhwkey);
+
+	if (rc != 0) {
+		printf("strict_strtoul returns error: %d", rc);
+		return rc;
+	}
+
+	if (!envbid || !envhwkey) {
+		/*
+		 * BoardId/HWkey not available in the environment, so try the
+		 * environment variable for BoardId/HWkey list
+		 */
+		char *bidhwklist = getenv("boardIdListHex");
+
+		if (bidhwklist) {
+			int found = 0;
+			char *rest = bidhwklist;
+			char *endp;
+
+			if (verbose) {
+				printf("IVM_BoardId: %ld, IVM_HWKey=%ld\n",
+					ivmbid, ivmhwkey);
+				printf("boardIdHwKeyList: %s\n",
+					bidhwklist);
+			}
+			while (!found) {
+				/* loop over each bid/hwkey pair in the list */
+				unsigned long bid   = 0;
+				unsigned long hwkey = 0;
+
+				while (*rest && !isxdigit(*rest))
+					rest++;
+				/*
+				 * use simple_strtoul because we need &end and
+				 * we know we got non numeric char at the end
+				 */
+				bid = simple_strtoul(rest, &endp, 16);
+				/* BoardId and HWkey are separated with a "_" */
+				if (*endp == '_') {
+					rest  = endp + 1;
+					/*
+					 * use simple_strtoul because we need
+					 * &end
+					 */
+					hwkey = simple_strtoul(rest, &endp, 16);
+					rest  = endp;
+					while (*rest && !isxdigit(*rest))
+						rest++;
+				}
+				if ((!bid) || (!hwkey)) {
+					/* end of list */
+					break;
+				}
+				if (verbose) {
+					printf("trying bid=0x%lX, hwkey=%ld\n",
+						bid, hwkey);
+				}
+				/*
+				 * Compare the values of the found entry in the
+				 * list with the valid values which are stored
+				 * in the inventory eeprom. If they are equal
+				 * store the values in environment variables
+				 * and save the environment.
+				 * This can only happen once for the lifetime
+				 * of a board, because once saved the function
+				 * will never reach the while loop.
+				 */
+				if ((bid == ivmbid) && (hwkey == ivmhwkey)) {
+					char buf[10];
+
+					found = 1;
+					envbid   = bid;
+					envhwkey = hwkey;
+					sprintf(buf, "%lx", bid);
+					setenv("boardid", buf);
+					sprintf(buf, "%lx", hwkey);
+					setenv("hwkey", buf);
+					saveenv();
+				}
+			} /* end while( ! found ) */
+		}
+	}
+
+	/* compare now the values */
+	if ((ivmbid == envbid) && (ivmhwkey == envhwkey)) {
+		printf("boardid=0x%3lX, hwkey=%ld\n", envbid, envhwkey);
+		rc = 0; /* match */
+	} else {
+		printf("Error: env bId=0x%3lX, hwKey=%ld\n", envbid, envhwkey);
+		printf("       IVM bId=0x%3lX, hwKey=%ld\n", ivmbid, ivmhwkey);
+		rc = 1; /* don't match */
+	}
+	return rc;
+}
+
+U_BOOT_CMD(km_checkbidhwk, 2, 0, do_checkboardidhwk,
+		"check boardid and hwkey",
+		"[v]\n  - check environment parameter "\
+		"\"boardIdListHex\" against stored boardid and hwkey "\
+		"from the IVM\n    v: verbose output"
+);
diff --git a/include/configs/km/keymile-common.h b/include/configs/km/keymile-common.h
index e91f6c73d50839e9ab7b89ba8adaa4da222d3705..6a5ecc6d747dbac1b6dc6bc8e7dacf8af252c247 100644
--- a/include/configs/km/keymile-common.h
+++ b/include/configs/km/keymile-common.h
@@ -238,7 +238,6 @@
 	"release="							\
 		"setenv actual_bank ${initial_boot_bank} && "		\
 		"setenv subbootcmds \""					\
-		"checkboardidlist "					\
 		"checkboardid "						\
 		"ubiattach ubicopy "					\
 		"cramfsloadfdt cramfsloadkernel "			\
@@ -389,36 +388,9 @@
 	"default="							\
 		"setenv default 'run newenv; reset' &&  "		\
 		"run release && saveenv; reset\0"			\
-	"checkboardidlist="						\
-		"if test \"x${boardIdListHex}\" != \"x\"; then "	\
-		"IVMbidhwk=${IVM_BoardId}_${IVM_HWKey}; "		\
-		"found=0; "						\
-		"for bidhwk in \"${boardIdListHex}\"; do "		\
-		"echo trying $bidhwk ...; "				\
-		"if test \"x$bidhwk\" = \"x$IVMbidhwk\"; then "		\
-		"found=1; "						\
-		"echo match found for $bidhwk; "			\
-		"if test \"x$bidhwk\" != \"x${boardId}_${hwKey}\";then "\
-			"setenv boardid ${IVM_BoardId}; "		\
-			"setenv boardId ${IVM_BoardId}; "		\
-			"setenv hwkey ${IVM_HWKey}; "			\
-			"setenv hwKey ${IVM_HWKey}; "			\
-			"echo \"boardId set to ${boardId}\"; "		\
-			"echo \"hwKey   set to ${hwKey}\"; "		\
-			"saveenv; "					\
-		"fi; "							\
-		"fi; "							\
-		"done; "						\
-		"else "							\
-			"echo \"boardIdListHex not set, not checked\"; "\
-			"found=1; "					\
-		"fi; "							\
-		"test \"$found\" = 1 \0"				\
-	"checkboardid="							\
-		"test \"x${boardId}\" = \"x${IVM_BoardId}\" && "	\
-		"test \"x${hwKey}\" = \"x${IVM_HWKey}\"\0"		\
 	"printbootargs=print bootargs\0"				\
 	"rootfsfile="xstr(CONFIG_HOSTNAME) "/rootfsImage\0"		\
+	"checkboardid=km_checkbidhwk\0"					\
 	""
 
 #ifndef CONFIG_KM_DEF_ENV