diff --git a/scripts/mkimage.sh b/scripts/mkimage.sh
index baf3380edb91e23d1bf8b6eb6a1f07b88479e5c5..0b413207ca608ee5d875fed1dfe5568f40f32a58 100755
--- a/scripts/mkimage.sh
+++ b/scripts/mkimage.sh
@@ -1,6 +1,8 @@
 #!/bin/sh
 
-# apk add abuild apk-tools alpine-conf busybox fakeroot xorriso
+# apk add \
+#	abuild apk-tools alpine-conf busybox fakeroot syslinux xorriso
+#	(for efi:) mtools dosfstools grub-efi
 
 # FIXME: clean workdir out of unneeded sections
 # FIXME: --release: cp/mv images to REPODIR/$ARCH/releases/
@@ -55,7 +57,7 @@ usage() {
 
 $0	[--tag RELEASE] [--outdir OUTDIR] [--workdir WORKDIR]
 		[--arch ARCH] [--profile PROFILE] [--hostkeys] [--simulate]
-		[--yaml FILE]
+		[--repository REPO] [--yaml FILE]
 $0	--help
 
 options:
@@ -64,6 +66,7 @@ options:
 --hostkeys	Copy system apk signing keys to created images
 --outdir	Specify directory for the created images
 --profile	Specify which profiles to build
+--repository	Add package repository to use for the image
 --simulate	Don't execute commands
 --tag		Build images for tag RELEASE
 --workdir	Specify temporary working directory (cache)
diff --git a/scripts/mkimg.base.sh b/scripts/mkimg.base.sh
index 6d1afb3b76f3056a47e35c21d0a087362ea22875..0c07fd79dcdaebe4ed2754241c072866c6596805 100755
--- a/scripts/mkimg.base.sh
+++ b/scripts/mkimg.base.sh
@@ -74,13 +74,14 @@ build_syslinux() {
 	local _fn
 	mkdir -p "$DESTDIR"/boot/syslinux
 	apk fetch --root "$APKROOT" --stdout syslinux | tar -C "$DESTDIR" -xz usr/share/syslinux
-	for _fn in isolinux.bin ldlinux.c32 libutil.c32 libcom32.c32 mboot.c32; do
+	for _fn in isohdpfx.bin isolinux.bin ldlinux.c32 libutil.c32 libcom32.c32 mboot.c32; do
 		mv "$DESTDIR"/usr/share/syslinux/$_fn "$DESTDIR"/boot/syslinux/$_fn || return 1
 	done
 	rm -rf "$DESTDIR"/usr
 }
 
 section_syslinux() {
+	[ "$ARCH" = x86 -o "$ARCH" = x86_64 ] || return 0
 	[ "$output_format" = "iso" ] || return 0
 	build_section syslinux $(apk fetch --root "$APKROOT" --simulate syslinux | sort | checksum)
 }
@@ -94,27 +95,41 @@ syslinux_gen_config() {
 	local _f
 	for _f in $kernel_flavors; do
 		if [ -z "${xen_params+set}" ]; then
-			cat <<EOF
-
-LABEL $_f
-	MENU LABEL Linux $_f
-	KERNEL /boot/vmlinuz-$_f
-	INITRD /boot/initramfs-$_f
-	DEVICETREEDIR /boot/dtbs
-	APPEND $initfs_cmdline $kernel_cmdline
-EOF
+			cat <<- EOF
+
+			LABEL $_f
+				MENU LABEL Linux $_f
+				KERNEL /boot/vmlinuz-$_f
+				INITRD /boot/initramfs-$_f
+				DEVICETREEDIR /boot/dtbs
+				APPEND $initfs_cmdline $kernel_cmdline
+			EOF
 		else
-			cat <<EOF
+			cat <<- EOF
 
-LABEL $_f
-	MENU LABEL Xen/Linux $_f
-	KERNEL /boot/syslinux/mboot.c32
-	APPEND /boot/xen.gz ${xen_params} --- /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline --- /boot/initramfs-$_f
-EOF
+			LABEL $_f
+				MENU LABEL Xen/Linux $_f
+				KERNEL /boot/syslinux/mboot.c32
+				APPEND /boot/xen.gz ${xen_params} --- /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline --- /boot/initramfs-$_f
+			EOF
 		fi
 	done
 }
 
+grub_gen_config() {
+	local _f
+	echo "set timeout=2"
+	for _f in $kernel_flavors; do
+		cat <<- EOF
+		
+		menuentry "Linux $_f" {
+			linux	/boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline
+			initrd	/boot/initramfs-$_f
+		}
+		EOF
+	done
+}
+
 build_syslinux_cfg() {
 	local syslinux_cfg="$1"
 	mkdir -p "${DESTDIR}/$(dirname $syslinux_cfg)"
@@ -123,27 +138,123 @@ build_syslinux_cfg() {
 
 section_syslinux_cfg() {
 	syslinux_cfg=""
-	[ ! "$output_format" = "iso" ] || syslinux_cfg="boot/syslinux/syslinux.cfg"
+	if [ "$ARCH" = x86 -o "$ARCH" = x86_64 ]; then
+		[ ! "$output_format" = "iso" ] || syslinux_cfg="boot/syslinux/syslinux.cfg"
+	fi
 	[ ! -n "$uboot_install" ] || syslinux_cfg="extlinux/extlinux.conf"
 	[ -n "$syslinux_cfg" ] || return 0
 	build_section syslinux_cfg $syslinux_cfg $(syslinux_gen_config | checksum)
 }
 
+build_grub_cfg() {
+	local grub_cfg="$1"
+	mkdir -p "${DESTDIR}/$(dirname $grub_cfg)"
+	grub_gen_config > "${DESTDIR}"/$grub_cfg
+}
+
+grub_gen_earlyconf() {
+	cat <<- EOF
+	search --no-floppy --set=root --label "alpine-$PROFILE $RELEASE $ARCH"
+	set prefix=(\$root)/boot/grub
+	EOF
+}
+
+build_grubefi_img() {
+	local _format="$1"
+	local _efi="$2"
+	local _tmpdir="$WORKDIR/efiboot.$3"
+
+	# Prepare grub-efi bootloader
+	mkdir -p "$_tmpdir/efi/boot"
+	grub_gen_earlyconf > "$_tmpdir"/grub_early.cfg
+	grub-mkimage \
+		--config="$_tmpdir"/grub_early.cfg \
+		--prefix="/boot/grub" \
+		--output="$_tmpdir/efi/boot/$_efi" \
+		--format="$_format" \
+		--compression="xz" \
+		$grub_mod
+
+	# Create the EFI image
+	# mkdosfs and mkfs.vfat are busybox applets which failed to create a proper image
+	# use dosfstools mkfs.fat instead
+	mkdir -p ${DESTDIR}/boot/grub/
+	dd if=/dev/zero of=${DESTDIR}/boot/grub/efiboot.img bs=1K count=1440
+	mkfs.fat -F 12 ${DESTDIR}/boot/grub/efiboot.img
+	mcopy -s -i ${DESTDIR}/boot/grub/efiboot.img $_tmpdir/efi ::
+}
+
+section_grubefi() {
+	[ -n "$grub_mod" ] || return 0
+	[ "$output_format" = "iso" ] || return 0
+
+	local _format _efi
+	case "$ARCH" in
+	x86_64)
+		_format="x86_64-efi"
+		_efi="bootx64.efi"
+		;;
+	aarch64)
+		_format="arm64-efi"
+		_efi="bootaa64.efi"
+		;;
+	*)
+		return 0
+		;;
+	esac
+
+	build_section grub_cfg boot/grub/grub.cfg $(grub_gen_config | checksum)
+	build_section grubefi_img $_format $_efi $(grub_gen_earlyconf | checksum)
+}
+
 create_image_iso() {
 	local ISO="${OUTDIR}/${output_filename}"
+	local _isolinux
+	local _efiboot
+
+	if [ -e "${DESTDIR}/boot/syslinux/isolinux.bin" ]; then
+		# isolinux enabled
+		_isolinux="
+			-isohybrid-mbr ${DESTDIR}/boot/syslinux/isohdpfx.bin
+			-eltorito-boot boot/syslinux/isolinux.bin
+			-eltorito-catalog boot/syslinux/boot.cat
+			-no-emul-boot
+			-boot-load-size 4
+			-boot-info-table
+			"
+	fi
+	if [ -e "${DESTDIR}/boot/grub/efiboot.img" ]; then
+		# efi boot enabled
+		if [ -z "$_isolinux" ]; then
+			# efi boot only
+			_efiboot="
+				-efi-boot-part
+				--efi-boot-image
+				-e boot/grub/efiboot.img
+				-no-emul-boot
+				"
+		else
+			# hybrid isolinux+efi boot
+			_efiboot="
+				-eltorito-alt-boot
+				-e boot/grub/efiboot.img
+				-no-emul-boot
+				-isohybrid-gpt-basdat
+				"
+		fi
+	fi
 	xorrisofs \
-		-o ${ISO} -l -J -R \
-		-b boot/syslinux/isolinux.bin		\
-		-c boot/syslinux/boot.cat		\
-		-V "alpine-$PROFILE $RELEASE $ARCH"	\
-		-no-emul-boot		\
-		-boot-load-size 4	\
-		-boot-info-table	\
-		-quiet			\
-		-follow-links		\
-		${iso_opts}		\
+		-quiet \
+		-output ${ISO} \
+		-full-iso9660-filenames \
+		-joliet \
+		-rock \
+		-volid "alpine-$PROFILE $RELEASE $ARCH" \
+		$_isolinux \
+		$_efiboot \
+		-follow-links \
+		${iso_opts} \
 		${DESTDIR}
-	isohybrid ${ISO}
 }
 
 create_image_targz() {
@@ -154,6 +265,7 @@ profile_base() {
 	kernel_flavors="grsec"
 	initfs_cmdline="modules=loop,squashfs,sd-mod,usb-storage quiet"
 	initfs_features="ata base bootchart cdrom squashfs ext2 ext3 ext4 mmc raid scsi usb virtio"
+	#grub_mod="disk part_msdos linux normal configfile search search_label efi_uga efi_gop fat iso9660 cat echo ls test true help"
 	apks="alpine-base alpine-mirrors bkeymaps chrony e2fsprogs network-extras openssl openssh tzdata"
 	apkovl=
 	hostname="alpine"
diff --git a/scripts/mkimg.standard.sh b/scripts/mkimg.standard.sh
index c5bd9709b7fc3a2354eb9cf76bfc675cb5461fa8..5e18160c9abb4fa01e18535216cfdfffb1ce2d63 100755
--- a/scripts/mkimg.standard.sh
+++ b/scripts/mkimg.standard.sh
@@ -9,6 +9,7 @@ profile_standard() {
 
 profile_vanilla() {
 	profile_standard
+	#arch="$arch aarch64"
 	kernel_flavors="vanilla"
 	kernel_addons=
 }