diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,26 @@
+propellor (5.7.0) unstable; urgency=medium
+
+  * Sbuild.built no longer includes Apt.stdSourcesList by default,
+    in order to support non-Debian OS's. (API change)
+    To upgrade: Simply add Sbuild.osDebianStandard to all Sbuild.built
+    calls which have osDebian.
+    Thanks, Sean Whitton
+  * Propellor.Property.PropellorRepo renamed to Propellor.Property.Localdir
+    to widen its scope. (API change)
+  * Added Localdir.removed property.
+    Thanks, Sean Whitton
+  * Sbuild.built uses Localdir.removed to clean up the propellor localdir
+    after it's done running in a schroot.
+    Thanks, Sean Whitton
+  * Cron.runPropellor made revertable. (minor API change)
+    Thanks, Sean Whitton
+  * Added Cron.jobDropped.
+    Thanks, Sean Whitton
+  * Added Utility.FileMode to the modules exported by Propellor.Utilities
+    to propellor library users.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 05 Apr 2019 11:59:52 -0400
+
 propellor (5.6.1) unstable; urgency=medium
 
   * fix Libvirt.hs haddock build
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,26 @@
+propellor (5.7.0) unstable; urgency=medium
+
+  * Sbuild.built no longer includes Apt.stdSourcesList by default,
+    in order to support non-Debian OS's. (API change)
+    To upgrade: Simply add Sbuild.osDebianStandard to all Sbuild.built
+    calls which have osDebian.
+    Thanks, Sean Whitton
+  * Propellor.Property.PropellorRepo renamed to Propellor.Property.Localdir
+    to widen its scope. (API change)
+  * Added Localdir.removed property.
+    Thanks, Sean Whitton
+  * Sbuild.built uses Localdir.removed to clean up the propellor localdir
+    after it's done running in a schroot.
+    Thanks, Sean Whitton
+  * Cron.runPropellor made revertable. (minor API change)
+    Thanks, Sean Whitton
+  * Added Cron.jobDropped.
+    Thanks, Sean Whitton
+  * Added Utility.FileMode to the modules exported by Propellor.Utilities
+    to propellor library users.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 05 Apr 2019 11:59:52 -0400
+
 propellor (5.6.1) unstable; urgency=medium
 
   * fix Libvirt.hs haddock build
diff --git a/joeyconfig.hs b/joeyconfig.hs
--- a/joeyconfig.hs
+++ b/joeyconfig.hs
@@ -71,6 +71,7 @@
 	& Laptop.trimSSD
 	& Grub.cmdline_Linux_default "i915.enable_psr=1"
 	! Grub.cmdline_Linux_default "quiet"
+	& User.hasGroup (User "joey") (Group "dialout")
 
 	& JoeySites.dkimMilter
 	& JoeySites.postfixSaslPasswordClient
@@ -184,7 +185,7 @@
 			`setSize` MegaBytes 16000
 		)
 	& JoeySites.cubieTruckOneWire
-	
+	& Systemd.persistentJournal
 	& Apt.installed ["firmware-atheros"]
 	& Apt.serviceInstalledRunning "ntp" -- no hardware clock
 	& bootstrappedFrom GitRepoOutsideChroot
@@ -259,7 +260,7 @@
 		]
 		[ Borg.KeepDays 7
 		, Borg.KeepWeeks 4
-		, Borg.KeepMonths 6
+		, Borg.KeepMonths 3
 		]
 		`requires` Ssh.knownHost hosts "usw-s002.rsync.net" (User "root")
 		`requires` Ssh.userKeys (User "root")
diff --git a/propellor.cabal b/propellor.cabal
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
 Name: propellor
-Version: 5.6.1
+Version: 5.7.0
 Cabal-Version: 1.20
 License: BSD2
 Maintainer: Joey Hess <id@joeyh.name>
@@ -104,6 +104,7 @@
     Propellor.Property.Libvirt
     Propellor.Property.List
     Propellor.Property.LightDM
+    Propellor.Property.Localdir
     Propellor.Property.Locale
     Propellor.Property.Logcheck
     Propellor.Property.Lvm
@@ -120,7 +121,6 @@
     Propellor.Property.Parted.Types
     Propellor.Property.Partition
     Propellor.Property.Postfix
-    Propellor.Property.PropellorRepo
     Propellor.Property.Prosody
     Propellor.Property.Qemu
     Propellor.Property.Reboot
diff --git a/src/Propellor/Git/VerifiedBranch.hs b/src/Propellor/Git/VerifiedBranch.hs
--- a/src/Propellor/Git/VerifiedBranch.hs
+++ b/src/Propellor/Git/VerifiedBranch.hs
@@ -3,7 +3,6 @@
 import Propellor.Base
 import Propellor.Git
 import Propellor.PrivData.Paths
-import Utility.FileMode
 
 {- To verify origin branch commit's signature, have to convince gpg
  - to use our keyring while running git verify-tag.
diff --git a/src/Propellor/Property/Bootstrap.hs b/src/Propellor/Property/Bootstrap.hs
--- a/src/Propellor/Property/Bootstrap.hs
+++ b/src/Propellor/Property/Bootstrap.hs
@@ -15,7 +15,6 @@
 import Propellor.Types.Info
 import Propellor.Property.Chroot
 import Propellor.PrivData.Paths
-import Utility.FileMode
 
 import Data.List
 import qualified Data.ByteString as B
diff --git a/src/Propellor/Property/Ccache.hs b/src/Propellor/Property/Ccache.hs
--- a/src/Propellor/Property/Ccache.hs
+++ b/src/Propellor/Property/Ccache.hs
@@ -11,7 +11,6 @@
 import qualified Propellor.Property.File as File
 import qualified Propellor.Property.Apt as Apt
 
-import Utility.FileMode
 import Utility.DataUnits
 import System.Posix.Files
 import qualified Data.Semigroup as Sem
diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs
--- a/src/Propellor/Property/Cron.hs
+++ b/src/Propellor/Property/Cron.hs
@@ -1,10 +1,15 @@
-module Propellor.Property.Cron where
+module Propellor.Property.Cron (
+	Times(..),
+	job,
+	niceJob,
+	jobDropped,
+	Propellor.Property.Cron.runPropellor
+) where
 
 import Propellor.Base
 import qualified Propellor.Property.File as File
 import qualified Propellor.Property.Apt as Apt
 import Propellor.Bootstrap
-import Utility.FileMode
 
 import Data.Char
 
@@ -31,7 +36,7 @@
 job desc times (User u) cddir command = combineProperties ("cronned " ++ desc) $ props
 	& Apt.serviceInstalledRunning "cron"
 	& Apt.installed ["util-linux", "moreutils"]
-	& cronjobfile `File.hasContent`
+	& cronjobfile desc times `File.hasContent`
 		[ case times of
 			Times _ -> ""
 			_ -> "#!/bin/sh\nset -e"
@@ -41,47 +46,74 @@
 		, "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
 		, ""
 		, case times of
-			Times t -> t ++ "\t" ++ u ++ "\tchronic " ++ shellEscape scriptfile
+			Times t -> t ++ "\t" ++ u ++ "\tchronic "
+				++ shellEscape (scriptfile desc)
 			_ -> case u of
-				"root" -> "chronic " ++ shellEscape scriptfile
-				_ -> "chronic su " ++ u ++ " -c " ++ shellEscape scriptfile
+				"root" -> "chronic " ++ shellEscape (scriptfile desc)
+				_ -> "chronic su " ++ u ++ " -c "
+					++ shellEscape (scriptfile desc)
 		]
 	& case times of
 		Times _ -> doNothing
-		_ -> cronjobfile `File.mode` combineModes (readModes ++ executeModes)
+		_ -> (cronjobfile desc times)
+			`File.mode` combineModes (readModes ++ executeModes)
 	-- Use a separate script because it makes the cron job name
 	-- prettier in emails, and also allows running the job manually.
-	& scriptfile `File.hasContent`
+	& scriptfile desc `File.hasContent`
 		[ "#!/bin/sh"
 		, "# Generated by propellor"
 		, "set -e"
-		, "flock -n " ++ shellEscape cronjobfile
+		, "flock -n " ++ shellEscape (cronjobfile desc times)
 			++ " sh -c " ++ shellEscape cmdline
 		]
-	& scriptfile `File.mode` combineModes (readModes ++ executeModes)
+	& scriptfile desc `File.mode` combineModes (readModes ++ executeModes)
   where
 	cmdline = "cd " ++ cddir ++ " && ( " ++ command ++ " )"
-	cronjobfile = "/etc" </> cronjobdir </> name
-	cronjobdir = case times of
-		Times _ -> "cron.d"
-		Daily -> "cron.daily"
-		Weekly -> "cron.weekly"
-		Monthly -> "cron.monthly"
-	scriptfile = "/usr/local/bin/" ++ name ++ "_cronjob"
-	name = map sanitize desc
-	sanitize c
-		| isAlphaNum c = c
-		| otherwise = '_'
 
+-- | Removes a cron job created by 'job' or 'niceJob', as identified by the
+-- 'Desc' passed to those properties when the cronjob was set up
+--
+-- Those properties are not revertable because simply removing a cronjob does
+-- not undo the changes it might have made to the system, i.e., 'jobDropped' is
+-- not in the general case a reversion of 'job' or 'niceJob'
+jobDropped :: Desc -> Times -> Property UnixLike
+jobDropped desc times = combineProperties ("uncronned " ++ desc) $ props
+	& File.notPresent (scriptfile desc)
+	& File.notPresent (cronjobfile desc times)
+
 -- | Installs a cron job, and runs it niced and ioniced.
 niceJob :: Desc -> Times -> User -> FilePath -> String -> Property DebianLike
 niceJob desc times user cddir command = job desc times user cddir
 	("nice ionice -c 3 sh -c " ++ shellEscape command)
 
 -- | Installs a cron job to run propellor.
-runPropellor :: Times -> Property DebianLike
-runPropellor times = withOS "propellor cron job" $ \w o -> do
-	bootstrapper <- getBootstrapper
-	ensureProperty w $
-		niceJob "propellor" times (User "root") localdir
-			(bootstrapPropellorCommand bootstrapper o ++ "; ./propellor")
+runPropellor :: Times -> RevertableProperty DebianLike UnixLike
+runPropellor times = cronned <!> uncronned
+  where
+	cronned = withOS "propellor cron job" $ \w o -> do
+		bootstrapper <- getBootstrapper
+		ensureProperty w $
+			niceJob "propellor" times (User "root") localdir
+				(bootstrapPropellorCommand bootstrapper o ++ "; ./propellor")
+	uncronned = jobDropped "propellor" times
+
+-- Utility functions
+
+cronjobname :: Desc -> String
+cronjobname d = map sanitize d
+  where
+	sanitize c
+		| isAlphaNum c = c
+		| otherwise = '_'
+
+scriptfile :: Desc -> FilePath
+scriptfile d = "/usr/local/bin/" ++ (cronjobname d) ++ "_cronjob"
+
+cronjobfile :: Desc -> Times -> FilePath
+cronjobfile d times = "/etc" </> cronjobdir </> (cronjobname d)
+  where
+	cronjobdir = case times of
+		Times _ -> "cron.d"
+		Daily -> "cron.daily"
+		Weekly -> "cron.weekly"
+		Monthly -> "cron.monthly"
diff --git a/src/Propellor/Property/Debootstrap.hs b/src/Propellor/Property/Debootstrap.hs
--- a/src/Propellor/Property/Debootstrap.hs
+++ b/src/Propellor/Property/Debootstrap.hs
@@ -15,7 +15,6 @@
 import Propellor.Property.Chroot.Util
 import Propellor.Property.Qemu
 import Utility.Path
-import Utility.FileMode
 
 import Data.List
 import Data.Char
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
@@ -42,7 +42,6 @@
 import Propellor.Types.Bootloader
 import Propellor.Container
 import Utility.Path
-import Utility.FileMode
 import Utility.DataUnits
 
 import Data.List (isPrefixOf, isInfixOf, sortBy, unzip4)
diff --git a/src/Propellor/Property/File.hs b/src/Propellor/Property/File.hs
--- a/src/Propellor/Property/File.hs
+++ b/src/Propellor/Property/File.hs
@@ -3,7 +3,6 @@
 module Propellor.Property.File where
 
 import Propellor.Base
-import Utility.FileMode
 
 import qualified Data.ByteString.Lazy as L
 import Data.List (isInfixOf, isPrefixOf)
diff --git a/src/Propellor/Property/HostingProvider/Linode.hs b/src/Propellor/Property/HostingProvider/Linode.hs
--- a/src/Propellor/Property/HostingProvider/Linode.hs
+++ b/src/Propellor/Property/HostingProvider/Linode.hs
@@ -3,7 +3,6 @@
 import Propellor.Base
 import qualified Propellor.Property.Grub as Grub
 import qualified Propellor.Property.File as File
-import Utility.FileMode
 
 -- | Configures grub to use the serial console as set up by Linode.
 -- Useful when running a distribution supplied kernel.
diff --git a/src/Propellor/Property/Localdir.hs b/src/Propellor/Property/Localdir.hs
new file mode 100644
--- /dev/null
+++ b/src/Propellor/Property/Localdir.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+
+-- | Properties to manipulate propellor's @/usr/local/propellor@ on spun hosts
+
+module Propellor.Property.Localdir where
+
+import Propellor.Base
+import Propellor.Git.Config
+import Propellor.Types.Info
+import Propellor.Property.Chroot (inChroot)
+import Propellor.Property.Mount (partialBindMountsOf, umountLazy)
+
+-- | Sets the url to use as the origin of propellor's git repository.
+--
+-- By default, the url is taken from the deploy or origin remote of
+-- the repository that propellor --spin is run in. Setting this property
+-- overrides that default behavior with a different url.
+--
+-- When hosts are being updated without using -- --spin, eg when using
+-- the `Propellor.Property.Cron.runPropellor` cron job, this property can
+-- be set to redirect them to a new git repository url.
+hasOriginUrl :: String -> Property (HasInfo + UnixLike)
+hasOriginUrl u = setInfoProperty p (toInfo (InfoVal (OriginUrl u)))
+  where
+	p :: Property UnixLike
+	p = property ("propellor repo url " ++ u) $ do
+		curru <- liftIO getRepoUrl
+		if curru == Just u
+			then return NoChange
+			else makeChange $ setRepoUrl u
+
+newtype OriginUrl = OriginUrl String
+	deriving (Show, Typeable)
+
+-- | Removes the @/usr/local/propellor@ directory used to spin the host, after
+-- ensuring other properties.  Without this property, that directory is left
+-- behind after the spin.
+--
+-- Does not perform other clean up, such as removing Haskell libraries that were
+-- installed in order to build propellor, or removing cronjobs such as created
+-- by 'Propellor.Property.Cron.runPropellor'.
+removed :: Property UnixLike
+removed = check (doesDirectoryExist localdir) $
+	property "propellor's /usr/local dir to be removed" $ do
+		endAction "removing /usr/local/propellor" atend
+		return NoChange
+  where
+	atend _ = do
+		ifM inChroot
+			-- In a chroot, all we have to do is unmount localdir,
+			-- and then delete it
+			( liftIO $ umountLazy localdir
+			-- Outside of a chroot, if we don't unmount any bind
+			-- mounts of localdir before deleting it, another run of
+			-- propellor will have problems reestablishing those
+			-- bind mounts in order to spin chroots
+			, liftIO $ partialBindMountsOf localdir
+				>>= mapM_ umountLazy
+			)
+		liftIO $ removeDirectoryRecursive localdir
+		return NoChange
diff --git a/src/Propellor/Property/Mount.hs b/src/Propellor/Property/Mount.hs
--- a/src/Propellor/Property/Mount.hs
+++ b/src/Propellor/Property/Mount.hs
@@ -89,6 +89,20 @@
 	. filter (dirContains target)
 	<$> mountPoints
 
+-- | Get mountpoints which are bind mounts of subdirectories of mounted
+-- filesystems
+--
+-- E.g. as created by @mount --bind /etc/foo /etc/bar@ where @/etc/foo@ is not
+-- itself a mount point, but just a subdirectory.  These are sometimes known as
+-- "partial bind mounts"
+partialBindMountsOf :: FilePath -> IO [MountPoint]
+partialBindMountsOf sourceDir =
+	map (drop 2 . dropWhile (/= ']')) . filter getThem . lines
+	<$> readProcess "findmnt" ["-rn", "--output", "source,target"]
+  where
+	getThem l = bracketed `isSuffixOf` (takeWhile (/= ' ') l)
+	bracketed = "[" ++ sourceDir ++ "]"
+
 -- | Filesystem type mounted at a given location.
 getFsType :: MountPoint -> IO (Maybe FsType)
 getFsType p = findmntField "fstype" [p]
diff --git a/src/Propellor/Property/Openssl.hs b/src/Propellor/Property/Openssl.hs
--- a/src/Propellor/Property/Openssl.hs
+++ b/src/Propellor/Property/Openssl.hs
@@ -5,9 +5,7 @@
 import Propellor.Base
 import qualified Propellor.Property.Apt as Apt
 import qualified Propellor.Property.File as File
-import Utility.FileMode
 import Utility.SafeCommand
-
 
 installed :: Property DebianLike
 installed = Apt.installed ["openssl"]
diff --git a/src/Propellor/Property/PropellorRepo.hs b/src/Propellor/Property/PropellorRepo.hs
deleted file mode 100644
--- a/src/Propellor/Property/PropellorRepo.hs
+++ /dev/null
@@ -1,29 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-
-module Propellor.Property.PropellorRepo where
-
-import Propellor.Base
-import Propellor.Git.Config
-import Propellor.Types.Info
-
--- | Sets the url to use as the origin of propellor's git repository.
---
--- By default, the url is taken from the deploy or origin remote of
--- the repository that propellor --spin is run in. Setting this property
--- overrides that default behavior with a different url.
---
--- When hosts are being updated without using -- --spin, eg when using
--- the `Propellor.Property.Cron.runPropellor` cron job, this property can
--- be set to redirect them to a new git repository url.
-hasOriginUrl :: String -> Property (HasInfo + UnixLike)
-hasOriginUrl u = setInfoProperty p (toInfo (InfoVal (OriginUrl u)))
-  where
-	p :: Property UnixLike
-	p = property ("propellor repo url " ++ u) $ do
-		curru <- liftIO getRepoUrl
-		if curru == Just u
-			then return NoChange
-			else makeChange $ setRepoUrl u
-
-newtype OriginUrl = OriginUrl String
-	deriving (Show, Typeable)
diff --git a/src/Propellor/Property/Sbuild.hs b/src/Propellor/Property/Sbuild.hs
--- a/src/Propellor/Property/Sbuild.hs
+++ b/src/Propellor/Property/Sbuild.hs
@@ -29,6 +29,7 @@
 >    where
 >  	sidSchrootBuilt = Sbuild.built Sbuild.UseCcache $ props
 >  		& osDebian Unstable X86_32
+>  		& Sbuild.osDebianStandard
 >  		& Sbuild.update `period` Weekly (Just 1)
 >  		& Sbuild.useHostProxy mybox
 
@@ -65,6 +66,7 @@
 	-- * Properties for use inside sbuild schroots
 	update,
 	useHostProxy,
+	osDebianStandard,
 	-- * Global sbuild configuration
 	-- blockNetwork,
 	keypairGenerated,
@@ -86,8 +88,8 @@
 -- import qualified Propellor.Property.Firewall as Firewall
 import qualified Propellor.Property.Schroot as Schroot
 import qualified Propellor.Property.Reboot as Reboot
+import qualified Propellor.Property.Localdir as Localdir
 import qualified Propellor.Property.User as User
-import Utility.FileMode
 
 import Data.List
 
@@ -222,8 +224,11 @@
 	schroot = Chroot.debootstrapped Debootstrap.BuilddD
 			schrootRoot (Props schrootProps)
 	schrootProps =
-		ps ++ [toChildProperty Apt.stdSourcesList
-		, toChildProperty $ Apt.installed ["eatmydata", "ccache"]]
+		ps ++ [toChildProperty $ Apt.installed ["eatmydata", "ccache"]
+		-- Drop /usr/local/propellor since build chroots should be
+		-- clean.  Note that propellor does not have to install its
+		-- build-deps into the chroot, so this is sufficient cleanup
+		, toChildProperty $ Localdir.removed]
 
 	-- static values
 	suiteArch = suite ++ "-" ++ arch
@@ -250,6 +255,12 @@
 		_ -> base
 	  where
 		base = ["eatmydata"]
+
+-- | Properties that will be wanted in almost any Debian schroot, but not in
+-- schroots for other operating systems.
+osDebianStandard :: Property Debian
+osDebianStandard = propertyList "standard Debian sbuild properties" $ props
+	& Apt.stdSourcesList
 
 -- | Ensure that an sbuild schroot's packages and apt indexes are updated
 --
diff --git a/src/Propellor/Property/Schroot.hs b/src/Propellor/Property/Schroot.hs
--- a/src/Propellor/Property/Schroot.hs
+++ b/src/Propellor/Property/Schroot.hs
@@ -9,8 +9,6 @@
 import qualified Propellor.Property.File as File
 import qualified Propellor.Property.Apt as Apt
 
-import Utility.FileMode
-
 data UseOverlays = UseOverlays deriving (Eq, Show, Typeable)
 
 -- | Indicate that a schroots on a host should use @union-type=overlay@
diff --git a/src/Propellor/Property/Service.hs b/src/Propellor/Property/Service.hs
--- a/src/Propellor/Property/Service.hs
+++ b/src/Propellor/Property/Service.hs
@@ -5,7 +5,6 @@
 import Propellor.Base
 import Propellor.Types.Info
 import qualified Propellor.Property.File as File
-import Utility.FileMode
 
 type ServiceName = String
 
diff --git a/src/Propellor/Property/SiteSpecific/Branchable.hs b/src/Propellor/Property/SiteSpecific/Branchable.hs
--- a/src/Propellor/Property/SiteSpecific/Branchable.hs
+++ b/src/Propellor/Property/SiteSpecific/Branchable.hs
@@ -56,7 +56,7 @@
 	 	]
 	 	[ Borg.KeepDays 7
 	 	, Borg.KeepWeeks 5
-	 	, Borg.KeepMonths 12
+	 	, Borg.KeepMonths 3
 	 	, Borg.KeepYears 1
 	 	]
 	& Ssh.userKeys (User "root") (Context "branchable.com")
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -25,7 +25,6 @@
 import qualified Propellor.Property.Fail2Ban as Fail2Ban
 import qualified Propellor.Property.LetsEncrypt as LetsEncrypt
 import qualified Propellor.Property.Mount as Mount
-import Utility.FileMode
 import Utility.Split
 
 import Data.List
@@ -345,13 +344,7 @@
 		"tmp.joeyh.name"
 		"26fd6e38-1226-11e2-a75f-ff007033bdba"
 		[]
-	& pumpRss
-
--- Work around for expired ssl cert.
--- (Obsolete; need to revert this.)
-pumpRss :: Property DebianLike
-pumpRss = Cron.job "pump rss" (Cron.Times "15 * * * *") (User "joey") "/srv/web/tmp.joeyh.name/"
-	"wget https://pump2rss.com/feed/joeyh@identi.ca.atom -O pump.atom.new --no-check-certificate 2>/dev/null; sed 's/ & / /g' pump.atom.new > pump.atom"
+	& Cron.jobDropped "pump rss" (Cron.Times "15 * * * *")
 
 ircBouncer :: Property (HasInfo + DebianLike)
 ircBouncer = propertyList "IRC bouncer" $ props
@@ -1162,7 +1155,7 @@
 	, "w3m", "sm", "weechat"
 	, "borgbackup", "wipe", "smartmontools", "libgfshare-bin"
 	, "units"
-	, "virtualbox", "qemu-kvm"
+	, "virtualbox", "virtualbox-guest-additions-iso", "qemu-kvm"
 	]
 	`requires` baseSoftware
 	`requires` devSoftware
diff --git a/src/Propellor/Property/Ssh.hs b/src/Propellor/Property/Ssh.hs
--- a/src/Propellor/Property/Ssh.hs
+++ b/src/Propellor/Property/Ssh.hs
@@ -40,7 +40,6 @@
 import qualified Propellor.Property.Apt as Apt
 import Propellor.Property.User
 import Propellor.Types.Info
-import Utility.FileMode
 
 import System.PosixCompat
 import qualified Data.Map as M
diff --git a/src/Propellor/Property/Systemd.hs b/src/Propellor/Property/Systemd.hs
--- a/src/Propellor/Property/Systemd.hs
+++ b/src/Propellor/Property/Systemd.hs
@@ -55,7 +55,6 @@
 import qualified Propellor.Property.Apt as Apt
 import qualified Propellor.Property.File as File
 import Propellor.Property.Systemd.Core
-import Utility.FileMode
 import Utility.Split
 
 import Data.List
diff --git a/src/Propellor/Property/Tor.hs b/src/Propellor/Property/Tor.hs
--- a/src/Propellor/Property/Tor.hs
+++ b/src/Propellor/Property/Tor.hs
@@ -7,7 +7,6 @@
 import qualified Propellor.Property.Apt as Apt
 import qualified Propellor.Property.Service as Service
 import qualified Propellor.Property.ConfFile as ConfFile
-import Utility.FileMode
 import Utility.DataUnits
 
 import System.Posix.Files
diff --git a/src/Propellor/Shim.hs b/src/Propellor/Shim.hs
--- a/src/Propellor/Shim.hs
+++ b/src/Propellor/Shim.hs
@@ -8,7 +8,6 @@
 
 import Propellor.Base
 import Utility.LinuxMkLibs
-import Utility.FileMode
 
 import Data.List
 import System.Posix.Files
diff --git a/src/Propellor/Spin.hs b/src/Propellor/Spin.hs
--- a/src/Propellor/Spin.hs
+++ b/src/Propellor/Spin.hs
@@ -29,9 +29,8 @@
 import Propellor.Bootstrap
 import Propellor.Types.CmdLine
 import Propellor.Types.Info
-import Propellor.Property.PropellorRepo (OriginUrl(..))
+import Propellor.Property.Localdir (OriginUrl(..))
 import qualified Propellor.Shim as Shim
-import Utility.FileMode
 import Utility.SafeCommand
 import Utility.Process.NonConcurrent
 
diff --git a/src/Propellor/Utilities.hs b/src/Propellor/Utilities.hs
--- a/src/Propellor/Utilities.hs
+++ b/src/Propellor/Utilities.hs
@@ -19,6 +19,7 @@
 	, module Utility.Tmp.Dir
 	, module Utility.Monad
 	, module Utility.Misc
+	, module Utility.FileMode
 ) where
 
 import Utility.PartialPrelude
@@ -33,3 +34,4 @@
 import Utility.Tmp.Dir
 import Utility.Monad
 import Utility.Misc
+import Utility.FileMode
