diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,12 +1,18 @@
-html-minimalist - minimalist haskell html library
+html-minimalist
+---------------
 
+a minimalist [haskell][hs] [html5][html5] library
+
 Text.HTML.Light is a very simple Haskell module
-for writing [x]html documents.  It provides
-constructors for html elements and attributes
-in terms of Text.XML.Light.
+for writing html5 documents.  It provides
+constructors for html5 elements and attributes
+in terms of [Text.XML.Light][hs-xml].
 
-  http://slavepianos.org/rd/
-  http://haskell.org/
+[hs]: http://haskell.org/
+[hs-xml]: http://hackage.haskell.org/package/xml
+[html5]: http://www.w3.org/html5
 
-(c) rohan drape, 2006-2011
-    gpl, http://gnu.org/copyleft/
+© [rohan drape][rd], 2006-2012, [gpl]
+
+[rd]: http://rd.slavepianos.org/
+[gpl]: http://gnu.org/copyleft/
diff --git a/Text/HTML/Light.hs b/Text/HTML/Light.hs
--- a/Text/HTML/Light.hs
+++ b/Text/HTML/Light.hs
@@ -1,23 +1,36 @@
 -- | Provides xhtml constructors for 'Text.XML.Light'.
 module Text.HTML.Light (module L
-                       ,cdata,cdata_raw
-                       ,renderXHTML) where
+                       ,renderXHTML
+                       ,renderHTML5,renderHTML5_pp) where
 
-import Text.XML.Light as L
+import Text.XML.Light
 import Text.HTML.Light.Attribute as L
 import Text.HTML.Light.Constant as L
 import Text.HTML.Light.Element as L
 
--- | Ordinary character data, subject to escaping.
-cdata :: String -> Content
-cdata s = Text (CData CDataText s Nothing)
+-- | Set of @HTML5@ elements that do not allow content.
+html5_empty_elem :: [String]
+html5_empty_elem =
+    ["area","base","br","col","command","embed","hr"
+    ,"img","input","keygen","link"
+    ,"meta","param","source","track","wbr"]
 
--- | Raw character data, not subject to escaping.
-cdata_raw :: String -> Content
-cdata_raw s = Text (CData CDataRaw s Nothing)
+pp_reconf :: ConfigPP -> ConfigPP
+pp_reconf =
+    let f nm = qName nm `elem` html5_empty_elem
+    in useShortEmptyTags f
 
+pp_el :: ConfigPP -> Element -> String
+pp_el c = ppcElement (pp_reconf c)
+
 -- | Render an xhtml element with the given document type.
 renderXHTML :: DocType -> Element -> String
-renderXHTML t e = concat [xml_1_0
-                         ,t
-                         ,showElement e]
+renderXHTML t e = concat [xml_1_0,t,pp_el defaultConfigPP e]
+
+-- | Render an HTML5 element with the given document type.
+renderHTML5 :: Element -> String
+renderHTML5 e = html5_dt ++ pp_el defaultConfigPP e
+
+-- | Pretty-printing variant (inserts whitespace).
+renderHTML5_pp :: Element -> String
+renderHTML5_pp e = unlines [html5_dt,pp_el prettyConfigPP e]
diff --git a/Text/HTML/Light/Attribute.hs b/Text/HTML/Light/Attribute.hs
--- a/Text/HTML/Light/Attribute.hs
+++ b/Text/HTML/Light/Attribute.hs
@@ -6,119 +6,147 @@
 
 import Text.XML.Light
 
+mk_attr :: String -> String -> Attr
+mk_attr a = Attr (unqual a)
+
+-- | Make an 'Attr' where the /key/ and /value/ are equal.
+mk_bool_attr :: String -> Attr
+mk_bool_attr a = Attr (unqual a) a
+
 action :: String -> Attr
-action = Attr (unqual "action")
+action = mk_attr "action"
 
 align :: String -> Attr
-align = Attr (unqual "align")
+align = mk_attr "align"
 
 alt :: String -> Attr
-alt = Attr (unqual "alt")
+alt = mk_attr "alt"
 
 bgcolor :: String -> Attr
-bgcolor = Attr (unqual "bgcolor")
+bgcolor = mk_attr "bgcolor"
 
 border :: String -> Attr
-border = Attr (unqual "border")
+border = mk_attr "border"
 
 -- | Prime suffixed since /class/ is a reserved word.
 class' :: String -> Attr
-class' = Attr (unqual "class")
+class' = mk_attr "class"
 
 classid :: String -> Attr
-classid = Attr (unqual "classid")
+classid = mk_attr "classid"
 
+cols :: String -> Attr
+cols = mk_attr "cols"
+
 colspan :: String -> Attr
-colspan = Attr (unqual "colspan")
+colspan = mk_attr "colspan"
 
 content :: String -> Attr
-content = Attr (unqual "content")
+content = mk_attr "content"
 
+controls :: Attr
+controls = mk_bool_attr "controls"
+
 coords :: String -> Attr
-coords = Attr (unqual "coords")
+coords = mk_attr "coords"
 
 -- | Prime suffixed since /data/ is a reserved word.
 data' :: String -> Attr
-data' = Attr (unqual "data")
+data' = mk_attr "data"
 
+datetime :: String -> Attr
+datetime = mk_attr "datetime"
+
+enctype :: String -> Attr
+enctype = mk_attr "enctype"
+
+frameborder :: String -> Attr
+frameborder = mk_attr "frameborder"
+
 height :: String -> Attr
-height = Attr (unqual "height")
+height = mk_attr "height"
 
 href :: String -> Attr
-href = Attr (unqual "href")
+href = mk_attr "href"
 
 id :: String -> Attr
-id = Attr (unqual "id")
+id = mk_attr "id"
 
 http_equiv :: String -> Attr
 http_equiv = Attr (unqual "http-equiv")
 
 lang :: String -> Attr
-lang = Attr (unqual "lang")
+lang = mk_attr "lang"
 
 language :: String -> Attr
-language = Attr (unqual "language")
+language = mk_attr "language"
 
 media :: String -> Attr
-media = Attr (unqual "media")
+media = mk_attr "media"
 
 method :: String -> Attr
-method = Attr (unqual "method")
+method = mk_attr "method"
 
 name :: String -> Attr
-name = Attr (unqual "name")
+name = mk_attr "name"
 
 quality :: String -> Attr
-quality = Attr (unqual "quality")
+quality = mk_attr "quality"
 
 rel :: String -> Attr
-rel = Attr (unqual "rel")
+rel = mk_attr "rel"
 
+rows :: String -> Attr
+rows = mk_attr "rows"
+
 rowspan :: String -> Attr
-rowspan = Attr (unqual "rowspan")
+rowspan = mk_attr "rowspan"
 
+seamless :: Attr
+seamless = mk_bool_attr "seamless"
+
 shape :: String -> Attr
-shape = Attr (unqual "shape")
+shape = mk_attr "shape"
 
 -- | Prime suffixed since /span/ is the name of both an attribute and
 -- element.
 span' :: String -> Attr
-span' = Attr (unqual "span")
+span' = mk_attr "span"
 
 src :: String -> Attr
-src = Attr (unqual "src")
+src = mk_attr "src"
 
 -- | Prime suffixed since /style/ is the name of both an attribute and
 -- element.
 style' :: String -> Attr
-style' = Attr (unqual "style")
+style' = mk_attr "style"
 
 target :: String -> Attr
-target = Attr (unqual "target")
+target = mk_attr "target"
 
 -- | Prime suffixed since /title/ is the name of both an attribute and
 -- element.
 title' :: String -> Attr
-title' = Attr (unqual "title")
+title' = mk_attr "title"
 
 -- | Prime suffixed since /type/ is a reserved word.
 type' :: String -> Attr
-type' = Attr (unqual "type")
+type' = mk_attr "type"
 
 usemap :: String -> Attr
-usemap = Attr (unqual "usemap")
+usemap = mk_attr "usemap"
 
 valign :: String -> Attr
-valign = Attr (unqual "valign")
+valign = mk_attr "valign"
 
 value :: String -> Attr
-value = Attr (unqual "value")
+value = mk_attr "value"
 
 width :: String -> Attr
-width = Attr (unqual "width")
+width = mk_attr "width"
 
 xml_lang :: String -> Attr
 xml_lang = Attr (unqual "xml:lang")
 
 xmlns :: String -> Attr
-xmlns = Attr (unqual "xmlns")
+xmlns = mk_attr "xmlns"
diff --git a/Text/HTML/Light/Composite.hs b/Text/HTML/Light/Composite.hs
new file mode 100644
--- /dev/null
+++ b/Text/HTML/Light/Composite.hs
@@ -0,0 +1,141 @@
+-- | Composite constructors and constants.
+module Text.HTML.Light.Composite where
+
+import Data.Char
+import Data.List as L
+import Data.Maybe
+import Text.HTML.Light.Attribute
+import Text.HTML.Light.Element
+import Text.XML.Light
+
+-- * Attributes
+
+-- | Variant on 'add_attrs' lifted to 'Content'.
+add_attrs_c :: [Attr] -> Content -> Content
+add_attrs_c z c =
+    case c of
+      Elem e -> Elem (add_attrs z e)
+      _ -> error "add_attrs_c: not Elem"
+
+-- * Meta elements
+
+-- | Set @content-type@.
+meta_content_type :: String -> Content
+meta_content_type t = meta [http_equiv "content-type",content t]
+
+-- | Set @author@.
+meta_author :: String -> Content
+meta_author au = meta [name "author",content au]
+
+-- | Set @description@.
+meta_description :: String -> Content
+meta_description dsc = meta [name "description",content dsc]
+
+-- | Set @meta_viewport@.
+meta_viewport :: String -> Content
+meta_viewport v = meta [name "viewport",content v]
+
+-- * Link elements
+
+-- | Enumeration of HTML5 link types.
+data Link_Type = Link_Alternate
+               | Link_Author
+               | Link_Bookmark
+               | Link_Help
+               | Link_Icon
+               | Link_License
+               | Link_Next
+               | Link_NoFollow
+               | Link_NoReferrer
+               | Link_Prefetch
+               | Link_Prev
+               | Link_Search
+               | Link_Stylesheet
+                 deriving (Eq,Show)
+
+-- | HTML name for 'Link_Type'.
+--
+-- > link_type_str Link_Stylesheet == "stylesheet"
+link_type_str :: Link_Type -> String
+link_type_str = L.map toLower . fromJust . stripPrefix "Link_" . show
+
+-- | Variant on 'link' with enumerated /type/ value.
+link_ty :: Link_Type -> [Attr] -> Content
+link_ty ty = link . (:) (rel (link_type_str ty))
+
+-- | Set CSS @stylesheet@ for given @media@.
+link_css :: String -> String -> Content
+link_css m c = link_ty Link_Stylesheet [type' "text/css"
+                                       ,media m
+                                       ,href c]
+
+-- | Set RSS @alternate@ with given @title@.
+link_rss :: String -> String -> Content
+link_rss tt ln =
+    link_ty Link_Alternate [type' "application/rss+xml"
+                           ,title' tt
+                           ,href ln]
+
+-- * Script elements
+
+-- | Embed javascript.
+script_js :: String -> Content
+script_js s = script [type' "text/javascript"] [cdata_raw s]
+
+-- | Source javascript.
+script_js_src :: FilePath -> Content
+script_js_src fn = script [type' "text/javascript",src fn] []
+
+-- * Validators
+
+-- | @W3.org@ HTML validator.
+w3_html_validator :: String
+w3_html_validator = "http://validator.w3.org/check/referer"
+
+-- | @W3.org@ CSS validator.
+w3_css_validator :: String
+w3_css_validator = "http://jigsaw.w3.org/css-validator/check/referer"
+
+-- | @W3.org@ CSS validator.
+--
+-- > w3_rss_validator "http://haskell.org"
+w3_rss_validator :: String -> String
+w3_rss_validator = (++) "http://validator.w3.org/feed/check.cgi?url="
+
+-- * Input elements
+
+-- | Enumeration of HTML5 input types.
+data Input_Type = Hidden
+                | Text
+                | Search
+                | Tel | Url | Email
+                | Password
+                | DateTime | Date | Month | Week | Time | DateTime_Local
+                | Number | Range
+                | Color
+                | Checkbox | Radio
+                | File
+                | Submit
+                | Image
+                | Reset
+                | Button
+                  deriving (Eq,Show)
+
+-- | HTML name for 'Input_Type'.
+input_type_str :: Input_Type -> String
+input_type_str =
+    let f c = if c == '_' then '-' else c
+    in L.map (f . toLower) . show
+
+-- | Variant on 'input' with enumerated /type/ value.
+input_ty :: Input_Type -> [Attr] -> Content
+input_ty ty = input . (:) (type' (input_type_str ty))
+
+-- | 'Hidden' input with /name/ and /value/.
+input_hidden :: String -> String -> Content
+input_hidden k v = input_ty Hidden [name k,value v]
+
+-- | 'Submit' input with /name/ and /value/.
+input_submit :: String -> String -> Content
+input_submit k v = input_ty Submit [name k,value v]
+
diff --git a/Text/HTML/Light/Composite/Menu.hs b/Text/HTML/Light/Composite/Menu.hs
new file mode 100644
--- /dev/null
+++ b/Text/HTML/Light/Composite/Menu.hs
@@ -0,0 +1,36 @@
+-- | Menu constructors.
+module Text.HTML.Light.Composite.Menu where
+
+import Data.List as L
+import Prelude as P
+import Text.HTML.Light.Attribute as H
+import Text.HTML.Light.Element as H
+import Text.XML.Light
+
+-- | A menu entry is /(name,identifier,link)/.
+type Menu_Entry = (String,String,Maybe String)
+
+type Menu_P = ([Content] -> [Content])
+
+-- | Menu constructor.
+type Menu_C = Menu_P -> String -> [Menu_Entry] -> String -> Content
+
+nav_menu :: Element_C -> Element_C -> Menu_C
+nav_menu outer_f inner_f between_f ty m h =
+    let cl = class' ty
+        f (nm,nm_id,ln) =
+            let a_cl = class' (if nm_id == h then "here" else "not-here")
+                at = maybe [a_cl] ((: [a_cl]) . href) ln
+            in inner_f [cl,H.id nm_id] [a at [cdata nm]]
+    in nav [cl] [outer_f [cl] (between_f (L.map f m))]
+
+-- | Make a 'nav' menu of class /ty/ with a 'ul' structure.  The entry
+-- corresponding to identifier /h/ is marked with the class @here@.
+nav_menu_list :: Menu_C
+nav_menu_list = nav_menu ul li
+
+-- | Variant of 'nav_menu_list' using 'H.span' elements.
+nav_menu_span :: Menu_C
+nav_menu_span f =
+    let sp = H.span [class' "menu-separator"] [cdata " | "]
+    in nav_menu H.div H.span (f . intersperse sp)
diff --git a/Text/HTML/Light/Constant.hs b/Text/HTML/Light/Constant.hs
--- a/Text/HTML/Light/Constant.hs
+++ b/Text/HTML/Light/Constant.hs
@@ -1,4 +1,4 @@
--- | xhtml related constants.
+-- | (x)html related constants.
 module Text.HTML.Light.Constant where
 
 import Text.XML.Light
@@ -21,6 +21,10 @@
 deg :: Content
 deg = Text (CData CDataRaw "&deg;" Nothing)
 
+-- | The horizontal ellipsis character.
+hellip :: Content
+hellip = Text (CData CDataRaw "&hellip;" Nothing)
+
 -- | The left double arrow character.
 larr :: Content
 larr = Text (CData CDataRaw "&larr;" Nothing)
@@ -72,7 +76,7 @@
 
 -- | The xhtml 1.0 strict document type string.
 xhtml_1_0_strict :: DocType
-xhtml_1_0_strict = 
+xhtml_1_0_strict =
     let dtd = "PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\""
         url = "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\""
     in concat ["<!DOCTYPE html ", dtd, " ", url, ">"]
@@ -83,3 +87,7 @@
     let dtd = "PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
         url = "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
     in concat ["<!DOCTYPE html ", dtd, " ", url, ">"]
+
+-- | The HTML5 document type string.
+html5_dt :: DocType
+html5_dt = "<!DOCTYPE html>"
diff --git a/Text/HTML/Light/Element.hs b/Text/HTML/Light/Element.hs
--- a/Text/HTML/Light/Element.hs
+++ b/Text/HTML/Light/Element.hs
@@ -4,128 +4,206 @@
 
 import Text.XML.Light
 
-a :: [Attr] -> [Content] -> Content
-a z e = Elem (Element (unqual "a") z e Nothing)
+-- * Content constructors
 
-area :: [Attr] -> Content
-area z = Elem (Element (unqual "area") z [] Nothing)
+-- | Ordinary character data, subject to escaping.
+cdata :: String -> Content
+cdata s = Text (CData CDataText s Nothing)
 
-body :: [Attr] -> [Content] -> Content
-body z e = Elem (Element (unqual "body") z e Nothing)
+-- | Raw character data, not subject to escaping.
+cdata_raw :: String -> Content
+cdata_raw s = Text (CData CDataRaw s Nothing)
 
-br :: [Attr] -> Content
-br z = Elem (Element (unqual "br") z [] Nothing)
+-- * Element constructors
 
-colgroup :: [Attr] -> [Content] -> Content
-colgroup z e = Elem (Element (unqual "colgroup") z e Nothing)
+-- | Element contructor.
+type Element_C = [Attr] -> [Content] -> Content
 
-col :: [Attr] -> Content
-col z = Elem (Element (unqual "col") z [] Nothing)
+-- | Empty element contructor.
+type Empty_Element_C = [Attr] -> Content
 
-div :: [Attr] -> [Content] -> Content
-div z e = Elem (Element (unqual "div") z e Nothing)
+mk_element :: String -> Element_C
+mk_element nm z e = Elem (Element (unqual nm) z e Nothing)
 
-embed :: [Attr] -> Content
-embed z = Elem (Element (unqual "embed") z [] Nothing)
+mk_empty_element :: String -> Empty_Element_C
+mk_empty_element nm z = Elem (Element (unqual nm) z [] Nothing)
 
-form :: [Attr] -> [Content] -> Content
-form z e = Elem (Element (unqual "form") z e Nothing)
+a :: Element_C
+a = mk_element "a"
 
-frame :: [Attr] -> Content
-frame z = Elem (Element (unqual "frame") z [] Nothing)
+address :: Element_C
+address = mk_element "address"
 
-frameset :: [Attr] -> Content
-frameset z = Elem (Element (unqual "frameset") z [] Nothing)
+area :: Empty_Element_C
+area = mk_empty_element "area"
 
-h1 :: [Attr] -> [Content] -> Content
-h1 z c = Elem (Element (unqual "h1") z c Nothing)
+article :: Element_C
+article = mk_element "article"
 
-h2 :: [Attr] -> [Content] -> Content
-h2 z e = Elem (Element (unqual "h2") z e Nothing)
+aside :: Element_C
+aside = mk_element "aside"
 
-h3 :: [Attr] -> [Content] -> Content
-h3 z e = Elem (Element (unqual "h3") z e Nothing)
+audio :: Element_C
+audio = mk_element "audio"
 
-h4 :: [Attr] -> [Content] -> Content
-h4 z e = Elem (Element (unqual "h4") z e Nothing)
+body :: Element_C
+body = mk_element "body"
 
-head :: [Attr] -> [Content] -> Content
-head z e = Elem (Element (unqual "head") z e Nothing)
+br :: Empty_Element_C
+br = mk_empty_element "br"
 
-hr :: [Attr] -> Content
-hr z = Elem (Element (unqual "hr") z [] Nothing)
+caption :: Element_C
+caption = mk_element "caption"
 
+cite :: Element_C
+cite = mk_element "cite"
+
+colgroup :: Element_C
+colgroup = mk_element "colgroup"
+
+col :: Empty_Element_C
+col = mk_empty_element "col"
+
+div :: Element_C
+div = mk_element "div"
+
+embed :: Empty_Element_C
+embed = mk_empty_element "embed"
+
+figcaption :: Element_C
+figcaption = mk_element "figcaption"
+
+figure :: Element_C
+figure = mk_element "figure"
+
+footer :: Element_C
+footer = mk_element "footer"
+
+form :: Element_C
+form = mk_element "form"
+
+frame :: Empty_Element_C
+frame = mk_empty_element "frame"
+
+frameset :: Empty_Element_C
+frameset = mk_empty_element "frameset"
+
+h1 :: Element_C
+h1 = mk_element "h1"
+
+h2 :: Element_C
+h2 = mk_element "h2"
+
+h3 :: Element_C
+h3 = mk_element "h3"
+
+h4 :: Element_C
+h4 = mk_element "h4"
+
+head :: Element_C
+head = mk_element "head"
+
+header :: Element_C
+header = mk_element "header"
+
+hgroup :: Element_C
+hgroup = mk_element "hgroup"
+
+hr :: Empty_Element_C
+hr = mk_empty_element "hr"
+
 html :: [Attr] -> [Content] -> Element
 html z e = Element (unqual "html") z e Nothing
 
-img :: [Attr] -> Content
-img z = Elem (Element (unqual "img") z [] Nothing)
+iframe :: Element_C
+iframe = mk_element "iframe"
 
-input :: [Attr] -> Content
-input z = Elem (Element (unqual "input") z [] Nothing)
+img :: Empty_Element_C
+img = mk_empty_element "img"
 
-li :: [Attr] -> [Content] -> Content
-li z e = Elem (Element (unqual "li") z e Nothing)
+input :: Empty_Element_C
+input = mk_empty_element "input"
 
-link :: [Attr] -> Content
-link z = Elem (Element (unqual "link") z [] Nothing)
+li :: Element_C
+li = mk_element "li"
 
-map :: [Attr] -> [Content] -> Content
-map z e = Elem (Element (unqual "map") z e Nothing)
+link :: Empty_Element_C
+link = mk_empty_element "link"
 
-meta :: [Attr] -> Content
-meta z = Elem (Element (unqual "meta") z [] Nothing)
+map :: Element_C
+map = mk_element "map"
 
-object :: [Attr] -> [Content] -> Content
-object z e = Elem (Element (unqual "object") z e Nothing)
+meta :: Empty_Element_C
+meta = mk_empty_element "meta"
 
-ol :: [Attr] -> [Content] -> Content
-ol z e = Elem (Element (unqual "ol") z e Nothing)
+nav :: Element_C
+nav = mk_element "nav"
 
-param :: [Attr] -> Content
-param z = Elem (Element (unqual "param") z [] Nothing)
+object :: Element_C
+object = mk_element "object"
 
-ul :: [Attr] -> [Content] -> Content
-ul z e = Elem (Element (unqual "ul") z e Nothing)
+ol :: Element_C
+ol = mk_element "ol"
 
-dl :: [Attr] -> [Content] -> Content
-dl z e = Elem (Element (unqual "dl") z e Nothing)
+param :: Empty_Element_C
+param = mk_empty_element "param"
 
-dt :: [Attr] -> [Content] -> Content
-dt z e = Elem (Element (unqual "dt") z e Nothing)
+ul :: Element_C
+ul = mk_element "ul"
 
-dd :: [Attr] -> [Content] -> Content
-dd z e = Elem (Element (unqual "dd") z e Nothing)
+dl :: Element_C
+dl = mk_element "dl"
 
-p :: [Attr] -> [Content] -> Content
-p z e = Elem (Element (unqual "p") z e Nothing)
+dt :: Element_C
+dt = mk_element "dt"
 
-pre :: [Attr] -> [Content] -> Content
-pre z e = Elem (Element (unqual "pre") z e Nothing)
+dd :: Element_C
+dd = mk_element "dd"
 
-script :: [Attr] -> [Content] -> Content
-script z e = Elem (Element (unqual "script") z e Nothing)
+p :: Element_C
+p = mk_element "p"
 
-span :: [Attr] -> [Content] -> Content
-span z e = Elem (Element (unqual "span") z e Nothing)
+pre :: Element_C
+pre = mk_element "pre"
 
-style :: [Attr] -> [Content] -> Content
-style z e = Elem (Element (unqual "style") z e Nothing)
+q :: Element_C
+q = mk_element "q"
 
-table :: [Attr] -> [Content] -> Content
-table z e = Elem (Element (unqual "table") z e Nothing)
+script :: Element_C
+script = mk_element "script"
 
-td :: [Attr] -> [Content] -> Content
-td z e = Elem (Element (unqual "td") z e Nothing)
+section :: Element_C
+section = mk_element "section"
 
-th :: [Attr] -> [Content] -> Content
-th z e = Elem (Element (unqual "th") z e Nothing)
+source :: Empty_Element_C
+source = mk_empty_element "source"
 
-thead :: [Attr] -> [Content] -> Content
-thead z e = Elem (Element (unqual "thead") z e Nothing)
+span :: Element_C
+span = mk_element "span"
 
-title :: [Attr] -> [Content] -> Content
-title z e = Elem (Element (unqual "title") z e Nothing)
+style :: Element_C
+style = mk_element "style"
 
-tr :: [Attr] -> [Content] -> Content
-tr z e = Elem (Element (unqual "tr") z e Nothing)
+table :: Element_C
+table = mk_element "table"
+
+td :: Element_C
+td = mk_element "td"
+
+textarea :: Element_C
+textarea = mk_element "textarea"
+
+th :: Element_C
+th = mk_element "th"
+
+thead :: Element_C
+thead = mk_element "thead"
+
+time :: Element_C
+time = mk_element "time"
+
+title :: Element_C
+title = mk_element "title"
+
+tr :: Element_C
+tr = mk_element "tr"
diff --git a/html-minimalist.cabal b/html-minimalist.cabal
--- a/html-minimalist.cabal
+++ b/html-minimalist.cabal
@@ -1,5 +1,5 @@
 Name:              html-minimalist
-Version:           0.11
+Version:           0.12
 Synopsis:          Minimalist haskell html library
 Description:       Text.HTML.Light is a very simple Haskell module
                    for writing [x]html documents.  It provides
@@ -7,12 +7,12 @@
                    in terms of Text.XML.Light.
 License:           GPL
 Category:          Text
-Copyright:         (c) Rohan Drape, 2006-2011
+Copyright:         (c) Rohan Drape, 2006-2012
 Author:            Rohan Drape
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
-Homepage:          http://slavepianos.org/rd/?t=html-minimalist
-Tested-With:       GHC == 7.2.2
+Homepage:          http://rd.slavepianos.org/?t=html-minimalist
+Tested-With:       GHC == 7.6.1
 Build-Type:        Simple
 Cabal-Version:     >= 1.8
 
@@ -24,9 +24,11 @@
   GHC-Options:     -Wall -fwarn-tabs
   Exposed-modules: Text.HTML.Light
                    Text.HTML.Light.Attribute
+                   Text.HTML.Light.Composite
+                   Text.HTML.Light.Composite.Menu
                    Text.HTML.Light.Constant
                    Text.HTML.Light.Element
 
 Source-Repository  head
   Type:            darcs
-  Location:        http://slavepianos.org/rd/sw/html-minimalist
+  Location:        http://rd.slavepianos.org/sw/html-minimalist
