diff --git a/Clckwrks/Monad.hs b/Clckwrks/Monad.hs
--- a/Clckwrks/Monad.hs
+++ b/Clckwrks/Monad.hs
@@ -57,7 +57,7 @@
 import Control.Concurrent.STM        (TVar, readTVar, writeTVar, atomically)
 import Data.Acid                     (AcidState, EventState, EventResult, QueryEvent, UpdateEvent)
 import Data.Acid.Advanced            (query', update')
-import Data.Attoparsec.Text.Lazy     (Parser, parseOnly, char, stringCI, try, takeWhile, takeWhile1)
+import Data.Attoparsec.Text.Lazy     (Parser, parseOnly, char, asciiCI, try, takeWhile, takeWhile1)
 import qualified Data.HashMap.Lazy   as HashMap
 import qualified Data.List           as List
 import qualified Data.Map            as Map
@@ -202,14 +202,14 @@
 type ClckForm url    = Form (ClckT url (ServerPartT IO)) [Input] ClckFormError [XMLGenT (ClckT url (ServerPartT IO)) XML] ()
 
 -- | update the 'currentPage' field of 'ClckState'
-setCurrentPage :: PageId -> Clck url ()
+setCurrentPage :: (MonadIO m) => PageId -> ClckT url m ()
 setCurrentPage pid =
     modify $ \s -> s { currentPage = pid }
 
 -- getPrefix :: Clck url Prefix
 -- getPrefix = componentPrefix <$> get
 
-setUnique :: Integer -> Clck url ()
+setUnique :: (Functor m, MonadIO m) => Integer -> ClckT url m ()
 setUnique i =
     do u <- uniqueId <$> get
        liftIO $ atomically $ writeTVar u i
@@ -217,7 +217,7 @@
 -- | get a unique 'Integer'.
 --
 -- Only unique for the current request
-getUnique :: Clck url Integer
+getUnique :: (Functor m, MonadIO m) => ClckT url m Integer
 getUnique =
     do u <- uniqueId <$> get
        liftIO $ atomically $ do i <- readTVar u
@@ -243,7 +243,7 @@
 
 type Clck url = ClckT url (ServerPartT IO)
 
-instance IntegerSupply (Clck url) where
+instance (Functor m, MonadIO m) => IntegerSupply (ClckT url m) where
     nextInteger = getUnique
 
 instance ToJExpr Text.Text where
@@ -522,7 +522,7 @@
 cmd :: T.Text -> Parser cmd -> Parser (Segment cmd)
 cmd n p =
     do char '{'
-       ((try $ do stringCI n
+       ((try $ do asciiCI n
                   char '|'
                   r <- p
                   char '}'
diff --git a/Clckwrks/Plugin.hs b/Clckwrks/Plugin.hs
--- a/Clckwrks/Plugin.hs
+++ b/Clckwrks/Plugin.hs
@@ -20,7 +20,8 @@
 import Paths_clckwrks              (getDataDir)
 
 themeTemplate :: ( EmbedAsChild (ClckT ClckURL (ServerPartT IO)) headers
-                 , EmbedAsChild (ClckT ClckURL (ServerPartT IO)) body) =>
+                 , EmbedAsChild (ClckT ClckURL (ServerPartT IO)) body
+                 ) =>
                  ClckPlugins
               -> Text
               -> headers
@@ -31,7 +32,6 @@
        case mTheme of
          Nothing -> escape $ internalServerError $ toResponse $ ("No theme package is loaded." :: Text)
          (Just theme) -> fmap toResponse $ unXMLGenT $ (_themeTemplate theme ttl hdrs bdy)
-
 
 clckHandler :: (ClckURL -> [(Text, Maybe Text)] -> Text)
             -> ClckPlugins
diff --git a/Clckwrks/ProfileData/EditProfileData.hs b/Clckwrks/ProfileData/EditProfileData.hs
--- a/Clckwrks/ProfileData/EditProfileData.hs
+++ b/Clckwrks/ProfileData/EditProfileData.hs
@@ -10,7 +10,7 @@
 import qualified Data.Text      as Text
 import Happstack.Auth           (UserId)
 import Text.Reform              ((++>), transformEitherM)
-import Text.Reform.HSP.Text     (form, inputText, inputSubmit, label, fieldset, ol, li)
+import Text.Reform.HSP.Text     (form, inputText, inputSubmit, label, fieldset, ol, li, errorList)
 import Text.Reform.Happstack    (reform)
 
 -- FIXME: this currently uses the admin template. Which is sort of right, and sort of not.
@@ -38,19 +38,17 @@
 
 profileDataFormlet :: ProfileData -> ClckForm ProfileDataURL ()
 profileDataFormlet pd@ProfileData{..} =
-    ((,) <$> (li $ label "username:" )        ++> (li $ inputText username)
+    errorList ++> ((,) <$> (li $ label "username:" )        ++> (li $ inputText username)
          <*> (li $ label" email (optional):") ++> (li $ inputText (fromMaybe Text.empty email))
          <* inputSubmit (pack "update"))
     `transformEitherM` updateProfileData
     where
       updateProfileData :: (Text, Text) -> Clck ProfileDataURL (Either ClckFormError ())
       updateProfileData (usrnm, eml) =
-              if Text.null usrnm
-                 then do return (Left EmptyUsername)
-                 else do let newPd = pd { username = usrnm
-                                        , email    = if Text.null eml then Nothing else (Just eml)
-                                        }
-                         merr <- update (SetProfileData newPd)
-                         case merr of
-                           Nothing    -> return $ Right ()
-                           (Just err) -> return $ Left (PDE err)
+          do let newPd = pd { username = usrnm
+                            , email    = if Text.null eml then Nothing else (Just eml)
+                            }
+             merr <- update (SetProfileData newPd)
+             case merr of
+               Nothing    -> return $ Right ()
+               (Just err) -> return $ Left (PDE err)
diff --git a/clckwrks.cabal b/clckwrks.cabal
--- a/clckwrks.cabal
+++ b/clckwrks.cabal
@@ -1,5 +1,5 @@
 Name:                clckwrks
-Version:             0.13.2
+Version:             0.14.2
 Synopsis:            A secure, reliable content management system (CMS) and blogging platform
 Description:         clckwrks (pronounced, clockworks) aims to compete
                      directly with popular PHP-based blogging and CMS
@@ -109,7 +109,7 @@
      unordered-containers         >= 0.1 && < 0.3,
      utf8-string                  == 0.3.*,
      vector                       >= 0.9,
-     web-plugins                  == 0.1.*,
+     web-plugins                  >= 0.1 && < 0.3,
      web-routes,
      web-routes-happstack,
      web-routes-hsp,
