diff --git a/resources/scripts/build/boot/roms_helper b/resources/scripts/build/boot/roms_helper
index fae98c5066b0d16f430f762c3d2881ac40ecc790..21110e59c92999f62824f87a6b272b930b6efd0c 100755
--- a/resources/scripts/build/boot/roms_helper
+++ b/resources/scripts/build/boot/roms_helper
@@ -31,13 +31,43 @@ set -u -e
 
 projectname="$(cat projectname)"
 
-cbcfgdir="resources/coreboot"
-boardcfgdir=""
+blobs_required=""
+microcode_required=""
+
 kmapdir="resources/grub/keymap"
 displaymodes=""
 payloads=""
 keyboard_layouts=""
-board=""
+while [ $# -gt 0 ]; do
+	case ${1} in
+		-d)
+		displaymodes="${displaymodes}${2}" 
+		shift ;;
+		-p)
+		payloads="${payloads}${2}"
+		shift ;;
+		-k)
+		keyboard_layouts="${keyboard_layouts}${2}"
+		shift ;;
+		*)
+		board=${1} ;;
+	esac
+	shift
+done
+
+printf "\n\nboard is %s , kb is %s , displaymode is %s , payloads is %s\n" \
+		${board} ${keyboard_layouts} ${displaymodes} ${payloads} 1>&2
+
+if [ ! -d "resources/coreboot/${board}" ]; then
+	printf "build/roms: Target not defined: %s\n" ${board}
+	exit 1
+fi
+
+if [ ! -f "resources/coreboot/${board}/board.cfg" ]; then
+	printf "build/roms: Missing board.cfg for target: %s\n" ${board}
+	exit 1
+fi
+
 
 grub_scan_disk="undefined"
 cbtree="undefined"
@@ -50,283 +80,203 @@ payload_grub="n"
 payload_grub_withseabios="n" # seabios chainloaded from grub
 payload_seabios="n"
 payload_seabios_withgrub="n" # i386-coreboot grub from SeaBIOS boot menu
+seabios_opromloadonly="0"
 payload_memtest="n"
 payload_uboot="n"
 uboot_config="undefined"
-
-romdir=""
-cbdir=""
-cbfstool=""
-corebootrom=""
-seavgabiosrom=""
-
-# almost all boards will set at least one of these to "n"
-blobs_required=""
-microcode_required=""
-
-CROSS_COMPILE=""
-
-main()
-{
-	while [ $# -gt 0 ]; do
-		case ${1} in
-		-d)
-			displaymodes="${displaymodes}${2}" 
-			shift ;;
-		-p)
-			payloads="${payloads}${2}"
-			shift ;;
-		-k)
-			keyboard_layouts="${keyboard_layouts}${2}"
-			shift ;;
-		*)
-			board=${1} ;;
-		esac
-		shift
-	done
-
-	printf "\n\nboard %s , kb %s , displaymode %s , payloads %s\n" \
-			${board} ${keyboard_layouts} ${displaymodes} \
-			${payloads} 1>&2
-
-	if [ "${board}" = "" ]; then
-		printf "build/roms: undefined board. Exiting\n"
-		exit 1
-	fi
-
-	load_config
-	build_dependencies
-	build_rom_images
-}
-
-load_config()
-{
-	boardcfgdir="${cbcfgdir}/${board}"
-
-	if [ ! -d "${boardcfgdir}" ]; then
-		printf "build/roms: Target not defined: %s\n" ${board}
-		exit 1
-	fi
-	if [ ! -f "${boardcfgdir}/board.cfg" ]; then
-		printf "build/roms %s: Missing board.cfg\n" ${board}
-		exit 1
-	fi
-
-	. "${boardcfgdir}/board.cfg"
-
-	if [ "${board}" != "${cbtree}" ]; then
-		cbdir="coreboot/${cbtree}"
-	else
-		cbdir="coreboot/${board}"
-	fi
-
-	romdir="bin/${board}"
-	cbfstool="cbutils/${cbtree}/cbfstool"
-	seavgabiosrom="payload/seabios/seavgabios.bin"
-	corebootrom="${cbdir}/build/coreboot.rom"
-
-	if [ "${grub_scan_disk}" = "undefined" ]; then
-		printf "build/roms '%s': grub_scan_disk is undefined. " \
-				${board}
-		printf "Defaulting to 'both'.\n"
-		grub_scan_disk="both"
-	fi
-	if [ "${grub_scan_disk}" != "both" ] && \
-			[ "${grub_scan_disk}" != "ata" ] && \
-			[ "${grub_scan_disk}" != "ahci" ]; then
-		printf "build/roms '%s': invalid grub_scan_disk config. " \
-				${board}
-		printf "Defaulting to 'both'.\n"
-		grub_scan_disk="both"
-		# erroring out would be silly. just use the default
-	fi
-
-	if [ "${cbtree}" = "undefined" ]; then
-		printf "build/roms '%s': undefined coreboot tree. " \
-				${board}
-		printf "Skipping build.\n"
-		exit 1
-	fi
-	if [ "${arch}" = "undefined" ]; then
-		printf "build/roms '%s': undefined CPU type. " \
+# Override the above defaults using board.cfg
+. "resources/coreboot/${board}/board.cfg"
+
+if [ "${grub_scan_disk}" = "undefined" ]; then
+	printf "build/roms: Target '%s' does not define grub_scan_disk. " \
+		${board}
+	printf "Defaulting to 'both'.\n"
+	grub_scan_disk="both"
+fi
+
+if [ "${grub_scan_disk}" != "both" ] && \
+	[ "${grub_scan_disk}" != "ata" ] && \
+	[ "${grub_scan_disk}" != "ahci" ]; then
+	printf "build/roms: Target '%s' defines bad grub_scan_disk option. " \
+			${board}
+	printf "Defaulting to 'both'.\n"
+	grub_scan_disk="both"
+	# erroring out would be silly. just use the default
+fi
+
+if [ "${cbtree}" = "undefined" ]; then
+	printf "build/roms: Target '%s' does not define a coreboot tree. " \
+			${board}
+	printf "Skipping build.\n"
+	exit 1
+fi
+if [ "${arch}" = "undefined" ]; then
+	printf "build/roms: Target '%s' does not define a CPU type. " \
+			${board}
+	printf "Skipping build.\n"
+	exit 1
+fi
+
+if [ "${seabios_opromloadonly}" != "0" ] && \
+		[ "${seabios_opromloadonly}" != "1" ]; then
+	seabios_opromloadonly="0"
+fi
+if [ "${payload_memtest}" != "n" ] && \
+		[ "${payload_memtest}" != "y" ]; then
+	payload_memtest="n"
+fi
+if [ "${payload_grub_withseabios}" = "y" ]; then
+	payload_grub="y"
+fi
+if [ "${payload_grub_withseabios}" = "y" ]; then
+	payload_seabios="y"
+	payload_seabios_withgrub="y"
+fi
+if [ "${payload_seabios_withgrub}" = "y" ]; then
+	payload_seabios="y"
+fi
+# NOTE: reverse logic must NOT be applied. If SeaBIOS-with-GRUB works, that
+# doesn't necessarily mean GRUb-with-SeaBIOS will. For example, the board
+# might have an external GPU, where it's recommended to boot SeaBIOS first
+if [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] \
+			&& [ "${payload_uboot}" != "y" ]; then
+	for configfile in "resources/coreboot/${board}/config/"*; do
+		if [ ! -e "${configfile}" ]; then
+			continue
+		fi
+		printf "ERROR build/roms: Target '%s' defines no payload. " \
 				${board}
-		printf "Skipping build.\n"
+		printf "Exiting.\n"
 		exit 1
-	fi
-
-	if [ "${payload_memtest}" != "n" ] && \
-			[ "${payload_memtest}" != "y" ]; then
-		payload_memtest="n"
-	fi
-	if [ "${payload_grub_withseabios}" = "y" ]; then
-		payload_grub="y"
-	fi
-	if [ "${payload_grub_withseabios}" = "y" ]; then
-		payload_seabios="y"
-		payload_seabios_withgrub="y"
-	fi
-	if [ "${payload_seabios_withgrub}" = "y" ]; then
-		payload_seabios="y"
-	fi
-	if [ "${payload_uboot}" != "n" ] && \
-			[ "${payload_uboot}" != "y" ]; then
-		payload_uboot="n"
-	fi
-	if [ "${payload_uboot}" = "y" ] && \
-			[ "${uboot_config}" = "undefined" ]; then
-		uboot_config="default"
-	fi
-	if [ "${microcode_required}" != "n" ] \
-			&& [ "${microcode_required}" != "y" ]; then
-		microcode_required="y"
-	fi
-	if [ "${blobs_required}" != "n" ] \
-			&& [ "${blobs_required}" != "y" ]; then
-		blobs_required="y"
-	fi
-
-	load_config_overrides
-	die_if_cbconfig_and_nopayload
-}
-
-load_config_overrides()
-{
-	# Override all payload directives with cmdline args
-	if [ -z ${payloads} ]; then
-		return 0
-	fi
+	done
+fi
 
+if [ "${payload_uboot}" != "n" ] && \
+		[ "${payload_uboot}" != "y" ]; then
+	payload_uboot="n"
+fi
+
+if [ "${payload_uboot}" = "y" ] && \
+		[ "${uboot_config}" = "undefined" ]; then
+	uboot_config="default"
+fi
+
+if [ "${microcode_required}" != "n" ] \
+		&& [ "${microcode_required}" != "y" ]; then
+	microcode_required="y"
+fi
+if [ "${blobs_required}" != "n" ] \
+		&& [ "${blobs_required}" != "y" ]; then
+	blobs_required="y"
+fi
+
+# Override all payload directives with cmdline args
+if [ ! -z ${payloads} ]; then	
 	echo "setting payloads $payloads"
 	payload_grub="n"
 	payload_grub_withseabios="n" # seabios chainloaded from grub
 	payload_seabios="n"
-	payload_seabios_withgrub="n" # grub from SeaBIOS menu
+	payload_seabios_withgrub="n" # i386-coreboot grub from SeaBIOS menu
 	payload_uboot="n"
+	seabios_opromloadonly="0"
 	payload_memtest="n"
 
 	for payload in ${payloads} ; do
 		eval "payload_${payload}=y"
 	done
-}
-
-die_if_cbconfig_and_nopayload()
-{
-	# if a coreboot config exists, and payloads are not
-	# defined in the lbmk config, exit with error
-	# if no configs exist, this won't fail. this way, cbtrees
-	# like "default" can exist which just contain patches
-
-	if [ "${payload_grub}" = "y" ] || [ "${payload_seabios}" = "y" ] \
-				|| [ "${payload_uboot}" = "y" ]; then
-		return 0
-	fi
-
-	for configfile in "${boardcfgdir}/config/"*; do
-		if [ ! -e "${configfile}" ]; then
-			continue
-		fi
-		printf "build/roms %s: Payload undefined. Exiting.\n" \
-				${board}
-		exit 1
-	done
-}
-
-build_dependencies()
-{
-	if [ ! -d "${cbdir}" ]; then
-		./download coreboot ${cbtree}
-	fi
-	./build module cbutils ${cbtree} || exit 1
-	cat version > "${cbdir}/.coreboot-version"
-
-	build_dependency_crossgcc
-
-	build_dependency_seabios
-	build_dependency_grub
-	build_dependency_uboot
-}
-
-build_dependency_crossgcc()
-{
-	make distclean -C "${cbdir}"
-	if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then
-		if [ ! -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ]; then
-			# Even for 64-bit machines, coreboot builds 32-bit ROM
-			# images, so we only need to worry about i386-elf
-			make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc)
-		fi
-		case "$(uname -m)" in
-			x86*|i*86|amd64) : ;;
-			*) export CROSS_COMPILE=i386-elf- ;;
-		esac
-	elif [ "${arch}" = "ARMv7" ]; then
-		if [ ! -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ]; then
-			make -C "${cbdir}" crossgcc-arm CPUS=$(nproc)
-		fi
-		case "$(uname -m)" in
-			arm|arm32|armv6*|armv7*) : ;;
-			*) export CROSS_COMPILE=arm-eabi- ;;
-		esac
-	elif [ "${arch}" = "AArch64" ]; then
-		if [ ! -d "${cbdir}/util/crossgcc/xgcc/aarch64-elf/" ]; then
-			make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc)
-		fi
-		# aarch64 also needs armv7 toolchain for arm-trusted-firmware
-		if [ ! -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ]; then
-			make -C "${cbdir}" crossgcc-arm CPUS=$(nproc)
-		fi
-		case "$(uname -m)" in
-			arm64|aarch64) : ;;
-			*) export CROSS_COMPILE=aarch64-elf- ;;
-		esac
+fi 
+
+romdir="bin/${board}"
+cbdir="coreboot/${board}"
+if [ "${board}" != "${cbtree}" ]; then
+	cbdir="coreboot/${cbtree}"
+fi
+cbfstool="cbutils/${cbtree}/cbfstool"
+corebootrom="${cbdir}/build/coreboot.rom"
+seavgabiosrom="payload/seabios/seavgabios.bin"
+
+./build module cbutils ${cbtree} || exit 1
+
+if [ ! -d "${cbdir}" ]; then
+	./download coreboot ${cbtree}
+fi
+
+cat version > "${cbdir}/.coreboot-version"
+
+if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then
+	if [ ! -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ]; then
+		# Even for 64-bit machines, coreboot builds 32-bit ROM
+		# images, so we only need to worry about i386-elf
+		make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc)
+	fi
+	case "$(uname -m)" in
+		x86*|i*86|amd64) : ;;
+		*) export CROSS_COMPILE=i386-elf- ;;
+	esac
+elif [ "${arch}" = "ARMv7" ]; then
+	if [ ! -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ]; then
+		make -C "${cbdir}" crossgcc-arm CPUS=$(nproc)
+	fi
+	case "$(uname -m)" in
+		arm|arm32|armv6*|armv7*) : ;;
+		*) export CROSS_COMPILE=arm-eabi- ;;
+	esac
+elif [ "${arch}" = "AArch64" ]; then
+	if [ ! -d "${cbdir}/util/crossgcc/xgcc/aarch64-elf/" ]; then
+		make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc)
+	fi
+	# aarch64 also needs armv7 toolchain for arm-trusted-firmware
+	if [ ! -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ]; then
+		make -C "${cbdir}" crossgcc-arm CPUS=$(nproc)
+	fi
+	case "$(uname -m)" in
+		arm64|aarch64) : ;;
+		*) export CROSS_COMPILE=aarch64-elf- ;;
+	esac
+fi
+
+export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH"
+
+if [ ! -f "${seavgabiosrom}" ] \
+		|| [ ! -f payload/seabios/seabios_libgfxinit.elf ] \
+		|| [ ! -f payload/seabios/seabios_vgarom.elf ] \
+		|| [ ! -f payload/seabios/seabios_normal.elf ]; then
+	if [ "${payload_seabios}" = "y" ]; then
+		./build payload seabios
+	elif [ "${payload_grub}" = "y" ] \
+			&& [ "${payload_grub_withseabios}" = "y" ]; then
+		./build payload seabios
 	fi
+fi
 
-	export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH"
-}
-
-build_dependency_seabios()
-{
-	if [ ! -f "${seavgabiosrom}" ] \
-			|| [ ! -f payload/seabios/seabios_libgfxinit.elf ] \
-			|| [ ! -f payload/seabios/seabios_vgarom.elf ] \
-			|| [ ! -f payload/seabios/seabios_normal.elf ]; then
-		if [ "${payload_seabios}" = "y" ]; then
-			./build payload seabios
-		elif [ "${payload_grub}" = "y" ] \
-				&& [ "${payload_grub_withseabios}" = "y" ]
-		then
-			./build payload seabios
-		fi
-	fi
-	if [ "${payload_memtest}" = "y" ] && [ ! -f "memtest86plus/memtest" ]
-	then
+if [ "${payload_memtest}" = "y" ]; then
+	if [ ! -f "memtest86plus/memtest" ]; then
 		./build module memtest86plus
 	fi
-}
+fi
 
-build_dependency_grub()
-{
-	if [ "${payload_grub}" != "y" ] \
-			&& [ "${payload_seabios_withgrub}" != "y" ]; then
-		return 0
-	fi
+[ -d "${romdir}/" ] || mkdir -p "${romdir}/"
+rm -f "${romdir}"/*
 
+if [ "${payload_grub}" = "y" ] \
+			|| [ "${payload_seabios_withgrub}" = "y" ]; then
 	if [ -f "payload/grub/grub_usqwerty.cfg" ]; then
-		sha1cmd="sha1sum resources/grub/config/grub.cfg"
-		grubrefchecksum="$(${sha1cmd} | awk '{print $1}')"
+		sha1sumcmd="sha1sum resources/grub/config/grub.cfg"
+		grubrefchecksum="$(${sha1sumcmd} | awk '{print $1}')"
 
-		sha1cmd="sha1sum payload/grub/grub_usqwerty.cfg"
-		grubsha1="$(${sha1cmd} | awk '{print $1}')"
+		sha1sumcmd="sha1sum payload/grub/grub_usqwerty.cfg"
+		grubbuildchecksum="$(${sha1sumcmd} | awk '{print $1}')"
 
-		if [ "${grubrefchecksum}" != "${grubsha1}" ]; then
+		if [ "${grubrefchecksum}" != "${grubbuildchecksum}" ]; then
 			rm -Rf payload/grub/
-			printf "GRUB change detected. Rebuilding:\n"
+			printf "Changes detected to GRUB. Re-building now:\n"
 		fi
 	else
-		printf "GRUB payloads needed. Building:\n"
+		printf "Required GRUB payloads not yet built. Building now:\n"
 		rm -Rf payload/grub/ # just in case
 	fi
 	for keymapfile in ${kmapdir}/*; do
+
 		if [ ! -f "${keymapfile}" ]; then
 			continue
 		fi
@@ -339,19 +289,13 @@ build_dependency_grub()
 		grubtestcfg="payload/grub/grub_${keymap}_test.cfg"
 
 		if [ ! -f "${grubelf}" ] || [ ! -f "${grubcfg}" ] || \
-				[ ! -f "${grubtestcfg}" ]; then
-			./build payload grub
+			[ ! -f "${grubtestcfg}" ]; then
+					./build payload grub
 		fi
 	done
-}
-
-build_dependency_uboot()
-{
-	if [ "${payload_uboot}" != "y" ]; then
-		return 0
-	fi
+fi
 
-	ubdir=""
+if [ "${payload_uboot}" = "y" ]; then
 	if [ "${uboot_config}" = "default" ]; then
 		ubdir="payload/u-boot/${board}"
 	else
@@ -363,152 +307,118 @@ build_dependency_uboot()
 	elif [ -f "${ubdir}/u-boot" ]; then
 		ubootelf="${ubdir}/u-boot"
 	else
-		printf "U-Boot needed. Building:\n"
+		printf "Required U-Boot payload not yet built. Building now\n"
 		rm -Rf "payload/u-boot/${board}" # just in case
 		./build payload u-boot "${board}"
 	fi
-}
+fi
 
-build_rom_images()
-{
-	[ -d "${romdir}/" ] || mkdir -p "${romdir}/"
-	rm -f "${romdir}"/*
-
-	for initmode in "normal" "vgarom" "libgfxinit"; do
-		hmode="vesafb"
-		if [ "${initmode}" != "vgarom" ]; then
-			hmode="corebootfb"
-		fi
-		modes="${hmode} txtmode"
-		if [ ! -z ${displaymodes} ]; then
-			modes="${displaymodes}"
-		fi
-		for displaymode in ${modes}; do
-			if [ "${initmode}" = "normal" ] \
-					&& [ "$displaymode" != "txtmode" ]; then
-				continue
-			fi
-			cbcfg="${boardcfgdir}/config/${initmode}"
-			cbcfg="${cbcfg}_${displaymode}"
-			if [ "${initmode}" = "normal" ]; then
-				cbcfg="${cbcfg%_*}"
-			fi
-			mkRoms "${cbcfg}" "${displaymode}" "${initmode}"
-		done
-	done
-
-	make distclean -BC "${cbdir}"
-}
-
-# Main ROM building function. This calls all other functions
-mkRoms()
-{
-	_cbcfg="${1}"
-	displaymode="${2}"
-	initmode="${3}"
+# it is assumed that no other work will be done on the ROM
+# after calling this function. therefore this function is "final"
+moverom() {
+	rompath="$1"
+	newrompath="$2"
+	cuttype="$3"
 
-	if [ ! -f "${_cbcfg}" ]; then
-		printf "'%s' does not exist. Skipping build for %s %s %s\n" \
-				${_cbcfg} ${board} \
-				${displaymode} ${initmode}
-		return 0
+	if [ "${blobs_required}" = "n" ]; then
+		newrompath="${newrompath%.rom}_noblobs.rom"
 	fi
 
-	# make coreboot ROM without a payload in it
-	mkCoreboot "${_cbcfg}"
-
-	# now add payloads, per user config:
+	printf "\nCreating new ROM image: %s\n" "${newrompath}"
 
-	if [ "${displaymode}" = "txtmode" ] \
-				&& [ "${payload_memtest}" = "y" ]; then
-		"${cbfstool}" "${corebootrom}" add-payload \
-				-f memtest86plus/memtest -n img/memtest \
-				-c lzma || exit 1
+	if [ "${cuttype}" = "4MiB IFD BIOS region" ]; then
+		dd if=${rompath} of=${newrompath} bs=1 \
+				skip=$(($(stat -c %s ${rompath}) - 0x400000)) \
+				count=4194304
+	else
+		cp ${rompath} ${newrompath}
 	fi
 
-	if [ "${payload_seabios}" = "y" ]; then
-		if [ "${payload_seabios_withgrub}" = "n" ]; then
-			x=${corebootrom}
-			y=${initmode}
-			t=$(mkSeabiosRom "$x" "fallback/payload" "$y")
-
-			_newrom="${romdir}/seabios_${board}_${initmode}.rom"
-			if [ "${initmode}" != "normal" ]; then
-				_newrom="${_newrom%.rom}_${displaymode}.rom"
+	for romsize in 4 8 16; do
+		ifdgbe="descriptors/ich9m/ich9fdgbe_${romsize}m.bin"
+		if [ "${cuttype}" = "${romsize}MiB ICH9 IFD NOR flash" ]; then
+			if [ ! -f "${ifdgbe}" ]; then
+				./build descriptors ich9m
 			fi
-
-			# rom image ready to be flashed:
-			moverom "${t}" "${_newrom}" "${romtype}"
-			rm -f "${t}"
-		else
-			tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
-			cp "${corebootrom}" "${tmprom}"
-			mkRomsWithGrub "${tmprom}" "${initmode}" \
-					"${displaymode}" "seabios_withgrub"
-			rm -f "${tmprom}"
+			dd if=${ifdgbe} of=${newrompath} bs=1 count=12k \
+					conv=notrunc
 		fi
-	fi
+		cmpstr="${romsize}MiB ICH9 IFD NOGBE NOR flash"
+		ifdgbe="descriptors/ich9m/ich9fdnogbe_${romsize}m.bin"
+		if [ "${cuttype}" = "${cmpstr}" ]; then
+			if [ ! -f "${ifdgbe}" ]; then
+				./build descriptors ich9m
+			fi
+			dd if=${ifdgbe} of=${newrompath} bs=1 count=4k \
+					conv=notrunc
+		fi
+	done
 
-	if [ "${payload_grub}" = "y" ]; then
-		mkRomsWithGrub "${corebootrom}" "${initmode}" \
-				"${displaymode}" "grub"
+	if [ "${cuttype}" = "i945 laptop" ]; then
+		dd if=${newrompath} of=top64k.bin bs=1 \
+			skip=$(($(stat -c %s ${newrompath}) - 0x10000)) \
+			count=64k
+		dd if=top64k.bin of=${newrompath} bs=1 \
+			seek=$(($(stat -c %s ${newrompath}) - 0x20000)) \
+			count=64k conv=notrunc
+		rm -f top64k.bin
 	fi
 
-	if [ "${payload_uboot}" = "y" ]; then
-		x=${corebootrom}
-		y=${uboot_config}
-		z=${cbfstool}
-		tmpubootrom="$(mkUbootRom "$x" "fallback/payload" "$y" "$z")"
-		if [ "${initmode}" = "normal" ]; then
-			_newrom="${romdir}/uboot_payload_${board}_"
-			_newrom="${_newrom}${initmode}.rom"
-		else
-			_newrom="${romdir}/uboot_payload_${board}_"
-			_newrom="${_newrom}${initmode}_${displaymode}.rom"
+	if [ "${microcode_required}" = "n" ]; then
+		_newrom_b="${newrompath%.rom}_nomicrocode.rom"
+		cp "${newrompath}" "${_newrom_b}" || exit 1
+		microcode_present="y"
+		"${cbfstool}" "${_newrom_b}" remove -n \
+				cpu_microcode_blob.bin || microcode_present="n"
+		if [ "${microcode_present}" = "n" ]; then
+			rm -f "${_newrom_b}" || exit 1
+			printf "REMARK: '%s' already lacks microcode\n" \
+					${newrompath}
+			printf "Renaming default ROM file instead.\n"
+			mv "${newrompath}" "${_newrom_b}" || exit 1
 		fi
-
-		# rom image ready to be flashed:
-		moverom "${tmpubootrom}" "${_newrom}" "${romtype}"
-		rm -f "${tmpubootrom}"
 	fi
 }
 
 # expected: configs must not specify a payload
-mkCoreboot()
-{
-	_cbcfg="${1}" # eg. resources/coreboot/e6400nvidia_4mb/config/normal
-
-	if [ ! -f "${_cbcfg}" ]; then
+mkCoreboot() {
+	cbdir="${1}" # eg. coreboot/default
+	cbcfgpath="${2}" # eg. resources/coreboot/e6400nvidia_4mb/config/normal
+	if [ ! -f "${cbcfgpath}" ]; then
 		printf "\nmkCoreboot: coreboot config '%s' does not exist. " \
-				${_cbcfg}
+				${cbcfgpath}
 		printf "Skipping build.\n"
 		return 0
 	fi
-
 	printf "%s-%s\n" "$(cat projectname)" "$(cat version)" \
 			> "${cbdir}/.coreboot-version"
+	(
+		if [ -f "${cbfstool}" ]; then
+			mv "${cbfstool}" "${cbdir}/cbfstool"
+		fi
 
-	if [ -f "${cbfstool}" ]; then
-		mv "${cbfstool}" "${cbdir}/cbfstool"
-	fi
-	make distclean -BC "${cbdir}"
-
-	if [ -f "${cbdir}/cbfstool" ]; then
-		mv "${cbdir}/cbfstool" "${cbfstool}"
-	fi
-
-	cp "${_cbcfg}" "${cbdir}"/.config
+		cd "${cbdir}"
+		make distclean
+		cd -
 
-	make -j$(nproc) -BC "${cbdir}"
+		if [ -f "${cbdir}/cbfstool" ]; then
+			mv "${cbdir}/cbfstool" "${cbfstool}"
+		fi
+	)
+	cp "${cbcfgpath}" "${cbdir}"/.config
+	(
+		cd "${cbdir}"
+		make -j$(nproc)
+	)
 }
 
 # make a rom in /tmp/ and then print the path of that ROM
-mkSeabiosRom()
-{
+mkSeabiosRom() {
 	target_cbrom="${1}" # rom to insert seabios in. will not be touched
 		# (a tmpfile will be made instead)
 	target_seabios_cbfs_path="${2}" # e.g. fallback/payload
-	target_initmode="${3}" # e.g. libgfxinit
+	target_opromloadonly="${3}" # TODO: purge (useless setting)
+	target_initmode="${4}" # e.g. libgfxinit
 
 	target_seabioself="payload/seabios/seabios_${target_initmode}.elf"
 	target_seavgabios_rom="payload/seabios/seavgabios.bin"
@@ -519,20 +429,24 @@ mkSeabiosRom()
 
 	"${cbfstool}" "${tmprom}" add-payload -f "${target_seabioself}" \
 			-n ${target_seabios_cbfs_path} -c lzma || exit 1
+
 	"${cbfstool}" "${tmprom}" add-int -i 3000 -n etc/ps2-keyboard-spinup \
 			|| exit 1
 
 	if [ "${target_initmode}" = "normal" ] \
 			|| [ "${target_initmode}" = "libgfxinit" ]; then
 		"${cbfstool}" "${tmprom}" add-int -i 2 \
-				-n etc/pci-optionrom-exec || exit 1
+					-n etc/pci-optionrom-exec || exit 1
 	elif [ "${target_initmode}" = "vgarom" ]; then # coreboot executes it
 		"${cbfstool}" "${tmprom}" add-int -i 0 \
-				-n etc/pci-optionrom-exec || exit 1
+					-n etc/pci-optionrom-exec || exit 1
 	fi # for undefined modes, don't add this integer. use SeaBIOS defaults
 
 	"${cbfstool}" "${tmprom}" add-int -i 0 -n etc/optionroms-checksum \
-			|| exit 1
+				|| exit 1
+
+	"${cbfstool}" "${tmprom}" add-int -i ${target_opromloadonly} \
+				-n etc/only-load-option-roms || exit 1
 
 	if [ "${target_initmode}" = "libgfxinit" ]; then
 		"${cbfstool}" "${tmprom}" add -f "${target_seavgabios_rom}" \
@@ -542,71 +456,37 @@ mkSeabiosRom()
 	printf "%s\n" "${tmprom}"
 }
 
-# Make separate ROM images with GRUB payload, for each supported keymap
-mkRomsWithGrub()
-{
-	tmprompath="${1}"
-	initmode="${2}"
-	displaymode="${3}"
-	firstpayloadname="${4}" # allow values: grub, seabios, seabios_withgrub
-
-	x=${tmprompath}
-	y=${initmode}
-	if [ "${payload_grub_withseabios}" = "y" ] \
-			&& [ "${firstpayloadname}" = "grub" ]; then
-		mv "$(mkSeabiosRom "${x}" "seabios.elf" "${y}")" \
-				"${tmprompath}"
-	elif [ "${payload_seabios_withgrub}" ] \
-			&& [ "${firstpayloadname}" != "grub" ]; then
-		mv "$(mkSeabiosRom "${x}" "fallback/payload" "${y}")" \
-				"${tmprompath}"
-	fi
+# make a rom in /tmp/ and then print the path of that ROM
+mkUbootRom() {
+	target_cbrom="${1}" # rom to insert u-boot in. it won't be touched
+		# (a tmpfile will be made instead)
+	target_uboot_cbfs_path="${2}" # e.g. fallback/payload
+	target_uboot_config="${3}"
+	cbfstool_path="${4}"
 
-	keymaps=""
-	if [ -z ${keyboard_layouts} ]; then
-		for kmapfile in "${kmapdir}"/*; do
-			keymaps="${keymaps} ${kmapfile}"
-		done
+	if [ "${target_uboot_config}" = "default" ]; then
+		target_ubdir="payload/u-boot/${board}"
 	else
-		for keymapname in ${keyboard_layouts}; do
-			keymaps="${keymaps} ${kmapdir}/${keymapname}.gkb"
-		done
+		target_ubdir="payload/u-boot/${board}/${target_uboot_config}"
 	fi
-	for keymapfile in ${keymaps}; do
-		if [ ! -f "${keymapfile}" ]; then
-			continue
-		fi
-
-		keymap="${keymapfile##*/}"
-		keymap="${keymap%.gkb}"
 
-		grub_path_in_cbfs="fallback/payload"
-		if [ "${firstpayloadname}" != "grub" ]; then
-			grub_path_in_cbfs="img/grub2"
-		fi
+	if [ -f "${target_ubdir}/u-boot.elf" ]; then
+		target_ubootelf="${target_ubdir}/u-boot.elf"
+	elif [ -f "${target_ubdir}/u-boot" ]; then
+		target_ubootelf="${target_ubdir}/u-boot"
+	fi
 
-		# evil bofh rfc 2646 compliance hack
-		x=${keymap}
-		y=${tmprompath}
-		z=${grub_path_in_cbfs}
-		tmpgrubrom="$(mkGrubRom "${x}" "${y}" "${z}")"
+	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
 
-		_newrom="${romdir}/${firstpayloadname}_${board}_${initmode}_"
-		if [ "${initmode}" = "normal" ]; then
-			_newrom="${_newrom}${keymap}.rom"
-		else
-			_newrom="${_newrom}${displaymode}_${keymap}.rom"
-		fi
+	cp "${target_cbrom}" "${tmprom}"
+	"${cbfstool}" "${tmprom}" add-payload -f "${target_ubootelf}" \
+			-n ${target_uboot_cbfs_path} -c lzma || exit 1
 
-		# rom image ready to be flashed:
-		moverom "${tmpgrubrom}" "${_newrom}" "${romtype}"
-		rm -f "${tmpgrubrom}"
-	done
+	printf "%s\n" "${tmprom}"
 }
 
 # make a rom in /tmp/ and then print the path of that ROM
-mkGrubRom()
-{
+mkGrubRom() {
 	target_keymap="${1}"
 	target_cbrom="${2}"
 	target_grubelf_cbfs_path="${3}" # e.g. fallback/payload
@@ -616,7 +496,6 @@ mkGrubRom()
 	grubtestcfg="payload/grub/grub_${target_keymap}_test.cfg"
 
 	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) || exit 1
-
 	cp "${target_cbrom}" "${tmprom}" || exit 1
 
 	"${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \
@@ -645,6 +524,7 @@ mkGrubRom()
 
 	"${cbfstool}" "${tmprom}" add -f "${tmpgrubcfg}" -n grub.cfg -t raw \
 			|| exit 1
+
 	"${cbfstool}" "${tmprom}" add -f "${tmpgrubtestcfg}" -n grubtest.cfg \
 			-t raw || exit 1
 	rm -f "${tmpgrubcfg}" "${tmpgrubtestcfg}"
@@ -661,96 +541,180 @@ mkGrubRom()
 	printf "%s\n" "${tmprom}"
 }
 
-# make a rom in /tmp/ and then print the path of that ROM
-mkUbootRom()
-{
-	target_cbrom="${1}" # rom to insert u-boot in. it won't be touched
-		# (a tmpfile will be made instead)
-	target_uboot_cbfs_path="${2}" # e.g. fallback/payload
-	target_uboot_config="${3}"
-	cbfstool_path="${4}"
+# Make separate ROM images with GRUB payload, for each supported keymap
+mkRomsWithGrub() {
+	tmprompath="${1}"
+	initmode="${2}"
+	displaymode="${3}"
+	firstpayloadname="${4}" # allow values: grub, seabios, seabios_withgrub
 
-	if [ "${target_uboot_config}" = "default" ]; then
-		target_ubdir="payload/u-boot/${board}"
+	x=${tmprompath}
+	y=${seabios_opromloadonly}
+	z=${initmode}
+	if [ "${payload_grub_withseabios}" = "y" ] \
+				&& [ "${firstpayloadname}" = "grub" ]; then
+		mv "$(mkSeabiosRom "${x}" "seabios.elf" "${y}" "${z}")" \
+				"${tmprompath}"
+	elif [ "${payload_seabios_withgrub}" ] \
+				&& [ "${firstpayloadname}" != "grub" ]; then
+		mv "$(mkSeabiosRom "${x}" "fallback/payload" "$y" "$z")" \
+				"${tmprompath}"
+	fi	
+
+	keymaps=""
+	if [ -z ${keyboard_layouts} ]; then
+		for kmapfile in "${kmapdir}"/*
+		do
+			keymaps="${keymaps} ${kmapfile}"
+		done
 	else
-		target_ubdir="payload/u-boot/${board}/${target_uboot_config}"
+		for keymapname in ${keyboard_layouts}; do
+			keymaps="${keymaps} ${kmapdir}/${keymapname}.gkb"
+		done
 	fi
+	for keymapfile in ${keymaps}; do
+		echo "keymaps is $keymaps, keymapfile is $keymapfile"
 
-	if [ -f "${target_ubdir}/u-boot.elf" ]; then
-		target_ubootelf="${target_ubdir}/u-boot.elf"
-	elif [ -f "${target_ubdir}/u-boot" ]; then
-		target_ubootelf="${target_ubdir}/u-boot"
-	fi
+		if [ ! -f "${keymapfile}" ]; then
+			continue
+		fi
 
-	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+		keymap="${keymapfile##*/}"
+		keymap="${keymap%.gkb}"
 
-	cp "${target_cbrom}" "${tmprom}"
-	"${cbfstool}" "${tmprom}" add-payload -f "${target_ubootelf}" \
-			-n ${target_uboot_cbfs_path} -c lzma || exit 1
+		grub_path_in_cbfs="fallback/payload"
+		if [ "${firstpayloadname}" != "grub" ]; then
+			grub_path_in_cbfs="img/grub2"
+		fi
 
-	printf "%s\n" "${tmprom}"
+		# evil bofh rfc 2646 compliance hack
+		x=${keymap}
+		y=${tmprompath}
+		z=${grub_path_in_cbfs}
+
+		tmpgrubrom="$(mkGrubRom "${x}" "${y}" "${z}")"
+
+		if [ "${initmode}" = "normal" ]; then
+			newrompath="${romdir}/${firstpayloadname}_${board}_"
+			newrompath="${newrompath}${initmode}_${keymap}.rom"
+		else
+			newrompath="${romdir}/${firstpayloadname}_${board}_"
+			newrompath="${newrompath}${initmode}_${displaymode}_"
+			newrompath="${newrompath}${keymap}.rom"
+		fi
+		moverom "${tmpgrubrom}" "${newrompath}" "${romtype}"
+		rm -f "${tmpgrubrom}"
+	done
 }
 
-# it is assumed that no other work will be done on the ROM
-# after calling this function. therefore this function is "final"
-moverom()
-{
-	rompath="$1"
-	_newrom="$2"
-	cuttype="$3"
+# Main ROM building function. This calls all other functions
+mkRoms() {
+	cbcfgpath="${1}"
+	displaymode="${2}"
+	initmode="${3}"
 
-	if [ "${blobs_required}" = "n" ]; then
-		_newrom="${_newrom%.rom}_noblobs.rom"
+	if [ ! -f "${cbcfgpath}" ]; then
+		printf "'%s' does not exist. Skipping build for %s %s %s\n" \
+				${cbcfgpath} ${board} \
+				${displaymode} ${initmode}
+		return 0
 	fi
 
-	printf "\nCreating new ROM image: %s\n" "${_newrom}"
-
-	cp ${rompath} ${_newrom}
+	mkCoreboot "${cbdir}" "${cbcfgpath}"
 
-	if [ "${cuttype}" = "i945 laptop" ]; then
-		dd if=${_newrom} of=top64k.bin bs=1 \
-				skip=$(($(stat -c %s ${_newrom}) - 0x10000)) \
-				count=64k
-		dd if=top64k.bin of=${_newrom} bs=1 \
-				seek=$(($(stat -c %s ${_newrom}) - 0x20000)) \
-				count=64k conv=notrunc
-		rm -f top64k.bin
+	if [ "${displaymode}" = "txtmode" ] \
+				&& [ "${payload_memtest}" = "y" ]; then
+		"${cbfstool}" "${corebootrom}" add-payload \
+				-f memtest86plus/memtest -n img/memtest \
+				-c lzma || exit 1
 	fi
 
-	for romsize in 4 8 16; do
-		for x in "IFD" "IFD NOGBE"; do
-			if [ "${romsize}MiB ICH9 ${x} NOR flash" \
-					!= "${cuttype}" ]; then
-				continue
-			fi
-			c=4
-			ifdgbe="descriptors/ich9m/ich9fdnogbe_${romsize}m.bin"
-			if [ "${x}" = "IFD" ]; then
-			c=12
-			ifdgbe="descriptors/ich9m/ich9fdgbe_${romsize}m.bin"
-			fi
-			if [ ! -f "${ifdgbe}" ]; then
-				./build descriptors ich9m
+	if [ "${payload_seabios}" = "y" ]; then
+		if [ "${payload_seabios_withgrub}" = "n" ]; then
+			x=${corebootrom}
+			y=${seabios_opromloadonly}
+			z=${initmode}
+			t=$(mkSeabiosRom "$x" "fallback/payload" "$y" "$z")
+			if [ "${initmode}" = "normal" ]; then
+				newrompath="${romdir}/seabios_${board}_"
+				newrompath="${newrompath}${initmode}.rom"
+			else
+				newrompath="${romdir}/seabios_${board}_"
+				newrompath="${newrompath}${initmode}_"
+				newrompath="${newrompath}${displaymode}.rom"
 			fi
-			dd if=${ifdgbe} of=${_newrom} bs=${c}k count=1 \
-					conv=notrunc
-		done
-	done
 
-	if [ "${microcode_required}" = "n" ]; then
-		_newrom_b="${_newrom%.rom}_nomicrocode.rom"
-		cp "${_newrom}" "${_newrom_b}" || exit 1
-		microcode_present="y"
-		"${cbfstool}" "${_newrom_b}" remove -n \
-				cpu_microcode_blob.bin || microcode_present="n"
-		if [ "${microcode_present}" = "n" ]; then
-			rm -f "${_newrom_b}" || exit 1
-			printf "REMARK: '%s' already lacks microcode\n" \
-					${_newrom}
-			printf "Renaming default ROM file instead.\n"
-			mv "${_newrom}" "${_newrom_b}" || exit 1
+			moverom "${t}" "${newrompath}" "${romtype}"
+			rm -f "${t}"
+		else
+			tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX)
+			cp "${corebootrom}" "${tmprom}"
+			mkRomsWithGrub "${tmprom}" "${initmode}" \
+					"${displaymode}" "seabios_withgrub"
+			rm -f "${tmprom}"
 		fi
 	fi
+
+	if [ "${payload_grub}" = "y" ]; then
+		mkRomsWithGrub "${corebootrom}" "${initmode}" \
+				"${displaymode}" "grub"
+	fi
+
+	if [ "${payload_uboot}" = "y" ]; then
+		x=${corebootrom}
+		y=${uboot_config}
+		z=${cbfstool}
+		tmpubootrom="$(mkUbootRom "$x" "fallback/payload" "$y" "$z")"
+		if [ "${initmode}" = "normal" ]; then
+			newrompath="${romdir}/uboot_payload_${board}_"
+			newrompath="${newrompath}${initmode}.rom"
+		else
+			newrompath="${romdir}/uboot_payload_${board}_"
+			newrompath="${newrompath}${initmode}_${displaymode}.rom"
+		fi
+		moverom "${tmpubootrom}" "${newrompath}" "${romtype}"
+		rm -f "${tmpubootrom}"
+	fi
 }
 
-main $@
+if [ -z ${displaymodes} ]; then
+	initmode="libgfxinit"
+	for displaymode in corebootfb txtmode; do
+		cbcfgpath="resources/coreboot/${board}/config/${initmode}_"
+		cbcfgpath="${cbcfgpath}${displaymode}"
+		mkRoms "${cbcfgpath}" "${displaymode}" "${initmode}"
+	done
+	
+	initmode="vgarom"
+	for displaymode in vesafb txtmode; do	
+		cbcfgpath="resources/coreboot/${board}/config/${initmode}_"
+		cbcfgpath="${cbcfgpath}${displaymode}"
+		mkRoms "${cbcfgpath}" "${displaymode}" "${initmode}"
+	done
+	
+	initmode="normal"
+	displaymode="txtmode"
+	cbcfgpath="resources/coreboot/${board}/config/${initmode}"
+	mkRoms "${cbcfgpath}" "${displaymode}" "${initmode}"
+
+else
+	echo "special displaymode defined as $displaymodes"
+	initmode="libgfxinit"
+	for displaymode in ${displaymodes}; do
+		cbcfgpath="resources/coreboot/${board}/config/${initmode}_"
+		cbcfgpath="${cbcfgpath}${displaymode}"
+		mkRoms "${cbcfgpath}" "${displaymode}" "${initmode}"
+	done
+
+	initmode="vgarom"
+	for displaymode in ${displaymodes}; do
+		cbcfgpath="resources/coreboot/${board}/config/${initmode}_"
+		cbcfgpath="${cbcfgpath}${displaymode}"
+		mkRoms "${cbcfgpath}" "${displaymode}" "${initmode}"
+	done
+fi
+
+(
+cd "${cbdir}"
+make distclean
+)