diff --git a/Yesod/Widget.hs b/Yesod/Widget.hs
--- a/Yesod/Widget.hs
+++ b/Yesod/Widget.hs
@@ -1,6 +1,8 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 -- | Widgets combine HTML with JS and CSS dependencies with a unique identifier
 -- generator, allowing you to create truly modular HTML components.
 module Yesod.Widget
@@ -8,6 +10,11 @@
       GWidget
     , GGWidget (..)
     , PageContent (..)
+      -- * Special Hamlet quasiquoter/TH for Widgets
+    , YesodMessage (..)
+    , getMessageRender
+    , whamlet
+    , whamletFile
       -- * Creating
       -- ** Head of page
     , setTitle
@@ -42,14 +49,13 @@
 
 import Data.Monoid
 import Control.Monad.Trans.RWS
-import Text.Blaze (preEscapedText, preEscapedLazyText)
 import qualified Text.Blaze.Html5 as H
 import Text.Hamlet
 import Text.Cassius
 import Text.Lucius (Lucius)
 import Text.Julius
 import Yesod.Handler
-    (Route, GHandler, YesodSubRoute(..), toMasterHandlerMaybe, getYesod)
+    (Route, GHandler, GGHandler, YesodSubRoute(..), toMasterHandlerMaybe, getYesod)
 import Control.Applicative (Applicative)
 import Control.Monad.IO.Class (MonadIO)
 import Control.Monad.Trans.Class (MonadTrans (lift))
@@ -57,8 +63,13 @@
 import Control.Monad (liftM)
 import Data.Text (Text)
 import qualified Data.Map as Map
+import Language.Haskell.TH.Quote (QuasiQuoter)
+import Language.Haskell.TH.Syntax (Q, Exp (InfixE, VarE, LamE), Pat (VarP), newName)
+import Yesod.Handler (getUrlRenderParams, getYesodSub)
+import Yesod.Request (languages)
 
 import Control.Monad.IO.Control (MonadControlIO)
+import qualified Text.Hamlet.NonPoly as NP
 
 -- | A generic widget, allowing specification of both the subsite and master
 -- site datatypes. This is basically a large 'WriterT' stack keeping track of
@@ -205,3 +216,41 @@
     , pageHead :: Hamlet url
     , pageBody :: Hamlet url
     }
+
+class YesodMessage sub master where
+    type Message sub master
+    renderMessage :: sub
+                  -> master
+                  -> [Text] -- ^ languages
+                  -> Message sub master
+                  -> Html
+
+getMessageRender :: (Monad mo, YesodMessage s m) => GGHandler s m mo (Message s m -> Html)
+getMessageRender = do
+    s <- getYesodSub
+    m <- getYesod
+    l <- languages
+    return $ renderMessage s m l
+
+whamlet :: QuasiQuoter
+whamlet = NP.hamletWithSettings rules NP.defaultHamletSettings
+
+whamletFile :: FilePath -> Q Exp
+whamletFile = NP.hamletFileWithSettings rules NP.defaultHamletSettings
+
+rules :: Q NP.HamletRules
+rules = do
+    ah <- [|addHtml|]
+    let helper qg f = do
+            x <- newName "urender"
+            e <- f $ VarE x
+            let e' = LamE [VarP x] e
+            g <- qg
+            bind <- [|(>>=)|]
+            return $ InfixE (Just g) bind (Just e')
+    let ur f = do
+            let env = NP.Env
+                    (Just $ helper [|lift getUrlRenderParams|])
+                    (Just $ helper [|lift getMessageRender|])
+            f env
+    return $ NP.HamletRules ah ur
diff --git a/yesod-core.cabal b/yesod-core.cabal
--- a/yesod-core.cabal
+++ b/yesod-core.cabal
@@ -1,5 +1,5 @@
 name:            yesod-core
-version:         0.8.0.1
+version:         0.8.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -34,7 +34,7 @@
                    , text                      >= 0.5      && < 0.12
                    , template-haskell
                    , web-routes-quasi          >= 0.7.0.1  && < 0.8
-                   , hamlet                    >= 0.8      && < 0.9
+                   , hamlet                    >= 0.8.1    && < 0.9
                    , blaze-builder             >= 0.2.1    && < 0.4
                    , transformers              >= 0.2      && < 0.3
                    , clientsession             >= 0.6      && < 0.7
