diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/main.hs b/main.hs
new file mode 100644
--- /dev/null
+++ b/main.hs
@@ -0,0 +1,34 @@
+module Main where
+
+import Data.List (partition)
+import MSU.Display
+import MSU.Hooks
+import MSU.Xrandr.Command
+import MSU.Xrandr.Parse
+import System.IO (hPrint, stderr)
+import System.Process (readProcess, runCommand, waitForProcess)
+
+main :: IO ()
+main = do
+    xrandrOutput <- readProcess "xrandr" ["--query"] ""
+
+    case parseXrandr xrandrOutput of
+        Left err -> hPrint stderr err
+        Right displays -> do
+            runCmd $ defaultCommand displays
+            runHook runCmd "after-setup"
+
+defaultCommand :: [Display] -> String
+defaultCommand displays = buildCommand $ do
+    let (connected, disconnected) = partition isConnected displays
+
+    allOff disconnected
+    firstOn connected
+    extendRight connected
+
+runCmd :: String -> IO ()
+runCmd cmd = do
+    putStrLn cmd
+    _ <- waitForProcess =<< runCommand cmd
+
+    return ()
diff --git a/msu.cabal b/msu.cabal
new file mode 100644
--- /dev/null
+++ b/msu.cabal
@@ -0,0 +1,24 @@
+name:          msu
+version:       0.0.1
+synopsis:      Monitor Setup Utility
+description:   Convenient wrapper over xrandr for setting up monitors
+homepage:      http://github.com/pbrisbin/msu
+license:       MIT
+copyright:     (c) 2013 Pat Brisbin
+author:        Pat Brisbin <pbrisbin@gmail.com>
+maintainer:    Pat Brisbin <pbrisbin@gmail.com>
+build-type:    Simple
+cabal-version: >= 1.8
+
+executable msu
+  main-is: main.hs
+
+  ghc-options: -Wall
+
+  build-depends: base == 4.*
+               , directory
+               , filepath
+               , mtl
+               , parsec
+               , process
+               , xdg-basedir
