diff --git a/lustre/scripts/lbuild b/lustre/scripts/lbuild
index ce1c52bff7e27a1dffe8dce76473d528b4566086..3607da67dd6f9a8ab254397ccc62ed0918860885 100755
--- a/lustre/scripts/lbuild
+++ b/lustre/scripts/lbuild
@@ -12,6 +12,7 @@ TAG=
 TARGET=
 TARGET_ARCHS=
 CONFIGURE_FLAGS=
+EXTERNAL_PATCHES=
 EXTRA_VERSION=
 
 # from target file
@@ -41,11 +42,15 @@ cleanup()
     true
 }
 
+error()
+{
+    [ "$1" ] && echo -e "\n${0##*/}: $1"
+}
+
 fatal()
 {
     cleanup
-    [ "$2" ] && echo
-    [ "$2" ] && echo "${0##*/}: $2"
+    error "$2"
     exit $1
 }
 
@@ -79,6 +84,11 @@ Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
     environment variable \$CVSROOT is used if this option is not
     present.
 
+  --external-patches=EXTERNAL_PATCHES
+    Directory similar to lustre/kernel_patches/ that lbuild should
+    look for seres and config files in before looking in the lustre
+    tree.
+
   --extraversion=EXTRAVERSION
     Text to use for the rpm release and kernel extraversion.
 
@@ -177,7 +187,10 @@ uniqify()
 load_target()
 {
     EXTRA_VERSION_save="$EXTRA_VERSION"
-    TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
+    for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/kernel_patches" ; do
+	TARGET_FILE="$patchesdir/targets/$TARGET.target"
+	[ -r "$TARGET_FILE" ] && break
+    done
     [ -r "$TARGET_FILE" ] || \
 	fatal 1 "Target $TARGET was not found."
 
@@ -196,9 +209,12 @@ load_target()
 	    fatal 1 "Target $TARGET's kernel file $KERNEL not found in kernel directory $KERNELDIR."
     fi
 
-    SERIES_FILE="$TOPDIR/lustre/kernel_patches/series/$SERIES"
-    [ -r "$SERIES_FILE" ] || \
-	fatal 1 "Target $TARGET's series $SERIES missing from $TOPDIR/lustre/kernel_patches/series."
+    for series in $SERIES ; do
+	for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/kernel_patches" ; do
+	    [ -r "$patchesdir/series/$series" ] && continue 2
+	done
+	fatal 1 "Target $TARGET's series $SERIES could not be found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n\t$TOPDIR/lustre/kernel_patches/series."
+    done
 
     CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/$CONFIG"
     [ -r "$CONFIG_FILE" ] || \
@@ -282,24 +298,35 @@ patch_linux()
     FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
     [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
     pushd linux >/dev/null
-    echo -n "Applying patches:"
-    for patch in $(<"$SERIES_FILE") ; do
-	echo -n " $patch"
-	PATCH_FILE="$TOPDIR/lustre/kernel_patches/patches/$patch"
-	[ -r "$PATCH_FILE" ] || \
-	    fatal 1 "Patch $patch does not exist in Lustre tree."
-	cat "$PATCH_FILE" >> "$FULL_PATCH" || \
-	    fatal 1 "Error adding patch $patch to full patch."
-	patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
+    for series in $SERIES ; do
+	echo -n "Applying series $series:"
+	for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/kernel_patches" ; do
+	    [ -r "$patchesdir/series/$series" ] || continue
+	    SERIES_FILE="$patchesdir/series/$series"
+	    for patch in $(<"$SERIES_FILE") ; do
+		echo -n " $patch"
+		PATCH_FILE="$patchesdir/patches/$patch"
+		[ -r "$PATCH_FILE" ] || \
+		    fatal 1 "Patch $patch does not exist in Lustre tree."
+		cat "$PATCH_FILE" >> "$FULL_PATCH" || \
+		    fatal 1 "Error adding patch $patch to full patch."
+		patch -s -p1 < "$PATCH_FILE" || fatal 1 "Error applying patch $patch."
+	    done
+	    break
+	done
+	echo
     done
-    echo
     popd >/dev/null
     echo "Full patch has been saved in ${FULL_PATCH##*/}."
     echo "Replacing .config files..."
     [ -d linux/configs ] || mkdir linux/configs || \
         fatal 1 "Error creating configs directory."
     rm -f linux/configs/*
-    cp -v lustre/kernel_patches/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ || \
+    copysuccess=0
+    for patchesdir in "$EXTERNAL_PATCHES" "lustre/kernel_patches" ; do
+	cp -v $patchesdir/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ >/dev/null && copysuccess=1
+    done
+    [ "$copysuccess" = "1" ] || \
 	fatal 1 "Error copying in kernel configs."
 }
 
@@ -324,22 +351,23 @@ clean_linux()
 prep_build()
 {
     # make .spec file
-    sed -e "s/@KERNEL_VERSION@/$VERSION/g" \
-	-e "s/@KERNEL_EXTRA_VERSION@/$EXTRA_VERSION/g" \
+    sed \
+	-e "s^@BASE_ARCHS@^$BASE_ARCHS^g" \
+	-e "s^@BIGMEM_ARCHS@^$BIGMEM_ARCHS^g" \
+	-e "s^@BOOT_ARCHS@^$BOOT_ARCHS^g" \
+	-e "s^@CONFIGURE_FLAGS@^$CONFIGURE_FLAGS^g" \
+	-e "s^@JENSEN_ARCHS@^$BOOT_ARCHS^g" \
+	-e "s^@KERNEL_EXTRA_VERSION@^$EXTRA_VERSION^g" \
 	-e "s^@KERNEL_RELEASE@^${EXTRA_VERSION//-/_}^g" \
-	-e "s/@KERNEL_SOURCE@/$KERNEL/g" \
-	-e "s/@LUSTRE_SOURCE@/${LUSTRE##*/}/g" \
-	-e "s/@LUSTRE_TARGET@/$TARGET/g" \
-	-e "s#@CONFIGURE_FLAGS@#$CONFIGURE_FLAGS#g" \
-	-e "s/@BASE_ARCHS@/$BASE_ARCHS/g" \
-	-e "s/@BIGMEM_ARCHS@/$BIGMEM_ARCHS/g" \
-	-e "s/@BOOT_ARCHS@/$BOOT_ARCHS/g" \
-	-e "s/@JENSEN_ARCHS@/$BOOT_ARCHS/g" \
-	-e "s/@SMP_ARCHS@/$SMP_ARCHS/g" \
-	-e "s/@UP_ARCHS@/$UP_ARCHS/g" \
-	-e "s/@RHBUILD@/$RHBUILD/g" \
-	-e "s/@LINUX26@/$LINUX26/g" \
-	-e "s/@SUSEBUILD@/$SUSEBUILD/g" \
+	-e "s^@KERNEL_SOURCE@^$KERNEL^g" \
+	-e "s^@KERNEL_VERSION@^$VERSION^g" \
+	-e "s^@LINUX26@^$LINUX26^g" \
+	-e "s^@LUSTRE_SOURCE@^${LUSTRE##*/}^g" \
+	-e "s^@LUSTRE_TARGET@^$TARGET^g" \
+	-e "s^@RHBUILD@^$RHBUILD^g" \
+	-e "s^@SMP_ARCHS@^$SMP_ARCHS^g" \
+	-e "s^@SUSEBUILD@^$SUSEBUILD^g" \
+	-e "s^@UP_ARCHS@^$UP_ARCHS^g" \
 	< $TOPDIR/lustre/scripts/lustre-kernel-2.4.spec.in \
 	> lustre-kernel-2.4.spec
     [ -d SRPMS ] || mkdir SRPMS
@@ -350,6 +378,11 @@ prep_build()
     cp $TOPDIR/lustre/scripts/linux-merge-config.awk SOURCES
     cp $TOPDIR/lustre/scripts/linux-merge-modules.awk SOURCES
     cp "$LUSTRE" "$KERNEL_FILE" SOURCES
+    if [ "$EXTERNAL_PATCHES" -a -d "$EXTERNAL_PATCHES" ] ; then
+	tar zcf SOURCES/external-patches.tar.gz -C "$EXTERNAL_PATCHES" series targets patches kernel_configs
+    else
+	touch SOURCES/external-patches.tar.gz
+    fi
 }
 
 clean_lustre()
@@ -372,9 +405,11 @@ build()
 	--define "_topdir $TOPDIR" || \
 	fatal 1 "Error building rpms for $arch."
 
-    (( $DO_SRC )) && $RPMBUILD -bs lustre-kernel-2.4.spec \
-	--define "_topdir $TOPDIR" || \
-	fatal 1 "Error building .src.rpm."
+    if (( $DO_SRC )) ; then
+	$RPMBUILD -bs lustre-kernel-2.4.spec \
+	    --define "_topdir $TOPDIR" || \
+	    fatal 1 "Error building .src.rpm."
+    fi
 }
 
 publish()
@@ -384,7 +419,7 @@ publish()
 
 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
 
-options=$(getopt -o d:D:h -l extraversion:,kerneldir:,lustre:,nosrc,publish,release,tag:,target:,target-archs:,disable-datestamp -- "$@")
+options=$(getopt -o d:D:h -l external-patches:,extraversion:,kerneldir:,lustre:,nosrc,publish,release,tag:,target:,target-archs:,disable-datestamp -- "$@")
 
 eval set -- "$options"
     
@@ -401,6 +436,10 @@ while [ "$1" ] ; do
 	    DATE=$2
 	    shift 2
 	    ;;
+	--external-patches)
+	    EXTERNAL_PATCHES=$2
+	    shift 2
+	    ;;
 	--extraversion)
 	    EXTRA_VERSION=$2
 	    shift 2