diff --git a/README b/README.md
similarity index 94%
rename from README
rename to README.md
index 61119e9796..82ef7fb07e 100644
--- a/README
+++ b/README.md
@@ -7,6 +7,8 @@ Tool to quickly deploy openstack dev environments.
 * To make it easier for developers to dive into openstack so that they can productively contribute without having to understand every part of the system at once
 * To make it easy to prototype cross-project features
 
+Read more at http://devstack.org (built from the gh-pages branch)
+
 Be sure to carefully read these scripts before you run them as they install software and may alter your networking configuration.
 
 # To start a dev cloud on your local machine (installing on a dedicated vm is safer!):
@@ -32,7 +34,6 @@ You can tweak environment variables by creating file name 'localrc' should you n
 
 * Add python-novaclient cli support
 * syslog
-* allow rabbit connection to be specified via environment variables with sensible defaults
 * Add volume support
 * Add quantum support
 
diff --git a/stack.sh b/stack.sh
index 4fbfa28c01..97c39f81ea 100755
--- a/stack.sh
+++ b/stack.sh
@@ -20,9 +20,6 @@
 # Sanity Check
 # ============
 
-# Record the start time.  This allows us to print how long this script takes to run.
-START_TIME=`python -c "import time; print time.time()"`
-
 # Warn users who aren't on natty, but allow them to override check and attempt
 # installation with ``FORCE=yes ./stack``
 if ! grep -q natty /etc/lsb-release; then
@@ -53,40 +50,38 @@ TOP_DIR=$(cd $(dirname "$0") && pwd)
 
 if [[ $EUID -eq 0 ]]; then
     echo "You are running this script as root."
+    echo "In 10 seconds, we will create a user 'stack' and run as that user"
+    sleep 10 
 
     # since this script runs as a normal user, we need to give that user
     # ability to run sudo
     apt-get update
-    apt-get install -qqy sudo
+    apt-get install -y sudo
 
-    if ! getent passwd | grep -q stack; then
+    if ! getent passwd stack >/dev/null; then
         echo "Creating a user called stack"
         useradd -U -G sudo -s /bin/bash -m stack
     fi
+
     echo "Giving stack user passwordless sudo priviledges"
-    echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
+    # natty uec images sudoers does not have a '#includedir'. add one.
+    grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
+        echo "#includedir /etc/sudoers.d" >> /etc/sudoers
+    ( umask 226 && echo "stack ALL=(ALL) NOPASSWD:ALL" \
+        > /etc/sudoers.d/50_stack_sh )
 
     echo "Copying files to stack user"
-    cp -r -f `pwd` /home/stack/
-    THIS_DIR=$(basename $(dirname $(readlink -f $0)))
-    chown -R stack /home/stack/$THIS_DIR
-    echo "Running the script as stack in 3 seconds..."
-    sleep 3
+    STACK_DIR="/home/stack/${PWD##*/}"
+    cp -r -f "$PWD" "$STACK_DIR"
+    chown -R stack "$STACK_DIR"
     if [[ "$SHELL_AFTER_RUN" != "no" ]]; then
-	exec su -c "cd /home/stack/$THIS_DIR/; bash stack.sh; bash" stack
+        exec su -c "set -e; cd $STACK_DIR; bash stack.sh; bash" stack
     else
-	exec su -c "cd /home/stack/$THIS_DIR/; bash stack.sh" stack
+        exec su -c "set -e; cd $STACK_DIR; bash stack.sh" stack
     fi
-    exit 0
+    exit 1
 fi
 
-# So that errors don't compound we exit on any errors so you see only the
-# first error that occured.
-set -o errexit
-
-# Print the commands being run so that we can see the command that triggers
-# an error.  It is also useful for following allowing as the install occurs.
-set -o xtrace
 
 # Settings
 # ========
@@ -120,8 +115,6 @@ source ./stackrc
 
 # Destination path for installation ``DEST``
 DEST=${DEST:-/opt/stack}
-sudo mkdir -p $DEST
-sudo chown `whoami` $DEST
 
 # Set the destination directories for openstack projects
 NOVA_DIR=$DEST/nova
@@ -261,6 +254,24 @@ read_password SERVICE_TOKEN "ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN
 # Dash currently truncates usernames and passwords at 20 characters
 read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR DASH AND KEYSTONE (20 CHARS OR LESS)."
 
+LOGFILE=${LOGFILE:-"$PWD/stack.sh.$$.log"}
+(
+# So that errors don't compound we exit on any errors so you see only the
+# first error that occured.
+trap failed ERR
+failed() {
+    local r=$?
+    set +o xtrace
+    [ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"
+    exit $r
+}
+
+# Print the commands being run so that we can see the command that triggers
+# an error.  It is also useful for following along as the install occurs.
+set -o xtrace
+
+sudo mkdir -p $DEST
+sudo chown `whoami` $DEST
 
 # Install Packages
 # ================
@@ -269,6 +280,7 @@ read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR DASH AND KEYSTONE (20
 
 
 # install apt requirements
+sudo apt-get update
 sudo apt-get install -qqy `cat $FILES/apts/* | cut -d\# -f1 | grep -Ev "mysql-server|rabbitmq-server"`
 
 # install python requirements
@@ -347,6 +359,19 @@ mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASSWORD
 mysql-server-5.1 mysql-server/start_on_boot boolean true
 MYSQL_PRESEED
 
+    # while ``.my.cnf`` is not needed for openstack to function, it is useful
+    # as it allows you to access the mysql databases via ``mysql nova`` instead
+    # of having to specify the username/password each time.
+    if [[ ! -e $HOME/.my.cnf ]]; then
+        cat <<EOF >$HOME/.my.cnf
+[client]
+user=$MYSQL_USER
+password=$MYSQL_PASS    
+host=$MYSQL_HOST
+EOF
+        chmod 0600 $HOME/.my.cnf
+    fi
+
     # Install and start mysql-server
     sudo apt-get -y -q install mysql-server
     # Update the DB to give user ‘$MYSQL_USER’@’%’ full control of the all databases:
@@ -625,9 +650,8 @@ fi
 # have to do a little more than that in our script.  Since we add the group
 # ``libvirtd`` to our user in this script, when nova-compute is run it is
 # within the context of our original shell (so our groups won't be updated).
-# We can send the command nova-compute to the ``newgrp`` command to execute
-# in a specific context.
-screen_it n-cpu "cd $NOVA_DIR && echo $NOVA_DIR/bin/nova-compute | newgrp libvirtd"
+# Use 'sg' to execute nova-compute as a member of the libvirtd group.
+screen_it n-cpu "cd $NOVA_DIR && sg libvirtd $NOVA_DIR/bin/nova-compute"
 screen_it n-net "cd $NOVA_DIR && $NOVA_DIR/bin/nova-network"
 screen_it n-sch "cd $NOVA_DIR && $NOVA_DIR/bin/nova-scheduler"
 screen_it n-vnc "cd $NOVNC_DIR && ./utils/nova-wsproxy.py 6080 --web . --flagfile=../nova/bin/nova.conf"
@@ -687,6 +711,16 @@ if [[ "$ENABLED_SERVICES" =~ "g-reg" ]]; then
 
 fi
 
+# Fin
+# ===
+
+
+) 2>&1 | tee "${LOGFILE}"
+
+# Check that the left side of the above pipe succeeded
+for ret in "${PIPESTATUS[@]}"; do [ $ret -eq 0 ] || exit $ret; done
+
+(
 # Using the cloud
 # ===============
 
@@ -704,10 +738,7 @@ if [[ "$ENABLED_SERVICES" =~ "key" ]]; then
     echo "the password: $ADMIN_PASSWORD"
 fi
 
-# Fin
-# ===
+# indicate how long this took to run (bash maintained variable 'SECONDS')
+echo "stack.sh completed in $SECONDS seconds."
 
-# End our timer and give a timing summary
-END_TIME=`python -c "import time; print time.time()"`
-ELAPSED=`python -c "print $END_TIME - $START_TIME"`
-echo "stack.sh completed in $ELAPSED seconds."
+) | tee -a "$LOGFILE"
diff --git a/build_nfs.sh b/tools/build_nfs.sh
similarity index 100%
rename from build_nfs.sh
rename to tools/build_nfs.sh
diff --git a/build_pxe_boot.sh b/tools/build_pxe_boot.sh
similarity index 60%
rename from build_pxe_boot.sh
rename to tools/build_pxe_boot.sh
index 4feb14d2fc..0653664c0c 100755
--- a/build_pxe_boot.sh
+++ b/tools/build_pxe_boot.sh
@@ -4,15 +4,8 @@
 # build_pxe_boot.sh [-k kernel-version] destdir
 #
 # Assumes syslinux is installed
-# Assumes devstack files are in `pwd`/pxe
 # Only needs to run as root if the destdir permissions require it
 
-UBUNTU_MIRROR=http://archive.ubuntu.com/ubuntu/dists/natty/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64
-
-MEMTEST_VER=4.10
-MEMTEST_BIN=memtest86+-${MEMTEST_VER}.bin
-MEMTEST_URL=http://www.memtest.org/download/${MEMTEST_VER}/
-
 KVER=`uname -r`
 if [ "$1" = "-k" ]; then
     KVER=$2
@@ -30,8 +23,8 @@ for i in memdisk menu.c32 pxelinux.0; do
 	cp -p /usr/lib/syslinux/$i $DEST_DIR
 done
 
-DEFAULT=$DEST_DIR/pxelinux.cfg/default
-cat >$DEFAULT <<EOF
+CFG=$DEST_DIR/pxelinux.cfg/default
+cat >$CFG <<EOF
 default menu.c32
 prompt 0
 timeout 0
@@ -56,10 +49,10 @@ fi
 cp -p $PXEDIR/vmlinuz-${KVER} $DEST_DIR/ubuntu
 if [ ! -r $PXEDIR/stack-initrd.gz ]; then
     cd $OPWD
-    sudo $PROGDIR/build_pxe_ramdisk.sh $PXEDIR/stack-initrd.gz
+    sudo $PROGDIR/build_ramdisk.sh $PXEDIR/stack-initrd.gz
 fi
 cp -p $PXEDIR/stack-initrd.gz $DEST_DIR/ubuntu
-cat >>$DEFAULT <<EOF
+cat >>$CFG <<EOF
 
 LABEL devstack
     MENU LABEL ^devstack
@@ -69,48 +62,21 @@ LABEL devstack
 EOF
 
 # Get Ubuntu
-if [ -d $PXEDIR ]; then
+if [ -d $PXEDIR -a -r $PXEDIR/natty-base-initrd.gz ]; then
     cp -p $PXEDIR/natty-base-initrd.gz $DEST_DIR/ubuntu
-fi
-cat >>$DEFAULT <<EOF
+    cat >>$CFG <<EOF
 
 LABEL ubuntu
     MENU LABEL ^Ubuntu Natty
     KERNEL ubuntu/vmlinuz-$KVER
     APPEND initrd=ubuntu/natty-base-initrd.gz ramdisk_size=419600 root=/dev/ram0
 EOF
-
-# Get Memtest
-cd $DEST_DIR
-if [ ! -r $MEMTEST_BIN ]; then
-    wget -N --quiet ${MEMTEST_URL}/${MEMTEST_BIN}.gz
-    gunzip $MEMTEST_BIN
 fi
-cat >>$DEFAULT <<EOF
-
-LABEL memtest
-    MENU LABEL ^Memtest86+
-    KERNEL $MEMTEST_BIN
-EOF
-
-# Get FreeDOS
-mkdir -p $DEST_DIR/freedos
-cd $DEST_DIR/freedos
-wget -N --quiet http://www.fdos.org/bootdisks/autogen/FDSTD.288.gz
-gunzip -f FDSTD.288.gz
-cat >>$DEFAULT <<EOF
-
-LABEL freedos
-	MENU LABEL ^FreeDOS bootdisk
-	KERNEL memdisk
-	APPEND initrd=freedos/FDSTD.288
-EOF
 
 # Local disk boot
-cat >>$DEFAULT <<EOF
+cat >>$CFG <<EOF
 
 LABEL local
     MENU LABEL ^Local disk
-    MENU DEFAULT
     LOCALBOOT 0
 EOF
diff --git a/build_pxe_ramdisk.sh b/tools/build_ramdisk.sh
similarity index 98%
rename from build_pxe_ramdisk.sh
rename to tools/build_ramdisk.sh
index a01656b122..63d37a9d9b 100755
--- a/build_pxe_ramdisk.sh
+++ b/tools/build_ramdisk.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+# build_ramdisk.sh - Build RAM disk images
 
 if [ ! "$#" -eq "1" ]; then
     echo "$0 builds a gziped natty openstack install"
diff --git a/tools/build_usb_boot.sh b/tools/build_usb_boot.sh
new file mode 100755
index 0000000000..ac49848f70
--- /dev/null
+++ b/tools/build_usb_boot.sh
@@ -0,0 +1,103 @@
+#!/bin/bash -e
+# build_usb_boot.sh - Create a syslinux boot environment
+#
+# build_usb_boot.sh [-k kernel-version] destdev
+#
+# Assumes syslinux is installed
+# Needs to run as root
+
+KVER=`uname -r`
+if [ "$1" = "-k" ]; then
+    KVER=$2
+    shift;shift
+fi
+
+DEST_DIR=${1:-/tmp/syslinux-boot}
+PXEDIR=${PXEDIR:-/var/cache/devstack/pxe}
+OPWD=`pwd`
+PROGDIR=`dirname $0`
+
+if [ -b $DEST_DIR ]; then
+    # We have a block device, install syslinux and mount it
+    DEST_DEV=$DEST_DIR
+    DEST_DIR=`mktemp -d mntXXXXXX`
+
+    # Install syslinux on the device
+    syslinux --install --directory syslinux $DEST_DEV
+
+    mount $DEST_DEV $DEST_DIR
+else
+    # We have a directory (for sanity checking output)
+	DEST_DEV=""
+	if [ ! -d $DEST_DIR/syslinux ]; then
+	    mkdir -p $DEST_DIR/syslinux
+	fi
+fi
+
+# Get some more stuff from syslinux
+for i in memdisk menu.c32; do
+	cp -p /usr/lib/syslinux/$i $DEST_DIR/syslinux
+done
+
+CFG=$DEST_DIR/syslinux/syslinux.cfg
+cat >$CFG <<EOF
+default /syslinux/menu.c32
+prompt 0
+timeout 0
+
+MENU TITLE Boot Menu
+
+EOF
+
+# Setup devstack boot
+mkdir -p $DEST_DIR/ubuntu
+if [ ! -d $PXEDIR ]; then
+    mkdir -p $PXEDIR
+fi
+if [ ! -r $PXEDIR/vmlinuz-${KVER} ]; then
+    sudo chmod 644 /boot/vmlinuz-${KVER}
+    if [ ! -r /boot/vmlinuz-${KVER} ]; then
+        echo "No kernel found"
+    else
+        cp -p /boot/vmlinuz-${KVER} $PXEDIR
+    fi
+fi
+cp -p $PXEDIR/vmlinuz-${KVER} $DEST_DIR/ubuntu
+if [ ! -r $PXEDIR/stack-initrd.gz ]; then
+    cd $OPWD
+    sudo $PROGDIR/build_ramdisk.sh $PXEDIR/stack-initrd.gz
+fi
+cp -p $PXEDIR/stack-initrd.gz $DEST_DIR/ubuntu
+cat >>$CFG <<EOF
+
+LABEL devstack
+    MENU LABEL ^devstack
+    MENU DEFAULT
+    KERNEL /ubuntu/vmlinuz-$KVER
+    APPEND initrd=/ubuntu/stack-initrd.gz ramdisk_size=2109600 root=/dev/ram0
+EOF
+
+# Get Ubuntu
+if [ -d $PXEDIR -a -r $PXEDIR/natty-base-initrd.gz ]; then
+    cp -p $PXEDIR/natty-base-initrd.gz $DEST_DIR/ubuntu
+    cat >>$CFG <<EOF
+
+LABEL ubuntu
+    MENU LABEL ^Ubuntu Natty
+    KERNEL /ubuntu/vmlinuz-$KVER
+    APPEND initrd=/ubuntu/natty-base-initrd.gz ramdisk_size=419600 root=/dev/ram0
+EOF
+fi
+
+# Local disk boot
+cat >>$CFG <<EOF
+
+LABEL local
+    MENU LABEL ^Local disk
+    LOCALBOOT 0
+EOF
+
+if [ -n "$DEST_DEV" ]; then
+    umount $DEST_DIR
+    rmdir $DEST_DIR
+fi
diff --git a/make_image.sh b/tools/make_image.sh
similarity index 100%
rename from make_image.sh
rename to tools/make_image.sh
diff --git a/upload_image.sh b/tools/upload_image.sh
similarity index 100%
rename from upload_image.sh
rename to tools/upload_image.sh