diff --git a/bin/disk-image-create b/bin/disk-image-create
index 2b6a94d96..4bb06f2da 100755
--- a/bin/disk-image-create
+++ b/bin/disk-image-create
@@ -335,7 +335,9 @@ if [ -n "$MAX_ONLINE_RESIZE" ]; then
 fi
 
 LOOPDEV=$(sudo losetup --show -f $TMP_IMAGE_PATH)
-export EXTRA_UNMOUNT="detach_loopback $LOOPDEV"
+# Definied here for backward compat against set -u
+export EXTRA_UNMOUNT=""
+export EXTRA_CLEANUP="detach_loopback $LOOPDEV"
 export IMAGE_BLOCK_DEVICE=$LOOPDEV
 eval_run_d block-device "IMAGE_BLOCK_DEVICE="
 sudo mkfs $MKFS_OPTS -t $FS_TYPE -L ${DIB_ROOT_LABEL} ${IMAGE_BLOCK_DEVICE}
@@ -382,6 +384,13 @@ done
 unmount_image
 cleanup_build_dir
 
+# Write zeros to free blocks to aid compression of images.
+if echo "$FS_TYPE" | grep -q "^ext" && which zerofree ; then
+    sudo zerofree $IMAGE_BLOCK_DEVICE
+fi
+# We are done with the loopback device make sure it is detached.
+$EXTRA_CLEANUP
+
 has_raw_type=
 if [ "$IS_RAMDISK" == "0" ]; then
   for IMAGE_TYPE in ${IMAGE_TYPES[@]} ; do
diff --git a/doc/source/user_guide/installation.rst b/doc/source/user_guide/installation.rst
index 169c088d3..2ef7b8e70 100644
--- a/doc/source/user_guide/installation.rst
+++ b/doc/source/user_guide/installation.rst
@@ -27,6 +27,11 @@ It is recommended you check the documentation for each element you are using
 to determine if there are any additional dependencies. Of particular note is
 the need for the `dev-python/pyyaml` package on Gentoo hosts.
 
+If the zerofree utility is present on the build system and you are building
+an image with an ext filesystem zerofree will be used to zero out free
+blocks in the image. This makes the resulting images much smaller if
+compressed.
+
 
 Source Installation
 -------------------
diff --git a/lib/img-functions b/lib/img-functions
index cf817ae89..6285c0b93 100644
--- a/lib/img-functions
+++ b/lib/img-functions
@@ -24,6 +24,8 @@ function unmount_image () {
     # unmount from the chroot
     # Don't use TMP_MOUNT_PATH here, it might not have been set.
     unmount_dir "$TMP_BUILD_DIR/mnt"
+
+    # Left here for backward compatibility
     if [ -n "$EXTRA_UNMOUNT" ]; then
         $EXTRA_UNMOUNT
     fi
@@ -39,6 +41,9 @@ function cleanup () {
     unmount_image
     cleanup_build_dir
     cleanup_image_dir
+    if [ -n "$EXTRA_CLEANUP" ]; then
+        $EXTRA_CLEANUP
+    fi
 }
 
 function ensure_nbd () {
diff --git a/tests/install_test_deps.sh b/tests/install_test_deps.sh
index bbf661518..7925f10ff 100755
--- a/tests/install_test_deps.sh
+++ b/tests/install_test_deps.sh
@@ -8,8 +8,10 @@ sudo apt-get install -y \
         debootstrap \
         inetutils-ping \
         kpartx \
+        zerofree \
         qemu-utils || \
     sudo yum -y install \
         debootstrap \
         kpartx \
+        zerofree \
         qemu-img