diff --git a/Yesod/Auth.hs b/Yesod/Auth.hs
--- a/Yesod/Auth.hs
+++ b/Yesod/Auth.hs
@@ -1,9 +1,9 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
@@ -27,8 +27,6 @@
     , AuthException (..)
     ) where
 
-#include "qq.h"
-
 import Control.Monad                 (when)  
 import Control.Monad.Trans.Maybe
 
@@ -132,7 +130,7 @@
     [ ClassP ''YesodAuth [VarT $ mkName "master"]
     ]
 #define STRINGS *Texts
-    [QQ(parseRoutes)|
+    [parseRoutes|
 /check                 CheckR      GET
 /login                 LoginR      GET
 /logout                LogoutR     GET POST
@@ -151,7 +149,7 @@
         Nothing ->
           when doRedirects $ do
             case authRoute y of
-              Nothing -> do rh <- defaultLayout $ addHtml [QQ(shamlet)| <h1>Invalid login |]
+              Nothing -> do rh <- defaultLayout $ toWidget [shamlet| <h1>Invalid login |]
                             sendResponse rh
               Just ar -> do setMessageI Msg.InvalidLogin
                             redirect ar
@@ -166,10 +164,10 @@
     creds <- maybeAuthId
     defaultLayoutJson (do
         setTitle "Authentication Status"
-        addHtml $ html' creds) (jsonCreds creds)
+        toWidget $ html' creds) (jsonCreds creds)
   where
     html' creds =
-        [QQ(shamlet)|
+        [shamlet|
 <h1>Authentication Status
 $maybe _ <- creds
     <p>Logged in.
diff --git a/Yesod/Auth/BrowserId.hs b/Yesod/Auth/BrowserId.hs
--- a/Yesod/Auth/BrowserId.hs
+++ b/Yesod/Auth/BrowserId.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 module Yesod.Auth.BrowserId
     ( authBrowserId
@@ -16,8 +15,6 @@
 import Control.Monad.IO.Class (liftIO)
 import Control.Exception (throwIO)
 
-#include "qq.h"
-
 pid :: Text
 pid = "browserid"
 
@@ -64,7 +61,7 @@
             _ -> notFound
     , apLogin = \toMaster -> do
         addScriptRemote browserIdJs
-        addHamlet [QQ(hamlet)|
+        toWidget [hamlet|
 <p>
     <a href="javascript:navigator.id.getVerifiedEmail(function(a){if(a)document.location='@{toMaster complete}/'+a});">
         <img src="https://browserid.org/i/sign_in_green.png">
diff --git a/Yesod/Auth/Dummy.hs b/Yesod/Auth/Dummy.hs
--- a/Yesod/Auth/Dummy.hs
+++ b/Yesod/Auth/Dummy.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 -- | Provides a dummy authentication module that simply lets a user specify
 -- his/her identifier. This is not intended for real world use, just for
@@ -8,13 +7,11 @@
     ( authDummy
     ) where
 
-#include "qq.h"
-
 import Yesod.Auth
 import Yesod.Form (runInputPost, textField, ireq)
 import Yesod.Handler (notFound)
 import Text.Hamlet (hamlet)
-import Yesod.Widget (addHamlet)
+import Yesod.Widget (toWidget)
 
 authDummy :: YesodAuth m => AuthPlugin m
 authDummy =
@@ -26,9 +23,9 @@
     dispatch _ _ = notFound
     url = PluginR "dummy" []
     login authToMaster =
-        addHamlet [QQ(hamlet)|
+        toWidget [hamlet|
 <form method="post" action="@{authToMaster url}">
-    \Your new identifier is: 
+    Your new identifier is: #
     <input type="text" name="ident">
     <input type="submit" value="Dummy Login">
 |]
diff --git a/Yesod/Auth/Email.hs b/Yesod/Auth/Email.hs
--- a/Yesod/Auth/Email.hs
+++ b/Yesod/Auth/Email.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE QuasiQuotes, TypeFamilies #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleContexts #-}
 module Yesod.Auth.Email
@@ -15,8 +14,6 @@
     , isValidPass
     ) where
 
-#include "qq.h"
-
 import Network.Mail.Mime (randomString)
 import Yesod.Auth
 import System.Random
@@ -33,8 +30,7 @@
 import Yesod.Form
 import Yesod.Handler
 import Yesod.Content
-import Yesod.Widget
-import Yesod.Core
+import Yesod.Core (PathPiece, fromPathPiece, whamlet, defaultLayout, setTitleI, toPathPiece)
 import Control.Monad.IO.Class (liftIO)
 import qualified Yesod.Auth.Message as Msg
 
@@ -82,7 +78,7 @@
 authEmail :: YesodAuthEmail m => AuthPlugin m
 authEmail =
     AuthPlugin "email" dispatch $ \tm ->
-        [QQ(whamlet)|
+        [whamlet|
 <form method="post" action="@{tm loginR}">
     <table>
         <tr>
@@ -115,8 +111,7 @@
     toMaster <- getRouteToMaster
     defaultLayout $ do
         setTitleI Msg.RegisterLong
-        addWidget
-            [QQ(whamlet)|
+        [whamlet|
 <p>_{Msg.EnterEmail}
 <form method="post" action="@{toMaster registerR}">
     <label for="email">_{Msg.Email}
@@ -146,8 +141,7 @@
     sendVerifyEmail email verKey verUrl
     defaultLayout $ do
         setTitleI Msg.ConfirmationEmailSentTitle
-        addWidget
-            [QQ(whamlet)| <p>_{Msg.ConfirmationEmailSent email} |]
+        [whamlet| <p>_{Msg.ConfirmationEmailSent email} |]
 
 getVerifyR :: YesodAuthEmail m
            => AuthEmailId m -> Text -> GHandler Auth m RepHtml
@@ -167,8 +161,7 @@
         _ -> return ()
     defaultLayout $ do
         setTitleI Msg.InvalidKey
-        addWidget
-            [QQ(whamlet)| <p>_{Msg.InvalidKey} |]
+        [whamlet| <p>_{Msg.InvalidKey} |]
 
 postLoginR :: YesodAuthEmail master => GHandler Auth master ()
 postLoginR = do
@@ -206,8 +199,7 @@
             redirect $ toMaster LoginR
     defaultLayout $ do
         setTitleI Msg.SetPassTitle
-        addWidget
-            [QQ(whamlet)|
+        [whamlet|
 <h3>_{Msg.SetPass}
 <form method="post" action="@{toMaster setpassR}">
     <table>
diff --git a/Yesod/Auth/GoogleEmail.hs b/Yesod/Auth/GoogleEmail.hs
--- a/Yesod/Auth/GoogleEmail.hs
+++ b/Yesod/Auth/GoogleEmail.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 -- | Use an email address as an identifier via Google's OpenID login system.
 --
@@ -18,9 +17,8 @@
 import Yesod.Auth
 import qualified Web.Authenticate.OpenId as OpenId
 
-import Yesod.Form
 import Yesod.Handler
-import Yesod.Widget
+import Yesod.Widget (whamlet)
 import Yesod.Request
 import Text.Blaze (toHtml)
 import Data.Text (Text)
@@ -39,7 +37,6 @@
     AuthPlugin "googleemail" dispatch login
   where
     complete = PluginR "googleemail" ["complete"]
-    name = "openid_identifier"
     login tm =
         [whamlet|<a href=@{tm forwardUrl}>_{Msg.LoginGoogle}|]
     dispatch "GET" ["forward"] = do
diff --git a/Yesod/Auth/HashDB.hs b/Yesod/Auth/HashDB.hs
--- a/Yesod/Auth/HashDB.hs
+++ b/Yesod/Auth/HashDB.hs
@@ -2,7 +2,6 @@
 {-# LANGUAGE FlexibleContexts           #-}
 {-# LANGUAGE TypeFamilies               #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE TemplateHaskell            #-}
 {-# LANGUAGE OverloadedStrings          #-}
 {-# LANGUAGE GADTs                      #-}
@@ -72,13 +71,11 @@
     , migrateUsers
     ) where
 
-#include "qq.h"
-
 import Yesod.Persist
 import Yesod.Handler
 import Yesod.Form
 import Yesod.Auth
-import Yesod.Widget (addHamlet)
+import Yesod.Widget (toWidget)
 import Text.Hamlet (hamlet, shamlet)
 
 import Control.Applicative         ((<$>), (<*>))
@@ -179,7 +176,7 @@
                  (validateUser <$> (uniq =<< mu) <*> mp)
     if isValid 
        then setCreds True $ Creds "hashdb" (fromMaybe "" mu) []
-       else do setMessage [QQ(shamlet)| Invalid username/password |]
+       else do setMessage [shamlet| Invalid username/password |]
                toMaster <- getRouteToMaster
                redirect $ toMaster LoginR
 
@@ -210,7 +207,7 @@
                 -- user exists
                 Just (Entity uid _) -> return $ Just uid
                 Nothing       -> do
-                    setMessage [QQ(shamlet)| User not found |]
+                    setMessage [shamlet| User not found |]
                     redirect $ authR LoginR
 
 -- | Prompt for username and password, validate that against a database
@@ -223,8 +220,7 @@
               , PersistStore b (GHandler Auth m)
               , PersistUnique b (GHandler Auth m))
            => (Text -> Maybe (Unique user b)) -> AuthPlugin m
-authHashDB uniq = AuthPlugin "hashdb" dispatch $ \tm -> addHamlet
-    [QQ(hamlet)|
+authHashDB uniq = AuthPlugin "hashdb" dispatch $ \tm -> toWidget [hamlet|
     <div id="header">
         <h1>Login
 
@@ -261,7 +257,7 @@
 
 -- | Generate data base instances for a valid user
 share [mkPersist sqlSettings, mkMigrate "migrateUsers"]
-         [QQ(persistUpperCase)|
+         [persistUpperCase|
 User
     username Text Eq
     password Text
diff --git a/Yesod/Auth/Message.hs b/Yesod/Auth/Message.hs
--- a/Yesod/Auth/Message.hs
+++ b/Yesod/Auth/Message.hs
@@ -6,6 +6,8 @@
       -- * All languages
     , englishMessage
     , portugueseMessage
+    , swedishMessage
+    , germanMessage
     ) where
 
 import Data.Monoid (mappend)
@@ -113,3 +115,71 @@
 portugueseMessage LoginTitle = "Entrar no site"
 portugueseMessage PleaseProvideUsername = "Por favor digite seu nome de usuário"
 portugueseMessage PleaseProvidePassword = "Por favor digite sua senha"
+
+swedishMessage :: AuthMessage -> Text
+swedishMessage NoOpenID = "Fann ej OpenID identifierare"
+swedishMessage LoginOpenID = "Logga in via OpenID"
+swedishMessage LoginGoogle = "Logga in via Google"
+swedishMessage LoginYahoo = "Logga in via Yahoo"
+swedishMessage Email = "Epost"
+swedishMessage Password = "Lösenord"
+swedishMessage Register = "Registrera"
+swedishMessage RegisterLong = "Registrera ett nytt konto"
+swedishMessage EnterEmail = "Skriv in din epost nedan så kommer ett konfirmationsmail skickas till adressen."
+swedishMessage ConfirmationEmailSentTitle = "Konfirmationsmail skickat"
+swedishMessage (ConfirmationEmailSent email) =
+    "Ett konfirmationsmeddelande har skickats till" `mappend`
+    email `mappend`
+    "."
+swedishMessage AddressVerified = "Adress verifierad, vänligen välj nytt lösenord"
+swedishMessage InvalidKeyTitle = "Ogiltig verifikationsnyckel"
+swedishMessage InvalidKey = "Tyvärr, du angav en ogiltig verifimationsnyckel."
+swedishMessage InvalidEmailPass = "Ogiltig epost/lösenord kombination"
+swedishMessage BadSetPass = "Du måste vara inloggad för att ange ett lösenord"
+swedishMessage SetPassTitle = "Ange lösenord"
+swedishMessage SetPass = "Ange nytt lösenord"
+swedishMessage NewPass = "Nytt lösenord"
+swedishMessage ConfirmPass = "Godkänn"
+swedishMessage PassMismatch = "Lösenorden matcha ej, vänligen försök igen"
+swedishMessage PassUpdated = "Lösenord updaterades"
+swedishMessage Facebook = "Logga in med Facebook"
+swedishMessage LoginViaEmail = "Logga in via epost"
+swedishMessage InvalidLogin = "Ogiltigt login"
+swedishMessage NowLoggedIn = "Du är nu inloggad"
+swedishMessage LoginTitle = "Logga in"
+swedishMessage PleaseProvideUsername = "Vänligen fyll i användarnamn"
+swedishMessage PleaseProvidePassword = "Vänligen fyll i lösenord"
+
+germanMessage :: AuthMessage -> Text
+germanMessage NoOpenID = "Kein OpenID-Identifier gefunden"
+germanMessage LoginOpenID = "Login via OpenID"
+germanMessage LoginGoogle = "Login via Google"
+germanMessage LoginYahoo = "Login via Yahoo"
+germanMessage Email = "Email"
+germanMessage Password = "Passwort"
+germanMessage Register = "Registrieren"
+germanMessage RegisterLong = "Neuen Account registrieren"
+germanMessage EnterEmail = "Bitte die e-Mail Adresse angeben, eine Bestätigungsmail wird verschickt."
+germanMessage ConfirmationEmailSentTitle = "Bestätigung verschickt."
+germanMessage (ConfirmationEmailSent email) =
+    "Eine Bestätigung wurde an " `mappend`
+    email `mappend`
+    "versandt."
+germanMessage AddressVerified = "Adresse bestätigt, bitte neues Passwort angeben"
+germanMessage InvalidKeyTitle = "Ungültiger Bestätigungsschlüssel"
+germanMessage InvalidKey = "Das war leider ein ungültiger Bestätigungsschlüssel"
+germanMessage InvalidEmailPass = "Ungültiger Nutzername oder Passwort"
+germanMessage BadSetPass = "Um das Passwort zu ändern muss man eingeloggt sein"
+germanMessage SetPassTitle = "Passwort angeben"
+germanMessage SetPass = "Neues Passwort angeben"
+germanMessage NewPass = "Neues Passwort"
+germanMessage ConfirmPass = "Bestätigen"
+germanMessage PassMismatch = "Die Passwörter stimmten nicht überein"
+germanMessage PassUpdated = "Passwort überschrieben"
+germanMessage Facebook = "Login über Facebook"
+germanMessage LoginViaEmail = "Login via e-Mail"
+germanMessage InvalidLogin = "Ungültiger Login"
+germanMessage NowLoggedIn = "Login erfolgreich"
+germanMessage LoginTitle = "Login"
+germanMessage PleaseProvideUsername = "Bitte Nutzername angeben"
+germanMessage PleaseProvidePassword = "Bitte Passwort angeben"
diff --git a/Yesod/Auth/OpenId.hs b/Yesod/Auth/OpenId.hs
--- a/Yesod/Auth/OpenId.hs
+++ b/Yesod/Auth/OpenId.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 module Yesod.Auth.OpenId
     ( authOpenId
@@ -7,14 +6,12 @@
     , forwardUrl
     ) where
 
-#include "qq.h"
-
 import Yesod.Auth
 import qualified Web.Authenticate.OpenId as OpenId
 
 import Yesod.Form
 import Yesod.Handler
-import Yesod.Widget
+import Yesod.Widget (toWidget, whamlet)
 import Yesod.Request
 import Text.Cassius (cassius)
 import Text.Blaze (toHtml)
@@ -36,12 +33,11 @@
     name = "openid_identifier"
     login tm = do
         ident <- lift newIdent
-        addCassius
-            [QQ(cassius)|##{ident}
+        toWidget [cassius|##{ident}
     background: #fff url(http://www.myopenid.com/static/openid-icon-small.gif) no-repeat scroll 0pt 50%;
     padding-left: 18px;
 |]
-        [QQ(whamlet)|
+        [whamlet|
 <form method="get" action="@{tm forwardUrl}">
     <input type="hidden" name="openid_identifier" value="https://www.google.com/accounts/o8/id">
     <button .openid-google>_{Msg.LoginGoogle}
diff --git a/Yesod/Auth/Rpxnow.hs b/Yesod/Auth/Rpxnow.hs
--- a/Yesod/Auth/Rpxnow.hs
+++ b/Yesod/Auth/Rpxnow.hs
@@ -1,12 +1,9 @@
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 module Yesod.Auth.Rpxnow
     ( authRpxnow
     ) where
 
-#include "qq.h"
-
 import Yesod.Auth
 import qualified Web.Authenticate.Rpxnow as Rpxnow
 import Control.Monad (mplus)
@@ -27,8 +24,7 @@
   where
     login tm = do
         let url = {- FIXME urlEncode $ -} tm $ PluginR "rpxnow" []
-        addHamlet
-            [QQ(hamlet)|
+        toWidget [hamlet|
 <iframe src="http://#{app}.rpxnow.com/openid/embed?token_url=@{url}" scrolling="no" frameBorder="no" allowtransparency="true" style="width:400px;height:240px">
 |]
     dispatch _ [] = do
diff --git a/include/qq.h b/include/qq.h
deleted file mode 100644
--- a/include/qq.h
+++ /dev/null
@@ -1,10 +0,0 @@
-
--- CPP macro which choses which quasyquotes syntax to use depending
--- on GHC version.
---
--- QQ stands for quasyquote.
-#if GHC7
-# define QQ(x) x
-#else
-# define QQ(x) $x
-#endif
diff --git a/yesod-auth.cabal b/yesod-auth.cabal
--- a/yesod-auth.cabal
+++ b/yesod-auth.cabal
@@ -1,6 +1,6 @@
 name:            yesod-auth
-version:         0.8.1.1
-license:         BSD3
+version:         1.0.0
+license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman, Patrick Brisbin
 maintainer:      Michael Snoyman <michael@snoyman.com>
@@ -10,39 +10,34 @@
 cabal-version:   >= 1.6.0
 build-type:      Simple
 homepage:        http://www.yesodweb.com/
-extra-source-files: include/qq.h
 description:     Authentication for Yesod.
 
 flag ghc7
 
 library
-    if flag(ghc7)
-        build-depends:   base                >= 4.3      && < 5
-        cpp-options:     -DGHC7
-    else
-        build-depends:   base                >= 4        && < 4.3
-    build-depends:   authenticate            >= 1.0       && < 1.1
+    build-depends:   base                    >= 4         && < 5
+                   , authenticate            >= 1.2       && < 1.3
                    , bytestring              >= 0.9.1.4   && < 0.10
-                   , yesod-core              >= 0.10.1    && < 0.11
-                   , wai                     >= 1.1       && < 1.2
+                   , yesod-core              >= 1.0       && < 1.1
+                   , wai                     >= 1.2       && < 1.3
                    , template-haskell
                    , pureMD5                 >= 2.0       && < 2.2
                    , random                  >= 1.0.0.2  && < 1.1
                    , text                    >= 0.7       && < 0.12
                    , mime-mail               >= 0.3       && < 0.5
                    , blaze-html              >= 0.4.1.3   && < 0.5
-                   , yesod-persistent        >= 0.3.1     && < 0.4
-                   , hamlet                  >= 0.10      && < 0.11
-                   , shakespeare-css         >= 0.10      && < 0.11
-                   , yesod-json              >= 0.3.1     && < 0.4
+                   , yesod-persistent        >= 1.0       && < 1.1
+                   , hamlet                  >= 1.0       && < 1.1
+                   , shakespeare-css         >= 1.0       && < 1.1
+                   , yesod-json              >= 1.0       && < 1.1
                    , containers
                    , unordered-containers
-                   , yesod-form              >= 0.4.1     && < 0.5
-                   , transformers            >= 0.2.2     && < 0.3
-                   , persistent              >= 0.8       && < 0.9
-                   , persistent-template     >= 0.8       && < 0.9
+                   , yesod-form              >= 1.0       && < 1.1
+                   , transformers            >= 0.2.2     && < 0.4
+                   , persistent              >= 0.9       && < 0.10
+                   , persistent-template     >= 0.9       && < 0.10
                    , SHA                     >= 1.4.1.3   && < 1.6
-                   , http-conduit            >= 1.2.5     && < 1.3
+                   , http-conduit            >= 1.4       && < 1.5
                    , aeson                   >= 0.5
                    , pwstore-fast            >= 2.2       && < 3
                    , lifted-base             >= 0.1       && < 0.2
@@ -57,7 +52,6 @@
                      Yesod.Auth.Message
                      Yesod.Auth.GoogleEmail
     ghc-options:     -Wall
-    include-dirs: include
 
 source-repository head
   type:     git
