diff --git a/dracut-004-emergency.patch b/dracut-004-emergency.patch
new file mode 100644
index 0000000..4f1d67f
--- /dev/null
+++ b/dracut-004-emergency.patch
@@ -0,0 +1,19 @@
+commit 5db587d7c118afc47b50b4872100b508c84646fa
+Author: Harald Hoyer <harald@redhat.com>
+Date:   Wed Jan 20 16:04:55 2010 +0100
+
+    init: fixed emergency_shell argument parsing
+
+diff --git a/modules.d/99base/init b/modules.d/99base/init
+index 8dc00a9..ab033a7 100755
+--- a/modules.d/99base/init
++++ b/modules.d/99base/init
+@@ -35,7 +35,7 @@ wait_for_loginit()
+ 
+ emergency_shell()
+ {
+-    if [ $1 = "-n" ]; then
++    if [ "$1" = "-n" ]; then
+         _rdshell_name=$2
+         shift 2 
+     else
diff --git a/dracut-004-firmware.patch b/dracut-004-firmware.patch
new file mode 100644
index 0000000..b838f83
--- /dev/null
+++ b/dracut-004-firmware.patch
@@ -0,0 +1,19 @@
+diff -up dracut-004/modules.d/95udev-rules/install.fw dracut-004/modules.d/95udev-rules/install
+--- dracut-004/modules.d/95udev-rules/install.fw	2010-01-29 16:40:11.000000000 +0100
++++ dracut-004/modules.d/95udev-rules/install	2010-01-29 16:40:25.000000000 +0100
+@@ -15,7 +15,6 @@ inst_rules "$moddir/01-ignore.rules"
+ 
+ # for firmware loading
+ inst_rules 50-firmware.rules
+-dracut_install /lib/udev/firmware.sh
+ dracut_install cat uname
+ 
+ if [ ! -x /lib/udev/vol_id ]; then
+@@ -31,6 +30,7 @@ ata_id \
+ cdrom_id \
+ create_floppy_devices \
+ edd_id \
++firmware \
+ firmware.sh \
+ fw_unit_symlinks.sh \
+ hid2hci \
diff --git a/dracut-004-forcepermissive.patch b/dracut-004-forcepermissive.patch
new file mode 100644
index 0000000..1ece5bb
--- /dev/null
+++ b/dracut-004-forcepermissive.patch
@@ -0,0 +1,12 @@
+diff -up dracut-004/modules.d/99base/selinux-loadpolicy.sh.load dracut-004/modules.d/99base/selinux-loadpolicy.sh
+--- dracut-004/modules.d/99base/selinux-loadpolicy.sh.load	2010-01-15 14:07:54.000000000 +0100
++++ dracut-004/modules.d/99base/selinux-loadpolicy.sh	2010-01-26 11:23:56.000000000 +0100
+@@ -37,6 +37,8 @@ rd_load_policy()
+ 	} 2>&1 | vinfo
+ 
+ 	if [ $ret -eq 0 -o $ret -eq 2 ]; then
++	    # If machine requires a relabel, force to permissive mode
++	    [ -e "$NEWROOT"/.autorelabel ] && ( echo 0 > "$NEWROOT"/selinux/enforce )
+ 	    return 0
+ 	fi
+ 
diff --git a/dracut-004-multipath-check.patch b/dracut-004-multipath-check.patch
new file mode 100644
index 0000000..974a26d
--- /dev/null
+++ b/dracut-004-multipath-check.patch
@@ -0,0 +1,48 @@
+From: Peter Jones <pjones@redhat.com>
+Subject: [PATCH] Add a check file for multipath.
+Date: 	Fri, 22 Jan 2010 10:56:40 -0500
+
+If multipath isn't installed, don't use it.  If we're in hostonly mode,
+only install the multipath module if it's used for / .  Otherwise, if
+the user was dumb enough to install it, they get it during bootup.
+---
+ modules.d/90multipath/check |   27 +++++++++++++++++++++++++++
+ 1 files changed, 27 insertions(+), 0 deletions(-)
+ create mode 100755 modules.d/90multipath/check
+
+diff --git a/modules.d/90multipath/check b/modules.d/90multipath/check
+new file mode 100755
+index 0000000..d0cad4c
+--- /dev/null
++++ b/modules.d/90multipath/check
+@@ -0,0 +1,27 @@
++#!/bin/bash
++
++# if there's no multipath binary, no go.
++which multipath >/dev/null 2>&1 || exit 1
++
++[[ $1 = -d ]] && exit 0
++
++. $dracutfunctions
++[[ $debug ]] && set -x
++
++is_mpath() {
++    [ -e /sys/dev/block/$1/dm/uuid ] || return 1
++    [[ $(cat /sys/dev/block/$1/dm/uuid) =~ ^mpath- ]] && return 0
++    return 1
++}
++
++# If we're in hostonly mode, do mpath if we appear to be using it for /
++if [[ $1 = -h ]]; then
++    rootdev=$(find_root_block_device)
++    if [[ $rootdev ]]; then
++        check_block_and_slaves is_mpath "$rootdev" && exit 0
++    fi
++    exit 1
++fi
++
++# the user installed it, they get it...
++exit 0
+-- 
+1.6.5.2
+
diff --git a/dracut.spec b/dracut.spec
index 682c57a..c419ada 100644
--- a/dracut.spec
+++ b/dracut.spec
@@ -20,7 +20,7 @@
 
 Name: dracut
 Version: 004
-Release: 1%{?rdist}
+Release: 5%{?rdist}
 Summary: Initramfs generator using udev
 Group: System Environment/Base		
 License: GPLv2+	
@@ -28,6 +28,10 @@ URL: http://apps.sourceforge.net/trac/dracut/wiki
 # Source can be generated by 
 # http://dracut.git.sourceforge.net/git/gitweb.cgi?p=dracut/dracut;a=snapshot;h=%{?dashgittag};sf=tgz
 Source0: dracut-%{version}%{?dashgittag}.tar.bz2
+Patch1:  dracut-004-emergency.patch
+Patch2:  dracut-004-forcepermissive.patch
+Patch3:  dracut-004-multipath-check.patch
+Patch4:  dracut-004-firmware.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 %if 0%{?fedora} > 12 || 0%{?rhel} >= 6
@@ -131,6 +135,7 @@ kernel modules and firmware files needed by dracut modules.
 
 %package tools
 Summary: Dracut tools to build the local initramfs
+Requires: %{name} = %{version}-%{release}
 Requires: coreutils cryptsetup-luks device-mapper
 Requires: diffutils dmraid findutils gawk grep lvm2
 Requires: module-init-tools sed
@@ -141,6 +146,12 @@ This package contains tools to assemble the local initrd and host configuration.
 
 %prep
 %setup -q -n %{name}-%{version}%{?dashgittag}
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1 
+%patch4 -p1 
+chmod 0755 modules.d/90multipath/check
+chmod 0755 modules.d/60xen/check
 
 %build
 make WITH_SWITCH_ROOT=0%{?with_switch_root}
@@ -244,6 +255,20 @@ rm -rf $RPM_BUILD_ROOT
 %dir /var/lib/dracut/overlay
 
 %changelog
+* Fri Jan 29 2010 Harald Hoyer <harald@redhat.com> 004-5
+- fixed firmware.sh bug (#559975 #559597)
+
+* Tue Jan 26 2010 Harald Hoyer <harald@redhat.com> 004-4
+- add multipath check
+
+* Tue Jan 26 2010 Harald Hoyer <harald@redhat.com> 004-3
+- fix selinux handling if .autorelabel is present
+- Resolves: rhbz#557744
+
+* Wed Jan 20 2010 Harald Hoyer <harald@redhat.com> 004-2
+- fix emergency_shell argument parsing
+- Related: rhbz#543948
+
 * Fri Jan 15 2010 Harald Hoyer <harald@redhat.com> 004-1
 - version 004
 - Resolves: rhbz#529339 rhbz#533494 rhbz#548550