diff --git a/elements/growroot/README.rst b/elements/growroot/README.rst
new file mode 100644
index 000000000..c05150e6c
--- /dev/null
+++ b/elements/growroot/README.rst
@@ -0,0 +1,7 @@
+========
+growroot
+========
+
+Grow the root partition on first boot.
+
+This only supported on ubuntu trusty or later.
diff --git a/elements/growroot/element-deps b/elements/growroot/element-deps
new file mode 100644
index 000000000..69a71fded
--- /dev/null
+++ b/elements/growroot/element-deps
@@ -0,0 +1,2 @@
+dib-init-system
+install-static
diff --git a/elements/growroot/init-scripts/upstart/growroot.conf b/elements/growroot/init-scripts/upstart/growroot.conf
new file mode 100644
index 000000000..676226c47
--- /dev/null
+++ b/elements/growroot/init-scripts/upstart/growroot.conf
@@ -0,0 +1,9 @@
+description "Growing root partition"
+
+console output
+
+start on mounted MOUNTPOINT=/
+
+post-start script
+/usr/local/sbin/growroot
+end script
diff --git a/elements/growroot/static/usr/local/sbin/growroot b/elements/growroot/static/usr/local/sbin/growroot
new file mode 100755
index 000000000..dfd85f544
--- /dev/null
+++ b/elements/growroot/static/usr/local/sbin/growroot
@@ -0,0 +1,26 @@
+#!/bin/bash
+# dib-lint: disable=dibdebugtrace
+
+set -exu
+set -o pipefail
+
+root_dev=$(df -P / | tail -n 1 | awk '/.*/ { print $1 }')
+minor_dev_no=$(stat --printf="%T" $root_dev)
+major_dev_no=$(stat --printf="%t" $root_dev)
+
+# The last digit of our minor number should, on a partitioned block device,
+# be the partition number of the device (starting at 1). We need to convert
+# this value to decimal from hex for use in growpart.
+part_no=$(echo $minor_dev_no | tail -c 2)
+part_no=$((16#$part_no))
+
+disk=$(find /sys/dev/block -name "$((16#$major_dev_no)):${minor_dev_no::-1}0")
+disk="/dev/$(source ${disk}/uevent; echo $DEVNAME)"
+
+set +e
+growpart $disk $part_no
+# Error code 1 means no change
+if [ "$?" -le 1 ]; then
+    # always return true because this might not work if were are non ext4
+    resize2fs $root_dev || true
+fi