diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -16,10 +16,12 @@
 
 import XMonad
 
+import Control.Monad (unless)
 import System.IO
 import System.Info
 import System.Environment
 import System.Posix.Process (executeFile)
+import System.Exit (exitFailure)
 
 import Paths_xmonad_bluetilebranch (version)
 import Data.Version (showVersion)
@@ -39,7 +41,7 @@
         []                    -> launch
         ["--resume", _]       -> launch
         ["--help"]            -> usage
-        ["--recompile"]       -> recompile True >> return ()
+        ["--recompile"]       -> recompile True >>= flip unless exitFailure
         ["--restart"]         -> sendRestart >> return ()
         ["--version"]         -> putStrLn ("xmonad " ++ showVersion version)
 #ifdef TESTING
diff --git a/XMonad/Config.hs b/XMonad/Config.hs
--- a/XMonad/Config.hs
+++ b/XMonad/Config.hs
@@ -218,7 +218,7 @@
 
     -- quit, or restart
     , ((modMask .|. shiftMask, xK_q     ), io (exitWith ExitSuccess)) -- %! Quit xmonad
-    , ((modMask              , xK_q     ), spawn "xmonad --recompile; xmonad --restart") -- %! Restart xmonad
+    , ((modMask              , xK_q     ), spawn "xmonad --recompile && xmonad --restart") -- %! Restart xmonad
     ]
     ++
     -- mod-[1..9] %! Switch to workspace N
diff --git a/XMonad/Core.hs b/XMonad/Core.hs
--- a/XMonad/Core.hs
+++ b/XMonad/Core.hs
@@ -38,6 +38,7 @@
 import Control.Applicative
 import Control.Monad.State
 import Control.Monad.Reader
+import System.FilePath
 import System.IO
 import System.Info
 import System.Posix.Process (executeFile, forkProcess, getAnyProcessStatus, createSession)
@@ -50,6 +51,7 @@
 import Graphics.X11.Xlib
 import Graphics.X11.Xlib.Extras (Event)
 import Data.Typeable
+import Data.List ((\\))
 import Data.Maybe (isJust)
 import Data.Monoid
 import Data.Maybe (fromMaybe)
@@ -412,18 +414,20 @@
 recompile force = io $ do
     dir <- getXMonadDir
     let binn = "xmonad-"++arch++"-"++os
-        bin  = dir ++ "/" ++ binn
-        base = dir ++ "/" ++ "xmonad"
+        bin  = dir </> binn
+        base = dir </> "xmonad"
         err  = base ++ ".errors"
         src  = base ++ ".hs"
+        lib  = dir </> "lib"
+    libTs <- mapM getModTime . Prelude.filter isSource =<< allFiles lib
     srcT <- getModTime src
     binT <- getModTime bin
-    if (force || srcT > binT)
+    if (force || srcT > binT || any (binT<) libTs)
       then do
         -- temporarily disable SIGCHLD ignoring:
         uninstallSignalHandlers
         status <- bracket (openFile err WriteMode) hClose $ \h -> do
-            waitForProcess =<< runProcess "ghc" ["--make", "xmonad.hs", "-i", "-fforce-recomp", "-v0", "-o",binn] (Just dir)
+            waitForProcess =<< runProcess "ghc" ["--make", "xmonad.hs", "-i", "-ilib", "-fforce-recomp", "-v0", "-o",binn] (Just dir)
                                     Nothing Nothing Nothing (Just h)
 
         -- re-enable SIGCHLD:
@@ -443,6 +447,12 @@
         return (status == ExitSuccess)
       else return True
  where getModTime f = catch (Just <$> getModificationTime f) (const $ return Nothing)
+       isSource = flip elem [".hs",".lhs",".hsc"]
+       allFiles t = do
+            let prep = map (t</>) . Prelude.filter (`notElem` [".",".."])
+            cs <- prep <$> catch (getDirectoryContents t) (\_ -> return [])
+            ds <- filterM doesDirectoryExist cs
+            concat . ((cs \\ ds):) <$> mapM allFiles ds
 
 -- | Conditionally run an action, using a @Maybe a@ to decide.
 whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
diff --git a/XMonad/ManageHook.hs b/XMonad/ManageHook.hs
--- a/XMonad/ManageHook.hs
+++ b/XMonad/ManageHook.hs
@@ -45,6 +45,8 @@
 composeAll :: [ManageHook] -> ManageHook
 composeAll = mconcat
 
+infix 0 -->
+
 -- | @p --> x@.  If @p@ returns 'True', execute the 'ManageHook'.
 (-->) :: Query Bool -> ManageHook -> ManageHook
 p --> f = p >>= \b -> if b then f else mempty
@@ -72,7 +74,7 @@
             (internAtom d "_NET_WM_NAME" False >>= getTextProperty d w)
                 `catch` \_ -> getTextProperty d w wM_NAME
         extract prop = do l <- wcTextPropertyToTextList d prop
-		          return $ if null l then "" else head l
+                          return $ if null l then "" else head l
     io $ bracket getProp (xFree . tp_value) extract `catch` \_ -> return ""
 
 -- | Return the application name.
diff --git a/XMonad/StackSet.hs b/XMonad/StackSet.hs
--- a/XMonad/StackSet.hs
+++ b/XMonad/StackSet.hs
@@ -35,7 +35,7 @@
         -- *  Operations on the current stack
         -- $stackOperations
         peek, index, integrate, integrate', differentiate,
-        focusUp, focusDown, focusUp', focusDown', focusMaster, focusWindow,
+        focusUp, focusDown, focusUp', focusDown', focusMaster, focusMaster', focusWindow,
         tagMember, renameTag, ensureTags, member, findTag, mapWorkspace, mapLayout,
         -- * Modifying the stackset
         -- $modifyStackset
@@ -524,9 +524,13 @@
 
 -- | /O(s)/. Set focus to the master window.
 focusMaster :: StackSet i l a s sd -> StackSet i l a s sd
-focusMaster = modify' $ \c -> case c of
-    Stack _ [] _  -> c
-    Stack t ls rs -> Stack x [] (xs ++ t : rs) where (x:xs) = reverse ls
+focusMaster = modify' focusMaster'
+
+-- | Variant of 'focusMaster' that works on a
+-- 'Stack' rather than an entire 'StackSet'.
+focusMaster' :: Stack a -> Stack a
+focusMaster' c@(Stack _ [] _) = c
+focusMaster' (Stack t ls rs) = Stack x [] (xs ++ t : rs) where (x:xs) = reverse ls
 
 --
 -- ---------------------------------------------------------------------
diff --git a/man/xmonad.hs b/man/xmonad.hs
--- a/man/xmonad.hs
+++ b/man/xmonad.hs
@@ -8,6 +8,7 @@
 --
 
 import XMonad
+import Data.Monoid
 import System.Exit
 
 import qualified XMonad.StackSet as W
@@ -67,73 +68,76 @@
 ------------------------------------------------------------------------
 -- Key bindings. Add, modify or remove key bindings here.
 --
-myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
+myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
 
     -- launch a terminal
-    [ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
+    [ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
 
     -- launch dmenu
-    , ((modMask,               xK_p     ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"")
+    , ((modm,               xK_p     ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"")
 
     -- launch gmrun
-    , ((modMask .|. shiftMask, xK_p     ), spawn "gmrun")
+    , ((modm .|. shiftMask, xK_p     ), spawn "gmrun")
 
     -- close focused window
-    , ((modMask .|. shiftMask, xK_c     ), kill)
+    , ((modm .|. shiftMask, xK_c     ), kill)
 
      -- Rotate through the available layout algorithms
-    , ((modMask,               xK_space ), sendMessage NextLayout)
+    , ((modm,               xK_space ), sendMessage NextLayout)
 
     --  Reset the layouts on the current workspace to default
-    , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
+    , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
 
     -- Resize viewed windows to the correct size
-    , ((modMask,               xK_n     ), refresh)
+    , ((modm,               xK_n     ), refresh)
 
     -- Move focus to the next window
-    , ((modMask,               xK_Tab   ), windows W.focusDown)
+    , ((modm,               xK_Tab   ), windows W.focusDown)
 
     -- Move focus to the next window
-    , ((modMask,               xK_j     ), windows W.focusDown)
+    , ((modm,               xK_j     ), windows W.focusDown)
 
     -- Move focus to the previous window
-    , ((modMask,               xK_k     ), windows W.focusUp  )
+    , ((modm,               xK_k     ), windows W.focusUp  )
 
     -- Move focus to the master window
-    , ((modMask,               xK_m     ), windows W.focusMaster  )
+    , ((modm,               xK_m     ), windows W.focusMaster  )
 
     -- Swap the focused window and the master window
-    , ((modMask,               xK_Return), windows W.swapMaster)
+    , ((modm,               xK_Return), windows W.swapMaster)
 
     -- Swap the focused window with the next window
-    , ((modMask .|. shiftMask, xK_j     ), windows W.swapDown  )
+    , ((modm .|. shiftMask, xK_j     ), windows W.swapDown  )
 
     -- Swap the focused window with the previous window
-    , ((modMask .|. shiftMask, xK_k     ), windows W.swapUp    )
+    , ((modm .|. shiftMask, xK_k     ), windows W.swapUp    )
 
     -- Shrink the master area
-    , ((modMask,               xK_h     ), sendMessage Shrink)
+    , ((modm,               xK_h     ), sendMessage Shrink)
 
     -- Expand the master area
-    , ((modMask,               xK_l     ), sendMessage Expand)
+    , ((modm,               xK_l     ), sendMessage Expand)
 
     -- Push window back into tiling
-    , ((modMask,               xK_t     ), withFocused $ windows . W.sink)
+    , ((modm,               xK_t     ), withFocused $ windows . W.sink)
 
     -- Increment the number of windows in the master area
-    , ((modMask              , xK_comma ), sendMessage (IncMasterN 1))
+    , ((modm              , xK_comma ), sendMessage (IncMasterN 1))
 
     -- Deincrement the number of windows in the master area
-    , ((modMask              , xK_period), sendMessage (IncMasterN (-1)))
+    , ((modm              , xK_period), sendMessage (IncMasterN (-1)))
 
-    -- toggle the status bar gap
-    -- TODO, update this binding with avoidStruts , ((modMask              , xK_b     ),
+    -- Toggle the status bar gap
+    -- Use this binding with avoidStruts from Hooks.ManageDocks.
+    -- See also the statusBar function from Hooks.DynamicLog.
+    --
+    -- , ((modm              , xK_b     ), sendMessage ToggleStruts)
 
     -- Quit xmonad
-    , ((modMask .|. shiftMask, xK_q     ), io (exitWith ExitSuccess))
+    , ((modm .|. shiftMask, xK_q     ), io (exitWith ExitSuccess))
 
     -- Restart xmonad
-    , ((modMask              , xK_q     ), spawn "xmonad --recompile; xmonad --restart")
+    , ((modm              , xK_q     ), spawn "xmonad --recompile; xmonad --restart")
     ]
     ++
 
@@ -141,7 +145,7 @@
     -- mod-[1..9], Switch to workspace N
     -- mod-shift-[1..9], Move client to workspace N
     --
-    [((m .|. modMask, k), windows $ f i)
+    [((m .|. modm, k), windows $ f i)
         | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
         , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
     ++
@@ -150,7 +154,7 @@
     -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
     -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
     --
-    [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f))
+    [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
         | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
         , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
 
@@ -158,18 +162,18 @@
 ------------------------------------------------------------------------
 -- Mouse bindings: default actions bound to mouse events
 --
-myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
+myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList $
 
     -- mod-button1, Set the window to floating mode and move by dragging
-    [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w
-                                          >> windows W.shiftMaster))
+    [ ((modm, button1), (\w -> focus w >> mouseMoveWindow w
+                                       >> windows W.shiftMaster))
 
     -- mod-button2, Raise the window to the top of the stack
-    , ((modMask, button2), (\w -> focus w >> windows W.shiftMaster))
+    , ((modm, button2), (\w -> focus w >> windows W.shiftMaster))
 
     -- mod-button3, Set the window to floating mode and resize by dragging
-    , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w
-                                          >> windows W.shiftMaster))
+    , ((modm, button3), (\w -> focus w >> mouseResizeWindow w
+                                       >> windows W.shiftMaster))
 
     -- you may also bind events to the mouse scroll wheel (button4 and button5)
     ]
diff --git a/xmonad-bluetilebranch.cabal b/xmonad-bluetilebranch.cabal
--- a/xmonad-bluetilebranch.cabal
+++ b/xmonad-bluetilebranch.cabal
@@ -1,5 +1,5 @@
 name:               xmonad-bluetilebranch
-version:            0.8.1
+version:            0.8.1.3
 homepage:           http://xmonad.org
 synopsis:           A tiling window manager
 description:        This is a modified version of xmonad used by Bluetile.
@@ -34,7 +34,7 @@
     exposed:            False
 
     if flag(small_base)
-        build-depends: base < 4 && >=3, containers, directory, process
+        build-depends: base < 4 && >=3, containers, directory, process, filepath
     else
         build-depends: base < 3
     build-depends: X11>=1.4.3, mtl, unix, random
