diff --git a/Scaffold/Build.hs b/Scaffold/Build.hs
--- a/Scaffold/Build.hs
+++ b/Scaffold/Build.hs
@@ -9,7 +9,7 @@
 -- FIXME there's a bug when getFileStatus applies to a file temporary deleted (e.g., Vim saving a file)
 
 import qualified Distribution.Simple.Build as B
-import System.Directory (getDirectoryContents, doesDirectoryExist)
+import System.Directory (getDirectoryContents, doesDirectoryExist, doesFileExist)
 import Data.List (isSuffixOf)
 import Distribution.Simple.Setup (defaultBuildFlags)
 import Distribution.Simple.Configure (getPersistBuildConfig)
@@ -22,7 +22,10 @@
 import Data.Monoid (mappend)
 import qualified Data.Map as Map
 import qualified Data.Set as Set
-import System.PosixCompat.Files (accessTime, modificationTime, getFileStatus, setFileTimes)
+import System.PosixCompat.Files (accessTime, modificationTime, getFileStatus, setFileTimes, FileStatus)
+import Data.Text (unpack)
+import Control.Monad (filterM)
+import Control.Exception (SomeException, try)
 
 build :: IO ()
 build = do
@@ -56,15 +59,25 @@
     mapM_ go . Map.toList
   where
     go (x, ys) = do
-        fs <- getFileStatus x
+        (_, mod1) <- getFileStatus' x
         flip mapM_ (Set.toList ys) $ \y -> do
-            fs' <- getFileStatus y
-            if modificationTime fs' < modificationTime fs
+            (access, mod2) <- getFileStatus' y
+            if mod2 < mod1
                 then do
                     putStrLn $ "Touching " ++ y ++ " because of " ++ x
-                    setFileTimes y (accessTime fs') (modificationTime fs)
+                    _ <- try' $ setFileTimes y access mod1
+                    return ()
                 else return ()
 
+try' :: IO x -> IO (Either SomeException x)
+try' = try
+
+getFileStatus' fp = do
+    efs <- try' $ getFileStatus fp
+    case efs of
+        Left _ -> return (0, 0)
+        Right fs -> return (accessTime fs, modificationTime fs)
+
 fixDeps :: [(FilePath, [FilePath])] -> Deps
 fixDeps =
     Map.unionsWith mappend . map go
@@ -88,38 +101,47 @@
                     then return [y]
                     else return []
 
-data TempType = Hamlet | Cassius | Lucius | Julius | Widget | Verbatim
+data TempType = Hamlet | Verbatim | Messages FilePath
     deriving Show
 
 determineHamletDeps :: FilePath -> IO [FilePath]
 determineHamletDeps x = do
-    y <- TIO.readFile x
+    y <- TIO.readFile x -- FIXME catch IO exceptions
     let z = A.parse (A.many $ (parser <|> (A.anyChar >> return Nothing))) y
     case z of
         A.Fail{} -> return []
-        A.Done _ r -> return $ mapMaybe go r
+        A.Done _ r -> filterM doesFileExist $ concatMap go r
   where
-    go (Just (Hamlet, f)) = Just $ "hamlet/" ++ f ++ ".hamlet"
-    go (Just (Widget, f)) = Just $ "hamlet/" ++ f ++ ".hamlet"
-    go (Just (Verbatim, f)) = Just f
-    go _ = Nothing
+    go (Just (Hamlet, f)) = [f, "hamlet/" ++ f ++ ".hamlet"]
+    go (Just (Verbatim, f)) = [f]
+    go (Just (Messages f, _)) = [f]
+    go Nothing = []
     parser = do
         ty <- (A.string "$(hamletFile " >> return Hamlet)
-           <|> (A.string "$(cassiusFile " >> return Cassius)
-           <|> (A.string "$(luciusFile " >> return Lucius)
-           <|> (A.string "$(juliusFile " >> return Julius)
-           <|> (A.string "$(widgetFile " >> return Widget)
+           <|> (A.string "$(ihamletFile " >> return Hamlet)
+           <|> (A.string "$(whamletFile " >> return Hamlet)
+           <|> (A.string "$(html " >> return Hamlet)
+           <|> (A.string "$(widgetFile " >> return Hamlet)
            <|> (A.string "$(Settings.hamletFile " >> return Hamlet)
-           <|> (A.string "$(Settings.cassiusFile " >> return Cassius)
-           <|> (A.string "$(Settings.luciusFile " >> return Lucius)
-           <|> (A.string "$(Settings.juliusFile " >> return Julius)
-           <|> (A.string "$(Settings.widgetFile " >> return Widget)
+           <|> (A.string "$(Settings.widgetFile " >> return Hamlet)
            <|> (A.string "$(persistFile " >> return Verbatim)
            <|> (A.string "$(parseRoutesFile " >> return Verbatim)
-        A.skipWhile isSpace
-        _ <- A.char '"'
-        y <- A.many1 $ A.satisfy (/= '"')
-        _ <- A.char '"'
-        A.skipWhile isSpace
-        _ <- A.char ')'
-        return $ Just (ty, y)
+           <|> (do
+                    A.string "\nmkMessage \""
+                    A.skipWhile (/= '"')
+                    A.string "\" \""
+                    x <- A.many1 $ A.satisfy (/= '"')
+                    A.string "\" \""
+                    y <- A.many1 $ A.satisfy (/= '"')
+                    A.string "\""
+                    return $ Messages $ concat [x, "/", y, ".msg"])
+        case ty of
+            Messages{} -> return $ Just (ty, "")
+            _ -> do
+                A.skipWhile isSpace
+                _ <- A.char '"'
+                y <- A.many1 $ A.satisfy (/= '"')
+                _ <- A.char '"'
+                A.skipWhile isSpace
+                _ <- A.char ')'
+                return $ Just (ty, y)
diff --git a/Scaffold/Devel.hs b/Scaffold/Devel.hs
--- a/Scaffold/Devel.hs
+++ b/Scaffold/Devel.hs
@@ -143,7 +143,6 @@
 
 loop :: FileList -> IO () -> IO ()
 loop oldList getNewApp = do
-    putStrLn "Testing files..."
     newList <- getFileList
     when (newList /= oldList) getNewApp
     threadDelay 1000000
diff --git a/scaffold.hs b/scaffold.hs
--- a/scaffold.hs
+++ b/scaffold.hs
@@ -46,35 +46,29 @@
             putStrLn "    build        Build project (performs TH dependency analysis)"
             putStrLn "    devel        Run project with the devel server"
 
+puts :: String -> IO ()
+puts s = putStr s >> hFlush stdout
+
 scaffold :: IO ()
 scaffold = do
-    putStr $(codegen "welcome")
-    hFlush stdout
+    puts $(codegen "welcome")
     name <- getLine
 
-    putStr $(codegen "project-name")
-    hFlush stdout
+    puts $(codegen "project-name")
     let validPN c
             | 'A' <= c && c <= 'Z' = True
             | 'a' <= c && c <= 'z' = True
             | '0' <= c && c <= '9' = True
         validPN '-' = True
-        validPN '_' = True
         validPN _ = False
     project <- prompt $ all validPN
-
-    putStr $(codegen "dir-name")
-    hFlush stdout
-    dirRaw <- getLine
-    let dir = if null dirRaw then project else dirRaw
+    let dir = project
 
-    putStr $(codegen "site-arg")
-    hFlush stdout
+    puts $(codegen "site-arg")
     let isUpperAZ c = 'A' <= c && c <= 'Z'
     sitearg <- prompt $ \s -> not (null s) && all validPN s && isUpperAZ (head s) && s /= "Main"
 
-    putStr $(codegen "database")
-    hFlush stdout
+    puts $(codegen "database")
     backendS <- prompt $ flip elem ["s", "p", "m"]
     let pconn1 = $(codegen "pconn1")
     let pconn2 = $(codegen "pconn2")
@@ -101,6 +95,7 @@
     mkDir "lucius"
     mkDir "julius"
     mkDir "static"
+    mkDir "static/css"
     mkDir "config"
 
     writeFile' ("config/" ++ project ++ ".hs") $(codegen "test_hs")
@@ -116,6 +111,10 @@
         $(codegen "default-layout_cassius")
     writeFile' "hamlet/default-layout.hamlet"
         $(codegen "default-layout_hamlet")
+    writeFile' "hamlet/boilerplate-layout.hamlet"
+        $(codegen "boilerplate-layout_hamlet")
+    writeFile' "static/css/html5boilerplate.css"
+        $(codegen "boilerplate_css")
     writeFile' "hamlet/homepage.hamlet" $ if backendS == "m" then $(codegen "mini-homepage_hamlet") else $(codegen "homepage_hamlet")
     writeFile' "config/routes" $ if backendS == "m" then $(codegen "mini-routes") else $(codegen "routes")
     writeFile' "cassius/homepage.cassius" $(codegen "homepage_cassius")
diff --git a/scaffold/Root_hs.cg b/scaffold/Root_hs.cg
--- a/scaffold/Root_hs.cg
+++ b/scaffold/Root_hs.cg
@@ -5,7 +5,7 @@
 
 -- This is a handler function for the GET request method on the RootR
 -- resource pattern. All of your resource patterns are defined in
--- ~sitearg~.hs; look for the line beginning with mkYesodData.
+-- config/routes
 --
 -- The majority of the code you will write in Yesod lives in these handler
 -- functions. You can spread them across multiple files if you are so
diff --git a/scaffold/Settings_hs.cg b/scaffold/Settings_hs.cg
--- a/scaffold/Settings_hs.cg
+++ b/scaffold/Settings_hs.cg
@@ -35,15 +35,16 @@
 -- | The base URL for your application. This will usually be different for
 -- development and production. Yesod automatically constructs URLs for you,
 -- so this value must be accurate to create valid links.
+-- Please note that there is no trailing slash.
 approot :: Text
+approot =
 #ifdef PRODUCTION
 -- You probably want to change this. If your domain name was "yesod.com",
 -- you would probably want it to be:
--- > approot = "http://www.yesod.com"
--- Please note that there is no trailing slash.
-approot = "http://localhost:3000"
+-- > "http://yesod.com"
+  "http://localhost:3000"
 #else
-approot = "http://localhost:3000"
+  "http://localhost:3000"
 #endif
 
 -- | The location of static files on your system. This is a file system
@@ -70,10 +71,11 @@
 -- | The database connection string. The meaning of this string is backend-
 -- specific.
 connStr :: Text
+connStr =
 #ifdef PRODUCTION
-connStr = "~connstr2~"
+  "~connstr2~"
 #else
-connStr = "~connstr1~"
+  "~connstr1~"
 #endif
 
 -- | Your application will keep a connection pool and take connections from
@@ -106,42 +108,43 @@
 -- used; to get the same auto-loading effect, it is recommended that you
 -- use the devel server.
 
-toHamletFile, toCassiusFile, toJuliusFile, toLuciusFile :: String -> FilePath
-toHamletFile x = "hamlet/" ++ x ++ ".hamlet"
-toCassiusFile x = "cassius/" ++ x ++ ".cassius"
-toJuliusFile x = "julius/" ++ x ++ ".julius"
-toLuciusFile x = "lucius/" ++ x ++ ".lucius"
+-- | expects a root folder for each type, e.g: hamlet/ lucius/ julius/
+globFile :: String -> String -> FilePath
+globFile kind x = kind ++ "/" ++ x ++ "." ++ kind
 
 hamletFile :: FilePath -> Q Exp
-hamletFile = H.hamletFile . toHamletFile
+hamletFile = H.hamletFile . globFile "hamlet"
 
 cassiusFile :: FilePath -> Q Exp
+cassiusFile = 
 #ifdef PRODUCTION
-cassiusFile = H.cassiusFile . toCassiusFile
+  H.cassiusFile . globFile "cassius"
 #else
-cassiusFile = H.cassiusFileDebug . toCassiusFile
+  H.cassiusFileDebug . globFile "cassius"
 #endif
 
 luciusFile :: FilePath -> Q Exp
+luciusFile = 
 #ifdef PRODUCTION
-luciusFile = H.luciusFile . toLuciusFile
+  H.luciusFile . globFile "lucius"
 #else
-luciusFile = H.luciusFileDebug . toLuciusFile
+  H.luciusFileDebug . globFile "lucius"
 #endif
 
 juliusFile :: FilePath -> Q Exp
+juliusFile =
 #ifdef PRODUCTION
-juliusFile = H.juliusFile . toJuliusFile
+  H.juliusFile . globFile "julius"
 #else
-juliusFile = H.juliusFileDebug . toJuliusFile
+  H.juliusFileDebug . globFile "julius"
 #endif
 
 widgetFile :: FilePath -> Q Exp
 widgetFile x = do
-    let h = unlessExists toHamletFile hamletFile
-    let c = unlessExists toCassiusFile cassiusFile
-    let j = unlessExists toJuliusFile juliusFile
-    let l = unlessExists toLuciusFile luciusFile
+    let h = unlessExists (globFile "hamlet")  hamletFile
+    let c = unlessExists (globFile "cassius") cassiusFile
+    let j = unlessExists (globFile "julius")  juliusFile
+    let l = unlessExists (globFile "lucius")  luciusFile
     [|addWidget $h >> addCassius $c >> addJulius $j >> addLucius $l|]
   where
     unlessExists tofn f = do
@@ -157,4 +160,3 @@
 
 runConnectionPool :: MonadControlIO m => SqlPersist m a -> ConnectionPool -> m a
 runConnectionPool = runSqlPool
-
diff --git a/scaffold/boilerplate-layout_hamlet.cg b/scaffold/boilerplate-layout_hamlet.cg
new file mode 100644
--- /dev/null
+++ b/scaffold/boilerplate-layout_hamlet.cg
@@ -0,0 +1,30 @@
+\<!doctype html>M
+\<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->^M
+\<!--[if IE 7 ]>    <html lang="en" class="no-js ie7"> <![endif]-->^M
+\<!--[if IE 8 ]>    <html lang="en" class="no-js ie8"> <![endif]-->^M
+\<!--[if IE 9 ]>    <html lang="en" class="no-js ie9"> <![endif]-->^M
+\<!--[if (gt IE 9)|!(IE)]><!-->
+<html lang="en" class="no-js"><!--<![endif]-->^M
+    <head>
+        <meta charset="UTF-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        
+        <meta name="description" content="">
+        <meta name="author" content="">
+
+        <title>#{pageTitle pc}
+
+        <link rel="stylesheet" href=@{StaticR css_html5boilerplate_css}>
+        ^{pageHead pc}
+      
+        <!--[if lt IE 9]>
+        <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->^M
+
+        <script>
+          document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/,'js');
+    <body>
+        $maybe msg <- mmsg
+            <div #message>#{msg}
+        ^{pageBody pc}
diff --git a/scaffold/boilerplate_css.cg b/scaffold/boilerplate_css.cg
new file mode 100644
--- /dev/null
+++ b/scaffold/boilerplate_css.cg
@@ -0,0 +1,116 @@
+/*  HTML5 ✰ Boilerplate  */
+
+html, body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
+small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+  display: block;
+}
+
+blockquote, q { quotes: none; }
+blockquote:before, blockquote:after,
+q:before, q:after { content: ''; content: none; }
+ins { background-color: #ff9; color: #000; text-decoration: none; }
+mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; }
+del { text-decoration: line-through; }
+abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; }
+table { border-collapse: collapse; border-spacing: 0; }
+hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
+input, select { vertical-align: middle; }
+
+body { font:13px/1.231 sans-serif; *font-size:small; } 
+select, input, textarea, button { font:99% sans-serif; }
+pre, code, kbd, samp { font-family: monospace, sans-serif; }
+
+html { overflow-y: scroll; }
+a:hover, a:active { outline: none; }
+ul, ol { margin-left: 2em; }
+ol { list-style-type: decimal; }
+nav ul, nav li { margin: 0; list-style:none; list-style-image: none; }
+small { font-size: 85%; }
+strong, th { font-weight: bold; }
+td { vertical-align: top; }
+
+sub, sup { font-size: 75%; line-height: 0; position: relative; }
+sup { top: -0.5em; }
+sub { bottom: -0.25em; }
+
+pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 15px; }
+textarea { overflow: auto; }
+.ie6 legend, .ie7 legend { margin-left: -7px; } 
+input[type="radio"] { vertical-align: text-bottom; }
+input[type="checkbox"] { vertical-align: bottom; }
+.ie7 input[type="checkbox"] { vertical-align: baseline; }
+.ie6 input { vertical-align: text-bottom; }
+label, input[type="button"], input[type="submit"], input[type="image"], button { cursor: pointer; }
+button, input, select, textarea { margin: 0; }
+input:valid, textarea:valid   {  }
+input:invalid, textarea:invalid { border-radius: 1px; -moz-box-shadow: 0px 0px 5px red; -webkit-box-shadow: 0px 0px 5px red; box-shadow: 0px 0px 5px red; }
+.no-boxshadow input:invalid, .no-boxshadow textarea:invalid { background-color: #f0dddd; }
+
+::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; }
+::selection { background:#FF5E99; color:#fff; text-shadow: none; }
+a:link { -webkit-tap-highlight-color: #FF5E99; }
+
+button {  width: auto; overflow: visible; }
+.ie7 img { -ms-interpolation-mode: bicubic; }
+
+body, select, input, textarea {  color: #444; }
+h1, h2, h3, h4, h5, h6 { font-weight: bold; }
+a, a:active, a:visited { color: #607890; }
+a:hover { color: #036; }
+
+.ir { display: block; text-indent: -999em; overflow: hidden; background-repeat: no-repeat; text-align: left; direction: ltr; }
+.hidden { display: none; visibility: hidden; }
+.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
+.visuallyhidden.focusable:active,
+.visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
+.invisible { visibility: hidden; }
+.clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
+.clearfix:after { clear: both; }
+.clearfix { zoom: 1; }
+
+
+@media all and (orientation:portrait) {
+
+}
+
+@media all and (orientation:landscape) {
+
+}
+
+@media screen and (max-device-width: 480px) {
+
+  /* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */
+}
+
+
+@media print {
+  * { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important;
+  -ms-filter: none !important; } 
+  a, a:visited { color: #444 !important; text-decoration: underline; }
+  a[href]:after { content: " (" attr(href) ")"; }
+  abbr[title]:after { content: " (" attr(title) ")"; }
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }  
+  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
+  thead { display: table-header-group; }
+  tr, img { page-break-inside: avoid; }
+  @page { margin: 0.5cm; }
+  p, h2, h3 { orphans: 3; widows: 3; }
+  h2, h3{ page-break-after: avoid; }
+}
diff --git a/scaffold/cabal.cg b/scaffold/cabal.cg
--- a/scaffold/cabal.cg
+++ b/scaffold/cabal.cg
@@ -48,8 +48,8 @@
 
     build-depends: base         >= 4       && < 5
                  , yesod        >= 0.8     && < 0.9
-                 , yesod-auth
-                 , yesod-static
+                 , yesod-auth   >= 0.4     && < 0.5
+                 , yesod-static >= 0.1     && < 0.2
                  , mime-mail
                  , wai-extra
                  , directory
@@ -60,7 +60,6 @@
                  , persistent-~lower~ >= 0.5 && < 0.6
                  , template-haskell
                  , hamlet
-                 , web-routes
                  , hjsmin
                  , transformers
                  , warp
diff --git a/scaffold/favicon_ico.cg b/scaffold/favicon_ico.cg
Binary files a/scaffold/favicon_ico.cg and b/scaffold/favicon_ico.cg differ
diff --git a/scaffold/mini-cabal.cg b/scaffold/mini-cabal.cg
--- a/scaffold/mini-cabal.cg
+++ b/scaffold/mini-cabal.cg
@@ -54,7 +54,6 @@
                  , text
                  , template-haskell
                  , hamlet
-                 , web-routes
                  , transformers
                  , wai
                  , warp
diff --git a/scaffold/mini-sitearg_hs.cg b/scaffold/mini-sitearg_hs.cg
--- a/scaffold/mini-sitearg_hs.cg
+++ b/scaffold/mini-sitearg_hs.cg
@@ -18,7 +18,7 @@
 import qualified Settings
 import System.Directory
 import qualified Data.ByteString.Lazy as L
-import Settings (hamletFile, cassiusFile, juliusFile, widgetFile)
+import Settings (hamletFile, cassiusFile, luciusFile, juliusFile, widgetFile)
 import StaticFiles
 import Control.Monad (unless)
 import Control.Monad.Trans.Class (lift)
diff --git a/scaffold/sitearg_hs.cg b/scaffold/sitearg_hs.cg
--- a/scaffold/sitearg_hs.cg
+++ b/scaffold/sitearg_hs.cg
@@ -24,7 +24,7 @@
 import System.Directory
 import qualified Data.ByteString.Lazy as L
 import Database.Persist.GenericSql
-import Settings (hamletFile, cassiusFile, juliusFile, widgetFile)
+import Settings (hamletFile, cassiusFile, luciusFile, juliusFile, widgetFile)
 import Model
 import StaticFiles
 import Data.Maybe (isJust)
diff --git a/yesod.cabal b/yesod.cabal
--- a/yesod.cabal
+++ b/yesod.cabal
@@ -1,5 +1,5 @@
 name:            yesod
-version:         0.8.1
+version:         0.8.2
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -13,7 +13,7 @@
 stability:       Stable
 cabal-version:   >= 1.6
 build-type:      Simple
-homepage:        http://docs.yesodweb.com/
+homepage:        http://www.yesodweb.com/
 extra-source-files: scaffold/*.cg
 
 flag ghc7
@@ -25,7 +25,7 @@
     else
         build-depends:   base                  >= 4        && < 4.3
     build-depends:   yesod-core                >= 0.8.1    && < 0.9
-                   , yesod-auth                >= 0.4      && < 0.5
+                   , yesod-auth                >= 0.4      && < 0.6
                    , yesod-json                >= 0.1      && < 0.2
                    , yesod-persistent          >= 0.1      && < 0.2
                    , yesod-static              >= 0.1      && < 0.2
