diff --git a/Yesod/Default/Handlers.hs b/Yesod/Default/Handlers.hs
--- a/Yesod/Default/Handlers.hs
+++ b/Yesod/Default/Handlers.hs
@@ -5,10 +5,10 @@
     ) where
 
 import Yesod.Handler (GHandler, sendFile)
-import Yesod.Content (RepPlain(..), ToContent(..))
+import Yesod.Content (RepPlain(..))
 
 getFaviconR :: GHandler s m ()
 getFaviconR = sendFile "image/x-icon" "config/favicon.ico"
 
 getRobotsR :: GHandler s m RepPlain
-getRobotsR = return $ RepPlain $ toContent ("User-agent: *" :: String)
+getRobotsR = sendFile "text/plain" "config/robots.txt"
diff --git a/Yesod/Default/Main.hs b/Yesod/Default/Main.hs
--- a/Yesod/Default/Main.hs
+++ b/Yesod/Default/Main.hs
@@ -13,6 +13,11 @@
 import Network.Wai (Application)
 import Network.Wai.Handler.Warp (run)
 import Network.Wai.Middleware.Debug (debugHandle)
+import System.Directory (doesDirectoryExist, removeDirectoryRecursive)
+import Network.Wai.Middleware.Gzip (gzip', GzipFiles (GzipCacheFolder), gzipFiles, def)
+import Network.Wai.Middleware.Autohead (autohead)
+import Network.Wai.Middleware.Jsonp (jsonp)
+import Control.Monad (when)
 
 #ifndef WINDOWS
 import qualified System.Posix.Signals as Signal
@@ -55,19 +60,25 @@
               => (Application -> IO a)
               -> y -- ^ your foundation type
               -> IO ()
-defaultRunner f h =
+defaultRunner f h = do
+    -- clear the .static-cache so we don't have stale content
+    exists <- doesDirectoryExist staticCache
+    when exists $ removeDirectoryRecursive staticCache
 #ifdef WINDOWS
-    toWaiApp h >>= f >> return ()
+    toWaiAppPlain h >>= f . middlewares >> return ()
 #else
-    do
-        tid <- forkIO $ toWaiApp h >>= f >> return ()
-        flag <- newEmptyMVar
-        _ <- Signal.installHandler Signal.sigINT (Signal.CatchOnce $ do
-            putStrLn "Caught an interrupt"
-            killThread tid
-            putMVar flag ()) Nothing
-        takeMVar flag
+    tid <- forkIO $ toWaiAppPlain h >>= f . middlewares >> return ()
+    flag <- newEmptyMVar
+    _ <- Signal.installHandler Signal.sigINT (Signal.CatchOnce $ do
+        putStrLn "Caught an interrupt"
+        killThread tid
+        putMVar flag ()) Nothing
+    takeMVar flag
 #endif
+  where
+    middlewares = gzip' gset . jsonp . autohead
+    gset = def { gzipFiles = GzipCacheFolder staticCache }
+    staticCache = ".static-cache"
 
 -- | Run your development app using the provided @'DefaultEnv'@ type
 --
diff --git a/Yesod/Default/Util.hs b/Yesod/Default/Util.hs
--- a/Yesod/Default/Util.hs
+++ b/Yesod/Default/Util.hs
@@ -52,9 +52,9 @@
         | ext' == "js" = either (const content) id $ minify content
         | otherwise = content
 
--- | expects a root folder for each type, e.g: hamlet/ lucius/ julius/
+-- | expects a file extension for each type, e.g: hamlet lucius julius
 globFile :: String -> String -> FilePath
-globFile kind x = kind ++ "/" ++ x ++ "." ++ kind
+globFile kind x = "templates/" ++ x ++ "." ++ kind
 
 widgetFileProduction :: FilePath -> Q Exp
 widgetFileProduction x = do
diff --git a/yesod-default.cabal b/yesod-default.cabal
--- a/yesod-default.cabal
+++ b/yesod-default.cabal
@@ -1,5 +1,5 @@
 name:            yesod-default
-version:         0.3.1
+version:         0.4.0
 license:         BSD3
 license-file:    LICENSE
 author:          Patrick Brisbin
@@ -22,7 +22,7 @@
                    , cmdargs           >= 0.8 && < 0.9
                    , warp              >= 0.4 && < 0.5
                    , wai               >= 0.4 && < 0.5
-                   , wai-extra         >= 0.4 && < 0.5
+                   , wai-extra         >= 0.4.4 && < 0.5
                    , bytestring        >= 0.9 && < 0.10
                    , transformers      >= 0.2 && < 0.3
                    , text              >= 0.9 && < 1.0
