diff --git a/board_enable.c b/board_enable.c
index bdd5db3166dc7fc77b308cc7d7fe482748c1541c..2229f8b13b2a6d60684675dfa8fbc1504a2b750e 100644
--- a/board_enable.c
+++ b/board_enable.c
@@ -2070,7 +2070,8 @@ static int it8718f_gpio63_raise(void)
  * The coreboot ids are used two fold. When running with a coreboot firmware,
  * the ids uniquely matches the coreboot board identification string. When a
  * legacy bios is installed and when autodetection is not possible, these ids
- * can be used to identify the board through the -m command line argument.
+ * can be used to identify the board through the -p internal:mainboard=
+ * programmer parameter.
  *
  * When a board is identified through its coreboot ids (in both cases), the
  * main pci ids are still required to match, as a safeguard.
@@ -2245,7 +2246,8 @@ static const struct board_match *board_match_cbname(const char *vendor,
 			msg_pinfo("AMBIGUOUS BOARD NAME: %s\n", part);
 			msg_pinfo("At least vendors '%s' and '%s' match.\n",
 				  partmatch->lb_vendor, board->lb_vendor);
-			msg_perr("Please use the full -m vendor:part syntax.\n");
+			msg_perr("Please use the full -p internal:mainboard="
+				 "vendor:part syntax.\n");
 			return NULL;
 		}
 		partmatch = board;
@@ -2259,7 +2261,8 @@ static const struct board_match *board_match_cbname(const char *vendor,
 		 * coreboot table. If it was, the coreboot implementor is
 		 * expected to fix flashrom, too.
 		 */
-		msg_perr("\nUnknown vendor:board from -m option: %s:%s\n\n",
+		msg_perr("\nUnknown vendor:board from -p internal:mainboard="
+			 " programmer parameter:\n%s:%s\n\n",
 			 vendor, part);
 	}
 	return NULL;
diff --git a/cbtable.c b/cbtable.c
index ea8964a2d449599bc441b6d66f9415eac52db436..4495d9d761945d013a0ff4d732c14db580449460 100644
--- a/cbtable.c
+++ b/cbtable.c
@@ -33,18 +33,27 @@
 char *lb_part = NULL, *lb_vendor = NULL;
 int partvendor_from_cbtable = 0;
 
-void lb_vendor_dev_from_string(char *boardstring)
+/* Parse the [<vendor>:]<board> string specified by the user as part of
+ * -p internal:mainboard=[<vendor>:]<board> and set lb_vendor and lb_part
+ * to the extracted values.
+ * Note: strtok modifies the original string, so we work on a copy and allocate
+ * memory for lb_vendor and lb_part with strdup.
+ */
+void lb_vendor_dev_from_string(const char *boardstring)
 {
+	/* strtok may modify the original string. */
+	char *tempstr = strdup(boardstring);
 	char *tempstr2 = NULL;
-	strtok(boardstring, ":");
+	strtok(tempstr, ":");
 	tempstr2 = strtok(NULL, ":");
 	if (tempstr2) {
-		lb_vendor = boardstring;
-		lb_part = tempstr2;
+		lb_vendor = strdup(tempstr);
+		lb_part = strdup(tempstr2);
 	} else {
 		lb_vendor = NULL;
-		lb_part = boardstring;
+		lb_part = strdup(tempstr);
 	}
+	free(tempstr);
 }
 
 static unsigned long compute_checksum(void *addr, unsigned long length)
diff --git a/cli_classic.c b/cli_classic.c
index 3928ded323d6fc236879740d199857356161be68..7ce74e501be36cd10b16a0f9294c74db1c54ded4 100644
--- a/cli_classic.c
+++ b/cli_classic.c
@@ -106,7 +106,7 @@ static void cli_classic_usage(const char *name)
 	         "-z|"
 #endif
 	         "-E|-r <file>|-w <file>|-v <file>]\n"
-	       "       [-c <chipname>] [-m [<vendor>:]<part>] [-l <file>]\n"
+	       "       [-c <chipname>] [-l <file>]\n"
 	       "       [-i <image>] [-p <programmername>[:<parameters>]]\n\n");
 
 	printf("Please note that the command line interface for flashrom has "
@@ -128,11 +128,6 @@ static void cli_classic_usage(const char *name)
 	       "   -V | --verbose                    more verbose output\n"
 	       "   -c | --chip <chipname>            probe only for specified "
 	         "flash chip\n"
-#if CONFIG_INTERNAL == 1
-	       /* FIXME: --mainboard should be a programmer parameter */
-	       "   -m | --mainboard <[vendor:]part>  override mainboard "
-	         "detection\n"
-#endif
 	       "   -f | --force                      force specific operations "
 	         "(see man page)\n"
 	       "   -n | --noverify                   don't auto-verify\n"
@@ -190,7 +185,6 @@ int main(int argc, char *argv[])
 		{"verify",		1, NULL, 'v'},
 		{"noverify",		0, NULL, 'n'},
 		{"chip",		1, NULL, 'c'},
-		{"mainboard",		1, NULL, 'm'},
 		{"verbose",		0, NULL, 'V'},
 		{"force",		0, NULL, 'f'},
 		{"layout",		1, NULL, 'l'},
@@ -275,17 +269,6 @@ int main(int argc, char *argv[])
 			}
 			erase_it = 1;
 			break;
-		case 'm':
-#if CONFIG_INTERNAL == 1
-			tempstr = strdup(optarg);
-			lb_vendor_dev_from_string(tempstr);
-#else
-			fprintf(stderr, "Error: Internal programmer support "
-				"was not compiled in and --mainboard only\n"
-				"applies to the internal programmer. Aborting.\n");
-			cli_classic_abort_usage();
-#endif
-			break;
 		case 'f':
 			force = 1;
 			break;
@@ -426,14 +409,6 @@ int main(int argc, char *argv[])
 	if (prog == PROGRAMMER_INVALID)
 		prog = default_programmer;
 
-#if CONFIG_INTERNAL == 1
-	if ((prog != PROGRAMMER_INTERNAL) && (lb_part || lb_vendor)) {
-		fprintf(stderr, "Error: --mainboard requires the internal "
-				"programmer. Aborting.\n");
-		cli_classic_abort_usage();
-	}
-#endif
-
 	/* FIXME: Delay calibration should happen in programmer code. */
 	myusec_calibrate_delay();
 
diff --git a/flashrom.8 b/flashrom.8
index 66cde4f40f3df01e66d4d0369af22e792d35c0b5..6b25b43dc72e4b6276f5d0453f91003305105395 100644
--- a/flashrom.8
+++ b/flashrom.8
@@ -5,7 +5,7 @@ flashrom \- detect, read, write, verify and erase flash chips
 .B flashrom \fR[\fB\-n\fR] [\fB\-V\fR] [\fB\-f\fR] [\fB\-h\fR|\fB\-R\fR|\
 \fB\-L\fR|\fB\-z\fR|\fB\-E\fR|\fB\-r\fR <file>|\fB\-w\fR <file>|\
 \fB\-v\fR <file>]
-         [\fB\-c\fR <chipname>] [\fB\-m\fR [<vendor>:]<board>] \
+         [\fB\-c\fR <chipname>] \
 [\fB\-l\fR <file>]
          [\fB\-i\fR <image>] [\fB\-p\fR <programmername>[:<parameters>]]
 .SH DESCRIPTION
@@ -88,19 +88,6 @@ printed by
 without the vendor name as parameter. Please note that the chip name is
 case sensitive.
 .TP
-.B "\-m, \-\-mainboard" [<vendor>:]<board>
-Override mainboard settings.
-.sp
-flashrom reads the coreboot table to determine the current mainboard. If no
-coreboot table could be read or if you want to override these values, you can
-specify \-m, e.g.:
-.sp
-.B "  flashrom \-\-mainboard AGAMI:ARUMA \-w agami_aruma.rom"
-.sp
-See the 'Known boards' or 'Known laptops' section in the output
-of 'flashrom \-L' for a list of boards which require the specification of
-the board name, if no coreboot table is found.
-.TP
 .B "\-f, \-\-force"
 Force one or more of the following actions:
 .sp
@@ -245,10 +232,15 @@ autodetected using one of the following mechanisms: If your system is
 running coreboot, the mainboard type is determined from the coreboot table.
 Otherwise, the mainboard is detected by examining the onboard PCI devices
 and possibly DMI info. If PCI and DMI do not contain information to uniquely
-identify the mainboard (which is the exception), it might be necessary to
-specify the mainboard using the
-.B \-m
-switch (see above).
+identify the mainboard (which is the exception), or if you want to override
+the detected mainboard model, you can specify the mainboard using the
+.sp
+.B "  flashrom \-p internal:mainboard=[<vendor>:]<board>"
+syntax.
+.sp
+See the 'Known boards' or 'Known laptops' section in the output
+of 'flashrom \-L' for a list of boards which require the specification of
+the board name, if no coreboot table is found.
 .sp
 Some of these board-specific flash enabling functions (called
 .BR "board enables" )
diff --git a/internal.c b/internal.c
index 386b842847beb583908c9f77a45e32c786315151..5716e6412458e02c80466b10a4b189df9aed171e 100644
--- a/internal.c
+++ b/internal.c
@@ -213,6 +213,16 @@ int internal_init(void)
 	}
 	free(arg);
 
+	arg = extract_programmer_param("mainboard");
+	if (arg && strlen(arg)) {
+		lb_vendor_dev_from_string(arg);
+	} else if (arg && !strlen(arg)) {
+		msg_perr("Missing argument for mainboard.\n");
+		free(arg);
+		return 1;
+	}
+	free(arg);
+
 	get_io_perms();
 	if (register_shutdown(internal_shutdown, NULL))
 		return 1;
diff --git a/layout.c b/layout.c
index 1f7f01aea8934fdad54aa2b3fbf3db60a566f0f9..90d3ccebeca8c51ed4b7873a43cad50ab1f27765 100644
--- a/layout.c
+++ b/layout.c
@@ -106,11 +106,11 @@ int show_id(uint8_t *bios, int size, int force)
 
 	/*
 	 * If lb_vendor is not set, the coreboot table was
-	 * not found. Nor was -m VENDOR:PART specified.
+	 * not found. Nor was -p internal:mainboard=VENDOR:PART specified.
 	 */
 	if (!lb_vendor || !lb_part) {
-		msg_pinfo("Note: If the following flash access fails, "
-		       "try -m <vendor>:<mainboard>.\n");
+		msg_pinfo("Note: If the following flash access fails, try "
+			  "-p internal:mainboard=<vendor>:<mainboard>.\n");
 		return 0;
 	}
 
@@ -126,14 +126,17 @@ int show_id(uint8_t *bios, int size, int force)
 			       "seem to fit to this machine - forcing it.\n");
 		} else {
 			msg_pinfo("ERROR: Your firmware image (%s:%s) does not "
-			       "appear to\n       be correct for the detected "
-			       "mainboard (%s:%s)\n\nOverride with -p internal:"
-			       "boardmismatch=force if you are absolutely sure "
-			       "that\nyou are using a correct "
-			       "image for this mainboard or override\nthe detected "
-			       "values with --mainboard <vendor>:<mainboard>.\n\n",
-			       mainboard_vendor, mainboard_part, lb_vendor,
-			       lb_part);
+				  "appear to\n"
+				  "       be correct for the detected "
+				  "mainboard (%s:%s)\n\n"
+				  "Override with -p internal:boardmismatch="
+				  "force to ignore the board name in the\n"
+				  "firmware image or override the detected "
+				  "mainboard with\n"
+				  "-p internal:mainboard=<vendor>:<mainboard>."
+				  "\n\n",
+				  mainboard_vendor, mainboard_part, lb_vendor,
+				  lb_part);
 			exit(1);
 		}
 	}
diff --git a/print.c b/print.c
index a94ce6e85717cda1f2841986352a50cda7e6e430..db7ed655f9fbaa40dfb5adee32f38bd37fc26e3f 100644
--- a/print.c
+++ b/print.c
@@ -389,7 +389,10 @@ static void print_supported_boards_helper(const struct board_info *boards,
 	for (i = strlen("Board"); i < maxboardlen; i++)
 		msg_ginfo(" ");
 
-	msg_ginfo("Status  Required option\n\n");
+	msg_ginfo("Status  Required value for\n");
+	for (i = 0; i < maxvendorlen + maxboardlen + strlen("Status  "); i++)
+		msg_ginfo(" ");
+	msg_ginfo("-p internal:mainboard=\n");
 
 	for (b = boards; b->vendor != NULL; b++) {
 		msg_ginfo("%s", b->vendor);
@@ -407,7 +410,7 @@ static void print_supported_boards_helper(const struct board_info *boards,
 			if (e->lb_vendor == NULL)
 				msg_ginfo("(autodetected)");
 			else
-				msg_ginfo("-m %s:%s", e->lb_vendor,
+				msg_ginfo("%s:%s", e->lb_vendor,
 						   e->lb_part);
 		}
 		msg_ginfo("\n");
diff --git a/print_wiki.c b/print_wiki.c
index 57a27d825f531c73edbf3c0da1c6f82fad1437fe..1c9241e3909b9b1e31e4e1397c4d22282d1bffe7 100644
--- a/print_wiki.c
+++ b/print_wiki.c
@@ -167,7 +167,7 @@ static void wiki_helper(const char *devicetype, int cols,
 		       boards[i].url ? boards[i].url : "",
 		       boards[i].name,
 		       boards[i].url ? "]" : "",
-		       b[k].lb_vendor ? "-m " : "&mdash;",
+		       b[k].lb_vendor ? "-p internal:mainboard=" : "&mdash;",
 		       b[k].lb_vendor ? b[k].lb_vendor : "",
 		       b[k].lb_vendor ? ":" : "",
 		       b[k].lb_vendor ? b[k].lb_part : "",
diff --git a/programmer.h b/programmer.h
index d6b9cd668fef1dff9edf7251ce2dcc9f5e048e15..6f69db149cb2d5b79425c6aa5beaf79f273d83bd 100644
--- a/programmer.h
+++ b/programmer.h
@@ -264,7 +264,7 @@ int setup_cpu_msr(int cpu);
 void cleanup_cpu_msr(void);
 
 /* cbtable.c */
-void lb_vendor_dev_from_string(char *boardstring);
+void lb_vendor_dev_from_string(const char *boardstring);
 int coreboot_init(void);
 extern char *lb_part, *lb_vendor;
 extern int partvendor_from_cbtable;