diff --git a/Makefile b/Makefile
index fc01d1a87de7138b855383c62390b63a82608bca..40dc2846493e497e2b67d7f06b9c03e906b06253 100644
--- a/Makefile
+++ b/Makefile
@@ -48,7 +48,9 @@ CONF_FILES	:= mkinitfs.conf \
 		features.d/xfs.files \
 		features.d/xfs.modules \
 		features.d/zfs.files \
-		features.d/zfs.modules
+		features.d/zfs.modules \
+		features.d/qeth.modules \
+		features.d/dasd_mod.modules
 
 SCRIPTS		:= mkinitfs bootchartd initramfs-init
 IN_FILES	:= $(addsuffix .in,$(SCRIPTS))
@@ -71,6 +73,9 @@ SED_REPLACE	:= -e 's:@VERSION@:$(FULL_VERSION):g' \
 		-e 's:@datadir@:$(datadir):g'
 
 DEFAULT_FEATURES ?= ata base cdrom ext2 ext4 keymap kms mmc raid scsi usb virtio
+ifeq ($(shell uname -m), s390x)
+DEFAULT_FEATURES += qeth dasd_mod
+endif
 
 
 all:	$(SBIN_FILES) $(SCRIPTS) $(CONF_FILES)
diff --git a/features.d/dasd_mod.modules b/features.d/dasd_mod.modules
new file mode 100644
index 0000000000000000000000000000000000000000..ce843c5b7e11518994213d3e9a23dc776db7c674
--- /dev/null
+++ b/features.d/dasd_mod.modules
@@ -0,0 +1 @@
+kernel/drivers/s390/block/dasd*
diff --git a/features.d/qeth.modules b/features.d/qeth.modules
new file mode 100644
index 0000000000000000000000000000000000000000..bb5c320f09e4f98d3f1f0f0223ea425c5b5e3946
--- /dev/null
+++ b/features.d/qeth.modules
@@ -0,0 +1 @@
+kernel/drivers/s390/net/qeth*
diff --git a/initramfs-init.in b/initramfs-init.in
index bf2d9bd12f211ddac82b48af898518858fce6620..15a28270ed3f7e5e324dfba262609441e50fc78b 100755
--- a/initramfs-init.in
+++ b/initramfs-init.in
@@ -269,7 +269,7 @@ set -- $(cat /proc/cmdline)
 myopts="alpine_dev autodetect autoraid chart cryptroot cryptdm cryptheader cryptoffset
 	cryptdiscards debug_init dma init_args keep_apk_new modules ovl_dev pkgs quiet
 	root_size root usbdelay ip alpine_repo apkovl alpine_start splash blacklist
-	overlaytmpfs rootfstype rootflags nbd resume"
+	overlaytmpfs rootfstype rootflags nbd resume s390x_net dasd nameserver s390x_installer"
 
 for opt; do
 	case "$opt" in
@@ -345,6 +345,30 @@ mount -t devpts -o gid=5,mode=0620,noexec,nosuid devpts /dev/pts
 [ -d /dev/shm ] || mkdir /dev/shm
 mount -t tmpfs -o nodev,nosuid,noexec shm /dev/shm
 
+if [ -n "$dasd" ]; then
+	for mod in dasd_mod dasd_eckd_mod dasd_fba_mod; do
+		modprobe $mod
+	done
+	for _dasd in $(echo "$dasd" | tr ',' ' ' ); do
+		echo 1 > /sys/bus/ccw/devices/"${_dasd%%:*}"/online
+	done
+fi
+
+if [ "${s390x_net%%,*}" = "qeth_l2" ]; then
+	for mod in qeth qeth_l2 qeth_l3; do
+		modprobe $mod
+	done
+	_channel="${s390x_net#*,}"
+	echo "$_channel" > /sys/bus/ccwgroup/drivers/qeth/group
+	echo 1 > /sys/bus/ccwgroup/drivers/qeth/"${_channel%%,*}"/layer2
+	echo 1 > /sys/bus/ccwgroup/drivers/qeth/"${_channel%%,*}"/online
+fi
+
+if [ -n "$s390x_installer" ]; then
+	echo "nameserver $nameserver" > /etc/resolv.conf
+	ALPINE_REPO=${KOPT_alpine_repo:-http://dl-cdn.alpinelinux.org/alpine/latest-stable/main}
+fi
+
 # load available drivers to get access to modloop media
 ebegin "Loading boot drivers"
 
@@ -572,6 +596,7 @@ fi
 
 # hack so we get openrc
 pkgs="$pkgs alpine-base"
+[ -n "$s390x_installer" ] && pkgs="$pkgs openssh"
 
 # copy keys so apk finds them. apk looks for stuff relative --root
 mkdir -p $sysroot/etc/apk/keys/
@@ -610,7 +635,7 @@ else
 	apkflags="$apkflags --update-cache"
 fi
 
-if [ "$KOPT_quiet" = yes ]; then
+if [ "$KOPT_quiet" = yes ] || [ -n "$s390x_installer" ]; then
 	apkflags="$apkflags --quiet"
 fi
 
@@ -627,6 +652,19 @@ if [ -n "$ovlfiles" ]; then
 else
 	apk add --root $sysroot $repo_opt $apkflags $pkgs
 fi
+
+if [ -n "$s390x_installer" ]; then
+	rc_add sshd default
+	echo "PermitRootLogin yes" >> $sysroot/etc/ssh/sshd_config
+	# to make modloop happy
+	mkdir -p $sysroot/.modloop/modules/$(uname -r)
+	if [ -n "${s390x_installer#*,}" ]; then
+		echo "root:${s390x_installer#*,}" > $sysroot/.passwd
+		chroot $sysroot sh -c 'chpasswd < /.passwd'
+		rm $sysroot/.passwd
+	fi
+fi
+
 umount $sysroot/sys $sysroot/proc $sysroot/dev
 eend $?