diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,11 @@
+propellor (4.5.2) unstable; urgency=medium
+
+  * Added Rsync.installed property.
+  * Added DiskImage.vmdkBuiltFor property which is useful for booting
+    a disk image in VirtualBox.
+
+ -- Joey Hess <id@joeyh.name>  Tue, 25 Jul 2017 17:58:46 -0400
+
 propellor (4.5.1) unstable; urgency=medium
 
   * Reboot.toKernelNewerThan: If running kernel is new enough, avoid
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+propellor (4.5.2) unstable; urgency=medium
+
+  * Added Rsync.installed property.
+  * Added DiskImage.vmdkBuiltFor property which is useful for booting
+    a disk image in VirtualBox.
+
+ -- Joey Hess <id@joeyh.name>  Tue, 25 Jul 2017 17:58:46 -0400
+
 propellor (4.5.1) unstable; urgency=medium
 
   * Reboot.toKernelNewerThan: If running kernel is new enough, avoid
diff --git a/joeyconfig.hs b/joeyconfig.hs
--- a/joeyconfig.hs
+++ b/joeyconfig.hs
@@ -99,6 +99,7 @@
 		, partition EXT4 `mountedAt` "/"
 		, swapPartition (MegaBytes 256)
 		]
+		`before` vmdkBuiltFor "/srv/test.img"
   where
 	mychroot d = debootstrapped mempty d $ props
 		& osDebian Unstable X86_64
diff --git a/propellor.cabal b/propellor.cabal
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
 Name: propellor
-Version: 4.5.1
+Version: 4.5.2
 Cabal-Version: >= 1.20
 License: BSD2
 Maintainer: Joey Hess <id@joeyh.name>
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -204,7 +204,7 @@
 	, next
 	)
 
--- If changes can be fetched from origin,  Builds propellor (when allowed)
+-- If changes can be fetched from origin, builds propellor (when allowed)
 -- and re-execs the updated propellor binary to continue.
 -- Otherwise, runs the IO action to continue.
 updateFirst' :: Maybe Host -> CanRebuild -> CmdLine -> IO () -> IO ()
diff --git a/src/Propellor/Property/DiskImage.hs b/src/Propellor/Property/DiskImage.hs
--- a/src/Propellor/Property/DiskImage.hs
+++ b/src/Propellor/Property/DiskImage.hs
@@ -13,6 +13,7 @@
 	imageRebuilt,
 	imageBuiltFrom,
 	imageExists,
+	vmdkBuiltFor,
 	Grub.BIOS(..),
 ) where
 
@@ -33,6 +34,7 @@
 import Propellor.Types.Bootloader
 import Propellor.Container
 import Utility.Path
+import Utility.FileMode
 
 import Data.List (isPrefixOf, isInfixOf, sortBy, unzip4)
 import Data.Function (on)
@@ -409,3 +411,20 @@
 toSysDir chrootdir d = case makeRelative chrootdir d of
 		"." -> "/"
 		sysdir -> "/" ++ sysdir
+
+-- | Builds a VirtualBox .vmdk file for the specified disk image file.
+vmdkBuiltFor :: FilePath -> RevertableProperty DebianLike UnixLike
+vmdkBuiltFor diskimage = (setup <!> cleanup)
+	`describe` (vmdkfile ++ " built")
+  where
+	vmdkfile = diskimage ++ ".vmdk"
+	setup = cmdProperty "VBoxManage"
+		[ "internalcommands", "createrawvmdk"
+		, "-filename", vmdkfile
+		, "-rawdisk", diskimage
+		]
+		`changesFile` vmdkfile
+		`onChange` File.mode vmdkfile (combineModes (ownerWriteMode : readModes))
+		`requires` Apt.installed ["virtualbox"]
+		`requires` File.notPresent vmdkfile
+	cleanup = File.notPresent vmdkfile
diff --git a/src/Propellor/Property/Parted.hs b/src/Propellor/Property/Parted.hs
--- a/src/Propellor/Property/Parted.hs
+++ b/src/Propellor/Property/Parted.hs
@@ -111,7 +111,7 @@
 --
 -- For example:
 --
--- >	calcPartTable (1024 * 1024 * 1024 * 100) MSDOS
+-- >	calcPartTable (DiskSize (1024 * 1024 * 1024 * 100)) MSDOS
 -- > 		[ partition EXT2 `mountedAt` "/boot"
 -- > 			`setSize` MegaBytes 256
 -- > 			`setFlag` BootFlag
diff --git a/src/Propellor/Property/Rsync.hs b/src/Propellor/Property/Rsync.hs
--- a/src/Propellor/Property/Rsync.hs
+++ b/src/Propellor/Property/Rsync.hs
@@ -60,4 +60,7 @@
 rsync :: [String] -> Property (DebianLike + ArchLinux)
 rsync ps = cmdProperty "rsync" ps
 	`assume` MadeChange
-	`requires` Apt.installed ["rsync"] `pickOS` Pacman.installed ["rsync"]
+	`requires` installed
+
+installed :: Property (DebianLike + ArchLinux)
+installed = Apt.installed ["rsync"] `pickOS` Pacman.installed ["rsync"]
