diff --git a/Propellor.hs b/Propellor.hs
--- a/Propellor.hs
+++ b/Propellor.hs
@@ -1,26 +1,25 @@
 -- | Pulls in lots of useful modules for building and using Properties.
---
+-- 
 -- Propellor enures that the system it's run in satisfies a list of
 -- properties, taking action as necessary when a property is not yet met.
 --
 -- A simple propellor program example:
 --
---
---> import Propellor
---> import Propellor.CmdLine
---> import qualified Propellor.Property.File as File
---> import qualified Propellor.Property.Apt as Apt
---> 
---> main :: IO ()
---> main = defaultMain getProperties
---> 
---> getProperties :: HostName -> Maybe [Property]
---> getProperties "example.com" = Just
--->    [ Apt.installed ["mydaemon"]
--->    , "/etc/mydaemon.conf" `File.containsLine` "secure=1"
--->        `onChange` cmdProperty "service" ["mydaemon", "restart"]]
--->    ]
---> getProperties _ = Nothing
+-- > import Propellor
+-- > import Propellor.CmdLine
+-- > import qualified Propellor.Property.File as File
+-- > import qualified Propellor.Property.Apt as Apt
+-- > 
+-- > main :: IO ()
+-- > main = defaultMain getProperties
+-- > 
+-- > getProperties :: HostName -> Maybe [Property]
+-- > getProperties "example.com" = Just
+-- >    [ Apt.installed ["mydaemon"]
+-- >    , "/etc/mydaemon.conf" `File.containsLine` "secure=1"
+-- >        `onChange` cmdProperty "service" ["mydaemon", "restart"]]
+-- >    ]
+-- > getProperties _ = Nothing
 --
 -- See config.hs for a more complete example, and clone Propellor's
 -- git repository for a deployable system using Propellor:
@@ -31,12 +30,14 @@
 	, module Propellor.Property
 	, module Propellor.Property.Cmd
 	, module Propellor.PrivData
+	, module Propellor.Engine
 
 	, module X
 ) where
 
 import Propellor.Types
 import Propellor.Property
+import Propellor.Engine
 import Propellor.Property.Cmd
 import Propellor.PrivData
 
diff --git a/Propellor/Engine.hs b/Propellor/Engine.hs
new file mode 100644
--- /dev/null
+++ b/Propellor/Engine.hs
@@ -0,0 +1,47 @@
+module Propellor.Engine where
+
+import System.Console.ANSI
+import System.Exit
+import System.IO
+
+import Propellor.Types
+import Utility.Exception
+
+ensureProperty :: Property -> IO Result
+ensureProperty = catchDefaultIO FailedChange . propertySatisfy
+
+ensureProperties :: [Property] -> IO ()
+ensureProperties ps = do
+	r <- ensureProperties' [Property "overall" $ ensureProperties' ps]
+	case r of
+		FailedChange -> exitWith (ExitFailure 1)
+		_ -> exitWith ExitSuccess
+
+ensureProperties' :: [Property] -> IO Result
+ensureProperties' ps = ensure ps NoChange
+  where
+	ensure [] rs = return rs
+	ensure (l:ls) rs = do
+		r <- ensureProperty l
+		clearFromCursorToLineBeginning
+		setCursorColumn 0
+		putStr $ propertyDesc l ++ "... "
+		case r of
+			FailedChange -> do
+				setSGR [SetColor Foreground Vivid Red]
+				putStrLn "failed"
+			NoChange -> do
+				setSGR [SetColor Foreground Dull Green]
+				putStrLn "unchanged"
+			MadeChange -> do
+				setSGR [SetColor Foreground Vivid Green]
+				putStrLn "done"
+		setSGR []
+		ensure ls (combineResult r rs)
+
+warningMessage :: String -> IO ()
+warningMessage s = do
+	setSGR [SetColor Foreground Vivid Red]
+	putStrLn $ "** warning: " ++ s
+	setSGR []
+	hFlush stdout
diff --git a/Propellor/PrivData.hs b/Propellor/PrivData.hs
--- a/Propellor/PrivData.hs
+++ b/Propellor/PrivData.hs
@@ -9,7 +9,7 @@
 import Control.Monad
 
 import Propellor.Types
-import Propellor.Property
+import Propellor.Engine
 import Utility.Monad
 import Utility.PartialPrelude
 import Utility.Exception
diff --git a/Propellor/Property.hs b/Propellor/Property.hs
--- a/Propellor/Property.hs
+++ b/Propellor/Property.hs
@@ -2,13 +2,10 @@
 
 import System.Directory
 import Control.Monad
-import System.Console.ANSI
-import System.Exit
-import System.IO
 
 import Propellor.Types
+import Propellor.Engine
 import Utility.Monad
-import Utility.Exception
 
 makeChange :: IO () -> IO Result
 makeChange a = a >> return MadeChange
@@ -82,42 +79,3 @@
 	( ensureProperty property
 	, return NoChange
 	)
-
-ensureProperty :: Property -> IO Result
-ensureProperty = catchDefaultIO FailedChange . propertySatisfy
-
-ensureProperties :: [Property] -> IO ()
-ensureProperties ps = do
-	r <- ensureProperties' [propertyList "overall" ps]
-	case r of
-		FailedChange -> exitWith (ExitFailure 1)
-		_ -> exitWith ExitSuccess
-
-ensureProperties' :: [Property] -> IO Result
-ensureProperties' ps = ensure ps NoChange
-  where
-	ensure [] rs = return rs
-	ensure (l:ls) rs = do
-		r <- ensureProperty l
-		clearFromCursorToLineBeginning
-		setCursorColumn 0
-		putStr $ propertyDesc l ++ "... "
-		case r of
-			FailedChange -> do
-				setSGR [SetColor Foreground Vivid Red]
-				putStrLn "failed"
-			NoChange -> do
-				setSGR [SetColor Foreground Dull Green]
-				putStrLn "unchanged"
-			MadeChange -> do
-				setSGR [SetColor Foreground Vivid Green]
-				putStrLn "done"
-		setSGR []
-		ensure ls (combineResult r rs)
-
-warningMessage :: String -> IO ()
-warningMessage s = do
-	setSGR [SetColor Foreground Vivid Red]
-	putStrLn $ "** warning: " ++ s
-	setSGR []
-	hFlush stdout
diff --git a/propellor.cabal b/propellor.cabal
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
 Name: propellor
-Version: 0.1.1
+Version: 0.1.2
 Cabal-Version: >= 1.6
 License: GPL
 Maintainer: Joey Hess <joey@kitenet.net>
@@ -60,6 +60,7 @@
     Propellor.Property.User
     Propellor.CmdLine
     Propellor.PrivData
+    Propellor.Engine
     Propellor.Types
   Other-Modules:
     Utility.Applicative
