diff --git a/Text/Reform/HSP/Common.hs b/Text/Reform/HSP/Common.hs
--- a/Text/Reform/HSP/Common.hs
+++ b/Text/Reform/HSP/Common.hs
@@ -1,17 +1,20 @@
-{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, ScopedTypeVariables, TypeFamilies, UndecidableInstances, ViewPatterns #-}
-{-# OPTIONS_GHC -F -pgmFtrhsx #-}
+{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, ScopedTypeVariables, TypeFamilies, UndecidableInstances, ViewPatterns, OverloadedStrings #-}
+{-# OPTIONS_GHC -F -pgmFhsx2hs #-}
 module Text.Reform.HSP.Common where
 
+import Data.Text.Lazy (Text, pack)
+import qualified Data.Text as T
 import Text.Reform.Backend
 import Text.Reform.Core
 import Text.Reform.Generalized as G
 import Text.Reform.Result (FormId, Result(Ok), unitRange)
-import HSP
+import HSP.XMLGenerator
+import HSP.XML
 
-instance (EmbedAsAttr m (Attr String String)) => (EmbedAsAttr m (Attr String FormId)) where
-    asAttr (n := v) = asAttr (n := show v)
+instance (EmbedAsAttr m (Attr Text Text)) => (EmbedAsAttr m (Attr Text FormId)) where
+    asAttr (n := v) = asAttr (n := (pack $ show v))
 
-inputText :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+inputText :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
              (input -> Either error text)
           -> text
           -> Form m input error [XMLGenT x (XMLType x)] () text
@@ -19,7 +22,7 @@
     where
       inputField i a = [<input type="text" id=i name=i value=a />]
 
-inputPassword :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+inputPassword :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
              (input -> Either error text)
           -> text
           -> Form m input error [XMLGenT x (XMLType x)] () text
@@ -27,7 +30,7 @@
     where
       inputField i a = [<input type="password" id=i name=i value=a />]
 
-inputSubmit :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+inputSubmit :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
              (input -> Either error text)
           -> text
           -> Form m input error [XMLGenT x (XMLType x)] () (Maybe text)
@@ -35,14 +38,14 @@
     where
       inputField i a = [<input type="submit" id=i name=i value=a />]
 
-inputReset :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+inputReset :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
               text
            -> Form m input error [XMLGenT x (XMLType x)] () ()
 inputReset lbl = G.inputNoData inputField lbl
     where
       inputField i a = [<input type="reset" id=i name=i value=a />]
 
-inputHidden :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+inputHidden :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
              (input -> Either error text)
           -> text
           -> Form m input error [XMLGenT x (XMLType x)] () text
@@ -50,14 +53,14 @@
     where
       inputField i a = [<input type="hidden" id=i name=i value=a />]
 
-inputButton :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+inputButton :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
              text
           -> Form m input error [XMLGenT x (XMLType x)] () ()
 inputButton label = G.inputNoData inputField label
     where
       inputField i a = [<input type="button" id=i name=i value=a />]
 
-textarea :: (Monad m, FormError error, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsChild x text) =>
+textarea :: (Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsChild x text) =>
             (input -> Either error text)
          -> Int    -- ^ cols
          -> Int    -- ^ rows
@@ -70,14 +73,14 @@
 -- | Create an @\<input type=\"file\"\>@ element
 --
 -- This control may succeed even if the user does not actually select a file to upload. In that case the uploaded name will likely be "" and the file contents will be empty as well.
-inputFile :: (Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputFile :: (Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
              Form m input error [XMLGenT x (XMLType x)] () (FileType input)
 inputFile = G.inputFile fileView
     where
       fileView i = [<input type="file" name=i id=i />]
 
 -- | Create a @\<button type=\"submit\"\>@ element
-buttonSubmit :: ( Monad m, FormError error, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String text)) =>
+buttonSubmit :: ( Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text text)) =>
                 (input -> Either error text)
              -> text
              -> children
@@ -86,7 +89,7 @@
     where
       inputField i a = [<button type="submit" id=i name=i value=a><% c %></button>]
 
-buttonReset :: ( Monad m, FormError error, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)
+buttonReset :: ( Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId)
                 ) =>
                children
              -> Form m input error [XMLGenT x (XMLType x)] () ()
@@ -94,7 +97,7 @@
     where
       inputField i a = [<button type="reset" id=i name=i><% c %></button>]
 
-button :: ( Monad m, FormError error, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)
+button :: ( Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId)
                 ) =>
                children
              -> Form m input error [XMLGenT x (XMLType x)] () ()
@@ -102,7 +105,7 @@
     where
       inputField i a = [<button type="button" id=i name=i><% c %></button>]
 
-label :: (Monad m, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsChild x c) =>
+label :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsChild x c) =>
          c
       -> Form m input error [XMLGenT x (XMLType x)] () ()
 label c = G.label mkLabel
@@ -110,7 +113,7 @@
       mkLabel i = [<label for=i><% c %></label>]
 
 -- FIXME: should this use inputMaybe?
-inputCheckbox :: forall x error input m. (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputCheckbox :: forall x error input m. (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
                    Bool  -- ^ initially checked
                 -> Form m input error [XMLGenT x (XMLType x)] () Bool
 inputCheckbox initiallyChecked =
@@ -121,19 +124,19 @@
            Default   -> mkCheckbox i initiallyChecked
            Missing   -> mkCheckbox i False -- checkboxes only appear in the submitted data when checked
            (Found input) ->
-               case getInputString input of
+               case getInputText input of
                  (Right _) -> mkCheckbox i True
                  (Left  (e :: error) ) -> mkCheckbox i False
     where
       mkCheckbox i checked =
-          return ( View $ const $ [<input type="checkbox" id=i name=i value=i (if checked then [("checked" := "checked")] else []) />]
+          return ( View $ const $ [<input type="checkbox" id=i name=i value=i (if checked then [("checked" := "checked") :: Attr Text Text] else []) />]
                  , return $ Ok (Proved { proofs   = ()
                                        , pos      = unitRange i
                                        , unProved = if checked then True else False
                                        })
                  )
 
-inputCheckboxes :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+inputCheckboxes :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
                   [(a, lbl)]  -- ^ value, label, initially checked
                 -> (a -> Bool) -- ^ function which indicates if a value should be checked initially
                 -> Form m input error [XMLGenT x (XMLType x)] () [a]
@@ -142,11 +145,11 @@
     where
       mkCheckboxes nm choices' = concatMap (mkCheckbox nm) choices'
       mkCheckbox nm (i, val, lbl, checked) =
-             [ <input type="checkbox" id=i name=nm value=(show val) (if checked then [("checked" := "checked")] else []) />
+             [ <input type="checkbox" id=i name=nm value=(pack $ show val) (if checked then [("checked" := "checked") :: Attr Text Text] else []) />
              , <label for=i><% lbl %></label>
              ]
 
-inputRadio :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+inputRadio :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
               [(a, lbl)]  -- ^ value, label, initially checked
            -> (a -> Bool) -- ^ isDefault
            -> Form m input error [XMLGenT x (XMLType x)] () a
@@ -155,12 +158,12 @@
     where
       mkRadios nm choices' = concatMap (mkRadio nm) choices'
       mkRadio nm (i, val, lbl, checked) =
-             [ <input type="radio" id=i name=nm value=(show val) (if checked then [("checked" := "checked")] else []) />
+             [ <input type="radio" id=i name=nm value=(pack $ show val) (if checked then [("checked" := "checked") :: Attr Text Text] else []) />
              , <label for=i><% lbl %></label>
              , <br />
              ]
 
-select :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+select :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
               [(a, lbl)]  -- ^ value, label
            -> (a -> Bool) -- ^ isDefault, must match *exactly one* element in the list of choices
            -> Form m input error [XMLGenT x (XMLType x)] () a
@@ -174,11 +177,11 @@
           ]
 
       mkOption (_, val, lbl, selected) =
-          <option value=val (if selected then ["selected" := "selected"] else [])>
+          <option value=val (if selected then [("selected" := "selected") :: Attr Text Text] else []) >
            <% lbl %>
           </option>
 
-selectMultiple :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+selectMultiple :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
                   [(a, lbl)]  -- ^ value, label, initially checked
                -> (a -> Bool)  -- ^ isSelected initially
                -> Form m input error [XMLGenT x (XMLType x)] () [a]
@@ -191,11 +194,11 @@
            </select>
           ]
       mkOption (_, val, lbl, selected) =
-          <option value=val (if selected then ["selected" := "selected"] else [])>
+          <option value=val (if selected then [("selected" := "selected") :: Attr Text Text] else [])>
            <% lbl %>
           </option>
 {-
-inputMultiSelectOptGroup :: (Functor m, XMLGenerator x, EmbedAsChild x groupLbl, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId), FormError error, ErrorInputType error ~ input, FormInput input, Monad m) =>
+inputMultiSelectOptGroup :: (Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x groupLbl, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId), FormError error, ErrorInputType error ~ input, FormInput input, Monad m) =>
                    [(groupLbl, [(a, lbl, Bool)])]  -- ^ value, label, initially checked
                 -> Form m input error [XMLGenT x (XMLType x)] () [a]
 inputMultiSelectOptGroup choices =
@@ -216,7 +219,7 @@
           </option>
 -}
 
-errorList :: (Monad m, XMLGenerator x, EmbedAsChild x error) =>
+errorList :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x error) =>
              Form m input error [XMLGenT x (XMLType x)] () ()
 errorList = G.errors mkErrors
     where
@@ -224,7 +227,7 @@
       mkErrors errs = [<ul class="reform-error-list"><% mapM mkError errs %></ul>]
       mkError e     = <li><% e %></li>
 
-childErrorList :: (Monad m, XMLGenerator x, EmbedAsChild x error) =>
+childErrorList :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x error) =>
              Form m input error [XMLGenT x (XMLType x)] () ()
 childErrorList = G.childErrors mkErrors
     where
@@ -233,34 +236,34 @@
       mkError e     = <li><% e %></li>
 
 
-br :: (Monad m, XMLGenerator x) => Form m input error [XMLGenT x (XMLType x)] () ()
+br :: (Monad m, XMLGenerator x, StringType x ~ Text) => Form m input error [XMLGenT x (XMLType x)] () ()
 br = view [<br />]
 
-fieldset :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+fieldset :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
             Form m input error c proof a
          -> Form m input error [XMLGenT x (XMLType x)] proof a
 fieldset frm = mapView (\xml -> [<fieldset class="reform"><% xml %></fieldset>]) frm
 
-ol :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+ol :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 ol frm = mapView (\xml -> [<ol class="reform"><% xml %></ol>]) frm
 
-ul :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+ul :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 ul frm = mapView (\xml -> [<ul class="reform"><% xml %></ul>]) frm
 
-li :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+li :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 li frm = mapView (\xml -> [<li class="reform"><% xml %></li>]) frm
 
 -- | create @\<form action=action method=\"POST\" enctype=\"multipart/form-data\"\>@
-form :: (XMLGenerator x, EmbedAsAttr x (Attr String action)) =>
+form :: (XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text action)) =>
         action                  -- ^ action url
-     -> [(String,String)]       -- ^ hidden fields to add to form
-     -> [XMLGenT x (XMLType x)] -- ^ childern
+     -> [(Text,Text)]       -- ^ hidden fields to add to form
+     -> [XMLGenT x (XMLType x)] -- ^ children
      -> [XMLGenT x (XMLType x)]
 form action hidden children
     = [ <form action=action method="POST" enctype="multipart/form-data">
@@ -272,7 +275,7 @@
       mkHidden (name, value) =
           <input type="hidden" name=name value=value />
 
-setAttrs :: (EmbedAsAttr x attr, XMLGenerator x, Monad m, Functor m) =>
+setAttrs :: (EmbedAsAttr x attr, XMLGenerator x, StringType x ~ Text, Monad m, Functor m) =>
             Form m input error [GenXML x] proof a
          -> attr
          -> Form m input error [GenXML x] proof a
diff --git a/Text/Reform/HSP/String.hs b/Text/Reform/HSP/String.hs
--- a/Text/Reform/HSP/String.hs
+++ b/Text/Reform/HSP/String.hs
@@ -41,18 +41,19 @@
     , setAttrs
     ) where
 
-import HSP
+import Data.Text.Lazy (Text, pack)
+import HSP.XMLGenerator
 import Text.Reform
 import qualified Text.Reform.HSP.Common as C
 
 -- | Create an @\<input type=\"text\"\>@ element
-inputText :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputText :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
                String -- ^ initial value
             -> Form m input error [XMLGenT x (XMLType x)] () String
 inputText initialValue = C.inputText getInputString initialValue
 
 -- | Create an @\<input type=\"password\"\>@ element
-inputPassword :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputPassword :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
                  Form m input error [XMLGenT x (XMLType x)] () String
 inputPassword = C.inputPassword getInputString ""
 
@@ -63,7 +64,7 @@
 --   [@Just@ /value/] if this button was used to submit the form.
 --
 --   [@Nothing@]    if this button was not used to submit the form.
-inputSubmit :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputSubmit :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
                String -- ^ @value@ attribute. Used for button label, and value if button is submitted.
             -> Form m input error [XMLGenT x (XMLType x)] () (Maybe String)
 inputSubmit initialValue = C.inputSubmit getInputString initialValue
@@ -71,13 +72,13 @@
 -- | Create an @\<input type=\"reset\"\>@ element
 --
 -- This element does not add any data to the form data set.
-inputReset :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputReset :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
               String -- ^ value attribute. Used only to label the button.
            -> Form m input error [XMLGenT x (XMLType x)] () ()
 inputReset = C.inputReset
 
 -- | Create an @\<input type=\"hidden\"\>@ element
-inputHidden :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputHidden :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
                String -- ^ value to store in the hidden element
             -> Form m input error [XMLGenT x (XMLType x)] () String
 inputHidden initialValue = C.inputHidden getInputString initialValue
@@ -87,13 +88,13 @@
 -- The element is a push button with a text label. The button does nothing by default, but actions can be added using javascript. This element does not add any data to the form data set.
 --
 -- see also: 'C.button'
-inputButton :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputButton :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
                String -- ^ value attribute. Used to label the button.
             -> Form m input error [XMLGenT x (XMLType x)] () ()
 inputButton label = C.inputButton label
 
 -- | Create a \<textarea\>\<\/textarea\> element
-textarea :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+textarea :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
             Int    -- ^ cols
          -> Int    -- ^ rows
          -> String -- ^ initial contents
@@ -101,7 +102,7 @@
 textarea rows cols initialValue = C.textarea getInputString rows cols initialValue
 
 -- | create a  @\<button type=\"submit\"\>\<\/button\>@ element
-buttonSubmit :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)) =>
+buttonSubmit :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text String)) =>
                 String -- ^ value attribute. Returned if this button submits the form.
              -> children -- ^ children to embed in the \<button\>
              -> Form m input error [XMLGenT x (XMLType x)] () (Maybe String)
@@ -116,21 +117,21 @@
 -- returns a 'Bool' indicating if it was checked or not.
 --
 -- see also 'inputCheckboxes'
-inputCheckbox :: forall x error input m. (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputCheckbox :: forall x error input m. (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
                    Bool  -- ^ initially checked
                 -> Form m input error [XMLGenT x (XMLType x)] () Bool
 inputCheckbox = C.inputCheckbox
 
 -- | Create a group of @\<input type=\"checkbox\"\>@ elements
 --
-inputCheckboxes :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+inputCheckboxes :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
                    [(a, lbl)]  -- ^ (value, label)
                 -> (a -> Bool) -- ^ function which marks if a value should be checked (aka, selected) initially or not. Can match zero or more elements.
                 -> Form m input error [XMLGenT x (XMLType x)] () [a]
 inputCheckboxes = C.inputCheckboxes
 
 -- | Create a group of @\<input type=\"radio\"\>@ elements
-inputRadio :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+inputRadio :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
               [(a, lbl)]  -- ^ (value, label)
            -> (a -> Bool) -- ^ predicate which returns @True@ if @a@ should be initially checked. Must match exactly one value in the previous argument.
            -> Form m input error [XMLGenT x (XMLType x)] () a
@@ -139,14 +140,14 @@
 -- | Create an @\<input type=\"file\"\>@ element
 --
 -- This control may succeed even if the user does not actually select a file to upload. In that case the uploaded name will likely be \"\" and the file contents will be empty as well.
-inputFile :: (Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputFile :: (Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
              Form m input error [XMLGenT x (XMLType x)] () (FileType input)
 inputFile = C.inputFile
 
 -- | create a  @\<button type=\"reset\"\>\<\/button\>@ element
 --
 -- This element does not add any data to the form data set.
-buttonReset :: ( Monad m, FormError error, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)
+buttonReset :: ( Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId)
                 ) =>
                children -- ^ children of the @<\/button\>@ element
              -> Form m input error [XMLGenT x (XMLType x)] () ()
@@ -155,7 +156,7 @@
 -- | create a  @\<button type=\"button\"\>\<\/button\>@ element
 --
 -- This element does not add any data to the form data set.
-button :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)) =>
+button :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId)) =>
           children -- ^ children to embed in the \<button\>
        -> Form m input error [XMLGenT x (XMLType x)] () ()
 button = C.button
@@ -163,7 +164,7 @@
 -- | create @\<select\>\<\/select\>@ element plus its @\<option\>\<\/option\>@ children.
 --
 -- see also: 'selectMultiple'
-select :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+select :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
               [(a, lbl)]  -- ^ (value, label)
            -> (a -> Bool) -- ^ specifies which value is initially selected. Must match *exactly one* element in the list of choices
            -> Form m input error [XMLGenT x (XMLType x)] () a
@@ -172,7 +173,7 @@
 -- | create @\<select multiple=\"multiple\"\>\<\/select\>@ element plus its @\<option\>\<\/option\>@ children.
 --
 -- This creates a @\<select\>@ element which allows more than one item to be selected.
-selectMultiple :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+selectMultiple :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
                   [(a, lbl)]  -- ^ (value, label)
                -> (a -> Bool) -- ^ specifies which values are initially selected. Can match 0 or more elements.
                -> Form m input error [XMLGenT x (XMLType x)] () [a]
@@ -183,7 +184,7 @@
 -- Use this with <++ or ++> to ensure that the @for@ attribute references the correct @id@.
 --
 -- > label "some input field: " ++> inputText ""
-label :: (Monad m, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsChild x c) =>
+label :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsChild x c) =>
          c
       -> Form m input error [XMLGenT x (XMLType x)] () ()
 label = C.label
@@ -191,7 +192,7 @@
 -- | create a @\<ul\>@ which contains all the errors related to the 'Form'.
 --
 -- The @<\ul\>@ will have the attribute @class=\"reform-error-list\"@.
-errorList :: (Monad m, XMLGenerator x, EmbedAsChild x error) =>
+errorList :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x error) =>
              Form m input error [XMLGenT x (XMLType x)] () ()
 errorList = C.errorList
 
@@ -200,49 +201,49 @@
 -- Includes errors from children of the current form.
 --
 -- The @<\ul\>@ will have the attribute @class=\"reform-error-list\"@.
-childErrorList :: (Monad m, XMLGenerator x, EmbedAsChild x error) =>
+childErrorList :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x error) =>
              Form m input error [XMLGenT x (XMLType x)] () ()
 childErrorList = C.childErrorList
 
 -- | create a @\<br\>@ tag.
-br :: (Monad m, XMLGenerator x) => Form m input error [XMLGenT x (XMLType x)] () ()
+br :: (Monad m, XMLGenerator x, StringType x ~ Text) => Form m input error [XMLGenT x (XMLType x)] () ()
 br = C.br
 
 -- | wrap a @\<fieldset class=\"reform\"\>@ around a 'Form'
 --
-fieldset :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+fieldset :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
             Form m input error c proof a
          -> Form m input error [XMLGenT x (XMLType x)] proof a
 fieldset = C.fieldset
 
 -- | wrap an @\<ol class=\"reform\"\>@ around a 'Form'
-ol :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+ol :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 ol = C.ol
 
 -- | wrap a @\<ul class=\"reform\"\>@ around a 'Form'
-ul :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+ul :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 ul = C.ul
 
 -- | wrap a @\<li class=\"reform\"\>@ around a 'Form'
-li :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+li :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 li = C.li
 
 -- | create @\<form action=action method=\"POST\" enctype=\"multipart/form-data\"\>@
-form :: (XMLGenerator x, EmbedAsAttr x (Attr String action)) =>
+form :: (XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text action)) =>
         action                  -- ^ action url
-     -> [(String,String)]       -- ^ extra hidden fields to add to form
+     -> [(Text, Text)]       -- ^ extra hidden fields to add to form
      -> [XMLGenT x (XMLType x)] -- ^ children
      -> [XMLGenT x (XMLType x)]
 form = C.form
 
 -- | set the attributes on the top-level elements of 'Form'
-setAttrs :: (EmbedAsAttr x attr, XMLGenerator x, Monad m, Functor m) =>
+setAttrs :: (EmbedAsAttr x attr, XMLGenerator x, StringType x ~ Text, Monad m, Functor m) =>
             Form m input error [XMLGenT x (XMLType x)] proof a
          -> attr
          -> Form m input error [GenXML x] proof a
diff --git a/Text/Reform/HSP/Text.hs b/Text/Reform/HSP/Text.hs
--- a/Text/Reform/HSP/Text.hs
+++ b/Text/Reform/HSP/Text.hs
@@ -41,20 +41,22 @@
     , setAttrs
     ) where
 
-import Data.Text (Text, empty)
-import HSP
+import Data.Text (empty)
+import qualified Data.Text as T
+import Data.Text.Lazy (Text)
+import HSP.XMLGenerator
 import Text.Reform
 import qualified Text.Reform.HSP.Common as C
 
 -- | Create an @\<input type=\"text\"\>@ element
-inputText :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
-               Text -- ^ initial value
-            -> Form m input error [XMLGenT x (XMLType x)] () Text
+inputText :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text T.Text)) =>
+               T.Text -- ^ initial value
+            -> Form m input error [XMLGenT x (XMLType x)] () T.Text
 inputText initialValue = C.inputText getInputText initialValue
 
 -- | Create an @\<input type=\"password\"\>@ element
-inputPassword :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
-                 Form m input error [XMLGenT x (XMLType x)] () Text
+inputPassword :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text T.Text)) =>
+                 Form m input error [XMLGenT x (XMLType x)] () T.Text
 inputPassword = C.inputPassword getInputText empty
 
 -- | Create an @\<input type=\"submit\"\>@ element
@@ -64,23 +66,23 @@
 --   [@Just@ /value/] if this button was used to submit the form.
 --
 --   [@Nothing@]    if this button was not used to submit the form.
-inputSubmit :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
-               Text -- ^ @value@ attribute. Used for button label, and value if button is submitted.
-            -> Form m input error [XMLGenT x (XMLType x)] () (Maybe Text)
+inputSubmit :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text T.Text)) =>
+               T.Text -- ^ @value@ attribute. Used for button label, and value if button is submitted.
+            -> Form m input error [XMLGenT x (XMLType x)] () (Maybe T.Text)
 inputSubmit initialValue = C.inputSubmit getInputText initialValue
 
 -- | Create an @\<input type=\"reset\"\>@ element
 --
 -- This element does not add any data to the form data set.
-inputReset :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
-              Text -- ^ value attribute. Used only to label the button.
+inputReset :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text T.Text)) =>
+              T.Text -- ^ value attribute. Used only to label the button.
            -> Form m input error [XMLGenT x (XMLType x)] () ()
 inputReset = C.inputReset
 
 -- | Create an @\<input type=\"hidden\"\>@ element
-inputHidden :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
-               Text -- ^ value to store in the hidden element
-            -> Form m input error [XMLGenT x (XMLType x)] () Text
+inputHidden :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text T.Text)) =>
+               T.Text -- ^ value to store in the hidden element
+            -> Form m input error [XMLGenT x (XMLType x)] () T.Text
 inputHidden initialValue = C.inputHidden getInputText initialValue
 
 -- | Create an @\<input type=\"button\"\>@ element
@@ -88,24 +90,24 @@
 -- The element is a push button with a text label. The button does nothing by default, but actions can be added using javascript. This element does not add any data to the form data set.
 --
 -- see also: 'C.button'
-inputButton :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
+inputButton :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text Text)) =>
                Text -- ^ value attribute. Used to label the button.
             -> Form m input error [XMLGenT x (XMLType x)] () ()
 inputButton label = C.inputButton label
 
 -- | Create a \<textarea\>\<\/textarea\> element
-textarea :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text), EmbedAsChild x Text) =>
+textarea :: (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x (Attr Text T.Text), EmbedAsChild x T.Text) =>
             Int    -- ^ cols
          -> Int    -- ^ rows
-         -> Text -- ^ initial contents
-         -> Form m input error [XMLGenT x (XMLType x)] () Text
+         -> T.Text -- ^ initial contents
+         -> Form m input error [XMLGenT x (XMLType x)] () T.Text
 textarea rows cols initialValue = C.textarea getInputText rows cols initialValue
 
 -- | create a  @\<button type=\"submit\"\>\<\/button\>@ element
-buttonSubmit :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId), EmbedAsAttr x (Attr String Text)) =>
-                Text -- ^ value attribute. Returned if this button submits the form.
+buttonSubmit :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId), EmbedAsAttr x  (Attr Text T.Text)) =>
+                T.Text -- ^ value attribute. Returned if this button submits the form.
              -> children -- ^ children to embed in the \<button\>
-             -> Form m input error [XMLGenT x (XMLType x)] () (Maybe Text)
+             -> Form m input error [XMLGenT x (XMLType x)] () (Maybe T.Text)
 buttonSubmit = C.buttonSubmit getInputText
 
 --------------------------------------------------------------------------------
@@ -117,21 +119,21 @@
 -- returns a 'Bool' indicating if it was checked or not.
 --
 -- see also 'inputCheckboxes'
-inputCheckbox :: forall x error input m. (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputCheckbox :: forall x error input m. (Monad m, FormInput input, FormError error, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
                    Bool  -- ^ initially checked
                 -> Form m input error [XMLGenT x (XMLType x)] () Bool
 inputCheckbox = C.inputCheckbox
 
 -- | Create a group of @\<input type=\"checkbox\"\>@ elements
 --
-inputCheckboxes :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+inputCheckboxes :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
                    [(a, lbl)]  -- ^ (value, label)
                 -> (a -> Bool) -- ^ function which marks if a value should be checked (aka, selected) initially or not. Can match zero or more elements.
                 -> Form m input error [XMLGenT x (XMLType x)] () [a]
 inputCheckboxes = C.inputCheckboxes
 
 -- | Create a group of @\<input type=\"radio\"\>@ elements
-inputRadio :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+inputRadio :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
               [(a, lbl)]  -- ^ (value, label)
            -> (a -> Bool) -- ^ predicate which returns @True@ if @a@ should be initially checked. Must match exactly one value in the previous argument.
            -> Form m input error [XMLGenT x (XMLType x)] () a
@@ -140,14 +142,14 @@
 -- | Create an @\<input type=\"file\"\>@ element
 --
 -- This control may succeed even if the user does not actually select a file to upload. In that case the uploaded name will likely be \"\" and the file contents will be empty as well.
-inputFile :: (Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsAttr x (Attr String FormId)) =>
+inputFile :: (Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId)) =>
              Form m input error [XMLGenT x (XMLType x)] () (FileType input)
 inputFile = C.inputFile
 
 -- | create a  @\<button type=\"reset\"\>\<\/button\>@ element
 --
 -- This element does not add any data to the form data set.
-buttonReset :: ( Monad m, FormError error, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)
+buttonReset :: ( Monad m, FormError error, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId)
                 ) =>
                children -- ^ children of the @<\/button\>@ element
              -> Form m input error [XMLGenT x (XMLType x)] () ()
@@ -156,7 +158,7 @@
 -- | create a  @\<button type=\"button\"\>\<\/button\>@ element
 --
 -- This element does not add any data to the form data set.
-button :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, EmbedAsChild x children , EmbedAsAttr x (Attr String FormId)) =>
+button :: ( Monad m, FormError error, FormInput input, ErrorInputType error ~ input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x children , EmbedAsAttr x (Attr Text FormId)) =>
           children -- ^ children to embed in the \<button\>
        -> Form m input error [XMLGenT x (XMLType x)] () ()
 button = C.button
@@ -164,7 +166,7 @@
 -- | create @\<select\>\<\/select\>@ element plus its @\<option\>\<\/option\>@ children.
 --
 -- see also: 'selectMultiple'
-select :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+select :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
               [(a, lbl)]  -- ^ (value, label)
            -> (a -> Bool) -- ^ specifies which value is initially selected. Must match *exactly one* element in the list of choices
            -> Form m input error [XMLGenT x (XMLType x)] () a
@@ -173,7 +175,7 @@
 -- | create @\<select multiple=\"multiple\"\>\<\/select\>@ element plus its @\<option\>\<\/option\>@ children.
 --
 -- This creates a @\<select\>@ element which allows more than one item to be selected.
-selectMultiple :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, EmbedAsChild x lbl, EmbedAsAttr x (Attr String FormId)) =>
+selectMultiple :: (Functor m, Monad m, FormError error, ErrorInputType error ~ input, FormInput input, XMLGenerator x, StringType x ~ Text, EmbedAsChild x lbl, EmbedAsAttr x (Attr Text FormId)) =>
                   [(a, lbl)]  -- ^ (value, label)
                -> (a -> Bool) -- ^ specifies which values are initially selected. Can match 0 or more elements.
                -> Form m input error [XMLGenT x (XMLType x)] () [a]
@@ -186,7 +188,7 @@
 -- > label "some input field: " ++> inputText ""
 --
 -- see also: 'labelText'
-label :: (Monad m, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsChild x c) =>
+label :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsChild x c) =>
          c
       -> Form m input error [XMLGenT x (XMLType x)] () ()
 label = C.label
@@ -202,7 +204,7 @@
 -- ambiguous type errors when attempting to apply 'label' to a string
 -- literal. While the type error can be fixed using an explicit type
 -- signature, calling 'labelText' looks nicer.
-labelText :: (Monad m, XMLGenerator x, EmbedAsAttr x (Attr String FormId), EmbedAsChild x Text) =>
+labelText :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text FormId), EmbedAsChild x Text) =>
          Text
       -> Form m input error [XMLGenT x (XMLType x)] () ()
 labelText = C.label
@@ -211,7 +213,7 @@
 -- | create a @\<ul\>@ which contains all the errors related to the 'Form'.
 --
 -- The @<\ul\>@ will have the attribute @class=\"reform-error-list\"@.
-errorList :: (Monad m, XMLGenerator x, EmbedAsChild x error) =>
+errorList :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x error) =>
              Form m input error [XMLGenT x (XMLType x)] () ()
 errorList = C.errorList
 
@@ -220,49 +222,49 @@
 -- Includes errors from children of the current form.
 --
 -- The @<\ul\>@ will have the attribute @class=\"reform-error-list\"@.
-childErrorList :: (Monad m, XMLGenerator x, EmbedAsChild x error) =>
+childErrorList :: (Monad m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x error) =>
              Form m input error [XMLGenT x (XMLType x)] () ()
 childErrorList = C.childErrorList
 
 -- | create a @\<br\>@ tag.
-br :: (Monad m, XMLGenerator x) => Form m input error [XMLGenT x (XMLType x)] () ()
+br :: (Monad m, XMLGenerator x, StringType x ~ Text) => Form m input error [XMLGenT x (XMLType x)] () ()
 br = C.br
 
 -- | wrap a @\<fieldset class=\"reform\"\>@ around a 'Form'
 --
-fieldset :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+fieldset :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
             Form m input error c proof a
          -> Form m input error [XMLGenT x (XMLType x)] proof a
 fieldset = C.fieldset
 
 -- | wrap an @\<ol class=\"reform\"\>@ around a 'Form'
-ol :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+ol :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 ol = C.ol
 
 -- | wrap a @\<ul class=\"reform\"\>@ around a 'Form'
-ul :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+ul :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 ul = C.ul
 
 -- | wrap a @\<li class=\"reform\"\>@ around a 'Form'
-li :: (Monad m, Functor m, XMLGenerator x, EmbedAsChild x c) =>
+li :: (Monad m, Functor m, XMLGenerator x, StringType x ~ Text, EmbedAsChild x c) =>
       Form m input error c proof a
    -> Form m input error [XMLGenT x (XMLType x)] proof a
 li = C.li
 
 -- | create @\<form action=action method=\"POST\" enctype=\"multipart/form-data\"\>@
-form :: (XMLGenerator x, EmbedAsAttr x (Attr String action)) =>
+form :: (XMLGenerator x, StringType x ~ Text, EmbedAsAttr x (Attr Text action)) =>
         action                  -- ^ action url
-     -> [(String,String)]       -- ^ extra hidden fields to add to form
+     -> [(Text,Text)]       -- ^ extra hidden fields to add to form
      -> [XMLGenT x (XMLType x)] -- ^ children
      -> [XMLGenT x (XMLType x)]
 form = C.form
 
 -- | set the attributes on the top-level elements of 'Form'
-setAttrs :: (EmbedAsAttr x attr, XMLGenerator x, Monad m, Functor m) =>
+setAttrs :: (EmbedAsAttr x attr, XMLGenerator x, StringType x ~ Text, Monad m, Functor m) =>
             Form m input error [XMLGenT x (XMLType x)] proof a
          -> attr
          -> Form m input error [GenXML x] proof a
diff --git a/reform-hsp.cabal b/reform-hsp.cabal
--- a/reform-hsp.cabal
+++ b/reform-hsp.cabal
@@ -1,5 +1,5 @@
 Name:                reform-hsp
-Version:             0.1.2
+Version:             0.2.0
 Synopsis:            Add support for using HSP with Reform
 Description:         Reform is a library for building and validating forms using applicative functors. This package add support for using reform with HSP.
 Homepage:            http://www.happstack.com/
@@ -22,6 +22,6 @@
                        Text.Reform.HSP.String
                        Text.Reform.HSP.Text
   Build-depends:       base > 4 && <5,
-                       hsp   == 0.7.*,
-                       reform == 0.1.*,
+                       hsp    == 0.9.*,
+                       reform == 0.2.*,
                        text   == 0.11.*
