diff --git a/tools/xen/scripts/install-os-vpx.sh b/tools/xen/scripts/install-os-vpx.sh
new file mode 100755
index 0000000..6f9afc6
--- /dev/null
+++ b/tools/xen/scripts/install-os-vpx.sh
@@ -0,0 +1,508 @@
+#!/bin/bash
+#
+# Copyright (c) 2011 Citrix Systems, Inc.
+# Copyright 2011 OpenStack LLC.
+# Copyright (C) 2011 Nicira, Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+#
+
+set -eux
+
+. /etc/xensource-inventory
+
+NAME="XenServer OpenStack VPX"
+DATA_VDI_SIZE="500MiB"
+BRIDGE_M=
+BRIDGE_P=
+KERNEL_PARAMS=
+VPX_FILE=os-vpx.xva
+AS_TEMPLATE=
+FROM_TEMPLATE=
+RAM=
+WAIT_FOR_NETWORK=
+BALLOONING=
+
+usage()
+{
+cat << EOF
+
+  Usage: $0 [-f FILE_PATH] [-d DISK_SIZE] [-v BRIDGE_NAME] [-m BRIDGE_NAME] [-p BRIDGE_NAME]
+            [-k PARAMS] [-r RAM] [-i|-c] [-w] [-b]
+
+  Installs XenServer OpenStack VPX.
+
+  OPTIONS:
+
+     -h           Shows this message.
+     -i           Install OpenStack VPX as template.
+     -c           Clone from existing template.
+     -w           Wait for the network settings to show up before exiting.
+     -b           Enable memory ballooning. When set min_RAM=RAM/2 max_RAM=RAM.
+     -f path      Specifies the path to the XVA.
+                  Default to ./os-vpx.xva.
+     -d disk-size Specifies the size in MiB for the data disk.
+                  Defaults to 500 MiB.
+     -m bridge    Specifies the bridge for the isolated management network.
+                  Defaults to xenbr0.
+     -v bridge    Specifies the bridge for the vm network
+     -p bridge    Specifies the bridge for the externally facing network.
+     -k params    Specifies kernel parameters.
+     -r MiB       Specifies RAM used by the VPX, in MiB.
+                  By default it will take the value from the XVA.
+
+  EXAMPLES:
+
+     Create a VPX that connects to the isolated management network using the
+     default bridge with a data disk of 1GiB:
+            install-os-vpx.sh -f /root/os-vpx-devel.xva -d 1024
+
+     Create a VPX that connects to the isolated management network using xenbr1
+     as bridge:
+            install-os-vpx.sh -m xenbr1
+
+     Create a VPX that connects to both the management and public networks
+     using xenbr1 and xapi4 as bridges:
+            install-os-vpx.sh -m xenbr1 -p xapi4
+
+     Create a VPX that connects to both the management and public networks
+     using the default for management traffic:
+            install-os-vpx.sh -m xapi4
+
+     Create a VPX that automatically becomes the master:
+            install-os-vpx.sh -k geppetto_master=true
+
+EOF
+}
+
+get_params()
+{
+  while getopts "hicwbf:d:v:m:p:k:r:" OPTION; 
+  do
+    case $OPTION in
+      h) usage
+         exit 1
+         ;;
+      i)
+         AS_TEMPLATE=1
+         ;;
+      c)
+         FROM_TEMPLATE=1
+         ;;
+      w)
+         WAIT_FOR_NETWORK=1
+         ;;
+      b)
+         BALLOONING=1
+         ;;
+      f)
+         VPX_FILE=$OPTARG
+         ;;
+      d)
+         DATA_VDI_SIZE="${OPTARG}MiB"
+         ;;
+      m)
+         BRIDGE_M=$OPTARG
+         ;;
+      p)
+         BRIDGE_P=$OPTARG
+         ;;
+      k)
+         KERNEL_PARAMS=$OPTARG
+         ;;
+      r)
+         RAM=$OPTARG
+         ;;
+      v)
+         BRIDGE_V=$OPTARG
+         ;;
+      ?)
+         usage
+         exit
+         ;;
+    esac
+  done
+  if [[ -z $BRIDGE_M ]]
+  then
+     BRIDGE_M=xenbr0
+  fi
+}
+
+
+xe_min()
+{
+  local cmd="$1"
+  shift
+  xe "$cmd" --minimal "$@"
+}
+
+
+get_dest_sr()
+{
+  IFS=,
+  sr_uuids=$(xe sr-list --minimal other-config:i18n-key=local-storage)
+  dest_sr=""
+  for sr_uuid in $sr_uuids
+  do
+    pbd=$(xe pbd-list --minimal sr-uuid=$sr_uuid host-uuid=$INSTALLATION_UUID)
+    if [ "$pbd" ]
+    then
+      echo "$sr_uuid"
+      unset IFS
+      return
+    fi
+  done
+  unset IFS
+
+  dest_sr=$(xe_min sr-list uuid=$(xe_min pool-list params=default-SR))
+  if [ "$dest_sr" = "" ]
+  then
+    echo "No local storage and no default storage; cannot import VPX." >&2
+    exit 1
+  else
+    echo "$dest_sr"
+  fi
+}
+
+
+find_network()
+{
+  result=$(xe_min network-list bridge="$1")
+  if [ "$result" = "" ]
+  then
+    result=$(xe_min network-list name-label="$1")
+  fi
+  echo "$result"
+}
+
+
+find_template()
+{
+  xe_min template-list other-config:os-vpx=true
+}
+
+
+renumber_system_disk()
+{
+  local v="$1"
+  local vdi_uuid=$(xe_min vbd-list vm-uuid="$v" type=Disk userdevice=xvda \
+                                   params=vdi-uuid)
+  if [ "$vdi_uuid" ]
+  then
+    local vbd_uuid=$(xe_min vbd-list vm-uuid="$v" vdi-uuid="$vdi_uuid")
+    xe vbd-destroy uuid="$vbd_uuid"
+    local new_vbd_uuid=$(xe vbd-create vm-uuid="$v" vdi-uuid="$vdi_uuid" \
+                         device=0 bootable=true type=Disk)
+    xe vbd-param-set other-config:owner uuid="$new_vbd_uuid"
+  fi
+}
+
+
+create_vif()
+{
+  xe vif-create vm-uuid="$1" network-uuid="$2" device="$3"
+}
+
+create_gi_vif()
+{
+  local v="$1"
+  # Note that we've made the outbound device eth1, so that it comes up after
+  # the guest installer VIF, which means that the outbound one wins in terms
+  # of gateway.
+  local gi_network_uuid=$(xe_min network-list \
+                                 other-config:is_guest_installer_network=true)
+  create_vif "$v" "$gi_network_uuid" "0" >/dev/null
+}
+
+create_vm_vif()
+{
+  local v="$1"
+  echo "Installing management interface on $BRIDGE_V."
+  local out_network_uuid=$(find_network "$BRIDGE_V")
+  create_vif "$v" "$out_network_uuid" "1" >/dev/null
+}
+
+create_management_vif()
+{
+  local v="$1"
+  echo "Installing management interface on $BRIDGE_M."
+  local out_network_uuid=$(find_network "$BRIDGE_M")
+  create_vif "$v" "$out_network_uuid" "2" >/dev/null
+}
+
+
+# This installs the interface for public traffic, only if a bridge is specified
+# The interface is not configured at this stage, but it will be, once the admin   
+# tasks are complete for the services of this VPX
+create_public_vif()
+{
+  local v="$1"
+  if [[ -z $BRIDGE_P ]]
+  then
+    echo "Skipping installation of interface for public traffic."
+  else
+    echo "Installing public interface on $BRIDGE_P."
+    pub_network_uuid=$(find_network "$BRIDGE_P")
+    create_vif "$v" "$pub_network_uuid" "3" >/dev/null
+  fi
+}
+
+
+label_system_disk()
+{
+  local v="$1"
+  local vdi_uuid=$(xe_min vbd-list vm-uuid="$v" type=Disk userdevice=0 \
+                                   params=vdi-uuid)
+  xe vdi-param-set \
+     name-label="$NAME system disk" \
+     other-config:os-vpx=true \
+     uuid=$vdi_uuid
+}
+
+
+create_data_disk()
+{
+  local v="$1"
+
+  local sys_vdi_uuid=$(xe_min vbd-list vm-uuid="$v" type=Disk params=vdi-uuid)
+  local data_vdi_uuid=$(xe_min vdi-list other-config:os-vpx-data=true)
+
+  if echo "$data_vdi_uuid" | grep -q ,
+  then
+    echo "Multiple data disks found -- assuming that you want a new one."
+    data_vdi_uuid=""
+  else
+    data_in_use=$(xe_min vbd-list vdi-uuid="$data_vdi_uuid")
+    if [ "$data_in_use" != "" ]
+    then
+      echo "Data disk already in use -- will create another one."
+      data_vdi_uuid=""
+    fi
+  fi
+
+  if [ "$data_vdi_uuid" = "" ]
+  then
+    echo -n "Creating new data disk ($DATA_VDI_SIZE)... "
+    sr_uuid=$(xe_min vdi-list params=sr-uuid uuid="$sys_vdi_uuid")
+    data_vdi_uuid=$(xe vdi-create name-label="$NAME data disk" \
+                                  sr-uuid="$sr_uuid" \
+                                  type=user \
+                                  virtual-size="$DATA_VDI_SIZE")
+    xe vdi-param-set \
+       other-config:os-vpx-data=true \
+       uuid="$data_vdi_uuid"
+    dom0_uuid=$(xe_min vm-list is-control-domain=true)
+    vbd_uuid=$(xe vbd-create device=autodetect type=Disk \
+                             vdi-uuid="$data_vdi_uuid" vm-uuid="$dom0_uuid")
+    xe vbd-plug uuid=$vbd_uuid
+    dev=$(xe_min vbd-list params=device uuid=$vbd_uuid)
+    mke2fs -q -j -m0 /dev/$dev
+    e2label /dev/$dev vpxstate
+    xe vbd-unplug uuid=$vbd_uuid
+    xe vbd-destroy uuid=$vbd_uuid
+  else
+    echo -n "Attaching old data disk... "
+  fi
+  vbd_uuid=$(xe vbd-create device=2 type=Disk \
+                           vdi-uuid="$data_vdi_uuid" vm-uuid="$v")
+  xe vbd-param-set other-config:os-vpx-data=true uuid=$vbd_uuid
+  echo "done."
+}
+
+
+set_kernel_params()
+{
+  local v="$1"
+  local args=$KERNEL_PARAMS
+  local cmdline=$(cat /proc/cmdline)
+  for word in $cmdline
+  do
+    if echo "$word" | grep -q "geppetto"
+    then
+      args="$word $args"
+    fi
+  done
+  if [ "$args" != "" ]
+  then
+    echo "Passing Geppetto args to VPX: $args."
+    xe vm-param-set PV-args="$args" uuid="$v"
+  fi
+}
+
+
+set_memory()
+{
+  local v="$1"
+  if [ "$RAM" != "" ]
+  then
+    echo "Setting RAM to $RAM MiB."
+    [ "$BALLOONING" == 1 ] && RAM_MIN=$(($RAM / 2)) || RAM_MIN=$RAM
+    xe vm-memory-limits-set static-min=16MiB static-max=${RAM}MiB \
+                            dynamic-min=${RAM_MIN}MiB dynamic-max=${RAM}MiB \
+                            uuid="$v"
+  fi
+}
+
+
+# Make the VM auto-start on server boot.
+set_auto_start()
+{
+  local v="$1"
+  xe vm-param-set uuid="$v" other-config:auto_poweron=true
+}
+
+
+set_all()
+{
+  local v="$1"
+  set_kernel_params "$v"
+  set_memory "$v"
+  set_auto_start "$v"
+  label_system_disk "$v"
+  create_gi_vif "$v"
+  create_vm_vif "$v"
+  create_management_vif "$v"
+  create_public_vif "$v"
+}
+
+
+log_vifs()
+{
+  local v="$1"
+
+  (IFS=,
+   for vif in $(xe_min vif-list vm-uuid="$v")
+   do
+    dev=$(xe_min vif-list uuid="$vif" params=device)
+    mac=$(xe_min vif-list uuid="$vif" params=MAC | sed -e 's/:/-/g')
+    echo "eth$dev has MAC $mac."
+   done
+   unset IFS) | sort
+}
+
+
+destroy_vifs()
+{
+  local v="$1"
+  IFS=,
+  for vif in $(xe_min vif-list vm-uuid="$v")
+  do
+    xe vif-destroy uuid="$vif"
+  done
+  unset IFS
+}
+
+
+get_params "$@"
+
+thisdir=$(dirname "$0")
+
+if [ "$FROM_TEMPLATE" ]
+then
+  template_uuid=$(find_template)
+  name=$(xe_min template-list params=name-label uuid="$template_uuid")
+  echo -n "Cloning $name... "
+  vm_uuid=$(xe vm-clone vm="$template_uuid" new-name-label="$name")
+  xe vm-param-set is-a-template=false uuid="$vm_uuid"
+  echo $vm_uuid.
+
+  destroy_vifs "$vm_uuid"
+  set_all "$vm_uuid"
+else
+  if [ ! -f "$VPX_FILE" ]
+  then
+      # Search $thisdir/$VPX_FILE too.  In particular, this is used when
+      # installing the VPX from the supp-pack, because we want to be able to
+      # invoke this script from the RPM and the firstboot script.
+      if [ -f "$thisdir/$VPX_FILE" ]
+      then
+          VPX_FILE="$thisdir/$VPX_FILE"
+      else
+          echo "$VPX_FILE does not exist." >&2
+          exit 1
+      fi
+  fi
+
+  echo "Found OS-VPX File: $VPX_FILE. "
+
+  dest_sr=$(get_dest_sr)
+
+  echo -n "Installing $NAME... "
+  vm_uuid=$(xe vm-import filename=$VPX_FILE sr-uuid="$dest_sr")
+  echo $vm_uuid.
+
+  renumber_system_disk "$vm_uuid"
+
+  nl=$(xe_min vm-list params=name-label uuid=$vm_uuid)
+  xe vm-param-set \
+    "name-label=${nl/ import/}" \
+    other-config:os-vpx=true \
+    uuid=$vm_uuid
+
+  set_all "$vm_uuid"
+  create_data_disk "$vm_uuid"
+
+  if [ "$AS_TEMPLATE" ]
+  then
+    xe vm-param-set uuid="$vm_uuid" is-a-template=true \
+                                    other-config:instant=true
+    echo -n "Installing VPX from template... "
+    vm_uuid=$(xe vm-clone vm="$vm_uuid" new-name-label="${nl/ import/}")
+    xe vm-param-set is-a-template=false uuid="$vm_uuid"
+    echo "$vm_uuid."
+  fi
+fi
+
+
+log_vifs "$vm_uuid"
+
+echo -n "Starting VM... "
+xe vm-start uuid=$vm_uuid
+echo "done."
+
+
+show_ip()
+{
+  ip_addr=$(echo "$1" | sed -n "s,^.*"$2"/ip: \([^;]*\).*$,\1,p")
+  echo -n "IP address for $3: "
+  if [ "$ip_addr" = "" ]
+  then
+    echo "did not appear."
+  else
+    echo "$ip_addr."
+  fi
+}
+
+
+if [ "$WAIT_FOR_NETWORK" ]
+then
+  echo "Waiting for network configuration... "
+  i=0
+  while [ $i -lt 600 ]
+  do
+    ip=$(xe_min vm-list params=networks uuid=$vm_uuid)
+    if [ "$ip" != "<not in database>" ]
+    then
+      show_ip "$ip" "1" "$BRIDGE_M"
+      if [[ $BRIDGE_P ]]
+      then
+        show_ip "$ip" "2" "$BRIDGE_P"
+      fi
+      echo "Installation complete."
+      exit 0
+    fi
+    sleep 10
+    let i=i+1
+  done
+fi
diff --git a/tools/xen/scripts/mkxva b/tools/xen/scripts/mkxva
new file mode 100755
index 0000000..a595453
--- /dev/null
+++ b/tools/xen/scripts/mkxva
@@ -0,0 +1,366 @@
+#!/bin/bash
+#
+# Copyright (c) 2011 Citrix Systems, Inc.
+# Copyright 2011 OpenStack LLC.
+# Copyright (C) 2011 Nicira, Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+#
+
+set -eu
+
+set -o xtrace
+
+VBOX_IMG=/output/packages/vbox-img
+
+usage() {
+    cat >&2 <<EOF
+$0 -o <output filenames> -t <types> -x <xml files> <fs-staging-dir> <fs-size-MiB> <tmpdir>
+  -o: Colon-separated list of output filenames (one for each type).
+  -p: Create a disk label and partition within the output image
+  -t: Colon-separated list of types of output file.  xva and ovf supported.
+  -x: XML filenames (one for each type)
+
+EOF
+    exit 1
+}
+
+# parse cmdline
+
+OPT_USE_PARTITION=
+OPT_TYPES=
+OPT_OUTPUT_FILES=
+OPT_XML_FILES=
+
+while getopts o:pt:x: o
+do case "$o" in
+    o)    OPT_OUTPUT_FILES=$(echo "$OPTARG" | sed -e 's/\s*:\s*/ /g')
+        ;;
+    p)    OPT_USE_PARTITION=1
+        ;;
+    t)    OPT_TYPES=$(echo "$OPTARG" | sed -e 's/\s*:\s*/ /g')
+        ;;
+    x)    OPT_XML_FILES=$(echo "$OPTARG" | sed -e 's/\s*:\s*/ /g')
+        ;;
+    [?])  usage
+        ;;
+    esac
+done
+shift $((OPTIND-1))
+
+[ $# -ne 3 ] && usage
+FS_STAGING="$1"
+FS_SIZE_MIB="$2"
+TMPDIR="$3"
+
+if [ "$UID" = "0" ]
+then
+  SUDO=
+else
+  SUDO=sudo
+fi
+
+if [ "$FS_SIZE_MIB" = "0" ]
+then
+    # Just create a dummy file.  This allows developers to bypass bits of
+    # the build by setting the size to 0.
+    touch $OPT_OUTPUT_FILES
+    exit 0
+fi
+
+# create temporary files and dirs
+FS_TMPFILE=$(mktemp "$TMPDIR/mkxva-fsimg-XXXXX")
+XVA_TARBALL_STAGING=$(mktemp -d "$TMPDIR/mkxva-tarball-staging-XXXXX")
+OVF_STAGING=$(mktemp -d "$TMPDIR/mkxva-ovf-staging-XXXXX")
+
+# Find udevsettle and udevtrigger on this installation
+if [ -x "/sbin/udevsettle" ] ; then
+    UDEVSETTLE="/sbin/udevsettle --timeout=30"
+elif [ -x "/sbin/udevadm" ] ; then
+    UDEVSETTLE='/sbin/udevadm settle'
+else
+    UDEVSETTLE='/bin/true'
+fi
+
+if [ -x "/sbin/udevtrigger" ] ; then
+    UDEVTRIGGER=/sbin/udevtrigger
+elif [ -x "/sbin/udevadm" ] ; then
+    UDEVTRIGGER='/sbin/udevadm trigger'
+else
+    UDEVTRIGGER=
+fi
+
+# CLEAN_ variables track devices and mounts that must be taken down
+# no matter how the script exits.  Loop devices are vulnerable to
+# exhaustion so we make every effort to remove them
+
+CLEAN_KPARTX=
+CLEAN_LOSETUP=
+CLEAN_MOUNTPOINT=
+
+cleanup_devices () {
+    if [ -n "$CLEAN_MOUNTPOINT" ] ; then
+        echo "Mountpoint $CLEAN_MOUNTPOINT removed on abnormal exit"
+        $SUDO umount "$CLEAN_MOUNTPOINT" || echo "umount failed"
+        rmdir "$CLEAN_MOUNTPOINT" || echo "rmdir failed"
+    fi
+    if [ -n "$CLEAN_KPARTX" ] ; then
+        echo "kpartx devices for $CLEAN_KPARTX removed on abnormal exit"
+        $SUDO kpartx -d "$CLEAN_KPARTX" || echo "kpartx -d failed"
+    fi
+    if [ -n "$CLEAN_LOSETUP" ] ; then
+        echo "Loop device $CLEAN_LOSETUP removed on abnormal exit"
+        $SUDO losetup -d "$CLEAN_LOSETUP" # Allow losetup errors to propagate
+    fi
+}
+
+trap "cleanup_devices" EXIT
+
+make_fs_inner () {
+    local staging="$1"
+    local output="$2"
+    local options="$3"
+    CLEAN_MOUNTPOINT=$(mktemp -d "$TMPDIR/mkfs-XXXXXX")
+
+    # copy staging dir contents to fs image
+    $SUDO mount $options "$output" "$CLEAN_MOUNTPOINT"
+    $SUDO tar -C "$staging" -c . | tar -C "$CLEAN_MOUNTPOINT" -x
+    $SUDO umount "$CLEAN_MOUNTPOINT"
+    rmdir "$CLEAN_MOUNTPOINT"
+    CLEAN_MOUNTPOINT=
+}
+
+# Turn a staging dir into an ext3 filesystem within a partition
+make_fs_in_partition () {
+    local staging="$1"
+    local output="$2"
+
+    # create new empty disk
+    dd if=/dev/zero of="$output" bs=1M count=$FS_SIZE_MIB
+    # Set up a loop device on the empty disk image
+    local loopdevice=$($SUDO losetup -f)
+    $SUDO losetup "$loopdevice" "$output"
+    CLEAN_LOSETUP="$loopdevice"
+    # Create a partition table and single partition.
+    # Start partition at sector 63 to allow space for grub
+    cat <<EOF
+Errors from sfdisk below are expected because the new disk is uninitialised
+  Expecting: sfdisk: ERROR: sector 0 does not have an msdos signature
+  Expecting: /dev/loop0: unrecognized partition table type
+EOF
+    $SUDO sfdisk -uS "$CLEAN_LOSETUP" <<EOF
+63 - - *
+EOF
+
+    # kpartx creates a device for the new partition
+    # in the form /dev/mapper/loop1p1
+    $SUDO kpartx -av "$CLEAN_LOSETUP"
+    CLEAN_KPARTX="$CLEAN_LOSETUP"
+    # Wait for the device to appear
+    $UDEVTRIGGER
+    $UDEVSETTLE  || echo "udev settle command return code non-zero"
+    # Infer the name of the partition device
+    local partition="${CLEAN_LOSETUP/dev/dev/mapper}p1"
+    # Set permissive privileges on the device
+    $SUDO chmod 0777 "$partition"
+    # Make an ext3 filesystem on the partition
+    /sbin/mkfs.ext3 -I 128 -m0 -F "$partition"
+    /sbin/e2label "$partition" vpxroot
+    make_fs_inner "$staging" "$partition" ""
+    
+    # Now run grub on the image we've created
+    CLEAN_MOUNTPOINT=$(mktemp -d "$TMPDIR/mkfs-XXXXXX")
+
+    # copy Set up[ grub files prior to installing grub within the image
+    $SUDO mount "$partition" "$CLEAN_MOUNTPOINT"
+    $SUDO cp $CLEAN_MOUNTPOINT/usr/share/grub/i386-redhat/* "$CLEAN_MOUNTPOINT/boot/grub"
+    kernel_version=$($SUDO chroot "$CLEAN_MOUNTPOINT" rpm -qv kernel | sed -e 's/kernel-//')
+    kernel_version_xen=$($SUDO chroot "$CLEAN_MOUNTPOINT" rpm -qv kernel-xen | sed -e 's/kernel-xen-//')
+    $SUDO cat > "$CLEAN_MOUNTPOINT/boot/grub/grub.conf" <<EOF
+default 0
+timeout 2
+
+title vmlinuz-$kernel_version (HVM)
+        root (hd0,0)
+        kernel /boot/vmlinuz-$kernel_version ro root=LABEL=vpxroot
+        initrd /boot/initrd-$kernel_version.img
+
+title vmlinuz-${kernel_version_xen}xen (PV)
+        root (hd0,0)
+        kernel /boot/vmlinuz-${kernel_version_xen}xen ro root=LABEL=vpxroot console=xvc0
+        initrd /boot/initrd-${kernel_version_xen}xen.img
+EOF
+
+    $SUDO umount "$CLEAN_MOUNTPOINT"
+    CLEAN_MOUNTPOINT=
+    
+    # Grub expects a disk with name /dev/xxxx with a first partition
+    # named /dev/xxxx1, so we give it what it wants using symlinks
+    # Note: /dev is linked to the real /dev of the build machine, so
+    # must be cleaned up
+    local disk_name="/dev/osxva$$bld"
+    local disk_part1_name="${disk_name}1"
+    rm -f "$disk_name"
+    rm -f "$disk_part1_name"
+    ln -s "$CLEAN_LOSETUP" "$disk_name"
+    ln -s "$partition" "$disk_part1_name"
+    
+    # Feed commands into the grub shell to setup the disk
+    grub --no-curses --device-map=/dev/null <<EOF
+device (hd0) $disk_name
+setup (hd0) (hd0,0)
+quit
+EOF
+    
+    # Cleanup
+    rm -f "$disk_name"
+    rm -f "$disk_part1_name"
+    $SUDO kpartx -dv "$CLEAN_KPARTX"
+    CLEAN_KPARTX=
+    $SUDO losetup -d "$CLEAN_LOSETUP"
+    CLEAN_LOSETUP=
+}
+
+# turn a staging dir into an ext3 filesystem image
+make_fs () {
+    local staging="$1"
+    local output="$2"
+
+    # create new empty fs
+    dd if=/dev/zero of="$output" bs=1M count=0 seek=$FS_SIZE_MIB
+    /sbin/mkfs.ext3 -m0 -F "$output"
+    /sbin/e2label "$output" vpxroot
+    make_fs_inner "$staging" "$output" "-oloop"
+}
+
+
+# split a virtual disk image into the format expected inside an xva file
+splitvdi () {
+    local diskimg="$1"
+    local outputdir="$2"
+    local rio="$3"
+
+    local n_bytes=$(stat --printf=%s "$diskimg")
+    local n_meg=$((($n_bytes+$((1024*1024 -1)))/$((1024*1024))))
+    local i=0
+    while [ $i -lt $n_meg ] ; do 
+	if [ $rio -eq 0 ] ; then
+		local file="$outputdir"/chunk-$(printf "%08d" $i)
+		dd if="$diskimg" of="$file" skip=$i bs=1M count=1 2>/dev/null
+		gzip "$file"
+	else
+		local file="$outputdir"/$(printf "%08d" $i)
+	        dd if="$diskimg" of="$file" skip=$i bs=1M count=1 2>/dev/null
+		local chksum=$(sha1sum -b "$file")
+		echo -n "${chksum/ */}" > "$file.checksum"
+	fi
+	i=$(($i + 1))
+    done
+}
+
+if [ -n "$OPT_USE_PARTITION" ] ; then
+    make_fs_in_partition "$FS_STAGING" "$FS_TMPFILE"
+else
+    make_fs "$FS_STAGING" "$FS_TMPFILE"
+fi
+
+VDI_SIZE=$(stat --format=%s "$FS_TMPFILE")
+
+make_xva () {
+    local output_file="$1"
+    local xml_file="$2"
+    local subdir
+    local rio
+
+    if [[ `cat $xml_file` =~ "<member>\s*<name>class</name>\s*<value>VDI</value>\s*</member>\s*<member>\s*<name>id</name>\s*<value>(Ref:[0-9]+)</value>" ]]
+    then
+        # it's a rio style xva
+        subdir="${BASH_REMATCH[1]}";
+        rio=1
+    else
+        # it's a geneva style xva
+        subdir="xvda"
+        rio=0
+    fi
+
+    cp "$xml_file" "$XVA_TARBALL_STAGING"/ova.xml
+    sed -i -e "s/@VDI_SIZE@/$VDI_SIZE/" "$XVA_TARBALL_STAGING"/ova.xml
+    mkdir "$XVA_TARBALL_STAGING/$subdir"
+    splitvdi "$FS_TMPFILE" "$XVA_TARBALL_STAGING/$subdir" "$rio"
+    TARFILE_MEMBERS=$(cd "$XVA_TARBALL_STAGING" && echo ova.xml $subdir/*)
+    tar -C "$XVA_TARBALL_STAGING" --format=v7 -c $TARFILE_MEMBERS -f "$output_file.tmp"
+    mv "$output_file.tmp" "$output_file"
+}
+
+make_ovf () {
+    local output_dir="$1"
+    local xml_file="$2"
+    local output_base=$(basename "$output_dir")
+    local disk="$output_dir/${output_base}.vmdk"
+    local manifest="$output_dir/${output_base}.mf"
+    local ovf="$output_dir/${output_base}.ovf"
+
+    mkdir -p "$output_dir"
+    rm -f "$disk"
+    $VBOX_IMG convert --srcfilename="$FS_TMPFILE" --dstfilename="$disk" \
+        --srcformat RAW --dstformat VMDK --variant Stream
+    chmod 0644 "$disk"
+
+    local n_bytes=$(stat --printf=%s "$disk")
+    cp "$xml_file" "$ovf"
+    sed -i -e "s/@MKXVA_DISK_FULLSIZE@/$VDI_SIZE/" "$ovf"
+    sed -i -e "s/@MKXVA_DISK_SIZE@/$n_bytes/" "$ovf"
+    sed -i -e "s/@MKXVA_DISK_MIB_SIZE@/$FS_SIZE_MIB/" "$ovf"
+    sed -i -e "s/@MKXVA_DISK_FILENAME@/${output_base}.vmdk/" "$ovf"
+
+    for to_sign in "$ovf" "$disk"
+    do
+	local sha1_sum=$(sha1sum "$to_sign" | cut -d' ' -f1)
+	echo "SHA1($(basename "$to_sign"))= $sha1_sum" >> $manifest
+    done
+}
+
+output_files="$OPT_OUTPUT_FILES"
+xml_files="$OPT_XML_FILES"
+# Iterate through the type list creating the relevant VMs
+for create_type in $OPT_TYPES
+do
+    # Shift one parameter from the front of the lists
+    create_output_file="${output_files%% *}"
+    output_files="${output_files#* }"
+    create_xml_file="${xml_files%% *}"
+    xml_files="${xml_files#* }"
+    echo "Creating $create_type appliance $create_output_file using metadata file $create_xml_file"
+
+    case "$create_type" in
+	xva)
+	    make_xva "$create_output_file" "$create_xml_file"
+	    ;;
+	ovf)
+	    make_ovf "$create_output_file" "$create_xml_file"
+	    ;;
+	*)
+	    echo "Unknown VM type '$create_type'"
+	    exit 1
+	    ;;
+    esac
+
+done
+
+
+# cleanup
+if [ -z "${DO_NOT_CLEANUP:-}" ] ; then 
+    rm -rf "$XVA_TARBALL_STAGING"
+    rm -f "$FS_TMPFILE"
+fi
diff --git a/tools/xen/scripts/uninstall-os-vpx.sh b/tools/xen/scripts/uninstall-os-vpx.sh
new file mode 100755
index 0000000..7c1cd41
--- /dev/null
+++ b/tools/xen/scripts/uninstall-os-vpx.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+#
+# Copyright (c) 2011 Citrix Systems, Inc.
+# Copyright 2011 OpenStack LLC.
+# Copyright (C) 2011 Nicira, Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+#
+
+remove_data=
+if [ "$1" = "--remove-data" ]
+then
+  remove_data=1
+fi
+
+set -eu
+
+xe_min()
+{
+  local cmd="$1"
+  shift
+  /opt/xensource/bin/xe "$cmd" --minimal "$@"
+}
+
+destroy_vdi()
+{
+  local vbd_uuid="$1"
+  local type=$(xe_min vbd-list uuid=$vbd_uuid params=type)
+  local dev=$(xe_min vbd-list uuid=$vbd_uuid params=userdevice)
+  local vdi_uuid=$(xe_min vbd-list uuid=$vbd_uuid params=vdi-uuid)
+
+  if [ "$type" = 'Disk' ] && [ "$dev" != 'xvda' ] && [ "$dev" != '0' ]
+  then
+    echo -n "Destroying data disk... "
+    xe vdi-destroy uuid=$vdi_uuid
+    echo "done."
+  fi
+}
+
+uninstall()
+{
+  local vm_uuid="$1"
+  local power_state=$(xe_min vm-list uuid=$vm_uuid params=power-state)
+
+  if [ "$power_state" != "halted" ]
+  then
+    echo -n "Shutting down VM... "
+    xe vm-shutdown vm=$vm_uuid force=true
+    echo "done."
+  fi
+
+  if [ "$remove_data" = "1" ]
+  then
+    for v in $(xe_min vbd-list vm-uuid=$vm_uuid | sed -e 's/,/ /g')
+    do
+      destroy_vdi "$v"
+    done
+  fi
+
+  echo -n "Deleting VM... "
+  xe vm-uninstall vm=$vm_uuid force=true >/dev/null
+  echo "done."
+}
+
+uninstall_template()
+{
+  local vm_uuid="$1"
+
+  if [ "$remove_data" = "1" ]
+  then
+    for v in $(xe_min vbd-list vm-uuid=$vm_uuid | sed -e 's/,/ /g')
+    do
+      destroy_vdi "$v"
+    done
+  fi
+
+  echo -n "Deleting template... "
+  xe template-uninstall template-uuid=$vm_uuid force=true >/dev/null
+  echo "done."
+}
+
+
+for u in $(xe_min vm-list other-config:os-vpx=true | sed -e 's/,/ /g')
+do
+  uninstall "$u"
+done
+
+for u in $(xe_min template-list other-config:os-vpx=true | sed -e 's/,/ /g')
+do
+  uninstall_template "$u"
+done
