diff --git a/merge/README.txt b/merge/README.txt
index 70ebc0f..28d8727 100644
--- a/merge/README.txt
+++ b/merge/README.txt
@@ -49,6 +49,7 @@ merge/sys-apps/portage/syncmodule/calculate содержит код, котор
--- Заметки по шаблонам ---
Нужно проверить обрабатываются ли format='regex' с пустым содержимым
Обрабатывается ли корректно параметр name=''
+Проверить сравнение с версией в dracut 048
---Учесть при внедрении---
Удалены шаблоны для plymouth 0.9.4, учесть возможность того, что останутся устаревшие версии
diff --git a/merge/sys-kernel/.calculate_directory b/merge/sys-kernel/.calculate_directory
new file mode 100644
index 0000000..fe9987a
--- /dev/null
+++ b/merge/sys-kernel/.calculate_directory
@@ -0,0 +1 @@
+{% calculate append='skip' %}
diff --git a/merge/sys-kernel/calculate-sources/.calculate_directory b/merge/sys-kernel/calculate-sources/.calculate_directory
new file mode 100644
index 0000000..ad42ff9
--- /dev/null
+++ b/merge/sys-kernel/calculate-sources/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/etc', name='local.d', package='calculate-sources' %}
diff --git a/merge/sys-kernel/calculate-sources/Module.symvers b/merge/sys-kernel/calculate-sources/Module.symvers
new file mode 100644
index 0000000..035878d
--- /dev/null
+++ b/merge/sys-kernel/calculate-sources/Module.symvers
@@ -0,0 +1,11 @@
+{% calculate exec='/bin/bash', install.os.arch.machine == 'i686', action='!disk' %}
+
+for fn in /usr/src/*/Module.symvers
+do
+ if [[ -f $fn ]]
+ then
+ sed -ri 's/(alternatives_patched.*SYMBOL)_GPL/\1/' $fn
+ fi
+done
+
+true
diff --git a/merge/sys-kernel/calculate-sources/amdgpu.conf b/merge/sys-kernel/calculate-sources/amdgpu.conf
new file mode 100644
index 0000000..35c49d3
--- /dev/null
+++ b/merge/sys-kernel/calculate-sources/amdgpu.conf
@@ -0,0 +1,3 @@
+{% calculate path='/etc/modprobe.d' %}
+
+options amdgpu cik_support=1 si_support=1
diff --git a/merge/sys-kernel/calculate-sources/vboxvideo.conf b/merge/sys-kernel/calculate-sources/vboxvideo.conf
new file mode 100644
index 0000000..a17357e
--- /dev/null
+++ b/merge/sys-kernel/calculate-sources/vboxvideo.conf
@@ -0,0 +1,3 @@
+{% calculate path='/etc/modprobe.d' %}
+
+options vboxvideo modeset=0
diff --git a/merge/sys-kernel/dracut/.calculate_directory b/merge/sys-kernel/dracut/.calculate_directory
new file mode 100644
index 0000000..9ba3846
--- /dev/null
+++ b/merge/sys-kernel/dracut/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/usr/lib/dracut', name='modules.d', package='sys-kernel/dracut' %}
diff --git a/merge/sys-kernel/dracut/10i18n/module-setup.sh b/merge/sys-kernel/dracut/10i18n/module-setup.sh
new file mode 100644
index 0000000..1629226
--- /dev/null
+++ b/merge/sys-kernel/dracut/10i18n/module-setup.sh
@@ -0,0 +1,3 @@
+{% calculate format='regex' %}
+if \[\[ \$\{hostonly\} \]\] \&\& (! \[\[ \$\{i18n_install_all\})
+if \1
diff --git a/merge/sys-kernel/dracut/10video/module-setup.sh b/merge/sys-kernel/dracut/10video/module-setup.sh
new file mode 100644
index 0000000..b5b4de2
--- /dev/null
+++ b/merge/sys-kernel/dracut/10video/module-setup.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+#
+# Licensed under the GPLv2
+#
+# Copyright 2013 Red Hat, Inc.
+# Peter Jones
+
+check() {
+ return 255
+}
+
+depends() {
+ return 0
+}
+
+installkernel() {
+ instmods radeon uvesafb nouveau i915 amdgpu
+}
+
+install() {
+ inst_binary /usr/bin/cut
+ inst_binary /bin/grep
+ inst_script "$moddir/select-video.sh" "/sbin/select-video.sh"
+ inst_hook pre-pivot 50 "$moddir/system-video-blacklist.sh"
+ inst_hook cmdline 50 "$moddir/parse-cmdline.sh"
+ mkdir -p ${initdir}/etc/modprobe.d
+ if [ -f /etc/modprobe.d/amdgpu.conf ]; then
+ inst_multiple /etc/modprobe.d/amdgpu.conf
+ fi
+ if [ -f /etc/modprobe.d/vboxvideo.conf ]; then
+ inst_multiple /etc/modprobe.d/vboxvideo.conf
+ fi
+}
diff --git a/merge/sys-kernel/dracut/10video/parse-cmdline.sh b/merge/sys-kernel/dracut/10video/parse-cmdline.sh
new file mode 100755
index 0000000..d1ef273
--- /dev/null
+++ b/merge/sys-kernel/dracut/10video/parse-cmdline.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+[ -z "$calculate" ] && calculate=$(getarg calculate=)
+[ -z "$video" ] && video=$(getarg video=)
+[ -z "$bootimage" ] && bootimage=$(getarg BOOT_IMAGE=)
+
+[ -z "$calculate" ] && [ -z "$video" ] && return
+
+if [[ $bootimage != ${bootimage/SafeMode/} ]]
+then
+ echo "rd.plymouth=0" >>/etc/cmdline.d/90-noplymouth.conf
+fi
+
+if [ -n "$video" ]
+then
+ for i in ${video//,/ }
+ do
+ if [ -z "${i//[0-9-x@]}" ]
+ then
+ videoresolution=${i}
+ fi
+ done
+fi
+
+if [[ "${calculate//:/}" != "${calculate}" ]]
+then
+ for i in ${calculate//,/ }
+ do
+ case "${i}" in
+ video:*)
+ videodrv=`echo "${i}" | cut -s -d: -f2-`
+ ;;
+ resolution:*)
+ resolution=`echo "${i}" | cut -s -d: -f2-`
+ if [ -n "${resolution}" -a "${resolution}" != "auto" ]
+ then
+ videoresolution=${resolution}-32
+ fi
+ ;;
+ esac
+ done
+fi
+
+/sbin/select-video.sh /etc/modprobe.d/video-blacklist.conf $videodrv
diff --git a/merge/sys-kernel/dracut/10video/select-video.sh b/merge/sys-kernel/dracut/10video/select-video.sh
new file mode 100644
index 0000000..8cb171c
--- /dev/null
+++ b/merge/sys-kernel/dracut/10video/select-video.sh
@@ -0,0 +1,31 @@
+{% calculate chmod='755' %}
+#!/bin/bash
+
+blacklistfile=$1
+videomodule=$2
+
+if [[ -n $videomodule ]]
+then
+ cat >$blacklistfile <>$blacklistfile
+ ;;
+ radeon)
+ echo "blacklist amdgpu" >>$blacklistfile
+ ;;
+ nvidia)
+ echo "blacklist nouveau" >>$blacklistfile
+ ;;
+ amdgpu)
+ echo "blacklist radeon" >>$blacklistfile
+ ;;
+ esac
+else
+ rm -f $blacklistfile
+fi
diff --git a/merge/sys-kernel/dracut/10video/system-video-blacklist.sh b/merge/sys-kernel/dracut/10video/system-video-blacklist.sh
new file mode 100755
index 0000000..2fe6414
--- /dev/null
+++ b/merge/sys-kernel/dracut/10video/system-video-blacklist.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+if mount | grep " /sysroot " | grep ro, &>/dev/null
+then
+ mount -o rw,remount ${NEWROOT} &>/dev/null
+ /sbin/select-video.sh ${NEWROOT}/etc/modprobe.d/video-blacklist.conf $videodrv
+ mount -o ro,remount ${NEWROOT} &>/dev/null
+else
+ /sbin/select-video.sh ${NEWROOT}/etc/modprobe.d/video-blacklist.conf $videodrv
+fi
diff --git a/merge/sys-kernel/dracut/50plymouth/module-setup.sh b/merge/sys-kernel/dracut/50plymouth/module-setup.sh
new file mode 100644
index 0000000..786bbfd
--- /dev/null
+++ b/merge/sys-kernel/dracut/50plymouth/module-setup.sh
@@ -0,0 +1,8 @@
+{% calculate format='regex' %}
+(inst_hook emergency 50 "\$moddir"/plymouth-emergency.sh
+)\s*
+(\s*)(inst_multiple readlink)
+\1
+\2inst_rules /lib/udev/rules.d/71-udev-seat.rules
+
+\2\3
diff --git a/merge/sys-kernel/dracut/50plymouth/plymouth-pretrigger.sh b/merge/sys-kernel/dracut/50plymouth/plymouth-pretrigger.sh
new file mode 100644
index 0000000..879cab7
--- /dev/null
+++ b/merge/sys-kernel/dracut/50plymouth/plymouth-pretrigger.sh
@@ -0,0 +1,10 @@
+{% calculate format='regex' %}
+\n(\s+)(plymouthd)(\s*--attach-to-session)(\s*--pid-file\s*\S+)
+
+\1if getargbool 0 quiet
+\1then
+\1\1\2\4\3
+\1else
+\1\1\2\4
+\1fi
+
diff --git a/merge/sys-kernel/dracut/80calculate/copy-resolv.sh b/merge/sys-kernel/dracut/80calculate/copy-resolv.sh
new file mode 100755
index 0000000..7e95978
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/copy-resolv.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+if [[ -n $netroot ]]
+then
+ cp -a /etc/resolv.conf ${NEWROOT}/etc/
+fi
diff --git a/merge/sys-kernel/dracut/80calculate/iso-scan-rootok.sh b/merge/sys-kernel/dracut/80calculate/iso-scan-rootok.sh
new file mode 100755
index 0000000..40c3e02
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/iso-scan-rootok.sh
@@ -0,0 +1,15 @@
+{% calculate chmod='0755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+# live images are specified with
+# root=live:backingdev
+
+isofile=$(getarg iso-scan/filename)
+
+if [ -n "$isofile" -a "$root" = "live" ]; then
+ rootok=1
+{% if pkg() >= '044' %}
+ wait_for_dev -n /dev/mapper/live-rw
+{% endif %}
+fi
diff --git a/merge/sys-kernel/dracut/80calculate/iso-scan.sh b/merge/sys-kernel/dracut/80calculate/iso-scan.sh
new file mode 100755
index 0000000..ea0c122
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/iso-scan.sh
@@ -0,0 +1,43 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+
+isofile=$1
+
+[ -z "$isofile" ] && exit 1
+
+ismounted "/run/initramfs/isoscan" && exit 0
+
+mkdir -p "/run/initramfs/isoscan"
+
+do_iso_scan() {
+ local _name
+ local dev
+ for dev in /dev/disk/by-uuid/*; do
+ _name=$(dev_unit_name "$dev")
+ [ -e /tmp/isoscan-${_name} ] && continue
+ > /tmp/isoscan-${_name}
+ mount -t auto -o ro "$dev" "/run/initramfs/isoscan" || continue
+ if [ -f "/run/initramfs/isoscan/$isofile" ]; then
+ if [ "$root" == "live" ]; then
+ /sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root `losetup -f --show "/run/initramfs/isoscan/$isofile"`
+ else
+ losetup -f --show "/run/initramfs/isoscan/$isofile"
+ fi
+ rm -f -- "$job"
+ exit 0
+ else
+ umount "/run/initramfs/isoscan"
+ fi
+ done
+}
+
+do_iso_scan
+
+rmdir "/run/initramfs/isoscan"
+exit 1
diff --git a/merge/sys-kernel/dracut/80calculate/live-fallback.sh b/merge/sys-kernel/dracut/80calculate/live-fallback.sh
new file mode 100755
index 0000000..91fd097
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/live-fallback.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+
+[[ $root =~ ^live: ]] && /sbin/live-scan && cancel_wait_for_dev "${root#live:}"
+
+[ -e "$job" ] && rm -f "$job"
diff --git a/merge/sys-kernel/dracut/80calculate/live-scan.sh b/merge/sys-kernel/dracut/80calculate/live-scan.sh
new file mode 100755
index 0000000..1deb94a
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/live-scan.sh
@@ -0,0 +1,41 @@
+{% calculate chmod='0755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+
+LIVEPATH=/run/initramfs/livescan
+
+ismounted "$LIVEPATH" && exit 0
+
+mkdir -p "$LIVEPATH"
+
+check_for_live() {
+ [[ -f $LIVEPATH/livecd ]] && cat "$LIVEPATH/livecd" | grep -q calculate &>/dev/null
+}
+
+do_live_scan() {
+ local _name
+ local dev
+ for dev in /dev/disk/by-uuid/*; do
+ _name=$(dev_unit_name "$dev")
+ [ -e /tmp/livescan-${_name} ] && continue
+ > /tmp/livescan-${_name}
+ mount -t auto -o ro "$dev" "$LIVEPATH" || continue
+ if check_for_live; then
+ umount "$LIVEPATH"
+ /sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root $dev
+ exit 0
+ else
+ umount "$LIVEPATH"
+ fi
+ done
+}
+
+do_live_scan
+
+rmdir "/run/initramfs/livescan"
+exit 1
diff --git a/merge/sys-kernel/dracut/80calculate/module-setup.sh b/merge/sys-kernel/dracut/80calculate/module-setup.sh
new file mode 100755
index 0000000..2560090
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/module-setup.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+check() {
+ return 255
+}
+
+depends() {
+ # if dmsetup is not installed, then we cannot support fedora/red hat
+ # style live images
+{% if pkg() < '049' %}
+ [[ $hostonly ]] || echo rootfs-block dmsquash-live
+{% else %}
+ [[ $hostonly ]] || echo rootfs-block dmsquash-live network-legacy
+{% endif %}
+ return 0
+}
+
+installkernel() {
+ [[ $hostonly ]] || instmods squashfs loop iso9660
+ instmods =drivers/usb/host =drivers/usb/phy
+}
+
+install() {
+ if ! [[ $hostonly ]]
+ then
+ inst_multiple umount dmsetup blkid dd losetup grep blockdev cat cut sed rmdir pidof
+ inst_hook mount 20 "$moddir/scratch-mount-root.sh"
+ inst_hook cmdline 31 "$moddir/iso-scan-rootok.sh"
+ inst_hook pre-pivot 50 "$moddir/copy-resolv.sh"
+ inst_script "$moddir/scratch-live-root.sh" "/sbin/dmsquash-live-root"
+ inst_script "$moddir/mount-squashfs.sh" "/sbin/mount-squashfs"
+ inst_script "$moddir/iso-scan.sh" "/sbin/iso-scan"
+ inst_script "$moddir/live-scan.sh" "/sbin/live-scan"
+ inst_script "$moddir/nfsroot.sh" "/sbin/nfsroot"
+ inst_hook initqueue/timeout 95 "$moddir/live-fallback.sh"
+ fi
+ echo rd.skipfsck=1 >> "${initdir}/etc/cmdline.d/95-skipfsck.conf"
+}
diff --git a/merge/sys-kernel/dracut/80calculate/mount-squashfs.sh b/merge/sys-kernel/dracut/80calculate/mount-squashfs.sh
new file mode 100755
index 0000000..12e1b5e
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/mount-squashfs.sh
@@ -0,0 +1,93 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+
+live_dir=$(getarg rd.live.dir -d live_dir )
+squash_image=$(getarg rd.live.squashimg -d loop)
+[ -z "$squash_image" ] && squash_image="livecd.squashfs"
+
+getargbool 0 rd.live.ram -d -y live_ram -d -y docache && live_ram="yes"
+
+# we might have an embedded fs image on squashfs (compressed live)
+if [ -e /run/initramfs/live/${live_dir}/${squash_image} ]; then
+ SQUASHED="/run/initramfs/live/${live_dir}/${squash_image}"
+fi
+
+do_cache() {
+ allmemory=0
+ for i in $(cat /proc/meminfo | grep -e ^MemFree -e ^Cached | \
+ cut -d: -f2 | cut -dk -f1 | sed -e "s/^\s*//") ;
+ do
+ allmemory=$((${allmemory} + $i))
+ done
+
+ # getting size tmpfs of default
+ let curtfs=${allmemory}/2
+
+ # getting size of image
+ let imagesize=`ls -la ${SQUASHED} | sed -r -n 's/(\S*\s*){4}(\S*).*/\2/p'`/20000*21
+ let addon=${imagesize}/7
+ if [[ ${curtfs} -gt $(( ${imagesize} + ${addon} )) ]];
+ then
+ newsize=${curtfs}
+ else
+ newsize=$(( ${addon} + ${imagesize} ))
+ fi
+
+ if [[ ${newsize} -lt ${allmemory} ]];
+ then
+ LIVECACHE=/run/initramfs/livecache
+ mkdir -m 0755 -p $LIVECACHE
+ mount -o remount,size=${newsize}k -t tmpfs tmpfs /run
+ echo "Copying live image to RAM..."
+ echo "(this may take a few minutes)"
+ dd if=$SQUASHED of=${LIVECACHE}/livecd.squashfs bs=512 2> /dev/null
+ if [ $? -ne 0 ]
+ then
+ bad_msg "Failed to cache the loop file! Lack of space?"
+ umount ${LIVECACHE}
+ else
+ SQUASHED="${LIVECACHE}/livecd.squashfs"
+ echo "Unmounting media from /var/initramfs/live"
+ umount -nd /run/initramfs/live
+ [[ -d /run/initramfs/isoscan ]] && umount -nd /run/initramfs/isoscan
+ fi
+ else
+ echo "Too low memory for cache the loop file." 1>&2
+ fi
+}
+
+if [ -e "$SQUASHED" ] ; then
+ if [ -n "$live_ram" ] ; then
+ do_cache
+ fi
+
+ SQUASHED_LOOPDEV=$( losetup -f )
+ losetup -r $SQUASHED_LOOPDEV $SQUASHED
+ mkdir -m 0755 -p /run/initramfs/squashfs
+ mount -n -t squashfs -o ro $SQUASHED_LOOPDEV /run/initramfs/squashfs
+fi
+
+ROOTFLAGS="$(getarg rootflags)"
+if [ -n "$ROOTFLAGS" ]; then
+ ROOTFLAGS="-o $ROOTFLAGS"
+else
+ ROOTFLAGS="-o udba=reval,br:/overlay=rw,/run/initramfs/squashfs=ro"
+fi
+
+ln -s ${SQUASHED_LOOPDEV} /dev/mapper/live-rw
+{% if pkg() >= '045' %}
+ln -s ${SQUASHED_LOOPDEV} /run/rootfsbase
+{% endif %}
+{% if pkg() >= '049' %}
+ln -s ${SQUASHED_LOOPDEV} /dev/root
+{% endif %}
+
+need_shutdown
+
+exit 0
diff --git a/merge/sys-kernel/dracut/80calculate/nfsroot.sh b/merge/sys-kernel/dracut/80calculate/nfsroot.sh
new file mode 100755
index 0000000..17735e2
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/nfsroot.sh
@@ -0,0 +1,27 @@
+{% calculate chmod='0755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+. /lib/nfs-lib.sh
+
+[ "$#" = 3 ] || exit 1
+
+# root is in the form root=nfs[4]:[server:]path[:options], either from
+# cmdline or dhcp root-path
+netif="$1"
+root="$2"
+NEWROOT="$3"
+
+nfs_to_var $root $netif
+[ -z "$server" ] && die "Required parameter 'server' is missing"
+
+mkdir -m 0755 -p /run/initramfs/live
+
+mount_nfs $root /run/initramfs/live $netif && { [ -e /dev/root ] || ln -s null /dev/root ; }
+
+/sbin/mount-squashfs
+echo '[ -e /run/initramfs/squashfs/proc ]' > $hookdir/initqueue/finished/nfsroot.sh
+
+need_shutdown
diff --git a/merge/sys-kernel/dracut/80calculate/scratch-live-root.sh b/merge/sys-kernel/dracut/80calculate/scratch-live-root.sh
new file mode 100755
index 0000000..fbc6a4f
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/scratch-live-root.sh
@@ -0,0 +1,37 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+
+if getargbool 0 rd.live.debug -n -y rdlivedebug; then
+ exec > /tmp/liveroot.$$.out
+ exec 2>> /tmp/liveroot.$$.out
+ set -x
+fi
+
+[ -z "$1" ] && exit 1
+livedev="$1"
+
+# parse various live image specific options that make sense to be
+# specified as their own things
+
+ln -s $livedev /run/initramfs/livedev
+
+modprobe squashfs
+CMDLINE=$(getcmdline)
+for arg in $CMDLINE; do case $arg in ro|rw) liverw=$arg ;; esac; done
+# mount the backing of the live image first
+mkdir -m 0755 -p /run/initramfs/live
+mount -n -t $fstype -o ${liverw:-ro} $livedev /run/initramfs/live
+if [ "$?" != "0" ]; then
+ die "Failed to mount block device of live image"
+ exit 1
+fi
+
+/sbin/mount-squashfs
+
+exit 0
diff --git a/merge/sys-kernel/dracut/80calculate/scratch-mount-root.sh b/merge/sys-kernel/dracut/80calculate/scratch-mount-root.sh
new file mode 100755
index 0000000..37b9c48
--- /dev/null
+++ b/merge/sys-kernel/dracut/80calculate/scratch-mount-root.sh
@@ -0,0 +1,58 @@
+{% calculate chmod='755' %}
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+mount_live_root_aufs() {
+ mkdir /run/initramfs/workspace
+ mountoption="-o udba=reval,br:/run/initramfs/workspace=rw:/run/initramfs/squashfs=ro"
+ if getargbool 0 scratch
+ then
+ mkdir /run/initramfs/delta
+ mountoption="-o udba=reval,br:/run/initramfs/workspace=rw:/run/initramfs/delta=ro+wh:/run/initramfs/squashfs=ro"
+ fi
+ mount -t aufs $mountoption none $NEWROOT
+ if getargbool 0 scratch
+ then
+ mkdir /run/builder
+ mountoption="-o udba=reval,br:/run/initramfs/delta=rw:/run/initramfs/squashfs=ro"
+ mount -t aufs $mountoption none /run/builder
+ fi
+}
+
+mount_live_root_overlay() {
+ lowerdir=/run/initramfs/squashfs
+ if getargbool 0 scratch
+ then
+ upperdir=/run/initramfs/delta
+ builderdir=/run/builder
+ mkdir $upperdir
+ mkdir $builderdir
+ mkdir ${upperdir}-workdir
+ mount -t overlay -o lowerdir=${lowerdir},upperdir=${upperdir},workdir=${upperdir}-workdir none $builderdir
+ lowerdir=$builderdir
+ fi
+ upperdir=/run/initramfs/workspace
+ mkdir ${upperdir}
+ mkdir ${upperdir}-workdir
+ mount -t overlay -o lowerdir=${lowerdir},upperdir=${upperdir},workdir=${upperdir}-workdir none $NEWROOT
+}
+
+mount_live_root() {
+ local module_found=
+ for typefs in overlay aufs
+ do
+ if ! mount -t $typefs -o remount none /init 2>&1 | grep -q "unknown filesystem"
+ then
+ mount_live_root_$typefs
+ module_found=1
+ break
+ fi
+ done
+ [[ -z $module_found ]] &&
+ die "Cannot mount layered filesystem! Compile the kernel with CONFIG_OVERLAY_FS!"
+}
+
+[ -n "$root" -a -z "${root%%live*}" -o "$root" = "nfs" ] && mount_live_root
diff --git a/merge/sys-kernel/dracut/95nfs/module-setup.sh b/merge/sys-kernel/dracut/95nfs/module-setup.sh
new file mode 100644
index 0000000..fbe539e
--- /dev/null
+++ b/merge/sys-kernel/dracut/95nfs/module-setup.sh
@@ -0,0 +1,3 @@
+{% calculate format='regex', multiline, exists('/usr/lib/dracut/modules.d/95nfs/module-setup.sh') %}
+instmods.*$
+instmods =net/sunrpc =fs/nfs ipv6 nfs_acl nfs_layout_nfsv41_files =drivers/crypto/ccp
diff --git a/merge/sys-kernel/dracut/95tuxonice/module-setup.sh b/merge/sys-kernel/dracut/95tuxonice/module-setup.sh
new file mode 100644
index 0000000..a9d995d
--- /dev/null
+++ b/merge/sys-kernel/dracut/95tuxonice/module-setup.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+install() {
+ # install userui
+ [ -e /sbin/tuxoniceui ] && inst tuxoniceui || true
+
+ # install splash graphics if exists
+ my_inst_dir() {
+ inst_dir $1
+ for i in $1/*; do
+ if [ -d "$i" ]; then
+ my_inst_dir "$i"
+ else
+ inst "$i"
+ fi
+ done
+ }
+ [ -e /etc/splash/tuxonice ] && my_inst_dir /etc/splash/tuxonice
+ [ -e /etc/splash/suspend2 ] && my_inst_dir /etc/splash/suspend2
+
+ inst_hook pre-udev 30 "$moddir/tuxonice-prepare.sh"
+ inst_hook pre-mount 30 "$moddir/tuxonice-lvmfix.sh"
+ inst "$moddir"/tuxonice-resumecheck.sh /sbin/tuxonice-resumecheck.sh
+}
diff --git a/merge/sys-kernel/dracut/95tuxonice/tuxonice-lvmfix.sh b/merge/sys-kernel/dracut/95tuxonice/tuxonice-lvmfix.sh
new file mode 100644
index 0000000..c300158
--- /dev/null
+++ b/merge/sys-kernel/dracut/95tuxonice/tuxonice-lvmfix.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+# fixes an asynchronous problem with lvm/dracut while resuming
+# for details see https://bugzilla.redhat.com/show_bug.cgi?id=830447
+
+. /lib/dracut-lib.sh
+info "TuxOnIce lvmfix started"
+
+udevadm settle --timeout=30
+
+info "TuxOnIce udev should be now fully settled"
+
+return 0
+
diff --git a/merge/sys-kernel/dracut/95tuxonice/tuxonice-prepare.sh b/merge/sys-kernel/dracut/95tuxonice/tuxonice-prepare.sh
new file mode 100644
index 0000000..b96c89d
--- /dev/null
+++ b/merge/sys-kernel/dracut/95tuxonice/tuxonice-prepare.sh
@@ -0,0 +1,98 @@
+#!/bin/sh
+# prepare parameters for ToI
+
+. /lib/dracut-lib.sh
+info "TuxOnIce premodule started"
+
+# first check if ToI support is available
+if [ ! -d /sys/power/tuxonice ]; then
+ info "Kernel has no tuxonice support, aborting"
+ return 0
+else
+ info "Kernel has tuxonice support, continuing"
+fi
+
+if getarg noresume2; then
+ warn "noresume2 was specified, aborting"
+ return 0
+fi
+
+# prepare UserUI
+info "Setting up UserUI"
+UI="/sbin/tuxoniceui"
+UIOPTS=""
+
+if [ -e "/sys/class/graphics/fb0/state" -a -e "/etc/splash/tuxonice/" ]; then
+ UIOPTS="$UIOPTS -f"
+fi
+
+SYSFS_TUI_UI=/sys/power/tuxonice/user_interface
+PROGRAM_PATH=${SYSFS_TUI_UI}/program
+ENABLED_PATH=${SYSFS_TUI_UI}/enabled
+if [ -e "$UI" ] && [ -e "$PROGRAM_PATH" ] && [ -e "$ENABLED_PATH" ]; then
+ info "Using $UI with $UIOPTS"
+ echo "$UI $UIOPTS" >$PROGRAM_PATH
+ echo 1 >$ENABLED_PATH
+else
+ if [ -e "$ENABLED_PATH" ]; then
+ echo 0 >$ENABLED_PATH
+ fi
+fi
+
+# install udev rule for resume parameter
+if resume=$(getarg resume=) && ! getarg noresume2; then
+ resume="${resume#file:}"
+ resume="${resume#swap:}"
+ resume="${resume%:*}"
+else
+ unset resume
+fi
+
+info "Installing udev rule for resume parameter"
+case "$resume" in
+ LABEL=*) \
+ resume="$(echo $resume | sed 's,/,\\x2f,g')"
+ {
+ echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", ENV{ID_FS_LABEL}==\"${resume#LABEL=}\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'resume'\"";
+ } >> /etc/udev/rules.d/99-tuxonice.rules
+ ;;
+ UUID=*) \
+ {
+ echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", ENV{ID_FS_UUID}==\"${resume#UUID=}\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'resume'\"";
+ } >> /etc/udev/rules.d/99-tuxonice.rules
+ ;;
+ PARTUUID=*) \
+ {
+ echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", ENV{ID_PART_ENTRY_UUID}==\"${resume#PARTUUID=}\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'resume'\"";
+ } >> /etc/udev/rules.d/99-tuxonice.rules
+ ;;
+ *) \
+ {
+ echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", SYMLINK==\"${resume#/dev/}\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'resume'\"";
+ } >> /etc/udev/rules.d/99-tuxonice.rules
+ {
+ echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", KERNEL==\"${resume#/dev/}\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'resume'\"";
+ } >> /etc/udev/rules.d/99-tuxonice.rules
+ ;;
+esac
+
+
+# install udev rule for resuming
+info "Installing udev rule for ToI resume"
+{
+echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", ENV{ID_FS_TYPE}==\"suspend|swsuspend|swsupend\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'suspend'\"";
+} >> /etc/udev/rules.d/99-tuxonice.rules
+
+# install udev rule to add swapdevice as hibernation target
+info "Installing udev rule for ToI swap detection"
+{
+echo "SUBSYSTEM==\"block\", ACTION==\"add|change\", ENV{ID_FS_TYPE}==\"swap\", " \
+ " RUN+=\"/sbin/tuxonice-resumecheck.sh '/dev/%k' 'swap'\"";
+} >> /etc/udev/rules.d/99-tuxonice.rules
+
diff --git a/merge/sys-kernel/dracut/95tuxonice/tuxonice-resumecheck.sh b/merge/sys-kernel/dracut/95tuxonice/tuxonice-resumecheck.sh
new file mode 100644
index 0000000..4bad65c
--- /dev/null
+++ b/merge/sys-kernel/dracut/95tuxonice/tuxonice-resumecheck.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if [ "$2" = "suspend" ]; then
+ echo "<3>Dracut: found ToI/suspend signature in $1, trying to resume" > /dev/kmsg
+ OLDDEV=$(cat /sys/power/tuxonice/resume)
+ echo "swap:$1" >/sys/power/tuxonice/resume
+ echo 1 >/sys/power/tuxonice/do_resume
+ echo "<3>Dracut: no resume operation occured, restoring old value ($OLDDEV)" >/dev/kmsg
+ echo "$OLDDEV" >/sys/power/tuxonice/resume
+elif [ "$2" = "swap" ]; then
+ echo "<3>Dracut: found swap signature in $1, using for ToI" > /dev/kmsg
+ CURDEV=$(cat /sys/power/tuxonice/resume)
+ [ -z "$CURDEV" ] && echo "swap:$1" >/sys/power/tuxonice/resume
+elif [ "$2" = "resume" ]; then
+ echo "<3>Dracut: found resume parameter device in $1, trying to resume" > /dev/kmsg
+ echo 1 >/sys/power/tuxonice/do_resume
+ echo "<3>Dracut: no resume operation occured" >/dev/kmsg
+fi
diff --git a/merge/sys-kernel/dracut/dracut-lib.sh b/merge/sys-kernel/dracut/dracut-lib.sh
new file mode 100644
index 0000000..bc5d880
--- /dev/null
+++ b/merge/sys-kernel/dracut/dracut-lib.sh
@@ -0,0 +1,3 @@
+{% calculate format='regex', dotall, path='/usr/lib/dracut/modules.d/99base', pkg() < '039' %}
+(\nwait_for_dev.*?_name.*?str_replace.*)'\\x2f'
+\1'\\\\x2f'
diff --git a/merge/sys-kernel/dracut/dracut.conf.d/.calculate_directory b/merge/sys-kernel/dracut/dracut.conf.d/.calculate_directory
new file mode 100644
index 0000000..4b0af38
--- /dev/null
+++ b/merge/sys-kernel/dracut/dracut.conf.d/.calculate_directory
@@ -0,0 +1 @@
+{% calculate path='/usr/lib/dracut' %}
diff --git a/merge/sys-kernel/dracut/dracut.conf.d/20-gentoo.conf b/merge/sys-kernel/dracut/dracut.conf.d/20-gentoo.conf
new file mode 100644
index 0000000..481042a
--- /dev/null
+++ b/merge/sys-kernel/dracut/dracut.conf.d/20-gentoo.conf
@@ -0,0 +1 @@
+{% calculate source='/usr/lib/dracut/dracut.conf.d/gentoo.conf', exists('/usr/lib/dracut/dracut.conf.d/gentoo.conf'), mirror %}
diff --git a/merge/sys-kernel/dracut/dracut.conf.d/50-calculate.conf b/merge/sys-kernel/dracut/dracut.conf.d/50-calculate.conf
new file mode 100644
index 0000000..fa61e2a
--- /dev/null
+++ b/merge/sys-kernel/dracut/dracut.conf.d/50-calculate.conf
@@ -0,0 +1,14 @@
+
+omit_dracutmodules+=" multipath"
+add_dracutmodules+=" video calculate"
+{% if pkg('net-nds/rpcbind') and pkg('net-misc/iputils[arping]') %}
+add_dracutmodules+=" nfs"
+{% endif %}
+{% if pkg('sys-boot/plymouth') %}
+add_dracutmodules+=" plymouth"
+omit_dracutmodules+=" gensplash"
+{% endif %}
+omit_dracutmodules+=" biosdevname"
+
+i18n_default_font="ter-v18n"
+add_drivers+=" sunrpc crc32c_generic "
diff --git a/merge/sys-kernel/dracut/dracut.conf.d/gentoo.conf b/merge/sys-kernel/dracut/dracut.conf.d/gentoo.conf
new file mode 100644
index 0000000..e45386b
--- /dev/null
+++ b/merge/sys-kernel/dracut/dracut.conf.d/gentoo.conf
@@ -0,0 +1 @@
+{% calculate append='remove' %}